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