diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-07-23 08:05:37 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-07-23 08:08:29 +0100 |
| commit | 5516544f97026460ede96f894c806dd8925885ae (patch) | |
| tree | ed93a0d1dfacf83d598c715d648cee808317ab7d /dev | |
| parent | 3b7964eb2f165e77334a92ca907d769bede17aef (diff) | |
feat: dev/kernel: Finish kernel semaphore API.
note:
- The API is very new, except breaking changces.
- It may be buggy in some areas, except some changes soon.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/kernel/KernelKit/Semaphore.h | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/dev/kernel/KernelKit/Semaphore.h b/dev/kernel/KernelKit/Semaphore.h index 7fa05008..a00273e8 100644 --- a/dev/kernel/KernelKit/Semaphore.h +++ b/dev/kernel/KernelKit/Semaphore.h @@ -19,13 +19,21 @@ #define kSemaphoreCount (2) +#define kSemaphoreIncremenntOwner(sem) \ + (sem[kSemaphoreOwnerIndex]++) + + +#define kSemaphoreDecrementOwner(sem) \ + (sem[kSemaphoreOwnerIndex]--) + + namespace Kernel { /// @brief Semaphore structure used for synchronization. typedef UInt64 Semaphore[kSemaphoreCount]; /// @brief Checks if the semaphore is valid. -inline BOOL rtl_sem_is_valid(const Semaphore& sem) { - return sem[kSemaphoreOwnerIndex] != 0 || sem[kSemaphoreCountIndex] > 0; +inline BOOL rtl_sem_is_valid(const Semaphore& sem, UInt64 owner = 0) { + return sem[kSemaphoreOwnerIndex] != owner || sem[kSemaphoreCountIndex] > 0; } /// @brief Releases the semaphore, resetting its owner and count. @@ -42,9 +50,10 @@ inline BOOL rtl_sem_release(Semaphore& sem) { /// @param sem /// @param owner /// @return -inline BOOL rtl_sem_init(Semaphore& sem, Int64 owner) { - if (!owner || sem[kSemaphoreOwnerIndex] > 0) { - return FALSE; +inline BOOL rtl_sem_acquire(Semaphore& sem, UInt64 owner) { + if (!owner) { + err_global_get() = kErrorInvalidData; + return FALSE; // Invalid owner } sem[kSemaphoreOwnerIndex] = owner; @@ -57,8 +66,8 @@ inline BOOL rtl_sem_init(Semaphore& sem, Int64 owner) { /// @param sem /// @param timeout /// @return -inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { - if (!rtl_sem_is_valid(sem)) { +inline BOOL rtl_sem_wait(Semaphore& sem, UInt64 owner, UInt64 timeout, BOOL* condition = nullptr) { + if (!rtl_sem_is_valid(sem, owner)) { return FALSE; } @@ -68,7 +77,7 @@ inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { return FALSE; } - if (sem[kSemaphoreCountIndex] > 0) { + if (!condition || *condition) { err_global_get() = kErrorSuccess; sem[kSemaphoreCountIndex]--; @@ -76,13 +85,15 @@ inline BOOL rtl_sem_wait(Semaphore& sem, Int64 timeout) { } HardwareTimer timer(timeout); - timer.Wait(); - - if (sem[kSemaphoreCountIndex] > 0) { - err_global_get() = kErrorSuccess; - sem[kSemaphoreCountIndex]--; + BOOL ret = timer.Wait(); - return TRUE; + if (ret) { + if (!condition || *condition) { + err_global_get() = kErrorSuccess; + sem[kSemaphoreCountIndex]--; + + return TRUE; + } } err_global_get() = kErrorNetworkTimeout; |
