This is patch 3 of 3.

It will change thread cleanup to use a destructor function.

2002-09-24  Thomas Pfaff  <[EMAIL PROTECTED]>

        * init.cc (dll_entry): Run pthread key destructors on thread
        detach.
        * thread.cc (pthread::destructor): Implement.
        (pthread::exit): Remove runAllDestructors. Remove thread cleanup.
        * thread.h (pthread::destructor); New static member.
        (MTinterface::MTinterface): Set pthread self destructor function.

diff -urp src.old/winsup/cygwin/init.cc src/winsup/cygwin/init.cc
--- src.old/winsup/cygwin/init.cc       Tue Sep 24 11:25:15 2002
+++ src/winsup/cygwin/init.cc   Tue Sep 24 11:19:33 2002
@@ -29,17 +29,8 @@ WINAPI dll_entry (HANDLE h, DWORD reason
         api_fatal("Sig proc MT init failed\n");
       break;
     case DLL_PROCESS_DETACH:
-      break;
     case DLL_THREAD_DETACH:
-#if 0
-      pthread *thisthread = (pthread *)
-       TlsGetValue (user_data->threadinterface->thread_self_dwTlsIndex);
-      if (thisthread) {
-         /* Some non-pthread call created this thread,
-          * but we need to clean it up */
-         thisthread->exit (0);
-      }
-#endif
+      pthread_key::runAllDestructors ();
       break;
     }
   return 1;
diff -urp src.old/winsup/cygwin/thread.cc src/winsup/cygwin/thread.cc
--- src.old/winsup/cygwin/thread.cc     Tue Sep 24 11:25:15 2002
+++ src/winsup/cygwin/thread.cc Tue Sep 24 11:24:45 2002
@@ -244,6 +244,15 @@ pthread::self (const bool auto_init)
 }
 
 void
+pthread::destructor (void *value)
+{
+  pthread *thread = (pthread *) value;
+  /* cleanup thread if thread is detached and not joined */
+  if (thread && __pthread_equal(&thread->joiner, &thread))
+    delete thread;
+}
+
+void
 pthread::setTlsSelfPointer (pthread *thisThread)
 {
   MT_INTERFACE->thread_self_key.set (thisThread);
@@ -352,20 +361,13 @@ pthread::exit (void *value_ptr)
   // run cleanup handlers
   pop_all_cleanup_handlers ();
 
-  pthread_key::runAllDestructors ();
-
   mutex.Lock ();
-  // cleanup if thread is in detached state and not joined
-  if (__pthread_equal (&joiner, &thread ) )
-    delete this;
-  else
+  if (!__pthread_equal(&joiner, &thread))
     {
       return_ptr = value_ptr;
       mutex.UnLock ();
     }
-
-  /* Prevent DLL_THREAD_DETACH Attempting to clean us up */
-  setTlsSelfPointer (0);
+  // else: cleanup is now done in key destructor function
 
   if (InterlockedDecrement (&MT_INTERFACE->threadcount) == 0)
     ::exit (0);
diff -urp src.old/winsup/cygwin/thread.h src/winsup/cygwin/thread.h
--- src.old/winsup/cygwin/thread.h      Tue Sep 24 11:25:15 2002
+++ src/winsup/cygwin/thread.h  Tue Sep 24 11:24:49 2002
@@ -368,6 +368,8 @@ public:
    virtual void pop_cleanup_handler (int const execute);
 
    static pthread* self (const bool auto_init = true);
+   static void destructor (void *value);
+
    static void *thread_init_wrapper (void *);
 
    virtual unsigned long getsequence_np();
@@ -519,7 +521,7 @@ public:
     concurrency (0), threadcount (1),
     pthread_prepare (NULL), pthread_child (NULL), pthread_parent (NULL),
     mutexs (NULL), conds (NULL), semaphores (NULL),
-    mainthread (), reent_key (NULL), thread_self_key (NULL)
+    mainthread (), reent_key (NULL), thread_self_key (pthread::destructor)
     {
     }
 };

Reply via email to