X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FAsyncIO.c;h=1b57d37d342a08e44bbb3441549ff15ef9795606;hb=b6fcd8d1287ac70186c798013e270b0743eb7aa2;hp=20de8bb4abd73804d18d4b58dd257be31732c649;hpb=eb5791fe867f6441d270344298678f45ed4a75e4;p=ghc-hetmet.git diff --git a/rts/win32/AsyncIO.c b/rts/win32/AsyncIO.c index 20de8bb..1b57d37 100644 --- a/rts/win32/AsyncIO.c +++ b/rts/win32/AsyncIO.c @@ -189,6 +189,7 @@ shutdownAsyncIO(rtsBool wait_threads) CloseHandle(completed_table_sema); completed_table_sema = NULL; } + DeleteCriticalSection(&queue_lock); } /* @@ -274,8 +275,21 @@ start: unsigned int rID = completedTable[i].reqID; prev = NULL; - for(tso = blocked_queue_hd ; tso != END_TSO_QUEUE; prev = tso, tso = tso->link) { + for(tso = blocked_queue_hd ; tso != END_TSO_QUEUE; tso = tso->_link) { + if (tso->what_next == ThreadRelocated) { + /* Drop the TSO from blocked_queue */ + if (prev) { + setTSOLink(&MainCapability, prev, tso->_link); + } else { + blocked_queue_hd = tso->_link; + } + if (blocked_queue_tl == tso) { + blocked_queue_tl = prev ? prev : END_TSO_QUEUE; + } + continue; + } + switch(tso->why_blocked) { case BlockedOnRead: case BlockedOnWrite: @@ -289,16 +303,16 @@ start: /* Drop the matched TSO from blocked_queue */ if (prev) { - prev->link = tso->link; + setTSOLink(&MainCapability, prev, tso->_link); } else { - blocked_queue_hd = tso->link; + blocked_queue_hd = tso->_link; } if (blocked_queue_tl == tso) { blocked_queue_tl = prev ? prev : END_TSO_QUEUE; } /* Terminates the run queue + this inner for-loop. */ - tso->link = END_TSO_QUEUE; + tso->_link = END_TSO_QUEUE; tso->why_blocked = NotBlocked; pushOnRunQueue(&MainCapability, tso); break; @@ -310,6 +324,8 @@ start: } break; } + + prev = tso; } /* Signal that there's completed table slots available */ if ( !ReleaseSemaphore(completed_table_sema, 1, NULL) ) {