QDBusMenuConnection: Close open D-Bus connection
Using QSystemTrayIcon::isSystemTrayAvailable() generates a new connection from QDBusTrayIcon::isSystemTrayAvailable() with a new unique instance ID. These were never closed, so calling QSystemTrayIcon::isSystemTrayAvailable() frequently leads to crash when it runs out of file descriptors. Fixes: QTBUG-94839 Change-Id: Ib71441a6b680d8633707cc02f9b6081c0f02472b Reviewed-by: Dmitry Shachnev <mitya57@gmail.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io> (cherry picked from commit 2ca19d2dd3137f2c29dcb2b1f2d23b23f3f1b0aa) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
4d32382976
commit
52f93a88eb
@ -70,6 +70,7 @@ const QString MenuBarPath = QLatin1String("/MenuBar");
|
|||||||
*/
|
*/
|
||||||
QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName)
|
QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &serviceName)
|
||||||
: QObject(parent)
|
: QObject(parent)
|
||||||
|
, m_serviceName(serviceName)
|
||||||
, m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
|
, m_connection(serviceName.isNull() ? QDBusConnection::sessionBus()
|
||||||
: QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
|
: QDBusConnection::connectToBus(QDBusConnection::SessionBus, serviceName))
|
||||||
, m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
|
, m_dbusWatcher(new QDBusServiceWatcher(StatusNotifierWatcherService, m_connection, QDBusServiceWatcher::WatchForRegistration, this))
|
||||||
@ -84,6 +85,12 @@ QDBusMenuConnection::QDBusMenuConnection(QObject *parent, const QString &service
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDBusMenuConnection::~QDBusMenuConnection()
|
||||||
|
{
|
||||||
|
if (!m_serviceName.isEmpty() && m_connection.isConnected())
|
||||||
|
QDBusConnection::disconnectFromBus(m_serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
void QDBusMenuConnection::dbusError(const QDBusError &error)
|
void QDBusMenuConnection::dbusError(const QDBusError &error)
|
||||||
{
|
{
|
||||||
qWarning() << "QDBusTrayIcon encountered a D-Bus error:" << error;
|
qWarning() << "QDBusTrayIcon encountered a D-Bus error:" << error;
|
||||||
|
@ -71,6 +71,7 @@ class QDBusMenuConnection : public QObject
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString());
|
QDBusMenuConnection(QObject *parent = nullptr, const QString &serviceName = QString());
|
||||||
|
~QDBusMenuConnection();
|
||||||
QDBusConnection connection() const { return m_connection; }
|
QDBusConnection connection() const { return m_connection; }
|
||||||
QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; }
|
QDBusServiceWatcher *dbusWatcher() const { return m_dbusWatcher; }
|
||||||
bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
|
bool isStatusNotifierHostRegistered() const { return m_statusNotifierHostRegistered; }
|
||||||
@ -91,6 +92,7 @@ private Q_SLOTS:
|
|||||||
void dbusError(const QDBusError &error);
|
void dbusError(const QDBusError &error);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
QString m_serviceName;
|
||||||
QDBusConnection m_connection;
|
QDBusConnection m_connection;
|
||||||
QDBusServiceWatcher *m_dbusWatcher;
|
QDBusServiceWatcher *m_dbusWatcher;
|
||||||
bool m_statusNotifierHostRegistered;
|
bool m_statusNotifierHostRegistered;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user