Skip to content

Calling freeHaskellFunctionPtr from C finalizer leads to crashes

I recently discovered that calling freeHaskellFunctionPtr from a C finalizer (as seems natural to do if the object you're cleaning up on the C side is holding on to a Haskell function wrapper) leads to strange crashes.

The attached program (which is a stress-test loop of allocating function wrappers, using them and then freeing them) illustrates the problem.

You can compile it with:

ghc --make !WrapperTest2.hs !HsFunction.c -o !WrapperTest2 -main-is !WrapperTest2

Depending on the platform and compilation flags I've noticed different results. Compiled as above (on Windows) I get: !WrapperTest2.exe: internal error: stg_ap_p_ret

Compiled with -debug I get: !WrapperTest2.exe: internal error: ASSERTION FAILED: file rts\Stable.c, line 224

On Windows, these results do not change if I compile with -threaded.

On Linux, without -threaded, I get the same results as Windows.

However, with -threaded I get different behavior.

With -threaded and without -debug the program eventually deadlocks.

With -threaded and -debug I get the following message: !WrapperTest2: internal error: multiple ACQUIRE_LOCK: rts/Stable.c 284

I'm currently working around the issue by using Haskell finalizers (which don't seem to have this problem), but I thought I should report the bug. I'd also appreciate feedback on whether using Haskell finalizers is actually a safe workaround for this issue or if I've just been lucky so far.

Trac metadata
Trac field Value
Version 6.12.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Runtime System
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information