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