From: cristy Date: Sat, 14 Apr 2012 01:34:21 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~5815 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e7452651d473ea45aa985c66ce8e9c95a96c3b5a;p=imagemagick --- diff --git a/MagickCore/effect.c b/MagickCore/effect.c index ba9c80183..d4ca01941 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -3512,6 +3512,7 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, *spread_image; MagickBooleanType + concurrent, status; MagickOffsetType @@ -3551,10 +3552,12 @@ MagickExport Image *SpreadImage(const Image *image,const double radius, progress=0; width=GetOptimalKernelWidth1D(radius,0.5); random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; image_view=AcquireCacheView(image); spread_view=AcquireCacheView(spread_image); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,8) shared(progress,status) + #pragma omp parallel for schedule(static,8) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/fx.c b/MagickCore/fx.c index 46875b6be..b34ce09cc 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -265,6 +265,7 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, *noise_image; MagickBooleanType + concurrent, status; MagickOffsetType @@ -299,10 +300,12 @@ MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, status=MagickTrue; progress=0; random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; image_view=AcquireCacheView(image); noise_view=AcquireCacheView(noise_image); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(progress,status) + #pragma omp parallel for schedule(static,4) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) image->rows; y++) { @@ -4379,6 +4382,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius, *sketch_image; MagickBooleanType + concurrent, status; RandomInfo @@ -4396,9 +4400,11 @@ MagickExport Image *SketchImage(const Image *image,const double radius, return((Image *) NULL); status=MagickTrue; random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; random_view=AcquireCacheView(random_image); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(status) + #pragma omp parallel for schedule(static,4) shared(status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) random_image->rows; y++) { diff --git a/MagickCore/random.c b/MagickCore/random.c index 407b03570..0118e741b 100644 --- a/MagickCore/random.c +++ b/MagickCore/random.c @@ -92,6 +92,9 @@ struct _RandomInfo double normalize; + unsigned long + secret_key; + unsigned short protocol_major, protocol_minor; @@ -186,9 +189,10 @@ MagickExport RandomInfo *AcquireRandomInfo(void) random_info->signature_info)); ResetStringInfo(random_info->reservoir); random_info->normalize=1.0/(~0UL); - random_info->semaphore=AllocateSemaphoreInfo(); + random_info->secret_key=random_seed; random_info->protocol_major=RandomProtocolMajorVersion; random_info->protocol_minor=RandomProtocolMinorVersion; + random_info->semaphore=AllocateSemaphoreInfo(); random_info->timestamp=(ssize_t) time(0); random_info->signature=MagickSignature; /* @@ -219,9 +223,9 @@ MagickExport RandomInfo *AcquireRandomInfo(void) /* Seed pseudo random number generator. */ - if (random_seed == ~0UL) + if (random_info->secret_key == ~0UL) { - key=GetRandomKey(random_info,sizeof(random_seed)); + key=GetRandomKey(random_info,sizeof(random_info->secret_key)); (void) CopyMagickMemory(random_info->seed,GetStringInfoDatum(key), GetStringInfoLength(key)); key=DestroyStringInfo(key); @@ -232,12 +236,8 @@ MagickExport RandomInfo *AcquireRandomInfo(void) *signature_info; signature_info=AcquireSignatureInfo(); - key=AcquireStringInfo(sizeof(random_seed)); - SetStringInfoDatum(key,(unsigned char *) &random_seed); - if ((random_seed << 1) > random_seed) - random_seed<<=1; - else - random_seed>>=1; + key=AcquireStringInfo(sizeof(random_info->secret_key)); + SetStringInfoDatum(key,(unsigned char *) &random_info->secret_key); UpdateSignature(signature_info,key); key=DestroyStringInfo(key); FinalizeSignature(signature_info); @@ -662,6 +662,32 @@ MagickExport StringInfo *GetRandomKey(RandomInfo *random_info, % % % % % % +% G e t R a n d o m S e c r e t K e y % +% % +% % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% GetRandomSecretKey() returns the random secet key. +% +% The format of the GetRandomSecretKey method is: +% +% unsigned long GetRandomSecretKey(const RandomInfo *random_info) +% +% A description of each parameter follows: +% +% o random_info: the random info. +*/ +MagickExport unsigned long GetRandomSecretKey(const RandomInfo *random_info) +{ + return(random_info->secret_key); +} + +/* +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% % +% % % G e t R a n d o m V a l u e % % % % % diff --git a/MagickCore/random_.h b/MagickCore/random_.h index ab1eeb57f..f8213c0cd 100644 --- a/MagickCore/random_.h +++ b/MagickCore/random_.h @@ -44,6 +44,9 @@ extern MagickExport RandomInfo extern MagickExport StringInfo *GetRandomKey(RandomInfo *,const size_t); +extern MagickExport unsigned long + GetRandomSecretKey(const RandomInfo *); + extern MagickExport void SeedPseudoRandomGenerator(const unsigned long), SetRandomKey(RandomInfo *,const size_t,unsigned char *), diff --git a/MagickCore/statistic.c b/MagickCore/statistic.c index e335bed4f..4eead7a7f 100644 --- a/MagickCore/statistic.c +++ b/MagickCore/statistic.c @@ -436,6 +436,7 @@ MagickExport Image *EvaluateImages(const Image *images, *evaluate_image; MagickBooleanType + concurrent, status; MagickOffsetType @@ -496,11 +497,13 @@ MagickExport Image *EvaluateImages(const Image *images, status=MagickTrue; progress=0; random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; evaluate_view=AcquireCacheView(evaluate_image); if (op == MedianEvaluateOperator) { #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static) shared(progress,status) + #pragma omp parallel for schedule(static) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) evaluate_image->rows; y++) { @@ -607,7 +610,7 @@ MagickExport Image *EvaluateImages(const Image *images, else { #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static) shared(progress,status) + #pragma omp parallel for schedule(static) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) evaluate_image->rows; y++) { @@ -784,6 +787,7 @@ MagickExport MagickBooleanType EvaluateImage(Image *image, *image_view; MagickBooleanType + concurrent, status; MagickOffsetType @@ -805,10 +809,14 @@ MagickExport MagickBooleanType EvaluateImage(Image *image, return(MagickFalse); status=MagickTrue; progress=0; + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; image_view=AcquireCacheView(image); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,4) shared(progress,status) + #pragma omp parallel for schedule(static,4) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) image->rows; y++) { diff --git a/MagickCore/thread-private.h b/MagickCore/thread-private.h index 6f34e489f..add3a0e2d 100644 --- a/MagickCore/thread-private.h +++ b/MagickCore/thread-private.h @@ -31,6 +31,8 @@ extern "C" { #define MagickCachePrefetch(address,mode,locality) #endif +#define omp_concurrent(concurrent) \ + num_threads((concurrent) != MagickFalse ? omp_get_max_threads() : 1) #define omp_throttle(factor) num_threads(omp_get_max_threads() >> \ (factor) == 0 ? 1 : omp_get_max_threads() >> (factor)) diff --git a/MagickCore/threshold.c b/MagickCore/threshold.c index 7728a9e19..997199f13 100644 --- a/MagickCore/threshold.c +++ b/MagickCore/threshold.c @@ -1435,6 +1435,7 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image, flags; MagickBooleanType + concurrent, status; MagickOffsetType @@ -1461,6 +1462,8 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image, assert(exception->signature == MagickSignature); if (thresholds == (const char *) NULL) return(MagickTrue); + if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) + return(MagickFalse); GetPixelInfo(image,&threshold); min_threshold=0.0; max_threshold=(MagickRealType) QuantumRange; @@ -1479,12 +1482,12 @@ MagickExport MagickBooleanType RandomThresholdImage(Image *image, */ status=MagickTrue; progress=0; - if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse) - return(MagickFalse); random_info=AcquireRandomInfoThreadSet(); + concurrent=GetRandomSecretKey(random_info[0]) == ~0UL ? MagickTrue : + MagickFalse; image_view=AcquireCacheView(image); #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp parallel for schedule(static,8) shared(progress,status) + #pragma omp parallel for schedule(static,8) shared(progress,status) omp_concurrent(concurrent) #endif for (y=0; y < (ssize_t) image->rows; y++) {