#include "IReadWriteLock.h"

IReadWriteLock::IReadWriteLock()
{
	readCount.Set(0);
	readBlocker.UnBlock();
	writeBlocker.UnBlock();
}

IReadWriteLock::~IReadWriteLock()
{
	//
}

void IReadWriteLock::StartRead(void)
{
	enterBlocker.Enter();
	readBlocker.Wait();
	if(readCount.Increment() == 1)
		writeBlocker.Block();
	enterBlocker.Leave();
}

void IReadWriteLock::EndRead(void)
{
	if(!readCount.Decrement())
		writeBlocker.UnBlock();
}

void IReadWriteLock::StartWrite(void)
{
	writeMutex.Enter();
	enterBlocker.Enter();
	readBlocker.Block();
	writeBlocker.Wait();
	enterBlocker.Leave();
}

void IReadWriteLock::EndWrite(void)
{
	readBlocker.UnBlock();
	writeMutex.Leave();
}