killing a top-level-listener
I am using #'system::listener-top-level in code that implements a
remote-repl in a delivered server image.
I have a difficult to debug problem with #'system::listener-top-level.
A standalone test (with only public functions ;-) is as follows:
---------file: deliver.lisp---------
(in-package :cl-user)
;; bring us to the latest official LispWorks patch level
(load-all-patches)
;; make sure we have the comm module
(require "comm")
;; start the actual delivery process
(deliver #'(lambda ()
(comm:start-up-server :service 10243)
(loop (sleep (* 60 60))))
"test-image"
0
:multiprocessing t
:keep-pretty-printer t
:keep-debug-mode t
:keep-conditions :all
:keep-load-function :full)
(quit)
---------eof----------
Now deliver an image like this:
/Applications/Lispworks/lispworks-tty -site-init - -init deliver.lisp
Next start the image ./test-image
And use telnet in another terminal to connect to it:
[sven@voyager:~]$ telnet localhost 10243
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
"foo"
CL-USER 1 > (mp:ps)
#<MP:PROCESS Name "10243 server" Priority 3 State "Waiting for
connection">
#<MP:PROCESS Name "foo" Priority 3 State "Running">
#<MP:PROCESS Name "Initial delivery process" Priority 0 State "Sleeping
on mailbox">
#<MP:PROCESS Name "The idle process" Priority -536870912 State "Running
(preempted)">
NIL
CL-USER 2 > foo
Error: The variable FOO is unbound.
1 (continue) Try evaluating FOO again.
2 Specify a value to use this time instead of evaluating FOO.
3 Specify a value to set FOO to.
4 (abort) Return to level 0.
Type :b for backtrace, :c <option number> to proceed, or :? for other
options
CL-USER 1 : 1 > Terminated
After entering a sub listener handling an error, kill the telnet
process from yet another terminal.
This make the image unustable: cpu goes to 100%, and it is no longer
possible to connect to it.
Platform is LWM 4.3.7 on Mac OS 10.3.6.
The problem does not occur when the listener is at level 0.
I need a remote-repl style system to access a running server image for
maintenance tasks,
that is robust (i.e. does not kill the server image when something goes
wrong).
Sven