On Monday 10 January 2011 17:50:05 Gilles Chanteperdrix wrote:
> Peter Soetens wrote:
> > On Monday 10 January 2011 17:24:28 Gilles Chanteperdrix wrote:
> >> Peter Soetens wrote:
> >>> Hi,
> >>>
> >>> A while ago, I was advised to call xeno_sigshadow_install() after a
> >>> library installed a sigwinch signal handler (I believe this was Xenomai
> >>> 2.5.1). Could it be that this is no longer supported in recent versions
> >>> ? What is the correct way to avoid a segfault if an application
> >>> installed a sigwinch handler after Xenomai did ?
> >>
> >> I think we already answered that at the time, but if you install your
> >> own sigwinch handler, you should:
> >> - register it with the SA_SIGINFO flag
> >> - call xeno_sigwinch_handler and consider that the signal is for the
> >> application only if this function returns 0.
> >
> > This is indeed in the API docs, but it's not an option since it's a third
> > party library (readline) doing this, it doesn't depend on or know
> > Xenomai.
> >
> >> If you can not do that, then redefine SIGSHADOW in
> >> include/asm-generic/syscall.h to a different value, and recompile both
> >> Xenomai user-space and kernel-space support. Note however that when
> >> starting applications in gdb you will then have to type:
> >>
> >> handle <the_new_signal> pass nostop print
> >>
> >> If you want to be able to debug Xenomai applications.
> >
> > Hmm....
> >
> > So defining the xeno_sigshadow_install() function ourselves (since it's
> > not in any Xenomai header) and calling it after the readline signal
> > handlers were installed is not gonna work ?
>
> The thing is that xeno_sigshadow_installi is an internal function,
> particularily, it is not thread safe. The exported function is
> xeno_sigshadow_install_once, but it will not do anything the second time
> it gets called.
>
> If you take care of this thread-safety issue, calling
> xeno_sigshadow_install should be OK, since it just installs
> xeno_sigshadow_handler as a handler for SIGSHADOW, calling
> xeno_sigwinch_handler, then the handler your application registered
> before. All this code is relatively simple, and you will find it in
> src/skins/common/sigshadow.c
>
> Now, I suspect the issue you have is something else, so, could you post
> the faulting code, reduced to a simple self-contained test case?
main.cpp:
#include <readline/readline.h>
#include <readline/history.h>
#include <xenomai/native/task.h>
#include <malloc.h>
#include <sys/mman.h>
#include <stdio.h>
char* line_read = 0;
char *rl_gets ()
{
/* If the buffer has already been allocated,
return the memory to the free pool. */
if (line_read)
{
free (line_read);
line_read = 0;
}
if (rl_set_signals() != 0)
printf("Error setting signals !\n");
line_read = readline ( ">" );
/* If the line has any text in it,
save it on the history. */
if (line_read && *line_read) {
add_history (line_read);
}
return (line_read);
}
int main(void)
{
mlockall(MCL_CURRENT | MCL_FUTURE);
RT_TASK xenotask;
rt_task_shadow( &(xenotask),0, 10, 0);
rl_completion_append_character = '\0'; // avoid adding spaces
if ( read_history(".history") != 0 ) {
read_history("~/.history");
}
// Let readline intercept relevant signals
if(rl_catch_signals == 0)
printf("Error catching signals !\n");
if (rl_set_signals() != 0)
printf("Error setting signals !\n");
while (1)
{
rl_gets();
}
return 0;
}
make main CXXFLAGS=-I/usr/include/xenomai LDFLAGS="-lnative -lpthread -
lncurses -lreadline -lxenomai"
./main
>
<now resize your xterm window>
Segmentation fault
Peter
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help