diff --git a/src/SdBus.cpp b/src/SdBus.cpp index 0fec56b..b523b79 100644 --- a/src/SdBus.cpp +++ b/src/SdBus.cpp @@ -48,7 +48,14 @@ int SdBus::sd_bus_send(sd_bus *bus, sd_bus_message *m, uint64_t *cookie) { std::lock_guard lock(sdbusMutex_); - return ::sd_bus_send(bus, m, cookie); + auto r = ::sd_bus_send(bus, m, cookie); + if (r < 0) + return r; + + // Make sure long messages are not only stored in outgoing queues but also really sent out + ::sd_bus_flush(bus != nullptr ? bus : ::sd_bus_message_get_bus(m)); + + return r; } int SdBus::sd_bus_call(sd_bus *bus, sd_bus_message *m, uint64_t usec, sd_bus_error *ret_error, sd_bus_message **reply) @@ -62,7 +69,14 @@ int SdBus::sd_bus_call_async(sd_bus *bus, sd_bus_slot **slot, sd_bus_message *m, { std::lock_guard lock(sdbusMutex_); - return ::sd_bus_call_async(bus, slot, m, callback, userdata, usec); + auto r = ::sd_bus_call_async(bus, slot, m, callback, userdata, usec); + if (r < 0) + return r; + + // Make sure long messages are not only stored in outgoing queues but also really sent out + ::sd_bus_flush(bus != nullptr ? bus : ::sd_bus_message_get_bus(m)); + + return r; } int SdBus::sd_bus_message_new(sd_bus *bus, sd_bus_message **m, uint8_t type) diff --git a/tests/integrationtests/DBusSignalsTests.cpp b/tests/integrationtests/DBusSignalsTests.cpp index 35d1ff8..5ac40d8 100644 --- a/tests/integrationtests/DBusSignalsTests.cpp +++ b/tests/integrationtests/DBusSignalsTests.cpp @@ -89,6 +89,18 @@ TEST_F(SdbusTestObject, EmitsSignalWithMapSuccesfully) ASSERT_THAT(m_proxy->m_mapFromSignal[1], Eq("one")); } +TEST_F(SdbusTestObject, EmitsSignalWithLargeMapSuccesfully) +{ + std::map largeMap; + for (int32_t i = 0; i < 20'000; ++i) + largeMap.emplace(i, "This is string nr. " + std::to_string(i+1)); + m_adaptor->emitSignalWithMap(largeMap); + + ASSERT_TRUE(waitUntil(m_proxy->m_gotSignalWithMap)); + ASSERT_THAT(m_proxy->m_mapFromSignal[0], Eq("This is string nr. 1")); + ASSERT_THAT(m_proxy->m_mapFromSignal[1], Eq("This is string nr. 2")); +} + TEST_F(SdbusTestObject, EmitsSignalWithVariantSuccesfully) { double d = 3.14;