diff --git a/miner.h b/miner.h index c2a0bd53..c368480b 100644 --- a/miner.h +++ b/miner.h @@ -426,7 +426,7 @@ struct thr_info { extern int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (void *), void *arg); extern void thr_info_cancel(struct thr_info *thr); extern void thr_info_freeze(struct thr_info *thr); - +extern void nmsleep(unsigned int msecs); struct string_elist { char *string; diff --git a/util.c b/util.c index b17eceae..01cbb20b 100644 --- a/util.c +++ b/util.c @@ -687,3 +687,14 @@ void thr_info_cancel(struct thr_info *thr) PTH(thr) = 0L; } } + +/* Provide a ms based sleep that uses nanosleep to avoid poor usleep accuracy + * on SMP machines */ +void nmsleep(unsigned int msecs) +{ + struct timespec twait; + + twait.tv_sec = msecs / 1000; + twait.tv_nsec = (uint64_t)(msecs * 1000000) - (uint64_t)(twait.tv_sec / 1000000000); + nanosleep(&twait, NULL); +}