1// Copyright (c) 2012 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#ifndef LIBRARIES_SDK_UTIL_AUTO_LOCK_H_
6#define LIBRARIES_SDK_UTIL_AUTO_LOCK_H_
7
8#include <pthread.h>
9#include "sdk_util/macros.h"
10#include "sdk_util/simple_lock.h"
11
12namespace sdk_util {
13
14// This macro is provided to allow us to quickly instrument locking for
15// debugging purposes.
16#define AUTO_LOCK(lock)                         \
17  ::sdk_util::AutoLock Lock##__LINE__(lock);
18
19class AutoLock {
20 public:
21  AutoLock(const SimpleLock& lock) {
22    lock_ = lock.mutex();
23    pthread_mutex_lock(lock_);
24  }
25
26  ~AutoLock() {
27    Unlock();
28  }
29
30  void Unlock() {
31    if (lock_) pthread_mutex_unlock(lock_);
32    lock_ = NULL;
33  }
34
35 private:
36  pthread_mutex_t* lock_;
37
38  DISALLOW_COPY_AND_ASSIGN(AutoLock);
39};
40
41}  // namespace sdk_util
42
43#endif  // LIBRARIES_SDK_UTIL_AUTO_LOCK_H_
44