Oh my dear. The ground may open and swallow me. This crappy piece of
optimisation in xnintr_edge_shirq_handler() I introduced both to 2.4 and
(sadly) the 2.3.x stable series cannot work. It must stay as it used to:

--- ksrc/nucleus/intr.c (revision 2871)
+++ ksrc/nucleus/intr.c (working copy)
@@ -296,15 +296,15 @@ static void xnintr_edge_shirq_handler(un
                s |= ret;

                if (code == XN_ISR_HANDLED) {
-                       if (!(end = (intr->next)))
-                               end = shirq->handlers;
+                       end = NULL;
                        xnstat_counter_inc(
                                &intr->stat[xnsched_cpu(sched)].hits);
                        xnstat_runtime_lazy_switch(sched,
                                &intr->stat[xnsched_cpu(sched)].account,
                                start);
                        start = xnstat_runtime_now();
-               }
+               } else if (code == XN_ISR_NONE && end == NULL)
+                       end = intr;

                if (counter++ > MAX_EDGEIRQ_COUNTER)
                        break;
(that's for 2.3.x)

Once "end" is moved forward to the next handler in the chain, the loop
termination condition "intr==end" will trigger on the immediately
following round, even if there are still events pending. Utterly broken.

Philippe, please quickly apply -- and don't tell anyone who did this.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to