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);