LCOV - code coverage report
Current view: directory - ipc/chromium/src/base - thread_collision_warner.cc (source / functions) Found Hit Coverage
Test: app.info Lines: 25 0 0.0 %
Date: 2012-06-02 Functions: 5 0 0.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                 : #include "base/thread_collision_warner.h"
       6                 : 
       7                 : #include "base/logging.h"
       8                 : #include "base/platform_thread.h"
       9                 : 
      10                 : namespace base {
      11                 : 
      12               0 : void DCheckAsserter::warn() {
      13               0 :   NOTREACHED() << "Thread Collision";
      14               0 : }
      15                 : 
      16               0 : static subtle::Atomic32 CurrentThread() {
      17               0 :   const PlatformThreadId current_thread_id = PlatformThread::CurrentId();
      18                 :   // We need to get the thread id into an atomic data type. This might be a
      19                 :   // truncating conversion, but any loss-of-information just increases the
      20                 :   // chance of a fault negative, not a false positive.
      21                 :   const subtle::Atomic32 atomic_thread_id =
      22               0 :       static_cast<subtle::Atomic32>(current_thread_id);
      23                 : 
      24               0 :   return atomic_thread_id;
      25                 : }
      26                 : 
      27               0 : void ThreadCollisionWarner::EnterSelf() {
      28                 :   // If the active thread is 0 then I'll write the current thread ID
      29                 :   // if two or more threads arrive here only one will succeed to
      30                 :   // write on valid_thread_id_ the current thread ID.
      31               0 :   subtle::Atomic32 current_thread_id = CurrentThread();
      32                 : 
      33                 :   int previous_value = subtle::NoBarrier_CompareAndSwap(&valid_thread_id_,
      34                 :                                                         0,
      35               0 :                                                         current_thread_id);
      36               0 :   if (previous_value != 0 && previous_value != current_thread_id) {
      37                 :     // gotcha! a thread is trying to use the same class and that is
      38                 :     // not current thread.
      39               0 :     asserter_->warn();
      40                 :   }
      41                 : 
      42               0 :   subtle::NoBarrier_AtomicIncrement(&counter_, 1);
      43               0 : }
      44                 : 
      45               0 : void ThreadCollisionWarner::Enter() {
      46               0 :   subtle::Atomic32 current_thread_id = CurrentThread();
      47                 : 
      48               0 :   if (subtle::NoBarrier_CompareAndSwap(&valid_thread_id_,
      49                 :                                        0,
      50               0 :                                        current_thread_id) != 0) {
      51                 :     // gotcha! another thread is trying to use the same class.
      52               0 :     asserter_->warn();
      53                 :   }
      54                 : 
      55               0 :   subtle::NoBarrier_AtomicIncrement(&counter_, 1);
      56               0 : }
      57                 : 
      58               0 : void ThreadCollisionWarner::Leave() {
      59               0 :   if (subtle::Barrier_AtomicIncrement(&counter_, -1) == 0) {
      60               0 :     subtle::NoBarrier_Store(&valid_thread_id_, 0);
      61                 :   }
      62               0 : }
      63                 : 
      64                 : }  // namespace base

Generated by: LCOV version 1.7