]> granicus.if.org Git - imagemagick/blobdiff - magick/resource.c
(no commit message)
[imagemagick] / magick / resource.c
index 254c2f3601e25e57b67217cd595a8a4137289102..de1c7a0a39c333f1b82e866db2b94ac8fed941e2 100644 (file)
@@ -17,7 +17,7 @@
 %                               September 2002                                %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2011 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  %
@@ -102,12 +102,12 @@ static ResourceInfo
     MagickULLConstant(0),
     MagickULLConstant(0),
     MagickULLConstant(0),
-    MagickULLConstant(2048)*1024*1024,
+    MagickULLConstant(3072)*1024*1024/sizeof(PixelPacket),
     MagickULLConstant(1536)*1024*1024,
-    MagickULLConstant(8192)*1024*1024,
+    MagickULLConstant(3072)*1024*1024,
     MagickResourceInfinity,
     MagickULLConstant(768),
-    MagickULLConstant(8),
+    MagickULLConstant(4),
     MagickResourceInfinity
   };
 
@@ -210,9 +210,9 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type,
       status=(resource_info.disk_limit == MagickResourceInfinity) ||
         ((MagickSizeType) resource_info.disk < limit) ?
         MagickTrue : MagickFalse;
-      (void) FormatMagickSize((MagickSizeType) resource_info.disk,MagickFalse,
+      (void) FormatMagickSize((MagickSizeType) resource_info.disk,MagickTrue,
         resource_current);
-      (void) FormatMagickSize(resource_info.disk_limit,MagickFalse,
+      (void) FormatMagickSize(resource_info.disk_limit,MagickTrue,
         resource_limit);
       break;
     }
@@ -259,8 +259,8 @@ MagickExport MagickBooleanType AcquireMagickResource(const ResourceType type,
       break;
   }
   UnlockSemaphoreInfo(resource_semaphore);
-  (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %sB/%sB/%sB",
-    MagickOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
+  (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %s/%s/%s",
+    CommandOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
     resource_request,resource_current,resource_limit);
   return(status);
 }
@@ -394,9 +394,9 @@ static MagickBooleanType GetPathTemplate(char *path)
       return(MagickTrue);
     }
   if (directory[strlen(directory)-1] == *DirectorySeparator)
-    (void) FormatMagickString(path,MaxTextExtent,"%smagick-XXXXXXXX",directory);
+    (void) FormatLocaleString(path,MaxTextExtent,"%smagick-XXXXXXXX",directory);
   else
-    (void) FormatMagickString(path,MaxTextExtent,"%s%smagick-XXXXXXXX",
+    (void) FormatLocaleString(path,MaxTextExtent,"%s%smagick-XXXXXXXX",
       directory,DirectorySeparator);
   directory=DestroyString(directory);
   if (*DirectorySeparator != '/')
@@ -446,6 +446,15 @@ MagickExport int AcquireUniqueFileResource(char *path)
       Get temporary pathname.
     */
     (void) GetPathTemplate(path);
+    key=GetRandomKey(random_info,2);
+    p=path+strlen(path)-8;
+    datum=GetStringInfoDatum(key);
+    for (i=0; i < (ssize_t) GetStringInfoLength(key); i++)
+    {
+      c=(int) (datum[i] & 0x3f);
+      *p++=portable_filename[c];
+    }
+    key=DestroyStringInfo(key);
 #if defined(MAGICKCORE_HAVE_MKSTEMP)
     file=mkstemp(path);
 #if defined(__OS2__)
@@ -454,17 +463,17 @@ MagickExport int AcquireUniqueFileResource(char *path)
     if (file != -1)
       break;
 #endif
-    key=GetRandomKey(random_info,8);
-    p=path+strlen(path)-8;
+    key=GetRandomKey(random_info,6);
+    p=path+strlen(path)-6;
     datum=GetStringInfoDatum(key);
-    for (i=0; i < 8; i++)
+    for (i=0; i < (ssize_t) GetStringInfoLength(key); i++)
     {
       c=(int) (datum[i] & 0x3f);
       *p++=portable_filename[c];
     }
     key=DestroyStringInfo(key);
     file=open(path,O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,S_MODE);
-    if ((file > 0) || (errno != EEXIST))
+    if ((file >= 0) || (errno != EEXIST))
       break;
   }
   (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path);
@@ -566,7 +575,7 @@ MagickExport MagickSizeType GetMagickResource(const ResourceType type)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  GetMagickResource() returns the specified resource limit.
+%  GetMagickResourceLimit() returns the specified resource limit.
 %
 %  The format of the GetMagickResourceLimit() method is:
 %
@@ -673,16 +682,18 @@ MagickExport MagickBooleanType ListMagickResourceInfo(FILE *file,
   (void) FormatMagickSize(resource_info.area_limit,MagickFalse,area_limit);
   (void) FormatMagickSize(resource_info.memory_limit,MagickTrue,memory_limit);
   (void) FormatMagickSize(resource_info.map_limit,MagickTrue,map_limit);
-  (void) FormatMagickSize(resource_info.disk_limit,MagickFalse,disk_limit);
+  (void) CopyMagickString(disk_limit,"unlimited",MaxTextExtent);
+  if (resource_info.disk_limit != MagickResourceInfinity)
+    (void) FormatMagickSize(resource_info.disk_limit,MagickTrue,disk_limit);
   (void) CopyMagickString(time_limit,"unlimited",MaxTextExtent);
   if (resource_info.time_limit != MagickResourceInfinity)
-    (void) FormatMagickString(time_limit,MaxTextExtent,"%.20g",(double)
+    (void) FormatLocaleString(time_limit,MaxTextExtent,"%.20g",(double)
       resource_info.time_limit);
-  (void) fprintf(file,"File         Area       Memory          Map"
+  (void) FormatLocaleFile(file,"File         Area       Memory          Map"
     "         Disk    Thread         Time\n");
-  (void) fprintf(file,"--------------------------------------------------------"
+  (void) FormatLocaleFile(file,"--------------------------------------------------------"
     "-----------------------\n");
-  (void) fprintf(file,"%4g  %10sB  %10sB  %10sB  %10sB    %6g  %11s\n",(double)
+  (void) FormatLocaleFile(file,"%4g   %10s   %10s   %10s   %10s    %6g  %11s\n",(double)
     resource_info.file_limit,area_limit,memory_limit,map_limit,disk_limit,
     (double) resource_info.thread_limit,time_limit);
   (void) fflush(file);
@@ -759,9 +770,9 @@ MagickExport void RelinquishMagickResource(const ResourceType type,
     case DiskResource:
     {
       resource_info.disk-=size;
-      (void) FormatMagickSize((MagickSizeType) resource_info.disk,MagickFalse,
+      (void) FormatMagickSize((MagickSizeType) resource_info.disk,MagickTrue,
         resource_current);
-      (void) FormatMagickSize(resource_info.disk_limit,MagickFalse,
+      (void) FormatMagickSize(resource_info.disk_limit,MagickTrue,
         resource_limit);
       break;
     }
@@ -796,8 +807,8 @@ MagickExport void RelinquishMagickResource(const ResourceType type,
       break;
   }
   UnlockSemaphoreInfo(resource_semaphore);
-  (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %sB/%sB/%sB",
-    MagickOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
+  (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s: %s/%s/%s",
+    CommandOptionToMnemonic(MagickResourceOptions,(ssize_t) type),
       resource_request,resource_current,resource_limit);
 }
 \f
@@ -871,8 +882,7 @@ MagickExport MagickBooleanType RelinquishUniqueFileResource(const char *path)
 %
 */
 
-static inline size_t MagickMax(const size_t x,
-  const size_t y)
+static inline size_t MagickMax(const size_t x,const size_t y)
 {
   if (x > y)
     return(x);
@@ -896,14 +906,14 @@ MagickExport MagickBooleanType ResourceComponentGenesis(void)
   char
     *limit;
 
+  MagickSizeType
+    memory;
+
   ssize_t
     files,
     pages,
     pagesize;
 
-  MagickSizeType
-    memory;
-
   /*
     Set Magick resource limits.
   */
@@ -919,9 +929,9 @@ MagickExport MagickBooleanType ResourceComponentGenesis(void)
 #if defined(PixelCacheThreshold)
   memory=PixelCacheThreshold;
 #endif
-  (void) SetMagickResourceLimit(AreaResource,2UL*memory);
-  (void) SetMagickResourceLimit(MemoryResource,3UL*memory/2UL);
-  (void) SetMagickResourceLimit(MapResource,4UL*memory);
+  (void) SetMagickResourceLimit(AreaResource,2*memory/sizeof(PixelPacket));
+  (void) SetMagickResourceLimit(MemoryResource,memory);
+  (void) SetMagickResourceLimit(MapResource,2*memory);
   limit=GetEnvironmentValue("MAGICK_AREA_LIMIT");
   if (limit == (char *) NULL)
     limit=GetPolicyValue("area");
@@ -991,7 +1001,6 @@ MagickExport MagickBooleanType ResourceComponentGenesis(void)
     limit=GetPolicyValue("thread");
   if (limit != (char *) NULL)
     {
-      SetOpenMPMaximumThreads((int) StringToUnsignedLong(limit));
       (void) SetMagickResourceLimit(ThreadResource,StringToSizeType(limit,
         100.0));
       limit=DestroyString(limit);
@@ -1063,9 +1072,21 @@ MagickExport void ResourceComponentTerminus(void)
 %    o limit: the maximum limit for the resource.
 %
 */
+
+static inline MagickSizeType MagickMin(const MagickSizeType x,
+  const MagickSizeType y)
+{
+  if (x < y)
+    return(x);
+  return(y);
+}
+
 MagickExport MagickBooleanType SetMagickResourceLimit(const ResourceType type,
   const MagickSizeType limit)
 {
+  char
+    *value;
+
   if (resource_semaphore == (SemaphoreInfo *) NULL)
     AcquireSemaphoreInfo(&resource_semaphore);
   LockSemaphoreInfo(resource_semaphore);
@@ -1074,37 +1095,60 @@ MagickExport MagickBooleanType SetMagickResourceLimit(const ResourceType type,
     case AreaResource:
     {
       resource_info.area_limit=limit;
+      value=GetPolicyValue("area");
+      if (value != (char *) NULL)
+        resource_info.area_limit=MagickMin(limit,StringToSizeType(value,100.0));
       break;
     }
     case MemoryResource:
     {
       resource_info.memory_limit=limit;
+      value=GetPolicyValue("memory");
+      if (value != (char *) NULL)
+        resource_info.memory_limit=MagickMin(limit,StringToSizeType(value,
+          100.0));
       break;
     }
     case MapResource:
     {
       resource_info.map_limit=limit;
+      value=GetPolicyValue("map");
+      if (value != (char *) NULL)
+        resource_info.map_limit=MagickMin(limit,StringToSizeType(value,100.0));
       break;
     }
     case DiskResource:
     {
       resource_info.disk_limit=limit;
+      value=GetPolicyValue("disk");
+      if (value != (char *) NULL)
+        resource_info.disk_limit=MagickMin(limit,StringToSizeType(value,100.0));
       break;
     }
     case FileResource:
     {
       resource_info.file_limit=limit;
+      value=GetPolicyValue("file");
+      if (value != (char *) NULL)
+        resource_info.file_limit=MagickMin(limit,StringToSizeType(value,100.0));
       break;
     }
     case ThreadResource:
     {
-      SetOpenMPMaximumThreads((int) limit);
       resource_info.thread_limit=limit;
+      value=GetPolicyValue("thread");
+      if (value != (char *) NULL)
+        resource_info.thread_limit=MagickMin(limit,StringToSizeType(value,
+          100.0));
+      SetOpenMPMaximumThreads((int) resource_info.thread_limit);
       break;
     }
     case TimeResource:
     {
       resource_info.time_limit=limit;
+      value=GetPolicyValue("time");
+      if (value != (char *) NULL)
+        resource_info.time_limit=MagickMin(limit,StringToSizeType(value,100.0));
       break;
     }
     default: