forked from Mirrors/wine-wine
Handle suspend/resume_thread requests in phase STARTING correctly.
Set initial suspend count for threads created with CREATE_SUSPENDED. Set 'inheritable' flag for process/thread handles.oldstable
parent
3480e4a596
commit
2f2898b571
|
@ -44,6 +44,9 @@ struct cmsg_fd
|
||||||
struct new_thread_request
|
struct new_thread_request
|
||||||
{
|
{
|
||||||
void* pid; /* process id for the new thread (or 0 if none yet) */
|
void* pid; /* process id for the new thread (or 0 if none yet) */
|
||||||
|
int suspend; /* new thread should be suspended on creation */
|
||||||
|
int tinherit; /* inherit flag for thread handle */
|
||||||
|
int pinherit; /* inherit flag for process handle */
|
||||||
};
|
};
|
||||||
struct new_thread_reply
|
struct new_thread_reply
|
||||||
{
|
{
|
||||||
|
@ -656,7 +659,9 @@ extern unsigned int CLIENT_WaitReply( int *len, int *passed_fd,
|
||||||
extern unsigned int CLIENT_WaitSimpleReply( void *reply, int len, int *passed_fd );
|
extern unsigned int CLIENT_WaitSimpleReply( void *reply, int len, int *passed_fd );
|
||||||
|
|
||||||
struct _THDB;
|
struct _THDB;
|
||||||
extern int CLIENT_NewThread( struct _THDB *thdb, int *thandle, int *phandle );
|
extern int CLIENT_NewThread( struct _THDB *thdb,
|
||||||
|
LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
|
||||||
|
int *thandle, int *phandle );
|
||||||
extern int CLIENT_SetDebug( int level );
|
extern int CLIENT_SetDebug( int level );
|
||||||
extern int CLIENT_InitThread(void);
|
extern int CLIENT_InitThread(void);
|
||||||
#endif /* __WINE_SERVER__ */
|
#endif /* __WINE_SERVER__ */
|
||||||
|
|
|
@ -50,8 +50,9 @@ extern struct thread *current;
|
||||||
|
|
||||||
/* thread functions */
|
/* thread functions */
|
||||||
|
|
||||||
extern struct thread *create_thread( int fd, void *pid, int *thread_handle,
|
extern struct thread *create_thread( int fd, void *pid, int suspend,
|
||||||
int *process_handle );
|
int thread_inherit, int process_inherit,
|
||||||
|
int *thread_handle, int *process_handle );
|
||||||
extern struct thread *get_thread_from_id( void *id );
|
extern struct thread *get_thread_from_id( void *id );
|
||||||
extern struct thread *get_thread_from_handle( int handle, unsigned int access );
|
extern struct thread *get_thread_from_handle( int handle, unsigned int access );
|
||||||
extern void get_thread_info( struct thread *thread,
|
extern void get_thread_info( struct thread *thread,
|
||||||
|
|
|
@ -276,7 +276,9 @@ unsigned int CLIENT_WaitSimpleReply( void *reply, int len, int *passed_fd )
|
||||||
*
|
*
|
||||||
* Send a new thread request.
|
* Send a new thread request.
|
||||||
*/
|
*/
|
||||||
int CLIENT_NewThread( THDB *thdb, int *thandle, int *phandle )
|
int CLIENT_NewThread( THDB *thdb,
|
||||||
|
LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa,
|
||||||
|
int *thandle, int *phandle )
|
||||||
{
|
{
|
||||||
struct new_thread_request request;
|
struct new_thread_request request;
|
||||||
struct new_thread_reply reply;
|
struct new_thread_reply reply;
|
||||||
|
@ -289,6 +291,9 @@ int CLIENT_NewThread( THDB *thdb, int *thandle, int *phandle )
|
||||||
}
|
}
|
||||||
|
|
||||||
request.pid = thdb->process->server_pid;
|
request.pid = thdb->process->server_pid;
|
||||||
|
request.suspend = (thdb->flags & CREATE_SUSPENDED)? TRUE : FALSE;
|
||||||
|
request.tinherit = (tsa && (tsa->nLength>=sizeof(*tsa)) && tsa->bInheritHandle);
|
||||||
|
request.pinherit = (psa && (psa->nLength>=sizeof(*psa)) && psa->bInheritHandle);
|
||||||
CLIENT_SendRequest( REQ_NEW_THREAD, fd[1], 1, &request, sizeof(request) );
|
CLIENT_SendRequest( REQ_NEW_THREAD, fd[1], 1, &request, sizeof(request) );
|
||||||
if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) goto error;
|
if (CLIENT_WaitSimpleReply( &reply, sizeof(reply), NULL )) goto error;
|
||||||
thdb->server_tid = reply.tid;
|
thdb->server_tid = reply.tid;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <signal.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -113,8 +114,9 @@ DECL_HANDLER(new_thread)
|
||||||
err = ERROR_TOO_MANY_OPEN_FILES;
|
err = ERROR_TOO_MANY_OPEN_FILES;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (!(new_thread = create_thread( new_fd, req->pid, &reply.thandle,
|
if (!(new_thread = create_thread( new_fd, req->pid, req->suspend,
|
||||||
&reply.phandle )))
|
req->tinherit, req->pinherit,
|
||||||
|
&reply.thandle, &reply.phandle )))
|
||||||
{
|
{
|
||||||
close( new_fd );
|
close( new_fd );
|
||||||
err = ERROR_OUTOFMEMORY;
|
err = ERROR_OUTOFMEMORY;
|
||||||
|
@ -153,6 +155,8 @@ DECL_HANDLER(init_thread)
|
||||||
current->name[len] = '\0';
|
current->name[len] = '\0';
|
||||||
CLEAR_ERROR();
|
CLEAR_ERROR();
|
||||||
done:
|
done:
|
||||||
|
if (current->suspend > 0 && current->unix_pid)
|
||||||
|
kill( current->unix_pid, SIGSTOP );
|
||||||
send_reply( current, -1, 0 );
|
send_reply( current, -1, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,8 +75,9 @@ static struct thread *first_thread;
|
||||||
|
|
||||||
|
|
||||||
/* create a new thread */
|
/* create a new thread */
|
||||||
struct thread *create_thread( int fd, void *pid, int *thread_handle,
|
struct thread *create_thread( int fd, void *pid, int suspend,
|
||||||
int *process_handle )
|
int thread_inherit, int process_inherit,
|
||||||
|
int *thread_handle, int *process_handle )
|
||||||
{
|
{
|
||||||
struct thread *thread;
|
struct thread *thread;
|
||||||
struct process *process;
|
struct process *process;
|
||||||
|
@ -107,7 +108,7 @@ struct thread *create_thread( int fd, void *pid, int *thread_handle,
|
||||||
thread->prev = NULL;
|
thread->prev = NULL;
|
||||||
thread->priority = THREAD_PRIORITY_NORMAL;
|
thread->priority = THREAD_PRIORITY_NORMAL;
|
||||||
thread->affinity = 1;
|
thread->affinity = 1;
|
||||||
thread->suspend = 0;
|
thread->suspend = suspend? 1 : 0;
|
||||||
|
|
||||||
if (first_thread) first_thread->prev = thread;
|
if (first_thread) first_thread->prev = thread;
|
||||||
first_thread = thread;
|
first_thread = thread;
|
||||||
|
@ -117,13 +118,13 @@ struct thread *create_thread( int fd, void *pid, int *thread_handle,
|
||||||
if (current)
|
if (current)
|
||||||
{
|
{
|
||||||
if ((*thread_handle = alloc_handle( current->process, thread,
|
if ((*thread_handle = alloc_handle( current->process, thread,
|
||||||
THREAD_ALL_ACCESS, 0 )) == -1)
|
THREAD_ALL_ACCESS, thread_inherit )) == -1)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
if (current && !pid)
|
if (current && !pid)
|
||||||
{
|
{
|
||||||
if ((*process_handle = alloc_handle( current->process, process,
|
if ((*process_handle = alloc_handle( current->process, process,
|
||||||
PROCESS_ALL_ACCESS, 0 )) == -1)
|
PROCESS_ALL_ACCESS, process_inherit )) == -1)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,10 @@
|
||||||
|
|
||||||
static int dump_new_thread_request( struct new_thread_request *req, int len )
|
static int dump_new_thread_request( struct new_thread_request *req, int len )
|
||||||
{
|
{
|
||||||
fprintf( stderr, " pid=%p", req->pid );
|
fprintf( stderr, " pid=%p,", req->pid );
|
||||||
|
fprintf( stderr, " suspend=%d,", req->suspend );
|
||||||
|
fprintf( stderr, " tinherit=%d,", req->tinherit );
|
||||||
|
fprintf( stderr, " pinherit=%d", req->pinherit );
|
||||||
return (int)sizeof(*req);
|
return (int)sizeof(*req);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue