46 lines
1.1 KiB
C++
46 lines
1.1 KiB
C++
#ifndef RWLOCK_H
|
|
#define RWLOCK_H
|
|
|
|
#include "error_list.h"
|
|
|
|
class RWLock {
|
|
protected:
|
|
static RWLock* (*create_func)();
|
|
|
|
public:
|
|
|
|
virtual void read_lock()=0; ///< Lock the rwlock, block if locked by someone else
|
|
virtual void read_unlock()=0; ///< Unlock the rwlock, let other threads continue
|
|
virtual Error read_try_lock()=0; ///< Attempt to lock the rwlock, OK on success, ERROR means it can't lock.
|
|
|
|
virtual void write_lock()=0; ///< Lock the rwlock, block if locked by someone else
|
|
virtual void write_unlock()=0; ///< Unlock the rwlock, let other thwrites continue
|
|
virtual Error write_try_lock()=0; ///< Attempt to lock the rwlock, OK on success, ERROR means it can't lock.
|
|
|
|
static RWLock * create(); ///< Create a rwlock
|
|
|
|
virtual ~RWLock();
|
|
};
|
|
|
|
|
|
class RWLockRead {
|
|
|
|
RWLock *lock;
|
|
public:
|
|
|
|
RWLockRead(RWLock* p_lock) { lock=p_lock; if (lock) lock->read_lock(); }
|
|
~RWLockRead() { if (lock) lock->read_unlock(); }
|
|
|
|
};
|
|
|
|
class RWLockWrite {
|
|
|
|
RWLock *lock;
|
|
public:
|
|
|
|
RWLockWrite(RWLock* p_lock) { lock=p_lock; if (lock) lock->write_lock(); }
|
|
~RWLockWrite() { if (lock) lock->write_unlock(); }
|
|
|
|
};
|
|
|
|
#endif // RWLOCK_H
|