15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- Support/MutexGuard.h - Acquire/Release Mutex In Scope ---*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file defines a guard for a block of code that ensures a Mutex is locked 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// upon construction and released upon destruction. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_SUPPORT_MUTEXGUARD_H 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_SUPPORT_MUTEXGUARD_H 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/Mutex.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// Instances of this class acquire a given Mutex Lock when constructed and 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// hold that lock until destruction. The intention is to instantiate one of 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// these on the stack at the top of some scope to be assured that C++ 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// destruction of the object will always release the Mutex and thus avoid 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// a host of nasty multi-threading problems in the face of exceptions, etc. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// @brief Guard a section of code with a Mutex. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class MutexGuard { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sys::Mutex &M; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MutexGuard(const MutexGuard &) LLVM_DELETED_FUNCTION; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void operator=(const MutexGuard &) LLVM_DELETED_FUNCTION; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MutexGuard(sys::Mutex &m) : M(m) { M.acquire(); } 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~MutexGuard() { M.release(); } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// holds - Returns true if this locker instance holds the specified lock. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// This is mostly used in assertions to validate that the correct mutex 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// is held. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool holds(const sys::Mutex& lock) const { return &M == &lock; } 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // LLVM_SUPPORT_MUTEXGUARD_H 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)