[DTrace-devel] [PATCH 11/20] Replace dt_strtab_hash() with str2hval() in string table handling
Kris Van Hees
kris.van.hees at oracle.com
Tue Jun 1 22:48:03 PDT 2021
We only need one single function that calculates a hash value for a
string. Since we have a generic one (str2hval), the strtab code
should use that one instead of hasing its own custom function.
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_strtab.c | 29 +++++------------------------
libdtrace/dt_strtab.h | 1 -
libdtrace/dt_symbol_modops.h | 2 +-
3 files changed, 6 insertions(+), 26 deletions(-)
diff --git a/libdtrace/dt_strtab.c b/libdtrace/dt_strtab.c
index 624b0934..605b21ae 100644
--- a/libdtrace/dt_strtab.c
+++ b/libdtrace/dt_strtab.c
@@ -11,6 +11,7 @@
#include <assert.h>
#include <dt_strtab.h>
+#include <dt_string.h>
#include <dt_impl.h>
static int
@@ -105,28 +106,6 @@ dt_strtab_destroy(dt_strtab_t *sp)
free(sp);
}
-ulong_t
-dt_strtab_hash(const char *key, size_t *len)
-{
- ulong_t g, h = 0;
- const char *p;
- size_t n = 0;
-
- for (p = key; *p != '\0'; p++, n++) {
- h = (h << 4) + *p;
-
- if ((g = (h & 0xf0000000)) != 0) {
- h ^= (g >> 24);
- h ^= g;
- }
- }
-
- if (len != NULL)
- *len = n;
-
- return h;
-}
-
static int
dt_strtab_compare(dt_strtab_t *sp, dt_strhash_t *hp,
const char *str, size_t len)
@@ -199,7 +178,8 @@ dt_strtab_index(dt_strtab_t *sp, const char *str)
if (str == NULL || str[0] == '\0')
return 0; /* The empty string is always at offset 0. */
- h = dt_strtab_hash(str, &len) % sp->str_hashsz;
+ len = strlen(str);
+ h = str2hval(str, 0) % sp->str_hashsz;
for (hp = sp->str_hash[h]; hp != NULL; hp = hp->str_next) {
if (dt_strtab_compare(sp, hp, str, len + 1) == 0)
@@ -223,7 +203,8 @@ dt_strtab_insert(dt_strtab_t *sp, const char *str)
if ((off = dt_strtab_index(sp, str)) != -1)
return off;
- h = dt_strtab_hash(str, &len) % sp->str_hashsz;
+ len = strlen(str);
+ h = str2hval(str, 0) % sp->str_hashsz;
/*
* Create a new hash bucket, initialize it, and insert it at the front
diff --git a/libdtrace/dt_strtab.h b/libdtrace/dt_strtab.h
index 8f631fac..5c92deee 100644
--- a/libdtrace/dt_strtab.h
+++ b/libdtrace/dt_strtab.h
@@ -44,7 +44,6 @@ extern size_t dt_strtab_size(const dt_strtab_t *);
extern ssize_t dt_strtab_copystr(const char *, size_t, size_t, char *);
extern ssize_t dt_strtab_write(const dt_strtab_t *,
dt_strtab_write_f *, void *);
-extern ulong_t dt_strtab_hash(const char *, size_t *);
#ifdef __cplusplus
}
diff --git a/libdtrace/dt_symbol_modops.h b/libdtrace/dt_symbol_modops.h
index 48a0994a..fb929c66 100644
--- a/libdtrace/dt_symbol_modops.h
+++ b/libdtrace/dt_symbol_modops.h
@@ -119,7 +119,7 @@ BITIZE(dt_module_symname)(dt_module_t *dmp, const char *name,
if (dmp->dm_nsymelems == 0)
return NULL;
- h = dt_strtab_hash(name, NULL) % dmp->dm_nsymbuckets;
+ h = str2hval(name, 0) % dmp->dm_nsymbuckets;
for (i = dmp->dm_symbuckets[h]; i != 0; i = dmsp->dms_next) {
dmsp = &dmp->dm_symchains[i];
--
2.31.1
More information about the DTrace-devel
mailing list