22#define StartOfTimes (*(LOCAL_ThreadHandle.start_of_timesp))
23#define last_time (*(LOCAL_ThreadHandle.last_timep))
25#define StartOfTimes_sys (*(LOCAL_ThreadHandle.start_of_times_sysp))
26#define last_time_sys (*(LOCAL_ThreadHandle.last_time_sysp))
30static struct timeval StartOfTimes;
33static struct timeval last_time;
36static struct timeval last_time_sys;
37static struct timeval StartOfTimes_sys;
41void Yap_InitTime(
int wid) {
45 REMOTE_ThreadHandle(wid).start_of_timesp =
46 (
struct timeval *)malloc(
sizeof(
struct timeval));
47 REMOTE_ThreadHandle(wid).last_timep =
48 (
struct timeval *)malloc(
sizeof(
struct timeval));
49 REMOTE_ThreadHandle(wid).start_of_times_sysp =
50 (
struct timeval *)malloc(
sizeof(
struct timeval));
51 REMOTE_ThreadHandle(wid).last_time_sysp =
52 (
struct timeval *)malloc(
sizeof(
struct timeval));
53 getrusage(RUSAGE_SELF, &rusage);
54 (*REMOTE_ThreadHandle(wid).last_timep).tv_sec =
55 (*REMOTE_ThreadHandle(wid).start_of_timesp).tv_sec =
56 rusage.ru_utime.tv_sec;
57 (*REMOTE_ThreadHandle(wid).last_timep).tv_usec =
58 (*REMOTE_ThreadHandle(wid).start_of_timesp).tv_usec =
59 rusage.ru_utime.tv_usec;
60 (*REMOTE_ThreadHandle(wid).last_time_sysp).tv_sec =
61 (*REMOTE_ThreadHandle(wid).start_of_times_sysp).tv_sec =
62 rusage.ru_stime.tv_sec;
63 (*REMOTE_ThreadHandle(wid).last_time_sysp).tv_usec =
64 (*REMOTE_ThreadHandle(wid).start_of_times_sysp).tv_usec =
65 rusage.ru_stime.tv_usec;
67 getrusage(RUSAGE_SELF, &rusage);
68 last_time.tv_sec = StartOfTimes.tv_sec = rusage.ru_utime.tv_sec;
69 last_time.tv_usec = StartOfTimes.tv_usec = rusage.ru_utime.tv_usec;
70 last_time_sys.tv_sec = StartOfTimes_sys.tv_sec = rusage.ru_stime.tv_sec;
71 last_time_sys.tv_usec = StartOfTimes_sys.tv_usec = rusage.ru_stime.tv_usec;
75UInt Yap_cputime(
void) {
79 getrusage(RUSAGE_SELF, &rusage);
80 return ((rusage.ru_utime.tv_sec - StartOfTimes.tv_sec)) * 1000 +
81 ((rusage.ru_utime.tv_usec - StartOfTimes.tv_usec) / 1000);
84void Yap_cputime_interval(Int *now, Int *interval) {
88 getrusage(RUSAGE_SELF, &rusage);
89 *now = (rusage.ru_utime.tv_sec - StartOfTimes.tv_sec) * 1000 +
90 (rusage.ru_utime.tv_usec - StartOfTimes.tv_usec) / 1000;
91 *interval = (rusage.ru_utime.tv_sec - last_time.tv_sec) * 1000 +
92 (rusage.ru_utime.tv_usec - last_time.tv_usec) / 1000;
93 last_time.tv_usec = rusage.ru_utime.tv_usec;
94 last_time.tv_sec = rusage.ru_utime.tv_sec;
97void Yap_systime_interval(Int *now, Int *interval) {
101 getrusage(RUSAGE_SELF, &rusage);
102 *now = (rusage.ru_stime.tv_sec - StartOfTimes_sys.tv_sec) * 1000 +
103 (rusage.ru_stime.tv_usec - StartOfTimes_sys.tv_usec) / 1000;
104 *interval = (rusage.ru_stime.tv_sec - last_time_sys.tv_sec) * 1000 +
105 (rusage.ru_stime.tv_usec - last_time_sys.tv_usec) / 1000;
106 last_time_sys.tv_usec = rusage.ru_stime.tv_usec;
107 last_time_sys.tv_sec = rusage.ru_stime.tv_sec;
117#define do_div(n, base) \
119 unsigned long __upper, __low, __high, __mod; \
120 asm("" : "=a"(__low), "=d"(__high) : "A"(n)); \
123 __upper = __high % (base); \
124 __high = __high / (base); \
127 : "=a"(__low), "=d"(__mod) \
128 : "rm"(base), "0"(__low), "1"(__upper)); \
129 asm("" : "=A"(n) : "a"(__low), "d"(__high)); \
143static win64_time_t StartOfTimes, last_time;
145static win64_time_t StartOfTimes_sys, last_time_sys;
147static clock_t TimesStartOfTimes, Times_last_time;
150void Yap_InitTime(
int wid) {
151 HANDLE hProcess = GetCurrentProcess();
152 win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
153 if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
158 Times_last_time = TimesStartOfTimes = t;
161 REMOTE_ThreadHandle(wid).start_of_timesp =
162 (
struct _win64_time_t *)malloc(
sizeof(win64_time_t));
163 REMOTE_ThreadHandle(wid).last_timep =
164 (
struct _win64_time_t *)malloc(
sizeof(win64_time_t));
165 REMOTE_ThreadHandle(wid).start_of_times_sysp =
166 (
struct _win64_time_t *)malloc(
sizeof(win64_time_t));
167 REMOTE_ThreadHandle(wid).last_time_sysp =
168 (
struct _win64_time_t *)malloc(
sizeof(win64_time_t));
169 (*REMOTE_ThreadHandle(wid).last_timep).f.dwLowDateTime =
170 UserTime.dwLowDateTime;
171 (*REMOTE_ThreadHandle(wid).last_timep).dwHighDateTime =
172 UserTime.dwHighDateTime;
173 (*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwLowDateTime =
174 UserTime.dwLowDateTime;
175 (*REMOTE_ThreadHandle(wid).start_of_timesp).f.dwHighDateTime =
176 UserTime.dwHighDateTime;
177 (*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwLowDateTime =
178 KernelTime.dwLowDateTime;
179 (*REMOTE_ThreadHandle(wid).last_time_sysp).f.dwHighDateTime =
180 KernelTime.dwHighDateTime;
181 (*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwLowDateTime =
182 KernelTime.dwLowDateTime;
183 (*REMOTE_ThreadHandle(wid).start_of_times_sysp).f.dwHighDateTime =
184 KernelTime.dwHighDateTime;
186 last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
187 last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
188 StartOfTimes.f.dwLowDateTime = UserTime.f.dwLowDateTime;
189 StartOfTimes.f.dwHighDateTime = UserTime.f.dwHighDateTime;
190 last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
191 last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
192 StartOfTimes_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
193 StartOfTimes_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
198UInt Yap_cputime(
void) {
199 HANDLE hProcess = GetCurrentProcess();
200 win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
201 if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
205 return (((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC);
207 __int64 t = UserTime.t - StartOfTimes.t;
208 return ((Int)(t / 10000));
212void Yap_cputime_interval(Int *now, Int *interval) {
213 HANDLE hProcess = GetCurrentProcess();
214 win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
215 if (!GetProcessTimes(hProcess, &CreationTime.f, & ExitTime.f, &KernelTime.f,
219 *now = ((t - TimesStartOfTimes) * 1000) / CLOCKS_PER_SEC;
220 *interval = (t - Times_last_time) * 1000 / CLOCKS_PER_SEC;
223 __int64 t1 = UserTime.t - StartOfTimes.t;
224 __int64 t2 = UserTime.t - last_time.t;
225 *now = (Int)(t1 / 10000);
226 *interval = (Int)(t2 / 10000);
227 last_time.f.dwLowDateTime = UserTime.f.dwLowDateTime;
228 last_time.f.dwHighDateTime = UserTime.f.dwHighDateTime;
232void Yap_systime_interval(Int *now, Int *interval) {
233 HANDLE hProcess = GetCurrentProcess();
234 win64_time_t CreationTime, ExitTime, KernelTime, UserTime;
235 if (!GetProcessTimes(hProcess, &CreationTime.f, &ExitTime.f, &KernelTime.f,
237 *now = *interval = 0;
239 __int64 t1 = KernelTime.t - StartOfTimes_sys.t;
240 __int64 t2 = KernelTime.t - last_time_sys.t;
241 *now = (Int)(t1 / 10000);
242 *interval = (Int)(t2 / 10000);
243 last_time_sys.f.dwLowDateTime = KernelTime.f.dwLowDateTime;
244 last_time_sys.f.dwHighDateTime = KernelTime.f.dwHighDateTime;
254#define TicksPerSec CLOCKS_PER_SEC
259#include <sys/times.h>
264#if defined(__sun__) && (defined(__svr4__) || defined(__SVR4))
270#define TicksPerSec CLK_TCK
273#if defined(__alpha) || defined(__FreeBSD__) || defined(__linux__) || \
274 defined(__DragonFly__)
280#define TicksPerSec sysconf(_SC_CLK_TCK)
286#include <sys/times.h>
290static clock_t StartOfTimes, last_time;
292static clock_t StartOfTimes_sys, last_time_sys;
295static void InitTime(
void) {
298 (*REMOTE_ThreadHandle(wid).last_timep) = StartOfTimes = t.tms_utime;
299 last_time_sys = StartOfTimes_sys = t.tms_stime;
302UInt Yap_cputime(
void) {
305 return ((t.tms_utime - StartOfTimes) * 1000 / TicksPerSec);
308void Yap_cputime_interval(Int *now, Int *interval) {
311 *now = ((t.tms_utime - StartOfTimes) * 1000) / TicksPerSec;
312 *interval = (t.tms_utime - last_time) * 1000 / TicksPerSec;
313 last_time = t.tms_utime;
316void Yap_systime_interval(Int *now, Int *interval) {
319 *now = ((t.tms_stime - StartOfTimes_sys) * 1000) / TicksPerSec;
320 *interval = (t.tms_stime - last_time_sys) * 1000 / TicksPerSec;
321 last_time_sys = t.tms_stime;
331static struct timeval StartOfTimes;
334static struct timeval last_time;
337static void InitTime(
int wid) {
340 gettimeofday(&tp, NULL);
341 (*REMOTE_ThreadHandle(wid).last_timep).f.tv_sec =
342 (*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_sec = tp.tv_sec;
343 (*REMOTE_ThreadHandle(wid).last_timep).f.tv_usec =
344 (*REMOTE_ThreadHandle.start_of_timesp(wid)).tv_usec = tp.tv_usec;
347UInt Yap_cputime(
void) {
350 gettimeofday(&tp, NULL);
351 if (StartOfTimes.tv_usec > tp.tv_usec)
352 return ((tp.tv_sec - StartOfTimes.tv_sec - 1) * 1000 +
353 (StartOfTimes.tv_usec - tp.tv_usec) / 1000);
355 return ((tp.tv_sec - StartOfTimes.tv_sec)) * 1000 +
356 ((tp.tv_usec - StartOfTimes.tv_usec) / 1000);
359void Yap_cputime_interval(Int *now, Int *interval) {
362 gettimeofday(&tp, NULL);
363 *now = (tp.tv_sec - StartOfTimes.tv_sec) * 1000 +
364 (tp.tv_usec - StartOfTimes.tv_usec) / 1000;
365 *interval = (tp.tv_sec - last_time.tv_sec) * 1000 +
366 (tp.tv_usec - last_time.tv_usec) / 1000;
367 last_time.tv_usec = tp.tv_usec;
368 last_time.tv_sec = tp.tv_sec;
371void Yap_systime_interval(Int *now, Int *interval) {
372 *now = *interval = 0;
384#define TicksPerSec 60.0
386static double real_cputime() {
return (((
double)TickCount()) / TicksPerSec); }
396gettime() { *ptime = *(
long *)0x462; }
398static double real_cputime() {
402 return (((
double)thetime) / (Getrez() == 2 ? 70 : 60));
414static long readtime() {
return (*((
long *)0x4ba)); }
416static double real_cputime() {
419 time = Supexec(readtime);
420 return (time / 200.0);
432#define TicksPerSec 60.0
434static double real_cputime() {
return (((
double)TickCount()) / TicksPerSec); }
442uint64_t Yap_StartOfWTimes;
452void Yap_InitWTime(
void) { Yap_StartOfWTimes = (uint64_t)gethrtime(); }
455uint64_t Yap_walltime(uint64_t old) {
456 hrtime_t tp = gethrtime();
461#elif HAVE_GETTIMEOFDAY
465void Yap_InitWTime(
void) {
468 gettimeofday(&tp, NULL);
470 (uint64_t)tp.tv_sec * 1000000000 + (uint64_t)tp.tv_usec * 1000;
474uint64_t Yap_walltime(
void) {
477 gettimeofday(&tp, NULL);
478 return (uint64_t)tp.tv_sec * 1000000000 + (uint64_t)tp.tv_usec * 1000;
483#include <sys/timeb.h>
487static LARGE_INTEGER Frequency;
490void Yap_InitWTime(
void) {
491 LARGE_INTEGER ElapsedNanoseconds;
492 QueryPerformanceFrequency(&Frequency);
493 QueryPerformanceCounter(&ElapsedNanoseconds);
494 ElapsedNanoseconds.QuadPart *= 1000000;
495 ElapsedNanoseconds.QuadPart /= Frequency.QuadPart;
496 Yap_StartOfWTimes = (uint64_t)ElapsedNanoseconds.QuadPart;
499uint64_t Yap_walltime(
void) {
500 LARGE_INTEGER ElapsedNanoseconds;
501 QueryPerformanceCounter(&ElapsedNanoseconds);
510 ElapsedNanoseconds.QuadPart *= 1000000;
511 ElapsedNanoseconds.QuadPart /= Frequency.QuadPart;
512 return ElapsedNanoseconds.QuadPart;
518void Yap_InitWTime(
void) {
520 REMOTE_LastWTime(0) = Yap_StartOfWTimes =
521 ((uint64_t)times(NULL)) * 10000000 / TicksPerSec;
524uint64_t Yap_walltime(
void) {
527 return = ((uint64_t)times(NULL)) * 10000000 / TicksPerSec;
531void Yap_ReInitWTime(
void) { Yap_InitWTime(); }
533void Yap_InitTimePreds(
void) {