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_
