From e6b98fc8d6539f40aa34ce4964ae40305a5a52ca Mon Sep 17 00:00:00 2001 From: Robert Collins Date: Sat, 14 Apr 2001 07:06:02 +0000 Subject: Sat Apr 14 17:04:00 2001 Robert Collins * 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. --- winsup/cygwin/ChangeLog | 7 +++++++ winsup/cygwin/thread.cc | 8 ++++++-- winsup/cygwin/thread.h | 3 ++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index c90420b53..19d1e3a17 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +Sat Apr 14 17:04:00 2001 Robert Collins + + * 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. + Fri Apr 13 11:34:24 2001 Robert Collins * fork.cc (fork_child): Call the __pthread_atforkchild function. 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 diff --git a/winsup/cygwin/thread.h b/winsup/cygwin/thread.h index 2b6e7d7e7..6065f9d9c 100644 --- a/winsup/cygwin/thread.h +++ b/winsup/cygwin/thread.h @@ -333,6 +333,7 @@ public: /* we may get 0 for the Tls index.. grrr */ int indexallocated; int concurrency; + long int threadcount; // Used for main thread data, and sigproc thread struct __reent_t reents; @@ -346,7 +347,7 @@ public: void Init (int); - MTinterface ():reent_index (0), indexallocated (0) + MTinterface ():reent_index (0), indexallocated (0), threadcount (1) { pthread_prepare = NULL; pthread_child = NULL; -- cgit v1.2.3