mirror of
https://github.com/systemd/systemd.git
synced 2024-11-14 15:21:37 +03:00
hashmap: minor hashmap_replace optimization
When hashmap_replace detects no such key exists yet, it calls hashmap_put that performs the same check again. Avoid that by splitting the core of hashmap_put into a separate function.
This commit is contained in:
parent
631b9deefb
commit
923041cb0a
@ -488,19 +488,10 @@ static bool resize_buckets(Hashmap *h) {
|
||||
return true;
|
||||
}
|
||||
|
||||
int hashmap_put(Hashmap *h, const void *key, void *value) {
|
||||
static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash) {
|
||||
/* For when we know no such entry exists yet */
|
||||
|
||||
struct hashmap_entry *e;
|
||||
unsigned hash;
|
||||
|
||||
assert(h);
|
||||
|
||||
hash = bucket_hash(h, key);
|
||||
e = hash_scan(h, hash, key);
|
||||
if (e) {
|
||||
if (e->value == value)
|
||||
return 0;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
if (resize_buckets(h))
|
||||
hash = bucket_hash(h, key);
|
||||
@ -521,6 +512,23 @@ int hashmap_put(Hashmap *h, const void *key, void *value) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int hashmap_put(Hashmap *h, const void *key, void *value) {
|
||||
struct hashmap_entry *e;
|
||||
unsigned hash;
|
||||
|
||||
assert(h);
|
||||
|
||||
hash = bucket_hash(h, key);
|
||||
e = hash_scan(h, hash, key);
|
||||
if (e) {
|
||||
if (e->value == value)
|
||||
return 0;
|
||||
return -EEXIST;
|
||||
}
|
||||
|
||||
return __hashmap_put(h, key, value, hash);
|
||||
}
|
||||
|
||||
int hashmap_replace(Hashmap *h, const void *key, void *value) {
|
||||
struct hashmap_entry *e;
|
||||
unsigned hash;
|
||||
@ -535,7 +543,7 @@ int hashmap_replace(Hashmap *h, const void *key, void *value) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return hashmap_put(h, key, value);
|
||||
return __hashmap_put(h, key, value, hash);
|
||||
}
|
||||
|
||||
int hashmap_update(Hashmap *h, const void *key, void *value) {
|
||||
|
Loading…
Reference in New Issue
Block a user