X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FSchedule.c;h=76fec4573708164afff0d35af2e8e22ab23f88f0;hb=c7fd6356eb1ccab4b92fa548d52023cc221fa7c0;hp=95e9ba46efcab70fc77d34f3f429df9f9ba01dd8;hpb=96757f6a4ec72dc609468d3da442db38a73df23e;p=ghc-hetmet.git diff --git a/ghc/rts/Schedule.c b/ghc/rts/Schedule.c index 95e9ba4..76fec45 100644 --- a/ghc/rts/Schedule.c +++ b/ghc/rts/Schedule.c @@ -542,7 +542,10 @@ schedule( StgMainThread *mainThread USED_WHEN_RTS_SUPPORTS_THREADS, // ToDo: add deadlock detection in GUM (similar to SMP) -- HWL #endif -#if defined(RTS_SUPPORTS_THREADS) +#if defined(RTS_SUPPORTS_THREADS) || defined(mingw32_TARGET_OS) + /* win32: might be back here due to awaitEvent() being abandoned + * as a result of a console event having been delivered. + */ if ( EMPTY_RUN_QUEUE() ) { continue; // nothing to do } @@ -1334,7 +1337,7 @@ run_thread: * When next scheduled they will try to commit, this commit will fail and * they will retry. */ for (t = all_threads; t != END_TSO_QUEUE; t = t -> link) { - if (t -> trec != NO_TREC && t -> why_blocked == NotBlocked) { + if (t -> what_next != ThreadRelocated && t -> trec != NO_TREC && t -> why_blocked == NotBlocked) { if (!stmValidateTransaction (t -> trec)) { IF_DEBUG(stm, sched_belch("trec %p found wasting its time", t)); @@ -1343,7 +1346,9 @@ run_thread: // partially-evaluated thunks on the heap. raiseAsync_(t, NULL, rtsTrue); +#ifdef REG_R1 ASSERT(get_itbl((StgClosure *)t->sp)->type == ATOMICALLY_FRAME); +#endif } } } @@ -3110,7 +3115,17 @@ raiseAsync_(StgTSO *tso, StgClosure *exception, rtsBool stop_at_atomically) ASSERT(stop_at_atomically); ASSERT(stmGetEnclosingTRec(tso->trec) == NO_TREC); stmCondemnTransaction(tso -> trec); +#ifdef REG_R1 tso->sp = frame; +#else + // R1 is not a register: the return convention for IO in + // this case puts the return value on the stack, so we + // need to set up the stack to return to the atomically + // frame properly... + tso->sp = frame - 2; + tso->sp[1] = (StgWord) &stg_NO_FINALIZER_closure; // why not? + tso->sp[0] = (StgWord) &stg_ut_1_0_unreg_info; +#endif tso->what_next = ThreadRunGHC; return; @@ -3352,7 +3367,7 @@ findRetryFrameHelper (StgTSO *tso) } } } - + /* ----------------------------------------------------------------------------- resurrectThreads is called after garbage collection on the list of threads found to be garbage. Each of these threads will be woken