/* -----------------------------------------------------------------------------
- * $Id: Schedule.c,v 1.24 1999/08/25 16:11:51 simonmar Exp $
+ * $Id: Schedule.c,v 1.26 1999/10/04 16:13:18 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
ASSERT(tso->why_blocked != NotBlocked);
tso->why_blocked = NotBlocked;
next = tso->link;
+ tso->link = END_TSO_QUEUE;
PUSH_ON_RUN_QUEUE(tso);
IF_DEBUG(scheduler,belch("Waking up thread %ld", tso->id));
return next;
barf("unblockThread (BLACKHOLE): TSO not found");
}
+ case BlockedOnDelay:
case BlockedOnRead:
case BlockedOnWrite:
- case BlockedOnDelay:
- /* ToDo */
- barf("unblockThread {read,write,delay}");
+ {
+ last = &blocked_queue_hd;
+ for (t = blocked_queue_hd; t != END_TSO_QUEUE;
+ last = &t->link, t = t->link) {
+ if (t == tso) {
+ *last = tso->link;
+ if (blocked_queue_tl == t) {
+ blocked_queue_tl = tso->link;
+ }
+ goto done;
+ }
+ }
+ barf("unblockThread (I/O): TSO not found");
+ }
default:
barf("unblockThread");