1*6777b538SAndroid Build Coastguard Worker // Copyright 2011 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_AT_EXIT_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_AT_EXIT_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 9*6777b538SAndroid Build Coastguard Worker #include "base/containers/stack.h" 10*6777b538SAndroid Build Coastguard Worker #include "base/dcheck_is_on.h" 11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h" 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "base/synchronization/lock.h" 14*6777b538SAndroid Build Coastguard Worker #include "base/thread_annotations.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace base { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker // This class provides a facility similar to the CRT atexit(), except that 19*6777b538SAndroid Build Coastguard Worker // we control when the callbacks are executed. Under Windows for a DLL they 20*6777b538SAndroid Build Coastguard Worker // happen at a really bad time and under the loader lock. This facility is 21*6777b538SAndroid Build Coastguard Worker // mostly used by base::Singleton. 22*6777b538SAndroid Build Coastguard Worker // 23*6777b538SAndroid Build Coastguard Worker // The usage is simple. Early in the main() or WinMain() scope create an 24*6777b538SAndroid Build Coastguard Worker // AtExitManager object on the stack: 25*6777b538SAndroid Build Coastguard Worker // int main(...) { 26*6777b538SAndroid Build Coastguard Worker // base::AtExitManager exit_manager; 27*6777b538SAndroid Build Coastguard Worker // 28*6777b538SAndroid Build Coastguard Worker // } 29*6777b538SAndroid Build Coastguard Worker // When the exit_manager object goes out of scope, all the registered 30*6777b538SAndroid Build Coastguard Worker // callbacks and singleton destructors will be called. 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT AtExitManager { 33*6777b538SAndroid Build Coastguard Worker public: 34*6777b538SAndroid Build Coastguard Worker typedef void (*AtExitCallbackType)(void*); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker AtExitManager(); 37*6777b538SAndroid Build Coastguard Worker AtExitManager(const AtExitManager&) = delete; 38*6777b538SAndroid Build Coastguard Worker AtExitManager& operator=(const AtExitManager&) = delete; 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // The dtor calls all the registered callbacks. Do not try to register more 41*6777b538SAndroid Build Coastguard Worker // callbacks after this point. 42*6777b538SAndroid Build Coastguard Worker ~AtExitManager(); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // Registers the specified function to be called at exit. The prototype of 45*6777b538SAndroid Build Coastguard Worker // the callback function is void func(void*). 46*6777b538SAndroid Build Coastguard Worker static void RegisterCallback(AtExitCallbackType func, void* param); 47*6777b538SAndroid Build Coastguard Worker 48*6777b538SAndroid Build Coastguard Worker // Registers the specified task to be called at exit. 49*6777b538SAndroid Build Coastguard Worker static void RegisterTask(base::OnceClosure task); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker // Calls the functions registered with RegisterCallback in LIFO order. It 52*6777b538SAndroid Build Coastguard Worker // is possible to register new callbacks after calling this function. 53*6777b538SAndroid Build Coastguard Worker static void ProcessCallbacksNow(); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Disable all registered at-exit callbacks. This is used only in a single- 56*6777b538SAndroid Build Coastguard Worker // process mode. 57*6777b538SAndroid Build Coastguard Worker static void DisableAllAtExitManagers(); 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker protected: 60*6777b538SAndroid Build Coastguard Worker // This constructor will allow this instance of AtExitManager to be created 61*6777b538SAndroid Build Coastguard Worker // even if one already exists. This should only be used for testing! 62*6777b538SAndroid Build Coastguard Worker // AtExitManagers are kept on a global stack, and it will be removed during 63*6777b538SAndroid Build Coastguard Worker // destruction. This allows you to shadow another AtExitManager. 64*6777b538SAndroid Build Coastguard Worker explicit AtExitManager(bool shadow); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker private: 67*6777b538SAndroid Build Coastguard Worker base::Lock lock_; 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker base::stack<base::OnceClosure> stack_ GUARDED_BY(lock_); 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON() 72*6777b538SAndroid Build Coastguard Worker bool processing_callbacks_ GUARDED_BY(lock_) = false; 73*6777b538SAndroid Build Coastguard Worker #endif 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Worker // Stack of managers to allow shadowing. 76*6777b538SAndroid Build Coastguard Worker const raw_ptr<AtExitManager, DanglingUntriaged> next_manager_; 77*6777b538SAndroid Build Coastguard Worker }; 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker #if defined(UNIT_TEST) 80*6777b538SAndroid Build Coastguard Worker class ShadowingAtExitManager : public AtExitManager { 81*6777b538SAndroid Build Coastguard Worker public: ShadowingAtExitManager()82*6777b538SAndroid Build Coastguard Worker ShadowingAtExitManager() : AtExitManager(true) {} 83*6777b538SAndroid Build Coastguard Worker }; 84*6777b538SAndroid Build Coastguard Worker #endif // defined(UNIT_TEST) 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker } // namespace base 87*6777b538SAndroid Build Coastguard Worker 88*6777b538SAndroid Build Coastguard Worker #endif // BASE_AT_EXIT_H_ 89