On Wed, 2006-09-20 at 15:54 +0200, Philippe Gerum wrote:
> On Wed, 2006-09-20 at 15:21 +0200, Thomas Necker wrote:
> > >> 1) The program segfaults sometimes. It's not predictable whether
> > >>    it'll happen or not. Starting the same program 10 times may
> > >>    result in some segfaults and some complete runs. Adding a printf
> > >>    for error checking can massively alter the crash likelyhood. When
> > >>    it crashes, its always the same picture: A pSOS event is sent
> > >>    from one task to another. The receiveing task is released from its
> > >>    blocking ev_receive and continues. However, if this now running task
> > >>    calls psos_current_task() it gets the id of the task the event has
> > >>    been sent from! Somehow something seems to be completely mixed up
> > >>    in the nucleus. After two days of search I'm running out of ideas
> > >>    what to look for.
> > >
> > >Try raising the size of the task stacks. If printf() increases the
> > >occurences of faults, then it's likely related to a stack overflow.
> > >
> > >>  I'd be thankful for some ideas where to place
> > >>    some hooks to identify the problem. Things get complicated because
> > >>    program changes (I tried to reduce the problem to a simple example)
> > >>    ususally make the problem go away and debugging hardly works, see 2)
> > 
> > I raised the stack to 40k each task, which is ten times as much as under
> > original pSOS - still segfaults. Also, printfs rather *reduce* the 
> > likelyhood
> 
> Ok, so it's probably an internal sync problem affecting the UVM. The
> beast is particularly prone to that over the LinuxThreads,
> unfortunately. Actually, what you describe rings a bell now; if you
> could reduce the odd behaviour to a simple test case, I would look at it
> asap.

Thanks for test case, it helped a lot. Here is a fix for an internal
scheduling bug affecting the UVM, especially over GDB:

--- ksrc/nucleus/shadow.c       (revision 1663)
+++ ksrc/nucleus/shadow.c       (working copy)
@@ -1794,7 +1794,7 @@
 
        if (testbits(thread->status, XNSUSP)) {
                xnpod_resume_thread(thread, XNSUSP);
-               __setbits(thread->status, XNKICKED);
+               __setbits(thread->status, XNBREAK|XNKICKED);
        }
 
        /* If we are kicking a shadow thread, make sure Linux won't

-- 
Philippe.



_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to