|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef BASE_AT_EXIT_H_ | 
|  | #define BASE_AT_EXIT_H_ | 
|  |  | 
|  | #include "base/base_export.h" | 
|  | #include "base/callback.h" | 
|  | #include "base/containers/stack.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/synchronization/lock.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | // This class provides a facility similar to the CRT atexit(), except that | 
|  | // we control when the callbacks are executed. Under Windows for a DLL they | 
|  | // happen at a really bad time and under the loader lock. This facility is | 
|  | // mostly used by base::Singleton. | 
|  | // | 
|  | // The usage is simple. Early in the main() or WinMain() scope create an | 
|  | // AtExitManager object on the stack: | 
|  | // int main(...) { | 
|  | //    base::AtExitManager exit_manager; | 
|  | // | 
|  | // } | 
|  | // When the exit_manager object goes out of scope, all the registered | 
|  | // callbacks and singleton destructors will be called. | 
|  |  | 
|  | class BASE_EXPORT AtExitManager { | 
|  | public: | 
|  | typedef void (*AtExitCallbackType)(void*); | 
|  |  | 
|  | AtExitManager(); | 
|  |  | 
|  | // The dtor calls all the registered callbacks. Do not try to register more | 
|  | // callbacks after this point. | 
|  | ~AtExitManager(); | 
|  |  | 
|  | // Registers the specified function to be called at exit. The prototype of | 
|  | // the callback function is void func(void*). | 
|  | static void RegisterCallback(AtExitCallbackType func, void* param); | 
|  |  | 
|  | // Registers the specified task to be called at exit. | 
|  | static void RegisterTask(base::Closure task); | 
|  |  | 
|  | // Calls the functions registered with RegisterCallback in LIFO order. It | 
|  | // is possible to register new callbacks after calling this function. | 
|  | static void ProcessCallbacksNow(); | 
|  |  | 
|  | // Disable all registered at-exit callbacks. This is used only in a single- | 
|  | // process mode. | 
|  | static void DisableAllAtExitManagers(); | 
|  |  | 
|  | protected: | 
|  | // This constructor will allow this instance of AtExitManager to be created | 
|  | // even if one already exists.  This should only be used for testing! | 
|  | // AtExitManagers are kept on a global stack, and it will be removed during | 
|  | // destruction.  This allows you to shadow another AtExitManager. | 
|  | explicit AtExitManager(bool shadow); | 
|  |  | 
|  | private: | 
|  | base::Lock lock_; | 
|  | base::stack<base::Closure> stack_; | 
|  | bool processing_callbacks_; | 
|  | AtExitManager* next_manager_;  // Stack of managers to allow shadowing. | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(AtExitManager); | 
|  | }; | 
|  |  | 
|  | #if defined(UNIT_TEST) | 
|  | class ShadowingAtExitManager : public AtExitManager { | 
|  | public: | 
|  | ShadowingAtExitManager() : AtExitManager(true) {} | 
|  | }; | 
|  | #endif  // defined(UNIT_TEST) | 
|  |  | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_AT_EXIT_H_ |