From b0a72cbe9256fc11127ba19c151b4c16b09e6935 Mon Sep 17 00:00:00 2001 From: Stanislav Angelovic Date: Thu, 29 Apr 2021 15:30:56 +0000 Subject: [PATCH] Make Message's setDestination() thread safe --- src/ISdBus.h | 2 ++ src/Message.cpp | 2 +- src/SdBus.cpp | 7 +++++++ src/SdBus.h | 2 ++ tests/unittests/mocks/SdBusMock.h | 2 ++ 5 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/ISdBus.h b/src/ISdBus.h index ae40ba1..800ba92 100644 --- a/src/ISdBus.h +++ b/src/ISdBus.h @@ -83,6 +83,8 @@ namespace sdbus::internal { virtual int sd_bus_flush(sd_bus *bus) = 0; virtual sd_bus *sd_bus_flush_close_unref(sd_bus *bus) = 0; + virtual int sd_bus_message_set_destination(sd_bus_message *m, const char *destination) = 0; + virtual int sd_bus_query_sender_creds(sd_bus_message *m, uint64_t mask, sd_bus_creds **c) = 0; virtual sd_bus_creds* sd_bus_creds_unref(sd_bus_creds *c) = 0; diff --git a/src/Message.cpp b/src/Message.cpp index 29ad5df..f54273c 100644 --- a/src/Message.cpp +++ b/src/Message.cpp @@ -820,7 +820,7 @@ void Signal::send() const void Signal::setDestination(const std::string& destination) { - auto r = sd_bus_message_set_destination((sd_bus_message*)msg_, destination.c_str()); + auto r = sdbus_->sd_bus_message_set_destination((sd_bus_message*)msg_, destination.c_str()); SDBUS_THROW_ERROR_IF(r < 0, "Failed to set signal destination", -r); } diff --git a/src/SdBus.cpp b/src/SdBus.cpp index 60a622f..a60f664 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -260,6 +260,13 @@ sd_bus* SdBus::sd_bus_flush_close_unref(sd_bus *bus) return ::sd_bus_flush_close_unref(bus); } +int SdBus::sd_bus_message_set_destination(sd_bus_message *m, const char *destination) +{ + std::lock_guard lock(sdbusMutex_); + + return ::sd_bus_message_set_destination(m, destination); +} + int SdBus::sd_bus_query_sender_creds(sd_bus_message *m, uint64_t mask, sd_bus_creds **c) { std::lock_guard lock(sdbusMutex_); diff --git a/src/SdBus.h b/src/SdBus.h index 5ed4161..1693112 100644 --- a/src/SdBus.h +++ b/src/SdBus.h @@ -75,6 +75,8 @@ public: virtual int sd_bus_flush(sd_bus *bus) override; virtual sd_bus *sd_bus_flush_close_unref(sd_bus *bus) override; + virtual int sd_bus_message_set_destination(sd_bus_message *m, const char *destination) override; + virtual int sd_bus_query_sender_creds(sd_bus_message *m, uint64_t mask, sd_bus_creds **c) override; virtual sd_bus_creds* sd_bus_creds_unref(sd_bus_creds *c) override; diff --git a/tests/unittests/mocks/SdBusMock.h b/tests/unittests/mocks/SdBusMock.h index 6062436..e51c4bc 100644 --- a/tests/unittests/mocks/SdBusMock.h +++ b/tests/unittests/mocks/SdBusMock.h @@ -74,6 +74,8 @@ public: MOCK_METHOD1(sd_bus_flush, int(sd_bus *bus)); MOCK_METHOD1(sd_bus_flush_close_unref, sd_bus *(sd_bus *bus)); + MOCK_METHOD2(sd_bus_message_set_destination, int(sd_bus_message *m, const char *destination)); + MOCK_METHOD3(sd_bus_query_sender_creds, int(sd_bus_message *, uint64_t, sd_bus_creds **)); MOCK_METHOD1(sd_bus_creds_unref, sd_bus_creds*(sd_bus_creds *));