1
0
mirror of https://github.com/systemd/systemd.git synced 2024-11-01 09:21:26 +03:00

hashmap: return more information from resize_buckets()

Return 0 if no resize was needed, 1 if successfully resized and
negative on error.
This commit is contained in:
Michal Schmidt 2014-10-15 00:36:45 +02:00
parent b3dcf58e28
commit 9700d6980f

View File

@ -369,7 +369,7 @@ static struct hashmap_entry *hash_scan(Hashmap *h, unsigned hash, const void *ke
return NULL; return NULL;
} }
static bool resize_buckets(Hashmap *h) { static int resize_buckets(Hashmap *h) {
struct hashmap_entry **n, *i; struct hashmap_entry **n, *i;
unsigned m; unsigned m;
uint8_t nkey[HASH_KEY_SIZE]; uint8_t nkey[HASH_KEY_SIZE];
@ -377,7 +377,7 @@ static bool resize_buckets(Hashmap *h) {
assert(h); assert(h);
if (_likely_(h->n_entries*4 < h->n_buckets*3)) if (_likely_(h->n_entries*4 < h->n_buckets*3))
return false; return 0;
/* Increase by four */ /* Increase by four */
m = (h->n_entries+1)*4-1; m = (h->n_entries+1)*4-1;
@ -385,7 +385,7 @@ static bool resize_buckets(Hashmap *h) {
/* If we hit OOM we simply risk packed hashmaps... */ /* If we hit OOM we simply risk packed hashmaps... */
n = new0(struct hashmap_entry*, m); n = new0(struct hashmap_entry*, m);
if (!n) if (!n)
return false; return -ENOMEM;
/* Let's use a different randomized hash key for the /* Let's use a different randomized hash key for the
* extension, so that people cannot guess what we are using * extension, so that people cannot guess what we are using
@ -424,7 +424,7 @@ static bool resize_buckets(Hashmap *h) {
memcpy(h->hash_key, nkey, HASH_KEY_SIZE); memcpy(h->hash_key, nkey, HASH_KEY_SIZE);
return true; return 1;
} }
static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash) { static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash) {
@ -432,7 +432,7 @@ static int __hashmap_put(Hashmap *h, const void *key, void *value, unsigned hash
struct hashmap_entry *e; struct hashmap_entry *e;
if (resize_buckets(h)) if (resize_buckets(h) > 0)
hash = bucket_hash(h, key); hash = bucket_hash(h, key);
if (h->from_pool) if (h->from_pool)