Hi!

-- Background: --
I have some foreign objects that are mapped to ForeignPtr's, say

newtype Obj = O (ForeignPtr Obj)

and a foreign "collection" where those objects are added. The adding
is something on the lines of

addObj, removeObj :: Collection -> Obj -> IO ()

id est, the C code of the collection maintains a reference to all
objects added. That means I have to keep all the ForeignPtr's added
alive and that I must not prevent garbage collection of those removed.
Of course the 'Collection' isn't just a simple collection, otherwise I
would be using normal Haskell counterparts.


-- Question: --
What is the best way to keep the added objects alive? Using a list
will keep the addition cheap and a low memory overhead, while a
Data.Set will make removeObj work in sublinear time (on the Haskell
side). Are there any other options? I'm currently heading towards

data Collection = C !(ForeignPtr Collection) !(IORef [Obj])

like ForeignPtr itself (although in the case of ForeignPtr's there is
no way to remove finalizers).


Thanks!

-- 
Felipe.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to