diff --git a/syndicate/reload.rkt b/syndicate/reload.rkt index 315b9b8..01b5238 100644 --- a/syndicate/reload.rkt +++ b/syndicate/reload.rkt @@ -36,14 +36,18 @@ (stop-when (asserted (reload-pending '#,(path->string (syntax-source stx)))) body ...))])) -(define-syntax-rule (spawn-reloader module-path) - (spawn-reloader* 'module-path)) +(define-syntax (spawn-reloader stx) + (syntax-case stx () + [(_ module-path) + (quasisyntax/loc stx + (spawn-reloader* 'module-path '#,(path->string (syntax-source stx))))])) -(define (spawn-reloader* module-path) +(define (spawn-reloader* module-path loading-module-pathstr) (match (module-path->path-string module-path) [#f #f] [pathstr (supervise #:name (reloader pathstr) + (stop-when (asserted (reload-pending loading-module-pathstr))) (reloader-mixin** module-path pathstr)) #t])) @@ -74,9 +78,10 @@ (define (reload!) (when (not (reloading?)) (reloading? #t) - (react (field [obstacles-cleared? #f]) + (react (field [obstacles-cleared? #f] [obstacles-existed? #f]) (define/query-value obstacles-exist? #f (observe (reload-pending pathstr)) #t - #:on-add (log-syndicate/reload-info "waiting to reload ~v" pathstr) + #:on-add (begin (log-syndicate/reload-info "waiting to reload ~v" pathstr) + (obstacles-existed? #t)) #:on-remove (obstacles-cleared? #t)) (assert #:when (obstacles-exist?) (reload-pending pathstr)) (on-start (flush!) @@ -85,11 +90,17 @@ (flush!) ;; Wait one turn for effects of newly-cleared obstacles (log-syndicate/reload-info "(re)loading ~v" pathstr) (dynamic-rerequire module-path) - (spawn* #:name module-path - ((dynamic-require `(submod ,module-path syndicate-main) - 'activate!))) + (let ((force-reactivation? (obstacles-existed?))) + (when force-reactivation? + (log-syndicate/reload-info "forcing reactivation of ~v" pathstr)) + (spawn* #:name module-path + ((dynamic-require `(submod ,module-path syndicate-main) + (if force-reactivation? 'activate!* 'activate!))))) (reloading? #f))))) + (on-start (log-syndicate/reload-debug "reloader ~v starting" pathstr)) + (on-stop (log-syndicate/reload-debug "reloader ~v stopping" pathstr)) + (field [previous-version 'unknown]) (define/query-value latest-version 'unknown (file-content pathstr file->sha1 $p) p) (begin/dataflow