At Tue, 11 Dec 2012 11:36:22 -0700, Neil Toronto wrote: > > (define mpfr-shutdown > > - (register-custodian-shutdown mpfr-free-cache (λ (free) (free)))) > > + (register-custodian-shutdown > > + mpfr-free-cache ; acts as a "random" object for a shutdown handle > > + (λ (free) > > + ;; The direct reference here is important, since custodian holds only > > + ;; a weak reference to shutdown handle: > > + (mpfr-free-cache)))) > > Is the problem here that `free' may point to an object that has been > collected, or may be #f because the object has been collected?
The `free' object won't have been collected, but it may have been finalized, since the reference from the custodian is weak. In particular, foreign functions are finalized. > If so, then the callback procedure can't rely on the value of `free' > unless it contains its own reference to `free'. So why pass it? In a more typical case, the value registered with a custodian is not finalized. Or maybe it can be finalized, but the custodian callback for the value can deal with a finalized value (and do nothing in that case, typically). > Also, > why doesn't the module's reference to `mpfr-free-cache' count? Because > the module may have been collected already? Yes, the module may be long gone. _________________________ Racket Developers list: http://lists.racket-lang.org/dev