From 9873ac53d7a52f96784a98098d78b71677e6599c Mon Sep 17 00:00:00 2001 From: Christopher Faylor Date: Fri, 7 Dec 2012 17:23:22 +0000 Subject: * 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. --- winsup/cygwin/ChangeLog | 8 ++++++++ winsup/cygwin/cygtls.h | 8 +++++--- winsup/cygwin/exceptions.cc | 2 +- winsup/cygwin/gendef | 2 ++ 4 files changed, 16 insertions(+), 4 deletions(-) (limited to 'winsup') 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 + + * 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 * 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) -- cgit v1.2.3