X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/4b6190b935dd75d8ddd514a05c7c7343e32c0cdc..baca54322c66983205edecd2ebb00d997878be50:/lunaix-os/kernel/ds/mutex.c diff --git a/lunaix-os/kernel/ds/mutex.c b/lunaix-os/kernel/ds/mutex.c index 7bfbf10..fd14df5 100644 --- a/lunaix-os/kernel/ds/mutex.c +++ b/lunaix-os/kernel/ds/mutex.c @@ -1,10 +1,20 @@ #include #include +#include void mutex_lock(mutex_t* mutex) { - sem_wait(&mutex->sem); + if (atomic_load(&mutex->lk) && mutex->owner == __current->pid) { + atomic_fetch_add(&mutex->lk, 1); + return; + } + + while (atomic_load(&mutex->lk)) { + sched_pass(); + } + + atomic_fetch_add(&mutex->lk, 1); mutex->owner = __current->pid; } @@ -17,8 +27,8 @@ mutex_unlock(mutex_t* mutex) void mutex_unlock_for(mutex_t* mutex, pid_t pid) { - if (mutex->owner != pid) { + if (mutex->owner != pid || !atomic_load(&mutex->lk)) { return; } - sem_post(&mutex->sem); + atomic_fetch_sub(&mutex->lk, 1); } \ No newline at end of file