Skip to content

Commit e6f3bb6

Browse files
committed
Use _sched_block_enqueue() helper in mutex/semaphore
This commit replaces unblocking state transitions (TASK_BLOCKED->TASK_READY) in mutex and semaphore paths with the _sched_block_enqueue() helper to ensure scheduler visibility and preserve ready-queue invariants.
1 parent 737ef54 commit e6f3bb6

File tree

2 files changed

+8
-8
lines changed

2 files changed

+8
-8
lines changed

kernel/mutex.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -244,7 +244,7 @@ int32_t mo_mutex_timedlock(mutex_t *m, uint32_t ticks)
244244
if (self->state == TASK_BLOCKED) {
245245
/* We woke up due to timeout, not mutex unlock */
246246
if (remove_self_from_waiters(m->waiters)) {
247-
self->state = TASK_READY;
247+
_sched_block_enqueue(self);
248248
result = ERR_TIMEOUT;
249249
} else {
250250
/* Race condition: we were both timed out and unlocked */
@@ -286,7 +286,7 @@ int32_t mo_mutex_unlock(mutex_t *m)
286286
/* Validate task state before waking */
287287
if (likely(next_owner->state == TASK_BLOCKED)) {
288288
m->owner_tid = next_owner->id;
289-
next_owner->state = TASK_READY;
289+
_sched_block_enqueue(next_owner);
290290
/* Clear any pending timeout since we're granting ownership */
291291
next_owner->delay = 0;
292292
} else {
@@ -399,7 +399,7 @@ int32_t mo_cond_wait(cond_t *c, mutex_t *m)
399399
/* Failed to unlock - remove from wait list and restore state */
400400
NOSCHED_ENTER();
401401
remove_self_from_waiters(c->waiters);
402-
self->state = TASK_READY;
402+
_sched_block_enqueue(self);
403403
NOSCHED_LEAVE();
404404
return unlock_result;
405405
}
@@ -442,7 +442,7 @@ int32_t mo_cond_timedwait(cond_t *c, mutex_t *m, uint32_t ticks)
442442
/* Failed to unlock - cleanup and restore */
443443
NOSCHED_ENTER();
444444
remove_self_from_waiters(c->waiters);
445-
self->state = TASK_READY;
445+
_sched_block_enqueue(self);
446446
self->delay = 0;
447447
NOSCHED_LEAVE();
448448
return unlock_result;
@@ -458,7 +458,7 @@ int32_t mo_cond_timedwait(cond_t *c, mutex_t *m, uint32_t ticks)
458458
if (self->state == TASK_BLOCKED) {
459459
/* Timeout occurred - remove from wait list */
460460
remove_self_from_waiters(c->waiters);
461-
self->state = TASK_READY;
461+
_sched_block_enqueue(self);
462462
self->delay = 0;
463463
wait_status = ERR_TIMEOUT;
464464
} else {
@@ -487,7 +487,7 @@ int32_t mo_cond_signal(cond_t *c)
487487
if (likely(waiter)) {
488488
/* Validate task state before waking */
489489
if (likely(waiter->state == TASK_BLOCKED)) {
490-
waiter->state = TASK_READY;
490+
_sched_block_enqueue(waiter);
491491
/* Clear any pending timeout since we're signaling */
492492
waiter->delay = 0;
493493
} else {
@@ -514,7 +514,7 @@ int32_t mo_cond_broadcast(cond_t *c)
514514
if (likely(waiter)) {
515515
/* Validate task state before waking */
516516
if (likely(waiter->state == TASK_BLOCKED)) {
517-
waiter->state = TASK_READY;
517+
_sched_block_enqueue(waiter);
518518
/* Clear any pending timeout since we're broadcasting */
519519
waiter->delay = 0;
520520
} else {

kernel/semaphore.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ void mo_sem_signal(sem_t *s)
176176
if (likely(awakened_task)) {
177177
/* Validate awakened task state consistency */
178178
if (likely(awakened_task->state == TASK_BLOCKED)) {
179-
awakened_task->state = TASK_READY;
179+
_sched_block_enqueue(awakened_task);
180180
should_yield = true;
181181
} else {
182182
/* Task state inconsistency - this should not happen */

0 commit comments

Comments
 (0)