diff options
Diffstat (limited to 'base/at_exit.cc')
-rw-r--r-- | base/at_exit.cc | 10 |
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); |