LCOV - app.info - ipc/chromium/src/base/at_exit.cc

LCOV - code coverage report
| Current view: | directory - ipc/chromium/src/base - at_exit.cc (source / functions) |  | Found | Hit | Coverage |
| Test: | app.info | Lines: | 33 | 24 | 72.7 %
| Date: | 2012-06-02 | Functions: | 6 | 5 | 83.3 %

           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                 : #include "base/at_exit.h"
           6                 : #include "base/logging.h"
           7                 :
           8                 : namespace base {
           9                 :
          10                 : // Keep a stack of registered AtExitManagers.  We always operate on the most
          11                 : // recent, and we should never have more than one outside of testing, when we
          12                 : // use the shadow version of the constructor.  We don't protect this for
          13                 : // thread-safe access, since it will only be modified in testing.
          14                 : static AtExitManager* g_top_manager = NULL;
          15                 :
          16            1420 : AtExitManager::AtExitManager() : next_manager_(NULL) {
          17            1420 :   DCHECK(!g_top_manager);
          18            1420 :   g_top_manager = this;
          19            1420 : }
          20                 :
          21               0 : AtExitManager::AtExitManager(bool shadow) : next_manager_(g_top_manager) {
          22               0 :   DCHECK(shadow || !g_top_manager);
          23               0 :   g_top_manager = this;
          24               0 : }
          25                 :
          26            4257 : AtExitManager::~AtExitManager() {
          27            1419 :   if (!g_top_manager) {
          28               0 :     NOTREACHED() << "Tried to ~AtExitManager without an AtExitManager";
          29                 :     return;
          30                 :   }
          31            1419 :   DCHECK(g_top_manager == this);
          32                 :
          33            1419 :   ProcessCallbacksNow();
          34            2838 :   g_top_manager = next_manager_;
          35            1419 : }
          36                 :
          37                 : // static
          38            4262 : void AtExitManager::RegisterCallback(AtExitCallbackType func, void* param) {
          39            4262 :   if (!g_top_manager) {
          40               0 :     NOTREACHED() << "Tried to RegisterCallback without an AtExitManager";
          41               0 :     return;
          42                 :   }
          43                 :
          44            4262 :   DCHECK(func);
          45                 :
          46            8524 :   AutoLock lock(g_top_manager->lock_);
          47            4262 :   g_top_manager->stack_.push(CallbackAndParam(func, param));
          48                 : }
          49                 :
          50                 : // static
          51            1419 : void AtExitManager::ProcessCallbacksNow() {
          52            1419 :   if (!g_top_manager) {
          53               0 :     NOTREACHED() << "Tried to ProcessCallbacksNow without an AtExitManager";
          54               0 :     return;
          55                 :   }
          56                 :
          57            2838 :   AutoLock lock(g_top_manager->lock_);
          58                 :
          59            7095 :   while (!g_top_manager->stack_.empty()) {
          60            4257 :     CallbackAndParam callback_and_param = g_top_manager->stack_.top();
          61            4257 :     g_top_manager->stack_.pop();
          62                 :
          63            4257 :     callback_and_param.func_(callback_and_param.param_);
          64                 :   }
          65                 : }
          66                 :
          67                 : // static
          68            1419 : bool AtExitManager::AlreadyRegistered() {
          69            1419 :   return !!g_top_manager;
          70                 : }
          71                 :
          72                 : }  // namespace base

Generated by: LCOV version 1.7