mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-04-24 23:47:20 +00:00
add one more workaround for possible freezes (#96)
First of all it seems that freezes were caused by stuck dbus calls. I've enabled dbus call timeout (build-configured, default to 3000 msec). And moreover I've added one more thread lock for dbus calls.
This commit is contained in:
parent
b20a96d32f
commit
0f1763cb81
89
patches/fix-dbus-calls.patch
Normal file
89
patches/fix-dbus-calls.patch
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp
|
||||||
|
index 69934c4..a48b8e7 100644
|
||||||
|
--- a/sources/extsysmon/extsysmon.cpp
|
||||||
|
+++ b/sources/extsysmon/extsysmon.cpp
|
||||||
|
@@ -74,7 +74,10 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source)
|
||||||
|
qCDebug(LOG_ESM) << "Source" << source;
|
||||||
|
|
||||||
|
if (aggregator->hasSource(source)) {
|
||||||
|
- setData(source, QString("value"), aggregator->data(source));
|
||||||
|
+ QVariant data = aggregator->data(source);
|
||||||
|
+ if (data.isNull())
|
||||||
|
+ return false;
|
||||||
|
+ setData(source, QString("value"), data);
|
||||||
|
} else {
|
||||||
|
qCWarning(LOG_ESM) << "Unknown source" << source;
|
||||||
|
return false;
|
||||||
|
diff --git a/sources/extsysmon/sources/playersource.cpp b/sources/extsysmon/sources/playersource.cpp
|
||||||
|
index 769ed9d..c51511c 100644
|
||||||
|
--- a/sources/extsysmon/sources/playersource.cpp
|
||||||
|
+++ b/sources/extsysmon/sources/playersource.cpp
|
||||||
|
@@ -164,12 +164,16 @@ void PlayerSource::run()
|
||||||
|
QHash<QString, QVariant> data = getPlayerMpdInfo(m_mpdAddress);
|
||||||
|
for (auto key : data.keys())
|
||||||
|
m_values[key] = data[key];
|
||||||
|
} else if (m_player == QString("mpris")) {
|
||||||
|
// players which supports mpris
|
||||||
|
- QString mpris = m_mpris == QString("auto") ? getAutoMpris() : m_mpris;
|
||||||
|
- QHash<QString, QVariant> data = getPlayerMprisInfo(mpris);
|
||||||
|
- for (auto key : data.keys())
|
||||||
|
- m_values[key] = data[key];
|
||||||
|
+ if (m_dbusMutex.tryLock()) {
|
||||||
|
+ QString mpris
|
||||||
|
+ = m_mpris == QString("auto") ? getAutoMpris() : m_mpris;
|
||||||
|
+ QHash<QString, QVariant> data = getPlayerMprisInfo(mpris);
|
||||||
|
+ for (auto key : data.keys())
|
||||||
|
+ m_values[key] = data[key];
|
||||||
|
+ m_dbusMutex.unlock();
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
// dymanic properties
|
||||||
|
@@ -258,7 +262,7 @@ QVariantHash PlayerSource::defaultInfo() const
|
||||||
|
QString PlayerSource::getAutoMpris() const
|
||||||
|
{
|
||||||
|
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(
|
||||||
|
- QDBus::BlockWithGui, QString("ListNames"));
|
||||||
|
+ QDBus::BlockWithGui, QString("ListNames"), DBUS_CALL_TIMEOUT);
|
||||||
|
if (listServices.arguments().isEmpty())
|
||||||
|
return QString();
|
||||||
|
QStringList arguments = listServices.arguments().first().toStringList();
|
||||||
|
@@ -315,7 +319,8 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const
|
||||||
|
QString("org.mpris.MediaPlayer2.%1").arg(mpris),
|
||||||
|
QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get"));
|
||||||
|
request.setArguments(args);
|
||||||
|
- QDBusMessage response = bus.call(request, QDBus::BlockWithGui);
|
||||||
|
+ QDBusMessage response
|
||||||
|
+ = bus.call(request, QDBus::BlockWithGui, DBUS_CALL_TIMEOUT);
|
||||||
|
if ((response.type() != QDBusMessage::ReplyMessage)
|
||||||
|
|| (response.arguments().isEmpty())) {
|
||||||
|
qCWarning(LOG_ESS) << "Error message" << response.errorMessage();
|
||||||
|
diff --git a/sources/extsysmon/sources/playersource.h b/sources/extsysmon/sources/playersource.h
|
||||||
|
index 0d8bbfc..2164354 100644
|
||||||
|
--- a/sources/extsysmon/sources/playersource.h
|
||||||
|
+++ b/sources/extsysmon/sources/playersource.h
|
||||||
|
@@ -18,11 +18,16 @@
|
||||||
|
#ifndef PLAYERSOURCE_H
|
||||||
|
#define PLAYERSOURCE_H
|
||||||
|
|
||||||
|
+#include <QMutex>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "abstractextsysmonsource.h"
|
||||||
|
|
||||||
|
|
||||||
|
+#ifndef DBUS_CALL_TIMEOUT
|
||||||
|
+#define DBUS_CALL_TIMEOUT 3000
|
||||||
|
+#endif /* DBUS_CALL_TIMEOUT */
|
||||||
|
+
|
||||||
|
class QProcess;
|
||||||
|
|
||||||
|
class PlayerSource : public AbstractExtSysMonSource
|
||||||
|
@@ -52,6 +57,7 @@ private:
|
||||||
|
QVariantHash m_mpdCached;
|
||||||
|
QProcess *m_mpdProcess = nullptr;
|
||||||
|
QString m_mpris;
|
||||||
|
+ QMutex m_dbusMutex;
|
||||||
|
QString m_player;
|
||||||
|
int m_symbols;
|
||||||
|
QStringList m_metadata = QStringList() << QString("album")
|
@ -74,7 +74,10 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source)
|
|||||||
qCDebug(LOG_ESM) << "Source" << source;
|
qCDebug(LOG_ESM) << "Source" << source;
|
||||||
|
|
||||||
if (aggregator->hasSource(source)) {
|
if (aggregator->hasSource(source)) {
|
||||||
setData(source, QString("value"), aggregator->data(source));
|
QVariant data = aggregator->data(source);
|
||||||
|
if (data.isNull())
|
||||||
|
return false;
|
||||||
|
setData(source, QString("value"), data);
|
||||||
} else {
|
} else {
|
||||||
qCWarning(LOG_ESM) << "Unknown source" << source;
|
qCWarning(LOG_ESM) << "Unknown source" << source;
|
||||||
return false;
|
return false;
|
||||||
|
@ -164,8 +164,12 @@ void PlayerSource::run()
|
|||||||
m_values = getPlayerMpdInfo(m_mpdAddress);
|
m_values = getPlayerMpdInfo(m_mpdAddress);
|
||||||
} else if (m_player == QString("mpris")) {
|
} else if (m_player == QString("mpris")) {
|
||||||
// players which supports mpris
|
// players which supports mpris
|
||||||
QString mpris = m_mpris == QString("auto") ? getAutoMpris() : m_mpris;
|
if (m_dbusMutex.tryLock()) {
|
||||||
|
QString mpris
|
||||||
|
= m_mpris == QString("auto") ? getAutoMpris() : m_mpris;
|
||||||
m_values = getPlayerMprisInfo(mpris);
|
m_values = getPlayerMprisInfo(mpris);
|
||||||
|
m_dbusMutex.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// dymanic properties
|
// dymanic properties
|
||||||
@ -258,7 +262,7 @@ QVariantHash PlayerSource::defaultInfo() const
|
|||||||
QString PlayerSource::getAutoMpris() const
|
QString PlayerSource::getAutoMpris() const
|
||||||
{
|
{
|
||||||
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(
|
QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call(
|
||||||
QDBus::BlockWithGui, QString("ListNames"));
|
QDBus::BlockWithGui, QString("ListNames"), DBUS_CALL_TIMEOUT);
|
||||||
if (listServices.arguments().isEmpty())
|
if (listServices.arguments().isEmpty())
|
||||||
return QString();
|
return QString();
|
||||||
QStringList arguments = listServices.arguments().first().toStringList();
|
QStringList arguments = listServices.arguments().first().toStringList();
|
||||||
@ -315,7 +319,8 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const
|
|||||||
QString("org.mpris.MediaPlayer2.%1").arg(mpris),
|
QString("org.mpris.MediaPlayer2.%1").arg(mpris),
|
||||||
QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get"));
|
QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get"));
|
||||||
request.setArguments(args);
|
request.setArguments(args);
|
||||||
QDBusMessage response = bus.call(request, QDBus::BlockWithGui);
|
QDBusMessage response
|
||||||
|
= bus.call(request, QDBus::BlockWithGui, DBUS_CALL_TIMEOUT);
|
||||||
if ((response.type() != QDBusMessage::ReplyMessage)
|
if ((response.type() != QDBusMessage::ReplyMessage)
|
||||||
|| (response.arguments().isEmpty())) {
|
|| (response.arguments().isEmpty())) {
|
||||||
qCWarning(LOG_ESS) << "Error message" << response.errorMessage();
|
qCWarning(LOG_ESS) << "Error message" << response.errorMessage();
|
||||||
|
@ -18,11 +18,16 @@
|
|||||||
#ifndef PLAYERSOURCE_H
|
#ifndef PLAYERSOURCE_H
|
||||||
#define PLAYERSOURCE_H
|
#define PLAYERSOURCE_H
|
||||||
|
|
||||||
|
#include <QMutex>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
#include "abstractextsysmonsource.h"
|
#include "abstractextsysmonsource.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DBUS_CALL_TIMEOUT
|
||||||
|
#define DBUS_CALL_TIMEOUT 3000
|
||||||
|
#endif /* DBUS_CALL_TIMEOUT */
|
||||||
|
|
||||||
class QProcess;
|
class QProcess;
|
||||||
|
|
||||||
class PlayerSource : public AbstractExtSysMonSource
|
class PlayerSource : public AbstractExtSysMonSource
|
||||||
@ -52,6 +57,7 @@ private:
|
|||||||
QVariantHash m_mpdCached;
|
QVariantHash m_mpdCached;
|
||||||
QProcess *m_mpdProcess = nullptr;
|
QProcess *m_mpdProcess = nullptr;
|
||||||
QString m_mpris;
|
QString m_mpris;
|
||||||
|
QMutex m_dbusMutex;
|
||||||
QString m_player;
|
QString m_player;
|
||||||
int m_symbols;
|
int m_symbols;
|
||||||
QStringList m_metadata = QStringList() << QString("album")
|
QStringList m_metadata = QStringList() << QString("album")
|
||||||
|
Loading…
Reference in New Issue
Block a user