X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fwin32%2FAsyncIO.c;h=ff2e1a24980167e3b79a3fd6107d3a28d8ced81b;hb=f30d527344db528618f64a25250a3be557d9f287;hp=cd0cf38bab2a176b75051a7e3410eaa29a8cf80f;hpb=de6c8e5293c9ef68b597ab2e6d55c3f42a283489;p=ghc-hetmet.git diff --git a/rts/win32/AsyncIO.c b/rts/win32/AsyncIO.c index cd0cf38..ff2e1a2 100644 --- a/rts/win32/AsyncIO.c +++ b/rts/win32/AsyncIO.c @@ -12,7 +12,6 @@ #include #include #include "Schedule.h" -#include "RtsFlags.h" #include "Capability.h" #include "win32/AsyncIO.h" #include "win32/IOManager.h" @@ -174,9 +173,9 @@ startupAsyncIO() } void -shutdownAsyncIO() +shutdownAsyncIO(rtsBool wait_threads) { - ShutdownIOManager(); + ShutdownIOManager(wait_threads); if (completed_req_event != INVALID_HANDLE_VALUE) { CloseHandle(completed_req_event); completed_req_event = INVALID_HANDLE_VALUE; @@ -189,6 +188,7 @@ shutdownAsyncIO() CloseHandle(completed_table_sema); completed_table_sema = NULL; } + DeleteCriticalSection(&queue_lock); } /* @@ -274,9 +274,9 @@ 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) { - switch(tso->why_blocked) { + switch(tso->why_blocked) { case BlockedOnRead: case BlockedOnWrite: case BlockedOnDoProc: @@ -289,17 +289,22 @@ 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; + // save the StgAsyncIOResult in the + // stg_block_async_info stack frame, because + // the block_info field will be overwritten by + // pushOnRunQueue(). + tso->sp[1] = (W_)tso->block_info.async_result; pushOnRunQueue(&MainCapability, tso); break; } @@ -310,6 +315,8 @@ start: } break; } + + prev = tso; } /* Signal that there's completed table slots available */ if ( !ReleaseSemaphore(completed_table_sema, 1, NULL) ) {