From eb11712cc14e0e16ed032c44a89d2705eda54d89 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Mon, 28 May 2018 13:49:40 +0100 Subject: [PATCH] Make sure to close down cleanly This involves some horrible forceful reading on exit to ensure that we get a response to the disconnect request. This ensures that any debugee is killed cleanly. --- autoload/vimspector/internal/job.vim | 12 +++++++++++- python3/vimspector/debug_session.py | 27 +++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/autoload/vimspector/internal/job.vim b/autoload/vimspector/internal/job.vim index 0c43cf5..a8e4641 100644 --- a/autoload/vimspector/internal/job.vim +++ b/autoload/vimspector/internal/job.vim @@ -67,7 +67,8 @@ function! vimspector#internal#job#StartDebugSession( config ) abort \ 'exit_cb': function( 's:_OnExit' ), \ 'close_cb': function( 's:_OnClose' ), \ 'out_cb': function( 's:_OnServerData' ), - \ 'err_cb': function( 's:_OnServerError' ) + \ 'err_cb': function( 's:_OnServerError' ), + \ 'stoponexit': 'term', \ } \ ) @@ -93,6 +94,15 @@ function! vimspector#internal#job#Reset() abort endif endfunction +function! vimspector#internal#job#ForceRead() abort + if exists( 's:job' ) + let data = ch_readraw( job_getchannel( s:job ), { 'timeout': 1000 } ) + if data != '' + call s:_OnServerData( job_getchannel( s:job ), data ) + endif + endif +endfunction + " Boilerplate {{{ let &cpo=s:save_cpo unlet s:save_cpo diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py index 1f8a177..3ad06c0 100644 --- a/python3/vimspector/debug_session.py +++ b/python3/vimspector/debug_session.py @@ -274,9 +274,36 @@ class DebugSession( object ): self._logger.info( 'Debug Adapter Started' ) + vim.command( 'augroup vimspector_cleanup' ) + vim.command( 'autocmd!' ) + vim.command( 'autocmd VimLeavePre * py3 _vimspector_session.CloseDown()' ) + vim.command( 'augroup END' ) + + + def CloseDown( self ): + state = { 'done': False } + + def handler( self ): + state[ 'done' ] = True + + self._connection.DoRequest( handler, { + 'command': 'disconnect', + 'arguments': { + 'terminateDebugee': True + }, + } ) + + while not state[ 'done' ]: + vim.eval( 'vimspector#internal#job#ForceRead()' ) + + vim.eval( 'vimspector#internal#job#StopDebugSession()' ) + def _StopDebugAdapter( self, callback = None ): def handler( message ): vim.eval( 'vimspector#internal#job#StopDebugSession()' ) + + vim.command( 'au! vimspector_cleanup' ) + self._connection.Reset() self._connection = None self._stackTraceView.ConnectionClosed()