<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#ffffff">
Hi,<br>
<br>
Here's my guess.  Take a look at this version, and try running it:<br>
<br>
===<br>
{-# LANGUAGE PackageImports #-}<br>
<br>
import qualified "MonadCatchIO-transformers" Control.Monad.CatchIO as C<br>
import Control.Monad.IO.Class<br>
import Control.Monad.Trans.Cont<br>
<br>
<br>
bracket_' :: C.MonadCatchIO m<br>
         =&gt; m a  -- ^ computation to run first (\"acquire resource\")<br>
         -&gt; m b  -- ^ computation to run last when successful
(\"release resource\")<br>
         -&gt; m b  -- ^ computation to run last when an exception
occurs<br>
         -&gt; m c  -- ^ computation to run in-between<br>
         -&gt; m c  -- returns the value from the in-between computation<br>
bracket_' before after afterEx thing = C.block $ do<br>
  _ &lt;- before<br>
  r &lt;- C.unblock thing `C.onException` afterEx<br>
  _ &lt;- after<br>
  return r<br>
<br>
<br>
f :: ContT (Either String String) IO String<br>
f = do<br>
    bracket_' (say "acquired") (say "released-successful") (say
"released-exception") (say "executed")<br>
    say "Hello!"<br>
    () &lt;- error "error"<br>
    return "success"<br>
  where<br>
    say = liftIO . putStrLn<br>
<br>
main :: IO ()<br>
main = flip runContT (return . Right) f &gt;&gt;= print<br>
===<br>
<br>
I get:<br>
<br>
acquired<br>
executed<br>
released-successful<br>
Hello!<br>
released-exception<br>
Tmp.hs: error<br>
<br>
So the exception handler is running after the code that follows the
whole bracket_' call -- and after the bracket_' call has completed
succesfully!<br>
<br>
Here's my speculation, based on glancing at the libraries involved: I
believe the reason for this may be the MonadCatchIO instance for ContT:<br>
<br>
===<br>
instance MonadCatchIO m =&gt; MonadCatchIO (ContT r m) where<br>
  m `catch` f = ContT $ \c -&gt; runContT m c `catch` \e -&gt; runContT
(f e) c<br>
===<br>
<br>
To my eye, that code takes the continuation to run after the block, c
(which in your case involves the after-action from bracket_, and then
the error), and runs that inside the catch block.  This causes a
successful completion of bracket_ (first release), followed by the
error, which triggers the catch block which then runs the final actions
(second release) and rethrows the error.  Does that sound possible to
anyone else?<br>
<br>
Thanks,<br>
<br>
Neil.<br>
<br>
On 21/06/10 09:39, Michael Snoyman wrote:
<blockquote
 cite="mid:AANLkTil4aWjVs3ndZiWqIOGSXyCuVMGC7Y3rw-Q4KvBz@mail.gmail.com"
 type="cite">
  <div dir="ltr">Hi cafe,
  <div><br>
  </div>
  <div>I ran into a segfault while working on some database code. I
eventually traced it back to a double-finalizing of a statement (read:
freeing memory twice), which ultimately led back to switching my code
to use the ContT monad transformer. I was able to isolate this down to
a minimal test case (catch.hs); when run, it prints the line "released"
twice.</div>
  <div><br>
  </div>
  <div>In an attempt to understand what's going on, I rewrote the code
to avoid the libraries entirely (catch-simplified.hs); it didn't give
me any insight into the problem, but maybe it will help someone else.</div>
  <div><br>
  </div>
  <div>If someone sees an obvious mistake I'm making in my usage of the
bracket_ function, please let me know. Otherwise, I'd really like to
get a fix for this so I can use this library.</div>
  <div><br>
  </div>
  <div>Thanks,</div>
  <div>Michael</div>
  </div>
  <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
Haskell-Cafe mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a>
<a class="moz-txt-link-freetext" href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a>
  </pre>
</blockquote>
<br>
</body>
</html>