diff options
Diffstat (limited to 'lib/librte_eal/common/eal_common_timer.c')
-rw-r--r-- | lib/librte_eal/common/eal_common_timer.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/librte_eal/common/eal_common_timer.c b/lib/librte_eal/common/eal_common_timer.c index 2e2b770f..dcf26bfe 100644 --- a/lib/librte_eal/common/eal_common_timer.c +++ b/lib/librte_eal/common/eal_common_timer.c @@ -7,9 +7,11 @@ #include <unistd.h> #include <inttypes.h> #include <sys/types.h> +#include <time.h> #include <errno.h> #include <rte_common.h> +#include <rte_compat.h> #include <rte_log.h> #include <rte_cycles.h> #include <rte_pause.h> @@ -31,6 +33,28 @@ rte_delay_us_block(unsigned int us) rte_pause(); } +void __rte_experimental +rte_delay_us_sleep(unsigned int us) +{ + struct timespec wait[2]; + int ind = 0; + + wait[0].tv_sec = 0; + if (us >= US_PER_S) { + wait[0].tv_sec = us / US_PER_S; + us -= wait[0].tv_sec * US_PER_S; + } + wait[0].tv_nsec = 1000 * us; + + while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) { + /* + * Sleep was interrupted. Flip the index, so the 'remainder' + * will become the 'request' for a next call. + */ + ind = 1 - ind; + } +} + uint64_t rte_get_tsc_hz(void) { |