More robust creation of a subprocess, attempt to solve bug #13546.
src/w32proc.c (new_child): If no vacant slots are found in child_procs[], make another pass looking for slots whose process has exited or died.
This commit is contained in:
parent
6e432f0cda
commit
0e4e7b741b
2 changed files with 31 additions and 0 deletions
|
@ -1,5 +1,9 @@
|
|||
2013-02-13 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* w32proc.c (new_child): If no vacant slots are found in
|
||||
child_procs[], make another pass looking for slots whose process
|
||||
has exited or died. (Bug#13546)
|
||||
|
||||
* w32.c (sys_pipe): When failing due to file descriptors above
|
||||
MAXDESC, set errno to EMFILE.
|
||||
(_sys_read_ahead): Update cp->status when failing to read serial
|
||||
|
|
|
@ -797,6 +797,33 @@ new_child (void)
|
|||
for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
|
||||
if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess == NULL)
|
||||
goto Initialize;
|
||||
if (child_proc_count == MAX_CHILDREN)
|
||||
{
|
||||
DebPrint (("new_child: No vacant slots, looking for dead processes\n"));
|
||||
for (cp = child_procs + (child_proc_count-1); cp >= child_procs; cp--)
|
||||
if (!CHILD_ACTIVE (cp) && cp->procinfo.hProcess)
|
||||
{
|
||||
DWORD status = 0;
|
||||
|
||||
if (!GetExitCodeProcess (cp->procinfo.hProcess, &status))
|
||||
{
|
||||
DebPrint (("new_child.GetExitCodeProcess: error %lu for PID %lu\n",
|
||||
GetLastError (), cp->procinfo.dwProcessId));
|
||||
status = STILL_ACTIVE;
|
||||
}
|
||||
if (status != STILL_ACTIVE
|
||||
|| WaitForSingleObject (cp->procinfo.hProcess, 0) == WAIT_OBJECT_0)
|
||||
{
|
||||
DebPrint (("new_child: Freeing slot of dead process %d\n",
|
||||
cp->procinfo.dwProcessId));
|
||||
CloseHandle (cp->procinfo.hProcess);
|
||||
cp->procinfo.hProcess = NULL;
|
||||
CloseHandle (cp->procinfo.hThread);
|
||||
cp->procinfo.hThread = NULL;
|
||||
goto Initialize;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (child_proc_count == MAX_CHILDREN)
|
||||
return NULL;
|
||||
cp = &child_procs[child_proc_count++];
|
||||
|
|
Loading…
Add table
Reference in a new issue