Zbigniew Jędrzejewski-Szmek 62fe94
From 923041cb0ab7c1795e74fa1ce4b38a6114727a3c Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 62fe94
From: Michal Schmidt <mschmidt@redhat.com>
Zbigniew Jędrzejewski-Szmek 62fe94
Date: Sun, 10 Aug 2014 23:35:27 +0200
Zbigniew Jędrzejewski-Szmek 62fe94
Subject: [PATCH] hashmap: minor hashmap_replace optimization
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
When hashmap_replace detects no such key exists yet, it calls hashmap_put that
Zbigniew Jędrzejewski-Szmek 62fe94
performs the same check again. Avoid that by splitting the core of hashmap_put
Zbigniew Jędrzejewski-Szmek 62fe94
into a separate function.
Zbigniew Jędrzejewski-Szmek 62fe94
---
Zbigniew Jędrzejewski-Szmek 62fe94
 src/shared/hashmap.c | 34 +++++++++++++++++++++-------------
Zbigniew Jędrzejewski-Szmek 62fe94
 1 file changed, 21 insertions(+), 13 deletions(-)
Zbigniew Jędrzejewski-Szmek 62fe94
Zbigniew Jędrzejewski-Szmek 62fe94
diff --git a/src/shared/hashmap.c b/src/shared/hashmap.c
Zbigniew Jędrzejewski-Szmek 62fe94
index 1eadeced5c..4c517059f6 100644
Zbigniew Jędrzejewski-Szmek 62fe94
--- a/src/shared/hashmap.c
Zbigniew Jędrzejewski-Szmek 62fe94
+++ b/src/shared/hashmap.c
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -488,19 +488,10 @@ static bool resize_buckets(Hashmap *h) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return true;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-int hashmap_put(Hashmap *h, const void *key, void *value) {
Zbigniew Jędrzejewski-Szmek 62fe94
-        struct hashmap_entry *e;
Zbigniew Jędrzejewski-Szmek 62fe94
-        unsigned hash;
Zbigniew Jędrzejewski-Szmek 62fe94
-
Zbigniew Jędrzejewski-Szmek 62fe94
-        assert(h);
Zbigniew Jędrzejewski-Szmek 62fe94
+static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        /* For when we know no such entry exists yet */
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        hash = bucket_hash(h, key);
Zbigniew Jędrzejewski-Szmek 62fe94
-        e = hash_scan(h, hash, key);
Zbigniew Jędrzejewski-Szmek 62fe94
-        if (e) {
Zbigniew Jędrzejewski-Szmek 62fe94
-                if (e->value == value)
Zbigniew Jędrzejewski-Szmek 62fe94
-                        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
-                return -EEXIST;
Zbigniew Jędrzejewski-Szmek 62fe94
-        }
Zbigniew Jędrzejewski-Szmek 62fe94
+        struct hashmap_entry *e;
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
         if (resize_buckets(h))
Zbigniew Jędrzejewski-Szmek 62fe94
                 hash = bucket_hash(h, key);
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -521,6 +512,23 @@ int hashmap_put(Hashmap *h, const void *key, void *value) {
Zbigniew Jędrzejewski-Szmek 62fe94
         return 1;
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
+int hashmap_put(Hashmap *h, const void *key, void *value) {
Zbigniew Jędrzejewski-Szmek 62fe94
+        struct hashmap_entry *e;
Zbigniew Jędrzejewski-Szmek 62fe94
+        unsigned hash;
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        assert(h);
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        hash = bucket_hash(h, key);
Zbigniew Jędrzejewski-Szmek 62fe94
+        e = hash_scan(h, hash, key);
Zbigniew Jędrzejewski-Szmek 62fe94
+        if (e) {
Zbigniew Jędrzejewski-Szmek 62fe94
+                if (e->value == value)
Zbigniew Jędrzejewski-Szmek 62fe94
+                        return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
+                return -EEXIST;
Zbigniew Jędrzejewski-Szmek 62fe94
+        }
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
+        return __hashmap_put(h, key, value, hash);
Zbigniew Jędrzejewski-Szmek 62fe94
+}
Zbigniew Jędrzejewski-Szmek 62fe94
+
Zbigniew Jędrzejewski-Szmek 62fe94
 int hashmap_replace(Hashmap *h, const void *key, void *value) {
Zbigniew Jędrzejewski-Szmek 62fe94
         struct hashmap_entry *e;
Zbigniew Jędrzejewski-Szmek 62fe94
         unsigned hash;
Zbigniew Jędrzejewski-Szmek 62fe94
@@ -535,7 +543,7 @@ int hashmap_replace(Hashmap *h, const void *key, void *value) {
Zbigniew Jędrzejewski-Szmek 62fe94
                 return 0;
Zbigniew Jędrzejewski-Szmek 62fe94
         }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
-        return hashmap_put(h, key, value);
Zbigniew Jędrzejewski-Szmek 62fe94
+        return __hashmap_put(h, key, value, hash);
Zbigniew Jędrzejewski-Szmek 62fe94
 }
Zbigniew Jędrzejewski-Szmek 62fe94
 
Zbigniew Jędrzejewski-Szmek 62fe94
 int hashmap_update(Hashmap *h, const void *key, void *value) {