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