Start to create session manager
Kind of works, but there's still a single global _vimspector_session
This commit is contained in:
parent
fb2bad216f
commit
099431ba55
4 changed files with 61 additions and 27 deletions
|
|
@ -27,10 +27,12 @@ endif
|
||||||
function! vimspector#internal#state#Reset() abort
|
function! vimspector#internal#state#Reset() abort
|
||||||
try
|
try
|
||||||
py3 import vim
|
py3 import vim
|
||||||
py3 _vimspector_session = __import__(
|
py3 _vimspector_session_manager = __import__(
|
||||||
\ "vimspector",
|
\ "vimspector",
|
||||||
\ fromlist=[ "debug_session" ] ).debug_session.DebugSession(
|
\ fromlist=[ "session_manager" ] ).session_manager.SessionManager()
|
||||||
\ vim.eval( 's:prefix' ) )
|
|
||||||
|
py3 _vimspector_session = _vimspector_session_manager =
|
||||||
|
\ _vimspector_session_manager.NewSession( vim.eval( 's:prefix' ) )
|
||||||
catch /.*/
|
catch /.*/
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
echom 'Exception while loading vimspector:' v:exception
|
echom 'Exception while loading vimspector:' v:exception
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class PendingRequest( object ):
|
||||||
|
|
||||||
|
|
||||||
class DebugAdapterConnection( object ):
|
class DebugAdapterConnection( object ):
|
||||||
def __init__( self, handlers, send_func ):
|
def __init__( self, handlers, session_id, send_func ):
|
||||||
self._logger = logging.getLogger( __name__ )
|
self._logger = logging.getLogger( __name__ )
|
||||||
utils.SetUpLogging( self._logger )
|
utils.SetUpLogging( self._logger )
|
||||||
|
|
||||||
|
|
@ -37,6 +37,7 @@ class DebugAdapterConnection( object ):
|
||||||
self._SetState( 'READ_HEADER' )
|
self._SetState( 'READ_HEADER' )
|
||||||
self._buffer = bytes()
|
self._buffer = bytes()
|
||||||
self._handlers = handlers
|
self._handlers = handlers
|
||||||
|
self._session_id = session_id
|
||||||
self._next_message_id = 0
|
self._next_message_id = 0
|
||||||
self._outstanding_requests = {}
|
self._outstanding_requests = {}
|
||||||
|
|
||||||
|
|
@ -51,13 +52,12 @@ class DebugAdapterConnection( object ):
|
||||||
msg[ 'seq' ] = this_id
|
msg[ 'seq' ] = this_id
|
||||||
msg[ 'type' ] = 'request'
|
msg[ 'type' ] = 'request'
|
||||||
|
|
||||||
# TODO/FIXME: This is so messy
|
|
||||||
expiry_id = vim.eval(
|
expiry_id = vim.eval(
|
||||||
'timer_start( {}, '
|
'timer_start( {}, '
|
||||||
' function( "vimspector#internal#channel#Timeout", '
|
' function( "vimspector#internal#channel#Timeout", '
|
||||||
' [ {} ] ) )'.format(
|
' [ {} ] ) )'.format(
|
||||||
timeout,
|
timeout,
|
||||||
self._handler.session_id ) )
|
self._session_id ) )
|
||||||
|
|
||||||
request = PendingRequest( msg,
|
request = PendingRequest( msg,
|
||||||
handler,
|
handler,
|
||||||
|
|
|
||||||
|
|
@ -42,25 +42,10 @@ VIMSPECTOR_HOME = utils.GetVimspectorBase()
|
||||||
# cache of what the user entered for any option we ask them
|
# cache of what the user entered for any option we ask them
|
||||||
USER_CHOICES = {}
|
USER_CHOICES = {}
|
||||||
|
|
||||||
NEXT_SESSION_ID = 0
|
|
||||||
SESSIONS = {}
|
|
||||||
|
|
||||||
|
|
||||||
def PushSession( session ):
|
|
||||||
global NEXT_SESSION_ID
|
|
||||||
this_id = NEXT_SESSION_ID
|
|
||||||
NEXT_SESSION_ID = NEXT_SESSION_ID + 1
|
|
||||||
SESSIONS[ this_id ] = session
|
|
||||||
return this_id
|
|
||||||
|
|
||||||
|
|
||||||
def PopSession( session ):
|
|
||||||
SESSIONS.pop( session.session_id, None )
|
|
||||||
|
|
||||||
|
|
||||||
class DebugSession( object ):
|
class DebugSession( object ):
|
||||||
def __init__( self, api_prefix ):
|
def __init__( self, session_id, session_manager, api_prefix ):
|
||||||
self.session_id = PushSession( self )
|
self.session_id = session_id
|
||||||
|
self.manager = session_manager
|
||||||
self._logger = logging.getLogger( __name__ )
|
self._logger = logging.getLogger( __name__ )
|
||||||
utils.SetUpLogging( self._logger )
|
utils.SetUpLogging( self._logger )
|
||||||
|
|
||||||
|
|
@ -91,7 +76,7 @@ class DebugSession( object ):
|
||||||
|
|
||||||
|
|
||||||
def __del__( self ):
|
def __del__( self ):
|
||||||
PopSession( self )
|
self.manager.DestroySession( self )
|
||||||
|
|
||||||
|
|
||||||
def _ResetServerState( self ):
|
def _ResetServerState( self ):
|
||||||
|
|
@ -931,8 +916,9 @@ class DebugSession( object ):
|
||||||
handlers = [ self ]
|
handlers = [ self ]
|
||||||
|
|
||||||
self._connection = debug_adapter_connection.DebugAdapterConnection(
|
self._connection = debug_adapter_connection.DebugAdapterConnection(
|
||||||
handlers,
|
handlers = handlers,
|
||||||
lambda msg: utils.Call(
|
session_id = self.session_id,
|
||||||
|
send_func = lambda msg: utils.Call(
|
||||||
"vimspector#internal#{}#Send".format( self._connection_type ),
|
"vimspector#internal#{}#Send".format( self._connection_type ),
|
||||||
self.session_id,
|
self.session_id,
|
||||||
msg ) )
|
msg ) )
|
||||||
|
|
|
||||||
46
python3/vimspector/session_manager.py
Normal file
46
python3/vimspector/session_manager.py
Normal file
|
|
@ -0,0 +1,46 @@
|
||||||
|
# vimspector - A multi-language debugging system for Vim
|
||||||
|
# Copyright 2020 Ben Jackson
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
from vimspector.debug_session import DebugSession
|
||||||
|
|
||||||
|
|
||||||
|
class SessionManager:
|
||||||
|
next_session_id = 0
|
||||||
|
sessions = {}
|
||||||
|
current_session = None
|
||||||
|
|
||||||
|
|
||||||
|
def NewSession( self, *args, **kwargs ):
|
||||||
|
session_id = self.next_session_id
|
||||||
|
self.next_session_id += 1
|
||||||
|
session = DebugSession( session_id, self, *args, **kwargs )
|
||||||
|
self.sessions[ session_id ] = session
|
||||||
|
|
||||||
|
if self.current_session is None:
|
||||||
|
self.current_session = session.session_id
|
||||||
|
|
||||||
|
return session
|
||||||
|
|
||||||
|
|
||||||
|
def DestroySession( self, session: DebugSession ):
|
||||||
|
del self.sessions[ session.session_id ]
|
||||||
|
|
||||||
|
|
||||||
|
def GetSession( self, session_id ):
|
||||||
|
return self.sessions.get( session_id )
|
||||||
|
|
||||||
|
|
||||||
|
def CurrentSession( self ):
|
||||||
|
return self.GetSession( self.current_session )
|
||||||
Loading…
Add table
Add a link
Reference in a new issue