Skip to content

Commit 9942fb4

Browse files
committed
Use ready queue helpers in mutex and semaphore path
Invoke _sched_block_enqueue() and _sched_block_dequeue() helpers for all transitions into or out of TASK_BLOCKED state. This change keeps the scheduler ready queue and mutex/semaphore semantics aligned and consistent.
1 parent f556a2c commit 9942fb4

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

kernel/mutex.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ static void mutex_block_atomic(list_t *waiters)
7878

7979
/* Block and yield atomically */
8080
self->state = TASK_BLOCKED;
81+
82+
/* Explicit remove list node from the ready queue */
83+
_sched_block_dequeue(self);
8184
_yield(); /* This releases NOSCHED when we context switch */
8285
}
8386

@@ -227,6 +230,7 @@ int32_t mo_mutex_timedlock(mutex_t *m, uint32_t ticks)
227230
/* Set up timeout using task delay mechanism */
228231
self->delay = ticks;
229232
self->state = TASK_BLOCKED;
233+
_sched_block_dequeue(self);
230234

231235
NOSCHED_LEAVE();
232236

@@ -282,7 +286,7 @@ int32_t mo_mutex_unlock(mutex_t *m)
282286
/* Validate task state before waking */
283287
if (likely(next_owner->state == TASK_BLOCKED)) {
284288
m->owner_tid = next_owner->id;
285-
next_owner->state = TASK_READY;
289+
_sched_block_enqueue(next_owner);
286290
/* Clear any pending timeout since we're granting ownership */
287291
next_owner->delay = 0;
288292
} else {
@@ -387,6 +391,7 @@ int32_t mo_cond_wait(cond_t *c, mutex_t *m)
387391
panic(ERR_SEM_OPERATION);
388392
}
389393
self->state = TASK_BLOCKED;
394+
_sched_block_dequeue(self);
390395
NOSCHED_LEAVE();
391396

392397
/* Release mutex */
@@ -395,7 +400,7 @@ int32_t mo_cond_wait(cond_t *c, mutex_t *m)
395400
/* Failed to unlock - remove from wait list and restore state */
396401
NOSCHED_ENTER();
397402
remove_self_from_waiters(c->waiters);
398-
self->state = TASK_READY;
403+
_sched_block_enqueue(self);
399404
NOSCHED_LEAVE();
400405
return unlock_result;
401406
}
@@ -430,6 +435,7 @@ int32_t mo_cond_timedwait(cond_t *c, mutex_t *m, uint32_t ticks)
430435
}
431436
self->delay = ticks;
432437
self->state = TASK_BLOCKED;
438+
_sched_block_dequeue(self);
433439
NOSCHED_LEAVE();
434440

435441
/* Release mutex */
@@ -438,7 +444,7 @@ int32_t mo_cond_timedwait(cond_t *c, mutex_t *m, uint32_t ticks)
438444
/* Failed to unlock - cleanup and restore */
439445
NOSCHED_ENTER();
440446
remove_self_from_waiters(c->waiters);
441-
self->state = TASK_READY;
447+
_sched_block_enqueue(self);
442448
self->delay = 0;
443449
NOSCHED_LEAVE();
444450
return unlock_result;
@@ -483,7 +489,7 @@ int32_t mo_cond_signal(cond_t *c)
483489
if (likely(waiter)) {
484490
/* Validate task state before waking */
485491
if (likely(waiter->state == TASK_BLOCKED)) {
486-
waiter->state = TASK_READY;
492+
_sched_block_enqueue(waiter);
487493
/* Clear any pending timeout since we're signaling */
488494
waiter->delay = 0;
489495
} else {
@@ -510,7 +516,7 @@ int32_t mo_cond_broadcast(cond_t *c)
510516
if (likely(waiter)) {
511517
/* Validate task state before waking */
512518
if (likely(waiter->state == TASK_BLOCKED)) {
513-
waiter->state = TASK_READY;
519+
_sched_block_enqueue(waiter);
514520
/* Clear any pending timeout since we're broadcasting */
515521
waiter->delay = 0;
516522
} 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)