lock_impl_posix.cc revision 3551c9c881056c480085172ff9840cab31610854
1// Copyright (c) 2011 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 "base/synchronization/lock_impl.h"
6
7#include <errno.h>
8#include <string.h>
9
10#include "base/logging.h"
11
12namespace base {
13namespace internal {
14
15LockImpl::LockImpl() {
16#ifndef NDEBUG
17  // In debug, setup attributes for lock error checking.
18  pthread_mutexattr_t mta;
19  int rv = pthread_mutexattr_init(&mta);
20  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
21  rv = pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_ERRORCHECK);
22  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
23  rv = pthread_mutex_init(&os_lock_, &mta);
24  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
25  rv = pthread_mutexattr_destroy(&mta);
26  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
27#else
28  // In release, go with the default lock attributes.
29  pthread_mutex_init(&os_lock_, NULL);
30#endif
31}
32
33LockImpl::~LockImpl() {
34  int rv = pthread_mutex_destroy(&os_lock_);
35  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
36}
37
38bool LockImpl::Try() {
39  int rv = pthread_mutex_trylock(&os_lock_);
40  DCHECK(rv == 0 || rv == EBUSY) << ". " << strerror(rv);
41  return rv == 0;
42}
43
44void LockImpl::Lock() {
45  int rv = pthread_mutex_lock(&os_lock_);
46  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
47}
48
49void LockImpl::Unlock() {
50  int rv = pthread_mutex_unlock(&os_lock_);
51  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
52}
53
54}  // namespace internal
55}  // namespace base
56