diff options
| author | Mike Wey | 2012-04-09 14:35:41 +0200 |
|---|---|---|
| committer | Mike Wey | 2012-04-09 14:35:41 +0200 |
| commit | 811e5806d29c0856b182c278ec544a7fe4be4175 (patch) | |
| tree | 051e33ec2af526c070b982f01cd59b5ba2ae6931 | |
| parent | 90958a9bc18b13cb76581eea7ab7d99b8d831601 (diff) | |
Don't try to use the D GC when creating blobs.
This causes segfaults, see issue #4.
| -rw-r--r-- | dmagick/Array.d | 14 | ||||
| -rw-r--r-- | dmagick/Image.d | 33 | ||||
| -rw-r--r-- | dmagick/ImageView.d | 6 |
3 files changed, 14 insertions, 39 deletions
diff --git a/dmagick/Array.d b/dmagick/Array.d index 339de5c..7778af7 100644 --- a/dmagick/Array.d +++ b/dmagick/Array.d @@ -595,26 +595,20 @@ void[] toBlob(Image[] images, string magick = null, size_t depth = 0, bool adjoi { size_t length; - AcquireMemoryHandler oldMalloc; - ResizeMemoryHandler oldRealloc; - DestroyMemoryHandler oldFree; - if ( magick !is null ) images[0].magick = magick; if ( depth != 0 ) images[0].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); - linkImages(images); scope(exit) unlinkImages(images); void* blob = ImagesToBlob(images[0].options.imageInfo, images[0].imageRef, &length, DMagickExceptionInfo()); - return blob[0 .. length]; + void[] dBlob = blob[0 .. length].dup; + RelinquishMagickMemory(blob); + + return dBlob; } /** 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; } /** diff --git a/dmagick/ImageView.d b/dmagick/ImageView.d index d464588..21e4e46 100644 --- a/dmagick/ImageView.d +++ b/dmagick/ImageView.d @@ -157,13 +157,15 @@ class ImageView * Support the usage of foreach to loop over the rows in the view. * The foreach is executed in parallel. */ - int opApply(int delegate(Pixels) dg) + int opApply(int delegate(ref Pixels) dg) { shared(int) progress; foreach ( row; taskPool.parallel(iota(extent.y, extent.y + extent.height)) ) { - int result = dg(Pixels(image, extent.x, row, extent.width, 1)); + Pixels pixels = Pixels(image, extent.x, row, extent.width, 1); + + int result = dg(pixels); if ( result ) return result; |
