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:
authorRobert Collins <rbtcollins@hotmail.com>2001-04-14 11:06:02 +0400
committerRobert Collins <rbtcollins@hotmail.com>2001-04-14 11:06:02 +0400
commite6b98fc8d6539f40aa34ce4964ae40305a5a52ca (patch)
tree6e50f9626b1caf2ff2c9110b68f0566a9da58b35 /winsup/cygwin/thread.cc
parenta25b8414aca039dd067de92a30eec17995deaff9 (diff)
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.cc8
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