From: cristy Date: Tue, 23 Nov 2010 13:49:46 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~8469 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=652316c1b9fbe7d8fdf26b144031b0eb9251c424;p=imagemagick --- diff --git a/ChangeLog b/ChangeLog index 47bc75f65..a97b31fbf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-11-23 6.6.6-0 Cristy + * The policy.xml sets not-to-exceed resource values (e.g. policy memory limit + 1GB, -limit 2GB exceeds policy maximum so memory limit is 1GB). + 2010-11-21 6.6.5-10 Cristy * Fix png coder compile error when HDRI is enabled. diff --git a/config/policy.xml b/config/policy.xml index ac2a65a02..a4d654011 100644 --- a/config/policy.xml +++ b/config/policy.xml @@ -38,6 +38,10 @@ Any large image is cached to disk rather than memory: + + Note, resource policies are maximums for each instance of ImageMagick. For + example, if you set the memory resource to 1gb, no ImageMagick instance can + use more than 10mb of pixel cache memory. --> diff --git a/magick/resource.c b/magick/resource.c index 8e4b0384d..88952bf70 100644 --- a/magick/resource.c +++ b/magick/resource.c @@ -873,8 +873,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); @@ -993,7 +992,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); @@ -1065,9 +1063,20 @@ MagickExport void ResourceComponentTerminus(void) % o limit: the maximum limit for the resource. % */ + +static inline size_t MagickMin(const size_t x,const size_t 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); @@ -1076,37 +1085,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: