diff options
Diffstat (limited to 'debian/patches/translators-list0003-libfshelp-improve-translator-list.patch')
-rw-r--r-- | debian/patches/translators-list0003-libfshelp-improve-translator-list.patch | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/debian/patches/translators-list0003-libfshelp-improve-translator-list.patch b/debian/patches/translators-list0003-libfshelp-improve-translator-list.patch new file mode 100644 index 00000000..203a2f96 --- /dev/null +++ b/debian/patches/translators-list0003-libfshelp-improve-translator-list.patch @@ -0,0 +1,127 @@ +From f2b791571de10efefd4357e4bb6bdfa4e2d0c218 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: [PATCH hurd 3/4] 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(-) + +diff --git a/libfshelp/translator-list.c b/libfshelp/translator-list.c +index 87d7f6a..fa754ae 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,18 +39,12 @@ 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) + { + error_t err; +- struct translator *translator = element; ++ struct translator *translator = value; + + if (translator->pi) + ports_port_deref (translator->pi); +@@ -60,6 +54,26 @@ translator_ihash_cleanup (void *element, void *arg) + free (translator); + } + ++static hurd_ihash_key_t ++hash (void *key) ++{ ++ const char *path = key; ++ return (hurd_ihash_key_t) hurd_ihash_fasthash32 (path, strlen (path), 0); ++} ++ ++static int ++compare (void *a, 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, 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 +@@ -68,20 +82,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; +@@ -98,7 +108,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; + +@@ -165,7 +176,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; +-- +2.1.4 + |