Index: base/at_exit.cc |
diff --git a/base/at_exit.cc b/base/at_exit.cc |
index cfe4cf9a587cc3da54e0ec3bc693e860beec425c..5dcc83cb2f5c390ab8cdbc19ba601ec3fd01ab0b 100644 |
--- a/base/at_exit.cc |
+++ b/base/at_exit.cc |
@@ -22,6 +22,8 @@ namespace base { |
// this for thread-safe access, since it will only be modified in testing. |
static AtExitManager* g_top_manager = NULL; |
+static bool g_disable_managers = false; |
+ |
AtExitManager::AtExitManager() |
: processing_callbacks_(false), next_manager_(g_top_manager) { |
// If multiple modules instantiate AtExitManagers they'll end up living in this |
@@ -39,7 +41,8 @@ AtExitManager::~AtExitManager() { |
} |
DCHECK_EQ(this, g_top_manager); |
- ProcessCallbacksNow(); |
+ if (!g_disable_managers) |
+ ProcessCallbacksNow(); |
g_top_manager = next_manager_; |
} |
@@ -88,6 +91,11 @@ void AtExitManager::ProcessCallbacksNow() { |
DCHECK(g_top_manager->stack_.empty()); |
} |
+void AtExitManager::DisableAllAtExitManagers() { |
+ AutoLock lock(g_top_manager->lock_); |
+ g_disable_managers = true; |
+} |
+ |
AtExitManager::AtExitManager(bool shadow) |
: processing_callbacks_(false), next_manager_(g_top_manager) { |
DCHECK(shadow || !g_top_manager); |