Commit 2f2898b5 authored by Ulrich Weigand's avatar Ulrich Weigand Committed by Alexandre Julliard

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.
parent 3480e4a5
...@@ -44,6 +44,9 @@ struct cmsg_fd ...@@ -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, ...@@ -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; ...@@ -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 ) ...@@ -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 ) ...@@ -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 @@ ...@@ -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) ...@@ -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) ...@@ -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; ...@@ -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, ...@@ -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, ...@@ -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 @@ ...@@ -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);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment