summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Wey2012-04-09 14:35:41 +0200
committerMike Wey2012-04-09 14:35:41 +0200
commit811e5806d29c0856b182c278ec544a7fe4be4175 (patch)
tree051e33ec2af526c070b982f01cd59b5ba2ae6931
parent90958a9bc18b13cb76581eea7ab7d99b8d831601 (diff)
Don't try to use the D GC when creating blobs.
This causes segfaults, see issue #4.
-rw-r--r--dmagick/Array.d14
-rw-r--r--dmagick/Image.d33
-rw-r--r--dmagick/ImageView.d6
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;