X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=rts%2FRaiseAsync.c;h=b71e126f04020bf82ac3c8dd07a52519ebf1462a;hp=219e58174a495ca286080a05f705e50b4be34c0b;hb=45202530612593a0ba7a6c559a38dc1ff26670a4;hpb=78bd1cdb548b43cf6892234006730c69ddaa2a9e diff --git a/rts/RaiseAsync.c b/rts/RaiseAsync.c index 219e581..b71e126 100644 --- a/rts/RaiseAsync.c +++ b/rts/RaiseAsync.c @@ -13,11 +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, @@ -154,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)) { @@ -435,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); @@ -459,7 +464,7 @@ 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 @@ -491,9 +496,11 @@ throwToReleaseTarget (void *tso) queue, but not perform any throwTo() immediately. This might be more appropriate when the target thread is the one actually running (see Exception.cmm). + + Returns: non-zero if an exception was raised, zero otherwise. -------------------------------------------------------------------------- */ -void +int maybePerformBlockedException (Capability *cap, StgTSO *tso) { StgTSO *source; @@ -509,7 +516,7 @@ maybePerformBlockedException (Capability *cap, StgTSO *tso) // locked it. if (tso->blocked_exceptions == END_TSO_QUEUE) { unlockTSO(tso); - return; + return 0; } // We unblock just the first thread on the queue, and perform @@ -519,7 +526,9 @@ maybePerformBlockedException (Capability *cap, StgTSO *tso) tso->blocked_exceptions = unblockOne_(cap, source, rtsFalse/*no migrate*/); unlockTSO(tso); + return 1; } + return 0; } void @@ -933,10 +942,12 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, } case STOP_FRAME: + { // We've stripped the entire stack, the thread is now dead. tso->what_next = ThreadKilled; tso->sp = frame + sizeofW(StgStopFrame); return; + } case CATCH_FRAME: // If we find a CATCH_FRAME, and we've got an exception to raise, @@ -1008,14 +1019,17 @@ raiseAsync(Capability *cap, StgTSO *tso, StgClosure *exception, // whether the transaction is valid or not because its // possible validity cannot have caused the exception // and will not be visible after the abort. - debugTrace(DEBUG_stm, - "found atomically block delivering async exception"); + { StgTRecHeader *trec = tso -> trec; StgTRecHeader *outer = stmGetEnclosingTRec(trec); + debugTrace(DEBUG_stm, + "found atomically block delivering async exception"); stmAbortTransaction(cap, trec); + stmFreeAbortedTRec(cap, trec); tso -> trec = outer; break; + }; default: break;