Module: xenomai-2.6 Branch: master Commit: 197f13700388a148e433c076a388b651e37fda99 URL: http://git.xenomai.org/?p=xenomai-2.6.git;a=commit;h=197f13700388a148e433c076a388b651e37fda99
Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org> Date: Sat May 11 19:41:31 2013 +0200 skins/posix: rework user-space thread signals Calling xnshadow_relax() from xnpod_schedule() signals dispatcher causes issues with the I-pipe patch. Rely on xnshadow_call_mayday() to cause a switch to secondary mode instead. --- ksrc/skins/posix/signal.c | 32 +++++++++----------------------- 1 files changed, 9 insertions(+), 23 deletions(-) diff --git a/ksrc/skins/posix/signal.c b/ksrc/skins/posix/signal.c index dfc4b77..e5cf68e 100644 --- a/ksrc/skins/posix/signal.c +++ b/ksrc/skins/posix/signal.c @@ -318,16 +318,19 @@ int pse51_sigqueue_inner(pthread_t thread, pse51_siginfo_t * si) #ifdef CONFIG_XENO_OPT_PERVASIVE if (xnthread_test_state(&thread->threadbase, XNSHADOW)) { pse51_schedule_lostage(PSE51_LO_SIGNAL_REQ, thread, 0); + thread->threadbase.signals = 0; if (xnthread_test_state(&thread->threadbase, XNDELAY|XNPEND|XNSUSP|XNRELAX)) { /* Thread is suspended in a syscall, or already relaxed, - we do not need to run the signal dispatcher, the + we do not need to call xnshadow_call_mayday, the signal APC will cause the sigwake_event to be generated, which will kick the thread. */ - thread->threadbase.signals = 0; return 0; - } else - return thread == pse51_current_thread(); + } + + xnthread_set_info(&thread->threadbase, XNAMOK); + xnshadow_call_mayday(&thread->threadbase); + return thread == pse51_current_thread(); } #endif /* CONFIG_XENO_OPT_PERVASIVE */ @@ -1086,16 +1089,6 @@ static void pse51_dispatch_signals(xnsigmask_t sigs) } #ifdef CONFIG_XENO_OPT_PERVASIVE -static void pse51_dispatch_shadow_signals(xnsigmask_t sigs) -{ - spl_t dummy; - /* Migrate to secondary mode in order to get the signals delivered by - Linux. */ - xnshadow_relax(1, SIGDEBUG_MIGRATE_SIGNAL); - xnlock_get_irqsave(&nklock, dummy); - (void)dummy; -} - void pse51_signal_handle_request(pthread_t thread) { pse51_siginfo_t *si; @@ -1103,8 +1096,6 @@ void pse51_signal_handle_request(pthread_t thread) xnlock_get_irqsave(&nklock, s); - thread->threadbase.signals = 0; - while ((si = pse51_getsigq(&thread->pending, &thread->pending.mask, NULL))) { siginfo_t info = si->info; @@ -1121,13 +1112,10 @@ void pse51_signal_handle_request(pthread_t thread) reschedule. */ xnlock_put_irqrestore(&nklock, s); - send_sig_info(info.si_signo, - &info, + send_sig_info(info.si_signo, &info, xnthread_user_task(&thread->threadbase)); xnlock_get_irqsave(&nklock, s); - - thread->threadbase.signals = 0; } xnlock_put_irqrestore(&nklock, s); @@ -1148,9 +1136,7 @@ void pse51_signal_init_thread(pthread_t newthread, const pthread_t parent) emptyset(&newthread->sigmask); #ifdef CONFIG_XENO_OPT_PERVASIVE - if (testbits(newthread->threadbase.state, XNSHADOW)) - newthread->threadbase.asr = &pse51_dispatch_shadow_signals; - else + if (testbits(newthread->threadbase.state, XNSHADOW) == 0) #endif /* CONFIG_XENO_OPT_PERVASIVE */ newthread->threadbase.asr = &pse51_dispatch_signals; _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git