]> code.delx.au - gnu-emacs/commitdiff
Possibly fix bug #13086 with losing track of subprocesses on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Fri, 21 Dec 2012 11:21:35 +0000 (13:21 +0200)
committerEli Zaretskii <eliz@gnu.org>
Fri, 21 Dec 2012 11:21:35 +0000 (13:21 +0200)
 src/w32proc.c (new_child, delete_child, find_child_pid): For a
 subprocess, consider its slot being in use as long as its process
 handle (procinfo.hProcess) is not NULL.  This avoids reusing the
 slot when a new process is started immediately after killing
 another one, without waiting enough time for the first process to
 be reaped and resources allocated for it be orderly freed.
 Suggested by Fabrice Popineau <fabrice.popineau@supelec.fr>.

src/ChangeLog
src/w32proc.c

index 645da8929711f782ac9f4fe13df9a3a8662d1d60..6e7f771d220f4dbf7e809f21679ab514625b1bfe 100644 (file)
@@ -1,3 +1,14 @@
+2012-12-21  Eli Zaretskii  <eliz@gnu.org>
+
+       * w32proc.c (new_child, delete_child, find_child_pid): For a
+       subprocess, consider its slot being in use as long as its process
+       handle (procinfo.hProcess) is not NULL.  This avoids reusing the
+       slot when a new process is started immediately after killing
+       another one, without waiting enough time for the first process to
+       be reaped and resources allocated for it be orderly freed.
+       (Bug#13086)
+       Suggested by Fabrice Popineau <fabrice.popineau@supelec.fr>.
+
 2012-12-21  Chong Yidong  <cyd@gnu.org>
 
        * buffer.c (Fset_buffer_major_mode): Doc fix (Bug#13231).
index e3c54fe54600e584df85d50d2d922d6b9fa4f431..03360075a09e109e23ffcbf767be3fd0eb2181bc 100644 (file)
@@ -795,7 +795,7 @@ new_child (void)
   DWORD id;
 
   for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
-    if (!CHILD_ACTIVE (cp))
+    if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
       goto Initialize;
   if (child_proc_count == MAX_CHILDREN)
     return NULL;
@@ -852,7 +852,7 @@ delete_child (child_process *cp)
     if (fd_info[i].cp == cp)
       emacs_abort ();
 
-  if (!CHILD_ACTIVE (cp))
+  if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
     return;
 
   /* reap thread if necessary */
@@ -896,7 +896,8 @@ delete_child (child_process *cp)
   if (cp == child_procs + child_proc_count - 1)
     {
       for (i = child_proc_count-1; i >= 0; i--)
-       if (CHILD_ACTIVE (&child_procs[i]))
+       if (CHILD_ACTIVE (&child_procs[i])
+           || child_procs[i].procinfo.hProcess != NULL)
          {
            child_proc_count = i + 1;
            break;
@@ -913,7 +914,8 @@ find_child_pid (DWORD pid)
   child_process *cp;
 
   for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
-    if (CHILD_ACTIVE (cp) && pid == cp->pid)
+    if ((CHILD_ACTIVE (cp) || cp->procinfo.hProcess != NULL)
+       && pid == cp->pid)
       return cp;
   return NULL;
 }