Hello Simon, Monday, December 17, 2007, 1:33:19 PM, you wrote: >>> My question is: what exactly does GHC.Prim.touch# do? This appears to >> >> it's a no-op (for ghc 6.6+ at least). its only task is to notify ghc >> optimizer that data were accessed so it doesn't free the memory
> Yes, exactly. touch# generates no code, but it is vitally important > because if the ForeignPtr is referencing data in the heap (like > mallocForeignPtrBytes does), it prevents the data from being GC'd before > the operation completes. a bit more details for Scott: generated code is like this: ptr <- unsafeForeignPtrToPtr fptr yourAction ptr touch# fptr without touch, the *last* action where fptr involved is its conversion to ptr. GHC Runtime (not optimizer as i said) have no idea that ptr and fptr is the same object, so after conversion it feels free to dispose object pointed by fptr if GC occurs. this means that during execution of your action data pointed by fptr/ptr may be suddenly freed, allocated by other object, bang! the touch pseudo-action is performed *after* your action and references fptr again. so Runtime thinks "there is one more usage of fptr after yourAction" and it doesn't dispose this chunk of memory if GC occurs during your action (unfortunately it's not mentioned anywhere on the Web) -- Best regards, Bulat mailto:[EMAIL PROTECTED] _______________________________________________ Glasgow-haskell-users mailing list Glasgow-haskell-users@haskell.org http://www.haskell.org/mailman/listinfo/glasgow-haskell-users