From 5a7e7e53873eb8a879c0e64d05b1c1bd49ff613d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 28 Sep 2024 13:42:54 -0300 Subject: [PATCH] Avoid crashes on plugin unload while loading. --- src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp | 1 + src/tools/ecode/plugins/formatter/formatterplugin.cpp | 1 + src/tools/ecode/plugins/git/gitplugin.cpp | 1 + src/tools/ecode/plugins/linter/linterplugin.cpp | 1 + src/tools/ecode/plugins/lsp/lspclientplugin.cpp | 1 + src/tools/ecode/plugins/plugin.cpp | 2 +- src/tools/ecode/plugins/plugin.hpp | 4 ++-- src/tools/ecode/plugins/xmltools/xmltoolsplugin.cpp | 1 + 8 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp index 377efda27..61b324183 100644 --- a/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp +++ b/src/tools/ecode/plugins/autocomplete/autocompleteplugin.cpp @@ -106,6 +106,7 @@ AutoCompletePlugin::AutoCompletePlugin( PluginManager* pluginManager, bool sync } AutoCompletePlugin::~AutoCompletePlugin() { + waitUntilLoaded(); mShuttingDown = true; mManager->unsubscribeMessages( this ); unsubscribeFileSystemListener(); diff --git a/src/tools/ecode/plugins/formatter/formatterplugin.cpp b/src/tools/ecode/plugins/formatter/formatterplugin.cpp index 6b593c258..cff969e56 100644 --- a/src/tools/ecode/plugins/formatter/formatterplugin.cpp +++ b/src/tools/ecode/plugins/formatter/formatterplugin.cpp @@ -45,6 +45,7 @@ FormatterPlugin::FormatterPlugin( PluginManager* pluginManager, bool sync ) : } FormatterPlugin::~FormatterPlugin() { + waitUntilLoaded(); mShuttingDown = true; unsubscribeFileSystemListener(); diff --git a/src/tools/ecode/plugins/git/gitplugin.cpp b/src/tools/ecode/plugins/git/gitplugin.cpp index 8cccc1fa7..f2b44a415 100644 --- a/src/tools/ecode/plugins/git/gitplugin.cpp +++ b/src/tools/ecode/plugins/git/gitplugin.cpp @@ -83,6 +83,7 @@ GitPlugin::GitPlugin( PluginManager* pluginManager, bool sync ) : } GitPlugin::~GitPlugin() { + waitUntilLoaded(); mShuttingDown = true; if ( mStatusButton ) mStatusButton->close(); diff --git a/src/tools/ecode/plugins/linter/linterplugin.cpp b/src/tools/ecode/plugins/linter/linterplugin.cpp index dc1d5a070..481859856 100644 --- a/src/tools/ecode/plugins/linter/linterplugin.cpp +++ b/src/tools/ecode/plugins/linter/linterplugin.cpp @@ -48,6 +48,7 @@ LinterPlugin::LinterPlugin( PluginManager* pluginManager, bool sync ) : Plugin( } LinterPlugin::~LinterPlugin() { + waitUntilLoaded(); mShuttingDown = true; mManager->unsubscribeMessages( this ); unsubscribeFileSystemListener(); diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index 99027eb18..c10be2171 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -248,6 +248,7 @@ LSPClientPlugin::LSPClientPlugin( PluginManager* pluginManager, bool sync ) : } LSPClientPlugin::~LSPClientPlugin() { + waitUntilLoaded(); mShuttingDown = true; mManager->unsubscribeMessages( this ); unsubscribeFileSystemListener(); diff --git a/src/tools/ecode/plugins/plugin.cpp b/src/tools/ecode/plugins/plugin.cpp index e07087899..3282f2403 100644 --- a/src/tools/ecode/plugins/plugin.cpp +++ b/src/tools/ecode/plugins/plugin.cpp @@ -71,7 +71,7 @@ void Plugin::showMessage( LSPMessageType type, const std::string& message, &msgReq ); } -Plugin::~Plugin() { +void Plugin::waitUntilLoaded() { while ( mLoading ) Sys::sleep( Milliseconds( 1 ) ); } diff --git a/src/tools/ecode/plugins/plugin.hpp b/src/tools/ecode/plugins/plugin.hpp index 7825c9ff5..2a2a86648 100644 --- a/src/tools/ecode/plugins/plugin.hpp +++ b/src/tools/ecode/plugins/plugin.hpp @@ -17,8 +17,6 @@ class Plugin : public UICodeEditorPlugin { public: explicit Plugin( PluginManager* manager ); - virtual ~Plugin(); - void subscribeFileSystemListener(); void unsubscribeFileSystemListener(); @@ -63,6 +61,8 @@ class Plugin : public UICodeEditorPlugin { std::atomic mShuttingDown{ false }; void setReady(); + + void waitUntilLoaded(); }; class PluginBase : public Plugin { diff --git a/src/tools/ecode/plugins/xmltools/xmltoolsplugin.cpp b/src/tools/ecode/plugins/xmltools/xmltoolsplugin.cpp index ee11d240b..518419acb 100644 --- a/src/tools/ecode/plugins/xmltools/xmltoolsplugin.cpp +++ b/src/tools/ecode/plugins/xmltools/xmltoolsplugin.cpp @@ -35,6 +35,7 @@ XMLToolsPlugin::XMLToolsPlugin( PluginManager* pluginManager, bool sync ) : } XMLToolsPlugin::~XMLToolsPlugin() { + waitUntilLoaded(); mShuttingDown = true; { Lock l( mClientsMutex );