From 7efa3fb3579fcb105ab84748945638daccdb4761 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Fri, 21 Dec 2012 13:21:35 +0200 Subject: [PATCH] Possibly fix bug #13086 with losing track of subprocesses on MS-Windows. 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 . --- src/ChangeLog | 11 +++++++++++ src/w32proc.c | 10 ++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 645da892971..6e7f771d220 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2012-12-21 Eli Zaretskii + + * 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 . + 2012-12-21 Chong Yidong * buffer.c (Fset_buffer_major_mode): Doc fix (Bug#13231). diff --git a/src/w32proc.c b/src/w32proc.c index e3c54fe5460..03360075a09 100644 --- a/src/w32proc.c +++ b/src/w32proc.c @@ -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; } -- 2.39.5