
#12547: Concurrent.ForeignPtr needs to access a C-ForeignPtr, but this is already gone -------------------------------------+------------------------------------- Reporter: Lemming | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: Runtime System | Version: 8.0.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by Lemming): Replying to [comment:1 simonmar]:
Currently all `ForeignPtrs` that are unreachable get finalized at the same time. This is how it's intended to work.
We *could* refine it so that a finalizer from a `Concurrent.ForeignPtr` can keep a C `ForeignPtr` alive. It would mean processing the two kinds of weak pointers in separate batches (and possibly keeping them in separate lists, I'm not sure).
You gave me privately the tip to use `StablePtr`. So I added a `freeStablePtr` after `withForeignPtr`. This works nicely! Thus I think it is enough to add a warning to `touchForeignPtr` and `withForeignPtr` that they have no effect in a concurrent finalizer and that you should consider `StablePtr` instead. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/12547#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler