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
91MagickExport
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);
128MagickExport 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);
194static 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);
258MagickExport 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,
300MagickExport
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);
329MagickExport time_t GetMagickTime(
void)
332 magick_epoch = (time_t) 0;
334 static MagickBooleanType
335 epoch_initialized = MagickFalse;
337 if (epoch_initialized == MagickFalse)
342 source_date_epoch=getenv(
"SOURCE_DATE_EPOCH");
343 if (source_date_epoch != (
const char *) NULL)
348 epoch=(time_t) StringToMagickOffsetType(source_date_epoch,100.0);
349 if ((epoch > 0) && (epoch <= time((time_t *) NULL)))
352 epoch_initialized=MagickTrue;
354 if (magick_epoch != 0)
355 return(magick_epoch);
356 return(time((time_t *) NULL));
381MagickExport
void GetTimerInfo(
TimerInfo *time_info)
387 (void) memset(time_info,0,
sizeof(*time_info));
388 time_info->state=UndefinedTimerState;
389 time_info->signature=MagickCoreSignature;
390 StartTimer(time_info,MagickTrue);
417MagickExport
double GetUserTime(
TimerInfo *time_info)
420 assert(time_info->signature == MagickCoreSignature);
421 if (time_info->state == UndefinedTimerState)
423 if (time_info->state == RunningTimerState)
424 StopTimer(time_info);
425 return(time_info->user.total);
450MagickExport
void ResetTimer(
TimerInfo *time_info)
453 assert(time_info->signature == MagickCoreSignature);
454 StopTimer(time_info);
455 time_info->elapsed.stop=0.0;
456 time_info->user.stop=0.0;
485MagickExport
void StartTimer(
TimerInfo *time_info,
const MagickBooleanType reset)
488 assert(time_info->signature == MagickCoreSignature);
489 if (reset != MagickFalse)
494 time_info->user.total=0.0;
495 time_info->elapsed.total=0.0;
497 if (time_info->state != RunningTimerState)
499 time_info->elapsed.start=ElapsedTime();
500 time_info->user.start=UserTime();
502 time_info->state=RunningTimerState;
527static void StopTimer(
TimerInfo *time_info)
530 assert(time_info->signature == MagickCoreSignature);
531 time_info->elapsed.stop=ElapsedTime();
532 time_info->user.stop=UserTime();
533 if (time_info->state == RunningTimerState)
535 time_info->user.total+=time_info->user.stop-
536 time_info->user.start+MagickEpsilon;
537 time_info->elapsed.total+=time_info->elapsed.stop-
538 time_info->elapsed.start+MagickEpsilon;
540 time_info->state=StoppedTimerState;
562static double UserTime(
void)
564#if defined(MAGICKCORE_HAVE_TIMES) && defined(MAGICKCORE_HAVE_SYSCONF)
568 (void) times(&timer);
569 return((
double) (timer.tms_utime+timer.tms_stime)/sysconf(_SC_CLK_TCK));
571#if defined(MAGICKCORE_WINDOWS_SUPPORT)
572 return(NTUserTime());
574 return((
double) clock()/CLOCKS_PER_SEC);