Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
0951-erts-Remove-MAP4-and-MAP5-as-they-don-t-wo...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0951-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
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor