]> granicus.if.org Git - imagemagick/commitdiff
Optimized checking if event logging is enabled.
authorDirk Lemstra <dirk@git.imagemagick.org>
Tue, 31 Oct 2017 20:39:58 +0000 (21:39 +0100)
committerDirk Lemstra <dirk@git.imagemagick.org>
Tue, 31 Oct 2017 20:40:20 +0000 (21:40 +0100)
MagickCore/log.c
MagickCore/log.h
MagickWand/wandcli.c

index 764b5184871359716831692d7d79dca0c91cb254..eaf48eb2bd0154ce8a922adafb3b78ea406ecfd4 100644 (file)
@@ -212,6 +212,9 @@ static LinkedListInfo
 static SemaphoreInfo
   *event_semaphore = (SemaphoreInfo *) NULL,
   *log_semaphore = (SemaphoreInfo *) NULL;
+
+static MagickBooleanType
+  log_enabled = MagickFalse;
 \f
 /*
   Forward declarations.
@@ -227,6 +230,22 @@ static MagickBooleanType
   LoadLogCache(LinkedListInfo *,const char *,const char *,const size_t,
     ExceptionInfo *);
 \f
+static void CheckLogEnabled()
+{
+  /* We don't need locks because we only call this inside log_semaphore */
+  if (IsLinkedListEmpty(log_cache) != MagickFalse)
+    log_enabled=MagickFalse;
+  else
+    {
+      LogInfo
+        *p;
+
+      ResetLinkedListIterator(log_cache);
+      p=(LogInfo *) GetNextValueInLinkedList(log_cache);
+      log_enabled=p->event_mask != NoEvents ? MagickTrue: MagickFalse;
+    }
+}
+\f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %                                                                             %
@@ -663,7 +682,10 @@ static MagickBooleanType IsLogCacheInstantiated(ExceptionInfo *exception)
         ActivateSemaphoreInfo(&log_semaphore);
       LockSemaphoreInfo(log_semaphore);
       if (log_cache == (LinkedListInfo *) NULL)
-        log_cache=AcquireLogCache(LogFilename,exception);
+        {
+          log_cache=AcquireLogCache(LogFilename,exception);
+          CheckLogEnabled();
+        }
       UnlockSemaphoreInfo(log_semaphore);
     }
   return(log_cache != (LinkedListInfo *) NULL ? MagickTrue : MagickFalse);
@@ -690,19 +712,7 @@ static MagickBooleanType IsLogCacheInstantiated(ExceptionInfo *exception)
 */
 MagickExport MagickBooleanType IsEventLogging(void)
 {
-  const LogInfo
-    *log_info;
-
-  ExceptionInfo
-    *exception;
-
-  if ((log_cache == (LinkedListInfo *) NULL) ||
-      (IsLinkedListEmpty(log_cache) != MagickFalse))
-    return(MagickFalse);
-  exception=AcquireExceptionInfo();
-  log_info=GetLogInfo("*",exception);
-  exception=DestroyExceptionInfo(exception);
-  return(log_info->event_mask != NoEvents ? MagickTrue : MagickFalse);
+  return(log_enabled);
 }
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -891,6 +901,7 @@ MagickPrivate void LogComponentTerminus(void)
   LockSemaphoreInfo(log_semaphore);
   if (log_cache != (LinkedListInfo *) NULL)
     log_cache=DestroyLinkedList(log_cache,DestroyLogElement);
+  log_enabled=MagickFalse;
   UnlockSemaphoreInfo(log_semaphore);
   RelinquishSemaphoreInfo(&log_semaphore);
 }
@@ -1251,8 +1262,9 @@ static char *TranslateFilename(const LogInfo *log_info)
   return(filename);
 }
 
-MagickBooleanType LogMagickEventList(const LogEventType type,const char *module,
-  const char *function,const size_t line,const char *format,va_list operands)
+MagickExport MagickBooleanType LogMagickEventList(const LogEventType type,
+  const char *module,const char *function,const size_t line,const char *format,
+  va_list operands)
 {
   char
     event[MagickPathExtent],
@@ -1270,8 +1282,6 @@ MagickBooleanType LogMagickEventList(const LogEventType type,const char *module,
   LogInfo
     *log_info;
 
-  if (IsEventLogging() == MagickFalse)
-    return(MagickFalse);
   exception=AcquireExceptionInfo();
   log_info=(LogInfo *) GetLogInfo("*",exception);
   exception=DestroyExceptionInfo(exception);
@@ -1380,8 +1390,9 @@ MagickBooleanType LogMagickEventList(const LogEventType type,const char *module,
   return(MagickTrue);
 }
 
-MagickBooleanType LogMagickEvent(const LogEventType type,const char *module,
-  const char *function,const size_t line,const char *format,...)
+MagickExport MagickBooleanType LogMagickEvent(const LogEventType type,
+  const char *module,const char *function,const size_t line,
+  const char *format,...)
 {
   va_list
     operands;
@@ -1389,6 +1400,8 @@ MagickBooleanType LogMagickEvent(const LogEventType type,const char *module,
   MagickBooleanType
     status;
 
+  if (IsEventLogging() == MagickFalse)
+    return(MagickFalse);
   va_start(operands,format);
   status=LogMagickEventList(type,module,function,line,format,operands);
   va_end(operands);
@@ -1737,6 +1750,7 @@ MagickExport LogEventType SetLogEventMask(const char *events)
   log_info->event_mask=(LogEventType) option;
   if (option == -1)
     log_info->event_mask=UndefinedEvents;
+  CheckLogEnabled();
   UnlockSemaphoreInfo(log_semaphore);
   return(log_info->event_mask);
 }
index 46c5e211c413edbc9c0d9d6efb9fb88f095e8c5e..fa2b8a12a47abfcb5eb1325c12493fbda045d698 100644 (file)
@@ -81,8 +81,7 @@ extern MagickExport MagickBooleanType
   IsEventLogging(void),
   ListLogInfo(FILE *,ExceptionInfo *),
   LogMagickEvent(const LogEventType,const char *,const char *,const size_t,
-    const char *,...) 
-    magick_attribute((__format__ (__printf__,5,6))),
+    const char *,...) magick_attribute((__format__ (__printf__,5,6))),
   LogMagickEventList(const LogEventType,const char *,const char *,const size_t,
     const char *,va_list) magick_attribute((__format__ (__printf__,5,0)));
 
index 1884d84179d2187a2616843ecc62e290dbc61999..3dddc52a7a8fb84a720117dc3fbb9dfefe5a5648 100644 (file)
@@ -281,6 +281,9 @@ WandExport MagickBooleanType CLILogEvent(MagickCLI *cli_wand,
   va_list
     operands;
 
+  if (IsEventLogging() == MagickFalse)
+    return(MagickFalse);
+
   /* HACK - prepend the CLI location to format string.
      The better way would be add more arguments to to the 'va' oparands
      list, but that does not appear to be possible! So we do some