1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef LIBRARIES_SDK_UTIL_AUTO_LOCK_H_ 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define LIBRARIES_SDK_UTIL_AUTO_LOCK_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pthread.h> 97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sdk_util/macros.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "sdk_util/simple_lock.h" 117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace sdk_util { 137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// This macro is provided to allow us to quickly instrument locking for 157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// debugging purposes. 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define AUTO_LOCK(lock) \ 17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch ::sdk_util::AutoLock Lock##__LINE__(lock); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutoLock { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch AutoLock(const SimpleLock& lock) { 227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch lock_ = lock.mutex(); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_mutex_lock(lock_); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~AutoLock() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lock_) pthread_mutex_unlock(lock_); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Unlock() { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (lock_) pthread_mutex_unlock(lock_); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lock_ = NULL; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pthread_mutex_t* lock_; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DISALLOW_COPY_AND_ASSIGN(AutoLock); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch} // namespace sdk_util 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif // LIBRARIES_SDK_UTIL_AUTO_LOCK_H_ 44