diff options
| author | Artyom V. Poptsov <poptsov.artyom@gmail.com> | 2015-12-20 01:54:45 +0300 |
|---|---|---|
| committer | Artyom V. Poptsov <poptsov.artyom@gmail.com> | 2015-12-20 01:54:45 +0300 |
| commit | 7a53850f9bf266d4427bd505b86729e02f266e0a (patch) | |
| tree | 7f766163c94998083af8c372a5b2ccebeda50409 /modules/ssh | |
| parent | node.scm (node-run-server): Use a remote pipe (diff) | |
| download | guile-ssh-7a53850f9bf266d4427bd505b86729e02f266e0a.tar.gz | |
node.scm: Allow to stop a RREPL server
* modules/ssh/dist/node.scm (make-node): Add 'stop-repl-server?' keyed option.
(node-stop-server): New procedure.
(node-eval): Stop a REPL server after evaluation is done, if it is
explicitly requested.
* doc/api-dist.texi: Update description of 'make-node', add description of
'node-stop-server'.
* NEWS: Update.
Diffstat (limited to 'modules/ssh')
| -rw-r--r-- | modules/ssh/dist/node.scm | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/modules/ssh/dist/node.scm b/modules/ssh/dist/node.scm index d90cfef..2be88d8 100644 --- a/modules/ssh/dist/node.scm +++ b/modules/ssh/dist/node.scm @@ -68,6 +68,7 @@ node-eval-1 node-guile-version node-run-server + node-stop-server node-server-running? node-open-rrepl @@ -95,11 +96,12 @@ ;;; Node type (define-record-type <node> - (%make-node tunnel repl-port start-repl-server?) + (%make-node tunnel repl-port start-repl-server? stop-repl-server?) node? (tunnel node-tunnel) ; <tunnel> (repl-port node-repl-port) ; number - (start-repl-server? node-start-repl-server?)) ; boolean + (start-repl-server? node-start-repl-server?) ; boolean + (stop-repl-server? node-stop-repl-server?)) ; boolean (define (node-session node) "Get node session." @@ -118,15 +120,17 @@ (define* (make-node session #:optional (repl-port 37146) - #:key (start-repl-server? #t)) + #:key (start-repl-server? #t) + (stop-repl-server? #f)) "Make a new distributed computing node. If START-REPL-SERVER? is set to #t (which is by default) then start a REPL server on a remote host -automatically in case when it is not started yet." +automatically in case when it is not started yet. If STOP-REPL-SERVER? is set +to #t then a REPL server will be stopped as soon as an evaluation is done." (let ((tunnel (make-tunnel session #:port 0 ;Won't be used #:host "localhost" #:host-port repl-port))) - (%make-node tunnel repl-port start-repl-server?))) + (%make-node tunnel repl-port start-repl-server? stop-repl-server?))) ;;; Remote REPL (RREPL) @@ -268,6 +272,7 @@ listens on an expected port, return #f otherwise." (and (not (eof-object? line)) (string-match "^GNU Guile .*" line)))))))) + (define (node-run-server node) "Run a RREPL server on a NODE." (open-remote-input-pipe (node-session node) @@ -276,6 +281,15 @@ listens on an expected port, return #f otherwise." (while (not (node-server-running? node)) (usleep 100))) +(define (node-stop-server node) + "Stop a RREPL server on a NODE." + (close (open-remote-input-pipe (node-session node) + (format #f "pkill --full 'guile --listen=~a'" + (node-repl-port node)))) + (while (node-server-running? node) + (sleep 1))) + + (define (node-open-rrepl node) "Open a RREPL. Return a new RREPL channel." (and (node-start-repl-server? node) @@ -288,7 +302,11 @@ listens on an expected port, return #f otherwise." "Evaluate QUOTED-EXP on the node and return the evaluated result." (let ((repl-channel (node-open-rrepl node))) (rrepl-skip-to-prompt repl-channel) - (rrepl-eval repl-channel quoted-exp))) + (call-with-values (lambda () (rrepl-eval repl-channel quoted-exp)) + (lambda vals + (and (node-stop-repl-server? node) + (node-stop-server node)) + (apply values vals))))) (define (node-eval-1 node quoted-exp) "Evaluate QUOTED-EXP on the node and return the evaluated result. The |
