summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2012-05-24 14:17:51 +0000
committerCorinna Vinschen <corinna@vinschen.de>2012-05-24 14:17:51 +0000
commit32c02f191bcafbdea63f2677edfb33c61c14752f (patch)
treef3d377f9fe356ff985fe28df885e1d3e9a8f235c
parenta7a73119742637a6b89dada31e1b2d6ffba3fc3e (diff)
downloadcygnal-32c02f191bcafbdea63f2677edfb33c61c14752f.tar.gz
cygnal-32c02f191bcafbdea63f2677edfb33c61c14752f.tar.bz2
cygnal-32c02f191bcafbdea63f2677edfb33c61c14752f.zip
* thread.cc (__cygwin_lock_lock): Replace null thread check with test
for cygwin_finished_initializing to handle process startup. (__cygwin_lock_trylock): Ditto. (__cygwin_lock_unlock): Ditto.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/thread.cc28
2 files changed, 21 insertions, 14 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 53388bd88..da85ec122 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2012-05-24 Corinna Vinschen <corinna@vinschen.de>
+
+ * thread.cc (__cygwin_lock_lock): Replace null thread check with test
+ for cygwin_finished_initializing to handle process startup.
+ (__cygwin_lock_trylock): Ditto.
+ (__cygwin_lock_unlock): Ditto.
+
2012-05-23 Corinna Vinschen <corinna@vinschen.de>
* thread.cc (__cygwin_lock_lock): Take null thread at process startup
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index d52a85121..8bf5135b6 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -144,7 +144,7 @@ __cygwin_lock_lock (_LOCK_T *lock)
{
paranoid_printf ("threadcount %d. locking", MT_INTERFACE->threadcount);
#ifdef WORKAROUND_NEWLIB
- if (pthread::self () != pthread_null::get_null_pthread ())
+ if (cygwin_finished_initializing)
{
__cygwin_lock_handler *cleanup
= new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
@@ -158,29 +158,29 @@ extern "C" int
__cygwin_lock_trylock (_LOCK_T *lock)
{
#ifdef WORKAROUND_NEWLIB
- __cygwin_lock_handler *cleanup = NULL;
- if (pthread::self () != pthread_null::get_null_pthread ())
+ if (cygwin_finished_initializing)
{
- cleanup = new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
+ __cygwin_lock_handler *cleanup
+ = new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
pthread::self ()->push_cleanup_handler (cleanup);
+ int ret = pthread_mutex_trylock ((pthread_mutex_t*) lock);
+ if (ret)
+ {
+ pthread::self ()->pop_cleanup_handler (0);
+ delete cleanup;
+ }
+ return ret;
}
- int ret = pthread_mutex_trylock ((pthread_mutex_t*) lock);
- if (ret && pthread::self () != pthread_null::get_null_pthread ())
- {
- pthread::self ()->pop_cleanup_handler (0);
- delete cleanup;
- }
- return ret;
-#else
- return pthread_mutex_trylock ((pthread_mutex_t*) lock);
+ else
#endif /* WORKAROUND_NEWLIB */
+ return pthread_mutex_trylock ((pthread_mutex_t*) lock);
}
extern "C" void
__cygwin_lock_unlock (_LOCK_T *lock)
{
#ifdef WORKAROUND_NEWLIB
- if (pthread::self () != pthread_null::get_null_pthread ())
+ if (cygwin_finished_initializing)
pthread::self ()->pop_cleanup_handler (1);
else
#endif /* WORKAROUND_NEWLIB */