On Wed, Mar 28, 2018 at 11:02 PM, Philippe Gerum <[email protected]> wrote:
> On 03/28/2018 07:20 PM, Pintu Kumar wrote:
>> On Wed, Mar 28, 2018 at 8:37 PM, Philippe Gerum <[email protected]> wrote:
>>> On 03/28/2018 09:54 AM, Pintu Kumar wrote:
>>>> Hi,
>>>>
>>>> We are facing one issue on Xenomai-3 on x86_64 system.
>>>> Kernel: 4.9.51
>>>> ipipe version: 4
>>>> # /usr/xenomai/sbin/version
>>>> Xenomai/cobalt v3.0.6 -- #5956064 (2018-03-20 12:13:33 +0100)
>>>>
>>>> Its a very simple API level test.
>>>> We create a condition variable and wait for the condition inside a task.
>>>> Then, we immediately signal the condition from the main thread, and simply
>>>> wait for the test to finish.
>>>>
>>>> But we observed that condition task is never getting released, and the
>>>> program hangs.
>>>>
>>>> This is the output:
>>>> --------------------------
>>>> # ./condsignal
>>>> cond_task --> started
>>>> main --> cond signal success: 0
>>>> Waiting for task to finish....
>>>> ^C
>>>>
>>>>
>>>> This is the code snippet that was used.
>>>> -----------------------------------------------------
>>>> # cat condsignal.c
>>>>
>>>> /*
>>>>  * 1. Create an condition variable and wait inside a task.
>>>>  * 2. Delete the condition variable from main task.
>>>>  * 3. Observe that the condition wait is released and task ends normally.
>>>>  * 4. Finally main task should exit normally.
>>>>  *
>>>>  * */
>>>> #include <stdio.h>
>>>> #include <stdlib.h>
>>>> #include <sys/mman.h>
>>>> #include <alchemy/task.h>
>>>> #include <alchemy/mutex.h>
>>>> #include <alchemy/cond.h>
>>>> #include <alchemy/task.h>
>>>>
>>>> static RT_COND cond;
>>>> static RT_MUTEX mutex;
>>>>
>>>> static void cond_task(void *cookie)
>>>> {
>>>>         int err;
>>>>
>>>>         printf("%s --> started \n", __func__);
>>>>         rt_mutex_acquire(&mutex, TM_INFINITE);
>>>>         err = rt_cond_wait(&cond, &mutex, TM_INFINITE);
>>>>         rt_mutex_release(&mutex);
>>>>         if (err) {
>>>>                 printf("rt_cond_wait failed, err = %d", err);
>>>>                 return;
>>>>         }
>>>>         printf("%s --> cond wait done\n", __func__);
>>>> }
>>>>
>>>> int main(int argc, char **argv)
>>>> {
>>>>         int err;
>>>>         RT_TASK task1;
>>>>
>>>>         mlockall(MCL_CURRENT | MCL_FUTURE);
>>>
>>>         The line above is redundant with libcobalt inits. But you need:
>>>
>>>           err = rt_task_shadow(NULL, "main", <prio>, 0);
>>>           ...
>>
>> OK thank you so much for this. I will try it.
>> And, yes I am debugging this issue.
>> I found that rt_cond_wait_timed, did not return from here:
>
> Ok, thanks for looking at this. The issue is that the app is missing the
> call to rt_task_shadow() in the main thread. So that thread receives
> -EPERM from rt_mutex_acquire(), and the rest is a fallout of that
> original error.
>

Ok, we tried adding rt_task_shadow(NULL, "main", 99, 0), just before
rt_task_create(),
but it did not help.
Still the tasks hangs under rt_cond_wait().
So, we need to debug further.


Thanks,
Pintu


> --
> Philippe.

_______________________________________________
Xenomai mailing list
[email protected]
https://xenomai.org/mailman/listinfo/xenomai

Reply via email to