diff options
author | Robert Collins <rbtcollins@hotmail.com> | 2001-04-14 07:06:02 +0000 |
---|---|---|
committer | Robert Collins <rbtcollins@hotmail.com> | 2001-04-14 07:06:02 +0000 |
commit | e6b98fc8d6539f40aa34ce4964ae40305a5a52ca (patch) | |
tree | 6e50f9626b1caf2ff2c9110b68f0566a9da58b35 /winsup/cygwin/thread.cc | |
parent | a25b8414aca039dd067de92a30eec17995deaff9 (diff) | |
download | cygnal-e6b98fc8d6539f40aa34ce4964ae40305a5a52ca.tar.gz cygnal-e6b98fc8d6539f40aa34ce4964ae40305a5a52ca.tar.bz2 cygnal-e6b98fc8d6539f40aa34ce4964ae40305a5a52ca.zip |
Sat Apr 14 17:04:00 2001 Robert Collins <rbtcollins@hotmail.com>
* thread.h (MTinterface): Add threadcount.
* thread.cc (MTinterface::Init): Set threadcount to 1.
(__pthread_create): Increment threadcount.
(__pthread_exit): Decrement threadcount and call exit() from the last thread.
Diffstat (limited to 'winsup/cygwin/thread.cc')
-rw-r--r-- | winsup/cygwin/thread.cc | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/winsup/cygwin/thread.cc b/winsup/cygwin/thread.cc index 1bcfd4e4d..e179a1bb2 100644 --- a/winsup/cygwin/thread.cc +++ b/winsup/cygwin/thread.cc @@ -291,6 +291,7 @@ MTinterface::Init (int forked) } concurrency = 0; + threadcount = 1; /* 1 current thread when Init occurs.*/ if (forked) return; @@ -664,6 +665,7 @@ __pthread_create (pthread_t * thread, const pthread_attr_t * attr, *thread = NULL; return EAGAIN; } + InterlockedIncrement(&MT_INTERFACE->threadcount); return 0; } @@ -1214,10 +1216,12 @@ __pthread_exit (void *value_ptr) class pthread *thread = __pthread_self (); MT_INTERFACE->destructors.IterateNull (); -// FIXME: run the destructors of thread_key items here thread->return_ptr = value_ptr; - ExitThread (0); + if (InterlockedDecrement(&MT_INTERFACE->threadcount) == 0) + exit (0); + else + ExitThread (0); } int |