Peter Soetens wrote:
> 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
You can not do that, Xenomai requires that xeno_sigwinch_handler be
called when SIGWINCH is received. To do that, you have either:
- to arrange for Xenomai xeno_sigshadow_install_once to be called after
the time when readline installs its handlers, that is what calling
xeno_sigshadow_install achieved, but this was fragile
- use another signal than SIGWINCH as internal signal used by Xenomai,
at the expense of some additional line launching gdb.
- define your own signal and handle correctly both Xenomai and
libreadline signals in that handler.
--
Gilles.
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help