Boost logo

Boost-Build :

From: Bronek Kozicki (brok_at_[hidden])
Date: 2006-06-17 07:25:43


Bronek Kozicki wrote:
> (blush) oh, wait. There might be better fix for this. I will see today and
> send another diff if it works :)

Hello Rene, Volodya

pls. apply attached diff to boost/tools/jam/src/execnt.c in both branches:
HEAD and RC 1.34.0 . Besides improved performance it also fixes memory leak,
this is why I feel it should also go to RC 1.34.0 .

B.


--- C:\Documents and Settings\Bronek Kozicki\Desktop\execnt.c Sat Jun 17 11:04:58 2006 UTC
+++ E:\DEVEL\BOOST_RTEST\boost\tools\jam\src\execnt.c Sat Jun 17 11:13:43 2006 UTC
@@ -1016,9 +1016,12 @@
             ok == TRUE;
             ok = Process32Next(process_snapshot_h, &pinfo) )
         {
             if (pinfo.th32ProcessID == child && pinfo.th32ParentProcessID)
+ {
+ CloseHandle(process_snapshot_h);
                 return is_parent_child(parent, pinfo.th32ParentProcessID);
+ }
         }
 
         CloseHandle(process_snapshot_h);
     }
@@ -1035,20 +1038,30 @@
 {
     char buf[10] = {0};
     HANDLE h = *((HANDLE*) (lParam));
     DWORD pid = 0;
+ DWORD tid = 0;
 
     if (!GetClassNameA(hwnd, buf, 10))
- return TRUE; // failed to read class name
+ return TRUE; /* failed to read class name; presume it's not a dialog */
 
     if (strcmp(buf, "#32770"))
- return TRUE; // not a dialog
+ return TRUE; /* not a dialog */
 
- GetWindowThreadProcessId(hwnd, &pid);
+ tid = GetWindowThreadProcessId(hwnd, &pid);
     if (related(h, pid))
     {
- PostMessage(hwnd, WM_QUIT, 0, 0);
- // just one window at a time
+ /* ask really nice */
+ PostMessageA(hwnd, WM_CLOSE, 0, 0);
+ /* now wait and see if it worked. If not, insist */
+ if (WaitForSingleObject(h, 500) == WAIT_TIMEOUT)
+ {
+ PostThreadMessageA(tid, WM_QUIT, 0, 0);
+ if (WaitForSingleObject(h, 500) == WAIT_TIMEOUT)
+ {
+ PostThreadMessageA(tid, WM_QUIT, 0, 0);
+ }
+ }
         return FALSE;
     }
 
     return TRUE;
@@ -1104,13 +1117,13 @@
                 /* check if any jobs have surpassed the maximum run time. */
                 for ( i = 0; i < num_active; ++i )
                 {
                     double t = running_time(active_handles[i]);
+ /* the job may have left an alert dialog around,
+ try and get rid of it before killing */
+ close_alert(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 */
                         waitcode = WAIT_ABANDONED_0+i;


Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk