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.");