|
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) {
|