diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 8 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/sigproc.h | 3 |
3 files changed, 18 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 746730b15..94f4a9df2 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,11 @@ +2004-01-20 Christopher Faylor <cgf@redhat.com> + + * sigproc.cc (pending_signals::save): New function. + (pending_signals::restore): Ditto. + (sig_clear): Save/restore current queue pointer. + (wait_sig): Delete signals marked as such. + * sigproc.h (__SIGDELETE): New enum. + 2004-01-16 Christopher Faylor <cgf@redhat.com> * fhandler_console.cc (fhandler_console::close): Remove obsolete test diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc index b53aa5f58..942373460 100644 --- a/winsup/cygwin/sigproc.cc +++ b/winsup/cygwin/sigproc.cc @@ -71,6 +71,8 @@ public: void add (int sig, int pid, _threadinfo *tls); void del (); sigelem *next (); + sigelem *save () const {return curr;} + void restore (sigelem *saved) {curr = saved;} friend int __stdcall sig_dispatch_pending (); }; @@ -562,14 +564,16 @@ sig_clear (int target_sig) sig_send (myself, -target_sig); else { - sigqueue.reset (); sigelem *q; + sigelem *save = sigqueue.save (); + sigqueue.reset (); while ((q = sigqueue.next ())) if (q->sig == target_sig) { - sigqueue.del (); + q->sig = __SIGDELETE; break; } + sigqueue.restore (save); } return; } @@ -1171,7 +1175,8 @@ wait_sig (VOID *self) case __SIGFLUSH: sigqueue.reset (); while ((q = sigqueue.next ())) - if (sig_handle (q->sig, *pack.mask, q->pid, q->tls) > 0) + if (q->sig == __SIGDELETE + || (sig_handle (q->sig, *pack.mask, q->pid, q->tls) > 0)) sigqueue.del (); break; default: diff --git a/winsup/cygwin/sigproc.h b/winsup/cygwin/sigproc.h index f34dfa208..fe9b92b71 100644 --- a/winsup/cygwin/sigproc.h +++ b/winsup/cygwin/sigproc.h @@ -22,7 +22,8 @@ enum __SIGFLUSH = -(NSIG + 1), __SIGSTRACE = -(NSIG + 2), __SIGCOMMUNE = -(NSIG + 3), - __SIGPENDING = -(NSIG + 4) + __SIGPENDING = -(NSIG + 4), + __SIGDELETE = -(NSIG + 5) }; #endif |