Bug 840673: Shut down the timer before shutting down the thread, so that spinning the event loop while shutting down the thread does not cause us to see the timer firing and reenter. r=bent

This commit is contained in:
Kyle Huey 2013-03-12 13:45:23 -07:00
parent 4a04f7ad3a
commit 6c64536e24

View File

@ -11,6 +11,7 @@
#include "nsComponentManagerUtils.h" #include "nsComponentManagerUtils.h"
#include "nsServiceManagerUtils.h" #include "nsServiceManagerUtils.h"
#include "nsThreadUtils.h" #include "nsThreadUtils.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/Services.h" #include "mozilla/Services.h"
#ifdef DEBUG #ifdef DEBUG
@ -234,6 +235,17 @@ LazyIdleThread::ShutdownThread()
nsresult rv; nsresult rv;
// Do this up front so that when we spin the event loop to shutdown the
// thread the idle timer doesn't cause us to reenter.
if (mIdleTimer) {
DebugOnly<nsresult> rv =
mIdleTimer->Cancel();
// nsTimerImpl::Cancel is infallible.
MOZ_ASSERT(NS_SUCCEEDED(rv));
mIdleTimer = nullptr;
}
if (mThread) { if (mThread) {
if (mShutdownMethod == AutomaticShutdown && NS_IsMainThread()) { if (mShutdownMethod == AutomaticShutdown && NS_IsMainThread()) {
nsCOMPtr<nsIObserverService> obs = nsCOMPtr<nsIObserverService> obs =
@ -260,7 +272,7 @@ LazyIdleThread::ShutdownThread()
nsCOMPtr<nsIRunnable> runnable = nsCOMPtr<nsIRunnable> runnable =
NS_NewRunnableMethod(this, &LazyIdleThread::CleanupThread); NS_NewRunnableMethod(this, &LazyIdleThread::CleanupThread);
NS_ENSURE_TRUE(runnable, NS_ERROR_FAILURE); MOZ_ASSERT(runnable);
PreDispatch(); PreDispatch();
@ -289,13 +301,6 @@ LazyIdleThread::ShutdownThread()
} }
} }
if (mIdleTimer) {
rv = mIdleTimer->Cancel();
NS_ENSURE_SUCCESS(rv, rv);
mIdleTimer = nullptr;
}
// If our temporary queue has any runnables then we need to dispatch them. // If our temporary queue has any runnables then we need to dispatch them.
if (queuedRunnables.Length()) { if (queuedRunnables.Length()) {
// If the thread manager has gone away then these runnables will never run. // If the thread manager has gone away then these runnables will never run.