diff options
author | Thomas Haller <thaller@redhat.com> | 2019-11-08 10:51:31 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2019-11-25 12:58:33 +0100 |
commit | d0f385ce343e4cbe9d9e45be785361efadb3c292 (patch) | |
tree | d41fda6fa627b6c512174220aa37f65458806960 | |
parent | 52cd4878a65d4363a3b5bb27994b6b2e1b961830 (diff) | |
download | NetworkManager-d0f385ce343e4cbe9d9e45be785361efadb3c292.tar.gz |
sd: cleanup integrating systemd's event loop with GMainContext
Get rid of the default_source_id global for tracking the default
event. It's not useful to track this.
-rw-r--r-- | src/systemd/nm-sd.c | 63 |
1 files changed, 25 insertions, 38 deletions
diff --git a/src/systemd/nm-sd.c b/src/systemd/nm-sd.c index 4cbee99fa7..a277f4309e 100644 --- a/src/systemd/nm-sd.c +++ b/src/systemd/nm-sd.c @@ -18,7 +18,6 @@ typedef struct SDEventSource { GSource source; GPollFD pollfd; sd_event *event; - guint *default_source_id; } SDEventSource; static gboolean @@ -36,41 +35,49 @@ event_check (GSource *source) static gboolean event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data) { - return sd_event_dispatch (((SDEventSource *)source)->event) > 0; + return sd_event_dispatch (((SDEventSource *) source)->event) > 0; } static void event_finalize (GSource *source) { - SDEventSource *s; + SDEventSource *s = (SDEventSource *) source; - s = (SDEventSource *) source; sd_event_unref (s->event); - if (s->default_source_id) - *s->default_source_id = 0; } static SDEventSource * -event_create_source (sd_event *event, guint *default_source_id) +event_create_source (sd_event *event) { - static GSourceFuncs event_funcs = { + static const GSourceFuncs event_funcs = { .prepare = event_prepare, .check = event_check, .dispatch = event_dispatch, .finalize = event_finalize, }; SDEventSource *source; + gboolean is_default_event = FALSE; + int r; - g_return_val_if_fail (event, NULL); + if (!event) { + is_default_event = TRUE; + r = sd_event_default (&event); + if (r < 0) + g_return_val_if_reached (NULL); + } - source = (SDEventSource *) g_source_new (&event_funcs, sizeof (SDEventSource)); + source = (SDEventSource *) g_source_new ((GSourceFuncs *) &event_funcs, sizeof (SDEventSource)); - source->event = sd_event_ref (event); - source->pollfd.fd = sd_event_get_fd (event); - source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR; - source->default_source_id = default_source_id; + source->event = is_default_event + ? g_steal_pointer (&event) + : sd_event_ref (event); - g_source_add_poll ((GSource *) source, &source->pollfd); + source->pollfd = (GPollFD) { + .fd = sd_event_get_fd (source->event), + .events = G_IO_IN | G_IO_HUP | G_IO_ERR, + }; + + g_source_add_poll (&source->source, &source->pollfd); return source; } @@ -80,35 +87,15 @@ event_attach (sd_event *event, GMainContext *context) { SDEventSource *source; guint id; - int r; - sd_event *e = event; - guint *p_default_source_id = NULL; - if (!e) { - static guint default_source_id = 0; + source = event_create_source (event); - if (default_source_id) { - /* The default event cannot be registered multiple times. */ - g_return_val_if_reached (0); - } + g_return_val_if_fail (source, 0); - r = sd_event_default (&e); - if (r < 0) - g_return_val_if_reached (0); - - p_default_source_id = &default_source_id; - } - - source = event_create_source (e, p_default_source_id); id = g_source_attach ((GSource *) source, context); g_source_unref ((GSource *) source); - if (!event) { - *p_default_source_id = id; - sd_event_unref (e); - } - - g_return_val_if_fail (id, 0); + nm_assert (id != 0); return id; } |