[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