From 3be733a775f133fe1c29dc4b51f98962a05dfa86 Mon Sep 17 00:00:00 2001 From: arcan1s Date: Tue, 13 Oct 2015 01:49:12 +0300 Subject: [PATCH] drop code oriented on the stream lock in parallel updates This fact caused by the qt signal-slot implementation. Even if slots code is going into parallel they will be called in the main app thread. And also it is used inside KF5 dataengine implementation, so I'm affraid that it could not be optimized w\o backend rewriting --- .../plugin/awdataaggregator.cpp | 6 +-- .../plugin/awdataengineaggregator.cpp | 46 +++---------------- .../plugin/awdataengineaggregator.h | 7 --- sources/awesome-widget/plugin/awkeys.cpp | 35 +++----------- sources/awesome-widget/plugin/awkeys.h | 5 +- 5 files changed, 16 insertions(+), 83 deletions(-) diff --git a/sources/awesome-widget/plugin/awdataaggregator.cpp b/sources/awesome-widget/plugin/awdataaggregator.cpp index 5c3f7ce..9beb1f0 100644 --- a/sources/awesome-widget/plugin/awdataaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataaggregator.cpp @@ -69,9 +69,9 @@ QString AWDataAggregator::htmlImage(const QPixmap source) const QBuffer buffer(&byteArray); source.save(&buffer, "PNG"); - return byteArray.isEmpty() ? QString() - : QString(""). - arg(QString(byteArray.toBase64())); + return byteArray.isEmpty() + ? QString() + : QString("").arg(QString(byteArray.toBase64())); } diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.cpp b/sources/awesome-widget/plugin/awdataengineaggregator.cpp index 873f0b4..60db3a8 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataengineaggregator.cpp @@ -19,8 +19,6 @@ #include -#include - #include "awdebug.h" #include "awkeys.h" @@ -30,16 +28,8 @@ AWDataEngineAggregator::AWDataEngineAggregator(QObject *parent, const int interv { qCDebug(LOG_AW); - // timer events - m_timer = new QTimer(this); - m_timer->setSingleShot(true); - setInterval(interval); initDataEngines(); - connectVisualization(); - - connect(this, SIGNAL(startTimer()), m_timer, SLOT(start())); - connect(m_timer, SIGNAL(timeout()), this, SLOT(connectVisualization())); } @@ -48,7 +38,6 @@ AWDataEngineAggregator::~AWDataEngineAggregator() qCDebug(LOG_AW); m_dataEngines.clear(); - if (m_timer != nullptr) delete m_timer; } @@ -58,33 +47,6 @@ void AWDataEngineAggregator::setInterval(const int _interval) qCDebug(LOG_AW) << "Interval" << _interval; m_interval = _interval; - m_timer->setInterval(5 * _interval); -} - - -void AWDataEngineAggregator::connectVisualization() -{ - qCDebug(LOG_AW); - -// reconnectSources(); - connect(this, SIGNAL(updateData(QString, QVariant, QString )), - parent(), SLOT(dataUpdated(QString, QVariant, QString))); - - return static_cast(parent())->unlock(); -} - - -void AWDataEngineAggregator::disconnectVisualization() -{ - qCDebug(LOG_AW); - - 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 - // the different thread - return emit(startTimer()); } @@ -119,8 +81,9 @@ void AWDataEngineAggregator::dataUpdated(const QString sourceName, const Plasma: // 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")]; + QVariant value = sourceName == QString("Local") + ? data[QString("DateTime")] + : data[QString("value")]; emit(updateData(sourceName, value, units)); } @@ -141,4 +104,7 @@ void AWDataEngineAggregator::initDataEngines() static_cast(parent())->addDevice(source); m_dataEngines[QString("systemmonitor")]->connectSource(source, this, m_interval); }); + + connect(this, SIGNAL(updateData(QString, QVariant, QString)), + parent(), SLOT(dataUpdated(QString, QVariant, QString))); } diff --git a/sources/awesome-widget/plugin/awdataengineaggregator.h b/sources/awesome-widget/plugin/awdataengineaggregator.h index 10e6e15..f1ae2cb 100644 --- a/sources/awesome-widget/plugin/awdataengineaggregator.h +++ b/sources/awesome-widget/plugin/awdataengineaggregator.h @@ -23,8 +23,6 @@ #include -class QTimer; - class AWDataEngineAggregator : public QObject { Q_OBJECT @@ -37,13 +35,9 @@ public: void setInterval(const int _interval); signals: - void startTimer(); void updateData(const QString sourceName, const QVariant value, const QString units); public slots: - // additional methods to control this and visualization - void connectVisualization(); - void disconnectVisualization(); void dropSource(const QString source); void reconnectSources(); // data engines operations @@ -55,7 +49,6 @@ private: void initDataEngines(); QHash m_dataEngines; int m_interval; - QTimer *m_timer = nullptr; }; diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index 4774e23..857a4a7 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -49,7 +49,6 @@ AWKeys::AWKeys(QObject *parent) #ifdef BUILD_FUTURE // thread pool - m_queueLimit = 2 * QThread::idealThreadCount(); m_threadPool = new QThreadPool(this); #endif /* BUILD_FUTURE */ @@ -81,15 +80,6 @@ AWKeys::~AWKeys() } -void AWKeys::unlock() -{ - qCDebug(LOG_AW); - - qCWarning(LOG_AW) << "Unm_lock stream"; - m_lock = false; -} - - void AWKeys::initDataAggregator(const QVariantMap tooltipParams) { qCDebug(LOG_AW); @@ -115,9 +105,7 @@ void AWKeys::initKeys(const QString currentPattern, const int interval, const in } else dataEngineAggregator->setInterval(interval); #ifdef BUILD_FUTURE - int rawLimit = limit == 0 ? QThread::idealThreadCount() : limit; - m_queueLimit = 2 * rawLimit; - m_threadPool->setMaxThreadCount(rawLimit); + m_threadPool->setMaxThreadCount(limit == 0 ? QThread::idealThreadCount() : limit); #endif /* BUILD_FUTURE */ updateCache(); @@ -177,7 +165,7 @@ QStringList AWKeys::dictKeys(const bool sorted, const QString regexp) const // uptime allKeys.append(QString("uptime")); allKeys.append(QString("cuptime")); - // cpucm_lock & cpu + // cpuclock & cpu for (int i=QThread::idealThreadCount()-1; i>=0; i--) { allKeys.append(QString("cpucl%1").arg(i)); allKeys.append(QString("cpu%1").arg(i)); @@ -410,8 +398,6 @@ void AWKeys::dataUpdated(const QString sourceName, const QVariant value, const Q qCDebug(LOG_AW) << "Source" << sourceName; qCDebug(LOG_AW) << "Data" << value << units; - if (m_lock) - return; if (sourceName == QString("update")) return emit(needToBeUpdated()); @@ -714,15 +700,6 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariant value, con qCDebug(LOG_AW) << "Source" << sourceName; qCDebug(LOG_AW) << "Data" << value << units; -#ifdef BUILD_FUTURE - // drop if limits are reached - if (++m_queue > m_queueLimit) { - qCWarning(LOG_AW) << "Messages m_queue" << m_queue-- << "more than limits" << m_queueLimit; - m_lock = true; - return dataEngineAggregator->disconnectVisualization(); - } -#endif /* BUILD_FUTURE */ - // first list init QStringList tags = aggregator->keysFromSource(sourceName); if (tags.isEmpty()) @@ -733,14 +710,14 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariant value, con qCDebug(LOG_AW) << "Source" << sourceName << "not found"; emit(dropSourceFromDataengine(sourceName)); } else { +#ifdef BUILD_FUTURE m_mutex.lock(); +#endif /* BUILD_FUTURE */ std::for_each(tags.cbegin(), tags.cend(), [this, value](const QString tag) { values[tag] = aggregator->formater(value, tag); }); - m_mutex.unlock(); - } - #ifdef BUILD_FUTURE - m_queue--; + m_mutex.unlock(); #endif /* BUILD_FUTURE */ + } } diff --git a/sources/awesome-widget/plugin/awkeys.h b/sources/awesome-widget/plugin/awkeys.h index 103a10b..80f8cc3 100644 --- a/sources/awesome-widget/plugin/awkeys.h +++ b/sources/awesome-widget/plugin/awkeys.h @@ -47,7 +47,6 @@ public: const int limit); Q_INVOKABLE void setAggregatorProperty(const QString key, const QVariant value); Q_INVOKABLE void setWrapNewLines(const bool wrap = false); - Q_INVOKABLE void unlock(); Q_INVOKABLE void updateCache(); // keys Q_INVOKABLE QStringList dictKeys(const bool sorted = false, @@ -95,11 +94,9 @@ private: QString m_pattern; QHash values; bool m_wrapNewLines = false; - // queue and stream lock properties + // multithread features QThreadPool *m_threadPool = nullptr; QMutex m_mutex; - int m_queueLimit, m_queue = 0; - bool m_lock = true; };