1
1
from collections import deque
2
2
from .util import VimExit
3
- from signal import SIGTERM
4
- import sys , pyuv , logging
3
+ import sys , pyuv , logging , signal
5
4
6
5
logger = logging .getLogger (__name__ )
7
6
debug , warn = (logger .debug , logger .warn ,)
@@ -13,15 +12,19 @@ class UvStream(object):
13
12
def __init__ (self , address = None , port = None , spawn_argv = None ):
14
13
debug ('initializing UvStream instance' )
15
14
self ._loop = pyuv .Loop ()
16
- self ._error = None
15
+ self ._fatal = None
17
16
self ._connected = False
18
17
self ._data_cb = None
19
18
self ._error_cb = None
20
19
self ._connection_error = None
21
20
self ._pending_writes = 0
22
21
self ._async = pyuv .Async (self ._loop , self ._on_async )
23
22
self ._term = pyuv .Signal (self ._loop )
24
- self ._term .start (self ._on_term , SIGTERM )
23
+ self ._term .start (self ._on_signal , signal .SIGTERM )
24
+ self ._int = pyuv .Signal (self ._loop )
25
+ self ._int .start (self ._on_signal , signal .SIGINT )
26
+ self ._signames = dict ((k , v ) for v , k in signal .__dict__ .items () \
27
+ if v .startswith ('SIG' ))
25
28
self ._error_stream = None
26
29
# Select the type of handle
27
30
if spawn_argv :
@@ -84,20 +87,18 @@ def _on_connect(self, stream, error):
84
87
self .loop_stop ()
85
88
if error :
86
89
msg = pyuv .errno .strerror (error )
87
- self ._error = msg
90
+ self ._fatal = msg
88
91
warn ('error connecting to neovim: %s' , msg )
89
92
self ._connection_error = IOError (msg )
90
93
return
91
94
self ._connected = True
92
95
self ._read_stream = self ._write_stream = stream
93
96
94
97
95
- def _on_term (self , handle , signum ):
98
+ def _on_signal (self , handle , signum ):
96
99
self .loop_stop ()
97
- self ._error = 'Received SIGTERM'
98
- err = IOError (self ._error )
100
+ err = Exception ('Received %s' % self ._signames [signum ])
99
101
if not self ._error_cb :
100
- self ._loop .stop ()
101
102
raise err
102
103
self ._error_cb (err )
103
104
@@ -116,7 +117,7 @@ def _connect(self):
116
117
117
118
def _on_exit (self , handle , exit_status , term_signal ):
118
119
self ._loop .stop ()
119
- self ._error = (
120
+ self ._fatal = (
120
121
'The child nvim instance exited with status %s' % exit_status )
121
122
122
123
@@ -127,7 +128,7 @@ def _on_stderr_read(self, handle, data, error):
127
128
err = IOError (msg )
128
129
if not self ._error_cb :
129
130
self ._loop .stop ()
130
- self ._error = err
131
+ self ._fatal = err
131
132
raise err
132
133
self ._error_cb (err )
133
134
else :
@@ -143,12 +144,12 @@ def _on_read(self, handle, data, error):
143
144
warn ('error reading data: %s' , msg )
144
145
self ._error_cb (IOError (msg ))
145
146
self ._loop .stop ()
146
- self ._error = msg
147
+ self ._fatal = msg
147
148
elif not data :
148
149
warn ('connection was closed by neovim' )
149
150
self ._loop .stop ()
150
- self ._error = 'EOF'
151
- self ._error_cb (IOError (self ._error ))
151
+ self ._fatal = 'EOF'
152
+ self ._error_cb (IOError (self ._fatal ))
152
153
else :
153
154
debug ('successfully read %d bytes of data' , len (data ))
154
155
self ._data_cb (data )
@@ -176,7 +177,7 @@ def write_cb(handle, error):
176
177
if error :
177
178
self ._loop .stop ()
178
179
msg = pyuv .errno .strerror (error )
179
- self ._error = msg
180
+ self ._fatal = msg
180
181
warn ('error writing data: %s' , msg )
181
182
self ._error_cb (IOError (msg ))
182
183
debug ('successfully wrote %d bytes of data' , data_len )
@@ -187,9 +188,9 @@ def write_cb(handle, error):
187
188
188
189
189
190
def loop_start (self , data_cb , error_cb ):
190
- if self ._error :
191
- raise IOError ('An error was raised and the connection ' +
192
- 'was permanently closed: %s' , self ._error )
191
+ if self ._fatal :
192
+ raise IOError ('A fatal error was raised and the connection ' +
193
+ 'was permanently closed: %s' , self ._fatal )
193
194
if not self ._connected :
194
195
self ._connect ()
195
196
if self ._connection_error :
0 commit comments