]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/exception.c
(no commit message)
[imagemagick] / MagickCore / exception.c
index fb50942f369a80542e0cbfa711d69035479a8c22..3929ba6e3800d26fc7d0affba10776e712a50cc7 100644 (file)
 %                        MagickCore Exception Methods                         %
 %                                                                             %
 %                             Software Design                                 %
-%                               John Cristy                                   %
+%                                  Cristy                                     %
 %                                July 1993                                    %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2014 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
@@ -258,8 +258,8 @@ MagickExport ExceptionInfo *CloneExceptionInfo(ExceptionInfo *exception)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
   GetExceptionInfo(clone_exception);
   InheritException(clone_exception,exception);
-  exception->relinquish=MagickTrue;
-  return(exception);
+  clone_exception->relinquish=MagickTrue;
+  return(clone_exception);
 }
 \f
 /*
@@ -414,7 +414,7 @@ MagickExport ExceptionInfo *DestroyExceptionInfo(ExceptionInfo *exception)
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
   if (exception->semaphore == (SemaphoreInfo *) NULL)
-    AcquireSemaphoreInfo(&exception->semaphore);
+    ActivateSemaphoreInfo(&exception->semaphore);
   LockSemaphoreInfo(exception->semaphore);
   exception->severity=UndefinedException;
   if (exception->exceptions != (void *) NULL)
@@ -424,7 +424,7 @@ MagickExport ExceptionInfo *DestroyExceptionInfo(ExceptionInfo *exception)
   if (exception->relinquish != MagickFalse)
     exception->signature=(~MagickSignature);
   UnlockSemaphoreInfo(exception->semaphore);
-  DestroySemaphoreInfo(&exception->semaphore);
+  RelinquishSemaphoreInfo(&exception->semaphore);
   if (relinquish != MagickFalse)
     exception=(ExceptionInfo *) RelinquishMagickMemory(exception);
   return(exception);
@@ -458,7 +458,7 @@ MagickExport void GetExceptionInfo(ExceptionInfo *exception)
   (void) ResetMagickMemory(exception,0,sizeof(*exception));
   exception->severity=UndefinedException;
   exception->exceptions=(void *) NewLinkedList(0);
-  exception->semaphore=AllocateSemaphoreInfo();
+  exception->semaphore=AcquireSemaphoreInfo();
   exception->signature=MagickSignature;
 }
 \f
@@ -659,7 +659,7 @@ MagickExport void InheritException(ExceptionInfo *exception,
   assert(relative->signature == MagickSignature);
   if (relative->exceptions == (void *) NULL)
     return;
-  LockSemaphoreInfo(exception->semaphore);
+  LockSemaphoreInfo(relative->semaphore);
   ResetLinkedListIterator((LinkedListInfo *) relative->exceptions);
   p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
     relative->exceptions);
@@ -669,7 +669,7 @@ MagickExport void InheritException(ExceptionInfo *exception,
     p=(const ExceptionInfo *) GetNextValueInLinkedList((LinkedListInfo *)
       relative->exceptions);
   }
-  UnlockSemaphoreInfo(exception->semaphore);
+  UnlockSemaphoreInfo(relative->semaphore);
 }
 \f
 /*
@@ -915,15 +915,22 @@ MagickExport MagickBooleanType ThrowException(ExceptionInfo *exception,
 
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
+  LockSemaphoreInfo(exception->semaphore);
   p=(ExceptionInfo *) GetLastValueInLinkedList((LinkedListInfo *)
     exception->exceptions);
   if ((p != (ExceptionInfo *) NULL) && (p->severity == severity) &&
       (LocaleCompare(exception->reason,reason) == 0) &&
       (LocaleCompare(exception->description,description) == 0))
-    return(MagickTrue);
+    {
+      UnlockSemaphoreInfo(exception->semaphore);
+      return(MagickTrue);
+    }
   p=(ExceptionInfo *) AcquireMagickMemory(sizeof(*p));
   if (p == (ExceptionInfo *) NULL)
-    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+    {
+      UnlockSemaphoreInfo(exception->semaphore);
+      ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+    }
   (void) ResetMagickMemory(p,0,sizeof(*p));
   p->severity=severity;
   if (reason != (const char *) NULL)
@@ -932,9 +939,13 @@ MagickExport MagickBooleanType ThrowException(ExceptionInfo *exception,
     p->description=ConstantString(description);
   p->signature=MagickSignature;
   (void) AppendValueToLinkedList((LinkedListInfo *) exception->exceptions,p);
-  exception->severity=p->severity;
-  exception->reason=p->reason;
-  exception->description=p->description;
+  if (p->severity >= exception->severity)
+    {
+      exception->severity=p->severity;
+      exception->reason=p->reason;
+      exception->description=p->description;
+    }
+  UnlockSemaphoreInfo(exception->semaphore);
   return(MagickTrue);
 }
 \f
@@ -977,10 +988,10 @@ MagickExport MagickBooleanType ThrowException(ExceptionInfo *exception,
 %
 */
 
-MagickExport MagickBooleanType ThrowMagickExceptionList(ExceptionInfo *exception,
-  const char *module,const char *function,const size_t line,
-  const ExceptionType severity,const char *tag,const char *format,
-  va_list operands)
+MagickExport MagickBooleanType ThrowMagickExceptionList(
+  ExceptionInfo *exception,const char *module,const char *function,
+  const size_t line,const ExceptionType severity,const char *tag,
+  const char *format,va_list operands)
 {
   char
     message[MaxTextExtent],