mirror of
https://github.com/aharabada/glitchy-engine-beef.git
synced 2026-09-05 13:01:52 +00:00
55 lines
1.1 KiB
Beef
55 lines
1.1 KiB
Beef
#if BF_PLATFORM_WINDOWS
|
|
|
|
using static System.Windows;
|
|
|
|
namespace GlitchyEngine.Threading
|
|
{
|
|
extension Semaphore
|
|
{
|
|
internal Handle nativeHandle;
|
|
|
|
public override this(int32 initialCount = 1, int32 maximumCount = 1)
|
|
{
|
|
nativeHandle = (.)CreateSemaphoreW(null, initialCount, maximumCount, null);
|
|
|
|
Log.EngineLogger.AssertDebug(nativeHandle != 0, scope $"Failed to create semaphore. Error code: {GetLastError()}");
|
|
}
|
|
|
|
public ~this()
|
|
{
|
|
CloseHandle(nativeHandle);
|
|
}
|
|
|
|
public override LockResult Lock(uint32 timeout = InfiniteTimeout)
|
|
{
|
|
int i = WaitForSingleObject(nativeHandle, timeout);
|
|
|
|
switch(i)
|
|
{
|
|
case 0x00000000L:
|
|
return .Released;
|
|
case 0x00000080L:
|
|
return .Abandoned;
|
|
case 0x00000102L:
|
|
return .Timeout;
|
|
case 0xFFFFFFFF:
|
|
return .Failed;
|
|
default:
|
|
return .Unknown;
|
|
}
|
|
}
|
|
|
|
public bool Unlock(int32 releaseCount = 1)
|
|
{
|
|
return ReleaseSemaphore(nativeHandle, releaseCount, null);
|
|
}
|
|
|
|
public bool Unlock(out int32 previousCount, int32 releaseCount = 1)
|
|
{
|
|
previousCount = ?;
|
|
return ReleaseSemaphore(nativeHandle, releaseCount, &previousCount);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif |