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