43 #include "magick/studio.h"
44 #include "magick/exception.h"
45 #include "magick/exception-private.h"
46 #include "magick/locale_.h"
47 #include "magick/log.h"
48 #include "magick/memory_.h"
49 #include "magick/nt-base-private.h"
50 #include "magick/string-private.h"
51 #include "magick/timer.h"
52 #include "magick/timer-private.h"
57 #if !defined(CLOCKS_PER_SEC)
58 #define CLOCKS_PER_SEC 100
89 MagickExport
TimerInfo *AcquireTimerInfo(
void)
94 timer_info=(
TimerInfo *) AcquireMagickMemory(
sizeof(*timer_info));
96 ThrowFatalException(ResourceLimitFatalError,
"UnableToAcquireString");
97 (void) memset(timer_info,0,
sizeof(*timer_info));
98 timer_info->signature=MagickCoreSignature;
99 GetTimerInfo(timer_info);
126 MagickExport MagickBooleanType ContinueTimer(
TimerInfo *time_info)
129 assert(time_info->signature == MagickCoreSignature);
130 if (time_info->state == UndefinedTimerState)
132 if (time_info->state == StoppedTimerState)
134 time_info->user.total-=time_info->user.stop-time_info->user.start;
135 time_info->elapsed.total-=time_info->elapsed.stop-
136 time_info->elapsed.start;
138 time_info->state=RunningTimerState;
166 assert(timer_info != (
TimerInfo *) NULL);
167 assert(timer_info->signature == MagickCoreSignature);
168 timer_info->signature=(~MagickCoreSignature);
169 timer_info=(
TimerInfo *) RelinquishMagickMemory(timer_info);
192 static double ElapsedTime(
void)
194 #if defined(MAGICKCORE_HAVE_CLOCK_GETTIME)
195 #define NANOSECONDS_PER_SECOND 1000000000.0
196 #if defined(CLOCK_HIGHRES)
197 # define CLOCK_ID CLOCK_HIGHRES
198 #elif defined(CLOCK_MONOTONIC_RAW)
199 # define CLOCK_ID CLOCK_MONOTONIC_RAW
200 #elif defined(CLOCK_MONOTONIC_PRECISE)
201 # define CLOCK_ID CLOCK_MONOTONIC_PRECISE
202 #elif defined(CLOCK_MONOTONIC)
203 # define CLOCK_ID CLOCK_MONOTONIC
205 # define CLOCK_ID CLOCK_REALTIME
211 (void) clock_gettime(CLOCK_ID,&timer);
212 return((
double) timer.tv_sec+timer.tv_nsec/NANOSECONDS_PER_SECOND);
213 #elif defined(MAGICKCORE_HAVE_TIMES) && defined(MAGICKCORE_HAVE_SYSCONF)
217 return((
double) times(&timer)/sysconf(_SC_CLK_TCK));
219 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
220 return(NTElapsedTime());
222 return((
double) clock()/CLOCKS_PER_SEC);
256 MagickExport ssize_t FormatMagickTime(
const time_t time,
const size_t length,
265 assert(timestamp != (
char *) NULL);
266 GetMagickUTCtime(&time,&utc_time);
267 count=FormatLocaleString(timestamp,length,
268 "%04d-%02d-%02dT%02d:%02d:%02d%+03d:00",utc_time.tm_year+1900,
269 utc_time.tm_mon+1,utc_time.tm_mday,utc_time.tm_hour,utc_time.tm_min,
298 MagickExport
double GetElapsedTime(
TimerInfo *time_info)
301 assert(time_info->signature == MagickCoreSignature);
302 if (time_info->state == UndefinedTimerState)
304 if (time_info->state == RunningTimerState)
305 StopTimer(time_info);
306 return(time_info->elapsed.total);
327 MagickExport time_t GetMagickTime(
void)
330 constant_magick_time = 0;
332 static MagickBooleanType
333 epoch_initalized = MagickFalse;
335 if (epoch_initalized == MagickFalse)
340 source_date_epoch=getenv(
"SOURCE_DATE_EPOCH");
341 if (source_date_epoch != (
const char *) NULL)
346 epoch=(time_t) StringToDouble(source_date_epoch,(
char **) NULL);
347 if ((epoch > 0) && (epoch <= time((time_t *) NULL)))
348 constant_magick_time=epoch;
350 epoch_initalized=MagickTrue;
352 if (constant_magick_time != 0)
353 return(constant_magick_time);
354 return(time((time_t *) NULL));
379 MagickExport
void GetTimerInfo(
TimerInfo *time_info)
385 (void) memset(time_info,0,
sizeof(*time_info));
386 time_info->state=UndefinedTimerState;
387 time_info->signature=MagickCoreSignature;
388 StartTimer(time_info,MagickTrue);
415 MagickExport
double GetUserTime(
TimerInfo *time_info)
418 assert(time_info->signature == MagickCoreSignature);
419 if (time_info->state == UndefinedTimerState)
421 if (time_info->state == RunningTimerState)
422 StopTimer(time_info);
423 return(time_info->user.total);
448 MagickExport
void ResetTimer(
TimerInfo *time_info)
451 assert(time_info->signature == MagickCoreSignature);
452 StopTimer(time_info);
453 time_info->elapsed.stop=0.0;
454 time_info->user.stop=0.0;
483 MagickExport
void StartTimer(
TimerInfo *time_info,
const MagickBooleanType reset)
486 assert(time_info->signature == MagickCoreSignature);
487 if (reset != MagickFalse)
492 time_info->user.total=0.0;
493 time_info->elapsed.total=0.0;
495 if (time_info->state != RunningTimerState)
497 time_info->elapsed.start=ElapsedTime();
498 time_info->user.start=UserTime();
500 time_info->state=RunningTimerState;
525 static void StopTimer(
TimerInfo *time_info)
528 assert(time_info->signature == MagickCoreSignature);
529 time_info->elapsed.stop=ElapsedTime();
530 time_info->user.stop=UserTime();
531 if (time_info->state == RunningTimerState)
533 time_info->user.total+=time_info->user.stop-
534 time_info->user.start+MagickEpsilon;
535 time_info->elapsed.total+=time_info->elapsed.stop-
536 time_info->elapsed.start+MagickEpsilon;
538 time_info->state=StoppedTimerState;
560 static double UserTime(
void)
562 #if defined(MAGICKCORE_HAVE_TIMES) && defined(MAGICKCORE_HAVE_SYSCONF)
566 (void) times(&timer);
567 return((
double) (timer.tms_utime+timer.tms_stime)/sysconf(_SC_CLK_TCK));
569 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
570 return(NTUserTime());
572 return((
double) clock()/CLOCKS_PER_SEC);