[Haskell-cafe] ghci: Difference in garbage collection etc. between REPL and function

Jason Dagit dagitj at gmail.com
Thu May 9 05:12:08 CEST 2013


On Wed, May 8, 2013 at 6:54 PM, Niklas Hambüchen <mail at nh2.me> wrote:
> I have an annoying bug in a C binding that can be triggered like this:
>
>
>     handle <- open ...
>
>     prep <- makePreparedStatement handle "INSERT ..."
>
>     performGC
>
>     runStatement prep
>
>     close handle
>
> If I run these steps one by one in ghci, garbage ends up in my handle as
> expected.
>
> However, if I "let main = do ..." this whole block in order to pack it
> in a test case, it does not happen, neither in ghci nor ghc.
>
> What might be the special magic in ghci's REPL that allows me to trigger
> my bug so easily there?

One thing to investigate: Thread Local Storage

By default ghci puts each action you run into a thread and executes
it. If the underlying C code stores something (or accesses it) from
thread local storage, then you will run into issues like this.

Try starting ghci with -fno-ghci-sandbox. If the bad behavior goes
away there, try running each step of your test case inside a forkIO
from ghc with the threaded RTS. If the problem disappears in ghci but
shows up with forkIO, then it's a pretty good indicator that it's
related to the way the C code uses thread local storage.

I hope that helps,
Jason



More information about the Haskell-Cafe mailing list