aboutsummaryrefslogtreecommitdiff
path: root/src/core/idhash.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2023-12-29 17:43:50 -0800
committerGarrett D'Amore <garrett@damore.org>2023-12-29 18:25:04 -0800
commit3298ac1e93742e7a1ef5c4dc2e9b603dfa89d3cb (patch)
treea1051ba1a3edcd5bc6c75c9a1f43ae1a14813b45 /src/core/idhash.c
parent5954332f1690e95c329b991a25b2d89b9a44ef02 (diff)
downloadnng-3298ac1e93742e7a1ef5c4dc2e9b603dfa89d3cb.tar.gz
nng-3298ac1e93742e7a1ef5c4dc2e9b603dfa89d3cb.tar.bz2
nng-3298ac1e93742e7a1ef5c4dc2e9b603dfa89d3cb.zip
fixes #1740 Public ID hash API
This includes a manual page documenting the entire set of functions in one step. The hash is 64-bit based for now, to be maximally flexible. An internal 32-bit convenience for the common internal use is also provided (not public). The public API includes a test suite.
Diffstat (limited to 'src/core/idhash.c')
-rw-r--r--src/core/idhash.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/src/core/idhash.c b/src/core/idhash.c
index c56c8191..67ae67ea 100644
--- a/src/core/idhash.c
+++ b/src/core/idhash.c
@@ -1,5 +1,5 @@
//
-// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2023 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
//
// This software is supplied under the terms of the MIT License, a
@@ -13,7 +13,7 @@
#include <string.h>
struct nni_id_entry {
- uint32_t key;
+ uint64_t key;
uint32_t skips;
void *val;
};
@@ -24,7 +24,7 @@ static nni_id_map **id_reg_map = NULL;
static nni_mtx id_reg_mtx = NNI_MTX_INITIALIZER;
void
-nni_id_map_init(nni_id_map *m, uint32_t lo, uint32_t hi, bool randomize)
+nni_id_map_init(nni_id_map *m, uint64_t lo, uint64_t hi, bool randomize)
{
if (lo == 0) {
lo = 1;
@@ -68,7 +68,7 @@ nni_id_map_fini(nni_id_map *m)
#define ID_INDEX(m, j) ((j) & (m->id_cap - 1))
static size_t
-id_find(nni_id_map *m, uint32_t id)
+id_find(nni_id_map *m, uint64_t id)
{
size_t index;
size_t start;
@@ -98,7 +98,7 @@ id_find(nni_id_map *m, uint32_t id)
}
void *
-nni_id_get(nni_id_map *m, uint32_t id)
+nni_id_get(nni_id_map *m, uint64_t id)
{
size_t index;
if ((index = id_find(m, id)) == (size_t) -1) {
@@ -130,7 +130,8 @@ id_map_register(nni_id_map *m)
}
id_reg_len = len;
if (id_reg_map != NULL)
- memcpy(mr, id_reg_map, id_reg_num * sizeof(nni_id_map *));
+ memcpy(
+ mr, id_reg_map, id_reg_num * sizeof(nni_id_map *));
id_reg_map = mr;
}
id_reg_map[id_reg_num++] = m;
@@ -233,7 +234,7 @@ id_resize(nni_id_map *m)
}
int
-nni_id_remove(nni_id_map *m, uint32_t id)
+nni_id_remove(nni_id_map *m, uint64_t id)
{
size_t index;
size_t probe;
@@ -251,7 +252,7 @@ nni_id_remove(nni_id_map *m, uint32_t id)
nni_id_entry *entry;
// The load was increased once each hashing operation we used
- // to place the the item. Decrement it accordingly.
+ // to place the item. Decrement it accordingly.
m->id_load--;
entry = &m->id_entries[probe];
if (probe == index) {
@@ -273,7 +274,7 @@ nni_id_remove(nni_id_map *m, uint32_t id)
}
int
-nni_id_set(nni_id_map *m, uint32_t id, void *val)
+nni_id_set(nni_id_map *m, uint64_t id, void *val)
{
size_t index;
nni_id_entry *ent;
@@ -314,9 +315,9 @@ nni_id_set(nni_id_map *m, uint32_t id, void *val)
}
int
-nni_id_alloc(nni_id_map *m, uint32_t *idp, void *val)
+nni_id_alloc(nni_id_map *m, uint64_t *idp, void *val)
{
- uint32_t id;
+ uint64_t id;
int rv;
NNI_ASSERT(val != NULL);
@@ -355,3 +356,14 @@ nni_id_alloc(nni_id_map *m, uint32_t *idp, void *val)
}
return (rv);
}
+
+int
+nni_id_alloc32(nni_id_map *m, uint32_t *idp, void *val)
+{
+ uint64_t id;
+ int rv;
+ rv = nni_id_alloc(m, &id, val);
+ NNI_ASSERT(id < (1ULL << 32));
+ *idp = (uint32_t) id;
+ return (rv);
+} \ No newline at end of file