* cygthread.cc (cygthread::stub): Detect if thread function wants to release
itself here, to avoid a race. (cygthread::release): Clear more stuff. Add a diagnostic for an internal error. * cygthread.h (auto_release): New function. * pinfo.h (pinfo::remember): Add an argument to denote whether child is detached. * fork.cc (fork_parent): Reflect change in arguments to pinfo::remember. * pinfo.cc (_pinfo::exit): Signal exit more forcibly. (proc_waiter): Use cygthread::auto_release to signify that cygthread::stub should release the thread. This should avoid a race. (pinfo::alert_parent): Don't signify an error when wr_proc_pipe == NULL. * sigproc.cc (proc_subproc): Add support for PROC_DETACHED_CHILD. * sigproc.h: Ditto. * spawn.cc (spawn_guts): Specify whether child is detached or not when calling pinfo::remember.
This commit is contained in:
@ -802,7 +802,7 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||
this). */
|
||||
if (!myself->wr_proc_pipe)
|
||||
{
|
||||
myself.remember ();
|
||||
myself.remember (true);
|
||||
wait_for_myself = true;
|
||||
myself->wr_proc_pipe = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
@ -822,14 +822,6 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||
}
|
||||
child->dwProcessId = pi.dwProcessId;
|
||||
child.hProcess = pi.hProcess;
|
||||
if (!child.remember ())
|
||||
{
|
||||
/* FIXME: Child in strange state now. */
|
||||
CloseHandle (pi.hProcess);
|
||||
CloseHandle (pi.hThread);
|
||||
res = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
strcpy (child->progname, real_path);
|
||||
/* FIXME: This introduces an unreferenced, open handle into the child.
|
||||
@ -839,9 +831,15 @@ spawn_guts (const char * prog_arg, const char *const *argv,
|
||||
However, we should try to find another way to do this eventually. */
|
||||
(void) DuplicateHandle (hMainProc, child.shared_handle (), pi.hProcess,
|
||||
NULL, 0, 0, DUPLICATE_SAME_ACCESS);
|
||||
if (mode == _P_DETACH)
|
||||
myself.alert_parent (0);
|
||||
child->start_time = time (NULL); /* Register child's starting time. */
|
||||
if (!child.remember (mode == _P_DETACH))
|
||||
{
|
||||
/* FIXME: Child in strange state now */
|
||||
CloseHandle (pi.hProcess);
|
||||
ForceCloseHandle (pi.hThread);
|
||||
res = -1;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
/* Start the child running */
|
||||
@ -867,7 +865,7 @@ switch (mode)
|
||||
res = -1;
|
||||
break;
|
||||
case _P_DETACH:
|
||||
res = 0; /* Lose all memory of this child. */
|
||||
res = 0; /* Lost all memory of this child. */
|
||||
break;
|
||||
case _P_NOWAIT:
|
||||
case _P_NOWAITO:
|
||||
|
Reference in New Issue
Block a user