On 05/08/2013 06:10 PM, Philippe Gerum wrote:
> On 05/08/2013 06:06 PM, Philippe Gerum wrote:
>> On 05/08/2013 04:30 PM, Paolo Minazzi wrote:
>>> I think to be very near to the solution of this problem.
>>> Thanks to Gilles for his patience.
>>>
>>> Now I will retry to make a summary of the problem.
>>>
>>
>> <snip>
>>
>>> The thread 1 finds thread 70 in debug mode !
>>>
>>
>> Which is expected. thread 70 has to be scheduled in with no pending
>> ptrace signals for leaving this mode, and this may happen long after
>> the truckload of other threads releases the CPU.
>>
>>> My patch adjust this problem.
>>>
>>> I realize that it is a very special case, but it is my case.
>>>
>>> I'd like to know if the patch is valid or can be written in a different
>>> way.
>>> For example, I could insert my patch directly in xnpod_delete_thread().
>>>
>>> The function unlock_timers() cannot be called from
>>> xenomai-2.5.6/ksrc/skins/native/task.c
>>> because it is defined static. This is a detail. There are simple ways to
>>> solve this.
>>>
>>
>> No, really the patch is wrong, but what you expose does reveal a bug
>> in the Xenomai core for sure. As Gilles told you, you would be only
>> papering over that real bug, which would likely show up in a different
>> situation.
>>
>> First we need to check for a lock imbalance, I don't think that code
>> is particularly safe.
>
> I mean a lock imbalance introduced by an unexpected race between the
> locking/unlocking calls. The assertions introduced by this patch might
> help detecting this, with some luck.
>
Could you apply that patch below, and report whether some task triggers
the message it introduces, when things go wrong with gdb? TIA,
diff --git a/ksrc/nucleus/pod.c b/ksrc/nucleus/pod.c
index 868f98f..2da3265 100644
--- a/ksrc/nucleus/pod.c
+++ b/ksrc/nucleus/pod.c
@@ -1215,6 +1215,10 @@ void xnpod_delete_thread(xnthread_t *thread)
#else /* !CONFIG_XENO_HW_UNLOCKED_SWITCH */
} else {
#endif /* !CONFIG_XENO_HW_UNLOCKED_SWITCH */
+ if (xnthread_test_state(thread, XNSHADOW|XNMAPPED) == XNSHADOW)
+ printk(KERN_WARNING "%s: deleting unmapped shadow %s\n",
+ __func__, thread->name);
+
xnpod_run_hooks(&nkpod->tdeleteq, thread, "DELETE");
xnsched_forget(thread);
--
Philippe.
_______________________________________________
Xenomai mailing list
[email protected]
http://www.xenomai.org/mailman/listinfo/xenomai