Home | History | Annotate | Download | only in lib
      1 // Copyright 2014 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 "mojo/public/cpp/utility/mutex.h"
      6 
      7 #include <assert.h>
      8 #include <errno.h>
      9 
     10 namespace mojo {
     11 
     12 // Release builds have inlined (non-error-checking) definitions in the header.
     13 #if !defined(NDEBUG)
     14 Mutex::Mutex() {
     15   pthread_mutexattr_t mutexattr;
     16   int rv = pthread_mutexattr_init(&mutexattr);
     17   assert(rv == 0);
     18   rv = pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
     19   assert(rv == 0);
     20   rv = pthread_mutex_init(&mutex_, &mutexattr);
     21   assert(rv == 0);
     22   rv = pthread_mutexattr_destroy(&mutexattr);
     23   assert(rv == 0);
     24 }
     25 
     26 Mutex::~Mutex() {
     27   int rv = pthread_mutex_destroy(&mutex_);
     28   assert(rv == 0);
     29 }
     30 
     31 void Mutex::Lock() {
     32   int rv = pthread_mutex_lock(&mutex_);
     33   assert(rv == 0);
     34 }
     35 
     36 void Mutex::Unlock() {
     37   int rv = pthread_mutex_unlock(&mutex_);
     38   assert(rv == 0);
     39 }
     40 
     41 bool Mutex::TryLock() {
     42   int rv = pthread_mutex_trylock(&mutex_);
     43   assert(rv == 0 || rv == EBUSY);
     44   return rv == 0;
     45 }
     46 
     47 void Mutex::AssertHeld() {
     48   assert(pthread_mutex_lock(&mutex_) == EDEADLK);
     49 }
     50 #endif  // !defined(NDEBUG)
     51 
     52 }  // namespace mojo
     53