File 0213-erts-Remove-MAP4-and-MAP5-as-they-don-t-work-in-debu.patch of Package erlang
From 535d63ea47d45a8ac868ca55237a6f3c515a6d85 Mon Sep 17 00:00:00 2001
From: Lukas Larsson <lukas@erlang.org>
Date: Thu, 31 Mar 2022 11:28:42 +0200
Subject: [PATCH 2/2] erts: Remove MAP4 and MAP5 as they don't work in debug
---
erts/emulator/beam/erl_bif_atomics.c | 30 +++++++-----
erts/emulator/beam/erl_term.h | 18 +------
erts/emulator/beam/utils.c | 70 +++++++++++++++-------------
3 files changed, 57 insertions(+), 61 deletions(-)
diff --git a/erts/emulator/beam/erl_bif_atomics.c b/erts/emulator/beam/erl_bif_atomics.c
index 3fd0fc8dcd..fddc51712a 100644
--- a/erts/emulator/beam/erl_bif_atomics.c
+++ b/erts/emulator/beam/erl_bif_atomics.c
@@ -227,16 +227,19 @@ BIF_RETTYPE atomics_compare_exchange_4(BIF_ALIST_4)
BIF_RETTYPE atomics_info_1(BIF_ALIST_1)
{
AtomicsRef* p;
- Uint hsz = MAP4_SZ;
+ Uint hsz = 0;
Eterm *hp;
Uint64 max;
Sint64 min;
UWord memory;
- Eterm max_val, min_val, sz_val, mem_val;
+ Eterm keys[4], values[4], res;
+ ErtsHeapFactory factory;
if (!get_ref(BIF_ARG_1, &p))
BIF_ERROR(BIF_P, BADARG);
+ erts_factory_proc_init(&factory, BIF_P);
+
max = p->is_signed ? ERTS_SINT64_MAX : ERTS_UINT64_MAX;
min = p->is_signed ? ERTS_SINT64_MIN : 0;
memory = erts_magic_ref2bin(BIF_ARG_1)->orig_size;
@@ -246,14 +249,17 @@ BIF_RETTYPE atomics_info_1(BIF_ALIST_1)
erts_bld_uword(NULL, &hsz, p->vlen);
erts_bld_uword(NULL, &hsz, memory);
- hp = HAlloc(BIF_P, hsz);
- max_val = erts_bld_uint64(&hp, NULL, max);
- min_val = erts_bld_sint64(&hp, NULL, min);
- sz_val = erts_bld_uword(&hp, NULL, p->vlen);
- mem_val = erts_bld_uword(&hp, NULL, memory);
-
- return MAP4(hp, am_max, max_val,
- am_memory, mem_val,
- am_min, min_val,
- am_size, sz_val);
+ hp = erts_produce_heap(&factory, hsz, MAP4_SZ);
+ keys[0] = am_max;
+ values[0] = erts_bld_uint64(&hp, NULL, max);
+ keys[1] = am_min;
+ values[1] = erts_bld_sint64(&hp, NULL, min);
+ keys[2] = am_size;
+ values[2] = erts_bld_uword(&hp, NULL, p->vlen);
+ keys[3] = am_memory;
+ values[3] = erts_bld_uword(&hp, NULL, memory);
+
+ res = erts_map_from_ks_and_vs(&factory, keys, values, 4);
+ erts_factory_close(&factory);
+ return res;
}
diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h
index 3080a43bae..7f428b49f9 100644
--- a/erts/emulator/beam/erl_term.h
+++ b/erts/emulator/beam/erl_term.h
@@ -1291,22 +1291,8 @@ _ET_DECLARE_CHECKED(struct erl_node_*,external_ref_node,Eterm)
(hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
(hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
make_flatmap(hp))
-#define MAP4(hp, k1, v1, k2, v2, k3, v3, k4, v4) \
- (MAP_HEADER(hp, 4, TUPLE4(hp+4+MAP_HEADER_FLATMAP_SZ, k1, k2, k3, k4)), \
- (hp)[MAP_HEADER_FLATMAP_SZ+0] = v1, \
- (hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
- (hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
- (hp)[MAP_HEADER_FLATMAP_SZ+3] = v4, \
- make_flatmap(hp))
-#define MAP5(hp, k1, v1, k2, v2, k3, v3, k4, v4, k5, v5) \
- (MAP_HEADER(hp, 5, TUPLE5(hp+5+MAP_HEADER_FLATMAP_SZ, k1, k2, k3, k4, k5)), \
- (hp)[MAP_HEADER_FLATMAP_SZ+0] = v1, \
- (hp)[MAP_HEADER_FLATMAP_SZ+1] = v2, \
- (hp)[MAP_HEADER_FLATMAP_SZ+2] = v3, \
- (hp)[MAP_HEADER_FLATMAP_SZ+3] = v4, \
- (hp)[MAP_HEADER_FLATMAP_SZ+4] = v5, \
- make_flatmap(hp))
-
+/* MAP4 and greater have to be created with erts_map_from_ks_and_vs as in the
+ debug emulator maps > 3 are hashmaps. */
/* number tests */
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index 3185fc6f75..756f103287 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -2461,9 +2461,9 @@ make_internal_hash(Eterm term, Uint32 salt)
{log, Level, format, [args], #{ gl, pid, time, error_logger => #{tag, emulator => true} }}
*/
static Eterm
-do_allocate_logger_message(Eterm gleader, ErtsMonotonicTime *ts, Eterm *pid,
- Eterm **hp, ErlOffHeap **ohp,
- ErlHeapFragment **bp, Uint sz)
+do_allocate_logger_message(ErtsHeapFactory *factory,
+ Eterm gleader, ErtsMonotonicTime *ts,
+ Eterm *pid, Uint sz)
{
Uint gl_sz;
gl_sz = IS_CONST(gleader) ? 0 : size_object(gleader);
@@ -2482,19 +2482,25 @@ do_allocate_logger_message(Eterm gleader, ErtsMonotonicTime *ts, Eterm *pid,
*ts = ERTS_MONOTONIC_TO_USEC(erts_os_system_time());
erts_bld_sint64(NULL, &sz, *ts);
- *bp = new_message_buffer(sz);
- *ohp = &(*bp)->off_heap;
- *hp = (*bp)->mem;
-
- return copy_struct(gleader,gl_sz,hp,*ohp);
+ erts_factory_heap_frag_init(factory, new_message_buffer(sz));
+ {
+ Eterm *hp = erts_produce_heap(factory, gl_sz, 0);
+ return copy_struct(gleader,gl_sz,&hp,factory->off_heap);
+ }
}
-static void do_send_logger_message(Eterm gl, Eterm tag, Eterm format, Eterm args,
- ErtsMonotonicTime ts, Eterm pid,
- Eterm *hp, ErlHeapFragment *bp)
+static void do_send_logger_message(ErtsHeapFactory *factory,
+ Eterm gl, Eterm tag, Eterm format, Eterm args,
+ ErtsMonotonicTime ts, Eterm pid)
{
+ Eterm *hp;
Eterm message, md, el_tag = tag;
- Eterm time = erts_bld_sint64(&hp, NULL, ts);
+ Uint sz = 0;
+ Eterm time;
+
+ erts_bld_sint64(NULL, &sz, ts);
+ hp = erts_produce_heap(factory, sz, 0);
+ time = erts_bld_sint64(&hp, NULL, ts);
/* This mapping is needed for the backwards compatible error_logger */
switch (tag) {
@@ -2505,42 +2511,40 @@ static void do_send_logger_message(Eterm gl, Eterm tag, Eterm format, Eterm args
break;
}
+ hp = erts_produce_heap(factory, MAP2_SZ, 0);
md = MAP2(hp, am_emulator, am_true, ERTS_MAKE_AM("tag"), el_tag);
- hp += MAP2_SZ;
if (is_nil(gl) && is_non_value(pid)) {
/* no gl and no pid, probably from a port */
+ hp = erts_produce_heap(factory, MAP2_SZ, 0);
md = MAP2(hp,
am_error_logger, md,
am_time, time);
- hp += MAP2_SZ;
pid = NIL;
} else if (is_nil(gl)) {
/* no gl */
+ hp = erts_produce_heap(factory, MAP3_SZ, 0);
md = MAP3(hp,
am_error_logger, md,
am_pid, pid,
am_time, time);
- hp += MAP3_SZ;
} else if (is_non_value(pid)) {
/* no gl */
+ hp = erts_produce_heap(factory, MAP3_SZ, 0);
md = MAP3(hp,
am_error_logger, md,
ERTS_MAKE_AM("gl"), gl,
am_time, time);
- hp += MAP3_SZ;
pid = NIL;
} else {
- md = MAP4(hp,
- am_error_logger, md,
- ERTS_MAKE_AM("gl"), gl,
- am_pid, pid,
- am_time, time);
- hp += MAP4_SZ;
+ Eterm keys[] = { am_error_logger, ERTS_MAKE_AM("gl"), am_pid, am_time };
+ Eterm values[] = { md, gl, pid, time };
+ md = erts_map_from_ks_and_vs(factory, keys, values, 4);
}
-
+ hp = erts_produce_heap(factory, 6, 0);
message = TUPLE5(hp, am_log, tag, format, args, md);
- erts_queue_error_logger_message(pid, message, bp);
+ erts_factory_close(factory);
+ erts_queue_error_logger_message(pid, message, factory->heap_frags);
}
static int do_send_to_logger(Eterm tag, Eterm gl, char *buf, size_t len)
@@ -2548,23 +2552,23 @@ static int do_send_to_logger(Eterm tag, Eterm gl, char *buf, size_t len)
Uint sz;
Eterm list, args, format, pid;
ErtsMonotonicTime ts;
+ ErtsHeapFactory factory;
Eterm *hp = NULL;
- ErlOffHeap *ohp = NULL;
- ErlHeapFragment *bp = NULL;
sz = len * 2 /* message list */ + 2 /* cons surrounding message list */
+ 8 /* "~s~n" */;
/* gleader size is accounted and allocated next */
- gl = do_allocate_logger_message(gl, &ts, &pid, &hp, &ohp, &bp, sz);
+ gl = do_allocate_logger_message(&factory, gl, &ts, &pid, sz);
+ hp = erts_produce_heap(&factory, sz, 0);
list = buf_to_intlist(&hp, buf, len, NIL);
args = CONS(hp,list,NIL);
hp += 2;
format = buf_to_intlist(&hp, "~s~n", 4, NIL);
- do_send_logger_message(gl, tag, format, args, ts, pid, hp, bp);
+ do_send_logger_message(&factory, gl, tag, format, args, ts, pid);
return 0;
}
@@ -2577,8 +2581,7 @@ static int do_send_term_to_logger(Eterm tag, Eterm gl,
ErtsMonotonicTime ts;
Eterm *hp = NULL;
- ErlOffHeap *ohp = NULL;
- ErlHeapFragment *bp = NULL;
+ ErtsHeapFactory factory;
ASSERT(len > 0);
@@ -2586,12 +2589,13 @@ static int do_send_term_to_logger(Eterm tag, Eterm gl,
sz = len * 2 /* format */ + args_sz;
/* gleader size is accounted and allocated next */
- gl = do_allocate_logger_message(gl, &ts, &pid, &hp, &ohp, &bp, sz);
+ gl = do_allocate_logger_message(&factory, gl, &ts, &pid, sz);
+ hp = erts_produce_heap(&factory, sz, 0);
format = buf_to_intlist(&hp, buf, len, NIL);
- args = copy_struct(args, args_sz, &hp, ohp);
+ args = copy_struct(args, args_sz, &hp, factory.off_heap);
- do_send_logger_message(gl, tag, format, args, ts, pid, hp, bp);
+ do_send_logger_message(&factory, gl, tag, format, args, ts, pid);
return 0;
}
--
2.34.1