Commit 7efa3fb3 authored by Eli Zaretskii's avatar Eli Zaretskii
Browse files

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 <fabrice.popineau@supelec.fr>.
parent c1f02afa
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).
......
......@@ -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;
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment