mirror of
https://github.com/stenzek/duckstation.git
synced 2025-06-07 12:05:52 +00:00
Threading: Add error checking to semaphore
This commit is contained in:
parent
53fb5cd9e1
commit
b86fdc1cc1
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user