]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
Merge pull request #11465 from poettering/daemon-bus-flush
authorLennart Poettering <lennart@poettering.net>
Fri, 18 Jan 2019 12:48:52 +0000 (13:48 +0100)
committerGitHub <noreply@github.com>
Fri, 18 Jan 2019 12:48:52 +0000 (13:48 +0100)
flush+close bus connections explicitly when our daemons go down

17 files changed:
man/sd_bus_new.xml
src/busctl/busctl.c
src/core/dbus.c
src/initctl/initctl.c
src/libsystemd/libsystemd.sym
src/libsystemd/sd-bus/sd-bus.c
src/login/logind.c
src/login/user-runtime-dir.c
src/machine/machine-dbus.c
src/machine/machined.c
src/network/networkd-manager.c
src/portable/portabled.c
src/resolve/resolved-manager.c
src/shared/bus-util.c
src/stdio-bridge/stdio-bridge.c
src/systemd/sd-bus.h
src/timesync/timesyncd-manager.c

index 1bc011d70a10e03569cb371843afa40b6fe12fdb..cc08e6be17dcb7c5504237a557ffd4b43b08e6e0 100644 (file)
@@ -23,6 +23,8 @@
     <refname>sd_bus_ref</refname>
     <refname>sd_bus_unref</refname>
     <refname>sd_bus_unrefp</refname>
+    <refname>sd_bus_close_unref</refname>
+    <refname>sd_bus_close_unrefp</refname>
     <refname>sd_bus_flush_close_unref</refname>
     <refname>sd_bus_flush_close_unrefp</refname>
 
@@ -49,8 +51,8 @@
       </funcprototype>
 
       <funcprototype>
-        <funcdef>void <function>sd_bus_unrefp</function></funcdef>
-        <paramdef>sd_bus **<parameter>busp</parameter></paramdef>
+        <funcdef>sd_bus *<function>sd_bus_close_unref</function></funcdef>
+        <paramdef>sd_bus *<parameter>bus</parameter></paramdef>
       </funcprototype>
 
       <funcprototype>
         <paramdef>sd_bus *<parameter>bus</parameter></paramdef>
       </funcprototype>
 
+      <funcprototype>
+        <funcdef>void <function>sd_bus_unrefp</function></funcdef>
+        <paramdef>sd_bus **<parameter>busp</parameter></paramdef>
+      </funcprototype>
+
+      <funcprototype>
+        <funcdef>void <function>sd_bus_close_unrefp</function></funcdef>
+        <paramdef>sd_bus **<parameter>busp</parameter></paramdef>
+      </funcprototype>
+
       <funcprototype>
         <funcdef>void <function>sd_bus_flush_close_unrefp</function></funcdef>
         <paramdef>sd_bus **<parameter>busp</parameter></paramdef>
     execute no operation if <emphasis>that</emphasis> is <constant>NULL</constant>.
     </para>
 
-    <para><function>sd_bus_flush_close_unref()</function> is similar to <function>sd_bus_unref()</function>, but first
-    executes <citerefentry><refentrytitle>sd_bus_flush</refentrytitle><manvolnum>3</manvolnum></citerefentry> as well
-    as <citerefentry><refentrytitle>sd_bus_close</refentrytitle><manvolnum>3</manvolnum></citerefentry>, ensuring that
-    any pending messages are properly flushed out before the reference to the connection is dropped and possibly the
-    object freed. This call is particularly useful immediately before exiting from a program as it ensures that any
-    pending outgoing messages are written out, and unprocessed but queued incoming messages released before the
-    connection is terminated and released.</para>
-
-    <para><function>sd_bus_flush_close_unrefp()</function> is similar to
-    <function>sd_bus_flush_close_unref()</function>, but may be used in GCC's and LLVM's Clean-up Variable Attribute,
-    see above.</para>
+    <para><function>sd_bus_close_unref()</function> is similar to <function>sd_bus_unref()</function>, but
+    first executes
+    <citerefentry><refentrytitle>sd_bus_close</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    ensuring that the connection is terminated before the reference to the connection is dropped and possibly
+    the object freed.</para>
+
+    <para><function>sd_bus_flush_close_unref()</function> is similar to <function>sd_bus_unref()</function>,
+    but first executes
+    <citerefentry><refentrytitle>sd_bus_flush</refentrytitle><manvolnum>3</manvolnum></citerefentry> as well
+    as <citerefentry><refentrytitle>sd_bus_close</refentrytitle><manvolnum>3</manvolnum></citerefentry>,
+    ensuring that any pending messages are synchronously flushed out before the reference to the connection
+    is dropped and possibly the object freed. This call is particularly useful immediately before exiting
+    from a program as it ensures that any pending outgoing messages are written out, and unprocessed but
+    queued incoming messages released before the connection is terminated and released.</para>
+
+    <para><function>sd_bus_close_unrefp()</function> is similar to
+    <function>sd_bus_close_unref()</function>, but may be used in GCC's and LLVM's Clean-up Variable
+    Attribute, see above. Similarly, <function>sd_bus_flush_close_unrefp()</function> is similar to
+    <function>sd_bus_flush_close_unref()</function>.</para>
   </refsect1>
 
   <refsect1>
index 96b4177495f23a5a33e18a7c1715b48d035b9afc..08d9e70c96088737009431343092f9179edaf2f8 100644 (file)
@@ -67,7 +67,7 @@ static int json_transform_message(sd_bus_message *m, JsonVariant **ret);
 static void json_dump_with_flags(JsonVariant *v, FILE *f);
 
 static int acquire_bus(bool set_monitor, sd_bus **ret) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         r = sd_bus_new(&bus);
index 5908ad792a7cc6f4b6712d6a93be3d64aecfe2d2..255b86e7a41930eaa098675e840a483755253c6c 100644 (file)
@@ -611,7 +611,7 @@ static int bus_setup_disconnected_match(Manager *m, sd_bus *bus) {
 }
 
 static int bus_on_connection(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         _cleanup_close_ int nfd = -1;
         Manager *m = userdata;
         sd_id128_t id;
@@ -876,7 +876,7 @@ static int bus_setup_api(Manager *m, sd_bus *bus) {
 }
 
 int bus_init_api(Manager *m) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         if (m->api_bus)
@@ -940,7 +940,7 @@ static int bus_setup_system(Manager *m, sd_bus *bus) {
 }
 
 int bus_init_system(Manager *m) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         if (m->system_bus)
@@ -1080,8 +1080,7 @@ static void destroy_bus(Manager *m, sd_bus **bus) {
                 sd_bus_flush(*bus);
 
         /* And destroy the object */
-        sd_bus_close(*bus);
-        *bus = sd_bus_unref(*bus);
+        *bus = sd_bus_close_unref(*bus);
 }
 
 void bus_done_api(Manager *m) {
index c60d4bd740ad25f9374806bb9037c72bb168b652..260dc2eb618b7092d93d298ae76b851a740baf4c 100644 (file)
@@ -233,12 +233,8 @@ static void server_done(Server *s) {
         while (s->fifos)
                 fifo_free(s->fifos);
 
-        safe_close(s->epoll_fd);
-
-        if (s->bus) {
-                sd_bus_flush(s->bus);
-                sd_bus_unref(s->bus);
-        }
+        s->epoll_fd = safe_close(s->epoll_fd);
+        s->bus = sd_bus_flush_close_unref(s->bus);
 }
 
 static int server_init(Server *s, unsigned n_sockets) {
index 96e63477956c61e99b6c4497ebfb1d1ab4b10b3e..a6748ceb209cd7845851d2bb478d2b42b16bc00f 100644 (file)
@@ -671,3 +671,8 @@ global:
         sd_event_source_get_floating;
         sd_event_source_set_floating;
 } LIBSYSTEMD_239;
+
+LIBSYSTEMD_241 {
+global:
+        sd_bus_close_unref;
+} LIBSYSTEMD_240;
index 3b00bc815725dbc607b86f3e1d7fdf28e3f98669..1ff858f32d379922f3d75c7d4df35f2f63d340ac 100644 (file)
@@ -1556,17 +1556,24 @@ _public_ void sd_bus_close(sd_bus *bus) {
         bus_close_inotify_fd(bus);
 }
 
+_public_ sd_bus *sd_bus_close_unref(sd_bus *bus) {
+        if (!bus)
+                return NULL;
+
+        sd_bus_close(bus);
+
+        return sd_bus_unref(bus);
+}
+
 _public_ sd_bus* sd_bus_flush_close_unref(sd_bus *bus) {
         if (!bus)
                 return NULL;
 
         /* Have to do this before flush() to prevent hang */
         bus_kill_exec(bus);
-
         sd_bus_flush(bus);
-        sd_bus_close(bus);
 
-        return sd_bus_unref(bus);
+        return sd_bus_close_unref(bus);
 }
 
 void bus_enter_closing(sd_bus *bus) {
index 8d85de9b43c7d6bb01ca7e14fa4d868a549f0ef9..95ec0a57c600c10214840f68c234495c4b6b39cf 100644 (file)
@@ -146,7 +146,7 @@ static Manager* manager_unref(Manager *m) {
 
         bus_verify_polkit_async_registry_free(m->polkit_registry);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
         sd_event_unref(m->event);
 
         safe_close(m->reserve_vt_fd);
index 5e58e4baadbf1f02a937d8159adb9ec9de5c8b2f..eb66e18de1c0c3bd685333fd4296d95b2d14c4cd 100644 (file)
@@ -22,7 +22,7 @@
 
 static int acquire_runtime_dir_size(uint64_t *ret) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         r = sd_bus_default_system(&bus);
index 48270b3709af628d910d997f6a5d0f9b33c698af..7a558df8983c0267f73bf6017536e86d0e38394a 100644 (file)
@@ -454,7 +454,7 @@ static int container_bus_new(Machine *m, sd_bus_error *error, sd_bus **ret) {
                 break;
 
         case MACHINE_CONTAINER: {
-                _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+                _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
                 char *address;
 
                 r = sd_bus_new(&bus);
index 9f23e369a46a29c240355ec790c2c64d05c554a7..0b92b1c6ee238bd822587aeef8ba8519cdc4c72a 100644 (file)
@@ -81,7 +81,7 @@ static Manager* manager_unref(Manager *m) {
 
         bus_verify_polkit_async_registry_free(m->polkit_registry);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
         sd_event_unref(m->event);
 
         return mfree(m);
index 81c81f18af0253eceae2b8d2496d2e91066fc806..c8d369e2a0f7c2f8051fb1a0b2e2ef75866d9202 100644 (file)
@@ -1456,7 +1456,7 @@ void manager_free(Manager *m) {
 
         sd_device_monitor_unref(m->device_monitor);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
 
         free(m->dynamic_timezone);
         free(m->dynamic_hostname);
index 63fc34046913c5b9d7a12189c0e75cc4d15eb715..49a359fd3150c3a0f538a2d4555b597d127e7b1c 100644 (file)
@@ -53,7 +53,7 @@ static Manager* manager_unref(Manager *m) {
 
         bus_verify_polkit_async_registry_free(m->polkit_registry);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
         sd_event_unref(m->event);
 
         return mfree(m);
index b7dc09ae370ac7788d910e60dd1f5f8141c5f263..b3d35c83413f0b11f75e808db5af55594260a5a1 100644 (file)
@@ -689,7 +689,7 @@ Manager *manager_free(Manager *m) {
         manager_mdns_stop(m);
         manager_dns_stub_stop(m);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
 
         sd_event_source_unref(m->sigusr1_event_source);
         sd_event_source_unref(m->sigusr2_event_source);
index 976643e4ce0a4df3ec513c6d0707192059dcd7c7..cbcf698e965f5f2db8141759f34d3c0c9ecd779e 100644 (file)
@@ -559,7 +559,7 @@ int bus_check_peercred(sd_bus *c) {
 }
 
 int bus_connect_system_systemd(sd_bus **_bus) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         assert(_bus);
@@ -592,7 +592,7 @@ int bus_connect_system_systemd(sd_bus **_bus) {
 }
 
 int bus_connect_user_systemd(sd_bus **_bus) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         _cleanup_free_ char *ee = NULL;
         const char *e;
         int r;
@@ -1279,7 +1279,7 @@ int bus_map_all_properties(
 }
 
 int bus_connect_transport(BusTransport transport, const char *host, bool user, sd_bus **ret) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         int r;
 
         assert(transport >= 0);
@@ -1666,7 +1666,7 @@ int bus_track_add_name_many(sd_bus_track *t, char **l) {
 }
 
 int bus_open_system_watch_bind_with_description(sd_bus **ret, const char *description) {
-        _cleanup_(sd_bus_unrefp) sd_bus *bus = NULL;
+        _cleanup_(sd_bus_close_unrefp) sd_bus *bus = NULL;
         const char *e;
         int r;
 
index 3a21aa4aed018dc16944f30b7aaba2fe98e51bf1..7060897ab7b5a130d6154aa2ca089f8362271191 100644 (file)
@@ -91,7 +91,7 @@ static int parse_argv(int argc, char *argv[]) {
 }
 
 static int run(int argc, char *argv[]) {
-        _cleanup_(sd_bus_unrefp) sd_bus *a = NULL, *b = NULL;
+        _cleanup_(sd_bus_flush_close_unrefp) sd_bus *a = NULL, *b = NULL;
         sd_id128_t server_id;
         bool is_unix;
         int r, in_fd, out_fd;
index 4c1acab9f3af876702a79fb864e9fbeb965b8807..129cc933288c783cc84d4868f52a5936cc225a59 100644 (file)
@@ -170,6 +170,7 @@ void sd_bus_close(sd_bus *bus);
 
 sd_bus *sd_bus_ref(sd_bus *bus);
 sd_bus *sd_bus_unref(sd_bus *bus);
+sd_bus *sd_bus_close_unref(sd_bus *bus);
 sd_bus *sd_bus_flush_close_unref(sd_bus *bus);
 
 void sd_bus_default_flush_close(void);
@@ -493,6 +494,7 @@ int sd_bus_track_get_destroy_callback(sd_bus_track *s, sd_bus_destroy_t *ret);
 
 /* Define helpers so that __attribute__((cleanup(sd_bus_unrefp))) and similar may be used. */
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus, sd_bus_unref);
+_SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus, sd_bus_close_unref);
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus, sd_bus_flush_close_unref);
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus_slot, sd_bus_slot_unref);
 _SD_DEFINE_POINTER_CLEANUP_FUNC(sd_bus_message, sd_bus_message_unref);
index 4b0696f3a3eb2e11f6bd5046a534d540d2d3fa5a..b3bd7235c90973372ea49e72eb57c289b3aa4ed0 100644 (file)
@@ -937,7 +937,7 @@ void manager_free(Manager *m) {
         sd_resolve_unref(m->resolve);
         sd_event_unref(m->event);
 
-        sd_bus_unref(m->bus);
+        sd_bus_flush_close_unref(m->bus);
 
         free(m);
 }