Final bikeshedding call: Fixing Control.Exception.bracket

Eric Mertens emertens at gmail.com
Sun Nov 23 18:03:23 UTC 2014


If the hClose is interrupted it will fall to the GC to close the handle in
the finalizer for the handle.

On Sun, Nov 23, 2014, 9:46 AM John Lato <jwlato at gmail.com> wrote:

> On Sun Nov 23 2014 at 7:09:10 AM Simon Marlow <marlowsd at gmail.com> wrote:
>
>> On 21/11/14 17:22, Gregory Collins wrote:
>> > New post from Yuras provides food for thought:
>> > https://github.com/Yuras/io-region/wiki/Handling-%28async%
>> 29-exceptions-in-haskell:-pushing-bracket-to-the-limits
>> >
>> > In particular he points out a case for which uninterruptibleMask will
>> > cause unkillable threads: let's say hClose blocks flushing the output to
>> > a file, but the write fails because of a hardware error and blocks
>> > forever. (Alternatively, imagine the file is on NFS and you get a cable
>> > cut between the two machines). The thread executing hClose in the
>> > cleanup action becomes unkillable.
>>
>> Yes, and furthermore hClose is not "buggy": even if it is interrupted by
>> an async exception, the file descriptor will still be closed by the
>> finalizer.  This is not something you want to do a lot, of course, but
>> as a backup plan for the rare case of an async exception killing the
>> cleanup action it's fine.
>>
>
> This is not entirely correct.  If another thread is holding the MVar when
> hClose is called, and it is blocked in takeMVar, if an async exception
> arrives takeMVar will be interrupted and the file descriptor will never be
> closed.  Arguably that situation shouldn't happen except in poorly-designed
> programs, but I can provide at least one example where it appears to be a
> viable architecture, and I'm not convinced it would never happen in
> practice.
>
>
>> So arguably uninterruptibleMask is not what we want for hClose.
>>
>
> Is there any way to fix the issue I describe besides preventing async
> exceptions from arising while blocked on the MVar?  Although I do agree we
> don't want to put uninterruptibleMask inside hClose (long ramble at
> http://johnlato.blogspot.ca/2014/11/exception-handling-and-cleanup.html)
>
> John
>
>
>>
>> Cheers,
>> Simon
>>
>>
>> > G
>> >
>> > On Thu, Nov 20, 2014 at 7:24 AM, Simon Marlow <marlowsd at gmail.com
>> > <mailto:marlowsd at gmail.com>> wrote:
>> >
>> >     On 19/11/2014 23:07, Ganesh Sittampalam wrote:
>> >
>> >         On 13/11/2014 10:44, Simon Marlow wrote:
>> >
>> >             On 13/11/2014 07:47, Merijn Verstraaten wrote:
>> >
>> >
>> >                 A new version would look like:
>> >
>> >                 bracket before after thing =
>> >                      mask $ \restore -> do
>> >                        let atomicAfter = uninterruptibleMask . after
>> >                        a <- before
>> >                        r <- restore (thing a) `onException` atomicAfter
>> a
>> >                        _ <- atomicAfter a
>> >                        return r
>> >
>> >                 Slightly different versions are possible and the other
>> >                 relevant
>> >                 bracketing functions mentioned in this thread can be
>> >                 treated similarly.
>> >
>> >
>> >             Since we would need this for catch too, the sensible thing
>> >             to do (if we
>> >             decide to go ahead with this) would be to change the
>> >             implementation of
>> >             catch in the RTS from masking the exception handler to
>> >             uninterruptibleMask.  That would mean that at least for
>> >             catch there
>> >             would be no additional overhead, and it would make the
>> >             modifications to
>> >             the other operations simpler in some cases.
>> >
>> >
>> >         If this isn't done in the RTS, is there a possibility of an
>> async
>> >         exception slipping in between the exception handler starting
>> and the
>> >         uninterruptibleMask starting?
>> >
>> >
>> >     No, because the exception handler is masked.
>> >
>> >     Cheers,
>> >     Simon
>> >
>> >     _________________________________________________
>> >     Libraries mailing list
>> >     Libraries at haskell.org <mailto:Libraries at haskell.org>
>> >     http://www.haskell.org/__mailman/listinfo/libraries
>> >     <http://www.haskell.org/mailman/listinfo/libraries>
>> >
>> >
>> >
>> >
>> > --
>> > Gregory Collins <greg at gregorycollins.net <mailto:greg at gregorycollins.
>> net>>
>>
>> _______________________________________________
>> Libraries mailing list
>> Libraries at haskell.org
>> http://www.haskell.org/mailman/listinfo/libraries
>>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20141123/745ea917/attachment-0001.html>


More information about the Libraries mailing list