Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
0634-erts-Add-erts_usort_flatmap-for-usage-by-p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0634-erts-Add-erts_usort_flatmap-for-usage-by-pam.patch of Package erlang
From a4185325e4ce1dfa9c1c5b3bb720b04266d683e8 Mon Sep 17 00:00:00 2001 From: Lukas Larsson <lukas@erlang.org> Date: Thu, 12 Aug 2021 16:34:06 +0200 Subject: [PATCH 4/6] erts: Add erts_usort_flatmap for usage by pam --- erts/emulator/beam/erl_map.c | 38 ++++++++++++++++++++++++++++++++++++ erts/emulator/beam/erl_map.h | 1 + 2 files changed, 39 insertions(+) diff --git a/erts/emulator/beam/erl_map.c b/erts/emulator/beam/erl_map.c index d0d455e2d0..395c4d9ca9 100644 --- a/erts/emulator/beam/erl_map.c +++ b/erts/emulator/beam/erl_map.c @@ -3018,6 +3018,44 @@ int erts_validate_and_sort_flatmap(flatmap_t* mp) return 1; } +void erts_usort_flatmap(flatmap_t* mp) +{ + Eterm *ks = flatmap_get_keys(mp); + Eterm *vs = flatmap_get_values(mp); + Uint sz = flatmap_get_size(mp); + Uint ix,jx; + Eterm tmp; + Sint c; + + /* sort and shrink */ + + for (ix = 1; ix < sz; ix++) { + jx = ix; + while( jx > 0 && (c = CMP_TERM(ks[jx],ks[jx-1])) <= 0 ) { + /* identical key -> remove it */ + if (c == 0) { + sys_memmove(ks+jx-1,ks+jx,(sz-ix)*sizeof(Eterm)); + sys_memmove(vs+jx-1,vs+jx,(sz-ix)*sizeof(Eterm)); + sz--; + ix--; + break; + } + + tmp = ks[jx]; + ks[jx] = ks[jx - 1]; + ks[jx - 1] = tmp; + + tmp = vs[jx]; + vs[jx] = vs[jx - 1]; + vs[jx - 1] = tmp; + + jx--; + } + } + mp->size = sz; + *tuple_val(mp->keys) = make_arityval(sz); +} + #if 0 /* Can't get myself to remove this beautiful piece of code for probabilistic overestimation of nr of nodes in a hashmap */ diff --git a/erts/emulator/beam/erl_map.h b/erts/emulator/beam/erl_map.h index 980cf246c4..c54a516af0 100644 --- a/erts/emulator/beam/erl_map.h +++ b/erts/emulator/beam/erl_map.h @@ -91,6 +91,7 @@ Eterm erts_hashmap_insert_up(Eterm *hp, Eterm key, Eterm value, Uint *upsz, struct ErtsEStack_ *sp); int erts_validate_and_sort_flatmap(flatmap_t* map); +void erts_usort_flatmap(flatmap_t* map); void hashmap_iterator_init(struct ErtsWStack_* s, Eterm node, int reverse); Eterm* hashmap_iterator_next(struct ErtsWStack_* s); Eterm* hashmap_iterator_prev(struct ErtsWStack_* s); -- 2.31.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