From 811e5806d29c0856b182c278ec544a7fe4be4175 Mon Sep 17 00:00:00 2001 From: Mike Wey Date: Mon, 9 Apr 2012 14:35:41 +0200 Subject: Don't try to use the D GC when creating blobs. This causes segfaults, see issue #4. --- dmagick/Image.d | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) (limited to 'dmagick/Image.d') diff --git a/dmagick/Image.d b/dmagick/Image.d index dcbb7c5..ea74403 100644 --- a/dmagick/Image.d +++ b/dmagick/Image.d @@ -2961,42 +2961,21 @@ class Image void[] toBlob(string magick = null, size_t depth = 0) { size_t length; - - AcquireMemoryHandler oldMalloc; - ResizeMemoryHandler oldRealloc; - DestroyMemoryHandler oldFree; + ExceptionInfo* exceptionInfo = AcquireExceptionInfo(); if ( magick !is null ) this.magick = magick; if ( depth != 0 ) this.depth = depth; - //Use the D GC to accolate the blob. - GetMagickMemoryMethods(&oldMalloc, &oldRealloc, &oldFree); - SetMagickMemoryMethods(&Image.malloc, &Image.realloc, &Image.free); - scope(exit) SetMagickMemoryMethods(oldMalloc, oldRealloc, oldFree); - - void* blob = ImageToBlob(options.imageInfo, imageRef, &length, DMagickExceptionInfo()); + void* blob = ImageToBlob(options.imageInfo, imageRef, &length, exceptionInfo); - return blob[0 .. length]; - } + DMagickException.throwException(exceptionInfo); - private extern(C) - { - static void* malloc(size_t sz) - { - return GC.malloc(sz, GC.BlkAttr.NO_SCAN); - } + void[] dBlob = blob[0 .. length].dup; + RelinquishMagickMemory(blob); - static void* realloc(void* p, size_t sz) - { - return GC.realloc(p, sz, GC.BlkAttr.NO_SCAN); - } - - static void free(void* p) - { - GC.free(p); - } + return dBlob; } /** -- cgit v1.2.3