X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FThreads.c;h=0bc725c94205362029850c896e96b21c74528789;hb=5bf014afadfaa225f949f6a33000ccd40ff1bcc1;hp=281cb65e482238968c68a023d6ba8a358d7fd533;hpb=d572aed64d9c40dcc38a49b09d18f301555e4efb;p=ghc-hetmet.git diff --git a/rts/Threads.c b/rts/Threads.c index 281cb65..0bc725c 100644 --- a/rts/Threads.c +++ b/rts/Threads.c @@ -84,9 +84,10 @@ createThread(Capability *cap, nat size) size = MIN_STACK_WORDS + TSO_STRUCT_SIZEW; } - stack_size = size - TSO_STRUCT_SIZEW; - + size = round_to_mblocks(size); tso = (StgTSO *)allocateLocal(cap, size); + + stack_size = size - TSO_STRUCT_SIZEW; TICK_ALLOC_TSO(stack_size, 0); SET_HDR(tso, &stg_TSO_info, CCS_SYSTEM); @@ -210,6 +211,8 @@ createThread(Capability *cap, nat size) } #endif + postEvent (cap, EVENT_CREATE_THREAD, tso->id, 0); + #if defined(GRAN) debugTrace(GRAN_DEBUG_pri, "==__ schedule: Created TSO %d (%p);", @@ -503,22 +506,30 @@ unblockOne_ (Capability *cap, StgTSO *tso, ASSERT(tso->bound->cap == tso->cap); tso->bound->cap = cap; } + tso->cap = cap; appendToRunQueue(cap,tso); - // we're holding a newly woken thread, make sure we context switch - // quickly so we can migrate it if necessary. - context_switch = 1; + + // context-switch soonish so we can migrate the new thread if + // necessary. NB. not contextSwitchCapability(cap), which would + // force a context switch immediately. + cap->context_switch = 1; } else { // we'll try to wake it up on the Capability it was last on. wakeupThreadOnCapability(cap, tso->cap, tso); } #else appendToRunQueue(cap,tso); - context_switch = 1; + + // context-switch soonish so we can migrate the new thread if + // necessary. NB. not contextSwitchCapability(cap), which would + // force a context switch immediately. + cap->context_switch = 1; #endif - debugTrace(DEBUG_sched, - "waking up thread %ld on cap %d", + postEvent (cap, EVENT_THREAD_WAKEUP, tso->id, tso->cap->no); + + debugTrace(DEBUG_sched, "waking up thread %ld on cap %d", (long)tso->id, tso->cap->no); return next; @@ -698,7 +709,7 @@ printThreadBlockage(StgTSO *tso) break; #if defined(mingw32_HOST_OS) case BlockedOnDoProc: - debugBelch("is blocked on proc (request: %ld)", tso->block_info.async_result->reqID); + debugBelch("is blocked on proc (request: %u)", tso->block_info.async_result->reqID); break; #endif case BlockedOnDelay: @@ -763,6 +774,11 @@ printThreadStatus(StgTSO *t) default: printThreadBlockage(t); } + if (t->flags & TSO_DIRTY) { + debugBelch(" (TSO_DIRTY)"); + } else if (t->flags & TSO_LINK_DIRTY) { + debugBelch(" (TSO_LINK_DIRTY)"); + } debugBelch("\n"); } }