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) Mutex()14Mutex::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 ~Mutex()26Mutex::~Mutex() { 27 int rv = pthread_mutex_destroy(&mutex_); 28 assert(rv == 0); 29 } 30 Lock()31void Mutex::Lock() { 32 int rv = pthread_mutex_lock(&mutex_); 33 assert(rv == 0); 34 } 35 Unlock()36void Mutex::Unlock() { 37 int rv = pthread_mutex_unlock(&mutex_); 38 assert(rv == 0); 39 } 40 TryLock()41bool Mutex::TryLock() { 42 int rv = pthread_mutex_trylock(&mutex_); 43 assert(rv == 0 || rv == EBUSY); 44 return rv == 0; 45 } 46 AssertHeld()47void Mutex::AssertHeld() { 48 assert(pthread_mutex_lock(&mutex_) == EDEADLK); 49 } 50 #endif // !defined(NDEBUG) 51 52 } // namespace mojo 53