mirror of
https://github.com/Zygo/bees.git
synced 2025-05-17 13:25:45 +02:00
Add a master switch to turn off the entire MultiLock infrastructure for testing, without having to remove and add all the individual entry points. Signed-off-by: Zygo Blaxell <bees@furryterror.org>
43 lines
912 B
C++
43 lines
912 B
C++
#ifndef CRUCIBLE_MULTILOCK_H
|
|
#define CRUCIBLE_MULTILOCK_H
|
|
|
|
#include <condition_variable>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <mutex>
|
|
#include <string>
|
|
|
|
namespace crucible {
|
|
using namespace std;
|
|
|
|
class MultiLocker {
|
|
mutex m_mutex;
|
|
condition_variable m_cv;
|
|
map<string, size_t> m_counters;
|
|
bool m_do_locking = true;
|
|
|
|
class LockHandle {
|
|
const string m_type;
|
|
MultiLocker &m_parent;
|
|
bool m_locked = false;
|
|
void set_locked(bool state);
|
|
public:
|
|
~LockHandle();
|
|
LockHandle(const string &type, MultiLocker &parent);
|
|
friend class MultiLocker;
|
|
};
|
|
|
|
friend class LockHandle;
|
|
|
|
bool is_lock_available(const string &type);
|
|
void put_lock(const string &type);
|
|
shared_ptr<LockHandle> get_lock_private(const string &type);
|
|
public:
|
|
static shared_ptr<LockHandle> get_lock(const string &type);
|
|
static void enable_locking(bool enabled);
|
|
};
|
|
|
|
}
|
|
|
|
#endif // CRUCIBLE_MULTILOCK_H
|