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.
This commit is contained in:
Robert Collins 2001-04-14 07:06:02 +00:00
parent a25b8414ac
commit e6b98fc8d6
3 changed files with 15 additions and 3 deletions

View File

@ -1,3 +1,10 @@
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.
Fri Apr 13 11:34:24 2001 Robert Collins <rbtcollins@hotmail.com> Fri Apr 13 11:34:24 2001 Robert Collins <rbtcollins@hotmail.com>
* fork.cc (fork_child): Call the __pthread_atforkchild function. * fork.cc (fork_child): Call the __pthread_atforkchild function.

View File

@ -291,6 +291,7 @@ MTinterface::Init (int forked)
} }
concurrency = 0; concurrency = 0;
threadcount = 1; /* 1 current thread when Init occurs.*/
if (forked) if (forked)
return; return;
@ -664,6 +665,7 @@ __pthread_create (pthread_t * thread, const pthread_attr_t * attr,
*thread = NULL; *thread = NULL;
return EAGAIN; return EAGAIN;
} }
InterlockedIncrement(&MT_INTERFACE->threadcount);
return 0; return 0;
} }
@ -1214,10 +1216,12 @@ __pthread_exit (void *value_ptr)
class pthread *thread = __pthread_self (); class pthread *thread = __pthread_self ();
MT_INTERFACE->destructors.IterateNull (); MT_INTERFACE->destructors.IterateNull ();
// FIXME: run the destructors of thread_key items here
thread->return_ptr = value_ptr; thread->return_ptr = value_ptr;
ExitThread (0); if (InterlockedDecrement(&MT_INTERFACE->threadcount) == 0)
exit (0);
else
ExitThread (0);
} }
int int

View File

@ -333,6 +333,7 @@ public:
/* we may get 0 for the Tls index.. grrr */ /* we may get 0 for the Tls index.. grrr */
int indexallocated; int indexallocated;
int concurrency; int concurrency;
long int threadcount;
// Used for main thread data, and sigproc thread // Used for main thread data, and sigproc thread
struct __reent_t reents; struct __reent_t reents;
@ -346,7 +347,7 @@ public:
void Init (int); void Init (int);
MTinterface ():reent_index (0), indexallocated (0) MTinterface ():reent_index (0), indexallocated (0), threadcount (1)
{ {
pthread_prepare = NULL; pthread_prepare = NULL;
pthread_child = NULL; pthread_child = NULL;