summaryrefslogtreecommitdiff
path: root/rts/sm/NonMovingMark.c
diff options
context:
space:
mode:
authorDouglas Wilson <douglas.wilson@gmail.com>2021-12-19 12:55:56 +0000
committerDouglas Wilson <douglas.wilson@gmail.com>2021-12-19 12:55:56 +0000
commitf61909586c832d84ac622ba571d494f6bf64580c (patch)
treeeec67524b8493a9869c5a7dedf7636e629498765 /rts/sm/NonMovingMark.c
parent887d8b4c409c06257a63751e4e84c86ddf5cc874 (diff)
downloadhaskell-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.c32
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
*********************************************************/