| //===-- Support/UniqueLock.h - Acquire/Release Mutex In Scope ---*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // 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_UNIQUE_LOCK_H |
| #define LLVM_SUPPORT_UNIQUE_LOCK_H |
| |
| #include "llvm/Support/Mutex.h" |
| |
| namespace llvm { |
| /// A pared-down imitation of std::unique_lock from C++11. Contrary to the |
| /// name, it's really more of a wrapper for a lock. It may or may not have |
| /// an associated mutex, which is guaranteed to be locked upon creation |
| /// and unlocked after destruction. unique_lock can also unlock the mutex |
| /// and re-lock it freely during its lifetime. |
| /// @brief Guard a section of code with a mutex. |
| template<typename MutexT> |
| class unique_lock { |
| MutexT *M; |
| bool locked; |
| |
| unique_lock(const unique_lock &) = delete; |
| void operator=(const unique_lock &) = delete; |
| public: |
| unique_lock() : M(nullptr), locked(false) {} |
| explicit unique_lock(MutexT &m) : M(&m), locked(true) { M->lock(); } |
| |
| void operator=(unique_lock &&o) { |
| if (owns_lock()) |
| M->unlock(); |
| M = o.M; |
| locked = o.locked; |
| o.M = nullptr; |
| o.locked = false; |
| } |
| |
| ~unique_lock() { if (owns_lock()) M->unlock(); } |
| |
| void lock() { |
| assert(!locked && "mutex already locked!"); |
| assert(M && "no associated mutex!"); |
| M->lock(); |
| locked = true; |
| } |
| |
| void unlock() { |
| assert(locked && "unlocking a mutex that isn't locked!"); |
| assert(M && "no associated mutex!"); |
| M->unlock(); |
| locked = false; |
| } |
| |
| bool owns_lock() { return locked; } |
| }; |
| } |
| |
| #endif // LLVM_SUPPORT_UNIQUE_LOCK_H |