File 6291-erts-Add-ErtsInBetween.patch of Package erlang
From 84ec961084952b8dd423d2b6cdc88e0f360935a8 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Fri, 4 Mar 2022 14:04:06 +0100
Subject: [PATCH 1/4] erts: Add ErtsInBetween
---
erts/emulator/beam/erl_bif_trace.c | 3 +--
erts/emulator/beam/erl_bits.c | 7 +++----
erts/emulator/beam/sys.h | 3 +++
3 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/erts/emulator/beam/erl_bif_trace.c b/erts/emulator/beam/erl_bif_trace.c
index ce83101cde..9ea80d6dc0 100644
--- a/erts/emulator/beam/erl_bif_trace.c
+++ b/erts/emulator/beam/erl_bif_trace.c
@@ -1859,8 +1859,7 @@ new_seq_trace_token(Process* p, int ensure_new_heap)
Uint mature_size = p->high_water - mature;
Eterm* tpl = tuple_val(SEQ_TRACE_TOKEN(p));
ASSERT(arityval(tpl[0]) == 5);
- if (ErtsInArea(tpl, OLD_HEAP(p),
- (OLD_HEND(p) - OLD_HEAP(p))*sizeof(Eterm)) ||
+ if (ErtsInBetween(tpl, OLD_HEAP(p), OLD_HEND(p)) ||
ErtsInArea(tpl, mature, mature_size*sizeof(Eterm))) {
hp = HAlloc(p, 6);
sys_memcpy(hp, tpl, 6*sizeof(Eterm));
diff --git a/erts/emulator/beam/erl_bits.c b/erts/emulator/beam/erl_bits.c
index e23d8d7697..108842a54f 100644
--- a/erts/emulator/beam/erl_bits.c
+++ b/erts/emulator/beam/erl_bits.c
@@ -1380,8 +1380,7 @@ static ERTS_INLINE
void increase_proc_bin_sz(Process* p, ProcBin* pb, Uint new_size)
{
if (new_size > pb->size) {
- if (ErtsInArea(pb, OLD_HEAP(p), ((OLD_HTOP(p) - OLD_HEAP(p))
- * sizeof(Eterm)))) {
+ if (ErtsInBetween(pb, OLD_HEAP(p), OLD_HTOP(p))) {
BIN_OLD_VHEAP(p) += (new_size / sizeof(Eterm) -
pb->size / sizeof(Eterm));
}
@@ -1734,8 +1733,8 @@ erts_bs_private_append_checked(Process* p, Eterm bin, Uint build_size_in_bits, U
sys_memcpy(bptr->orig_bytes, binp->orig_bytes, binp->orig_size);
/* If the subbinary is on the mature or old heap, we need to also move it */
- if (ErtsInArea(sb, OLD_HEAP(p), ((char *)OLD_HTOP(p)) - ((char *)OLD_HEAP(p))) ||
- ErtsInArea(sb, HEAP_START(p), ((char *)HIGH_WATER(p)) - ((char *)HEAP_START(p)))) {
+ if (ErtsInBetween(sb, OLD_HEAP(p), OLD_HTOP(p)) ||
+ ErtsInBetween(sb, HEAP_START(p), HIGH_WATER(p))) {
sz += ERL_SUB_BIN_SIZE;
}
diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h
index cdbd943367..ab867b3fe8 100644
--- a/erts/emulator/beam/sys.h
+++ b/erts/emulator/beam/sys.h
@@ -105,6 +105,9 @@
#define ErtsInArea(ptr,start,nbytes) \
((UWord)((char*)(ptr) - (char*)(start)) < (nbytes))
+#define ErtsInBetween(ptr,start,end) \
+ ErtsInArea(ptr, start, (char*)(end) - (char*)(start))
+
#define ErtsContainerStruct(ptr, type, member) \
((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
--
2.34.1