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?*`
(define (log-message* logger level topic message data prefix? in-interrupt?)
(define msg #f)
(when ((logger-max-wanted-level logger) . level>=? . level)
(when ((logger-max-wanted-level* logger) . level>=? . level)
(let loop ([logger logger])
(for ([r (in-list (logger-receivers logger))])
(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
prop:receiver-send
(lambda (lr msg)
;; 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 bstr (bytes-append (string->bytes/utf-8 (vector-ref msg 1)) #"\n"))
(define len (bytes-length bstr))
@ -113,6 +114,7 @@
(define (add-stdio-log-receiver! who logger args parse-who which)
(check who logger? logger)
(define lr (stdio-log-receiver (parse-filters parse-who args #:default-level 'none)
rktio
which))
(atomically
(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
prop:receiver-send
(lambda (lr msg)
;; 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 pri
(case (vector-ref msg 0)
@ -143,6 +146,7 @@
(define/who (add-syslog-log-receiver! logger . args)
(define lr (syslog-log-receiver (parse-filters 'make-syslog-log-receiver args #:default-level 'none)
rktio
(path-bytes (find-system-path 'run-file))))
(atomically
(add-log-receiver! logger lr #f)

View File

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