19#if GAIA_PLATFORM_WINDOWS
21#elif GAIA_PLATFORM_APPLE
22 dispatch_semaphore_t m_handle;
34 void init(int32_t count) {
35#if GAIA_PLATFORM_WINDOWS
36 m_handle = (
void*)::CreateSemaphoreExW(NULL, count, INT_MAX, NULL, 0, SEMAPHORE_ALL_ACCESS);
37 GAIA_ASSERT(m_handle != NULL);
38#elif GAIA_PLATFORM_APPLE
39 m_handle = dispatch_semaphore_create(count);
40 GAIA_ASSERT(m_handle !=
nullptr);
42 [[maybe_unused]]
int ret = sem_init(&m_handle, 0, count);
43 GAIA_ASSERT(ret == 0);
49#if GAIA_PLATFORM_WINDOWS
50 if (m_handle != NULL) {
51 ::CloseHandle((HANDLE)m_handle);
54#elif GAIA_PLATFORM_APPLE
59 [[maybe_unused]]
int ret = sem_destroy(&m_handle);
60 GAIA_ASSERT(ret == 0);
75 GAIA_ASSERT(count > 0);
77#if GAIA_PLATFORM_WINDOWS
78 [[maybe_unused]] LONG prev = 0;
79 [[maybe_unused]] BOOL res = ::ReleaseSemaphore(m_handle, count, &prev);
80 GAIA_ASSERT(res != 0);
81#elif GAIA_PLATFORM_APPLE
83 dispatch_semaphore_signal(m_handle);
84 }
while ((--count) != 0);
87 [[maybe_unused]]
const auto ret = sem_post(&m_handle);
88 GAIA_ASSERT(ret == 0);
89 }
while ((--count) != 0);
97#if GAIA_PLATFORM_WINDOWS
98 GAIA_ASSERT(m_handle != (
void*)ERROR_INVALID_HANDLE);
99 DWORD ret = ::WaitForSingleObject(m_handle, INFINITE);
100 GAIA_ASSERT(ret == WAIT_OBJECT_0);
101 return (ret == WAIT_OBJECT_0);
102#elif GAIA_PLATFORM_APPLE
103 const auto res = dispatch_semaphore_wait(m_handle, DISPATCH_TIME_FOREVER);
104 GAIA_ASSERT(res == 0);
109 res = sem_wait(&m_handle);
110 }
while (res == -1 && errno == EINTR);
112 GAIA_ASSERT(res == 0);