summaryrefslogtreecommitdiff
path: root/ucoolib
diff options
context:
space:
mode:
authorNicolas Schodet2013-03-02 02:11:48 +0100
committerNicolas Schodet2019-10-07 00:01:14 +0200
commitb6c88d52a54e5d66aa714b8b34d41e49a3a34c8c (patch)
tree58f4d69600add55dfc696c3201bb8fa98a06b6cc /ucoolib
parenteb152b89fa04af0b90afeb8e09623741c74ee3b7 (diff)
ucoolib/arch: add yield to save CPU cycles on host
Diffstat (limited to 'ucoolib')
-rw-r--r--ucoolib/arch/arch.host.cc13
-rw-r--r--ucoolib/arch/arch_common.arm.hh6
-rw-r--r--ucoolib/arch/arch_common.hh8
3 files changed, 27 insertions, 0 deletions
diff --git a/ucoolib/arch/arch.host.cc b/ucoolib/arch/arch.host.cc
index 1e24254..ed8c503 100644
--- a/ucoolib/arch/arch.host.cc
+++ b/ucoolib/arch/arch.host.cc
@@ -26,6 +26,8 @@
#include <cstdlib>
#include <cstdio>
+#include <time.h>
+#include <errno.h>
namespace ucoo {
@@ -60,4 +62,15 @@ halt_perror ()
abort ();
}
+void
+yield ()
+{
+ // Do a small delay.
+ struct timespec ts;
+ ts.tv_sec = 0;
+ ts.tv_nsec = 100 * 1000 * 1000;
+ while (nanosleep (&ts, &ts) == -1 && errno == EINTR)
+ ;
+}
+
} // namespace ucoo
diff --git a/ucoolib/arch/arch_common.arm.hh b/ucoolib/arch/arch_common.arm.hh
index 4cfeebe..6fff9a9 100644
--- a/ucoolib/arch/arch_common.arm.hh
+++ b/ucoolib/arch/arch_common.arm.hh
@@ -48,6 +48,12 @@ irq_restore (irq_flags_t flags)
: "memory", "cc");
}
+inline void
+yield ()
+{
+ // Nothing, the CPU is ours!
+}
+
} // namespace ucoo
#endif // ucoolib_arch_arch_common_arm_hh
diff --git a/ucoolib/arch/arch_common.hh b/ucoolib/arch/arch_common.hh
index 2b5b71c..3a3b89a 100644
--- a/ucoolib/arch/arch_common.hh
+++ b/ucoolib/arch/arch_common.hh
@@ -32,4 +32,12 @@
# error "not implemented for this target"
#endif
+namespace ucoo {
+
+/// Give some time to other tasks when running in a tight loop.
+void
+yield ();
+
+} // namespace ucoo
+
#endif // ucoolib_arch_arch_common_hh