From 1a75f7795e8d5e2b7cbc27e39eade1ee04668c19 Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Tue, 24 Nov 2015 01:20:57 +0100 Subject: libfshelp: improve translator list Use the path names of active translators as keys in the hash table. * libfshelp/translator-list.c (hash, compare): New functions. (translator_ihash): Use generalized key interface. (fshelp_set_active_translator): Update accordingly. (fshelp_remove_active_translator): Likewise. --- libfshelp/translator-list.c | 59 +++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 24 deletions(-) (limited to 'libfshelp') diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c index e043a670..c730ecd1 100644 --- a/libfshelp/translator-list.c +++ b/libfshelp/translator-list.c @@ -1,6 +1,6 @@ /* A list of active translators. - Copyright (C) 2013,14 Free Software Foundation, Inc. + Copyright (C) 2013,14,15 Free Software Foundation, Inc. Written by Justus Winter <4winter@informatik.uni-hamburg.de> @@ -39,17 +39,11 @@ struct translator mach_port_t active; }; -/* The list of active translators. */ -static struct hurd_ihash translator_ihash - = HURD_IHASH_INITIALIZER (HURD_IHASH_NO_LOCP); - -/* The lock protecting the translator_ihash. */ -static pthread_mutex_t translator_ihash_lock = PTHREAD_MUTEX_INITIALIZER; - +/* The hash table requires some callback functions. */ static void -translator_ihash_cleanup (void *element, void *arg) +cleanup (void *value, void *arg) { - struct translator *translator = element; + struct translator *translator = value; if (translator->pi) ports_port_deref (translator->pi); @@ -58,6 +52,26 @@ translator_ihash_cleanup (void *element, void *arg) free (translator); } +static hurd_ihash_key_t +hash (const void *key) +{ + return (hurd_ihash_key_t) hurd_ihash_hash32 (key, strlen (key), 0); +} + +static int +compare (const void *a, const void *b) +{ + return strcmp ((const char *) a, (const char *) b) == 0; +} + +/* The list of active translators. */ +static struct hurd_ihash translator_ihash + = HURD_IHASH_INITIALIZER_GKI (HURD_IHASH_NO_LOCP, cleanup, NULL, + hash, compare); + +/* The lock protecting the translator_ihash. */ +static pthread_mutex_t translator_ihash_lock = PTHREAD_MUTEX_INITIALIZER; + /* Record an active translator being bound to the given file name NAME. ACTIVE is the control port of the translator. */ error_t @@ -66,20 +80,16 @@ fshelp_set_active_translator (struct port_info *pi, mach_port_t active) { error_t err = 0; - pthread_mutex_lock (&translator_ihash_lock); - - if (! translator_ihash.cleanup) - hurd_ihash_set_cleanup (&translator_ihash, translator_ihash_cleanup, NULL); + struct translator *t; + hurd_ihash_locp_t slot; - struct translator *t = NULL; - HURD_IHASH_ITERATE (&translator_ihash, value) - { - t = value; - if (strcmp (name, t->name) == 0) - goto update; /* Entry exists. */ - } + pthread_mutex_lock (&translator_ihash_lock); + t = hurd_ihash_locp_find (&translator_ihash, (hurd_ihash_key_t) name, + &slot); + if (t) + goto update; /* Entry exists. */ - t = malloc (sizeof (struct translator)); + t = malloc (sizeof *t); if (! t) { err = errno; @@ -96,7 +106,8 @@ fshelp_set_active_translator (struct port_info *pi, goto out; } - err = hurd_ihash_add (&translator_ihash, (hurd_ihash_key_t) t, t); + err = hurd_ihash_locp_add (&translator_ihash, slot, + (hurd_ihash_key_t) t->name, t); if (err) goto out; @@ -158,7 +169,7 @@ fshelp_remove_active_translator (mach_port_t active) } if (t) - hurd_ihash_remove (&translator_ihash, (hurd_ihash_key_t) t); + hurd_ihash_remove (&translator_ihash, (hurd_ihash_key_t) t->name); pthread_mutex_unlock (&translator_ihash_lock); return err; -- cgit v1.2.3