LCOV - code coverage report
Current view: directory - ipc/chromium/src/base - condition_variable_posix.cc (source / functions) Found Hit Coverage
Test: app.info Lines: 32 17 53.1 %
Date: 2012-06-02 Functions: 6 4 66.7 %

       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/condition_variable.h"
       6                 : 
       7                 : #include <errno.h>
       8                 : #include <sys/time.h>
       9                 : 
      10                 : #include "base/lock.h"
      11                 : #include "base/lock_impl.h"
      12                 : #include "base/logging.h"
      13                 : #include "base/time.h"
      14                 : 
      15                 : using base::Time;
      16                 : using base::TimeDelta;
      17                 : 
      18            1418 : ConditionVariable::ConditionVariable(Lock* user_lock)
      19            1418 :     : user_mutex_(user_lock->lock_impl()->os_lock()) {
      20            1418 :   int rv = pthread_cond_init(&condition_, NULL);
      21            1418 :   DCHECK(rv == 0);
      22            1418 : }
      23                 : 
      24            1418 : ConditionVariable::~ConditionVariable() {
      25            1418 :   int rv = pthread_cond_destroy(&condition_);
      26            1418 :   DCHECK(rv == 0);
      27            1418 : }
      28                 : 
      29            1418 : void ConditionVariable::Wait() {
      30            1418 :   int rv = pthread_cond_wait(&condition_, user_mutex_);
      31            1418 :   DCHECK(rv == 0);
      32            1418 : }
      33                 : 
      34               0 : void ConditionVariable::TimedWait(const TimeDelta& max_time) {
      35               0 :   int64 usecs = max_time.InMicroseconds();
      36                 : 
      37                 :   // The timeout argument to pthread_cond_timedwait is in absolute time.
      38                 :   struct timeval now;
      39               0 :   gettimeofday(&now, NULL);
      40                 : 
      41                 :   struct timespec abstime;
      42               0 :   abstime.tv_sec = now.tv_sec + (usecs / Time::kMicrosecondsPerSecond);
      43                 :   abstime.tv_nsec = (now.tv_usec + (usecs % Time::kMicrosecondsPerSecond)) *
      44               0 :                     Time::kNanosecondsPerMicrosecond;
      45               0 :   abstime.tv_sec += abstime.tv_nsec / Time::kNanosecondsPerSecond;
      46               0 :   abstime.tv_nsec %= Time::kNanosecondsPerSecond;
      47               0 :   DCHECK(abstime.tv_sec >= now.tv_sec);  // Overflow paranoia
      48                 : 
      49               0 :   int rv = pthread_cond_timedwait(&condition_, user_mutex_, &abstime);
      50               0 :   DCHECK(rv == 0 || rv == ETIMEDOUT);
      51               0 : }
      52                 : 
      53            1418 : void ConditionVariable::Broadcast() {
      54            1418 :   int rv = pthread_cond_broadcast(&condition_);
      55            1418 :   DCHECK(rv == 0);
      56            1418 : }
      57                 : 
      58               0 : void ConditionVariable::Signal() {
      59               0 :   int rv = pthread_cond_signal(&condition_);
      60               0 :   DCHECK(rv == 0);
      61               0 : }

Generated by: LCOV version 1.7