Blame common.h

541903
#ifndef COMMON_H
541903
#define COMMON_H
541903
541903
2499ad
#include <mutex></mutex>
2499ad
541903
#include "error.h"
541903
#include "handle.h"
541903
541903
2499ad
2499ad
class RecursiveMutex {
2499ad
public:
2499ad
	class CondWrapper {
2499ad
	private:
2499ad
		int cnt;
2499ad
		bool locked;
2499ad
		inline void lockCnt(int cnt) { for(int i = 0; i < cnt; ++i) mutex.lock(); }
2499ad
		inline void unlockCnt(int cnt) { for(int i = 0; i < cnt; ++i) mutex.unlock(); }
2499ad
		
2499ad
	public:
2499ad
		RecursiveMutex &mutex;
2499ad
		
2499ad
		inline CondWrapper(RecursiveMutex &mutex):
2499ad
			cnt(mutex.count()), locked(true), mutex(mutex) { }
2499ad
		inline ~CondWrapper()
2499ad
			{ if (!locked) lock(); }
2499ad
		
2499ad
		inline void lock() {
2499ad
			if (!locked) lockCnt(cnt);
2499ad
			locked = true;
2499ad
		}
2499ad
		
2499ad
		inline void unlock() {
2499ad
			if (locked) unlockCnt(cnt);
2499ad
			locked = false;
2499ad
		}
2499ad
		
2499ad
		inline bool try_lock() {
2499ad
			if (locked || cnt <= 0) return true;
2499ad
			if (!mutex.try_lock()) return false;
2499ad
			lockCnt(cnt-1);
2499ad
			locked = true;
2499ad
			return true;
2499ad
		}
2499ad
	};
2499ad
2499ad
private:
2499ad
	int cnt;
2499ad
	
2499ad
public:
2499ad
	std::recursive_mutex mutex;
2499ad
	
2499ad
	inline RecursiveMutex(): cnt() { }
2499ad
	inline ~RecursiveMutex() { assert(!cnt); }
2499ad
	
2499ad
	inline int count() const { return cnt; }
2499ad
	inline void lock() { mutex.lock(); ++cnt; }
2499ad
	inline bool try_lock() { if (mutex.try_lock()) { ++cnt; return true; } else return false; }
2499ad
	inline void unlock() { mutex.unlock(); --cnt; }
2499ad
};
2499ad
2499ad
541903
#endif