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