From: sof Date: Thu, 11 Sep 2003 00:39:04 +0000 (+0000) Subject: [project @ 2003-09-11 00:39:04 by sof] X-Git-Tag: Approx_11550_changesets_converted~475 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=3565204cdbc2a97375c90a944d259c827e4a5ebc;p=ghc-hetmet.git [project @ 2003-09-11 00:39:04 by sof] awaitRequests(): canonicalize removal of thread from blocked_queue --- diff --git a/ghc/rts/win32/AsyncIO.c b/ghc/rts/win32/AsyncIO.c index bc153a9..12de16e 100644 --- a/ghc/rts/win32/AsyncIO.c +++ b/ghc/rts/win32/AsyncIO.c @@ -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;