#include "IMutex.h"

IMutex::IMutex()
{
	theMutex = CreateMutex(NULL, true, NULL);
}

IMutex::~IMutex()
{
	CloseHandle(theMutex);
}

bool IMutex::Wait(UInt32 timeout)
{
	switch(WaitForSingleObject(theMutex, timeout))
	{
		case WAIT_ABANDONED:
			HALT("IMutex::Wait: got abandoned mutex");
			return false;

		case WAIT_OBJECT_0:
			return true;

		default:
		case WAIT_TIMEOUT:
			gLog.FormattedMessage("IMutex::Wait: timeout");
			return false;
	}
}

void IMutex::Release(void)
{
	ASSERT_STR(ReleaseMutex(theMutex), "IMutex::Release: failed to release mutex");
}