diff options
Diffstat (limited to 'rts')
-rw-r--r-- | rts/sm/NonMovingMark.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c index b7ab772bdd..e236056092 100644 --- a/rts/sm/NonMovingMark.c +++ b/rts/sm/NonMovingMark.c @@ -567,9 +567,11 @@ inline void updateRemembSetPushThunk(Capability *cap, StgThunk *thunk) { const StgInfoTable *info; do { - info = get_volatile_itbl((StgClosure *) thunk); - } while (info->type == WHITEHOLE); - updateRemembSetPushThunkEager(cap, (StgThunkInfoTable *) info, thunk); + info = *(StgInfoTable* volatile*) &thunk->header.info; + } while (info == &stg_WHITEHOLE_info); + + const StgThunkInfoTable *thunk_info = THUNK_INFO_PTR_TO_STRUCT(info); + updateRemembSetPushThunkEager(cap, thunk_info, thunk); } /* Push the free variables of a thunk to the update remembered set. @@ -1229,7 +1231,7 @@ mark_closure (MarkQueue *queue, const StgClosure *p0, StgClosure **origin) goto done; case WHITEHOLE: - while (get_volatile_itbl(p)->type == WHITEHOLE); + while (*(StgInfoTable* volatile*) &p->header.info == &stg_WHITEHOLE_info); // busy_wait_nop(); // FIXME goto try_again; @@ -1588,7 +1590,7 @@ mark_closure (MarkQueue *queue, const StgClosure *p0, StgClosure **origin) } case WHITEHOLE: - while (get_volatile_itbl(p)->type == WHITEHOLE); + while (*(StgInfoTable* volatile*) &p->header.info == &stg_WHITEHOLE_info); goto try_again; case COMPACT_NFDATA: |