mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-31 19:40:33 +08:00
* sigproc.cc (proc_exists): A zombie process does not exist.
(sig_send): Improve debugging output. Wait for pipe to be created before trying to send to it. Call call_signal_handler_now if sending a signal to myself.
This commit is contained in:
parent
c026d84209
commit
0670609d12
@ -1,3 +1,10 @@
|
|||||||
|
2003-11-23 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* sigproc.cc (proc_exists): A zombie process does not exist.
|
||||||
|
(sig_send): Improve debugging output. Wait for pipe to be created
|
||||||
|
before trying to send to it. Call call_signal_handler_now if sending a
|
||||||
|
signal to myself.
|
||||||
|
|
||||||
2003-11-22 Christopher Faylor <cgf@redhat.com>
|
2003-11-22 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* dcrt0.cc (check_sanity_and_sync): Correct api major version check so
|
* dcrt0.cc (check_sanity_and_sync): Correct api major version check so
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
/* sigproc.cc: inter/intra signal and sub process handler
|
/* sigproc.cc: inter/intra signal and sub process handler
|
||||||
|
|
||||||
Copyright 1997, 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
|
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003 Red Hat, Inc.
|
||||||
|
|
||||||
Written by Christopher Faylor <cgf@cygnus.com>
|
Written by Christopher Faylor
|
||||||
|
|
||||||
This file is part of Cygwin.
|
This file is part of Cygwin.
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ details. */
|
|||||||
|
|
||||||
#define wake_wait_subproc() SetEvent (events[0])
|
#define wake_wait_subproc() SetEvent (events[0])
|
||||||
|
|
||||||
#define no_signals_available() (!hwait_sig || !sig_loop_wait)
|
#define no_signals_available() (!hwait_sig || !sig_loop_wait && !exit_state)
|
||||||
|
|
||||||
#define NZOMBIES 256
|
#define NZOMBIES 256
|
||||||
|
|
||||||
@ -267,7 +267,7 @@ pid_exists (pid_t pid)
|
|||||||
BOOL __stdcall
|
BOOL __stdcall
|
||||||
proc_exists (_pinfo *p)
|
proc_exists (_pinfo *p)
|
||||||
{
|
{
|
||||||
return p && !(p->process_state & PID_EXITED);
|
return p && !(p->process_state & (PID_EXITED | PID_ZOMBIE));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return 1 if this is one of our children, zero otherwise.
|
/* Return 1 if this is one of our children, zero otherwise.
|
||||||
@ -428,9 +428,8 @@ proc_subproc (DWORD what, DWORD val)
|
|||||||
goto scan_wait;
|
goto scan_wait;
|
||||||
|
|
||||||
/* Clear all waiting threads. Called from exceptions.cc prior to
|
/* Clear all waiting threads. Called from exceptions.cc prior to
|
||||||
* the main thread's dispatch to a signal handler function.
|
the main thread's dispatch to a signal handler function.
|
||||||
* (called from wait_sig thread)
|
(called from wait_sig thread) */
|
||||||
*/
|
|
||||||
case PROC_CLEARWAIT:
|
case PROC_CLEARWAIT:
|
||||||
/* Clear all "wait"ing threads. */
|
/* Clear all "wait"ing threads. */
|
||||||
if (val)
|
if (val)
|
||||||
@ -707,15 +706,20 @@ sig_send (_pinfo *p, int sig, DWORD ebp, bool exception)
|
|||||||
HANDLE hp = OpenProcess (PROCESS_DUP_HANDLE, false, p->dwProcessId);
|
HANDLE hp = OpenProcess (PROCESS_DUP_HANDLE, false, p->dwProcessId);
|
||||||
if (!hp)
|
if (!hp)
|
||||||
{
|
{
|
||||||
|
sigproc_printf ("OpenProcess failed, %E");
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; !p->sendsig && i < 10000; i++)
|
||||||
|
low_priority_sleep (0);
|
||||||
if (!DuplicateHandle (hp, p->sendsig, hMainProc, &sendsig, false, 0,
|
if (!DuplicateHandle (hp, p->sendsig, hMainProc, &sendsig, false, 0,
|
||||||
DUPLICATE_SAME_ACCESS) || !sendsig)
|
DUPLICATE_SAME_ACCESS) || !sendsig)
|
||||||
{
|
{
|
||||||
|
sigproc_printf ("DuplicateHandle failed, %E");
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
CloseHandle (hp);
|
||||||
pack.wakeup = NULL;
|
pack.wakeup = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -738,6 +742,7 @@ sig_send (_pinfo *p, int sig, DWORD ebp, bool exception)
|
|||||||
process is exiting. */
|
process is exiting. */
|
||||||
if (!its_me)
|
if (!its_me)
|
||||||
{
|
{
|
||||||
|
sigproc_printf ("WriteFile for pipe %p failed, %E", sendsig);
|
||||||
__seterrno ();
|
__seterrno ();
|
||||||
ForceCloseHandle (sendsig);
|
ForceCloseHandle (sendsig);
|
||||||
}
|
}
|
||||||
@ -784,6 +789,9 @@ sig_send (_pinfo *p, int sig, DWORD ebp, bool exception)
|
|||||||
rc = -1;
|
rc = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wait_for_completion)
|
||||||
|
call_signal_handler_now ();
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (sig != __SIGPENDING)
|
if (sig != __SIGPENDING)
|
||||||
/* nothing */;
|
/* nothing */;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user