OrderedSet **ret,
sd_bus_error *error) {
- _cleanup_ordered_set_free_free_ OrderedSet *s = NULL;
+ _cleanup_ordered_set_free_ OrderedSet *s = NULL;
int r;
assert(bus);
assert(n);
assert(ret);
- s = ordered_set_new(&string_hash_ops);
+ s = ordered_set_new(&string_hash_ops_free);
if (!s)
return -ENOMEM;
char **ret,
sd_bus_error *error) {
- _cleanup_ordered_set_free_free_ OrderedSet *s = NULL;
+ _cleanup_ordered_set_free_ OrderedSet *s = NULL;
_cleanup_(introspect_done) struct introspect intro = {};
bool empty;
int r;
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
_cleanup_(sd_bus_message_unrefp) sd_bus_message *reply = NULL;
- _cleanup_ordered_set_free_free_ OrderedSet *s = NULL;
+ _cleanup_ordered_set_free_ OrderedSet *s = NULL;
char *path;
int r;
vtable_key.interface = m->interface;
vtable_key.member = m->member;
- v = hashmap_get(bus->vtable_methods, &vtable_key);
+ v = set_get(bus->vtable_methods, &vtable_key);
if (v) {
r = method_callbacks_run(bus, m, v, require_fallback, found_object);
if (r != 0)
if (r < 0)
return sd_bus_reply_method_errorf(m, SD_BUS_ERROR_INVALID_ARGS, "Expected interface and member parameters");
- v = hashmap_get(bus->vtable_properties, &vtable_key);
+ v = set_get(bus->vtable_properties, &vtable_key);
if (v) {
r = property_get_set_callbacks_run(bus, m, v, require_fallback, get, found_object);
if (r != 0)
return strcmp(x->member, y->member);
}
-DEFINE_PRIVATE_HASH_OPS(vtable_member_hash_ops, struct vtable_member, vtable_member_hash_func, vtable_member_compare_func);
+DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+ vtable_member_hash_ops,
+ struct vtable_member, vtable_member_hash_func, vtable_member_compare_func, free);
typedef enum {
NAMES_FIRST_PART = 1 << 0, /* first part of argument name list (input names). It is reset by names_are_valid() */
!streq(interface, "org.freedesktop.DBus.Peer") &&
!streq(interface, "org.freedesktop.DBus.ObjectManager"), -EINVAL);
- r = hashmap_ensure_allocated(&bus->vtable_methods, &vtable_member_hash_ops);
- if (r < 0)
- return r;
-
- r = hashmap_ensure_allocated(&bus->vtable_properties, &vtable_member_hash_ops);
- if (r < 0)
- return r;
-
n = bus_node_allocate(bus, path);
if (!n)
return -ENOMEM;
m->member = v->x.method.member;
m->vtable = v;
- r = hashmap_put(bus->vtable_methods, m, m);
+ r = set_ensure_put(&bus->vtable_methods, &vtable_member_hash_ops, m);
+ if (r == 0)
+ r = -EEXIST;
if (r < 0) {
free(m);
goto fail;
m->member = v->x.property.member;
m->vtable = v;
- r = hashmap_put(bus->vtable_properties, m, m);
+ r = set_ensure_put(&bus->vtable_properties, &vtable_member_hash_ops, m);
+ if (r == 0)
+ r = -EEXIST;
if (r < 0) {
free(m);
goto fail;
assert_return(member_name_is_valid(*property), -EINVAL);
key.member = *property;
- v = hashmap_get(bus->vtable_properties, &key);
+ v = set_get(bus->vtable_properties, &key);
if (!v)
return -ENOENT;
struct vtable_member *v;
key.member = *property;
- assert_se(v = hashmap_get(bus->vtable_properties, &key));
+ assert_se(v = set_get(bus->vtable_properties, &key));
assert(c == v->parent);
if (!(v->vtable->flags & SD_BUS_VTABLE_PROPERTY_EMITS_INVALIDATION))
bus_reset_queues(b);
- ordered_hashmap_free_free(b->reply_callbacks);
+ ordered_hashmap_free(b->reply_callbacks);
prioq_free(b->reply_callbacks_prioq);
assert(b->match_callbacks.type == BUS_MATCH_ROOT);
bus_match_free(&b->match_callbacks);
- hashmap_free_free(b->vtable_methods);
- hashmap_free_free(b->vtable_properties);
+ set_free(b->vtable_methods);
+ set_free(b->vtable_properties);
assert(hashmap_isempty(b->nodes));
hashmap_free(b->nodes);
if (!callback && !slot && !m->sealed)
m->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
- r = ordered_hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops);
- if (r < 0)
- return r;
-
r = prioq_ensure_allocated(&bus->reply_callbacks_prioq, timeout_compare);
if (r < 0)
return r;
s->reply_callback.callback = callback;
s->reply_callback.cookie = BUS_MESSAGE_COOKIE(m);
- r = ordered_hashmap_put(bus->reply_callbacks, &s->reply_callback.cookie, &s->reply_callback);
+ r = ordered_hashmap_ensure_put(&bus->reply_callbacks, &uint64_hash_ops_value_free, &s->reply_callback.cookie, &s->reply_callback);
if (r < 0) {
s->reply_callback.cookie = 0;
return r;