[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