mirror of
				https://github.com/arcan1s/awesome-widgets.git
				synced 2025-11-04 06:43:41 +00:00 
			
		
		
		
	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
This commit is contained in:
		@ -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=
 | 
			
		||||
 | 
			
		||||
@ -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<AWKeys *>(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));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
@ -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);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user