Skip to content

Commit 975cac4

Browse files
yixinsharkdeepin-bot[bot]
authored andcommitted
fix: memory leaks in SNI tooltip and Xembed container window
- Delete m_tooltip QLabel in SniTrayProtocolHandler destructor (parentless QLabel leaked on each handler destruction) - Remove tooltip entry from TrayPlugin::m_tooltip QHash on handler removal (stale entries accumulated in the map) - Destroy X11 container window in XembedProtocolHandler destructor (X11 resource leaked on each handler destruction) - Cache SNI icon to avoid repeated expensive DBus image conversion in frequently-called icon() - Use QThreadPool instead of std::thread::detach() for DDE indicator DBus trigger (reuse threads, reduce overhead) - 修复 SniTrayProtocolHandler 析构时未删除无父对象的 m_tooltip QLabel 导致内存泄漏 - 修复 handler 销毁时未清理 TrayPlugin::m_tooltip QHash 条目导致条目累积 - 修复 XembedProtocolHandler 析构时未销毁 X11 container window 导致 X11 资源泄漏 - 缓存 SNI 图标避免高频率调用的 icon() 每次重复转换 DBus 图像数据 - 将 DDE indicator DBus 触发器的线程模型从 std::thread::detach() 改为 QThreadPool 线程复用 Log: fix: memory leaks in SNI tooltip and Xembed container window Pms: 359161
1 parent 6dcbe97 commit 975cac4

5 files changed

Lines changed: 32 additions & 16 deletions

File tree

plugins/application-tray/ddeindicatortrayprotocol.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2024-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -22,7 +22,8 @@
2222
#include <QLoggingCategory>
2323

2424
#include <cmath>
25-
#include <thread>
25+
#include <QThreadPool>
26+
#include <QRunnable>
2627

2728
namespace tray {
2829

@@ -150,25 +151,25 @@ void DDEindicatorProtocolHandlerPrivate::initDBus()
150151
}
151152

152153
const QJsonObject action = config.value("action").toObject();
153-
if (!action.isEmpty())
154-
q->connect(q, &DDEindicatorProtocolHandler::clicked, q, [ = ](uint8_t button_index, int x, int y) {
155-
std::thread t([ = ] ()-> void {
156-
auto triggerConfig = action.value("trigger").toObject();
157-
auto dbusService = triggerConfig.value("dbus_service").toString();
158-
auto dbusPath = triggerConfig.value("dbus_path").toString();
159-
auto dbusInterface = triggerConfig.value("dbus_interface").toString();
160-
auto methodName = triggerConfig.value("dbus_method").toString();
161-
auto isSystemBus = triggerConfig.value("system_dbus").toBool(false);
154+
if (!action.isEmpty()) {
155+
const auto triggerConfig = action.value("trigger").toObject();
156+
const auto dbusService = triggerConfig.value("dbus_service").toString();
157+
const auto dbusPath = triggerConfig.value("dbus_path").toString();
158+
const auto dbusInterface = triggerConfig.value("dbus_interface").toString();
159+
const auto methodName = triggerConfig.value("dbus_method").toString();
160+
const auto isSystemBus = triggerConfig.value("system_dbus").toBool(false);
161+
162+
q->connect(q, &DDEindicatorProtocolHandler::clicked, q, [=](uint8_t button_index, int x, int y) {
163+
QThreadPool::globalInstance()->start([=] {
162164
auto bus = isSystemBus ? QDBusConnection::systemBus() : QDBusConnection::sessionBus();
163-
164165
QDBusInterface interface(dbusService, dbusPath, dbusInterface, bus);
165166
QDBusReply<void> reply = interface.call(methodName, button_index, x, y);
166167
if (!reply.isValid()) {
167168
interface.call(methodName);
168169
}
169170
});
170-
t.detach();
171171
});
172+
}
172173
});
173174
}
174175

plugins/application-tray/sniprotocolhandler.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,10 @@ SniTrayProtocolHandler::SniTrayProtocolHandler(const QString &sniServicePath, QO
153153
m_sniInter->setTimeout(2000);
154154
init();
155155

156-
connect(m_sniInter, &StatusNotifierItem::NewIcon, this, &SniTrayProtocolHandler::iconChanged);
156+
connect(m_sniInter, &StatusNotifierItem::NewIcon, this, [this] {
157+
m_cachedIcon = dbusImageList2QIcon(m_sniInter->iconPixmap());
158+
Q_EMIT iconChanged();
159+
});
157160
connect(m_sniInter, &StatusNotifierItem::NewOverlayIcon, this, &SniTrayProtocolHandler::overlayIconChanged);
158161
connect(m_sniInter, &StatusNotifierItem::NewAttentionIcon, this, [this] {
159162
if (m_ignoreFirstAttention) {
@@ -177,13 +180,19 @@ SniTrayProtocolHandler::SniTrayProtocolHandler(const QString &sniServicePath, QO
177180

178181
SniTrayProtocolHandler::~SniTrayProtocolHandler()
179182
{
183+
if (m_tooltip) {
184+
delete m_tooltip;
185+
m_tooltip = nullptr;
186+
}
187+
180188
UTIL->removeUniqueId(m_id);
181189
}
182190

183191
void SniTrayProtocolHandler::init()
184192
{
185193
generateId();
186194
m_menuPath = m_sniInter->menu().path();
195+
m_cachedIcon = dbusImageList2QIcon(m_sniInter->iconPixmap());
187196
}
188197

189198
void SniTrayProtocolHandler::generateId()
@@ -287,7 +296,7 @@ QIcon SniTrayProtocolHandler::icon() const
287296
}
288297
}
289298

290-
return dbusImageList2QIcon(m_sniInter->iconPixmap());
299+
return m_cachedIcon;
291300
}
292301

293302
bool SniTrayProtocolHandler::enabled() const

plugins/application-tray/sniprotocolhandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,6 @@ class SniTrayProtocolHandler : public AbstractTrayProtocolHandler
8787
QString m_service;
8888
QString m_menuPath;
8989
bool m_ignoreFirstAttention;
90+
QIcon m_cachedIcon;
9091
};
9192
}

plugins/application-tray/trayplugin.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
1+
// SPDX-FileCopyrightText: 2024-2026 UnionTech Software Technology Co., Ltd.
22
//
33
// SPDX-License-Identifier: GPL-3.0-or-later
44

@@ -90,6 +90,7 @@ void TrayPlugin::onTrayhandlerCreatd(QPointer<AbstractTrayProtocolHandler> handl
9090
}
9191

9292
m_widget.remove(id);
93+
m_tooltip.remove(id);
9394
};
9495

9596
auto showWidget = [this, handler, id](){

plugins/application-tray/xembedprotocolhandler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ XembedProtocolHandler::XembedProtocolHandler(const uint32_t& id, QObject* parent
127127
: AbstractTrayProtocolHandler(parent)
128128
, m_enabled(false)
129129
, m_windowId(id)
130+
, m_containerWid(0)
130131
, m_hoverTimer(new QTimer(this))
131132
, m_attentionTimer(new QTimer(this))
132133
, m_iconUpdateTimer(new QTimer(this))
@@ -159,6 +160,9 @@ XembedProtocolHandler::XembedProtocolHandler(const uint32_t& id, QObject* parent
159160

160161
XembedProtocolHandler::~XembedProtocolHandler()
161162
{
163+
if (m_containerWid) {
164+
xcb_destroy_window(Util::instance()->getX11Connection(), m_containerWid);
165+
}
162166
UTIL->removeUniqueId(m_id);
163167
}
164168

0 commit comments

Comments
 (0)