aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2011-08-01 00:02:04 +0000
committerChristopher Faylor <me@cgf.cx>2011-08-01 00:02:04 +0000
commitdc3dc49831af710f58f4e63f672ccd1d4bab83af (patch)
treedef7eb0a15a01f4a4c3a87a5b39f855d49645314
parentc1146045298c1bbd3c808fc8a4f5244a9dbaa9e4 (diff)
downloadnewlib-dc3dc49831af710f58f4e63f672ccd1d4bab83af.zip
newlib-dc3dc49831af710f58f4e63f672ccd1d4bab83af.tar.gz
newlib-dc3dc49831af710f58f4e63f672ccd1d4bab83af.tar.bz2
* sigproc.cc (pending_signals::pending): Define new function.
(sig_dispatch_pending): Avoid calling sig_send if there are no pending signals.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/sigproc.cc9
2 files changed, 14 insertions, 1 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index cc62bc2..569f359 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2011-07-31 Christopher Faylor <me.cygwin2011@cgf.cx>
+
+ * sigproc.cc (pending_signals::pending): Define new function.
+ (sig_dispatch_pending): Avoid calling sig_send if there are no pending
+ signals.
+
2011-07-31 Corinna Vinschen <corinna@vinschen.de>
* fhandler.h (class fhandler_dev_mem): Remove dup method declaration.
diff --git a/winsup/cygwin/sigproc.cc b/winsup/cygwin/sigproc.cc
index 8e458b9..fcd559b 100644
--- a/winsup/cygwin/sigproc.cc
+++ b/winsup/cygwin/sigproc.cc
@@ -88,6 +88,7 @@ public:
void reset () {curr = &start; prev = &start;}
void add (sigpacket&);
void del ();
+ bool pending () const {return !!start.next;}
sigpacket *next ();
sigpacket *save () const {return curr;}
void restore (sigpacket *saved) {curr = saved;}
@@ -431,7 +432,13 @@ sig_dispatch_pending (bool fast)
return;
}
- sig_send (myself, fast ? __SIGFLUSHFAST : __SIGFLUSH);
+ /* Non-atomically test for any signals pending and wake up wait_sig if any are
+ found. It's ok if there's a race here since the next call to this function
+ should catch it.
+ FIXME: Eventually, wait_sig should wake up on its own to deal with pending
+ signals. */
+ if (sigq.pending ())
+ sig_send (myself, fast ? __SIGFLUSHFAST : __SIGFLUSH);
}
void __stdcall