From 5f15414e65ef19d9a2427ed9724d955f6ffc50d9 Mon Sep 17 00:00:00 2001 From: csoler Date: Mon, 15 Feb 2021 22:37:43 +0100 Subject: [PATCH 1/6] experimental fix against early closing crash on CreateCircleDialog --- .../src/gui/Circles/CreateCircleDialog.cpp | 26 +++++++++++++++++-- .../src/gui/Circles/CreateCircleDialog.h | 10 +++++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 399715dc0..2d698b54e 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -51,7 +51,10 @@ CreateCircleDialog::CreateCircleDialog() : QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint) { - /* Invoke the Qt Designer generated object setup routine */ + mIdentitiesLoading = false; + mCloseAfterIdentitiesLoaded = false; + + /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); setAttribute(Qt::WA_DeleteOnClose, false); @@ -112,11 +115,22 @@ CreateCircleDialog::CreateCircleDialog() QObject::connect(ui.radioButton_Public, SIGNAL(toggled(bool)), this, SLOT(updateCircleType(bool))) ; QObject::connect(ui.radioButton_Self, SIGNAL(toggled(bool)), this, SLOT(updateCircleType(bool))) ; QObject::connect(ui.radioButton_Restricted, SIGNAL(toggled(bool)), this, SLOT(updateCircleType(bool))) ; + } CreateCircleDialog::~CreateCircleDialog() { } +void CreateCircleDialog::closeEvent(QCloseEvent *e) +{ + if(mIdentitiesLoading) + { + mCloseAfterIdentitiesLoaded = true; + return; + } + else + QDialog::closeEvent(e); +} void CreateCircleDialog::editExistingId(const RsGxsGroupId &circleId, const bool &clearList /*= true*/,bool readonly) { @@ -700,6 +714,8 @@ void CreateCircleDialog::loadIdentities() { std::cerr << "Loading identities..." << std::endl; + mIdentitiesLoading = true; + RsThread::async([this]() { std::list ids_meta; @@ -735,7 +751,13 @@ void CreateCircleDialog::loadIdentities() fillIdentitiesList(*id_groups); delete id_groups; - }, this ); + + mIdentitiesLoading = false; + + if(mCloseAfterIdentitiesLoaded) + close(); + + }, this ); }); } diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h index 8ced0ecdc..b931c0f32 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h @@ -44,7 +44,8 @@ public: void addCircle(const RsGxsCircleDetails &cirDetails); private slots: - void addMember(); + + void addMember(); void removeMember(); void updateCircleType(bool b); @@ -60,6 +61,9 @@ private slots: void IdListCustomPopupMenu( QPoint point ); void MembershipListCustomPopupMenu( QPoint point); +protected: + virtual void closeEvent(QCloseEvent *) override; + private: void updateCircleGUI(); @@ -69,7 +73,9 @@ private: bool mIsExistingCircle; bool mIsExternalCircle; - bool mReadOnly; + bool mReadOnly; + bool mIdentitiesLoading; + bool mCloseAfterIdentitiesLoaded; void loadCircle(const RsGxsGroupId& groupId); void loadIdentities(); From 3548f5eac5690f44d72990be659803545da5dc93 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 17 Feb 2021 21:22:39 +0100 Subject: [PATCH 2/6] added debug output to help figuring out the problem --- retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 2d698b54e..417dfc011 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -125,11 +125,15 @@ void CreateCircleDialog::closeEvent(QCloseEvent *e) { if(mIdentitiesLoading) { + std::cerr << "Close() called. Identities currently loading => not actually closing." << std::endl; mCloseAfterIdentitiesLoaded = true; return; } else + { + std::cerr << "Close() called. Identities not currently loading => closing." << std::endl; QDialog::closeEvent(e); + } } void CreateCircleDialog::editExistingId(const RsGxsGroupId &circleId, const bool &clearList /*= true*/,bool readonly) @@ -752,10 +756,14 @@ void CreateCircleDialog::loadIdentities() delete id_groups; + std::cerr << "Identities finished loading." << std::endl; mIdentitiesLoading = false; if(mCloseAfterIdentitiesLoaded) + { + std::cerr << "Close() previously called, so closing now." << std::endl; close(); + } }, this ); }); @@ -778,6 +786,8 @@ void CreateCircleDialog::fillIdentitiesList(const std::vector& id_ for(const auto& idGroup:id_groups) { + //usleep(20*1000); + bool isSigned = !idGroup.mPgpId.isNull(); bool isSignedByFriendNode = isSigned && rsPeers->isPgpFriend(idGroup.mPgpId); From 3f04244169fa73c45fac1b8d003d032b53b7d685 Mon Sep 17 00:00:00 2001 From: csoler Date: Wed, 17 Feb 2021 21:41:38 +0100 Subject: [PATCH 3/6] added guarding code against close for circle loading too --- .../src/gui/Circles/CreateCircleDialog.cpp | 26 ++++++++++++++----- .../src/gui/Circles/CreateCircleDialog.h | 3 ++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 417dfc011..c743e4b19 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -52,7 +52,8 @@ CreateCircleDialog::CreateCircleDialog() : QDialog(NULL, Qt::WindowSystemMenuHint | Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint) { mIdentitiesLoading = false; - mCloseAfterIdentitiesLoaded = false; + mCircleLoading = false; + mCloseRequested = false; /* Invoke the Qt Designer generated object setup routine */ ui.setupUi(this); @@ -123,10 +124,10 @@ CreateCircleDialog::~CreateCircleDialog() } void CreateCircleDialog::closeEvent(QCloseEvent *e) { - if(mIdentitiesLoading) + if(mIdentitiesLoading || mCircleLoading) { - std::cerr << "Close() called. Identities currently loading => not actually closing." << std::endl; - mCloseAfterIdentitiesLoaded = true; + std::cerr << "Close() called. Identities or circle currently loading => not actually closing." << std::endl; + mCloseRequested = true; return; } else @@ -684,6 +685,9 @@ void CreateCircleDialog::loadCircle(const RsGxsGroupId& groupId) QTreeWidget *tree = ui.treeWidget_membership; if (mClearList) tree->clear(); + std::cerr << "Loading circle..."<< std::endl; + mCircleLoading = true; + RsThread::async([groupId,this]() { std::vector circlesInfo ; @@ -709,7 +713,17 @@ void CreateCircleDialog::loadCircle(const RsGxsGroupId& groupId) #endif updateCircleGUI(); - }, this ); + mCircleLoading = false; + + std::cerr << "finished loading circle..."<< std::endl; + + if(mCloseRequested && !mIdentitiesLoading) + { + std::cerr << "Close() previously called, so closing now." << std::endl; + close(); + } + + }, this ); }); } @@ -759,7 +773,7 @@ void CreateCircleDialog::loadIdentities() std::cerr << "Identities finished loading." << std::endl; mIdentitiesLoading = false; - if(mCloseAfterIdentitiesLoaded) + if(mCloseRequested && !mCircleLoading) { std::cerr << "Close() previously called, so closing now." << std::endl; close(); diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h index b931c0f32..33fd3537b 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h @@ -75,7 +75,8 @@ private: bool mIsExternalCircle; bool mReadOnly; bool mIdentitiesLoading; - bool mCloseAfterIdentitiesLoaded; + bool mCircleLoading; + bool mCloseRequested; void loadCircle(const RsGxsGroupId& groupId); void loadIdentities(); From 74663509dcc6ccbfb78797e348e8c27cb852f1c6 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 18 Feb 2021 16:16:58 +0100 Subject: [PATCH 4/6] added missing e->ignore() on close event --- retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index c743e4b19..5abcd43ae 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -21,6 +21,7 @@ *******************************************************************************/ #include +#include #include #include @@ -128,6 +129,7 @@ void CreateCircleDialog::closeEvent(QCloseEvent *e) { std::cerr << "Close() called. Identities or circle currently loading => not actually closing." << std::endl; mCloseRequested = true; + e->ignore(); return; } else From e34ed72ff7845ea39ab54062bed58f7e0c6faadd Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 18 Feb 2021 22:33:19 +0100 Subject: [PATCH 5/6] another try to fix that damn bug --- .../src/gui/Circles/CreateCircleDialog.cpp | 26 ++++++++++++++++--- .../src/gui/Circles/CreateCircleDialog.h | 5 +++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index 5abcd43ae..b86d5c6f8 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -123,22 +123,40 @@ CreateCircleDialog::CreateCircleDialog() CreateCircleDialog::~CreateCircleDialog() { } -void CreateCircleDialog::closeEvent(QCloseEvent *e) + +bool CreateCircleDialog::tryClose() { if(mIdentitiesLoading || mCircleLoading) { std::cerr << "Close() called. Identities or circle currently loading => not actually closing." << std::endl; mCloseRequested = true; - e->ignore(); - return; + return false; } else { std::cerr << "Close() called. Identities not currently loading => closing." << std::endl; - QDialog::closeEvent(e); + return true; } } +void CreateCircleDialog::accept() +{ + if(tryClose()) + QDialog::accept(); +} +void CreateCircleDialog::reject() +{ + if(tryClose()) + QDialog::reject(); +} + +void CreateCircleDialog::keyPressEvent(QKeyEvent *e) +{ + if(e->key() != Qt::Key_Escape) + QDialog::keyPressEvent(e); +} + + void CreateCircleDialog::editExistingId(const RsGxsGroupId &circleId, const bool &clearList /*= true*/,bool readonly) { /* load this circle */ diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h index 33fd3537b..fbbaacb2c 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.h +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.h @@ -62,8 +62,11 @@ private slots: void MembershipListCustomPopupMenu( QPoint point); protected: - virtual void closeEvent(QCloseEvent *) override; + virtual void keyPressEvent(QKeyEvent *e) override; + virtual void accept() override; + virtual void reject() override; + bool tryClose(); private: void updateCircleGUI(); From 6cca74aec6223be75325b8c0d3e09dd25c152174 Mon Sep 17 00:00:00 2001 From: csoler Date: Thu, 18 Feb 2021 22:48:16 +0100 Subject: [PATCH 6/6] added same trick on ESC --- retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp index b86d5c6f8..d0640e4ea 100644 --- a/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp +++ b/retroshare-gui/src/gui/Circles/CreateCircleDialog.cpp @@ -152,7 +152,7 @@ void CreateCircleDialog::reject() void CreateCircleDialog::keyPressEvent(QKeyEvent *e) { - if(e->key() != Qt::Key_Escape) + if(e->key() != Qt::Key_Escape || tryClose()) QDialog::keyPressEvent(e); }