/*
Mutex.h
Written by Matthew Fisher

A mutex is an object that grants a thread exclusive access to a given section of code.
*/

//
// Note: CRITICAL_SECTION stores a ref count each time EnterCriticalSection is called,
// and LeaveCriticalSection must be called once for each EnterCriticalSection.
//

struct Mutex
{
public:
    __forceinline Mutex()
    {
        InitializeCriticalSection(&_criticalSection);
    }
    __forceinline ~Mutex()
    {
        DeleteCriticalSection(&_criticalSection);
    }
    __forceinline bool TryAcquire()
    {
        return (TryEnterCriticalSection(&_criticalSection) != 0);
    }
    __forceinline void Acquire()
    {
        EnterCriticalSection(&_criticalSection);
    }
    __forceinline void Release()
    {
        LeaveCriticalSection(&_criticalSection);
    }

private:
    CRITICAL_SECTION _criticalSection;
};