From b87639b7a40400ffcc6553949e1f48021783e389 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 7 Dec 2016 09:47:53 +1300 Subject: [PATCH] Split out reloader-mixin and reloader-mixin* --- racket/syndicate/reload.rkt | 87 ++++++++++++++++++++++--------------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/racket/syndicate/reload.rkt b/racket/syndicate/reload.rkt index 3e7ab4f..f68bd90 100644 --- a/racket/syndicate/reload.rkt +++ b/racket/syndicate/reload.rkt @@ -7,7 +7,9 @@ stop-when-reloaded spawn-reloader - spawn-reloader*) + spawn-reloader* + reloader-mixin + reloader-mixin*) (define-logger syndicate/reload) @@ -36,13 +38,32 @@ (spawn-reloader* 'module-path)) (define (spawn-reloader* module-path) + (match (module-path->path-string module-path) + [#f #f] + [pathstr + (supervise #:name (list 'reloader-supervisor pathstr) + (actor #:name 'reloader + (reloader-mixin** module-path pathstr))) + #t])) + +(define-syntax-rule (reloader-mixin module-path) + (reloader-mixin* 'module-path)) + +(define (reloader-mixin* module-path) + (define pathstr (module-path->path-string module-path)) + (when (not pathstr) + (error 'reloader-mixin "Cannot deduce source path from module-path ~v" module-path)) + (reloader-mixin** module-path pathstr)) + +(define (module-path->path-string module-path) (define mpi (module-path-index-join module-path #f)) (define rpath (module-path-index-resolve mpi)) (define path (let ((p (resolved-module-path-name rpath))) (if (pair? p) (car p) p))) (if (path? path) - (spawn-reloader** module-path (path->string path)) - (log-syndicate/reload-error "Could not process module-path ~v" module-path))) + (path->string path) + (begin (log-syndicate/reload-error "Could not process module-path ~v" module-path) + #f))) (define counter (let ((count 0)) @@ -50,35 +71,33 @@ (begin0 count (set! count (+ count 1)))))) -(define (spawn-reloader** module-path pathstr) - (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))))) +(define (reloader-mixin** module-path 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))))) - (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)))))