diff -urp src.old/winsup/cygwin/thread.cc src/winsup/cygwin/thread.cc --- src.old/winsup/cygwin/thread.cc Tue Sep 24 10:55:50 2002 +++ src/winsup/cygwin/thread.cc Tue Sep 24 10:55:21 2002 @@ -189,7 +189,7 @@ MTinterface::Init (int forked) concurrency = 0; threadcount = 1; /*1 current thread when Init occurs.*/ - pthread::initMainThread (&mainthread, myself->hProcess); + mainthread.initMainThread (); if (forked) return; @@ -237,14 +237,6 @@ MTinterface::fixup_after_fork (void) /* pthread calls */ /* static methods */ -void -pthread::initMainThread (pthread *mainThread, HANDLE win32_obj_id) -{ - mainThread->win32_obj_id = win32_obj_id; - mainThread->setThreadIdtoCurrent (); - setTlsSelfPointer (mainThread); -} - pthread * pthread::self () { @@ -257,7 +249,11 @@ pthread::self () delete temp; return pthreadNull::getNullpthread (); } + temp->initThread (); + temp->attr.joinable = PTHREAD_CREATE_DETACHED; + temp->joiner = temp; temp->postcreate (); + return temp; } @@ -1414,12 +1410,13 @@ pthread::thread_init_wrapper (void *_arg if (!TlsSetValue (MT_INTERFACE->reent_index, &local_reent)) system_printf ("local storage for thread couldn't be set"); + thread->setThreadIdtoCurrent (); setTlsSelfPointer (thread); thread->mutex.Lock (); // if thread is detached force cleanup on exit if (thread->attr.joinable == PTHREAD_CREATE_DETACHED && thread->joiner == NULL) - thread->joiner = pthread::self (); + thread->joiner = thread; thread->mutex.UnLock (); #ifdef _CYG_THREAD_FAILSAFE @@ -1455,6 +1452,32 @@ unsigned long pthread::getsequence_np () { return getThreadId (); +} + +void +pthread::initMainThread () +{ + precreate (NULL); + initThread (); +} + +void +pthread::initThread () +{ + if (!DuplicateHandle (GetCurrentProcess (), GetCurrentThread (), + GetCurrentProcess (), &win32_obj_id, + 0, FALSE, DUPLICATE_SAME_ACCESS)) + + { + system_printf ("Failed to duplicate handle for thread"); + win32_obj_id = NULL; + } + + attr.joinable = PTHREAD_CREATE_JOINABLE; + joiner = NULL; + + setThreadIdtoCurrent (); + setTlsSelfPointer (this); } int diff -urp src.old/winsup/cygwin/thread.h src/winsup/cygwin/thread.h --- src.old/winsup/cygwin/thread.h Tue Sep 24 10:55:50 2002 +++ src/winsup/cygwin/thread.h Tue Sep 24 10:55:21 2002 @@ -338,7 +338,6 @@ public: pthread (); virtual ~pthread (); - static void initMainThread(pthread *, HANDLE); static bool isGoodObject(pthread_t const *); static void atforkprepare(); static void atforkparent(); @@ -372,6 +371,9 @@ public: static void *thread_init_wrapper (void *); virtual unsigned long getsequence_np(); + + void initMainThread (); + void initThread (); private: DWORD thread_id;