summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSverker Eriksson <sverker@erlang.org>2021-08-23 20:51:21 +0200
committerSverker Eriksson <sverker@erlang.org>2021-08-24 20:11:18 +0200
commitfed54408530b1acb01fcbe2435c84414a5586d39 (patch)
treea27a10e1f5e8aed02e551f574c9d915d27ca3edb
parent547720ed984dd02c3541aa3e89bc23fb28d6184a (diff)
downloaderlang-fed54408530b1acb01fcbe2435c84414a5586d39.tar.gz
erts: Remove second off-heap iteration after GC
Instead reset PB_ACTIVE_WRITER flag during first off-heap iteration while looking for binary shrink candidates.
-rw-r--r--erts/emulator/beam/erl_gc.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index d3d79959df..ec66d0c3bb 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -456,17 +456,19 @@ erts_gc_after_bif_call(Process* p, Eterm result, Eterm* regs, Uint arity)
result, regs, arity);
}
-static ERTS_INLINE void reset_active_writer(Process *p)
+static ERTS_INLINE void assert_no_active_writers(Process *p)
{
+#ifdef DEBUG
struct erl_off_heap_header* ptr;
ptr = MSO(p).first;
while (ptr) {
if (ptr->thing_word == HEADER_PROC_BIN) {
ProcBin *pbp = (ProcBin*) ptr;
- pbp->flags &= ~PB_ACTIVE_WRITER;
+ ERTS_ASSERT(!(pbp->flags & PB_ACTIVE_WRITER));
}
ptr = ptr->next;
}
+#endif
}
#define ERTS_DELAY_GC_EXTRA_FREE 40
@@ -771,7 +773,7 @@ do_major_collection:
ERTS_MSACC_SET_STATE_CACHED_X(ERTS_MSACC_STATE_GC);
}
- reset_active_writer(p);
+ assert_no_active_writers(p);
/*
* Finish.
@@ -2816,6 +2818,7 @@ link_live_proc_bin(struct shrink_cand_data *shrink,
if (pbp->flags & PB_ACTIVE_WRITER) {
+ pbp->flags &= ~PB_ACTIVE_WRITER;
shrink->no_of_active++;
}
else { /* inactive */