#include "os/c-api/il2cpp-config-platforms.h" #if IL2CPP_THREADS_PTHREAD && !IL2CPP_TINY_WITHOUT_DEBUGGER #include #include "SemaphoreImpl.h" #include "ThreadImpl.h" #include "PosixHelpers.h" namespace il2cpp { namespace os { SemaphoreImpl::SemaphoreImpl(int32_t initialValue, int32_t maximumValue) : posix::PosixWaitObject(kSemaphore) , m_MaximumValue(maximumValue) { m_Count = initialValue; } bool SemaphoreImpl::Post(int32_t releaseCount, int32_t* previousCount) { uint32_t oldCount; { posix::PosixAutoLock lock(&m_Mutex); oldCount = m_Count; // Make sure we stay within range. Account for 32bit overflow. if (static_cast(oldCount) + releaseCount > m_MaximumValue) return false; m_Count += releaseCount; pthread_cond_signal(&m_Condition); } if (previousCount) *previousCount = oldCount; return true; } } } #endif // IL2CPP_THREADS_PTHREAD