From dfa9e39612a003e8d588dc7367d469b5db1c0481 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Tue, 16 Dec 2025 04:42:01 +0100 Subject: [PATCH 1/4] Remove recursive singleShot calls on feed items, that were creating thousands of timers and causing massive cpu overhead --- retroshare-gui/src/gui/feeds/ChatMsgItem.cpp | 10 +++++----- retroshare-gui/src/gui/feeds/ChatMsgItem.h | 1 + retroshare-gui/src/gui/feeds/SecurityIpItem.cpp | 10 +++++----- retroshare-gui/src/gui/feeds/SecurityIpItem.h | 3 ++- retroshare-gui/src/gui/feeds/SecurityItem.cpp | 9 +++++---- retroshare-gui/src/gui/feeds/SecurityItem.h | 3 ++- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp index 07d2f696d..02b1a3409 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp @@ -67,6 +67,11 @@ ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &pe updateItemStatic(); updateItem(); insertChat(message); + + m_updateTimer = new QTimer(this); + m_updateTimer->setSingleShot(false); + connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateItem())); + m_updateTimer->start(1000); } void ChatMsgItem::updateItemStatic() @@ -122,11 +127,6 @@ void ChatMsgItem::updateItem() msgButton->setEnabled(false); } } - - /* slow Tick */ - int msec_rate = 10129; - - QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); return; } diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.h b/retroshare-gui/src/gui/feeds/ChatMsgItem.h index 421cbfda8..d9216def9 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.h @@ -60,6 +60,7 @@ private: void insertChat(const std::string &message); RsPeerId mPeerId; + QTimer *m_updateTimer; }; #endif diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp index 6d03cbf56..7d49945b4 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp @@ -76,6 +76,11 @@ void SecurityIpItem::setup() updateItemStatic(); updateItem(); + + m_updateTimer = new QTimer(this); + m_updateTimer->setSingleShot(false); + connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateItem())); + m_updateTimer->start(1000); } uint64_t SecurityIpItem::uniqueIdentifier() const @@ -178,11 +183,6 @@ void SecurityIpItem::updateItem() ui->peerDetailsButton->setEnabled(true); } } - - /* slow Tick */ - int msec_rate = 10129; - - QTimer::singleShot( msec_rate, this, SLOT(updateItem(void))); } void SecurityIpItem::toggle() diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.h b/retroshare-gui/src/gui/feeds/SecurityIpItem.h index 506bb3de9..58cfc4ff5 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.h @@ -60,12 +60,13 @@ private slots: void banIpListChanged(const QString &ipAddress); private: - RsFeedTypeFlags mType; + RsFeedTypeFlags mType; RsPeerId mSslId; std::string mIpAddr; std::string mIpAddrReported; uint32_t mResult; bool mIsTest; + QTimer *m_updateTimer; /** Qt Designer generated object */ Ui::SecurityIpItem *ui; diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.cpp b/retroshare-gui/src/gui/feeds/SecurityItem.cpp index bf9e0dce6..bec9d019f 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityItem.cpp @@ -93,6 +93,11 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &g updateItemStatic(); updateItem(); + + m_updateTimer = new QTimer(this); + m_updateTimer->setSingleShot(false); + connect(m_updateTimer, &QTimer::timeout, this, &SecurityItem::updateItem); + m_updateTimer->start(1000); } SecurityItem::~SecurityItem() @@ -303,10 +308,6 @@ void SecurityItem::updateItem() //quickmsgButton->show(); } - /* slow Tick */ - int msec_rate = 10129; - - QTimer::singleShot( msec_rate, this, SLOT(updateItem( void ) )); return; } diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.h b/retroshare-gui/src/gui/feeds/SecurityItem.h index 03887c121..6f34af8fe 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityItem.h @@ -66,8 +66,9 @@ private: RsPeerId mSslId; std::string mSslCn; std::string mIP; - RsFeedTypeFlags mType; + RsFeedTypeFlags mType; bool mIsHome; + QTimer *m_updateTimer; RsEventsHandlerId_t mEventHandlerId; }; From 692ee3face71ec7729a22282f0280caab80eee47 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Thu, 18 Dec 2025 14:21:16 +0100 Subject: [PATCH 2/4] remove singleShot calls and use events handlers instead --- retroshare-gui/src/gui/feeds/ChatMsgItem.cpp | 27 ++++++++++++++++--- retroshare-gui/src/gui/feeds/ChatMsgItem.h | 4 ++- .../src/gui/feeds/SecurityIpItem.cpp | 21 ++++++++++++--- retroshare-gui/src/gui/feeds/SecurityIpItem.h | 5 +++- retroshare-gui/src/gui/feeds/SecurityItem.cpp | 6 +---- retroshare-gui/src/gui/feeds/SecurityItem.h | 1 - 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp index 02b1a3409..9fb334cbc 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp @@ -36,6 +36,9 @@ #include "gui/msgs/MessageInterface.h" +#include "util/qtthreadsutils.h" +#include + /***** * #define DEBUG_ITEM 1 ****/ @@ -68,10 +71,26 @@ ChatMsgItem::ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &pe updateItem(); insertChat(message); - m_updateTimer = new QTimer(this); - m_updateTimer->setSingleShot(false); - connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateItem())); - m_updateTimer->start(1000); + mEventHandlerId = 0; + + rsEvents->registerEventsHandler( [this](std::shared_ptr e) + { + RsQThreadUtils::postToObject([=]() + { + auto fe = dynamic_cast(e.get()); + + if(!fe || fe->mSslId != mPeerId) + return; + + updateItem(); + } + , this ); + }, mEventHandlerId, RsEventType::FRIEND_LIST ); +} + +ChatMsgItem::~ChatMsgItem() +{ + rsEvents->unregisterEventsHandler(mEventHandlerId); } void ChatMsgItem::updateItemStatic() diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.h b/retroshare-gui/src/gui/feeds/ChatMsgItem.h index d9216def9..0515b925e 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.h +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.h @@ -35,6 +35,8 @@ public: /** Default Constructor */ ChatMsgItem(FeedHolder *parent, uint32_t feedId, const RsPeerId &peerId, const std::string &message); + virtual ~ChatMsgItem(); + void updateItemStatic(); virtual uint64_t uniqueIdentifier() const override { return hash_64bits("ChatMsgItem " + mPeerId.toStdString()); } @@ -60,7 +62,7 @@ private: void insertChat(const std::string &message); RsPeerId mPeerId; - QTimer *m_updateTimer; + RsEventsHandlerId_t mEventHandlerId; }; #endif diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp index 7d49945b4..df79c7df9 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp @@ -34,6 +34,8 @@ #include #include +#include "util/qtthreadsutils.h" + /***** * #define DEBUG_ITEM 1 ****/ @@ -53,6 +55,11 @@ SecurityIpItem::SecurityIpItem(FeedHolder *parent, const RsPeerId &sslId, const setup(); } +SecurityIpItem::~SecurityIpItem() +{ + rsEvents->unregisterEventsHandler(mEventHandlerId); +} + void SecurityIpItem::setup() { /* Invoke the Qt Designer generated object setup routine */ @@ -77,10 +84,16 @@ void SecurityIpItem::setup() updateItemStatic(); updateItem(); - m_updateTimer = new QTimer(this); - m_updateTimer->setSingleShot(false); - connect(m_updateTimer, SIGNAL(timeout()), this, SLOT(updateItem())); - m_updateTimer->start(1000); + mEventHandlerId = 0; + + rsEvents->registerEventsHandler( [this](std::shared_ptr e) + { + RsQThreadUtils::postToObject([=]() + { + updateItem(); + } + , this ); + }, mEventHandlerId, RsEventType::FRIEND_LIST ); } uint64_t SecurityIpItem::uniqueIdentifier() const diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.h b/retroshare-gui/src/gui/feeds/SecurityIpItem.h index 58cfc4ff5..50c56ec5a 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.h @@ -26,6 +26,8 @@ #include "FeedItem.h" #include +#include + namespace Ui { class SecurityIpItem; } @@ -44,6 +46,7 @@ public: void updateItemStatic(); uint64_t uniqueIdentifier() const override; + virtual ~SecurityIpItem(); protected: /* FeedItem */ @@ -66,7 +69,7 @@ private: std::string mIpAddrReported; uint32_t mResult; bool mIsTest; - QTimer *m_updateTimer; + RsEventsHandlerId_t mEventHandlerId; /** Qt Designer generated object */ Ui::SecurityIpItem *ui; diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.cpp b/retroshare-gui/src/gui/feeds/SecurityItem.cpp index bec9d019f..4d21440a4 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityItem.cpp @@ -93,17 +93,13 @@ SecurityItem::SecurityItem(FeedHolder *parent, uint32_t feedId, const RsPgpId &g updateItemStatic(); updateItem(); - - m_updateTimer = new QTimer(this); - m_updateTimer->setSingleShot(false); - connect(m_updateTimer, &QTimer::timeout, this, &SecurityItem::updateItem); - m_updateTimer->start(1000); } SecurityItem::~SecurityItem() { rsEvents->unregisterEventsHandler(mEventHandlerId); } + uint64_t SecurityItem::uniqueIdentifier() const { return hash_64bits("SecurityItem " + QString::number((uint)mType).toStdString() + " " + mSslId.toStdString()); diff --git a/retroshare-gui/src/gui/feeds/SecurityItem.h b/retroshare-gui/src/gui/feeds/SecurityItem.h index 6f34af8fe..e2ba2b394 100644 --- a/retroshare-gui/src/gui/feeds/SecurityItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityItem.h @@ -68,7 +68,6 @@ private: std::string mIP; RsFeedTypeFlags mType; bool mIsHome; - QTimer *m_updateTimer; RsEventsHandlerId_t mEventHandlerId; }; From ed64bfe974a73c4c6835e08660701b759aeb0557 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Fri, 19 Dec 2025 11:36:12 +0100 Subject: [PATCH 3/4] only update relevant items in SecurityIpItem + cosmetic fixes --- retroshare-gui/src/gui/feeds/ChatMsgItem.cpp | 2 +- retroshare-gui/src/gui/feeds/SecurityIpItem.cpp | 10 +++++++--- retroshare-gui/src/gui/feeds/SecurityIpItem.h | 7 +++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp index 9fb334cbc..fdbd678d8 100644 --- a/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp +++ b/retroshare-gui/src/gui/feeds/ChatMsgItem.cpp @@ -37,7 +37,7 @@ #include "gui/msgs/MessageInterface.h" #include "util/qtthreadsutils.h" -#include +#include "retroshare/rsevents.h" /***** * #define DEBUG_ITEM 1 diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp index df79c7df9..97f2902db 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp @@ -90,9 +90,13 @@ void SecurityIpItem::setup() { RsQThreadUtils::postToObject([=]() { - updateItem(); - } - , this ); + // Filter events to only update relevant items. + auto fe = dynamic_cast(e.get()); + if(fe && fe->mSslId != mSslId) + return; + updateItem(); + } + , this ); }, mEventHandlerId, RsEventType::FRIEND_LIST ); } diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.h b/retroshare-gui/src/gui/feeds/SecurityIpItem.h index 50c56ec5a..ffaac8915 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.h +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.h @@ -21,12 +21,11 @@ #ifndef _SECURITYIPITEM_H #define _SECURITYIPITEM_H -#include "retroshare/rstypes.h" - -#include "FeedItem.h" #include -#include +#include "retroshare/rstypes.h" +#include "retroshare/rsevents.h" +#include "FeedItem.h" namespace Ui { class SecurityIpItem; From 6d3f44dfb2ab181595af0e0400fbea58333b3d90 Mon Sep 17 00:00:00 2001 From: jolavillette Date: Mon, 22 Dec 2025 11:32:31 +0100 Subject: [PATCH 4/4] Fix wrong filtering condition --- retroshare-gui/src/gui/feeds/SecurityIpItem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp index 97f2902db..6d1a3e809 100644 --- a/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp +++ b/retroshare-gui/src/gui/feeds/SecurityIpItem.cpp @@ -92,7 +92,7 @@ void SecurityIpItem::setup() { // Filter events to only update relevant items. auto fe = dynamic_cast(e.get()); - if(fe && fe->mSslId != mSslId) + if(!fe || fe->mSslId != mSslId) return; updateItem(); }