diff options
Diffstat (limited to 'debian/patches/ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch')
-rw-r--r-- | debian/patches/ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch | 196 |
1 files changed, 0 insertions, 196 deletions
diff --git a/debian/patches/ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch b/debian/patches/ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch deleted file mode 100644 index d2926770..00000000 --- a/debian/patches/ihash-as-cache0002-libihash-optimize-lookup-or-insert-operations.patch +++ /dev/null @@ -1,196 +0,0 @@ -From a9c7fb0782e7142ae7a43385e4b166478fd40675 Mon Sep 17 00:00:00 2001 -From: Justus Winter <4winter@informatik.uni-hamburg.de> -Date: Wed, 14 May 2014 16:24:21 +0200 -Subject: [PATCH hurd 2/3] libihash: optimize lookup-or-insert operations - -If libihash is used to implement a cache, a insertion is always -preceeded by a lookup. hurd_ihash_add has to do the lookup again. - -Provide a new pair of functions, hurd_ihash_locp_add and -hurd_ihash_locp_find, that can be used in combination to avoid the -second lookup. - -* libihash/ihash.c (hurd_ihash_locp_add): New function using a -location pointer... -(hurd_ihash_locp_find): ... that has been returned by this function. -* libihash/ihash.h (hurd_ihash_locp_add): New declaration. -(hurd_ihash_locp_find): Likewise. -(hurd_ihash_locp_value): New function. ---- - libihash/ihash.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++- - libihash/ihash.h | 52 +++++++++++++++++++++++++++++++++++++ - 2 files changed, 129 insertions(+), 1 deletion(-) - -diff --git a/libihash/ihash.c b/libihash/ihash.c -index 74e9edd..a97de3e 100644 ---- a/libihash/ihash.c -+++ b/libihash/ihash.c -@@ -244,7 +244,54 @@ add_one (hurd_ihash_t ht, hurd_ihash_key_t key, hurd_ihash_value_t value) - return 0; - } - -- -+ -+/* Add VALUE to the hash table HT under the key KEY at LOCP. If there -+ already is an item under this key, call the cleanup function (if -+ any) for it before overriding the value. This function is faster -+ than hurd_ihash_add. -+ -+ If LOCP is NULL, fall back to hurd_ihash_add. Otherwise, LOCP must -+ be valid and may either be obtained from hurd_ihash_locp_find, or -+ from an item that is currently in the hash table. If an item is -+ replaced, KEY must match the key of the previous item. -+ -+ If a memory allocation error occurs, ENOMEM is returned, otherwise -+ 0. */ -+error_t -+hurd_ihash_locp_add (hurd_ihash_t ht, hurd_ihash_locp_t locp, -+ hurd_ihash_key_t key, hurd_ihash_value_t value) -+{ -+ struct _hurd_ihash_item *item = (struct _hurd_ihash_item *) locp; -+ -+ /* In case of complications, fall back to hurd_ihash_add. */ -+ if (ht->size == 0 -+ || item == NULL -+ || item->value == _HURD_IHASH_DELETED -+ || hurd_ihash_get_load (ht) > ht->max_load) -+ return hurd_ihash_add (ht, key, value); -+ -+ if (item->value == _HURD_IHASH_EMPTY) -+ { -+ item->key = key; -+ ht->nr_items += 1; -+ } -+ else -+ { -+ assert (item->key == key); -+ if (ht->cleanup) -+ (*ht->cleanup) (locp, ht->cleanup_data); -+ } -+ -+ item->value = value; -+ -+ if (ht->locp_offset != HURD_IHASH_NO_LOCP) -+ *((hurd_ihash_locp_t *) (((char *) value) + ht->locp_offset)) -+ = locp; -+ -+ return 0; -+} -+ -+ - /* Add ITEM to the hash table HT under the key KEY. If there already - is an item under this key, call the cleanup function (if any) for - it before overriding the value. If a memory allocation error -@@ -313,6 +360,35 @@ hurd_ihash_find (hurd_ihash_t ht, hurd_ihash_key_t key) - } - } - -+/* Find the item in the hash table HT with key KEY. If it is found, -+ return the location of its slot in the hash table. If it is not -+ found, this function may still return a location. -+ -+ This location pointer can always be safely accessed using -+ hurd_ihash_locp_value. If the lookup is successful, -+ hurd_ihash_locp_value will return the value related to KEY. -+ -+ If the lookup is successful, the returned location can be used with -+ hurd_ihash_locp_add to update the item, and with -+ hurd_ihash_locp_remove to remove it. -+ -+ If the lookup is not successful, the returned location can be used -+ with hurd_ihash_locp_add to add the item. -+ -+ Note that returned location is only valid until the next insertion -+ or deletion. */ -+hurd_ihash_locp_t -+hurd_ihash_locp_find (hurd_ihash_t ht, hurd_ihash_key_t key) -+{ -+ int idx; -+ -+ if (ht->size == 0) -+ return NULL; -+ -+ idx = find_index (ht, key); -+ return &ht->items[idx].value; -+} -+ - - /* Remove the entry with the key KEY from the hash table HT. If such - an entry was found and removed, 1 is returned, otherwise 0. */ -diff --git a/libihash/ihash.h b/libihash/ihash.h -index 128027a..1dbc348 100644 ---- a/libihash/ihash.h -+++ b/libihash/ihash.h -@@ -26,6 +26,7 @@ - #include <sys/types.h> - #include <limits.h> - #include <stdint.h> -+#include <stddef.h> - - - /* The type of the values corresponding to the keys. Must be a -@@ -198,10 +199,61 @@ hurd_ihash_get_load (hurd_ihash_t ht) - error_t hurd_ihash_add (hurd_ihash_t ht, hurd_ihash_key_t key, - hurd_ihash_value_t item); - -+/* Add VALUE to the hash table HT under the key KEY at LOCP. If there -+ already is an item under this key, call the cleanup function (if -+ any) for it before overriding the value. This function is faster -+ than hurd_ihash_add. -+ -+ If LOCP is NULL, fall back to hurd_ihash_add. Otherwise, LOCP must -+ be valid and may either be obtained from hurd_ihash_locp_find, or -+ from an item that is currently in the hash table. If an item is -+ replaced, KEY must match the key of the previous item. -+ -+ If a memory allocation error occurs, ENOMEM is returned, otherwise -+ 0. */ -+error_t hurd_ihash_locp_add (hurd_ihash_t ht, hurd_ihash_locp_t locp, -+ hurd_ihash_key_t key, hurd_ihash_value_t value); -+ - /* Find and return the item in the hash table HT with key KEY, or NULL - if it doesn't exist. */ - hurd_ihash_value_t hurd_ihash_find (hurd_ihash_t ht, hurd_ihash_key_t key); - -+/* Find the item in the hash table HT with key KEY. If it is found, -+ return the location of its slot in the hash table. If it is not -+ found, this function may still return a location. -+ -+ This location pointer can always be safely accessed using -+ hurd_ihash_locp_value. If the lookup is successful, -+ hurd_ihash_locp_value will return the value related to KEY. -+ -+ If the lookup is successful, the returned location can be used with -+ hurd_ihash_locp_add to update the item, and with -+ hurd_ihash_locp_remove to remove it. -+ -+ If the lookup is not successful, the returned location can be used -+ with hurd_ihash_locp_add to add the item. -+ -+ Note that returned location is only valid until the next insertion -+ or deletion. */ -+hurd_ihash_locp_t hurd_ihash_locp_find (hurd_ihash_t ht, -+ hurd_ihash_key_t key); -+ -+/* Given an hash table bucket location LOCP, return the value stored -+ there, or NULL if it is empty or LOCP is NULL. */ -+static inline void * -+hurd_ihash_locp_value (hurd_ihash_locp_t locp) -+{ -+ struct _hurd_ihash_item *item = (struct _hurd_ihash_item *) locp; -+ -+ if (item == NULL) -+ return NULL; -+ -+ if (hurd_ihash_value_valid (item->value)) -+ return item->value; -+ -+ return NULL; -+} -+ - /* Iterate over all elements in the hash table. You use this macro - with a block, for example like this: - --- -2.1.4 - |