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:
commit
317b0255ed
@ -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);
|
||||
|
@ -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));
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user