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:
authorCorinna Vinschen <corinna@vinschen.de>2012-05-23 23:49:39 +0400
committerCorinna Vinschen <corinna@vinschen.de>2012-05-23 23:49:39 +0400
commit9cbf10a06e6c3c1dffe43ca6c642bb5f7c5e8224 (patch)
tree71a0daa230beaba77a4960c42eab65034c4cc6fc /winsup/cygwin/thread.cc
parent2b165a453ea7b7ded24c2df03b2673f630f32259 (diff)
* thread.cc (__cygwin_lock_lock): Take null thread at process startup
into account. (__cygwin_lock_trylock): Ditto. (__cygwin_lock_unlock): Ditto.
Diffstat (limited to 'winsup/cygwin/thread.cc')
-rw-r--r--winsup/cygwin/thread.cc32
1 files changed, 21 insertions, 11 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc
index 72806b8de..d52a85121 100644
--- a/winsup/cygwin/thread.cc
+++ b/winsup/cygwin/thread.cc
@@ -144,9 +144,12 @@ __cygwin_lock_lock (_LOCK_T *lock)
{
paranoid_printf ("threadcount %d. locking", MT_INTERFACE->threadcount);
#ifdef WORKAROUND_NEWLIB
- __cygwin_lock_handler *cleanup
- = new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
- pthread::self ()->push_cleanup_handler (cleanup);
+ if (pthread::self () != pthread_null::get_null_pthread ())
+ {
+ __cygwin_lock_handler *cleanup
+ = new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
+ pthread::self ()->push_cleanup_handler (cleanup);
+ }
#endif /* WORKAROUND_NEWLIB */
pthread_mutex_lock ((pthread_mutex_t*) lock);
}
@@ -155,12 +158,18 @@ extern "C" int
__cygwin_lock_trylock (_LOCK_T *lock)
{
#ifdef WORKAROUND_NEWLIB
- __cygwin_lock_handler *cleanup
- = new __cygwin_lock_handler (__cygwin_lock_cleanup, lock);
- pthread::self ()->push_cleanup_handler (cleanup);
+ __cygwin_lock_handler *cleanup = NULL;
+ if (pthread::self () != pthread_null::get_null_pthread ())
+ {
+ 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);
+ 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);
@@ -171,10 +180,11 @@ extern "C" void
__cygwin_lock_unlock (_LOCK_T *lock)
{
#ifdef WORKAROUND_NEWLIB
- pthread::self ()->pop_cleanup_handler (1);
-#else
- pthread_mutex_unlock ((pthread_mutex_t*) lock);
+ if (pthread::self () != pthread_null::get_null_pthread ())
+ pthread::self ()->pop_cleanup_handler (1);
+ else
#endif /* WORKAROUND_NEWLIB */
+ pthread_mutex_unlock ((pthread_mutex_t*) lock);
paranoid_printf ("threadcount %d. unlocked", MT_INTERFACE->threadcount);
}