This commit introduces xnanosleep() for the threads needing high resolution sleep timeouts.
usleep() that provides microsecond granularity is deprecated and all threads that needs ms,us,ns granularity can use this implementation. CC: Ben Pfaff <[email protected]> Signed-off-by: Bhanuprakash Bodireddy <[email protected]> --- lib/timeval.c | 19 +++++++++++++++++++ lib/timeval.h | 1 + lib/util.c | 19 +++++++++++++++++++ lib/util.h | 1 + 4 files changed, 40 insertions(+) diff --git a/lib/timeval.c b/lib/timeval.c index 8875fed..93eeb72 100644 --- a/lib/timeval.c +++ b/lib/timeval.c @@ -517,6 +517,25 @@ msec_to_timespec(long long int ms, struct timespec *ts) ts->tv_nsec = (ms % 1000) * NSEC_PER_MSEC; } +void +nsec_to_timespec(long long int nsec, struct timespec *ts) +{ + if (!nsec) { + ts->tv_sec = ts->tv_nsec = 0; + return; + } + ts->tv_sec = nsec / NSEC_PER_SEC; + + nsec = nsec % NSEC_PER_SEC; + /* This is to handle dates before epoch. */ + if (OVS_UNLIKELY(nsec < 0)) { + nsec += NSEC_PER_SEC; + ts->tv_sec--; + } + + ts->tv_nsec = nsec; +} + static void timewarp_work(void) { diff --git a/lib/timeval.h b/lib/timeval.h index 5e2a731..095c334 100644 --- a/lib/timeval.h +++ b/lib/timeval.h @@ -80,6 +80,7 @@ size_t strftime_msec(char *s, size_t max, const char *format, const struct tm_msec *); void xgettimeofday(struct timeval *); void xclock_gettime(clock_t, struct timespec *); +void nsec_to_timespec(long long int , struct timespec *); int get_cpu_usage(void); diff --git a/lib/util.c b/lib/util.c index a26cd51..a29e288 100644 --- a/lib/util.c +++ b/lib/util.c @@ -2202,6 +2202,25 @@ xsleep(unsigned int seconds) ovsrcu_quiesce_end(); } +/* High resolution sleep. */ +void +xnanosleep(uint64_t nanoseconds) +{ + ovsrcu_quiesce_start(); +#ifndef _WIN32 + int retval; + struct timespec ts_sleep; + nsec_to_timespec(nanoseconds, &ts_sleep); + + int error = 0; + do { + retval = nanosleep(&ts_sleep, NULL); + error = retval < 0 ? errno : 0; + } while (error == EINTR); +#endif + ovsrcu_quiesce_end(); +} + /* Determine whether standard output is a tty or not. This is useful to decide * whether to use color output or not when --color option for utilities is set * to `auto`. diff --git a/lib/util.h b/lib/util.h index 3c43c2c..d355313 100644 --- a/lib/util.h +++ b/lib/util.h @@ -502,6 +502,7 @@ ovs_u128_and(const ovs_u128 a, const ovs_u128 b) } void xsleep(unsigned int seconds); +void xnanosleep(uint64_t nanoseconds); bool is_stdout_a_tty(void); -- 2.4.11 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
