diff --git a/include/server.h b/include/server.h index ad12daeec98..3cc76154e39 100644 --- a/include/server.h +++ b/include/server.h @@ -113,13 +113,13 @@ struct new_process_request IN int hstdin; /* handle for stdin */ IN int hstdout; /* handle for stdout */ IN int hstderr; /* handle for stderr */ - IN int event; /* event to signal startup */ IN int cmd_show; /* main window show mode */ IN void* env_ptr; /* pointer to environment (FIXME: hack) */ OUT void* pid; /* process id */ OUT int phandle; /* process handle (in the current process) */ OUT void* tid; /* thread id */ OUT int thandle; /* thread handle (in the current process) */ + OUT int event; /* event handle to signal startup */ IN char cmdline[1]; /* command line */ }; @@ -1209,7 +1209,7 @@ enum request REQ_NB_REQUESTS }; -#define SERVER_PROTOCOL_VERSION 6 +#define SERVER_PROTOCOL_VERSION 7 /* ### make_requests end ### */ /* Everything above this line is generated automatically by tools/make_requests */ diff --git a/scheduler/process.c b/scheduler/process.c index 72a5b73b39d..ba2ed7b4e38 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -490,7 +490,7 @@ PDB *PROCESS_Create( NE_MODULE *pModule, HFILE hFile, LPCSTR cmd_line, LPCSTR en BOOL inherit, DWORD flags, STARTUPINFOA *startup, PROCESS_INFORMATION *info ) { - HANDLE handles[2], load_done_evt = 0; + HANDLE handles[2], load_done_evt = -1; DWORD exitcode, size; BOOL alloc_stack16; int fd = -1; @@ -501,7 +501,6 @@ PDB *PROCESS_Create( NE_MODULE *pModule, HFILE hFile, LPCSTR cmd_line, LPCSTR en if (!pdb) return NULL; info->hThread = info->hProcess = INVALID_HANDLE_VALUE; - if (!(load_done_evt = CreateEventA( NULL, TRUE, FALSE, NULL ))) goto error; /* Create the process on the server side */ @@ -511,7 +510,6 @@ PDB *PROCESS_Create( NE_MODULE *pModule, HFILE hFile, LPCSTR cmd_line, LPCSTR en req->create_flags = flags; req->start_flags = startup->dwFlags; req->exe_file = hFile; - req->event = load_done_evt; if (startup->dwFlags & STARTF_USESTDHANDLES) { req->hstdin = startup->hStdInput; @@ -533,6 +531,7 @@ PDB *PROCESS_Create( NE_MODULE *pModule, HFILE hFile, LPCSTR cmd_line, LPCSTR en info->dwProcessId = (DWORD)req->pid; info->hThread = req->thandle; info->dwThreadId = (DWORD)req->tid; + load_done_evt = req->event; if (pModule->module32) /* Win32 process */ { @@ -596,12 +595,10 @@ PDB *PROCESS_Create( NE_MODULE *pModule, HFILE hFile, LPCSTR cmd_line, LPCSTR en } CloseHandle( load_done_evt ); - load_done_evt = 0; - return pdb; error: - if (load_done_evt) CloseHandle( load_done_evt ); + if (load_done_evt != -1) CloseHandle( load_done_evt ); if (info->hThread != INVALID_HANDLE_VALUE) CloseHandle( info->hThread ); if (info->hProcess != INVALID_HANDLE_VALUE) CloseHandle( info->hProcess ); PROCESS_FreePDB( pdb ); diff --git a/server/event.c b/server/event.c index 0b9cd20e350..763c8fb1d0c 100644 --- a/server/event.c +++ b/server/event.c @@ -43,8 +43,8 @@ static const struct object_ops event_ops = }; -static struct event *create_event( const WCHAR *name, size_t len, - int manual_reset, int initial_state ) +struct event *create_event( const WCHAR *name, size_t len, + int manual_reset, int initial_state ) { struct event *event; diff --git a/server/object.h b/server/object.h index 53cb9dc702b..886950494c9 100644 --- a/server/object.h +++ b/server/object.h @@ -127,6 +127,8 @@ static inline int time_before( struct timeval *t1, struct timeval *t2 ) struct event; +extern struct event *create_event( const WCHAR *name, size_t len, + int manual_reset, int initial_state ); extern struct event *get_event_obj( struct process *process, int handle, unsigned int access ); extern void pulse_event( struct event *event ); extern void set_event( struct event *event ); diff --git a/server/process.c b/server/process.c index 6368d238b07..3cc87f666c8 100644 --- a/server/process.c +++ b/server/process.c @@ -77,7 +77,6 @@ static int set_creation_info( struct process *process, struct new_process_reques req->hstdin = -1; req->hstdout = -1; req->hstderr = -1; - req->event = -1; req->cmd_show = 0; req->env_ptr = NULL; } @@ -185,26 +184,23 @@ struct thread *create_process( int fd, struct process *parent, process->info->exe_file = -1; } - /* get the init done event */ - if (process->info->event != -1) - { - if (!(process->init_event = get_event_obj( parent, process->info->event, - EVENT_MODIFY_STATE ))) goto error; - } - - /* set the process console */ - if (!set_process_console( process, parent )) goto error; - /* create the main thread */ if (!(thread = create_thread( fd, process, (process->create_flags & CREATE_SUSPENDED) != 0))) goto error; + /* create the init done event */ + if (!(process->init_event = create_event( NULL, 0, 1, 0 ))) goto error; + + /* set the process console */ + if (!set_process_console( process, parent )) goto error; + /* attach to the debugger if requested */ if (process->create_flags & (DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS)) set_process_debugger( process, current ); else if (parent && parent->debugger && !(parent->create_flags & DEBUG_ONLY_THIS_PROCESS)) set_process_debugger( process, parent->debugger ); + add_process_thread( process, thread ); release_object( process ); return thread; @@ -212,6 +208,7 @@ struct thread *create_process( int fd, struct process *parent, close( fd ); free_console( process ); if (process->handles) release_object( process->handles ); + if (thread) release_object( thread ); release_object( process ); return NULL; } @@ -580,9 +577,11 @@ DECL_HANDLER(new_process) size_t len = get_req_strlen( req, req->cmdline ); struct thread *thread; int sock[2]; + int event = -1, phandle = -1; req->phandle = -1; req->thandle = -1; + req->event = -1; req->pid = NULL; req->tid = NULL; @@ -592,25 +591,33 @@ DECL_HANDLER(new_process) return; } - if ((thread = create_process( sock[0], current->process, req, req->cmdline, len ))) - { - int phandle = alloc_handle( current->process, thread->process, - PROCESS_ALL_ACCESS, req->pinherit ); - if ((req->phandle = phandle) != -1) - { - if ((req->thandle = alloc_handle( current->process, thread, - THREAD_ALL_ACCESS, req->tinherit )) != -1) - { - /* thread object will be released when the thread gets killed */ - set_reply_fd( current, sock[1] ); - req->pid = thread->process; - req->tid = thread; - return; - } - close_handle( current->process, phandle ); - } - release_object( thread ); - } + if (!(thread = create_process( sock[0], current->process, req, req->cmdline, len ))) + goto error; + + if ((event = alloc_handle( current->process, thread->process->init_event, + EVENT_ALL_ACCESS, 0 )) == -1) + goto error; + + if ((phandle = alloc_handle( current->process, thread->process, + PROCESS_ALL_ACCESS, req->pinherit )) == -1) + goto error; + + if ((req->thandle = alloc_handle( current->process, thread, + THREAD_ALL_ACCESS, req->tinherit )) == -1) + goto error; + + /* thread object will be released when the thread gets killed */ + set_reply_fd( current, sock[1] ); + req->pid = get_process_id( thread->process ); + req->tid = get_thread_id( thread ); + req->phandle = phandle; + req->event = event; + return; + + error: + if (phandle != -1) close_handle( current->process, phandle ); + if (event != -1) close_handle( current->process, event ); + if (thread) release_object( thread ); close( sock[1] ); } diff --git a/server/thread.c b/server/thread.c index 72c1fce7bdf..3963f6067f1 100644 --- a/server/thread.c +++ b/server/thread.c @@ -158,14 +158,12 @@ struct thread *create_thread( int fd, struct process *process, int suspend ) if ((thread->next = first_thread) != NULL) thread->next->prev = thread; first_thread = thread; - add_process_thread( process, thread ); set_select_events( &thread->obj, POLLIN ); /* start listening to events */ if (!alloc_client_buffer( thread )) goto error; return thread; error: - remove_process_thread( process, thread ); release_object( thread ); return NULL; } @@ -611,6 +609,7 @@ DECL_HANDLER(new_thread) { set_reply_fd( current, sock[1] ); /* thread object will be released when the thread gets killed */ + add_process_thread( current->process, thread ); return; } release_object( thread ); diff --git a/server/trace.c b/server/trace.c index 91951461192..a76b515f5c7 100644 --- a/server/trace.c +++ b/server/trace.c @@ -224,7 +224,6 @@ static void dump_new_process_request( const struct new_process_request *req ) fprintf( stderr, " hstdin=%d,", req->hstdin ); fprintf( stderr, " hstdout=%d,", req->hstdout ); fprintf( stderr, " hstderr=%d,", req->hstderr ); - fprintf( stderr, " event=%d,", req->event ); fprintf( stderr, " cmd_show=%d,", req->cmd_show ); fprintf( stderr, " env_ptr=%p,", req->env_ptr ); fprintf( stderr, " cmdline=" ); @@ -236,7 +235,8 @@ static void dump_new_process_reply( const struct new_process_request *req ) fprintf( stderr, " pid=%p,", req->pid ); fprintf( stderr, " phandle=%d,", req->phandle ); fprintf( stderr, " tid=%p,", req->tid ); - fprintf( stderr, " thandle=%d", req->thandle ); + fprintf( stderr, " thandle=%d,", req->thandle ); + fprintf( stderr, " event=%d", req->event ); } static void dump_new_thread_request( const struct new_thread_request *req )