* pinfo.cc (pinfo_init): Cosmetic change: unset "destroy" for myself.
(pinfo::wait): Change some comments. (pinfo::prefork): Move a comment. (pinfo::postfork): Set pending_*_pipe variables to NULL if closed. (pinfo::postexec): Use right name when closing handle. (_pinfo::alert_parent): Ditto. * sigproc.h (hold_everything): Remove debugging label.
This commit is contained in:
parent
b0a905c5a0
commit
e9a6f9c625
@ -1,3 +1,13 @@
|
|||||||
|
2012-03-19 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||||
|
|
||||||
|
* pinfo.cc (pinfo_init): Cosmetic change: unset "destroy" for myself.
|
||||||
|
(pinfo::wait): Change some comments.
|
||||||
|
(pinfo::prefork): Move a comment.
|
||||||
|
(pinfo::postfork): Set pending_*_pipe variables to NULL if closed.
|
||||||
|
(pinfo::postexec): Use right name when closing handle.
|
||||||
|
(_pinfo::alert_parent): Ditto.
|
||||||
|
* sigproc.h (hold_everything): Remove debugging label.
|
||||||
|
|
||||||
2012-03-19 Christopher Faylor <me.cygwin2012@cgf.cx>
|
2012-03-19 Christopher Faylor <me.cygwin2012@cgf.cx>
|
||||||
|
|
||||||
* cygserver_ipc.h: Include sigproc.h for signal_arrived declaration.
|
* cygserver_ipc.h: Include sigproc.h for signal_arrived declaration.
|
||||||
|
@ -117,6 +117,7 @@ pinfo_init (char **envp, int envc)
|
|||||||
|
|
||||||
myself->process_state |= PID_ACTIVE;
|
myself->process_state |= PID_ACTIVE;
|
||||||
myself->process_state &= ~(PID_INITIALIZING | PID_EXITED | PID_REAPED);
|
myself->process_state &= ~(PID_INITIALIZING | PID_EXITED | PID_REAPED);
|
||||||
|
myself.preserve ();
|
||||||
debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid);
|
debug_printf ("pid %d, pgid %d", myself->pid, myself->pgid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,6 +934,7 @@ proc_waiter (void *arg)
|
|||||||
case __ALERT_ALIVE:
|
case __ALERT_ALIVE:
|
||||||
continue;
|
continue;
|
||||||
case 0:
|
case 0:
|
||||||
|
debug_printf ("%d exited buf %d\n", vchild->pid, buf);
|
||||||
/* Child exited. Do some cleanup and signal myself. */
|
/* Child exited. Do some cleanup and signal myself. */
|
||||||
vchild.maybe_set_exit_code_from_windows ();
|
vchild.maybe_set_exit_code_from_windows ();
|
||||||
if (WIFEXITED (vchild->exitcode))
|
if (WIFEXITED (vchild->exitcode))
|
||||||
@ -987,11 +989,17 @@ proc_waiter (void *arg)
|
|||||||
bool
|
bool
|
||||||
pinfo::wait ()
|
pinfo::wait ()
|
||||||
{
|
{
|
||||||
|
/* If pending_rd_proc_pipe == NULL we're in an execed process which has
|
||||||
|
already grabbed the read end of the pipe from the previous cygwin process
|
||||||
|
running with this pid. */
|
||||||
if (pending_rd_proc_pipe)
|
if (pending_rd_proc_pipe)
|
||||||
{
|
{
|
||||||
|
/* Our end of the pipe, previously set in prefork() . */
|
||||||
rd_proc_pipe = pending_rd_proc_pipe;
|
rd_proc_pipe = pending_rd_proc_pipe;
|
||||||
pending_rd_proc_pipe = NULL;
|
pending_rd_proc_pipe = NULL;
|
||||||
|
|
||||||
|
/* This sets wr_proc_pipe in the child which, after the following
|
||||||
|
ForceCloseHandle1, will be only process with the handle open. */
|
||||||
wr_proc_pipe () = pending_wr_proc_pipe;
|
wr_proc_pipe () = pending_wr_proc_pipe;
|
||||||
ForceCloseHandle1 (pending_wr_proc_pipe, wr_proc_pipe);
|
ForceCloseHandle1 (pending_wr_proc_pipe, wr_proc_pipe);
|
||||||
pending_wr_proc_pipe = NULL;
|
pending_wr_proc_pipe = NULL;
|
||||||
@ -1020,9 +1028,6 @@ pinfo::prefork (bool detached)
|
|||||||
if (wr_proc_pipe () && wr_proc_pipe () != INVALID_HANDLE_VALUE
|
if (wr_proc_pipe () && wr_proc_pipe () != INVALID_HANDLE_VALUE
|
||||||
&& !SetHandleInformation (wr_proc_pipe (), HANDLE_FLAG_INHERIT, 0))
|
&& !SetHandleInformation (wr_proc_pipe (), HANDLE_FLAG_INHERIT, 0))
|
||||||
api_fatal ("couldn't set process pipe(%p) inherit state, %E", wr_proc_pipe ());
|
api_fatal ("couldn't set process pipe(%p) inherit state, %E", wr_proc_pipe ());
|
||||||
/* If rd_proc_pipe != NULL we're in an execed process which already has
|
|
||||||
grabbed the read end of the pipe from the previous cygwin process running
|
|
||||||
with this pid. */
|
|
||||||
if (!detached)
|
if (!detached)
|
||||||
{
|
{
|
||||||
if (!CreatePipe (&pending_rd_proc_pipe, &pending_wr_proc_pipe,
|
if (!CreatePipe (&pending_rd_proc_pipe, &pending_wr_proc_pipe,
|
||||||
@ -1046,16 +1051,22 @@ pinfo::postfork ()
|
|||||||
HANDLE_FLAG_INHERIT))
|
HANDLE_FLAG_INHERIT))
|
||||||
api_fatal ("postfork: couldn't set process pipe(%p) inherit state, %E", wr_proc_pipe ());
|
api_fatal ("postfork: couldn't set process pipe(%p) inherit state, %E", wr_proc_pipe ());
|
||||||
if (pending_rd_proc_pipe)
|
if (pending_rd_proc_pipe)
|
||||||
ForceCloseHandle1 (pending_rd_proc_pipe, rd_proc_pipe);
|
{
|
||||||
|
ForceCloseHandle1 (pending_rd_proc_pipe, rd_proc_pipe);
|
||||||
|
pending_rd_proc_pipe = NULL;
|
||||||
|
}
|
||||||
if (pending_wr_proc_pipe)
|
if (pending_wr_proc_pipe)
|
||||||
ForceCloseHandle1 (pending_wr_proc_pipe, wr_proc_pipe);
|
{
|
||||||
|
ForceCloseHandle1 (pending_wr_proc_pipe, wr_proc_pipe);
|
||||||
|
pending_wr_proc_pipe = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pinfo::postexec ()
|
pinfo::postexec ()
|
||||||
{
|
{
|
||||||
if (wr_proc_pipe () && wr_proc_pipe () != INVALID_HANDLE_VALUE
|
if (wr_proc_pipe () && wr_proc_pipe () != INVALID_HANDLE_VALUE
|
||||||
&& !ForceCloseHandle (wr_proc_pipe ()))
|
&& !ForceCloseHandle1 (wr_proc_pipe (), wr_proc_pipe))
|
||||||
api_fatal ("postexec: couldn't close wr_proc_pipe(%p), %E", wr_proc_pipe ());
|
api_fatal ("postexec: couldn't close wr_proc_pipe(%p), %E", wr_proc_pipe ());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1084,7 +1095,7 @@ _pinfo::alert_parent (char sig)
|
|||||||
ppid = 1;
|
ppid = 1;
|
||||||
HANDLE closeit = wr_proc_pipe;
|
HANDLE closeit = wr_proc_pipe;
|
||||||
wr_proc_pipe = INVALID_HANDLE_VALUE;
|
wr_proc_pipe = INVALID_HANDLE_VALUE;
|
||||||
CloseHandle (closeit);
|
ForceCloseHandle1 (closeit, wr_proc_pipe);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (bool) nb;
|
return (bool) nb;
|
||||||
|
@ -166,7 +166,6 @@ public:
|
|||||||
|
|
||||||
class hold_everything
|
class hold_everything
|
||||||
{
|
{
|
||||||
public: /* DELETEME*/
|
|
||||||
bool ischild;
|
bool ischild;
|
||||||
/* Note the order of the locks below. It is important,
|
/* Note the order of the locks below. It is important,
|
||||||
to avoid races, that the lock order be preserved.
|
to avoid races, that the lock order be preserved.
|
||||||
|
Loading…
Reference in New Issue
Block a user