Hi Philippe,

does your patch fix also the situation when the task is suspended via 
T_SUSP flag from rt_task_shadow (and calls which start tasks, for that 
matter) ?

Then I've applied your patch to task.c in my kernel tree, recompiled the 
kernel, and my task is still getting resumed too early, returning 0. 
Even when I use rt_task_suspend. Could this be caused by something else ?

Thanks,
Tomas



Philippe Gerum wrote:
> Philippe Gerum wrote:
>   
>> Tomas Kalibera wrote:
>>     
>>> Hi,
>>>
>>> what can, besides an explicit call, resume a suspended task ? I created 
>>> and started a child task, then shadowed the current thread with T_SUSP 
>>> flag. The child was supposed to call rt_task_resume to wake-up the 
>>> parent and let it terminate the process, but, the parent was resumed 
>>> before this call. The call to rt_task_suspend in parent returned 0. The 
>>> program uses SIGALRM signal. Could this be the cause ?
>>>
>>>       
>> Yes, but the syscall should be silently restarted by default. This patch 
>> should
>> fix the issue:
>>
>>     
>
> This one will compile:
>
> --- ksrc/skins/native/task.c  (revision 3698)
> +++ ksrc/skins/native/task.c  (working copy)
> @@ -410,11 +410,17 @@
>   * A nesting count is maintained so that rt_task_suspend() and
>   * rt_task_resume() must be used in pairs.
>   *
> + * Receiving a Linux signal causes the suspended task to resume
> + * immediately.
> + *
>   * @param task The descriptor address of the affected task. If @a task
>   * is NULL, the current task is suspended.
>   *
>   * @return 0 is returned upon success. Otherwise:
>   *
> + * - -EINTR is returned if a Linux signal has been received by the
> + * suspended task.
> + *
>   * - -EINVAL is returned if @a task is not a task descriptor.
>   *
>   * - -EPERM is returned if the addressed @a task is not allowed to sleep
> @@ -463,9 +469,12 @@
>               goto unlock_and_exit;
>       }
>
> -     if (task->suspend_depth++ == 0)
> +     if (task->suspend_depth++ == 0) {
>               xnpod_suspend_thread(&task->thread_base, XNSUSP,
>                                    XN_INFINITE, XN_RELATIVE, NULL);
> +             if (xnthread_test_info(&task->thread_base, XNBREAK))
> +                     err = -EINTR;
> +     }
>
>        unlock_and_exit:
>
>
>   


_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to