at_exit.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
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/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  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