43 #include "magick/studio.h"
44 #include "magick/exception.h"
45 #include "magick/exception-private.h"
46 #include "magick/image-private.h"
47 #include "magick/locale_.h"
48 #include "magick/log.h"
49 #include "magick/memory_.h"
50 #include "magick/nt-base-private.h"
51 #include "magick/resource_.h"
52 #include "magick/string-private.h"
53 #include "magick/timer.h"
54 #include "magick/timer-private.h"
59 #if !defined(CLOCKS_PER_SEC)
60 #define CLOCKS_PER_SEC 100
91 MagickExport
TimerInfo *AcquireTimerInfo(
void)
96 timer_info=(
TimerInfo *) AcquireMagickMemory(
sizeof(*timer_info));
98 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
99 (void) memset(timer_info,0,
sizeof(*timer_info));
100 timer_info->signature=MagickCoreSignature;
101 GetTimerInfo(timer_info);
128 MagickExport MagickBooleanType ContinueTimer(
TimerInfo *time_info)
131 assert(time_info->signature == MagickCoreSignature);
132 if (time_info->state == UndefinedTimerState)
134 if (time_info->state == StoppedTimerState)
136 time_info->user.total-=time_info->user.stop-time_info->user.start;
137 time_info->elapsed.total-=time_info->elapsed.stop-
138 time_info->elapsed.start;
140 time_info->state=RunningTimerState;
168 assert(timer_info != (
TimerInfo *) NULL);
169 assert(timer_info->signature == MagickCoreSignature);
170 timer_info->signature=(~MagickCoreSignature);
171 timer_info=(
TimerInfo *) RelinquishMagickMemory(timer_info);
194 static double ElapsedTime(
void)
196 #if defined(MAGICKCORE_HAVE_CLOCK_GETTIME)
197 #define NANOSECONDS_PER_SECOND 1000000000.0
198 #if defined(CLOCK_HIGHRES)
199 # define CLOCK_ID CLOCK_HIGHRES
200 #elif defined(CLOCK_MONOTONIC_RAW)
201 # define CLOCK_ID CLOCK_MONOTONIC_RAW
202 #elif defined(CLOCK_MONOTONIC_PRECISE)
203 # define CLOCK_ID CLOCK_MONOTONIC_PRECISE
204 #elif defined(CLOCK_MONOTONIC)
205 # define CLOCK_ID CLOCK_MONOTONIC
207 # define CLOCK_ID CLOCK_REALTIME
213 (void) clock_gettime(CLOCK_ID,&timer);
214 return((
double) timer.tv_sec+timer.tv_nsec/NANOSECONDS_PER_SECOND);
215 #elif defined(MAGICKCORE_HAVE_TIMES) && defined(MAGICKCORE_HAVE_SYSCONF)
219 return((
double) times(&timer)/sysconf(_SC_CLK_TCK));
221 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
222 return(NTElapsedTime());
224 return((
double) clock()/CLOCKS_PER_SEC);
258 MagickExport ssize_t FormatMagickTime(
const time_t time,
const size_t length,
267 assert(timestamp != (
char *) NULL);
268 GetMagickUTCtime(&time,&utc_time);
269 count=FormatLocaleString(timestamp,length,
270 "%04d-%02d-%02dT%02d:%02d:%02d%+03d:00",utc_time.tm_year+1900,
271 utc_time.tm_mon+1,utc_time.tm_mday,utc_time.tm_hour,utc_time.tm_min,
300 MagickExport
double GetElapsedTime(
TimerInfo *time_info)
303 assert(time_info->signature == MagickCoreSignature);
304 if (time_info->state == UndefinedTimerState)
306 if (time_info->state == RunningTimerState)
307 StopTimer(time_info);
308 return(time_info->elapsed.total);
329 MagickExport time_t GetMagickTime(
void)
332 constant_magick_time = (time_t) 0;
334 static MagickBooleanType
335 epoch_initialized = MagickFalse;
337 if (epoch_initialized == MagickFalse)
342 epoch_initialized=MagickTrue;
343 source_date_epoch=getenv(
"SOURCE_DATE_EPOCH");
344 if (source_date_epoch != (
const char *) NULL)
349 epoch=(time_t) StringToDouble(source_date_epoch,(
char **) NULL);
350 if ((epoch > 0) && (epoch <= time((time_t *) NULL)))
351 constant_magick_time=epoch;
354 if (constant_magick_time != 0)
355 return(constant_magick_time);
356 return(time((time_t *) NULL));
377 MagickPrivate MagickOffsetType GetMagickTTL(
void)
380 magick_epoch = (time_t) 0;
382 static MagickBooleanType
383 epoch_initialized = MagickFalse;
385 if (epoch_initialized == MagickFalse)
387 epoch_initialized=MagickTrue;
388 magick_epoch=time((time_t *) NULL);
390 return((MagickOffsetType) GetMagickResourceLimit(TimeResource)-
391 (GetMagickTime()-magick_epoch));
416 MagickExport
void GetTimerInfo(
TimerInfo *time_info)
422 (void) memset(time_info,0,
sizeof(*time_info));
423 time_info->state=UndefinedTimerState;
424 time_info->signature=MagickCoreSignature;
425 StartTimer(time_info,MagickTrue);
452 MagickExport
double GetUserTime(
TimerInfo *time_info)
455 assert(time_info->signature == MagickCoreSignature);
456 if (time_info->state == UndefinedTimerState)
458 if (time_info->state == RunningTimerState)
459 StopTimer(time_info);
460 return(time_info->user.total);
485 MagickExport
void ResetTimer(
TimerInfo *time_info)
488 assert(time_info->signature == MagickCoreSignature);
489 StopTimer(time_info);
490 time_info->elapsed.stop=0.0;
491 time_info->user.stop=0.0;
520 MagickExport
void StartTimer(
TimerInfo *time_info,
const MagickBooleanType reset)
523 assert(time_info->signature == MagickCoreSignature);
524 if (reset != MagickFalse)
529 time_info->user.total=0.0;
530 time_info->elapsed.total=0.0;
532 if (time_info->state != RunningTimerState)
534 time_info->elapsed.start=ElapsedTime();
535 time_info->user.start=UserTime();
537 time_info->state=RunningTimerState;
562 static void StopTimer(
TimerInfo *time_info)
565 assert(time_info->signature == MagickCoreSignature);
566 time_info->elapsed.stop=ElapsedTime();
567 time_info->user.stop=UserTime();
568 if (time_info->state == RunningTimerState)
570 time_info->user.total+=time_info->user.stop-
571 time_info->user.start+MagickEpsilon;
572 time_info->elapsed.total+=time_info->elapsed.stop-
573 time_info->elapsed.start+MagickEpsilon;
575 time_info->state=StoppedTimerState;
597 static double UserTime(
void)
599 #if defined(MAGICKCORE_HAVE_TIMES) && defined(MAGICKCORE_HAVE_SYSCONF)
603 (void) times(&timer);
604 return((
double) (timer.tms_utime+timer.tms_stime)/sysconf(_SC_CLK_TCK));
606 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
607 return(NTUserTime());
609 return((
double) clock()/CLOCKS_PER_SEC);