diff --git a/netwerk/cache2/CacheIOThread.cpp b/netwerk/cache2/CacheIOThread.cpp index 856ce2dd1b9..4edee9caf3d 100644 --- a/netwerk/cache2/CacheIOThread.cpp +++ b/netwerk/cache2/CacheIOThread.cpp @@ -21,6 +21,7 @@ NS_IMPL_ISUPPORTS(CacheIOThread, nsIThreadObserver) CacheIOThread::CacheIOThread() : mMonitor("CacheIOThread") , mThread(nullptr) +, mXPCOMThread(nullptr) , mLowestLevelWaiting(LAST_LEVEL) , mCurrentlyExecutingLevel(0) , mHasXPCOMEvents(false) @@ -33,6 +34,11 @@ CacheIOThread::CacheIOThread() CacheIOThread::~CacheIOThread() { + if (mXPCOMThread) { + nsIThread *thread = mXPCOMThread; + thread->Release(); + } + sSelf = nullptr; #ifdef DEBUG for (uint32_t level = 0; level < LAST_LEVEL; ++level) { @@ -182,7 +188,7 @@ void CacheIOThread::ThreadFunc() if (threadInternal) threadInternal->SetObserver(this); - mXPCOMThread.swap(xpcomThread); + mXPCOMThread = xpcomThread.forget().take(); lock.NotifyAll(); @@ -203,7 +209,8 @@ loopStart: bool processedEvent; nsresult rv; do { - rv = mXPCOMThread->ProcessNextEvent(false, &processedEvent); + nsIThread *thread = mXPCOMThread; + rv = thread->ProcessNextEvent(false, &processedEvent); } while (NS_SUCCEEDED(rv) && processedEvent); } diff --git a/netwerk/cache2/CacheIOThread.h b/netwerk/cache2/CacheIOThread.h index 077d4d98db0..d685fa32565 100644 --- a/netwerk/cache2/CacheIOThread.h +++ b/netwerk/cache2/CacheIOThread.h @@ -88,7 +88,7 @@ private: mozilla::Monitor mMonitor; PRThread* mThread; - nsCOMPtr mXPCOMThread; + Atomic mXPCOMThread; Atomic mLowestLevelWaiting; uint32_t mCurrentlyExecutingLevel; nsTArray > mEventQueue[LAST_LEVEL];