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 #ifdef _WIN32
m_sema = CreateSemaphore(nullptr, 0, LONG_MAX, nullptr); m_sema = CreateSemaphore(nullptr, 0, LONG_MAX, nullptr);
if (m_sema == NULL) [[unlikely]]
Panic("CreateSemaphore() failed");
#elif defined(__APPLE__) #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 #else
sem_init(&m_sema, false, 0); if (sem_init(&m_sema, false, 0) != 0) [[unlikely]]
Panic("sem_init() failed");
#endif #endif
} }

View File

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