xref: /dpdk/lib/eal/unix/eal_unix_timer.c (revision 72b452c5f2599f970f47fd17d3e8e5d60bfebe7a)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2020 Mellanox Technologies, Ltd
3  */
4 
5 #include <errno.h>
6 #include <time.h>
7 
8 #include <rte_cycles.h>
9 
10 void
rte_delay_us_sleep(unsigned int us)11 rte_delay_us_sleep(unsigned int us)
12 {
13 	struct timespec wait[2];
14 	int ind = 0;
15 
16 	wait[0].tv_sec = 0;
17 	if (us >= US_PER_S) {
18 		wait[0].tv_sec = us / US_PER_S;
19 		us -= wait[0].tv_sec * US_PER_S;
20 	}
21 	wait[0].tv_nsec = 1000 * us;
22 
23 	while (nanosleep(&wait[ind], &wait[1 - ind]) && errno == EINTR) {
24 		/*
25 		 * Sleep was interrupted. Flip the index, so the 'remainder'
26 		 * will become the 'request' for a next call.
27 		 */
28 		ind = 1 - ind;
29 	}
30 }
31