summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/sigproc.cc
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2004-02-26 05:10:49 +0000
committerChristopher Faylor <me@cgf.cx>2004-02-26 05:10:49 +0000
commitca713cfab35fe144b73240ebe2c333c36fd7a214 (patch)
treefea3c6ad34283801c717108aae1f7ff6729f0b92 /winsup/cygwin/sigproc.cc
parentf9e19c093165d7c75bd9d04204845ed53b8ff0a8 (diff)
downloadcygnal-ca713cfab35fe144b73240ebe2c333c36fd7a214.tar.gz
cygnal-ca713cfab35fe144b73240ebe2c333c36fd7a214.tar.bz2
cygnal-ca713cfab35fe144b73240ebe2c333c36fd7a214.zip
* exceptions.cc (setup_handler): Signal event for any sigwaitinfo if it exists
to force signal to be handled. Zero event here to prevent races. * signal.cc (sigwaitinfo): Use local handle value for everything since signal thread could zero event element at any time. Detect when awaking due to thread not in mask and set return value and errno accordingly. Don't set signal number to zero unless we've recognized the signal. * sigproc.cc (sigq): Rename from sigqueue throughout. * thread.cc (pthread::join): Handle signals received while waiting for thread to terminate. * cygwin.din: Export sighold, sigqueue. * exceptions.cc (sighold): Define new function. * signal.cc (handle_sigprocmask): Set correct errno for invalid signal. Simplify debugging output. (sigqueue): Define new function. * include/cygwin/signal.h (sighold): Declare new function. (sigqueue): Ditto. * include/cygwin/version.h: Bump API minor version number. * include/limits.h (TIMER_MAX): Define. (_POSIX_TIMER_MAX): Ditto.
Diffstat (limited to 'winsup/cygwin/sigproc.cc')
-rw-r--r--winsup/cygwin/sigproc.cc28
1 files changed, 14 insertions, 14 deletions
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 993b0ec10..f3f04decc 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -66,7 +66,7 @@ public:
friend void __stdcall sig_dispatch_pending (bool);
};
-static pending_signals sigqueue;
+static pending_signals sigq;
struct sigaction *global_sigs;
@@ -537,15 +537,15 @@ sig_clear (int target_sig)
else
{
sigpacket *q;
- sigpacket *save = sigqueue.save ();
- sigqueue.reset ();
- while ((q = sigqueue.next ()))
+ sigpacket *save = sigq.save ();
+ sigq.reset ();
+ while ((q = sigq.next ()))
if (q->si.si_signo == target_sig)
{
q->si.si_signo = __SIGDELETE;
break;
}
- sigqueue.restore (save);
+ sigq.restore (save);
}
return;
}
@@ -564,11 +564,11 @@ sigpending (sigset_t *mask)
void __stdcall
sig_dispatch_pending (bool fast)
{
- if (exit_state || GetCurrentThreadId () == sigtid || !sigqueue.start.next)
+ if (exit_state || GetCurrentThreadId () == sigtid || !sigq.start.next)
{
#ifdef DEBUGGING
- sigproc_printf ("exit_state %d, cur thread id %p, sigtid %p, sigqueue.start.next %p",
- exit_state, GetCurrentThreadId (), sigtid, sigqueue.start.next);
+ sigproc_printf ("exit_state %d, cur thread id %p, sigtid %p, sigq.start.next %p",
+ exit_state, GetCurrentThreadId (), sigtid, sigq.start.next);
#endif
return;
}
@@ -1156,17 +1156,17 @@ wait_sig (VOID *self)
case __SIGPENDING:
*pack.mask = 0;
unsigned bit;
- sigqueue.reset ();
- while ((q = sigqueue.next ()))
+ sigq.reset ();
+ while ((q = sigq.next ()))
if (myself->getsigmask () & (bit = SIGTOMASK (q->si.si_signo)))
*pack.mask |= bit;
break;
case __SIGFLUSH:
case __SIGFLUSHFAST:
- sigqueue.reset ();
- while ((q = sigqueue.next ()))
+ sigq.reset ();
+ while ((q = sigq.next ()))
if (q->si.si_signo == __SIGDELETE || q->process () > 0)
- sigqueue.del ();
+ sigq.del ();
break;
default:
if (pack.si.si_signo < 0)
@@ -1181,7 +1181,7 @@ wait_sig (VOID *self)
if (!sigres)
system_printf ("Failed to arm signal %d from pid %d", pack.sig, pack.pid);
#endif
- sigqueue.add (pack); // FIXME: Shouldn't add this in !sh condition
+ sigq.add (pack); // FIXME: Shouldn't add this in !sh condition
}
if (sig == SIGCHLD)
proc_subproc (PROC_CLEARWAIT, 0);