
On Tue, 2014-12-23 at 08:19 +0200, Tristan Seligmann wrote:
On 23 December 2014 at 08:10, Yuras Shumovich
wrote: Looks like you need 'unsafePackCStringFinalizer' (or one of it's variants) from Data.ByteString.Unsafe module. It lets you reuse the buffer and deallocate it in finalizer. Something similar is used e.g. in 'kyotocabinet' package.
I tried using this, but it seems like the pointer created by mallocForeignPtrBytes is freed as soon as it is no longer referenced (upon returning from the function). Then, later, when the bytestring is finalized, the pointer is freed again causing an abort on double-free. How do I "transfer" ownership of the pointer?
'mallocForeignPtrBytes' attaches finalizer to the 'ForeignPtr', but you need to attach it to 'ByteString'. So you can't use 'mallocForeignPtrBytes', but plain old 'malloc' (from 'Foreign.Marshal.Alloc') should work in combination with 'unsafePackMallocCStringLen'. Unless I'm missing something. Thanks, Yuras