LCOV - code coverage report
Current view: directory - ipc/chromium/src/base - at_exit.h (source / functions) Found Hit Coverage
Test: app.info Lines: 3 3 100.0 %
Date: 2012-06-02 Functions: 2 2 100.0 %

       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_

Generated by: LCOV version 1.7