aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/scope_lock.h29
1 files changed, 19 insertions, 10 deletions
diff --git a/common/scope_lock.h b/common/scope_lock.h
index 35de6bc9..7b6c9dcd 100644
--- a/common/scope_lock.h
+++ b/common/scope_lock.h
@@ -20,37 +20,46 @@
#ifndef SCOPE_LOCK_H
#define SCOPE_LOCK_H
+#include <stdexcept>
+
namespace nextpnr {
-// Provides a simple RIAA locking object. ScopeLock takes a lock when
+// Provides a simple RAII locking object. ScopeLock takes a lock when
// constructed, and releases the lock on destruction or if "unlock_early" is
// called.
//
// LockingObject must have a method "void lock(void)" and "void unlock(void)".
-template<typename LockingObject>
-class ScopeLock {
-public:
- ScopeLock(LockingObject * obj) : obj_(obj), locked_(false) {
+template <typename LockingObject> class ScopeLock
+{
+ public:
+ ScopeLock(LockingObject *obj) : obj_(obj), locked_(false)
+ {
obj_->lock();
locked_ = true;
}
ScopeLock(const ScopeLock &other) = delete;
ScopeLock(const ScopeLock &&other) = delete;
- ~ScopeLock() {
- if(locked_) {
+ ~ScopeLock()
+ {
+ if (locked_) {
obj_->unlock();
}
}
- void unlock_early() {
+ void unlock_early()
+ {
+ if (!locked_) {
+ throw std::runtime_error("Lock already released?");
+ }
locked_ = false;
obj_->unlock();
}
-private:
+
+ private:
LockingObject *obj_;
bool locked_;
};
-};
+}; // namespace nextpnr
#endif /* SCOPE_LOCK_H */