From e4bf8215a635b18bbab330f818213a8ba28d8a2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 14 Jun 2025 14:03:58 -0300 Subject: [PATCH] Prevent crashes when restarting the LSP server. --- src/eepp/system/process.cpp | 11 ++++++----- src/tools/ecode/plugins/lsp/lspclientplugin.cpp | 7 +++++-- src/tools/ecode/plugins/lsp/lspclientserver.cpp | 2 +- src/tools/ecode/projectbuild.cpp | 8 ++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/eepp/system/process.cpp b/src/eepp/system/process.cpp index 02978eeca..8e8f0ae70 100644 --- a/src/eepp/system/process.cpp +++ b/src/eepp/system/process.cpp @@ -260,24 +260,25 @@ bool Process::join( int* const returnCodeOut ) { bool Process::kill() { if ( mProcess == nullptr ) return true; - eeASSERT( mProcess != nullptr ); mShuttingDown = true; subprocess_init_shutdown( PROCESS_PTR ); if ( PROCESS_PTR->alive ) { destroy(); - return 0 == subprocess_terminate( PROCESS_PTR ); + int ret = 0 == subprocess_terminate( PROCESS_PTR ); + eeSAFE_FREE( mProcess ); + return ret; } return false; } bool Process::destroy() { - eeASSERT( mProcess != nullptr ); + if ( mProcess == nullptr ) + return true; return 0 == subprocess_destroy( PROCESS_PTR ); } bool Process::isAlive() { - eeASSERT( mProcess != nullptr ); - return 0 != subprocess_alive( PROCESS_PTR ); + return mProcess && 0 != subprocess_alive( PROCESS_PTR ); } FILE* Process::getStdIn() const { diff --git a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp index bcd52386c..e5cc25038 100644 --- a/src/tools/ecode/plugins/lsp/lspclientplugin.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientplugin.cpp @@ -1637,6 +1637,8 @@ void LSPClientPlugin::onUnregister( UICodeEditor* editor ) { if ( mShuttingDown ) return; + editor->removeActionsByTag( getMouseMoveHash( editor ) ); + URI docURI; { Lock l( mDocMutex ); @@ -1735,8 +1737,9 @@ bool LSPClientPlugin::onCreateContextMenu( UICodeEditor* editor, UIPopUpMenu* me addFn( "lsp-switch-header-source", i18n( "lsp_switch_header_source", "Switch Header/Source" ), "filetype-hpp" ); - addFn( "lsp-plugin-restart", i18n( "lsp_restart_lsp_client", "Restart LSP Client" ), - "refresh" ); + String restartStr( i18n( "lsp_restart_lsp_server", "Restart LSP Server" ) + " (" + + server->getDefinition().name + ")" ); + addFn( "lsp-plugin-restart", restartStr, "refresh" ); #ifdef EE_DEBUG if ( server->getDefinition().name == "clangd" ) diff --git a/src/tools/ecode/plugins/lsp/lspclientserver.cpp b/src/tools/ecode/plugins/lsp/lspclientserver.cpp index c20269956..a52732851 100644 --- a/src/tools/ecode/plugins/lsp/lspclientserver.cpp +++ b/src/tools/ecode/plugins/lsp/lspclientserver.cpp @@ -1373,7 +1373,7 @@ bool LSPClientServer::needsAsync() { } bool LSPClientServer::isRunning() { - return mUsingProcess ? ( mProcess.isAlive() && !mProcess.isShuttingDown() && + return mUsingProcess ? ( !mProcess.isShuttingDown() && mProcess.isAlive() && ( !mUsingSocket || mSocket != nullptr ) ) : ( mUsingSocket && mSocket != nullptr ); } diff --git a/src/tools/ecode/projectbuild.cpp b/src/tools/ecode/projectbuild.cpp index 1645ecf70..63c61ea35 100644 --- a/src/tools/ecode/projectbuild.cpp +++ b/src/tools/ecode/projectbuild.cpp @@ -702,18 +702,14 @@ bool ProjectBuildManager::hasCleanCommands( const std::string& name ) { void ProjectBuildManager::cancelBuild() { mCancelBuild = true; - if ( mProcess ) { - mProcess->destroy(); + if ( mProcess ) mProcess->kill(); - } } void ProjectBuildManager::cancelRun() { mCancelRun = true; - if ( mProcessRun ) { - mProcessRun->destroy(); + if ( mProcessRun ) mProcessRun->kill(); - } } ProjectBuildConfiguration ProjectBuildManager::getConfig() const {