X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FMutexGuard.h;h=07b64b611960448871b28f85c212f0f2a14ba05c;hb=a41a157f2118a17eaa99d7313a9c9c24ce72f3f5;hp=bed1a9cec7a9d463ec704c03d32176e68be22ab2;hpb=210bef19ef5ecc794d7e3d637d66ff0447801697;p=oota-llvm.git diff --git a/include/llvm/Support/MutexGuard.h b/include/llvm/Support/MutexGuard.h index bed1a9cec7a..07b64b61196 100644 --- a/include/llvm/Support/MutexGuard.h +++ b/include/llvm/Support/MutexGuard.h @@ -1,42 +1,41 @@ -//===-- Support/ThreadSupport.h - Generic threading support -----*- C++ -*-===// -// +//===-- Support/MutexGuard.h - Acquire/Release Mutex In Scope ---*- C++ -*-===// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // -// This file defines platform-agnostic interfaces that can be used to write -// multi-threaded programs. Autoconf is used to chose the correct -// implementation of these interfaces, or default to a non-thread-capable system -// if no matching system support is available. +// This file defines a guard for a block of code that ensures a Mutex is locked +// upon construction and released upon destruction. // //===----------------------------------------------------------------------===// -#ifndef LLVM_SUPPORT_THREADSUPPORT_H -#define LLVM_SUPPORT_THREADSUPPORT_H - -#undef HAVE_PTHREAD_MUTEX_LOCK +#ifndef LLVM_SUPPORT_MUTEXGUARD_H +#define LLVM_SUPPORT_MUTEXGUARD_H -#ifdef HAVE_PTHREAD_MUTEX_LOCK -#include "llvm/Support/ThreadSupport-PThreads.h" -#else -#include "llvm/Support/ThreadSupport-NoSupport.h" -#endif // If no system support is available +#include "llvm/Support/Mutex.h" namespace llvm { - /// MutexLocker - Instances of this class acquire a given Lock when - /// constructed and hold that lock until destruction. - /// - class MutexLocker { - Mutex &M; - MutexLocker(const MutexLocker &); // DO NOT IMPLEMENT - void operator=(const MutexLocker &); // DO NOT IMPLEMENT + /// Instances of this class acquire a given Mutex Lock when constructed and + /// hold that lock until destruction. The intention is to instantiate one of + /// these on the stack at the top of some scope to be assured that C++ + /// destruction of the object will always release the Mutex and thus avoid + /// a host of nasty multi-threading problems in the face of exceptions, etc. + /// @brief Guard a section of code with a Mutex. + class MutexGuard { + sys::Mutex &M; + MutexGuard(const MutexGuard &) = delete; + void operator=(const MutexGuard &) = delete; public: - MutexLocker(Mutex &m) : M(m) { M.acquire(); } - ~MutexLocker() { M.release(); } + MutexGuard(sys::Mutex &m) : M(m) { M.lock(); } + ~MutexGuard() { M.unlock(); } + /// holds - Returns true if this locker instance holds the specified lock. + /// This is mostly used in assertions to validate that the correct mutex + /// is held. + bool holds(const sys::Mutex& lock) const { return &M == &lock; } }; } -#endif // SUPPORT_THREADSUPPORT_H +#endif // LLVM_SUPPORT_MUTEXGUARD_H