Hi all,
I've recently discovered a "possible" bug
only occuring with a system running xenomai-patched kernel.
I have set up a machine (dual-core intel machine).
The machine is installed with a Fedora Core 6 and
may be booted (test purpose) with different kernel:
1) linux 2.6.20-0119.rt8
which is an Ingo Molnar precompiled preempt-rt patched kernel
you may find it there:
http://people.redhat.com/mingo/realtime-preempt/
2) 2.6.20-xeno-2.3.1-ipipe-1.7-03
which is a xenomai enabled kernel I've configured and compiled.
My test application is a mixed C/C++ USER-land application
which currently make no xenomai specific call.
The application core dumps at the end of its execution
with the xenomai enabled kernel whereas it does not
with the preempt-rt kernel.
I track down the problem to a misuse of sigaction calls
which install SIGALARM handler with sa_flags not properly setup.
My code is definitely buggy but I let you know because in the first
place it was puzzling to have different (but consistent and repeatable) behavior
on different kernel, with core dump using the Xenomai-enabled kernel :((.
You may try it yourself:
gcc -o BadTimerSigHandler TimerSigHandler.c
generates a the buggy binary, while
gcc -DGOOD_SIGHANDLING -o GoodTimerSigHandler TimerSigHandler.c
generates the good one.
I don't really know if it may indicates a xenomai bug or not
but I would be glad to understand WHY is this.
I mean I know that uninitialized memory have unpredictable consequence
but here the bug is persistent after rerun, reboot, power cycle etc...
--
Erk
#include <stdio.h>
#include <sys/types.h>
#include <signal.h>
static int stop = 0;
void
SignalHandler(int Signal) {
int pid = getpid();
printf("Received signal %d. Stopping peacefully.\n", Signal);
stop = 1;
}
int
main() {
int i;
struct sigaction a ;
signal(SIGINT , SignalHandler);
signal(SIGPIPE, SignalHandler);
a.sa_handler = SignalHandler ;
sigemptyset(&a.sa_mask);
#if defined(GOOD_SIGHANDLING)
a.sa_flags = SA_RESTART;
#endif
sigaction(SIGALRM, &a, NULL);
alarm(3);
for (i=0;i<2000 && !stop ;++i) {
printf(".");
fflush(stdout);
sleep(1);
}
}
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help