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

openSUSE Build Service is sponsored by