15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <errno.h>
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include <string.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LockImpl::LockImpl() {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NDEBUG
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In debug, setup attributes for lock error checking.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pthread_mutexattr_t mta;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = pthread_mutexattr_init(&mta);
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_ERRORCHECK);
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  rv = pthread_mutex_init(&native_handle_, &mta);
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rv = pthread_mutexattr_destroy(&mta);
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In release, go with the default lock attributes.
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  pthread_mutex_init(&native_handle_, NULL);
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LockImpl::~LockImpl() {
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int rv = pthread_mutex_destroy(&native_handle_);
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LockImpl::Try() {
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int rv = pthread_mutex_trylock(&native_handle_);
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(rv == 0 || rv == EBUSY) << ". " << strerror(rv);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv == 0;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LockImpl::Lock() {
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int rv = pthread_mutex_lock(&native_handle_);
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LockImpl::Unlock() {
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  int rv = pthread_mutex_unlock(&native_handle_);
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK_EQ(rv, 0) << ". " << strerror(rv);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
56