cs: fix stdio/syslog GC logging as triggered by future thread

Always use the main `rktio` instance and don't try to explicitly start
atomic mode.
This commit is contained in:
Matthew Flatt 2019-06-24 19:40:26 -06:00
parent 309a0c2489
commit b64e17388f
3 changed files with 20 additions and 11 deletions

View File

@ -144,7 +144,7 @@
;; like `log-level?*` ;; like `log-level?*`
(define (log-message* logger level topic message data prefix? in-interrupt?) (define (log-message* logger level topic message data prefix? in-interrupt?)
(define msg #f) (define msg #f)
(when ((logger-max-wanted-level logger) . level>=? . level) (when ((logger-max-wanted-level* logger) . level>=? . level)
(let loop ([logger logger]) (let loop ([logger logger])
(for ([r (in-list (logger-receivers logger))]) (for ([r (in-list (logger-receivers logger))])
(when ((filters-level-for-topic (log-receiver-filters r) topic) . level>=? . level) (when ((filters-level-for-topic (log-receiver-filters r) topic) . level>=? . level)

View File

@ -94,11 +94,12 @@
;; ---------------------------------------- ;; ----------------------------------------
(struct stdio-log-receiver log-receiver (which) (struct stdio-log-receiver log-receiver (rktio which)
#:property #:property
prop:receiver-send prop:receiver-send
(lambda (lr msg) (lambda (lr msg)
;; called in atomic mode and possibly in host interrupt handler ;; called in atomic mode and possibly in host interrupt handler
(define rktio (stdio-log-receiver-rktio lr))
(define fd (rktio_std_fd rktio (stdio-log-receiver-which lr))) (define fd (rktio_std_fd rktio (stdio-log-receiver-which lr)))
(define bstr (bytes-append (string->bytes/utf-8 (vector-ref msg 1)) #"\n")) (define bstr (bytes-append (string->bytes/utf-8 (vector-ref msg 1)) #"\n"))
(define len (bytes-length bstr)) (define len (bytes-length bstr))
@ -113,6 +114,7 @@
(define (add-stdio-log-receiver! who logger args parse-who which) (define (add-stdio-log-receiver! who logger args parse-who which)
(check who logger? logger) (check who logger? logger)
(define lr (stdio-log-receiver (parse-filters parse-who args #:default-level 'none) (define lr (stdio-log-receiver (parse-filters parse-who args #:default-level 'none)
rktio
which)) which))
(atomically (atomically
(add-log-receiver! logger lr #f) (add-log-receiver! logger lr #f)
@ -126,11 +128,12 @@
;; ---------------------------------------- ;; ----------------------------------------
(struct syslog-log-receiver log-receiver (cmd) (struct syslog-log-receiver log-receiver (rktio cmd)
#:property #:property
prop:receiver-send prop:receiver-send
(lambda (lr msg) (lambda (lr msg)
;; called in atomic mode and possibly in host interrupt handler ;; called in atomic mode and possibly in host interrupt handler
(define rktio (syslog-log-receiver-rktio lr))
(define bstr (bytes-append (string->bytes/utf-8 (vector-ref msg 1)) #"\n")) (define bstr (bytes-append (string->bytes/utf-8 (vector-ref msg 1)) #"\n"))
(define pri (define pri
(case (vector-ref msg 0) (case (vector-ref msg 0)
@ -143,6 +146,7 @@
(define/who (add-syslog-log-receiver! logger . args) (define/who (add-syslog-log-receiver! logger . args)
(define lr (syslog-log-receiver (parse-filters 'make-syslog-log-receiver args #:default-level 'none) (define lr (syslog-log-receiver (parse-filters 'make-syslog-log-receiver args #:default-level 'none)
rktio
(path-bytes (find-system-path 'run-file)))) (path-bytes (find-system-path 'run-file))))
(atomically (atomically
(add-log-receiver! logger lr #f) (add-log-receiver! logger lr #f)

View File

@ -6,6 +6,7 @@
(provide logger-wanted-level ; ok to call in host-Scheme interrupt handler (provide logger-wanted-level ; ok to call in host-Scheme interrupt handler
logger-max-wanted-level logger-max-wanted-level
logger-max-wanted-level*
logger-all-levels) logger-all-levels)
;; in atomic mode with interrupts disabled ;; in atomic mode with interrupts disabled
@ -31,6 +32,10 @@
(define (logger-max-wanted-level logger) (define (logger-max-wanted-level logger)
(atomically/no-interrupts/no-wind (atomically/no-interrupts/no-wind
(logger-max-wanted-level* logger)))
;; in atomic mode with interrupts disabled
(define (logger-max-wanted-level* logger)
(cond (cond
[((logger-local-level-timestamp logger) . >= . (unbox (logger-root-level-timestamp-box logger))) [((logger-local-level-timestamp logger) . >= . (unbox (logger-root-level-timestamp-box logger)))
;; Cached value is up-to-date ;; Cached value is up-to-date
@ -38,7 +43,7 @@
[else [else
;; Traverse to set cache: ;; Traverse to set cache:
(update-logger-wanted-level! logger #f) (update-logger-wanted-level! logger #f)
(logger-max-receiver-level logger)]))) (logger-max-receiver-level logger)]))
(define (update-logger-wanted-level! logger topic) (define (update-logger-wanted-level! logger topic)
(unless ((logger-local-level-timestamp logger) . >= . (unbox (logger-root-level-timestamp-box logger))) (unless ((logger-local-level-timestamp logger) . >= . (unbox (logger-root-level-timestamp-box logger)))