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