summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevron Rees <kevron.m.rees@intel.com>2013-12-13 14:55:05 -0800
committerKevron Rees <kevron.m.rees@intel.com>2013-12-13 14:55:05 -0800
commit797ff4f161693a4c3663bba5d275e747726df000 (patch)
tree82de3603a30de92dca2126fa10222528151e7c6c
parent21ce9b1344a2355d0e62f490164888bd1c89a1ae (diff)
downloadautomotive-message-broker-797ff4f161693a4c3663bba5d275e747726df000.tar.gz
throttle dbus signals
-rw-r--r--ambd/core.cpp2
-rw-r--r--examples/dbusconfig2
-rw-r--r--plugins/dbus/CMakeLists.txt4
-rw-r--r--plugins/dbus/abstractdbusinterface.cpp33
-rw-r--r--plugins/dbus/dbussignaller.hpp99
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