Module: wine Branch: master Commit: d492389d23d08147b95f9007e99908d074793ee7 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d492389d23d08147b95f9007e9...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Aug 18 12:14:12 2009 +0200
kernel32: Don't wait for wineboot once the process is no longer running.
---
dlls/kernel32/process.c | 36 ++++++++++++++++++++++-------------- 1 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index e007c2a..0be47e7 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -881,17 +881,17 @@ static void init_windows_dirs(void) /*********************************************************************** * start_wineboot * - * Start the wineboot process if necessary. Return the event to wait on. + * Start the wineboot process if necessary. Return the handles to wait on. */ -static HANDLE start_wineboot(void) +static void start_wineboot( HANDLE handles[2] ) { static const WCHAR wineboot_eventW[] = {'_','_','w','i','n','e','b','o','o','t','_','e','v','e','n','t',0}; - HANDLE event;
- if (!(event = CreateEventW( NULL, TRUE, FALSE, wineboot_eventW ))) + handles[1] = 0; + if (!(handles[0] = CreateEventW( NULL, TRUE, FALSE, wineboot_eventW ))) { ERR( "failed to create wineboot event, expect trouble\n" ); - return 0; + return; } if (GetLastError() != ERROR_ALREADY_EXISTS) /* we created it */ { @@ -913,12 +913,15 @@ static HANDLE start_wineboot(void) { TRACE( "started wineboot pid %04x tid %04x\n", pi.dwProcessId, pi.dwThreadId ); CloseHandle( pi.hThread ); - CloseHandle( pi.hProcess ); - + handles[1] = pi.hProcess; + } + else + { + ERR( "failed to start wineboot, err %u\n", GetLastError() ); + CloseHandle( handles[0] ); + handles[0] = 0; } - else ERR( "failed to start wineboot, err %u\n", GetLastError() ); } - return event; }
@@ -1016,7 +1019,7 @@ void CDECL __wine_kernel_init(void) WCHAR *p, main_exe_name[MAX_PATH+1]; PEB *peb = NtCurrentTeb()->Peb; RTL_USER_PROCESS_PARAMETERS *params = peb->ProcessParameters; - HANDLE boot_event = 0; + HANDLE boot_events[2]; BOOL got_environment = TRUE;
/* Initialize everything */ @@ -1045,6 +1048,7 @@ void CDECL __wine_kernel_init(void)
set_process_name( __wine_main_argc, __wine_main_argv ); set_library_wargv( __wine_main_argv ); + boot_events[0] = boot_events[1] = 0;
if (peb->ProcessParameters->ImagePathName.Buffer) { @@ -1060,7 +1064,7 @@ void CDECL __wine_kernel_init(void) } update_library_argv0( main_exe_name ); if (!build_command_line( __wine_main_wargv )) goto error; - boot_event = start_wineboot(); + start_wineboot( boot_events ); }
/* if there's no extension, append a dot to prevent LoadLibrary from appending .dll */ @@ -1073,10 +1077,14 @@ void CDECL __wine_kernel_init(void) RtlInitUnicodeString( &NtCurrentTeb()->Peb->ProcessParameters->DllPath, MODULE_get_dll_load_path(main_exe_name) );
- if (boot_event) + if (boot_events[0]) { - if (WaitForSingleObject( boot_event, 30000 )) ERR( "boot event wait timed out\n" ); - CloseHandle( boot_event ); + DWORD count = 1; + if (boot_events[1]) count++; + if (WaitForMultipleObjects( count, boot_events, FALSE, 30000 ) == WAIT_TIMEOUT) + ERR( "boot event wait timed out\n" ); + CloseHandle( boot_events[0] ); + if (boot_events[1]) CloseHandle( boot_events[1] ); /* if we didn't find environment section, try again now that wineboot has run */ if (!got_environment) {