#define _RW_LOCK_h_
#include "stdint.h"
#include <wtypes.h>
#include <winbase.h>
#define RWLOCK_FREE 0
#define RWLOCK_LOCKED 1
class CRWLock
{
public:
inline CRWLock(void):m_ulRLock(0),m_ulWLock(0),m_ulPreLock(0){};
void WLock(void);
void RLock(void);
inline void WUnLock(void)
{
InterlockedExchange((LPLONG)&m_ulWLock, RWLOCK_FREE);
}
inline void RUnLock(void)
{
if (m_ulRLock>0)
{
InterlockedDecrement((LPLONG)&m_ulRLock);
}
}
inline void Lock(void){WLock();}
inline void UnLock(void){WUnLock();}
private:
uint32_t volatile m_ulWLock;
uint32_t volatile m_ulRLock;
uint32_t volatile m_ulPreLock;
};
#endif
#include "CRWLock.h"
void CRWLock::WLock(void)
{
while (InterlockedCompareExchange((PVOID*)&m_ulPreLock, (PVOID)RWLOCK_LOCKED, (PVOID)RWLOCK_FREE) != 0)
{
Sleep(0);
}
while (InterlockedCompareExchange((PVOID*)&m_ulRLock, (PVOID)RWLOCK_FREE, (PVOID)RWLOCK_FREE) != 0)
{
Sleep(0);
}
while (InterlockedCompareExchange((PVOID*)&m_ulWLock, (PVOID)RWLOCK_LOCKED, (PVOID)RWLOCK_FREE) != 0)
{
Sleep(0);
}
InterlockedExchange((LPLONG)&m_ulPreLock, RWLOCK_FREE);
}
void CRWLock::RLock(void)
{
while (InterlockedCompareExchange((PVOID*)&m_ulPreLock, (PVOID)RWLOCK_LOCKED, (PVOID)RWLOCK_FREE) != 0)
{
Sleep(0);
}
while (InterlockedCompareExchange((PVOID*)&m_ulWLock, (PVOID)RWLOCK_FREE, (PVOID)RWLOCK_FREE) != 0)
{
Sleep(0);
}
InterlockedIncrement((LPLONG)&m_ulRLock);
InterlockedExchange((LPLONG)&m_ulPreLock, RWLOCK_FREE);
}