Threading: Add error checking to semaphore

This commit is contained in:
Stenzek 2024-10-27 20:14:52 +10:00
parent 53fb5cd9e1
commit b86fdc1cc1
No known key found for this signature in database
2 changed files with 20 additions and 10 deletions

View File

@ -610,10 +610,15 @@ Threading::KernelSemaphore::KernelSemaphore()
{
#ifdef _WIN32
m_sema = CreateSemaphore(nullptr, 0, LONG_MAX, nullptr);
if (m_sema == NULL) [[unlikely]]
Panic("CreateSemaphore() failed");
#elif defined(__APPLE__)
semaphore_create(mach_task_self(), &m_sema, SYNC_POLICY_FIFO, 0);
const kern_return_t kr = semaphore_create(mach_task_self(), &m_sema, SYNC_POLICY_FIFO, 0);
if (kr != KERN_SUCCESS) [[unlikely]]
Panic("CreateSemaphore() failed");
#else
sem_init(&m_sema, false, 0);
if (sem_init(&m_sema, false, 0) != 0) [[unlikely]]
Panic("sem_init() failed");
#endif
}

View File

@ -107,10 +107,21 @@ protected:
u32 m_stack_size = 0;
};
/// A semaphore that may not have a fast userspace path
/// (Used in other semaphore-based algorithms where the semaphore is just used for its thread sleep/wake ability)
/// A semaphore that requires a system call to wake/sleep.
class KernelSemaphore
{
public:
KernelSemaphore();
KernelSemaphore(const KernelSemaphore&) = delete;
~KernelSemaphore();
KernelSemaphore& operator=(const KernelSemaphore&) = delete;
void Post();
void Wait();
bool TryWait();
private:
#if defined(_WIN32)
void* m_sema;
#elif defined(__APPLE__)
@ -118,12 +129,6 @@ class KernelSemaphore
#else
sem_t m_sema;
#endif
public:
KernelSemaphore();
~KernelSemaphore();
void Post();
void Wait();
bool TryWait();
};
} // namespace Threading