diff -urp src.old/winsup/cygwin/init.cc src/winsup/cygwin/init.cc --- src.old/winsup/cygwin/init.cc Mon May 27 12:43:26 2002 +++ src/winsup/cygwin/init.cc Mon May 27 12:32:19 2002 @@ -33,6 +33,7 @@ WINAPI dll_entry (HANDLE h, DWORD reason } break; case DLL_PROCESS_DETACH: + MT_INTERFACE->destructors.IterateNull (); break; case DLL_THREAD_DETACH: #if 0 // FIXME: REINSTATE SOON @@ -48,6 +49,7 @@ WINAPI dll_entry (HANDLE h, DWORD reason } // FIXME: Need to add other per_thread stuff here #endif + MT_INTERFACE->destructors.IterateNull (); break; } return 1; diff -urp src.old/winsup/cygwin/thread.cc src/winsup/cygwin/thread.cc --- src.old/winsup/cygwin/thread.cc Mon May 27 12:43:26 2002 +++ src/winsup/cygwin/thread.cc Mon May 27 12:43:57 2002 @@ -148,14 +148,17 @@ pthread_key_destructor_list::IterateNull pthread_key_destructor *temp = head; while (temp) { - temp->destructor ((temp->key)->get ()); + void *value = (temp->key)->get (); + if (value) + { + temp->destructor (value); + (temp->key)->set (NULL); + } temp = temp->Next (); } } -#define MT_INTERFACE user_data->threadinterface - struct _reent * _reent_clib () { @@ -669,8 +672,14 @@ pthread_key::set (const void *value) void * pthread_key::get () { + void *result; + int last_error = GetLastError (); + set_errno (0); - return TlsGetValue (dwTlsIndex); + result = TlsGetValue (dwTlsIndex); + SetLastError (last_error); + + return result; } /*pshared mutexs: @@ -1626,8 +1635,6 @@ __pthread_exit (void *value_ptr) // run cleanup handlers __pthread_cleanup_pop_all (); - - MT_INTERFACE->destructors.IterateNull (); __pthread_mutex_lock(&thread->mutex); diff -urp src.old/winsup/cygwin/thread.h src/winsup/cygwin/thread.h --- src.old/winsup/cygwin/thread.h Mon May 27 12:43:26 2002 +++ src/winsup/cygwin/thread.h Mon May 27 12:47:47 2002 @@ -522,6 +522,8 @@ int __sem_trywait (sem_t * sem); int __sem_post (sem_t * sem); }; +#define MT_INTERFACE user_data->threadinterface + #endif // MT_SAFE #endif // _CYGNUS_THREADS_