2009/4/1 Jan Kiszka <jan.kis...@web.de>:
> Philippe Gerum wrote:
>> On Wed, 2009-04-01 at 18:18 +0200, Gilles Chanteperdrix wrote:
>>> Adam Bennett wrote:
>>>> On Wed, Apr 1, 2009 at 4:44 AM, Philippe Gerum <r...@xenomai.org> wrote:
>>>>> On Tue, 2009-03-31 at 14:53 -0400, Adam Bennett wrote:
>>>>>> I'm running xenomai-head, linux-2.6.28.9, with uclibc-0.9.30.1.
>>>>>>
>>>>>> I have to run configure with --build=i586-gentoo-linux-uclibc
>>>>>> --without-__thread.
>>>>>>
>>>>>> The problem I'm seeing is a segfault whenever calling rt_task_delete.
>>>>>> This even occurs with the example program trivial-periodic.
>>>>>>
>>>>>> I have debug enabled in the kernel, but nothing interesting appears in 
>>>>>> syslog.
>>>>>>
>>>>>> Any thoughts?
>>>>>>
>>>>> gdb?
>>>> Here's the backtrace (this is my first time using gdb, I've been a fan
>>>> of printf) after recompiling xenoami userland libs with debugging:
>>>>
>>>> Thread 3 (process 1263):
>>>> #0  0xb7f0c5a6 in rt_task_wait_period (overruns_r=0x0)
>>>>     at ../../../../xenomai-head/src/skins/native/task.c:286
>>>>     muxcode = 134283819
>>>>     resultvar = 2739887275
>>>> #1  0x08048638 in demo (arg=0x0) at trivial-periodic.c:26
>>>>     now = 1238598807752498347
>>>>     previous = 1238598807752498347
>>>> #2  0xb7f0c056 in rt_task_trampoline (cookie=0x0)
>>>>     at ../../../../xenomai-head/src/skins/native/task.c:111
>>>>     iargs = (struct rt_task_iargs *) 0xbfb2c840
>>>>     entry = (void (*)(void *)) 0x8048604 <demo>
>>>>     bulk = {a1 = 134520892, a2 = 134514592, a3 = 99, a4 = 0, a5 = 1026,
>>>> a6 = 147481040}
>>>>     task = (RT_TASK *) 0x804a03c
>>>>     self = (RT_TASK *) 0x8ca6138
>>>>     err = 0
>>>> #3  0xb7f14f78 in pthread_start_thread () from /lib/libpthread.so.0
>>>> No symbol table info available.
>>>> #4  0xb7ec9efe in clone () from /lib/libc.so.0
>>>> No symbol table info available.
>>>>
>>>> Thread 2 (process 1262):
>>>> #0  0xb7ecc330 in poll () from /lib/libc.so.0
>>>> No symbol table info available.
>>>> #1  0xb7f1aff4 in ?? () from /lib/libpthread.so.0
>>>> No symbol table info available.
>>>> #2  0x000004ef in ?? ()
>>>> No symbol table info available.
>>>> #3  0xb7f152a4 in __pthread_manager () from /lib/libpthread.so.0
>>>> No symbol table info available.
>>>> #4  0x00000000 in ?? ()
>>>> No symbol table info available.
>>>>
>>>> Thread 1 (process 1261):
>>>> #0  0xb7f0c455 in rt_task_delete (task=0x804a03c)
>>>>     at ../../../../xenomai-head/src/skins/native/task.c:252
>>>>     err = -1078802316
>>>> #1  0x08048737 in main () at trivial-periodic.c:71
>>>> No locals.
>>>>
>>>> The line that causes the segfault is 252:
>>>>
>>>> 248 int rt_task_delete(RT_TASK *task)
>>>> 249 {
>>>> 250         int err;
>>>> 251
>>>> 252         if (!task || task->opaque == rt_task_self()->opaque) {
>>> try:
>>>
>>> if (!task || rt_task_self() && task->opaque == rt_task_self()->opaque)
>>>
>>>
>>
>> Indeed. The following patch is queued.
>>
>> diff --git a/src/skins/native/task.c b/src/skins/native/task.c
>> index 5cf37d9..905d366 100644
>> --- a/src/skins/native/task.c
>> +++ b/src/skins/native/task.c
>> @@ -249,10 +249,10 @@ int rt_task_delete(RT_TASK *task)
>>  {
>>       int err;
>>
>> -     if (!task || task->opaque == rt_task_self()->opaque) {
>> +     if (task == NULL ||
>> +         (rt_task_self() && task->opaque == rt_task_self()->opaque)) {
>>               /* Silently migrate to avoid raising SIGXCPU. */
>>               XENOMAI_SYSCALL1(__xn_sys_migrate, XENOMAI_LINUX_DOMAIN);
>> -
>>               pthread_exit(NULL);
>>       }
>>

Thanks, this fixed the segfaults!

Adam

>
> Mea culpa.
>
> I would just suggest to put rt_task_self() into a local variable to
> avoid double evaluation.
>
> Jan
>
>
> _______________________________________________
> Xenomai-core mailing list
> Xenomai-core@gna.org
> https://mail.gna.org/listinfo/xenomai-core
>
>

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

Reply via email to