diff options
author | Kevron Rees <kevron.m.rees@intel.com> | 2013-12-13 14:55:05 -0800 |
---|---|---|
committer | Kevron Rees <kevron.m.rees@intel.com> | 2013-12-13 14:55:05 -0800 |
commit | 797ff4f161693a4c3663bba5d275e747726df000 (patch) | |
tree | 82de3603a30de92dca2126fa10222528151e7c6c | |
parent | 21ce9b1344a2355d0e62f490164888bd1c89a1ae (diff) | |
download | automotive-message-broker-797ff4f161693a4c3663bba5d275e747726df000.tar.gz |
throttle dbus signals
-rw-r--r-- | ambd/core.cpp | 2 | ||||
-rw-r--r-- | examples/dbusconfig | 2 | ||||
-rw-r--r-- | plugins/dbus/CMakeLists.txt | 4 | ||||
-rw-r--r-- | plugins/dbus/abstractdbusinterface.cpp | 33 | ||||
-rw-r--r-- | plugins/dbus/dbussignaller.hpp | 99 |
5 files changed, 114 insertions, 26 deletions
diff --git a/ambd/core.cpp b/ambd/core.cpp index fd7e487a..4bd73365 100644 --- a/ambd/core.cpp +++ b/ambd/core.cpp @@ -40,6 +40,8 @@ static int PPSUpdate(void* data) } *pps = 0; + + return 1; } Core::Core() diff --git a/examples/dbusconfig b/examples/dbusconfig index 761cf9f9..24254b79 100644 --- a/examples/dbusconfig +++ b/examples/dbusconfig @@ -3,7 +3,7 @@ { "name" : "ExampleSouce", "path" : "/usr/lib/automotive-message-broker/examplesourceplugin.so", - "delay" : "1000" + "delay" : "6" } ], "sinks": [ diff --git a/plugins/dbus/CMakeLists.txt b/plugins/dbus/CMakeLists.txt index 5ee4a43b..be41b6fc 100644 --- a/plugins/dbus/CMakeLists.txt +++ b/plugins/dbus/CMakeLists.txt @@ -3,9 +3,9 @@ include_directories(${CMAKE_SOURCE_DIR}/lib ${include_dirs}) pkg_check_modules(gio REQUIRED gio-2.0) -set(dbussinkplugin_headers automotivemanager.h dbusplugin.h abstractproperty.h abstractdbusinterface.h dbusinterfacemanager.h runningstatus.h varianttype.h +set(dbussinkplugin_headers dbussignaller.hpp automotivemanager.h dbusplugin.h abstractproperty.h abstractdbusinterface.h dbusinterfacemanager.h runningstatus.h varianttype.h custompropertyinterface.h uncategorizedproperty.h environmentproperties.h vehicleinfo.h maintenance.h parking.h fakeidlheader.h drivingsafety.h) -set(dbussinkplugin_sources automotivemanager.cpp dbusplugin.cpp abstractproperty.cpp abstractdbusinterface.cpp dbusinterfacemanager.cpp runningstatus.cpp +set(dbussinkplugin_sources dbussignaller.hpp automotivemanager.cpp dbusplugin.cpp abstractproperty.cpp abstractdbusinterface.cpp dbusinterfacemanager.cpp runningstatus.cpp varianttype.cpp custompropertyinterface.cpp uncategorizedproperty.cpp environmentproperties.cpp vehicleinfo.cpp maintenance.cpp parking.cpp drivingsafety.cpp) add_library(dbussinkplugin MODULE ${dbussinkplugin_sources}) diff --git a/plugins/dbus/abstractdbusinterface.cpp b/plugins/dbus/abstractdbusinterface.cpp index aedbaa3c..b5003804 100644 --- a/plugins/dbus/abstractdbusinterface.cpp +++ b/plugins/dbus/abstractdbusinterface.cpp @@ -27,6 +27,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA #include "abstractproperty.h" +#include "dbussignaller.hpp" + +static DBusSignaller* signaller = nullptr; + unordered_map<string, AbstractDBusInterface*> AbstractDBusInterface::objectMap; list<string> AbstractDBusInterface::mimplementedProperties; @@ -188,6 +192,11 @@ AbstractDBusInterface::AbstractDBusInterface(string interfaceName, string object GDBusConnection* connection) : mInterfaceName(interfaceName), mConnection(connection), mPropertyName(objectName), supported(false), zoneFilter(Zone::None), mTime(0), regId(0) { + if(!signaller) + { + signaller = DBusSignaller::factory(50); + } + startRegistration(); mObjectPath = "/" + objectName; @@ -323,29 +332,7 @@ void AbstractDBusInterface::updateValue(AbstractProperty *property) return; } - GError *error = NULL; - GVariant* val = g_variant_ref(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}", std::string(property->name() + "Sequence").c_str(), g_variant_new("i", property->sequence())); - g_variant_builder_add(&builder, "{sv}", "Time", g_variant_new("d", mTime) ); - - g_dbus_connection_emit_signal(mConnection, NULL, mObjectPath.c_str(), "org.freedesktop.DBus.Properties", "PropertiesChanged", g_variant_new("(sa{sv}as)", - mInterfaceName.c_str(), - &builder, NULL), &error); - - if(error) - { - DebugOut(DebugOut::Error)<<error->message<<endl; - g_error_free(error); - } - - g_variant_unref(val); + signaller->fireSignal(mConnection, mObjectPath, "org.freedesktop.DBus.Properties", "PropertiesChanged", property); } std::list<AbstractDBusInterface *> AbstractDBusInterface::getObjectsForProperty(string object) diff --git a/plugins/dbus/dbussignaller.hpp b/plugins/dbus/dbussignaller.hpp new file mode 100644 index 00000000..2f6fcc49 --- /dev/null +++ b/plugins/dbus/dbussignaller.hpp @@ -0,0 +1,99 @@ +#ifndef _DBUSSIGNALLER_H_ +#define _DBUSSINGALLER_H_ + +#include <gio/gio.h> +#include <map> +#include <string> + +#include "debugout.h" +#include "abstractproperty.h" + +class DBusSignaller +{ +public: + + static DBusSignaller* factory(int timeout) + { + return new DBusSignaller(timeout); + } + + void fireSignal(GDBusConnection* conn, std::string objPath, std::string iface, std::string sigName, AbstractProperty* prop) + { + DBusSignal signal(conn, objPath, iface, sigName, prop); + + queue[objPath] = signal; + } + + class DBusSignal + { + public: + DBusSignal():connection(nullptr), property(nullptr){} + DBusSignal(GDBusConnection* conn, std::string objPath, std::string iface, std::string sigName, AbstractProperty* var) + : connection(conn), objectPath(objPath), interface(iface), signalName(sigName), property(var) + { + + } + + GDBusConnection* connection; + std::string objectPath; + std::string interface; + std::string signalName; + AbstractProperty* property; + }; + +private: + + DBusSignaller() { } + + DBusSignaller(int timeout) + { + g_timeout_add(timeout,[](gpointer userData) + { + std::map<std::string, DBusSignal> *q = static_cast<std::map<std::string, DBusSignal>*>(userData); + std::map<std::string, DBusSignal> queue = *q; + + for(auto sig : queue) + { + DBusSignal signal = sig.second; + + GError* error = nullptr; + + AbstractProperty* property = signal.property; + + GVariant* val = g_variant_ref(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}", 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_dbus_connection_emit_signal(signal.connection, NULL, signal.objectPath.c_str(), signal.interface.c_str(), signal.signalName.c_str(), g_variant_new("(sa{sv}as)", + signal.interface.c_str(), + &builder, NULL), &error); + + if(error) + { + DebugOut(DebugOut::Error)<<error->message<<std::endl; + } + + queue.erase(signal.objectPath); + + } + + *q = queue; + + return 1; + + },&queue); + } + + std::map<std::string, DBusSignal> queue; + + +}; + +#endif |