[Haskell-cafe] ghci: Difference in garbage collection etc. between REPL and function
Jason Dagit
dagitj at gmail.com
Thu May 9 05:21:04 CEST 2013
On Wed, May 8, 2013 at 8:12 PM, Jason Dagit <dagitj at gmail.com> wrote:
> 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.
My point was meant to be, it's something to try but I have no idea if
it's going to be the issue here.
The caveat I forgot to add is: I've never seen the thread local
storage issue affect GC. In particular, ghc might be running a
finalizer in the case of individual actions because it doesn't know
you are about to use the handle?
Now that I think about it more, I suspect that is more likely to be the case.
Jason
More information about the Haskell-Cafe
mailing list