Blob Blame History Raw
Index: mozilla/xpcom/threads/nsThread.cpp
===================================================================
RCS file: /cvsroot/mozilla/xpcom/threads/nsThread.cpp,v
retrieving revision 1.58.4.2
diff -u -r1.58.4.2 nsThread.cpp
--- mozilla/xpcom/threads/nsThread.cpp	1 Oct 2005 18:43:00 -0000	1.58.4.2
+++ mozilla/xpcom/threads/nsThread.cpp	7 May 2007 19:10:58 -0000
@@ -470,9 +470,17 @@
 nsThread::Shutdown()
 {
     if (gMainThread) {
-        // XXX nspr doesn't seem to be calling the main thread's destructor
-        // callback, so let's help it out:
-        nsThread::Exit(NS_STATIC_CAST(nsThread*, gMainThread));
+        // In most recent versions of NSPR the main thread's destructor
+        // callback will get called.
+        // In older versions of NSPR it will not get called,
+        // (unless we call PR_Cleanup).
+        // Because of that we:
+        // - call the function ourselves
+        // - set the data pointer to NULL to ensure the function will
+        //   not get called again by NSPR
+        // The PR_SetThreadPrivate call does both of these.
+        // See also bugs 379550, 362768.
+        PR_SetThreadPrivate(kIThreadSelfIndex, NULL);
         nsrefcnt cnt;
         NS_RELEASE2(gMainThread, cnt);
         NS_WARN_IF_FALSE(cnt == 0, "Main thread being held past XPCOM shutdown.");