From 2d2d742cf1787a948a20bf7a12acd17fa62e1dc9 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 23 Sep 2015 09:48:00 +0200 Subject: [PATCH] systemd/adapt: refactor sd_event_source to use a union for holding mutually exclusive fields sd_event_source is either used for sd_event_add_io() or sd_event_add_time(). Depending on the use, different fields of the struct are relevant. Refactor the struct to have a union. This reduces the size of the struct, but more importantly, it makes it clear which fields are used in which context. --- src/systemd/nm-sd-adapt.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/systemd/nm-sd-adapt.c b/src/systemd/nm-sd-adapt.c index 1f8f2dcc3e..24b77c528b 100644 --- a/src/systemd/nm-sd-adapt.c +++ b/src/systemd/nm-sd-adapt.c @@ -31,10 +31,16 @@ struct sd_event_source { gpointer user_data; GIOChannel *channel; - sd_event_io_handler_t io_cb; - uint64_t usec; - sd_event_time_handler_t time_cb; + union { + struct { + sd_event_io_handler_t cb; + } io; + struct { + sd_event_time_handler_t cb; + uint64_t usec; + } time; + }; }; static struct sd_event_source * @@ -106,7 +112,7 @@ io_ready (GIOChannel *channel, GIOCondition condition, struct sd_event_source *s source->refcount++; - r = source->io_cb (source, g_io_channel_unix_get_fd (channel), revents, source->user_data); + r = source->io.cb (source, g_io_channel_unix_get_fd (channel), revents, source->user_data); if (r < 0 || source->refcount <= 1) { source->id = 0; result = G_SOURCE_REMOVE; @@ -134,7 +140,7 @@ sd_event_add_io (sd_event *e, sd_event_source **s, int fd, uint32_t events, sd_e return -EINVAL; source = source_new (); - source->io_cb = callback; + source->io.cb = callback; source->user_data = userdata; source->channel = channel; @@ -165,7 +171,7 @@ time_ready (struct sd_event_source *source) source->refcount++; - r = source->time_cb (source, source->usec, source->user_data); + r = source->time.cb (source, source->time.usec, source->user_data); if (r < 0 || source->refcount <= 1) { source->id = 0; result = G_SOURCE_REMOVE; @@ -188,9 +194,9 @@ sd_event_add_time(sd_event *e, sd_event_source **s, clockid_t clock, uint64_t us g_return_val_if_fail (s, -EINVAL); source = source_new (); - source->time_cb = callback; + source->time.cb = callback; source->user_data = userdata; - source->usec = usec; + source->time.usec = usec; if (usec > 1000) usec = n < usec - 1000 ? usec - n : 1000;