From 97bb848611e01f38d7c0247840581ff57a8329ff Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 29 Nov 2016 15:04:13 +1300 Subject: [PATCH] Always supervise reloaders --- racket/syndicate/reload.rkt | 60 +++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/racket/syndicate/reload.rkt b/racket/syndicate/reload.rkt index b3b4dca..3e7ab4f 100644 --- a/racket/syndicate/reload.rkt +++ b/racket/syndicate/reload.rkt @@ -14,6 +14,7 @@ (require (for-syntax racket/base)) (require racket/rerequire) +(require/activate syndicate/supervise) (require/activate syndicate/drivers/filesystem) (struct reload-pending (filename) #:prefab) ;; ASSERTION @@ -50,33 +51,34 @@ (set! count (+ count 1)))))) (define (spawn-reloader** module-path pathstr) - (actor #:name (list 'reloader pathstr) - (field [reloading? #f]) - (define (reload!) - (when (not (reloading?)) - (reloading? #t) - (react (field [obstacles-cleared? #f]) - (define/query-value obstacles-exist? #f (observe (reload-pending pathstr)) #t - #:on-add (log-syndicate/reload-info "waiting to reload ~v" pathstr) - #:on-remove (obstacles-cleared? #t)) - (assert #:when (obstacles-exist?) (reload-pending pathstr)) - (on-start (flush!) - (obstacles-cleared? (not (obstacles-exist?)))) - (stop-when (rising-edge (obstacles-cleared?)) - (flush!) ;; Wait one turn for effects of newly-cleared obstacles - (log-syndicate/reload-info "(re)loading ~v" pathstr) - (dynamic-rerequire module-path) - (schedule-actions! - ((dynamic-require `(submod ,module-path syndicate-main) - 'activate!))) - (reloading? #f))))) + (supervise #:name (list 'reloader-supervisor pathstr) + (actor #:name 'reloader + (field [reloading? #f]) + (define (reload!) + (when (not (reloading?)) + (reloading? #t) + (react (field [obstacles-cleared? #f]) + (define/query-value obstacles-exist? #f (observe (reload-pending pathstr)) #t + #:on-add (log-syndicate/reload-info "waiting to reload ~v" pathstr) + #:on-remove (obstacles-cleared? #t)) + (assert #:when (obstacles-exist?) (reload-pending pathstr)) + (on-start (flush!) + (obstacles-cleared? (not (obstacles-exist?)))) + (stop-when (rising-edge (obstacles-cleared?)) + (flush!) ;; Wait one turn for effects of newly-cleared obstacles + (log-syndicate/reload-info "(re)loading ~v" pathstr) + (dynamic-rerequire module-path) + (schedule-actions! + ((dynamic-require `(submod ,module-path syndicate-main) + 'activate!))) + (reloading? #f))))) - (field [previous-version #f]) - (define/query-value latest-version 'unknown (file-content pathstr counter $p) p) - (begin/dataflow - (when (and (not (eq? (latest-version) 'unknown)) - (not (equal? (latest-version) (previous-version)))) - (if (latest-version) - (reload!) - (log-syndicate/reload-warning "Module ~v does not exist" pathstr)) - (previous-version (latest-version)))))) + (field [previous-version #f]) + (define/query-value latest-version 'unknown (file-content pathstr counter $p) p) + (begin/dataflow + (when (and (not (eq? (latest-version) 'unknown)) + (not (equal? (latest-version) (previous-version)))) + (if (latest-version) + (reload!) + (log-syndicate/reload-warning "Module ~v does not exist" pathstr)) + (previous-version (latest-version)))))))