bus: Add explicit flush and close operations
This change exposes explicit flush and close operations on the bus for
users who require bus termination at a specific checkpoint instead of
program termination.
Change-Id: I0e2edce8586956ab286d75d1eb13eeca4309e370
Signed-off-by: William A. Kennington III <wak@google.com>
diff --git a/sdbusplus/bus.hpp.in b/sdbusplus/bus.hpp.in
index 66961ee..587d10b 100644
--- a/sdbusplus/bus.hpp.in
+++ b/sdbusplus/bus.hpp.in
@@ -155,6 +155,22 @@
return _bus.release();
}
+ /** @brief Flush all of the outstanding work on the bus. */
+ void flush()
+ {
+ int r = _intf->sd_bus_flush(_bus.get());
+ if (r < 0)
+ {
+ throw exception::SdBusError(-r, "sd_bus_flush");
+ }
+ }
+
+ /** @brief Close the connection to the dbus daemon. */
+ void close()
+ {
+ _intf->sd_bus_close(_bus.get());
+ }
+
/** @brief Wait for new dbus messages or signals.
*
* @param[in] timeout_us - Timeout in usec.
diff --git a/sdbusplus/sdbus.hpp b/sdbusplus/sdbus.hpp
index f5d732f..acc5f3f 100644
--- a/sdbusplus/sdbus.hpp
+++ b/sdbusplus/sdbus.hpp
@@ -139,6 +139,9 @@
virtual sd_bus* sd_bus_unref(sd_bus* bus) = 0;
virtual sd_bus* sd_bus_flush_close_unref(sd_bus* bus) = 0;
+ virtual int sd_bus_flush(sd_bus* bus) = 0;
+ virtual void sd_bus_close(sd_bus* bus) = 0;
+
virtual int sd_bus_wait(sd_bus* bus, uint64_t timeout_usec) = 0;
};
@@ -456,6 +459,16 @@
return ::sd_bus_flush_close_unref(bus);
}
+ int sd_bus_flush(sd_bus* bus) override
+ {
+ return ::sd_bus_flush(bus);
+ }
+
+ void sd_bus_close(sd_bus* bus) override
+ {
+ ::sd_bus_close(bus);
+ }
+
int sd_bus_wait(sd_bus* bus, uint64_t timeout_usec) override
{
return ::sd_bus_wait(bus, timeout_usec);
diff --git a/sdbusplus/test/sdbus_mock.hpp b/sdbusplus/test/sdbus_mock.hpp
index 7264482..36a8598 100644
--- a/sdbusplus/test/sdbus_mock.hpp
+++ b/sdbusplus/test/sdbus_mock.hpp
@@ -107,6 +107,8 @@
MOCK_METHOD3(sd_bus_send, int(sd_bus*, sd_bus_message*, uint64_t*));
MOCK_METHOD1(sd_bus_unref, sd_bus*(sd_bus*));
MOCK_METHOD1(sd_bus_flush_close_unref, sd_bus*(sd_bus*));
+ MOCK_METHOD1(sd_bus_flush, int(sd_bus*));
+ MOCK_METHOD1(sd_bus_close, void(sd_bus*));
MOCK_METHOD2(sd_bus_wait, int(sd_bus*, uint64_t));
};