@@ -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 {
0 commit comments