X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FUpdates.h;h=abca78817d6b4b1cce225aeb8b3ff72e21eb1eea;hb=485b8d1a00a65aa565e3b30ef8f63fa2880d4093;hp=f20b0884324043d790673e178003b4f100fca2f2;hpb=081e9e53205935280f1800f113760a8a72498a6f;p=ghc-hetmet.git diff --git a/rts/Updates.h b/rts/Updates.h index f20b088..abca788 100644 --- a/rts/Updates.h +++ b/rts/Updates.h @@ -233,6 +233,10 @@ FILL_SLOP(StgClosure *p) switch (inf->type) { case BLACKHOLE: case CAF_BLACKHOLE: + goto no_slop; + // we already filled in the slop when we overwrote the thunk + // with BLACKHOLE, and also an evacuated BLACKHOLE is only the + // size of an IND. case THUNK_SELECTOR: sz = sizeofW(StgSelector) - sizeofW(StgThunkHeader); break; @@ -249,6 +253,8 @@ FILL_SLOP(StgClosure *p) for (i = 0; i < sz; i++) { ((StgThunk *)p)->payload[i] = 0; } +no_slop: + ; } #endif /* CMINUSMINUS */ @@ -277,12 +283,10 @@ FILL_SLOP(StgClosure *p) DEBUG_FILL_SLOP(p1); \ LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \ StgInd_indirectee(p1) = p2; \ - foreign "C" wb() []; \ + prim %write_barrier() []; \ bd = Bdescr(p1); \ if (bdescr_gen_no(bd) != 0 :: CInt) { \ - foreign "C" recordMutableCap(p1 "ptr", \ - MyCapability() "ptr", \ - bdescr_gen_no(bd)) [R1]; \ + recordMutableCap(p1, TO_W_(bdescr_gen_no(bd)), R1); \ SET_INFO(p1, stg_IND_OLDGEN_info); \ LDV_RECORD_CREATE(p1); \ TICK_UPD_OLD_IND(); \ @@ -294,28 +298,28 @@ FILL_SLOP(StgClosure *p) and_then; \ } #else -#define updateWithIndirection(ind_info, p1, p2, and_then) \ - { \ - bdescr *bd; \ - \ - /* cas(p1, 0, &stg_WHITEHOLE_info); */ \ - ASSERT( (P_)p1 != (P_)p2 && !closure_IND(p1) ); \ - DEBUG_FILL_SLOP(p1); \ - LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \ - ((StgInd *)p1)->indirectee = p2; \ - wb(); \ - bd = Bdescr((P_)p1); \ - if (bd->gen_no != 0) { \ - recordMutableGenLock(p1, &generations[bd->gen_no]); \ - SET_INFO(p1, &stg_IND_OLDGEN_info); \ - TICK_UPD_OLD_IND(); \ - and_then; \ - } else { \ - SET_INFO(p1, ind_info); \ - LDV_RECORD_CREATE(p1); \ - TICK_UPD_NEW_IND(); \ - and_then; \ - } \ +#define updateWithIndirection(ind_info, p1, p2, and_then) \ + { \ + bdescr *bd; \ + \ + /* cas(p1, 0, &stg_WHITEHOLE_info); */ \ + ASSERT( (P_)p1 != (P_)p2 && !closure_IND(p1) ); \ + DEBUG_FILL_SLOP(p1); \ + LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \ + ((StgInd *)p1)->indirectee = p2; \ + write_barrier(); \ + bd = Bdescr((P_)p1); \ + if (bd->gen_no != 0) { \ + recordMutableGenLock(p1, &generations[bd->gen_no]); \ + SET_INFO(p1, &stg_IND_OLDGEN_info); \ + TICK_UPD_OLD_IND(); \ + and_then; \ + } else { \ + SET_INFO(p1, ind_info); \ + LDV_RECORD_CREATE(p1); \ + TICK_UPD_NEW_IND(); \ + and_then; \ + } \ } #endif