From: Rémi Bernon rbernon@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52213 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54346 --- dlls/ntdll/unix/loader.c | 5 ++++- dlls/ntdll/unix/server.c | 10 ++++------ dlls/ntdll/unix/unix_private.h | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index dd5636eec2d..dc8b8948912 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -2076,6 +2076,8 @@ static void *pthread_main_wrapper( void *arg ) SYSTEM_SERVICE_TABLE syscall_table = { (ULONG_PTR *)syscalls, NULL, ARRAY_SIZE(syscalls), syscall_args }; TEB *teb = virtual_alloc_first_teb(); sigset_t *blocked_signals = arg; + BOOL suspend; + void *entry;
pthread_sigmask( SIG_UNBLOCK, blocked_signals, NULL ); signal_init_threading(); @@ -2099,7 +2101,8 @@ static void *pthread_main_wrapper( void *arg ) load_apiset_dll(); ntdll_init_syscalls( 0, &syscall_table, p__wine_syscall_dispatcher ); *p__wine_unix_call_dispatcher = __wine_unix_call_dispatcher; - server_init_process_done(); + server_init_process_done( &entry, &suspend ); + signal_start_thread( entry, peb, suspend, NtCurrentTeb() ); return 0; }
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index 75a766078cd..1cd55d859cb 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -1572,11 +1572,10 @@ size_t server_init_process(void) /*********************************************************************** * server_init_process_done */ -void server_init_process_done(void) +void server_init_process_done( void **entry, BOOL *suspend ) { - void *entry, *teb; + void *teb; unsigned int status; - int suspend; FILE_FS_DEVICE_INFORMATION info;
if (!get_device_info( initial_cwd, &info ) && (info.Characteristics & FILE_REMOVABLE_MEDIA)) @@ -1606,13 +1605,12 @@ void server_init_process_done(void) req->ldt_copy = wine_server_client_ptr( &__wine_ldt_copy ); #endif status = wine_server_call( req ); - suspend = reply->suspend; - entry = wine_server_get_ptr( reply->entry ); + *suspend = reply->suspend; + *entry = wine_server_get_ptr( reply->entry ); } SERVER_END_REQ;
assert( !status ); - signal_start_thread( entry, peb, suspend, NtCurrentTeb() ); }
diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index 8821cd78491..e6628b434fc 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -174,7 +174,7 @@ extern int server_get_unix_fd( HANDLE handle, unsigned int wanted_access, int *u extern void wine_server_send_fd( int fd ) DECLSPEC_HIDDEN; extern void process_exit_wrapper( int status ) DECLSPEC_HIDDEN; extern size_t server_init_process(void) DECLSPEC_HIDDEN; -extern void server_init_process_done(void) DECLSPEC_HIDDEN; +extern void server_init_process_done( void **entry, BOOL *suspend ) DECLSPEC_HIDDEN; extern void server_init_thread( void *entry_point, BOOL *suspend ) DECLSPEC_HIDDEN; extern int server_pipe( int fd[2] ) DECLSPEC_HIDDEN;