diff options
author | Douglas Wilson <douglas.wilson@gmail.com> | 2021-12-19 12:55:56 +0000 |
---|---|---|
committer | Douglas Wilson <douglas.wilson@gmail.com> | 2021-12-19 12:55:56 +0000 |
commit | f61909586c832d84ac622ba571d494f6bf64580c (patch) | |
tree | eec67524b8493a9869c5a7dedf7636e629498765 /rts/sm/NonMovingMark.c | |
parent | 887d8b4c409c06257a63751e4e84c86ddf5cc874 (diff) | |
download | haskell-wip/rts-inline.tar.gz |
rts: Address failures to inlinewip/rts-inline
Diffstat (limited to 'rts/sm/NonMovingMark.c')
-rw-r--r-- | rts/sm/NonMovingMark.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c index 2fd85dc4f0..cbffcdda60 100644 --- a/rts/sm/NonMovingMark.c +++ b/rts/sm/NonMovingMark.c @@ -689,21 +689,26 @@ STATIC_INLINE bool needs_upd_rem_set_mark(StgClosure *p) } } +static void finish_upd_rem_set_mark_large(bdescr* bd) { + // Someone else may have already marked it. + ACQUIRE_LOCK(&nonmoving_large_objects_mutex); + if (! (bd->flags & BF_MARKED)) { + bd->flags |= BF_MARKED; + dbl_link_remove(bd, &nonmoving_large_objects); + dbl_link_onto(bd, &nonmoving_marked_large_objects); + n_nonmoving_large_blocks -= bd->blocks; + n_nonmoving_marked_large_blocks += bd->blocks; + } + RELEASE_LOCK(&nonmoving_large_objects_mutex); +} + /* Set the mark bit; only to be called *after* we have fully marked the closure */ STATIC_INLINE void finish_upd_rem_set_mark(StgClosure *p) { bdescr *bd = Bdescr((StgPtr) p); if (bd->flags & BF_LARGE) { - // Someone else may have already marked it. - ACQUIRE_LOCK(&nonmoving_large_objects_mutex); - if (! (bd->flags & BF_MARKED)) { - bd->flags |= BF_MARKED; - dbl_link_remove(bd, &nonmoving_large_objects); - dbl_link_onto(bd, &nonmoving_marked_large_objects); - n_nonmoving_large_blocks -= bd->blocks; - n_nonmoving_marked_large_blocks += bd->blocks; - } - RELEASE_LOCK(&nonmoving_large_objects_mutex); + // This function is extracted so that this function can be inline + finish_upd_rem_set_mark_large(bd); } else { struct NonmovingSegment *seg = nonmovingGetSegment((StgPtr) p); nonmoving_block_idx block_idx = nonmovingGetBlockIdx((StgPtr) p); @@ -748,6 +753,13 @@ void updateRemembSetPushStack(Capability *cap, StgStack *stack) } } +void updateRemembSetPushMessageThrowTo(Capability *cap, MessageThrowTo *m) { + updateRemembSetPushClosure(cap, (StgClosure *) m->link); + updateRemembSetPushClosure(cap, (StgClosure *) m->source); + updateRemembSetPushClosure(cap, (StgClosure *) m->target); + updateRemembSetPushClosure(cap, (StgClosure *) m->exception); +} + /********************************************************* * Pushing to the mark queue *********************************************************/ |