diff --git a/nx/include/switch/kernel/condvar.h b/nx/include/switch/kernel/condvar.h index 8b56be2e..cd428b72 100644 --- a/nx/include/switch/kernel/condvar.h +++ b/nx/include/switch/kernel/condvar.h @@ -1,18 +1,69 @@ -// Copyright 2018 plutoo +/** + * @file condvar.h + * @brief Condition variable synchronization primitive. + * @author plutoo + * @copyright libnx Authors + */ #include "../types.h" #include "../kernel/mutex.h" +/// Condition variable structure. typedef struct { u32 tag; Mutex* mutex; } CondVar; +/** + * @brief Initializes a condition variable. + * @param[in] c Condition variable object. + * @param[in] m Mutex object to use inside the condition variable. + */ void condvarInit(CondVar* c, Mutex* m); -// When the wait-functions return, the mutex is acquired. -void condvarWaitTimeout(CondVar* c, u64 timeout); -void condvarWait(CondVar* c); +/** + * @brief Waits on a condition variable with a timeout. + * @param[in] c Condition variable object. + * @param[in] timeout Timeout in nanoseconds. + * @return Result code (0xEA01 on timeout). + * @remark On function return, the underlying mutex is acquired. + */ +Result condvarWaitTimeout(CondVar* c, u64 timeout); +/** + * @brief Waits on a condition variable. + * @param[in] c Condition variable object. + * @return Result code. + * @remark On function return, the underlying mutex is acquired. + */ +static inline Result condvarWait(CondVar* c) +{ + return condvarWaitTimeout(c, -1ull); +} + +/** + * @brief Wakes up up to the specified number of threads waiting on a condition variable. + * @param[in] c Condition variable object. + * @param[in] num Maximum number of threads to wake up (or -1 to wake them all up). + * @return Result code. + */ Result condvarWake(CondVar* c, int num); -Result condvarWakeOne(CondVar* c); -Result condvarWakeAll(CondVar* c); + +/** + * @brief Wakes up a single thread waiting on a condition variable. + * @param[in] c Condition variable object. + * @return Result code. + */ +static inline Result condvarWakeOne(CondVar* c) +{ + return condvarWake(c, 1); +} + +/** + * @brief Wakes up all thread waiting on a condition variable. + * @param[in] c Condition variable object. + * @return Result code. + */ +static inline Result condvarWakeAll(CondVar* c) +{ + return condvarWake(c, -1); +} diff --git a/nx/source/kernel/condvar.c b/nx/source/kernel/condvar.c index 68053663..6e474b18 100644 --- a/nx/source/kernel/condvar.c +++ b/nx/source/kernel/condvar.c @@ -10,7 +10,7 @@ void condvarInit(CondVar* c, Mutex* m) { c->mutex = m; } -void condvarWaitTimeout(CondVar* c, u64 timeout) { +Result condvarWaitTimeout(CondVar* c, u64 timeout) { Result rc; rc = svcWaitProcessWideKeyAtomic(&c->tag, (u32*) c->mutex, getThreadVars()->handle, timeout); @@ -18,20 +18,10 @@ void condvarWaitTimeout(CondVar* c, u64 timeout) { // On timeout, we need to acquire it manually. if (rc == 0xEA01) mutexLock(c->mutex); -} -void condvarWait(CondVar* c) { - return condvarWaitTimeout(c, -1ull); + return rc; } Result condvarWake(CondVar* c, int num) { return svcSignalProcessWideKey((u32*) &c->tag, num); } - -Result condvarWakeOne(CondVar* c) { - return condvarWake(c, 1); -} - -Result condvarWakeAll(CondVar* c) { - return condvarWake(c, -1); -}