Module: xenomai-3 Branch: stable-3.0.x Commit: cc4ecb09efd530248d11910db1626d83bbb143b8 URL: http://git.xenomai.org/?p=xenomai-3.git;a=commit;h=cc4ecb09efd530248d11910db1626d83bbb143b8
Author: Philippe Gerum <r...@xenomai.org> Date: Tue May 16 11:12:57 2017 +0200 lib/copperplate: prevent unwanted mode switch during thread prologue copperplate_renice_local_thread() causes a switch to secondary mode for an emerging thread context, we want it to happen before such thread handshakes with its parent, so that the later is released only after the child is waiting in primary mode on the start barrier. e.g. tA(prio=10) creates tB(prio=5), tC(prio=7), then starts them in that order. The proper scheduling sequence must be: tA -> tC -> tB. See http://xenomai.org/pipermail/xenomai/2017-May/037311.html for more details. --- lib/copperplate/internal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/copperplate/internal.c b/lib/copperplate/internal.c index 2549ab0..1d96526 100644 --- a/lib/copperplate/internal.c +++ b/lib/copperplate/internal.c @@ -239,14 +239,14 @@ static void *thread_trampoline(void *arg) * with the cleanup code the client may run whenever * copperplate_create_thread() fails. */ - prepare_wait_corespec(); - __RT(sem_post(&cta->__reserved.warm)); - thread_spawn_wait(&released); - __RT(sem_destroy(&released)); ret = __bt(copperplate_renice_local_thread(pthread_self(), _cta.policy, &_cta.param_ex)); if (ret) warning("cannot renice core thread, %s", symerror(ret)); + prepare_wait_corespec(); + __RT(sem_post(&cta->__reserved.warm)); + thread_spawn_wait(&released); + __RT(sem_destroy(&released)); return _cta.run(_cta.arg); fail: _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org https://xenomai.org/mailman/listinfo/xenomai-git