From: Kevron Rees Date: Fri, 8 Aug 2014 21:51:11 +0000 (-0700) Subject: DBus signaller will combine duplicate signals for same object path X-Git-Tag: 0.12.903~133 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9ba6b54dd1339651006692f704bc53a6b4f92030;p=profile%2Fivi%2Fautomotive-message-broker.git DBus signaller will combine duplicate signals for same object path This change should improve performance when multiple properties change on an object per round. --- diff --git a/plugins/dbus/dbussignaller.h b/plugins/dbus/dbussignaller.h index bb843ea..3321e39 100644 --- a/plugins/dbus/dbussignaller.h +++ b/plugins/dbus/dbussignaller.h @@ -10,6 +10,7 @@ #include "debugout.h" #include "abstractproperty.h" #include "superptr.hpp" +#include "listplusplus.h" class DBusSignal { @@ -82,18 +83,44 @@ private: { std::unique_ptr signal(s); + /// Combine this with any other signals to be fired from the same object: + std::vector dupprops; + std::vector toRemoveQueue; + for(auto s2 : queue) + { + if(s != s2 && s2->objectPath == s2->objectPath) + { + std::unique_ptr signal2(s2); + dupprops.push_back(signal2->property); + toRemoveQueue.push_back(signal2.get()); + } + } + + for(auto toRemove : toRemoveQueue) + { + removeOne(&queue, toRemove); + } + GError* error = nullptr; AbstractProperty* property = signal->property; - GVariant* val = g_variant_ref(property->toGVariant()); + + auto val = amb::make_super(property->toGVariant()); /// Send PropertiesChanged signal GVariantBuilder builder; g_variant_builder_init(&builder, G_VARIANT_TYPE_DICTIONARY); - g_variant_builder_add(&builder, "{sv}", property->name().c_str(), val); + g_variant_builder_add(&builder, "{sv}", property->name().c_str(), val.get()); + + for(auto v : dupprops) + { + auto var = amb::make_super(v->toGVariant()); + g_variant_builder_add(&builder, "{sv}", v->name().c_str(), var.get()); + } + g_variant_builder_add(&builder, "{sv}", std::string(property->name() + "Sequence").c_str(), g_variant_new("i", property->sequence())); g_variant_builder_add(&builder, "{sv}", "Time", g_variant_new("d", property->timestamp()) ); g_variant_builder_add(&builder, "{sv}", "Zone", g_variant_new("i", property->value()->zone) );