X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FRaiseAsync.c;h=d55595309bceb82e4b3f8f3c7d23ec3206d80258;hp=b0c70645401717ca1bb3cfa769a84d27ec426ac2;hb=1cb0eb071f1316d6650f354166506789a2638720;hpb=9c4abbc0c2d4373eb7c63b1110821dfcb0077661 diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index b0c7064..d555953 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -13,10 +13,13 @@ #include "RaiseAsync.h" #include "SMP.h" #include "Schedule.h" -#include "Storage.h" +#include "LdvProfile.h" #include "Updates.h" #include "STM.h" #include "Sanity.h" +#if defined(mingw32_HOST_OS) +#include "win32/IOManager.h" +#endif static void raiseAsync (Capability *cap, StgTSO *tso, @@ -153,8 +156,8 @@ throwTo (Capability *cap, // the Capability we hold // ASSERT(get_itbl(target)->type == TSO); } - debugTrace(DEBUG_sched, "throwTo: from thread %d to thread %d", - source->id, target->id); + debugTrace(DEBUG_sched, "throwTo: from thread %lu to thread %lu", + (unsigned long)source->id, (unsigned long)target->id); #ifdef DEBUG if (traceClass(DEBUG_sched)) { @@ -240,7 +243,7 @@ check_target: { Capability *target_cap; - wb(); + write_barrier(); target_cap = target->cap; if (target_cap == cap && (target->flags & TSO_BLOCKEX) == 0) { // It's on our run queue and not blocking exceptions @@ -434,6 +437,9 @@ check_target: case BlockedOnRead: case BlockedOnWrite: case BlockedOnDelay: +#if defined(mingw32_HOST_OS) + case BlockedOnDoProc: +#endif if ((target->flags & TSO_BLOCKEX) && ((target->flags & TSO_INTERRUPTIBLE) == 0)) { blockedThrowTo(source,target); @@ -458,13 +464,13 @@ check_target: static void blockedThrowTo (StgTSO *source, StgTSO *target) { - debugTrace(DEBUG_sched, "throwTo: blocking on thread %d", target->id); + debugTrace(DEBUG_sched, "throwTo: blocking on thread %lu", (unsigned long)target->id); source->link = target->blocked_exceptions; target->blocked_exceptions = source; dirtyTSO(target); // we modified the blocked_exceptions queue source->block_info.tso = target; - wb(); // throwTo_exception *must* be visible if BlockedOnException is. + write_barrier(); // throwTo_exception *must* be visible if BlockedOnException is. source->why_blocked = BlockedOnException; } @@ -1013,6 +1019,7 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, StgTRecHeader *trec = tso -> trec; StgTRecHeader *outer = stmGetEnclosingTRec(trec); stmAbortTransaction(cap, trec); + stmFreeAbortedTRec(cap, trec); tso -> trec = outer; break;