yuqucheng fa7c338ea5 init
2026-06-23 09:54:30 +08:00

60 lines
1.2 KiB
C++

#pragma once
#if (IL2CPP_THREADS_PTHREAD || IL2CPP_THREADS_WIN32) && !RUNTIME_TINY
#include "os/Generic/WaitObject.h"
#include "os/ErrorCodes.h"
#include "os/WaitStatus.h"
#include <stdint.h>
namespace il2cpp
{
namespace os
{
class SemaphoreImpl : public WaitObject
{
public:
SemaphoreImpl(int32_t initialValue, int32_t maximumValue)
: WaitObject(kSemaphore)
, m_MaximumValue(maximumValue)
{
m_Count = initialValue;
}
~SemaphoreImpl()
{
}
bool Post(int32_t releaseCount, int32_t* previousCount)
{
uint32_t oldCount;
{
WaitObject::ReleaseOnDestroy lock(m_Mutex);
oldCount = m_Count;
// Make sure we stay within range. Account for 32bit overflow.
if (static_cast<uint64_t>(oldCount) + releaseCount > m_MaximumValue)
return false;
m_Count += releaseCount;
WakeupOneThread();
}
if (previousCount)
*previousCount = oldCount;
return true;
}
protected:
uint32_t m_MaximumValue;
};
}
}
#endif