Module: xenomai-forge
Branch: next
Commit: 545d134bc17443651e3c94c673eb4444a1f471cf

Author: Philippe Gerum <>
Date:   Sat Aug 31 11:04:44 2013 +0200

lib/cobalt: make relaxed threads [sched_]yield() to the regular kernel

Calling sched_yield() from a relaxed context should yield control to
the regular kernel. There is no point in switching back to primary
mode for running Xenomai's yield service, which is most likely to
force a migration through the secondary mode yet again.

When the user code runs a tight loop yielding the CPU continuously
over a non-rt thread (i.e. WEAK scheduling), the overhead is
significantly lower.


 lib/cobalt/thread.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/lib/cobalt/thread.c b/lib/cobalt/thread.c
index 15a665d..4022fe7 100644
--- a/lib/cobalt/thread.c
+++ b/lib/cobalt/thread.c
@@ -161,13 +161,21 @@ int pthread_getschedparam_ex(pthread_t thread,
 COBALT_IMPL(int, sched_yield, (void))
+       unsigned long status;
        int ret;
+       status = cobalt_get_current_mode();
+       if (status & XNRELAX)
+               goto libc_yield;
        ret = -XENOMAI_SKINCALL0(__cobalt_muxid, sc_cobalt_sched_yield);
        if (ret == EPERM)
-               ret = __STD(sched_yield());
+               goto libc_yield;
        return ret;
+       return __STD(sched_yield());
 COBALT_IMPL(int, sched_get_priority_min, (int policy))

Xenomai-git mailing list

Reply via email to