[project @ 1999-10-04 16:13:18 by simonmar]
[ghc-hetmet.git] / ghc / rts / Schedule.c
index 8450d97..8f3f7e3 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $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
  *
@@ -654,6 +654,7 @@ StgTSO *unblockOne(StgTSO *tso)
   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;
@@ -731,11 +732,23 @@ unblockThread(StgTSO *tso)
       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");