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 |   34 ++++++++++------------------------
 1 files changed, 10 insertions(+), 24 deletions(-)

diff --git a/ksrc/skins/posix/signal.c b/ksrc/skins/posix/signal.c
index dfc4b77..42829a4 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 cann 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,14 +1136,12 @@ 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;
 
-       newthread->threadbase.asrmode = 0;
        newthread->threadbase.asrimask = 0;
+       newthread->threadbase.asrmode = 0;
 }
 
 /* Unqueue, and free any pending siginfo structure. Assume we are called nklock
-- 
1.7.2.5


_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to