diff --git a/image/src/DiscardTracker.cpp b/image/src/DiscardTracker.cpp index f180a32b43a4..621b627ff542 100644 --- a/image/src/DiscardTracker.cpp +++ b/image/src/DiscardTracker.cpp @@ -24,6 +24,7 @@ static const char* sDiscardTimeoutPref = "image.mem.min_discard_timeout_ms"; /* static */ uint32_t DiscardTracker::sMaxDecodedImageKB = 42 * 1024; /* static */ PRLock * DiscardTracker::sAllocationLock = nullptr; /* static */ mozilla::Mutex* DiscardTracker::sNodeListMutex = nullptr; +/* static */ Atomic DiscardTracker::sShutdown(0); /* * When we notice we're using too much memory for decoded images, we enqueue a @@ -82,6 +83,10 @@ DiscardTracker::Reset(Node *node) void DiscardTracker::Remove(Node *node) { + if (sShutdown) { + // Already shutdown. List should be empty, so just return. + return; + } MutexAutoLock lock(*sNodeListMutex); if (node->isInList()) @@ -97,6 +102,8 @@ DiscardTracker::Remove(Node *node) void DiscardTracker::Shutdown() { + sShutdown = true; + if (sTimer) { sTimer->Cancel(); sTimer = nullptr; diff --git a/image/src/DiscardTracker.h b/image/src/DiscardTracker.h index 4eb7704fd708..f80151d94dca 100644 --- a/image/src/DiscardTracker.h +++ b/image/src/DiscardTracker.h @@ -122,6 +122,7 @@ class DiscardTracker // Lock for safegarding the 64-bit sCurrentDecodedImageBytes static PRLock *sAllocationLock; static mozilla::Mutex* sNodeListMutex; + static Atomic sShutdown; }; } // namespace image