I don't think the thing you want currently exists in general, although it exists internally for flushing output ports.
Simply triggering the exit handler when the Racket process exits doesn't seem like a good enough solution. It's awkward to add and remove callbacks by changing the exit handler, and it doesn't immediately address the problem of exiting sandbox-like nested processes. I don't have a solution that immediately addresses the problem of subprocesses, but if we have to revise sandbox-like things to support a polite exit, then I think we can find a better interface. Maybe the right solution is to add support for atexit()-like actions on custodians, along with a new operation to exit a custodian (implying an exit for all sub-custodians). Various exit modes, including normal exit of the Racket process or calling the default exit handler, would use the custodian-exit operation before existing. Sandboxing contexts can be similarly improved to exit a custodian or add support for exiting, depending on what makes sense for the context. Unlike shutting down a custodian, which is analogous to SIGKILL, exiting a custodian would be closer to SIGQUIT. Along those lines, where shutting down a custodian implies mandatory and atomic actions, exiting a custodian is a request and non-atomic --- so it would safe to attach arbitrary exit procedures. Of course, there's no guarantee that an exit procedure will be called if a custodian is first shut down. I'm not sure why we haven't particularly needed this before, except in the built-in case of flushing output ports. It's interesting that your context is also about flushing. At Sun, 04 May 2014 16:19:37 -0400, Tony Garnock-Jones wrote: > On 05/04/2014 04:11 PM, Robby Findler wrote: > > Sounds to me like you want to wire into the custodian facilities (via > > the ffi I believe) but probably starting with just atexit() itself is > > okay. > > Via the FFI! Gosh. That sounds scary. > > I did try register-custodian-shutdown from ffi/unsafe/custodian, but (a) > it wasn't called when the program exited normally, and (b) when I called > (custodian-shutdown (current-custodian)), it complained about a blocking > operation in atomic mode or something like that, and abort()ed. I then > explored use of exit-handler instead :-) > > Would it make sense to change Racket to ensure the current exit-handler > is called at the end of the main program? > > Regards, > Tony > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users