15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/utility/mutex.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <assert.h> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <errno.h> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace mojo { 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Release builds have inlined (non-error-checking) definitions in the header. 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if !defined(NDEBUG) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Mutex::Mutex() { 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) pthread_mutexattr_t mutexattr; 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = pthread_mutexattr_init(&mutexattr); 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK); 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = pthread_mutex_init(&mutex_, &mutexattr); 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) rv = pthread_mutexattr_destroy(&mutexattr); 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)Mutex::~Mutex() { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = pthread_mutex_destroy(&mutex_); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Mutex::Lock() { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = pthread_mutex_lock(&mutex_); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Mutex::Unlock() { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = pthread_mutex_unlock(&mutex_); 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0); 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)bool Mutex::TryLock() { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int rv = pthread_mutex_trylock(&mutex_); 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(rv == 0 || rv == EBUSY); 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return rv == 0; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Mutex::AssertHeld() { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) assert(pthread_mutex_lock(&mutex_) == EDEADLK); 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif // !defined(NDEBUG) 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace mojo 53