summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2012-12-07 17:23:22 +0000
committerChristopher Faylor <me@cgf.cx>2012-12-07 17:23:22 +0000
commit9873ac53d7a52f96784a98098d78b71677e6599c (patch)
tree82ecd90419401778802a54aba63323a3e439d6a1
parenta4f34961d862421a174505cb79306d29d73bb9db (diff)
downloadcygnal-9873ac53d7a52f96784a98098d78b71677e6599c.tar.gz
cygnal-9873ac53d7a52f96784a98098d78b71677e6599c.tar.bz2
cygnal-9873ac53d7a52f96784a98098d78b71677e6599c.zip
* cygtls.h (_cygtls::get_signal_arrived): Add parameter to make lock/unlock
conditional. * exceptions.cc (_cygtls::interrupt_setup): Don't get a lock when setting signal_arrived since we already have one. * gendef: Add some comments to make it easier to find functions.
-rw-r--r--winsup/cygwin/ChangeLog8
-rw-r--r--winsup/cygwin/cygtls.h8
-rw-r--r--winsup/cygwin/exceptions.cc2
-rwxr-xr-xwinsup/cygwin/gendef2
4 files changed, 16 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index e9d6b261c..7b2156afe 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,11 @@
+2012-12-07 Christopher Faylor <me.cygwin2012@cgf.cx>
+
+ * cygtls.h (_cygtls::get_signal_arrived): Add parameter to make
+ lock/unlock conditional.
+ * exceptions.cc (_cygtls::interrupt_setup): Don't get a lock when
+ setting signal_arrived since we already have one.
+ * gendef: Add some comments to make it easier to find functions.
+
2012-12-06 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* include/cygwin/wait.h (WAIT_ANY): Define.
diff --git a/winsup/cygwin/cygtls.h b/winsup/cygwin/cygtls.h
index 4946e59c9..5913ce46f 100644
--- a/winsup/cygwin/cygtls.h
+++ b/winsup/cygwin/cygtls.h
@@ -233,14 +233,16 @@ public:
void lock () __attribute__ ((regparm (1)));
void unlock () __attribute__ ((regparm (1)));
bool locked () __attribute__ ((regparm (1)));
- HANDLE get_signal_arrived ()
+ HANDLE get_signal_arrived (bool wait_for_lock = true)
{
if (!signal_arrived)
{
- lock ();
+ if (wait_for_lock)
+ lock ();
if (!signal_arrived)
signal_arrived = CreateEvent (&sec_none_nih, false, false, NULL);
- unlock ();
+ if (wait_for_lock)
+ unlock ();
}
return signal_arrived;
}
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc
index 5ec0f2c71..c04e35af7 100644
--- a/winsup/cygwin/exceptions.cc
+++ b/winsup/cygwin/exceptions.cc
@@ -799,7 +799,7 @@ _cygtls::interrupt_setup (siginfo_t& si, void *handler, struct sigaction& siga)
this->sig = si.si_signo; // Should always be last thing set to avoid a race
if (incyg)
- SetEvent (get_signal_arrived ());
+ SetEvent (get_signal_arrived (false));
proc_subproc (PROC_CLEARWAIT, 1);
sigproc_printf ("armed signal_arrived %p, signal %d", signal_arrived, si.si_signo);
diff --git a/winsup/cygwin/gendef b/winsup/cygwin/gendef
index 1e2d117c7..351fae5ff 100755
--- a/winsup/cygwin/gendef
+++ b/winsup/cygwin/gendef
@@ -218,6 +218,7 @@ __ZN7_cygtls3popEv:
popl %ebx
ret
+# _cygtls::lock
.global __ZN7_cygtls4lockEv
__ZN7_cygtls4lockEv:
pushl %ebx
@@ -231,6 +232,7 @@ __ZN7_cygtls4lockEv:
2: popl %ebx
ret
+# _cygtls::unlock
.global __ZN7_cygtls6unlockEv
__ZN7_cygtls6unlockEv:
decl $tls::pstacklock(%eax)