summaryrefslogtreecommitdiffstats
path: root/src/libnetdata/os/sleep.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-11-25 17:33:56 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-11-25 17:34:10 +0000
commit83ba6762cc43d9db581b979bb5e3445669e46cc2 (patch)
tree2e69833b43f791ed253a7a20318b767ebe56cdb8 /src/libnetdata/os/sleep.c
parentReleasing debian version 1.47.5-1. (diff)
downloadnetdata-83ba6762cc43d9db581b979bb5e3445669e46cc2.tar.xz
netdata-83ba6762cc43d9db581b979bb5e3445669e46cc2.zip
Merging upstream version 2.0.3+dfsg (Closes: #923993, #1042533, #1045145).
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/libnetdata/os/sleep.c')
-rw-r--r--src/libnetdata/os/sleep.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/libnetdata/os/sleep.c b/src/libnetdata/os/sleep.c
new file mode 100644
index 000000000..131b47c44
--- /dev/null
+++ b/src/libnetdata/os/sleep.c
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "../libnetdata.h"
+
+#ifdef OS_WINDOWS
+void tinysleep(void) {
+ Sleep(1);
+}
+#else
+void tinysleep(void) {
+ static const struct timespec ns = { .tv_sec = 0, .tv_nsec = 1 };
+ nanosleep(&ns, NULL);
+}
+#endif
+
+#ifdef OS_WINDOWS
+void microsleep(usec_t ut) {
+ size_t ms = ut / USEC_PER_MS + ((ut == 0 || (ut % USEC_PER_MS)) ? 1 : 0);
+ Sleep(ms);
+}
+#else
+void microsleep(usec_t ut) {
+ time_t secs = (time_t)(ut / USEC_PER_SEC);
+ nsec_t nsec = (ut % USEC_PER_SEC) * NSEC_PER_USEC + ((ut == 0) ? 1 : 0);
+
+ struct timespec remaining = {
+ .tv_sec = secs,
+ .tv_nsec = nsec,
+ };
+
+ errno_clear();
+ while (nanosleep(&remaining, &remaining) == -1 && errno == EINTR && (remaining.tv_sec || remaining.tv_nsec)) {
+ // Loop continues if interrupted by a signal
+ }
+}
+#endif