1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-22 17:35:35 +03:00

Merge pull request #33536 from teknoraver/hashmap_ensure_replace

Hashmap ensure replace
This commit is contained in:
Luca Boccassi 2024-06-29 10:31:11 +02:00 committed by GitHub
commit 317b0255ed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 52 additions and 18 deletions

View File

@ -874,6 +874,26 @@ int _ordered_hashmap_ensure_put(OrderedHashmap **h, const struct hash_ops *hash_
return ordered_hashmap_put(*h, key, value);
}
int _ordered_hashmap_ensure_replace(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS) {
int r;
r = _ordered_hashmap_ensure_allocated(h, hash_ops HASHMAP_DEBUG_PASS_ARGS);
if (r < 0)
return r;
return ordered_hashmap_replace(*h, key, value);
}
int _hashmap_ensure_replace(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS) {
int r;
r = _hashmap_ensure_allocated(h, hash_ops HASHMAP_DEBUG_PASS_ARGS);
if (r < 0)
return r;
return hashmap_replace(*h, key, value);
}
static void hashmap_free_no_clear(HashmapBase *h) {
assert(!h->has_indirect);
assert(h->n_direct_entries == 0);

View File

@ -130,14 +130,19 @@ HashmapBase* _hashmap_copy(HashmapBase *h HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_allocated(Hashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_put(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
int _ordered_hashmap_ensure_allocated(OrderedHashmap **h, const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
int _hashmap_ensure_replace(Hashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define hashmap_ensure_allocated(h, ops) _hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
#define hashmap_ensure_put(s, ops, key, value) _hashmap_ensure_put(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
#define ordered_hashmap_ensure_allocated(h, ops) _ordered_hashmap_ensure_allocated(h, ops HASHMAP_DEBUG_SRC_ARGS)
#define hashmap_ensure_replace(s, ops, key, value) _hashmap_ensure_replace(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
int _ordered_hashmap_ensure_put(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define ordered_hashmap_ensure_put(s, ops, key, value) _ordered_hashmap_ensure_put(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
int _ordered_hashmap_ensure_replace(OrderedHashmap **h, const struct hash_ops *hash_ops, const void *key, void *value HASHMAP_DEBUG_PARAMS);
#define ordered_hashmap_ensure_replace(s, ops, key, value) _ordered_hashmap_ensure_replace(s, ops, key, value HASHMAP_DEBUG_SRC_ARGS)
IteratedCache* _hashmap_iterated_cache_new(HashmapBase *h);
static inline IteratedCache* hashmap_iterated_cache_new(Hashmap *h) {
return (IteratedCache*) _hashmap_iterated_cache_new(HASHMAP_BASE(h));

View File

@ -2807,13 +2807,8 @@ int unit_watch_pidref(Unit *u, const PidRef *pid, bool exclusive) {
new_array[n] = u;
new_array[n+1] = NULL;
/* Make sure the hashmap is allocated */
r = hashmap_ensure_allocated(&u->manager->watch_pids_more, &pidref_hash_ops_free);
if (r < 0)
return r;
/* Add or replace the old array */
r = hashmap_replace(u->manager->watch_pids_more, old_pid ?: pid, new_array);
r = hashmap_ensure_replace(&u->manager->watch_pids_more, &pidref_hash_ops_free, old_pid ?: pid, new_array);
if (r < 0)
return r;

View File

@ -166,11 +166,7 @@ static int hwdb_add_property(sd_hwdb *hwdb, const struct trie_value_entry_f *ent
}
}
r = ordered_hashmap_ensure_allocated(&hwdb->properties, &string_hash_ops);
if (r < 0)
return r;
r = ordered_hashmap_replace(hwdb->properties, key, (void *)entry);
r = ordered_hashmap_ensure_replace(&hwdb->properties, &string_hash_ops, key, (void *) entry);
if (r < 0)
return r;

View File

@ -86,15 +86,9 @@ static unsigned broadcast_group_get_ref(sd_netlink *nl, unsigned group) {
}
static int broadcast_group_set_ref(sd_netlink *nl, unsigned group, unsigned n_ref) {
int r;
assert(nl);
r = hashmap_ensure_allocated(&nl->broadcast_group_refs, NULL);
if (r < 0)
return r;
return hashmap_replace(nl->broadcast_group_refs, UINT_TO_PTR(group), UINT_TO_PTR(n_ref));
return hashmap_ensure_replace(&nl->broadcast_group_refs, NULL, UINT_TO_PTR(group), UINT_TO_PTR(n_ref));
}
static int broadcast_group_join(sd_netlink *nl, unsigned group) {

View File

@ -49,6 +49,30 @@ TEST(hashmap_replace) {
ASSERT_STREQ(r, "val5");
}
TEST(hashmap_ensure_replace) {
_cleanup_hashmap_free_ Hashmap *m = NULL;
_cleanup_free_ char *val1 = NULL, *val2 = NULL;
val1 = strdup("val1");
ASSERT_NOT_NULL(val1);
val2 = strdup("val2");
ASSERT_NOT_NULL(val2);
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, val1, val2));
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 1", val1));
ASSERT_STREQ(hashmap_get(m, "key 1"), "val1");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 2", val2));
ASSERT_STREQ(hashmap_get(m, "key 2"), "val2");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 3", val1));
ASSERT_STREQ(hashmap_get(m, "key 3"), "val1");
ASSERT_OK(hashmap_ensure_replace(&m, &string_hash_ops, "key 3", val2));
ASSERT_STREQ(hashmap_get(m, "key 3"), "val2");
}
TEST(hashmap_copy) {
_cleanup_hashmap_free_ Hashmap *m = NULL;
_cleanup_hashmap_free_free_ Hashmap *copy = NULL;