1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-12-02 08:22:22 +00:00

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>.
This commit is contained in:
Eli Zaretskii 2012-12-21 13:21:35 +02:00
parent c1f02afadf
commit 7efa3fb357
2 changed files with 17 additions and 4 deletions

View 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).

View 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;
}