On Mon, Apr 10, 2006 at 02:19:23PM -0700, John Meacham wrote:
> On Mon, Apr 10, 2006 at 02:58:20PM +0100, Simon Marlow wrote:
> > Suppose I want to do some action with a temporary file:
> > 
> >    bracket
> >        newTempFile
> >        (\f -> removeTempFile f)
> >        (\f -> doSomethingWith f)
> > 
> > Under your scheme, this code doesn't get to remove its temporary file on
> > exit, unless I explicitly add an exit handler that throws an exception
> > to the current thread.
> > 
> > I think code like the above should just work.  Furthermore, I think it
> > should be an invariant that a thread is never discarded or killed, only
> > sent an exception.  Otherwise, how else can I acquire a resource and
> > guarantee to release it when either an exception is raised, the program
> > exits, or the computation completes?
> 
> you ask the system to send you an exception on exit.

(As I'm sure you are aware) I'm with Simon on this one.  The default
cleanup handling should "just work", and you shouldn't need to write
special-case code in order to properly clean up.  Having exitWith throw
exceptions (as it currently does in ghc) is very nice.

Perhaps we could have a special sort of thread that is just killed upon
exit with no exceptions being raised, but I wouldn't be tempted to use such
a thread... unless I suppose I had some unimportant long-running ffi call
to make, and didn't want exiting to be slowed down by waiting for it to
complete.  It would definitely be nice to have interruptible ffi calls (and
not just interruptible by exiting), but I'm not really sure how one would
go about that.
-- 
David Roundy
http://www.darcs.net
_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://haskell.org/mailman/listinfo/haskell-prime

Reply via email to