From 5cb7524ce750c7df5e170a8bf28bcc3cf3689fa9 Mon Sep 17 00:00:00 2001 From: Rene Rivera Date: Tue, 6 Jun 2006 23:58:07 +0000 Subject: [PATCH] Make the action timeout attempt to also close any open dialogs before killing processes. Thanks to Bronek Kozicki. [SVN r34210] --- historic/jam/src/build.bat | 10 +++--- historic/jam/src/build.jam | 10 +++--- historic/jam/src/execnt.c | 64 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 10 deletions(-) diff --git a/historic/jam/src/build.bat b/historic/jam/src/build.bat index 7850eff5c..9699e967b 100644 --- a/historic/jam/src/build.bat +++ b/historic/jam/src/build.bat @@ -210,7 +210,7 @@ if "_%BOOST_JAM_TOOLSET%_" == "_metrowerks_" ( if "_%BOOST_JAM_TOOLSET%_" == "_metrowerks_" ( if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( set PATH=%BOOST_JAM_TOOLSET_ROOT%Other Metrowerks Tools\Command Line Tools;%PATH%) - set BOOST_JAM_CC=mwcc -runtime ss -cwd include -DNT -ladvapi32.lib + set BOOST_JAM_CC=mwcc -runtime ss -cwd include -DNT -lkernel32.lib -ladvapi32.lib -luser32.lib set BOOST_JAM_OPT_JAM=-o bootstrap\jam0.exe set BOOST_JAM_OPT_MKJAMBASE=-o bootstrap\mkjambase0.exe set BOOST_JAM_OPT_YYACC=-o bootstrap\yyacc0.exe @@ -225,7 +225,7 @@ if "_%BOOST_JAM_TOOLSET%_" == "_msvc_" ( if "_%BOOST_JAM_TOOLSET%_" == "_msvc_" ( if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%) - set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib + set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib user32.lib set BOOST_JAM_OPT_JAM=/Febootstrap\jam0 set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0 set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0 @@ -240,7 +240,7 @@ if "_%BOOST_JAM_TOOLSET%_" == "_vc7_" ( if "_%BOOST_JAM_TOOLSET%_" == "_vc7_" ( if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%) - set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib + set BOOST_JAM_CC=cl /nologo /GZ /Zi /MLd -DNT -DYYDEBUG kernel32.lib advapi32.lib user32.lib set BOOST_JAM_OPT_JAM=/Febootstrap\jam0 set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0 set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0 @@ -255,7 +255,7 @@ if "_%BOOST_JAM_TOOLSET%_" == "_vc8_" ( if "_%BOOST_JAM_TOOLSET%_" == "_vc8_" ( if not "_%BOOST_JAM_TOOLSET_ROOT%_" == "__" ( set PATH=%BOOST_JAM_TOOLSET_ROOT%bin;%PATH%) - set BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib + set BOOST_JAM_CC=cl /nologo /RTC1 /Zi /MTd -DNT -DYYDEBUG -wd4996 kernel32.lib advapi32.lib user32.lib set BOOST_JAM_OPT_JAM=/Febootstrap\jam0 set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0 set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0 @@ -298,7 +298,7 @@ if "_%BOOST_JAM_TOOLSET%_" == "_gcc-nocygwin_" ( set _known_=1 ) if "_%BOOST_JAM_TOOLSET%_" == "_intel-win32_" ( - set BOOST_JAM_CC=icl -DNT /nologo kernel32.lib advapi32.lib + set BOOST_JAM_CC=icl -DNT /nologo kernel32.lib advapi32.lib user32.lib set BOOST_JAM_OPT_JAM=/Febootstrap\jam0 set BOOST_JAM_OPT_MKJAMBASE=/Febootstrap\mkjambase0 set BOOST_JAM_OPT_YYACC=/Febootstrap\yyacc0 diff --git a/historic/jam/src/build.jam b/historic/jam/src/build.jam index 32f028bae..479b892eb 100644 --- a/historic/jam/src/build.jam +++ b/historic/jam/src/build.jam @@ -177,7 +177,7 @@ toolset intel-win32 icl : /Fe : -D [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ] [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ] -I$(--python-include) - : kernel32.lib advapi32.lib $(--python-lib[1]) ; + : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## KCC ? toolset kcc KCC : "-o " : -D : @@ -203,7 +203,7 @@ toolset kylix bc++ : -o : -D [ opt --debug : -runtime ssd -opt none -inline off ] -I$(--python-include) ; toolset metrowerks $(mwcc) .link : "-o " : - : -subsystem console -ladvapi32.lib + : -subsystem console -lkernel32.lib -ladvapi32.lib -luser32.lib [ opt --release : -runtime ss ] [ opt --debug : -runtime ssd ] : $(--python-lib[1]) ; @@ -228,7 +228,7 @@ toolset msvc cl : /Fe : -D [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ] [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ] -I$(--python-include) - : kernel32.lib advapi32.lib $(--python-lib[1]) ; + : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## QNX 6.x GCC 3.x/2.95.3 toolset qcc qcc : "-o " : -D : -Wc,-pedantic @@ -264,14 +264,14 @@ toolset vc7 cl : /Fe : -D [ opt --release : /ML /O2 /Ob2 /Gy /GF /GA /GB ] [ opt --debug : /MLd /DEBUG /Z7 /Od /Ob0 ] -I$(--python-include) - : kernel32.lib advapi32.lib $(--python-lib[1]) ; + : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## Microsoft Visual C++ 2005 toolset vc8 cl : /Fe : -D : /nologo [ opt --release : /MT /O2 /Ob2 /Gy /GF /GA /wd4996 ] [ opt --debug : /MTd /DEBUG /Z7 /Od /Ob0 /wd4996 ] -I$(--python-include) - : kernel32.lib advapi32.lib $(--python-lib[1]) ; + : kernel32.lib advapi32.lib user32.lib $(--python-lib[1]) ; ## VMS/OpenVMS DEC C toolset vmsdecc cc : /OBJECT= : "/DEFINES=(" "," ")" : /STANDARD=VAXC /PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES diff --git a/historic/jam/src/execnt.c b/historic/jam/src/execnt.c index 29a6b6515..1d43df1ce 100644 --- a/historic/jam/src/execnt.c +++ b/historic/jam/src/execnt.c @@ -897,6 +897,67 @@ check_process_exit( return result; } +int is_parent_child(DWORD parent, DWORD child) +{ + HANDLE process_snapshot_h = INVALID_HANDLE_VALUE; + + if (parent == child) + return 1; + + process_snapshot_h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); + if (INVALID_HANDLE_VALUE != process_snapshot_h) + { + BOOL ok = TRUE; + PROCESSENTRY32 pinfo; + pinfo.dwSize = sizeof(PROCESSENTRY32); + for ( + ok = Process32First(process_snapshot_h, &pinfo); + ok == TRUE; + ok = Process32Next(process_snapshot_h, &pinfo) ) + { + if (pinfo.th32ProcessID == child && pinfo.th32ParentProcessID) + return is_parent_child(parent, pinfo.th32ParentProcessID); + } + + CloseHandle(process_snapshot_h); + } + + return 0; +} + +int related(HANDLE h, DWORD p) +{ + return is_parent_child(get_process_id(h), p); +} + +BOOL CALLBACK window_enum(HWND hwnd, LPARAM lParam) +{ + char buf[10] = {0}; + HANDLE h = *((HANDLE*) (lParam)); + DWORD pid = 0; + + if (!GetClassNameA(hwnd, buf, 10)) + return TRUE; // failed to read class name + + if (strcmp(buf, "#32770")) + return TRUE; // not a dialog + + GetWindowThreadProcessId(hwnd, &pid); + if (related(h, pid)) + { + PostMessage(hwnd, WM_QUIT, 0, 0); + // just one window at a time + return FALSE; + } + + return TRUE; +} + +void close_alert(HANDLE process) +{ + EnumWindows(&window_enum, (LPARAM) &process); +} + static double running_time(HANDLE process) { @@ -1046,6 +1107,9 @@ my_wait( int *status ) double t = running_time(active_handles[i]); if ( t > (double)globs.timeout ) { + /* the job may have left an alert dialog around, + try and get rid of it before killing */ + close_alert(active_handles[i]); /* we have a "runaway" job, kill it */ kill_all(0,active_handles[i]); /* indicate the job "finished" so we query its status below */