普通文本  |  53行  |  1.19 KB

// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "mojo/public/cpp/utility/mutex.h"

#include <assert.h>
#include <errno.h>

namespace mojo {

// Release builds have inlined (non-error-checking) definitions in the header.
#if !defined(NDEBUG)
Mutex::Mutex() {
  pthread_mutexattr_t mutexattr;
  int rv = pthread_mutexattr_init(&mutexattr);
  assert(rv == 0);
  rv = pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK);
  assert(rv == 0);
  rv = pthread_mutex_init(&mutex_, &mutexattr);
  assert(rv == 0);
  rv = pthread_mutexattr_destroy(&mutexattr);
  assert(rv == 0);
}

Mutex::~Mutex() {
  int rv = pthread_mutex_destroy(&mutex_);
  assert(rv == 0);
}

void Mutex::Lock() {
  int rv = pthread_mutex_lock(&mutex_);
  assert(rv == 0);
}

void Mutex::Unlock() {
  int rv = pthread_mutex_unlock(&mutex_);
  assert(rv == 0);
}

bool Mutex::TryLock() {
  int rv = pthread_mutex_trylock(&mutex_);
  assert(rv == 0 || rv == EBUSY);
  return rv == 0;
}

void Mutex::AssertHeld() {
  assert(pthread_mutex_lock(&mutex_) == EDEADLK);
}
#endif  // !defined(NDEBUG)

}  // namespace mojo