At Sun, 5 Aug 2012 12:12:24 -0500, Robby Findler wrote: > On Sun, Aug 5, 2012 at 11:37 AM, Antonio Menezes Leitao > <antonio.menezes.lei...@ist.utl.pt> wrote: > > On Sun, Aug 5, 2012 at 2:27 PM, Robby Findler > > <ro...@eecs.northwestern.edu> wrote: > >> My first guess is that the right way to do this is to use custodians > >> to do this shutdown, not closing the window (and perhaps make closing > >> the window shutdown the custodian, depending). Generally speaking, > >> custodians are the abstraction that Racket uses to manage the clean > >> shutdown of external state (like network connections, open files, open > >> windows, etc). > > > > Sounds like a good idea. Is it possible to register a finalizer in a > > custodian? Or something similar that allows me to call an FFI function. > > I'm not as familiar with this layer of Racket, but I think you > probably want to start with scheme_add_managed and that region of the > manuals.
Yes. Beware that FFI callback memory management is slightly tricky with scheme_add_managed(): By default, when you pass a Racket function as a callback to a foreign function, the callback is valid only as long as the Racket function is reachable. Usually, it works well enough to define a function as a module-level binding, but in the case of custodian callbacks, often a whole namespace may go away before a custodian is shut down. Fortunately, there's a simple solution: pass the callback function both as both the third and fourth arguments to scheme_add_managed(). That is, pass the function as both the callback and the callback's data. (The data pointer supplied to scheme_add_managed() and returned to the callback is otherwise not useful for a callback from Racket, since a callback can be a Racket closure.) ____________________ Racket Users list: http://lists.racket-lang.org/users