From d5099efc47d4e6ac60816b5381a5f607ab03f06e Mon Sep 17 00:00:00 2001 From: Michal Schmidt Date: Wed, 13 Aug 2014 01:00:18 +0200 Subject: hashmap: introduce hash_ops to make struct Hashmap smaller It is redundant to store 'hash' and 'compare' function pointers in struct Hashmap separately. The functions always comprise a pair. Store a single pointer to struct hash_ops instead. systemd keeps hundreds of hashmaps, so this saves a little bit of memory. --- src/libsystemd/sd-bus/bus-match.c | 4 ++-- src/libsystemd/sd-bus/bus-objects.c | 13 +++++++++---- src/libsystemd/sd-bus/bus-track.c | 2 +- src/libsystemd/sd-bus/bus-util.c | 2 +- src/libsystemd/sd-bus/busctl.c | 2 +- src/libsystemd/sd-bus/sd-bus.c | 2 +- src/libsystemd/sd-event/sd-event.c | 4 ++-- src/libsystemd/sd-rtnl/sd-rtnl.c | 2 +- 8 files changed, 18 insertions(+), 13 deletions(-) (limited to 'src/libsystemd') diff --git a/src/libsystemd/sd-bus/bus-match.c b/src/libsystemd/sd-bus/bus-match.c index 88b61a75be..18afe0f12a 100644 --- a/src/libsystemd/sd-bus/bus-match.c +++ b/src/libsystemd/sd-bus/bus-match.c @@ -450,13 +450,13 @@ static int bus_match_add_compare_value( where->child = c; if (t == BUS_MATCH_MESSAGE_TYPE) { - c->compare.children = hashmap_new(trivial_hash_func, trivial_compare_func); + c->compare.children = hashmap_new(NULL); if (!c->compare.children) { r = -ENOMEM; goto fail; } } else if (BUS_MATCH_CAN_HASH(t)) { - c->compare.children = hashmap_new(string_hash_func, string_compare_func); + c->compare.children = hashmap_new(&string_hash_ops); if (!c->compare.children) { r = -ENOMEM; goto fail; diff --git a/src/libsystemd/sd-bus/bus-objects.c b/src/libsystemd/sd-bus/bus-objects.c index 3a2de6520e..81c840f129 100644 --- a/src/libsystemd/sd-bus/bus-objects.c +++ b/src/libsystemd/sd-bus/bus-objects.c @@ -225,7 +225,7 @@ static int get_child_nodes( assert(n); assert(_s); - s = set_new(string_hash_func, string_compare_func); + s = set_new(&string_hash_ops); if (!s) return -ENOMEM; @@ -1420,7 +1420,7 @@ static struct node *bus_node_allocate(sd_bus *bus, const char *path) { if (n) return n; - r = hashmap_ensure_allocated(&bus->nodes, string_hash_func, string_compare_func); + r = hashmap_ensure_allocated(&bus->nodes, &string_hash_ops); if (r < 0) return NULL; @@ -1590,6 +1590,11 @@ static int vtable_member_compare_func(const void *a, const void *b) { return strcmp(x->member, y->member); } +static const struct hash_ops vtable_member_hash_ops = { + .hash = vtable_member_hash_func, + .compare = vtable_member_compare_func +}; + static int add_object_vtable_internal( sd_bus *bus, sd_bus_slot **slot, @@ -1618,11 +1623,11 @@ 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_func, vtable_member_compare_func); + 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_func, vtable_member_compare_func); + r = hashmap_ensure_allocated(&bus->vtable_properties, &vtable_member_hash_ops); if (r < 0) return r; diff --git a/src/libsystemd/sd-bus/bus-track.c b/src/libsystemd/sd-bus/bus-track.c index ffa2cf3d75..0a3322a4ee 100644 --- a/src/libsystemd/sd-bus/bus-track.c +++ b/src/libsystemd/sd-bus/bus-track.c @@ -166,7 +166,7 @@ _public_ int sd_bus_track_add_name(sd_bus_track *track, const char *name) { assert_return(track, -EINVAL); assert_return(service_name_is_valid(name), -EINVAL); - r = hashmap_ensure_allocated(&track->names, string_hash_func, string_compare_func); + r = hashmap_ensure_allocated(&track->names, &string_hash_ops); if (r < 0) return r; diff --git a/src/libsystemd/sd-bus/bus-util.c b/src/libsystemd/sd-bus/bus-util.c index a85d36180e..7c6da60cca 100644 --- a/src/libsystemd/sd-bus/bus-util.c +++ b/src/libsystemd/sd-bus/bus-util.c @@ -399,7 +399,7 @@ int bus_verify_polkit_async( if (!sender) return -EBADMSG; - r = hashmap_ensure_allocated(registry, trivial_hash_func, trivial_compare_func); + r = hashmap_ensure_allocated(registry, NULL); if (r < 0) return r; diff --git a/src/libsystemd/sd-bus/busctl.c b/src/libsystemd/sd-bus/busctl.c index af71804410..f06b74505b 100644 --- a/src/libsystemd/sd-bus/busctl.c +++ b/src/libsystemd/sd-bus/busctl.c @@ -76,7 +76,7 @@ static int list_bus_names(sd_bus *bus, char **argv) { pager_open_if_enabled(); - names = hashmap_new(string_hash_func, string_compare_func); + names = hashmap_new(&string_hash_ops); if (!names) return log_oom(); diff --git a/src/libsystemd/sd-bus/sd-bus.c b/src/libsystemd/sd-bus/sd-bus.c index 83b3aa1c3c..33b65aba72 100644 --- a/src/libsystemd/sd-bus/sd-bus.c +++ b/src/libsystemd/sd-bus/sd-bus.c @@ -1756,7 +1756,7 @@ _public_ int sd_bus_call_async( if (!BUS_IS_OPEN(bus->state)) return -ENOTCONN; - r = hashmap_ensure_allocated(&bus->reply_callbacks, uint64_hash_func, uint64_compare_func); + r = hashmap_ensure_allocated(&bus->reply_callbacks, &uint64_hash_ops); if (r < 0) return r; diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 985ff2829b..b56182dda7 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -1032,7 +1032,7 @@ _public_ int sd_event_add_child( assert_return(e->state != SD_EVENT_FINISHED, -ESTALE); assert_return(!event_pid_changed(e), -ECHILD); - r = hashmap_ensure_allocated(&e->child_sources, trivial_hash_func, trivial_compare_func); + r = hashmap_ensure_allocated(&e->child_sources, NULL); if (r < 0) return r; @@ -1123,7 +1123,7 @@ _public_ int sd_event_add_post( assert_return(e->state != SD_EVENT_FINISHED, -ESTALE); assert_return(!event_pid_changed(e), -ECHILD); - r = set_ensure_allocated(&e->post_sources, trivial_hash_func, trivial_compare_func); + r = set_ensure_allocated(&e->post_sources, NULL); if (r < 0) return r; diff --git a/src/libsystemd/sd-rtnl/sd-rtnl.c b/src/libsystemd/sd-rtnl/sd-rtnl.c index a3f314b95b..b7f1afe905 100644 --- a/src/libsystemd/sd-rtnl/sd-rtnl.c +++ b/src/libsystemd/sd-rtnl/sd-rtnl.c @@ -557,7 +557,7 @@ int sd_rtnl_call_async(sd_rtnl *nl, assert_return(callback, -EINVAL); assert_return(!rtnl_pid_changed(nl), -ECHILD); - r = hashmap_ensure_allocated(&nl->reply_callbacks, uint64_hash_func, uint64_compare_func); + r = hashmap_ensure_allocated(&nl->reply_callbacks, &uint64_hash_ops); if (r < 0) return r; -- cgit v1.2.3-54-g00ecf