summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/KernelKit/Semaphore.h
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-07-23 08:05:37 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-07-23 08:08:29 +0100
commit5516544f97026460ede96f894c806dd8925885ae (patch)
treeed93a0d1dfacf83d598c715d648cee808317ab7d /dev/kernel/KernelKit/Semaphore.h
parent3b7964eb2f165e77334a92ca907d769bede17aef (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/kernel/KernelKit/Semaphore.h')
-rw-r--r--dev/kernel/KernelKit/Semaphore.h39
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;