/usr/share/racket/collects/planet/terse-info.rkt is in racket-common 6.3-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #lang racket/base
#|
This file is shared between the original
namespace that drracket first starts with
any other namespaces that it loads,
so it keeps the requirements low (it could
be in the '#%kernel language, but
drracket already shares mred/mred, so there
seems little point to that).
|#
(provide planet-terse-register
planet-terse-log
planet-terse-set-key)
(define terse-log-message-chan (make-channel))
(define terse-log-proc-chan (make-channel))
(define log-key-tc (make-thread-cell (gensym) #t))
(define thd
(thread
(lambda ()
(let ([procs (make-weak-hasheq)])
(let loop ()
(sync
(handle-evt
terse-log-message-chan
(lambda (msg)
(let ([registry (list-ref msg 0)]
[id (list-ref msg 1)]
[str (list-ref msg 2)])
(for ([eph (in-list (hash-ref procs registry '()))])
(let ([proc (ephemeron-value eph)])
(when proc
(proc id str)))))
(loop)))
(handle-evt
terse-log-proc-chan
(lambda (rp)
(let* ([registry (list-ref rp 0)]
[proc (list-ref rp 1)])
(hash-update! procs
registry
(lambda (x) (cons (make-ephemeron registry proc) x))
'())
(loop))))))))))
(define (planet-terse-log id str)
(unless (thread-dead? thd)
(sync (channel-put-evt terse-log-message-chan (list (thread-cell-ref log-key-tc) id str))))
(void))
(define (planet-terse-register proc)
(sync (channel-put-evt terse-log-proc-chan (list (thread-cell-ref log-key-tc) proc)))
(void))
(define (planet-terse-set-key new-key)
(thread-cell-set! log-key-tc new-key))
|