ipc/chromium/src/base/at_exit.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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.
     5 #ifndef BASE_AT_EXIT_H_
     6 #define BASE_AT_EXIT_H_
     8 #include <stack>
    10 #include "base/basictypes.h"
    11 #include "base/lock.h"
    13 namespace base {
    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.
    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);
    37  public:
    38   typedef void (*AtExitCallbackType)(void*);
    40   AtExitManager();
    42   // The dtor calls all the registered callbacks. Do not try to register more
    43   // callbacks after this point.
    44   ~AtExitManager();
    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);
    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();
    54   static bool AlreadyRegistered();
    56  private:
    57   struct CallbackAndParam {
    58     CallbackAndParam(AtExitCallbackType func, void* param)
    59         : func_(func), param_(param) { }
    60     AtExitCallbackType func_;
    61     void* param_;
    62   };
    64   Lock lock_;
    65   std::stack<CallbackAndParam> stack_;
    66   AtExitManager* next_manager_;  // Stack of managers to allow shadowing.
    68   DISALLOW_COPY_AND_ASSIGN(AtExitManager);
    69 };
    71 }  // namespace base
    73 #endif  // BASE_AT_EXIT_H_

mercurial