Skip to content

Commit

Permalink
Enter read-mode on segfault and other fatal errors
Browse files Browse the repository at this point in the history
  • Loading branch information
Affonso-Gui committed Sep 17, 2020
1 parent 60b469f commit e4a0238
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 12 deletions.
8 changes: 6 additions & 2 deletions src/euslime/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,14 @@ def swank_eval(self, sexp):
yield EuslispResult(e.message, response_type='abort')
else:
yield EuslispResult(None)
except Exception:
except Exception as e:
log.error(traceback.format_exc())
if self.euslisp.read_mode:
self.euslisp.read_mode = False
yield [Symbol(":read-aborted"), 0, 1]
if lock.locked():
lock.release()
raise
raise e

def swank_interactive_eval(self, sexp):
return self.swank_eval(sexp)
Expand Down
8 changes: 4 additions & 4 deletions src/euslime/protocol.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ def make_error(self, err):
debug.stack and debug.stack[:10], # stacktrace
[None], # pending continuation
]
yield self.dumps(res)
yield res

def make_response(self, result_type, sexp):
try:
res = [Symbol(':return'), {result_type: sexp}, self.thread_local.comm_id]
yield self.dumps(res)
yield res
except Exception as e:
for r in self.make_error(e):
yield r
Expand All @@ -64,7 +64,7 @@ def process(self, data):
cmd, comm_id, form = data
for r in self.process(dumps(form)):
yield r
yield self.dumps([Symbol(":euslime-test"), comm_id])
yield [Symbol(":euslime-test"), comm_id]
return
else:
form = data
Expand All @@ -91,7 +91,7 @@ def process(self, data):
resp.value):
yield r
else:
yield self.dumps(resp)
yield resp
except Exception as e:
log.error(traceback.format_exc())
for r in self.make_error(e):
Expand Down
24 changes: 18 additions & 6 deletions src/euslime/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,9 @@
'iso-utf-8-unix': 'utf-8'
}
HEADER_LENGTH = 6
ERROR_STRING = """;; You are still in a signal handler.
;;Try reset or throw to upper level as soon as possible.
"""

log = get_logger(__name__)

Expand All @@ -32,17 +35,26 @@ def __init__(self, request, client_address, server):
request, client_address, server)

def _process_data(self, recv_data):
for send_data in self.swank.process(recv_data):
log.debug('response: %s', send_data)
send_data = send_data.encode(self.encoding)
self.request.send(send_data)
for data in self.swank.process(recv_data):
log.debug('response: %s', data)
self.send_data(data)

def _process_output(self, out=None):
if not out:
return
log.debug('output: %s', out)
response = [Symbol(":write-string"), out]
send_data = self.swank.dumps(response)
self.send_data([Symbol(":write-string"), out])
if ERROR_STRING in out:
# TODO: find a better way to detect error signals
# Even if the user issues a command with same output,
# read-mode will be desativated when the evaluation ends
log.error("Error signal received!")
log.debug("Entering read mode...")
self.swank.handler.euslisp.read_mode = True
self.send_data([Symbol(":read-string"), 0, 1])

def send_data(self, data):
send_data = self.swank.dumps(data)
send_data = send_data.encode(self.encoding)
self.request.send(send_data)

Expand Down

0 comments on commit e4a0238

Please sign in to comment.