|
|
@ -891,9 +891,40 @@ void cgtimer_sub(cgtimer_t *a, cgtimer_t *b, cgtimer_t *res) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Subtract b from a */ |
|
|
|
|
|
|
|
static void __maybe_unused timersubspec(struct timespec *a, const struct timespec *b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
a->tv_sec -= b->tv_sec; |
|
|
|
|
|
|
|
a->tv_nsec -= b->tv_nsec; |
|
|
|
|
|
|
|
if (a->tv_nsec < 0) { |
|
|
|
|
|
|
|
a->tv_nsec += 1000000000; |
|
|
|
|
|
|
|
a->tv_sec--; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void __maybe_unused cgsleep_spec(struct timespec *ts_diff, const struct timespec *ts_start) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct timespec now; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
timeraddspec(ts_diff, ts_start); |
|
|
|
|
|
|
|
cgtimer_time(&now); |
|
|
|
|
|
|
|
timersubspec(ts_diff, &now); |
|
|
|
|
|
|
|
if (unlikely(ts_diff->tv_sec < 0)) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
nanosleep(ts_diff, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* These are cgminer specific sleep functions that use an absolute nanosecond
|
|
|
|
/* These are cgminer specific sleep functions that use an absolute nanosecond
|
|
|
|
* resolution timer to avoid poor usleep accuracy and overruns. */ |
|
|
|
* resolution timer to avoid poor usleep accuracy and overruns. */ |
|
|
|
#ifndef WIN32 |
|
|
|
#ifndef WIN32 |
|
|
|
|
|
|
|
/* This is a cgminer gettimeofday wrapper. Since we always call gettimeofday
|
|
|
|
|
|
|
|
* with tz set to NULL, and windows' default resolution is only 15ms, this |
|
|
|
|
|
|
|
* gives us higher resolution times on windows. */ |
|
|
|
|
|
|
|
void cgtime(struct timeval *tv) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
gettimeofday(tv, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void cgtimer_time(cgtimer_t *ts_start) |
|
|
|
void cgtimer_time(cgtimer_t *ts_start) |
|
|
|
{ |
|
|
|
{ |
|
|
|
clock_gettime(CLOCK_MONOTONIC, ts_start); |
|
|
|
clock_gettime(CLOCK_MONOTONIC, ts_start); |
|
|
@ -933,14 +964,6 @@ int cgtimer_to_ms(cgtimer_t *cgt) |
|
|
|
{ |
|
|
|
{ |
|
|
|
return timespec_to_ms(cgt); |
|
|
|
return timespec_to_ms(cgt); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* This is a cgminer gettimeofday wrapper. Since we always call gettimeofday
|
|
|
|
|
|
|
|
* with tz set to NULL, and windows' default resolution is only 15ms, this |
|
|
|
|
|
|
|
* gives us higher resolution times on windows. */ |
|
|
|
|
|
|
|
void cgtime(struct timeval *tv) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
gettimeofday(tv, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
/* Windows start time is since 1601 lol so convert it to unix epoch 1970. */ |
|
|
|
/* Windows start time is since 1601 lol so convert it to unix epoch 1970. */ |
|
|
|
#define EPOCHFILETIME (116444736000000000LL) |
|
|
|
#define EPOCHFILETIME (116444736000000000LL) |
|
|
@ -978,29 +1001,6 @@ void cgtimer_time(cgtimer_t *ts_start) |
|
|
|
ts_start->tv_nsec = lidiv.quot * 100; |
|
|
|
ts_start->tv_nsec = lidiv.quot * 100; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Subtract b from a */ |
|
|
|
|
|
|
|
static void timersubspec(struct timespec *a, const struct timespec *b) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
a->tv_sec -= b->tv_sec; |
|
|
|
|
|
|
|
a->tv_nsec -= b->tv_nsec; |
|
|
|
|
|
|
|
if (a->tv_nsec < 0) { |
|
|
|
|
|
|
|
a->tv_nsec += 1000000000; |
|
|
|
|
|
|
|
a->tv_sec--; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void cgsleep_spec(struct timespec *ts_diff, const struct timespec *ts_start) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
struct timespec now; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
timeraddspec(ts_diff, ts_start); |
|
|
|
|
|
|
|
cgtimer_time(&now); |
|
|
|
|
|
|
|
timersubspec(ts_diff, &now); |
|
|
|
|
|
|
|
if (unlikely(ts_diff->tv_sec < 0)) |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
nanosleep(ts_diff, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void cgsleep_ms_r(cgtimer_t *ts_start, int ms) |
|
|
|
void cgsleep_ms_r(cgtimer_t *ts_start, int ms) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct timespec ts_diff; |
|
|
|
struct timespec ts_diff; |
|
|
|