summaryrefslogtreecommitdiff
path: root/base/at_exit.cc
diff options
context:
space:
mode:
Diffstat (limited to 'base/at_exit.cc')
-rw-r--r--base/at_exit.cc10
1 files changed, 9 insertions, 1 deletions
diff --git a/base/at_exit.cc b/base/at_exit.cc
index cfe4cf9a58..5dcc83cb2f 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);