cs & thread: repair retention of subcustodians
A subcustodian was incorrectly registered as weak for its parent, which means that an unreferenced custodian could get lost when shutting down an ancestor.
This commit is contained in:
parent
dcb0f422a9
commit
1de69c4d37
|
@ -6,7 +6,8 @@
|
||||||
"host.rkt"
|
"host.rkt"
|
||||||
"evt.rkt"
|
"evt.rkt"
|
||||||
"semaphore.rkt"
|
"semaphore.rkt"
|
||||||
"parameter.rkt")
|
"parameter.rkt"
|
||||||
|
"sink.rkt")
|
||||||
|
|
||||||
(provide current-custodian
|
(provide current-custodian
|
||||||
make-custodian
|
make-custodian
|
||||||
|
@ -76,7 +77,13 @@
|
||||||
(check who custodian? parent)
|
(check who custodian? parent)
|
||||||
(define c (create-custodian))
|
(define c (create-custodian))
|
||||||
(set-custodian-place! c (custodian-place parent))
|
(set-custodian-place! c (custodian-place parent))
|
||||||
(define cref (do-custodian-register parent c do-custodian-shutdown-all #f #t #t))
|
(define cref (do-custodian-register parent c
|
||||||
|
;; Retain children procs as long as proc for `c`
|
||||||
|
(let ([children (custodian-children c)])
|
||||||
|
(lambda (c)
|
||||||
|
(reference-sink children)
|
||||||
|
(do-custodian-shutdown-all c)))
|
||||||
|
#f #f #t))
|
||||||
(set-custodian-parent-reference! c cref)
|
(set-custodian-parent-reference! c cref)
|
||||||
(unless cref (raise-custodian-is-shut-down who parent))
|
(unless cref (raise-custodian-is-shut-down who parent))
|
||||||
c)
|
c)
|
||||||
|
@ -134,7 +141,8 @@
|
||||||
(define gc-roots (custodian-gc-roots c))
|
(define gc-roots (custodian-gc-roots c))
|
||||||
(when gc-roots
|
(when gc-roots
|
||||||
(hash-remove! gc-roots obj))
|
(hash-remove! gc-roots obj))
|
||||||
(host:enable-interrupts))))
|
(host:enable-interrupts))
|
||||||
|
(void)))
|
||||||
|
|
||||||
;; Hook for thread scheduling:
|
;; Hook for thread scheduling:
|
||||||
(define post-shutdown-action void)
|
(define post-shutdown-action void)
|
||||||
|
|
6
racket/src/thread/sink.rkt
Normal file
6
racket/src/thread/sink.rkt
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#lang racket/base
|
||||||
|
|
||||||
|
(provide reference-sink)
|
||||||
|
|
||||||
|
(define (reference-sink v)
|
||||||
|
(ephemeron-value (make-ephemeron #f (void)) (void) v))
|
Loading…
Reference in New Issue
Block a user