X-Git-Url: https://jxself.org/git/?a=blobdiff_plain;f=8sync%2Frepl.scm;h=d8f60e9bbcc906286c6547a26c5f8c40d61bbad7;hb=4998e7a9fe3b303923d918cd6087633d5302274f;hp=bc68138eb3b5c353d9fe0e9d8e50dc130c27d93a;hpb=9bb036f18457a6c2d24343e21e6950f9df5043e7;p=8sync.git diff --git a/8sync/repl.scm b/8sync/repl.scm index bc68138..d8f60e9 100644 --- a/8sync/repl.scm +++ b/8sync/repl.scm @@ -1,5 +1,5 @@ ;;; 8sync --- Asynchronous programming for Guile -;;; Copyright (C) 2015 Christopher Allan Webber +;;; Copyright © 2015, 2016, 2017 Christopher Allan Webber ;;; ;;; This file is part of 8sync. ;;; @@ -17,23 +17,41 @@ ;;; License along with 8sync. If not, see . (define-module (8sync repl) - #:use-module (ice-9 q) - #:use-module (8sync agenda) + #:use-module (oop goops) + #:use-module (8sync) + #:use-module (system repl server) #:use-module (system repl coop-server) - #:export (make-coop-server-handler - spawn-and-queue-repl-server!)) + #:export ()) -(define (make-coop-server-handler coop-server) - (define (run-self) - (poll-coop-repl-server coop-server) - ;; queue ourselves again - (run-delay (run-self) (/ 1 30))) - run-self) +(define-class () + (path #:init-keyword #:path + #:init-value "/tmp/8sync-socket" + #:getter repl-manager-path) + (socket #:init-value #f + #:accessor repl-manager-socket) + (poll-every #:init-keyword #:poll-every + #:init-value (/ 1 30) + #:getter repl-manager-poll-every) + (actions #:allocation #:each-subclass + ;; @@: Should we add a stop action? + #:init-value (build-actions + (*cleanup* repl-manager-cleanup) + (*init* repl-manager-init)))) -(define* (spawn-and-queue-repl-server! agenda #:optional port) - (let ((coop-server - (if port - (spawn-coop-repl-server port) - (spawn-coop-repl-server)))) - (enq! (agenda-queue agenda) - (make-coop-server-handler coop-server)))) +(define (repl-manager-cleanup repl-manager message) + ;; Close the socket, if open + (and=> (repl-manager-socket repl-manager) + close) + ;; Delete the file, if it exists + (when (file-exists? (repl-manager-path repl-manager)) + (delete-file (repl-manager-path repl-manager)))) + +(define (repl-manager-init repl-manager message) + (define socket + (make-unix-domain-server-socket #:path (repl-manager-path repl-manager))) + (define server + (spawn-coop-repl-server socket)) + (set! (repl-manager-socket repl-manager) socket) + (while (actor-alive? repl-manager) + (poll-coop-repl-server server) + (8sleep (repl-manager-poll-every repl-manager))))