#include "os/c-api/il2cpp-config-platforms.h" #if IL2CPP_THREADS_WIN32 #include "MutexImpl.h" #include "WindowsHelpers.h" // Can't use critical sections as they don't allow for interruption by APCs. namespace il2cpp { namespace os { MutexImpl::MutexImpl() { #if IL2CPP_THREADS_ALL_ACCESS m_MutexHandle = ::CreateMutexEx(NULL, NULL, 0, MUTEX_ALL_ACCESS); #else m_MutexHandle = ::CreateMutex(NULL, FALSE, NULL); #endif IL2CPP_ASSERT(m_MutexHandle); } MutexImpl::~MutexImpl() { IL2CPP_ASSERT(m_MutexHandle); ::CloseHandle(m_MutexHandle); } void MutexImpl::Lock(bool interruptible) { TryLock(INFINITE, interruptible); } bool MutexImpl::TryLock(uint32_t milliseconds, bool interruptible) { return (il2cpp::os::win::WaitForSingleObjectAndAccountForAPCs(m_MutexHandle, milliseconds, interruptible) == kWaitStatusSuccess); } void MutexImpl::Unlock() { ReleaseMutex(m_MutexHandle); } void* MutexImpl::GetOSHandle() { return (void*)m_MutexHandle; } } } #endif