From 10f10ec25a07c1c5599fe9874aaa943b3fac34a9 Mon Sep 17 00:00:00 2001 From: cristy Date: Sat, 20 Sep 2014 01:00:50 +0000 Subject: [PATCH] --- MagickCore/blob-private.h | 1 + MagickCore/blob.c | 51 +++++++++++++++++++++++++++++++++++++++ MagickCore/image.c | 20 +-------------- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/MagickCore/blob-private.h b/MagickCore/blob-private.h index 12b12ff3f..6f265ab1f 100644 --- a/MagickCore/blob-private.h +++ b/MagickCore/blob-private.h @@ -57,6 +57,7 @@ extern MagickPrivate StreamHandler GetBlobStreamHandler(const Image *); extern MagickPrivate void + DisassociateBlob(Image *), GetBlobInfo(BlobInfo *), SetBlobExempt(Image *,const MagickBooleanType); diff --git a/MagickCore/blob.c b/MagickCore/blob.c index 5c3154b1b..2d51b61b8 100644 --- a/MagickCore/blob.c +++ b/MagickCore/blob.c @@ -713,6 +713,57 @@ MagickExport unsigned char *DetachBlob(BlobInfo *blob_info) % % % % % % ++ D i s a s s o c i a t e B l o b % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DisassociateBlob() disassociates the image stream. It checks if the +% blob of the specified image is referenced by other images. If the reference +% count is higher then 1 a new blob is assigned to the specified image. +% +% The format of the DisassociateBlob method is: +% +% MagickBooleanType DisassociateBlob(const Image *image) +% +% A description of each parameter follows: +% +% o image: the image. +% +*/ +MagickPrivate void DisassociateBlob(Image *image) +{ + BlobInfo + *blob; + + MagickBooleanType + clone; + + assert(image != (Image *) NULL); + assert(image->signature == MagickSignature); + if (image->debug != MagickFalse) + (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); + assert(image->blob != (BlobInfo *) NULL); + assert(image->blob->signature == MagickSignature); + clone=MagickFalse; + LockSemaphoreInfo(image->blob->semaphore); + assert(image->blob->reference_count >= 0); + if (image->blob->reference_count > 1) + clone=MagickTrue; + UnlockSemaphoreInfo(image->blob->semaphore); + if (clone == MagickFalse) + return; + blob=CloneBlobInfo(image->blob); + DestroyBlob(image); + image->blob=blob; +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % + D i s c a r d B l o b B y t e s % % % % % diff --git a/MagickCore/image.c b/MagickCore/image.c index 2cfc6ed41..ea8282510 100644 --- a/MagickCore/image.c +++ b/MagickCore/image.c @@ -1150,29 +1150,11 @@ MagickExport ImageInfo *DestroyImageInfo(ImageInfo *image_info) */ MagickExport void DisassociateImageStream(Image *image) { - BlobInfo - *blob; - - MagickBooleanType - clone; - assert(image != (Image *) NULL); assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); - assert(image->blob != (BlobInfo *) NULL); - assert(image->blob->signature == MagickSignature); - clone=MagickFalse; - LockSemaphoreInfo(image->blob->semaphore); - assert(image->blob->reference_count >= 0); - if (image->blob->reference_count > 1) - clone=MagickTrue; - UnlockSemaphoreInfo(image->blob->semaphore); - if (clone == MagickFalse) - return; - blob=CloneBlobInfo(image->blob); - DestroyBlob(image); - image->blob=blob; + DisassociateBlob(image); } /* -- 2.40.0