Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-08-15 22:50:44 +0400
committerChristopher Faylor <me@cgf.cx>2012-08-15 22:50:44 +0400
commit879f3ad5eefc0cb914e7fed1a219ebb11c995a99 (patch)
tree3070364adc2f282714d85761bb6c975bd516ffbc
parent588b40e260f180d02c91132821856c12c83fddc2 (diff)
* cygtls.h (_cygtls::create_signal_arrived): New function.
(_cygtls::set_signal_arrived): Lock creation of signal_arrived. * cygwait.cc (cancelable_wait): Ignore signal_arrived event if _my_tls 'sig' element does not exist. * exceptions.cc (_cygtls::interrupt_setup): Create signal_arrived if recipient thread has not created it.
-rw-r--r--winsup/cygwin/ChangeLog9
-rw-r--r--winsup/cygwin/cygtls.h10
-rw-r--r--winsup/cygwin/cygwait.cc16
-rw-r--r--winsup/cygwin/exceptions.cc8
4 files changed, 36 insertions, 7 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index b2ea1a0f6..3852cec6f 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,14 @@
2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
+ * cygtls.h (_cygtls::create_signal_arrived): New function.
+ (_cygtls::set_signal_arrived): Lock creation of signal_arrived.
+ * cygwait.cc (cancelable_wait): Ignore signal_arrived event if _my_tls
+ 'sig' element does not exist.
+ * exceptions.cc (_cygtls::interrupt_setup): Create signal_arrived if
+ recipient thread has not created it.
+
+2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
+
* gendef: Tighten up whitespace detection.
2012-08-15 Christopher Faylor <me.cygwin2012@cgf.cx>
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h
index d683cf837..134fde290 100644
--- a/winsup/cygwin/cygtls.h
+++ b/winsup/cygwin/cygtls.h
@@ -235,6 +235,10 @@ public:
void lock () __attribute__ ((regparm (1)));
void unlock () __attribute__ ((regparm (1)));
bool locked () __attribute__ ((regparm (1)));
+ void create_signal_arrived ()
+ {
+ signal_arrived = CreateEvent (&sec_none_nih, false, false, NULL);
+ }
void set_signal_arrived (bool setit, HANDLE& h)
{
if (!setit)
@@ -242,7 +246,11 @@ public:
else
{
if (!signal_arrived)
- signal_arrived = CreateEvent (&sec_none_nih, false, false, NULL);
+ {
+ lock ();
+ create_signal_arrived ();
+ unlock ();
+ }
h = signal_arrived;
signal_waiting = true;
}
diff --git a/winsup/cygwin/cygwait.cc b/winsup/cygwin/cygwait.cc
index ee7a705ef..e2592851d 100644
--- a/winsup/cygwin/cygwait.cc
+++ b/winsup/cygwin/cygwait.cc
@@ -79,10 +79,18 @@ cancelable_wait (HANDLE object, PLARGE_INTEGER timeout, unsigned mask)
res = WAIT_TIMEOUT;
else if (res != sig_n)
/* all set */;
- else if (is_cw_sig_eintr)
- res = WAIT_SIGNALED; /* caller will deal with signals */
- else if (_my_tls.call_signal_handler ())
- continue;
+ else
+ {
+ _my_tls.lock ();
+ int sig = _my_tls.sig;
+ _my_tls.unlock ();
+ if (!sig)
+ continue;
+ if (is_cw_sig_eintr)
+ res = WAIT_SIGNALED; /* caller will deal with signals */
+ else if (_my_tls.call_signal_handler ())
+ continue;
+ }
break;
}
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 8df69f29d..6de1f16b9 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -796,8 +796,12 @@ _cygtls::interrupt_setup (int sig, void *handler, struct sigaction& siga)
this->sig = sig; // Should always be last thing set to avoid a race
- if (incyg && signal_arrived)
- SetEvent (signal_arrived);
+ if (incyg)
+ {
+ if (!signal_arrived)
+ create_signal_arrived ();
+ SetEvent (signal_arrived);
+ }
proc_subproc (PROC_CLEARWAIT, 1);
sigproc_printf ("armed signal_arrived %p, signal %d", signal_arrived, sig);