[DTrace-devel] [PATCH v2 11/20] Replace dt_strtab_hash() with str2hval() in string table handling
Eugene Loh
eugene.loh at oracle.com
Thu Jun 3 16:00:03 PDT 2021
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
though "hasing" in the commit msg should be either having or using.
On 6/3/21 11:17 AM, Kris Van Hees wrote:
> 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 | 3 +--
> libdtrace/dt_symbol_modops.h | 4 ++--
> 3 files changed, 8 insertions(+), 28 deletions(-)
>
> diff --git a/libdtrace/dt_strtab.c b/libdtrace/dt_strtab.c
> index ff32606f..04d0267e 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..9cde73b9 100644
> --- a/libdtrace/dt_strtab.h
> +++ b/libdtrace/dt_strtab.h
> @@ -1,6 +1,6 @@
> /*
> * Oracle Linux DTrace.
> - * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2006, 2021, Oracle and/or its affiliates. All rights reserved.
> * Licensed under the Universal Permissive License v 1.0 as shown at
> * http://oss.oracle.com/licenses/upl.
> */
> @@ -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..d05cb172 100644
> --- a/libdtrace/dt_symbol_modops.h
> +++ b/libdtrace/dt_symbol_modops.h
> @@ -1,6 +1,6 @@
> /*
> * Oracle Linux DTrace.
> - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved.
> * Licensed under the Universal Permissive License v 1.0 as shown at
> * http://oss.oracle.com/licenses/upl.
> */
> @@ -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];
More information about the DTrace-devel
mailing list