From 827275da3ff1f342ab6dbc9eda6fce6a856d4a85 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Fri, 9 Oct 2015 07:22:54 +0300 Subject: [PATCH] fix crash which has been caused by the fact that we've called concurrent data update and don't copy object (#66) * more correct concurrent run * move data split to awdataengineaggregator --- sources/.kdev4/awesomewidgets.kdev4 | 2 +- .../plugin/awdataengineaggregator.cpp | 17 +++++++++++------ .../plugin/awdataengineaggregator.h | 2 +- sources/awesome-widget/plugin/awkeys.cpp | 18 +++++++----------- sources/awesome-widget/plugin/awkeys.h | 4 ++-- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/sources/.kdev4/awesomewidgets.kdev4 b/sources/.kdev4/awesomewidgets.kdev4 index 970b6dc..e5d6a0a 100644 --- a/sources/.kdev4/awesomewidgets.kdev4 +++ b/sources/.kdev4/awesomewidgets.kdev4 @@ -8,7 +8,7 @@ ProjectRootRelative=./ [CMake][CMake Build Directory 0] Build Directory Path=file:///home/arcanis/Documents/github/awesome-widgets/build -Build Type=Release +Build Type=Optimizaton CMake Binary=file:///usr/bin/cmake Environment Profile= Extra Arguments= diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.cpp b/sources/awesome-widget/plugin/awdataengineaggregator.cpp index ed04e08..1574e2a 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataengineaggregator.cpp @@ -67,8 +67,8 @@ void AWDataEngineAggregator::connectVisualization() qCDebug(LOG_AW); // reconnectSources(); - connect(this, SIGNAL(updateData(QString, QVariantMap)), - parent(), SLOT(dataUpdated(QString, QVariantMap))); + connect(this, SIGNAL(updateData(QString, QVariant, QString )), + parent(), SLOT(dataUpdated(QString, QVariant, QString))); return static_cast(parent())->unlock(); } @@ -78,8 +78,8 @@ void AWDataEngineAggregator::disconnectVisualization() { qCDebug(LOG_AW); - disconnect(this, SIGNAL(updateData(QString, QVariantMap)), - parent(), SLOT(dataUpdated(QString, QVariantMap))); + disconnect(this, SIGNAL(updateData(QString, QVariant, QString)), + parent(), SLOT(dataUpdated(QString, QVariant, QString))); // m_dataEngines.clear(); // HACK run timer in the main thread since a timer could not be started from @@ -94,7 +94,7 @@ void AWDataEngineAggregator::dropSource(const QString source) qCDebug(LOG_AW) << "Source" << source; // FIXME there is no possiblibity to check to which dataengine source connected - // we will try to disconnet it from systemmonitor and extsysmon + // we will try to disconnect it from systemmonitor and extsysmon m_dataEngines[QString("systemmonitor")]->disconnectSource(source, this); m_dataEngines[QString("extsysmon")]->disconnectSource(source, this); } @@ -116,7 +116,12 @@ void AWDataEngineAggregator::dataUpdated(const QString sourceName, const Plasma: qCDebug(LOG_AW) << "Source" << sourceName; qCDebug(LOG_AW) << "Data" << data; - return emit(updateData(sourceName, data)); + // HACK "deep copy" of data to avoid plasma crash on Data object destruction + QString units = data[QString("units")].toString(); + // HACK workaround for time values which are stored in the different path + QVariant value = sourceName == QString("Local") ? data[QString("DateTime")] : data[QString("value")]; + + emit(updateData(sourceName, value, units)); } diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.h b/sources/awesome-widget/plugin/awdataengineaggregator.h index 0d872ac..10e6e15 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.h +++ b/sources/awesome-widget/plugin/awdataengineaggregator.h @@ -38,7 +38,7 @@ public: signals: void startTimer(); - void updateData(const QString sourceName, const QVariantMap sdata); + void updateData(const QString sourceName, const QVariant value, const QString units); public slots: // additional methods to control this and visualization diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 8f4b24a..da4f0e1 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -403,22 +403,20 @@ void AWKeys::addDevice(const QString source) } -void AWKeys::dataUpdated(const QString sourceName, const QVariantMap data) +void AWKeys::dataUpdated(const QString sourceName, const QVariant value, const QString units) { qCDebug(LOG_AW); qCDebug(LOG_AW) << "Source" << sourceName; - qCDebug(LOG_AW) << "Data" << data; + qCDebug(LOG_AW) << "Data" << value << units; if (lock) return; if (sourceName == QString("update")) return emit(needToBeUpdated()); #ifdef BUILD_FUTURE // run concurrent data update - QtConcurrent::run(threadPool, [this, sourceName, data]() { - return setDataBySource(sourceName, data); - }); + QtConcurrent::run(threadPool, this, &AWKeys::setDataBySource, sourceName, value, units); #else /* BUILD_FUTURE */ - return setDataBySource(sourceName, data); + return setDataBySource(sourceName, value, units); #endif /* BUILD_FUTURE */ } @@ -698,11 +696,11 @@ QString AWKeys::parsePattern(QString pattern) const } -void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) +void AWKeys::setDataBySource(const QString sourceName, const QVariant value, const QString units) { qCDebug(LOG_AW); qCDebug(LOG_AW) << "Source" << sourceName; - qCDebug(LOG_AW) << "Data" << data; + qCDebug(LOG_AW) << "Data" << value << units; #ifdef BUILD_FUTURE // drop if limits are reached @@ -716,15 +714,13 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data) // first list init QStringList tags = aggregator->keysFromSource(sourceName); if (tags.isEmpty()) - tags = aggregator->registerSource(sourceName, data[QString("units")].toString()); + tags = aggregator->registerSource(sourceName, units); // update data or drop source if there are no matches if (tags.isEmpty()) { qCDebug(LOG_AW) << "Source" << sourceName << "not found"; emit(dropSourceFromDataengine(sourceName)); } else { - // HACK workaround for time values which are stored in the different path - QVariant value = sourceName == QString("Local") ? data[QString("DateTime")] : data[QString("value")]; std::for_each(tags.cbegin(), tags.cend(), [this, value](const QString tag) { values[tag] = aggregator->formater(value, tag); }); diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 262514e..3637f73 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -60,7 +60,7 @@ public: public slots: void addDevice(const QString source); - void dataUpdated(const QString sourceName, const QVariantMap data); + void dataUpdated(const QString sourceName, const QVariant value, const QString units); signals: void dropSourceFromDataengine(const QString source); @@ -78,7 +78,7 @@ private: void addKeyToCache(const QString type, const QString key = QString("")); void calculateValues(); QString parsePattern(QString pattern) const; - void setDataBySource(const QString sourceName, const QVariantMap data); + void setDataBySource(const QString sourceName, const QVariant value, const QString units); // objects AWDataAggregator *dataAggregator = nullptr; AWDataEngineAggregator *dataEngineAggregator = nullptr;