From: Yu Watanabe Date: Tue, 21 Jan 2025 21:29:23 +0000 (+0900) Subject: sd-bus: use hash ops with destructor X-Git-Tag: v258-rc1~1512^2~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b87501ea3c185b161be1daa9c1989384169d20c4;p=thirdparty%2Fsystemd.git sd-bus: use hash ops with destructor This also makes vtable_methods and vtable_properties managed by Set, as the key and value of each entry are equivalent. --- diff --git a/src/libsystemd/sd-bus/bus-internal.h b/src/libsystemd/sd-bus/bus-internal.h index 5b3cae759b1..25fe4bd9564 100644 --- a/src/libsystemd/sd-bus/bus-internal.h +++ b/src/libsystemd/sd-bus/bus-internal.h @@ -240,8 +240,8 @@ struct sd_bus { LIST_HEAD(struct filter_callback, filter_callbacks); Hashmap *nodes; - Hashmap *vtable_methods; - Hashmap *vtable_properties; + Set *vtable_methods; + Set *vtable_properties; union sockaddr_union sockaddr; socklen_t sockaddr_size; diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index e528987a6d4..af79bbc5f0f 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -220,7 +220,7 @@ static int get_child_nodes( 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); @@ -228,7 +228,7 @@ static int get_child_nodes( assert(n); assert(ret); - s = ordered_set_new(&string_hash_ops); + s = ordered_set_new(&string_hash_ops_free); if (!s) return -ENOMEM; @@ -926,7 +926,7 @@ int introspect_path( 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; @@ -1229,7 +1229,7 @@ static int process_get_managed_objects( _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; @@ -1314,7 +1314,7 @@ static int object_find_and_run( 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) @@ -1341,7 +1341,7 @@ static int object_find_and_run( 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) @@ -1686,7 +1686,9 @@ static int vtable_member_compare_func(const struct vtable_member *x, const struc 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() */ @@ -1812,14 +1814,6 @@ static int add_object_vtable_internal( !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; @@ -1892,7 +1886,9 @@ static int add_object_vtable_internal( 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; @@ -1940,7 +1936,9 @@ static int add_object_vtable_internal( 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; @@ -2128,7 +2126,7 @@ static int emit_properties_changed_on_interface( 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; @@ -2222,7 +2220,7 @@ static int emit_properties_changed_on_interface( 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)) diff --git a/src/libsystemd/sd-bus/bus-slot.c b/src/libsystemd/sd-bus/bus-slot.c index 9f289575ef2..8238e31c90b 100644 --- a/src/libsystemd/sd-bus/bus-slot.c +++ b/src/libsystemd/sd-bus/bus-slot.c @@ -129,7 +129,7 @@ void bus_slot_disconnect(sd_bus_slot *slot, bool unref) { key.interface = slot->node_vtable.interface; key.member = v->x.method.member; - x = hashmap_remove(slot->bus->vtable_methods, &key); + x = set_remove(slot->bus->vtable_methods, &key); break; } @@ -141,7 +141,7 @@ void bus_slot_disconnect(sd_bus_slot *slot, bool unref) { key.interface = slot->node_vtable.interface; key.member = v->x.method.member; - x = hashmap_remove(slot->bus->vtable_properties, &key); + x = set_remove(slot->bus->vtable_properties, &key); break; }} diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 699761fc312..c14d144753e 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -220,14 +220,14 @@ static sd_bus* bus_free(sd_bus *b) { 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); @@ -2332,10 +2332,6 @@ _public_ int sd_bus_call_async( 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; @@ -2356,7 +2352,7 @@ _public_ int sd_bus_call_async( 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;