[Haskell-cafe] Re: FPS: Finalizers not running (was Memoryusageoutside of the Haskell heap)

Simon Marlow simonmar at microsoft.com
Mon Nov 7 08:16:54 EST 2005


On 07 November 2005 12:07, Donald Bruce Stewart wrote:

> simonmar:
>> Finalizers aren't guaranteed to be run.  In particular, if the main
>> thread exits, then we don't run any outstanding finalizers.  This
>> change was made recently, but it turned out that even prior to 6.4
>> we couldn't guarantee to run all outstanding finalizers.
>> 
>> Does this explain it, or is there something else going on?
>> 
>> BTW, when you addForeignPtrConcFinalizer to a ForeignPtr created with
>> mallocForeignPtr, you're *creating* a finalizer, it doesn't have one
>> to start with.  It's pretty expensive to do this.
> 
> Ah, right, I see. It's:
> 
>      mallocForeignPtr = doMalloc undefined
>       where doMalloc :: Storable b => b -> IO (ForeignPtr b)
>             doMalloc a = do
>               IO $ \s ->
>                 case newPinnedByteArray# size s of { (# s, mbarr# #)
>                  -> (# s, ForeignPtr (byteArrayContents#
>                                   (unsafeCoerce# mbarr#))
>                 (MallocPtrNoFinalizer mbarr#) #) }
>                 where (I# size) = sizeOf a
> 
> So the GC will take care of these thingies?
> Now, this probably means that the problem is somewhere else in
> Joelr's code. 

Yes, mallocForeignPtr's are implemented using pinned GC'd memory, with
no finalizer (unless you add one).  That's why they're nice and fast.

It looks like you have an old version of GHC.ForeignPtr there - it has a
bug in it, please cvs update to the latest version.

Cheers,
	Simon


More information about the Haskell-Cafe mailing list