Commit 7f74824d authored by Alexandre Julliard's avatar Alexandre Julliard

Fixed error recovery during thread creation.

parent e5557b35
...@@ -178,13 +178,12 @@ struct thread *create_process( int fd ) ...@@ -178,13 +178,12 @@ struct thread *create_process( int fd )
if ((process->next = first_process) != NULL) process->next->prev = process; if ((process->next = first_process) != NULL) process->next->prev = process;
first_process = process; first_process = process;
/* create the main thread */
if (!(thread = create_thread( fd, process ))) goto error;
/* create the init done event */ /* create the init done event */
if (!(process->init_event = create_event( NULL, 0, 1, 0 ))) goto error; if (!(process->init_event = create_event( NULL, 0, 1, 0 ))) goto error;
add_process_thread( process, thread ); /* create the main thread */
if (!(thread = create_thread( fd, process ))) goto error;
release_object( process ); release_object( process );
return thread; return thread;
......
...@@ -91,7 +91,11 @@ static int alloc_client_buffer( struct thread *thread ) ...@@ -91,7 +91,11 @@ static int alloc_client_buffer( struct thread *thread )
struct get_thread_buffer_request *req; struct get_thread_buffer_request *req;
int fd, fd_pipe[2]; int fd, fd_pipe[2];
if (pipe( fd_pipe ) == -1) return -1; if (pipe( fd_pipe ) == -1)
{
file_set_error();
return 0;
}
if ((fd = create_anonymous_file()) == -1) goto error; if ((fd = create_anonymous_file()) == -1) goto error;
if (ftruncate( fd, MAX_REQUEST_LENGTH ) == -1) goto error; if (ftruncate( fd, MAX_REQUEST_LENGTH ) == -1) goto error;
if ((thread->buffer = mmap( 0, MAX_REQUEST_LENGTH, PROT_READ | PROT_WRITE, if ((thread->buffer = mmap( 0, MAX_REQUEST_LENGTH, PROT_READ | PROT_WRITE,
...@@ -106,6 +110,9 @@ static int alloc_client_buffer( struct thread *thread ) ...@@ -106,6 +110,9 @@ static int alloc_client_buffer( struct thread *thread )
req->boot = (thread == booting_thread); req->boot = (thread == booting_thread);
req->version = SERVER_PROTOCOL_VERSION; req->version = SERVER_PROTOCOL_VERSION;
/* add it here since send_client_fd may call kill_thread */
add_process_thread( thread->process, thread );
send_client_fd( thread, fd_pipe[0], -1 ); send_client_fd( thread, fd_pipe[0], -1 );
send_client_fd( thread, fd, -1 ); send_client_fd( thread, fd, -1 );
send_reply( thread ); send_reply( thread );
...@@ -695,10 +702,9 @@ DECL_HANDLER(new_thread) ...@@ -695,10 +702,9 @@ DECL_HANDLER(new_thread)
send_client_fd( current, sock[1], req->handle ); send_client_fd( current, sock[1], req->handle );
close( sock[1] ); close( sock[1] );
/* thread object will be released when the thread gets killed */ /* thread object will be released when the thread gets killed */
add_process_thread( current->process, thread );
return; return;
} }
release_object( thread ); kill_thread( thread, 1 );
} }
close( sock[1] ); close( sock[1] );
} }
......
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