aboutsummaryrefslogtreecommitdiff
path: root/libbb
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2020-12-11 16:48:47 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-12-11 16:48:47 +0100
commit030fe31760169783537162b83af89e551bf120f6 (patch)
tree92b219784b478405626b9259b82900ab3ca72a8e /libbb
parent56ee5765074b2f2389066f3234a4da21501d3eaa (diff)
downloadbusybox-w32-030fe31760169783537162b83af89e551bf120f6.tar.gz
busybox-w32-030fe31760169783537162b83af89e551bf120f6.tar.bz2
busybox-w32-030fe31760169783537162b83af89e551bf120f6.zip
libbb: make msleep() result in only one syscall instead of looping
function old new delta msleep 45 52 +7 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'libbb')
-rw-r--r--libbb/bb_do_delay.c18
-rw-r--r--libbb/platform.c1
2 files changed, 18 insertions, 1 deletions
diff --git a/libbb/bb_do_delay.c b/libbb/bb_do_delay.c
index 3dbf032db..9a84fa24b 100644
--- a/libbb/bb_do_delay.c
+++ b/libbb/bb_do_delay.c
@@ -36,6 +36,7 @@ void FAST_FUNC sleep1(void)
36 36
37void FAST_FUNC msleep(unsigned ms) 37void FAST_FUNC msleep(unsigned ms)
38{ 38{
39#if 0
39 /* 1. usleep(n) is not guaranteed by standards to accept n >= 1000000 40 /* 1. usleep(n) is not guaranteed by standards to accept n >= 1000000
40 * 2. multiplication in usleep(ms * 1000) can overflow if ms > 4294967 41 * 2. multiplication in usleep(ms * 1000) can overflow if ms > 4294967
41 * (sleep of ~71.5 minutes) 42 * (sleep of ~71.5 minutes)
@@ -46,4 +47,21 @@ void FAST_FUNC msleep(unsigned ms)
46 ms -= 500; 47 ms -= 500;
47 } 48 }
48 usleep(ms * 1000); 49 usleep(ms * 1000);
50#else
51//usleep is often implemented as a call to nanosleep.
52//Simply do the same to implement msleep.
53//it's marginally larger, but wakes your CPU less often:
54//function old new delta
55//msleep 45 52 +7
56 struct timespec ts;
57 ts.tv_sec = ms / 1000;
58 ts.tv_nsec = (ms % 1000) * 1000000;
59 /*
60 * If a signal has non-default handler, nanosleep returns early.
61 * Our version of msleep doesn't return early
62 * if interrupted by such signals:
63 */
64 while (nanosleep(&ts, &ts) != 0)
65 continue;
66#endif
49} 67}
diff --git a/libbb/platform.c b/libbb/platform.c
index d2b263a6d..329b0237e 100644
--- a/libbb/platform.c
+++ b/libbb/platform.c
@@ -27,7 +27,6 @@ int FAST_FUNC usleep(unsigned usec)
27 * If a signal has non-default handler, nanosleep returns early. 27 * If a signal has non-default handler, nanosleep returns early.
28 * Our version of usleep doesn't return early 28 * Our version of usleep doesn't return early
29 * if interrupted by such signals: 29 * if interrupted by such signals:
30 *
31 */ 30 */
32 while (nanosleep(&ts, &ts) != 0) 31 while (nanosleep(&ts, &ts) != 0)
33 continue; 32 continue;