From afd15bbb4b6414b9356799c63029e36642dae8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 8 May 2019 14:39:57 +0200 Subject: [PATCH] sd-event: add sd_event_source_disable_unref() helper --- man/rules/meson.build | 4 +++- man/sd_event_source_unref.xml | 30 +++++++++++++++++++----------- src/libsystemd/libsystemd.sym | 1 + src/libsystemd/sd-event/sd-event.c | 6 ++++++ src/systemd/sd-event.h | 1 + 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/man/rules/meson.build b/man/rules/meson.build index 6894158466..944d2bf286 100644 --- a/man/rules/meson.build +++ b/man/rules/meson.build @@ -445,7 +445,9 @@ manpages = [ ['sd_event_source_set_userdata', '3', ['sd_event_source_get_userdata'], ''], ['sd_event_source_unref', '3', - ['sd_event_source_ref', 'sd_event_source_unrefp'], + ['sd_event_source_disable_unref', + 'sd_event_source_ref', + 'sd_event_source_unrefp'], ''], ['sd_event_wait', '3', diff --git a/man/sd_event_source_unref.xml b/man/sd_event_source_unref.xml index 01e3008eed..4e2fb8cb39 100644 --- a/man/sd_event_source_unref.xml +++ b/man/sd_event_source_unref.xml @@ -19,6 +19,7 @@ sd_event_source_unref sd_event_source_unrefp sd_event_source_ref + sd_event_source_disable_unref Increase or decrease event source reference counters @@ -42,6 +43,10 @@ sd_event_source *source + + sd_event_source* sd_event_source_disable_unref + sd_event_source *source + @@ -77,23 +82,26 @@ the passed event source object is NULL. - Note that event source objects stay alive and may be - dispatched as long as they have a reference counter greater than - zero. In order to drop a reference of an event source and make - sure the associated event source handler function is not called - anymore it is recommended to combine a call of + Note that event source objects stay alive and may be dispatched as long as they have a reference + counter greater than zero. In order to drop a reference of an event source and make sure the associated + event source handler function is not called anymore it is recommended to combine a call of sd_event_source_unref() with a prior call to - sd_event_source_set_enabled() with - SD_EVENT_OFF. + sd_event_source_set_enabled() with SD_EVENT_OFF or call + sd_event_source_disable_unref(), see below. + + sd_event_source_disable_unref() combines a call to + sd_event_source_set_enabled() with SD_EVENT_OFF with + sd_event_source_unref(). This ensures that the source is disabled before the local + reference to it is lost. The source parameter is allowed to be + NULL. Return Value - sd_event_source_unref() always returns - NULL. - sd_event_source_ref() always returns the - event source object passed in. + sd_event_source_unref() and + sd_event_source_disable_unref() always return NULL. + sd_event_source_ref() always returns the event source object passed in. diff --git a/src/libsystemd/libsystemd.sym b/src/libsystemd/libsystemd.sym index a9ab0605ce..5ec42e0f1f 100644 --- a/src/libsystemd/libsystemd.sym +++ b/src/libsystemd/libsystemd.sym @@ -680,4 +680,5 @@ global: LIBSYSTEMD_243 { global: sd_bus_object_vtable_format; + sd_event_source_disable_unref; } LIBSYSTEMD_241; diff --git a/src/libsystemd/sd-event/sd-event.c b/src/libsystemd/sd-event/sd-event.c index 50017a9517..09285c19d8 100644 --- a/src/libsystemd/sd-event/sd-event.c +++ b/src/libsystemd/sd-event/sd-event.c @@ -339,6 +339,12 @@ fail: DEFINE_PUBLIC_TRIVIAL_REF_UNREF_FUNC(sd_event, sd_event, event_free); +_public_ sd_event_source* sd_event_source_disable_unref(sd_event_source *s) { + if (s) + (void) sd_event_source_set_enabled(s, SD_EVENT_OFF); + return sd_event_source_unref(s); +} + static bool event_pid_changed(sd_event *e) { assert(e); diff --git a/src/systemd/sd-event.h b/src/systemd/sd-event.h index 7bb8609376..226e1b8f26 100644 --- a/src/systemd/sd-event.h +++ b/src/systemd/sd-event.h @@ -113,6 +113,7 @@ int sd_event_get_iteration(sd_event *e, uint64_t *ret); sd_event_source* sd_event_source_ref(sd_event_source *s); sd_event_source* sd_event_source_unref(sd_event_source *s); +sd_event_source* sd_event_source_disable_unref(sd_event_source *s); sd_event *sd_event_source_get_event(sd_event_source *s); void* sd_event_source_get_userdata(sd_event_source *s);