blob: 9a6daa962f5f8cb244ecdd516fea9411ede183c1 [file] [log] [blame]
license.botf003cfe2008-08-24 09:55:55 +09001// 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
13namespace 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
29class 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)();
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);
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 private:
55 Lock lock_;
56 std::stack<AtExitCallbackType> stack_;
57 AtExitManager* next_manager_; // Stack of managers to allow shadowing.
58
59 DISALLOW_COPY_AND_ASSIGN(AtExitManager);
60};
61
62} // namespace base
63
64#endif // BASE_AT_EXIT_H_
65