[project @ 2003-09-11 00:39:04 by sof]
authorsof <unknown>
Thu, 11 Sep 2003 00:39:04 +0000 (00:39 +0000)
committersof <unknown>
Thu, 11 Sep 2003 00:39:04 +0000 (00:39 +0000)
awaitRequests(): canonicalize removal of thread from blocked_queue

ghc/rts/win32/AsyncIO.c

index bc153a9..12de16e 100644 (file)
@@ -194,7 +194,7 @@ start:
     for (i=0; i < completed_hw; i++) {
       unsigned int rID = completedTable[i].reqID;
       prev = NULL;
-      for(tso = blocked_queue_hd ; tso != END_TSO_QUEUE; tso = tso->link) {
+      for(tso = blocked_queue_hd ; tso != END_TSO_QUEUE; prev = tso, tso = tso->link) {
        switch(tso->why_blocked) {
        case BlockedOnRead:
        case BlockedOnWrite:
@@ -207,14 +207,18 @@ start:
            tso->block_info.async_result->errCode = completedTable[i].errCode;
 
            /* Drop the matched TSO from blocked_queue */
-           if (prev) {
-             prev->link = tso->link;
+           if ( prev == NULL ) {
+               blocked_queue_hd = tso->link;
+               if (blocked_queue_tl == tso) {
+                   blocked_queue_tl = END_TSO_QUEUE;
+               }
            } else {
-             blocked_queue_hd = tso->link;
-           }
-           if (blocked_queue_tl == tso) {
-             blocked_queue_tl = prev;
+             prev->link = tso->link;
+             if (blocked_queue_tl == tso) {
+                 blocked_queue_tl = END_TSO_QUEUE;
+             }
            }
+
            /* Terminates the run queue + this inner for-loop. */
            tso->link = END_TSO_QUEUE;
            tso->why_blocked = NotBlocked;
@@ -228,7 +232,6 @@ start:
          }
          break;
        }
-       prev = tso;
       }
     }
     completed_hw = 0;