From 7408b39235bccdcde48df2a73337ff976fbc09b7 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 11 Mar 2010 09:57:44 +0000 Subject: Use message-passing to implement throwTo in the RTS This replaces some complicated locking schemes with message-passing in the implementation of throwTo. The benefits are - previously it was impossible to guarantee that a throwTo from a thread running on one CPU to a thread running on another CPU would be noticed, and we had to rely on the GC to pick up these forgotten exceptions. This no longer happens. - the locking regime is simpler (though the code is about the same size) - threads can be unblocked from a blocked_exceptions queue without having to traverse the whole queue now. It's a rare case, but replaces an O(n) operation with an O(1). - generally we move in the direction of sharing less between Capabilities (aka HECs), which will become important with other changes we have planned. Also in this patch I replaced several STM-specific closure types with a generic MUT_PRIM closure type, which allowed a lot of code in the GC and other places to go away, hence the line-count reduction. The message-passing changes resulted in about a net zero line-count difference. --- rts/sm/Sanity.c | 44 ++------------------------------------------ 1 file changed, 2 insertions(+), 42 deletions(-) (limited to 'rts/sm/Sanity.c') diff --git a/rts/sm/Sanity.c b/rts/sm/Sanity.c index 442fee1f7c..11d5424431 100644 --- a/rts/sm/Sanity.c +++ b/rts/sm/Sanity.c @@ -307,7 +307,8 @@ checkClosure( StgClosure* p ) case IND_OLDGEN_PERM: case BLACKHOLE: case CAF_BLACKHOLE: - case STABLE_NAME: + case PRIM: + case MUT_PRIM: case MUT_VAR_CLEAN: case MUT_VAR_DIRTY: case CONSTR_STATIC: @@ -416,39 +417,6 @@ checkClosure( StgClosure* p ) checkTSO((StgTSO *)p); return tso_sizeW((StgTSO *)p); - case TVAR_WATCH_QUEUE: - { - StgTVarWatchQueue *wq = (StgTVarWatchQueue *)p; - ASSERT(LOOKS_LIKE_CLOSURE_PTR(wq->next_queue_entry)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(wq->prev_queue_entry)); - return sizeofW(StgTVarWatchQueue); - } - - case INVARIANT_CHECK_QUEUE: - { - StgInvariantCheckQueue *q = (StgInvariantCheckQueue *)p; - ASSERT(LOOKS_LIKE_CLOSURE_PTR(q->invariant)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(q->my_execution)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(q->next_queue_entry)); - return sizeofW(StgInvariantCheckQueue); - } - - case ATOMIC_INVARIANT: - { - StgAtomicInvariant *invariant = (StgAtomicInvariant *)p; - ASSERT(LOOKS_LIKE_CLOSURE_PTR(invariant->code)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(invariant->last_execution)); - return sizeofW(StgAtomicInvariant); - } - - case TVAR: - { - StgTVar *tv = (StgTVar *)p; - ASSERT(LOOKS_LIKE_CLOSURE_PTR(tv->current_value)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(tv->first_watch_queue_entry)); - return sizeofW(StgTVar); - } - case TREC_CHUNK: { nat i; @@ -461,14 +429,6 @@ checkClosure( StgClosure* p ) } return sizeofW(StgTRecChunk); } - - case TREC_HEADER: - { - StgTRecHeader *trec = (StgTRecHeader *)p; - ASSERT(LOOKS_LIKE_CLOSURE_PTR(trec -> enclosing_trec)); - ASSERT(LOOKS_LIKE_CLOSURE_PTR(trec -> current_chunk)); - return sizeofW(StgTRecHeader); - } default: barf("checkClosure (closure type %d)", info->type); -- cgit v1.2.1