<div dir="ltr">Yes, there's a good reason: it's a bug :). I wrote that code a while ago, and had a mistaken understanding of how bracket works at the time. Thanks for noticing this, I'll release a new version shortly.</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 7, 2016 at 2:30 AM, Viktor Dukhovni <span dir="ltr"><<a href="mailto:ietf-dane@dukhovni.org" target="_blank">ietf-dane@dukhovni.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am looking at using ResourceT to manage the acquisiition and<br>
deallocation of network sockets.  In comparing resourceT's `allocate`<br>
with `bracket` I was somewhat perplexed to find that `allocate` in<br>
Control.Monad.Trans.Resource seems to not mask exceptions during<br>
allocation (see "No mask" comment I inserted):<br>
<br>
        allocateRIO :: IO a -> (a -> IO ()) -> ResourceT IO (ReleaseKey, a)<br>
        allocateRIO acquire rel = ResourceT $ \istate -> liftIO $ E.mask $ \restore -> do<br>
            a <- restore acquire<br>
            --   ^^^ No mask ^^^<br>
            key <- register' istate $ rel a<br>
            return (key, a)<br>
<br>
        allocate :: MonadResource m<br>
                 => IO a -- ^ allocate<br>
                 -> (a -> IO ()) -- ^ free resource<br>
                 -> m (ReleaseKey, a)<br>
        allocate a = liftResourceT . allocateRIO a<br>
<br>
By contrast in Exception.Base we see that `bracket` masks<br>
the initialization action:<br>
<br>
        bracket before after thing =<br>
          mask $ \restore -> do<br>
            a <- before<br>
            --   ^^^ masked! ^^^<br>
            r <- restore (thing a) `onException` after a<br>
            _ <- after a<br>
            return r<br>
<br>
This seems to suggest that ResourceT is more exposes to resource<br>
leaks via asynchronous exceptions.  Say if a file descriptor is a<br>
allocated, but an exception interrupts "allocate" before it can<br>
register the resource.<br>
<br>
Perhaps I am missing something, or there are good reasons for<br>
the difference in approach.  Can anyone shed some light on the<br>
reason why ResourceT differs (seemingly) from bracket in this<br>
regard.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
        Viktor.<br>
______________________________<wbr>_________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</font></span></blockquote></div><br></div>