provider+cli+debug-repl: fix silent watchdog death from prelude make-time shadow
ober
b25e9fdfd7a75f9be180264ff356dc41d3c93dc4
--- a/src/jcode/core/debug-repl.ss +++ b/src/jcode/core/debug-repl.ss @@ -18,7 +18,8 @@ stop-jcode-repl! jcode-repl-port) -(import :jcode/core/log) +(import :jcode/core/log + :std/misc/thread) (def logger (make-logger "debug-repl")) @@ -74,7 +75,7 @@ (def O_NONBLOCK (if *is-osx?* #x4 #x800)) (def EINTR 4) (def EAGAIN (if *is-osx?* 35 11)) -(def *retry-delay* (make-time 'time-duration 10000000 0)) ;; 10ms +(def *retry-delay-secs* 0.010) ;; 10ms; (sleep (make-time ...)) is broken because the prelude shadows make-time ;; ---- Helpers ---- @@ -198,11 +199,11 @@ (fork-thread (lambda () (client-repl client-fd))) (loop)) ((let ((e (get-errno))) (or (= e EINTR) (= e EAGAIN))) - (sleep *retry-delay*) + (thread-sleep! *retry-delay-secs*) (loop)) (else (when *server-running* - (sleep *retry-delay*) + (thread-sleep! *retry-delay-secs*) (loop)))))))) ;; ---- Public API ---- --- a/src/jcode/provider/provider.ss +++ b/src/jcode/provider/provider.ss @@ -326,23 +326,30 @@ (unless (vector-ref closed? 0) (vector-set! closed? 0 #t) (rustls-close conn))) + ;; Use thread-sleep!, not (sleep (make-time ...)) -- the prelude + ;; shadows make-time with a date-style constructor, so the latter + ;; raises in `sleep`. Guard the loop so any future regression + ;; can't silently kill the watchdog and let the stream hang. (fork-thread (lambda () - (let loop () - (sleep (make-time 'time-duration 0 5)) - (cond - ((vector-ref done? 0) (void)) - ((>= (- (time-second (current-time)) - (vector-ref last-activity 0)) - timeout-secs) - (vector-set! timed-out? 0 #t) - (when (tracing?) - (log-trace logger "stream-timeout" - `((url . ,(redact-url url)) - (idle-secs . ,(- (time-second (current-time)) - (vector-ref last-activity 0)))))) - (close-once!)) - (else (loop)))))) + (guard (e [#t (when (tracing?) + (log-trace logger "watchdog-died" + `((err . ,(err->string e)))))]) + (let loop () + (thread-sleep! 5) + (cond + ((vector-ref done? 0) (void)) + ((>= (- (time-second (current-time)) + (vector-ref last-activity 0)) + timeout-secs) + (vector-set! timed-out? 0 #t) + (when (tracing?) + (log-trace logger "stream-timeout" + `((url . ,(redact-url url)) + (idle-secs . ,(- (time-second (current-time)) + (vector-ref last-activity 0)))))) + (close-once!)) + (else (loop))))))) (dynamic-wind (lambda () (void)) (lambda () --- a/src/jcode/ui/cli.ss +++ b/src/jcode/ui/cli.ss @@ -334,7 +334,9 @@ EXAMPLES: (set-car! *stream-abort* #t)) (unless (car *stream-abort*) (loop))) (begin - (sleep (make-time 'time-duration 20000000 0)) + ;; thread-sleep!; (sleep (make-time ...)) is broken + ;; because the prelude shadows make-time. + (thread-sleep! 0.020) (loop))))))))) (def (interruptible-stream-cb token)