#pragma once

#if IL2CPP_THREADS_WIN32

#include "os/ErrorCodes.h"
#include "os/WaitStatus.h"
#include "utils/NonCopyable.h"

#include "WindowsHeaders.h"

namespace il2cpp
{
namespace os
{

class MutexImpl : public il2cpp::utils::NonCopyable
{
public:
	MutexImpl ();
	~MutexImpl ();

	void Lock (bool interruptible);
	bool TryLock (uint32_t milliseconds, bool interruptible);
	void Unlock ();

private:
	HANDLE m_MutexHandle;
};

class FastMutexImpl
{
public:
	FastMutexImpl ()
	{
		InitializeCriticalSection (&m_CritialSection);
	}
	~FastMutexImpl ()
	{
		DeleteCriticalSection (&m_CritialSection);
	}

	void Lock ()
	{
		EnterCriticalSection (&m_CritialSection);
	}

	void Unlock ()
	{
		LeaveCriticalSection (&m_CritialSection);
	}

private:
	CRITICAL_SECTION m_CritialSection;
};

}
}

#endif
