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:

if (abs_timeout)
           ret = -__RT(pthread_cond_timedwait(&ccb->cond,
                                         &mcb->lock, abs_timeout));

How to debug from here. The next call is a normal pthread call.
And what does __RT represent here?
What does it translates to ?

If this does not work, then even normal pthread_cond_wait/signal
example also may not work.
So, I will first try to check the behaviour with normal pthread.


>>
>>         err = rt_mutex_create(&mutex, NULL);
>>         err = rt_cond_create(&cond, "cond_test");
>>         err = rt_task_create(&task1, NULL, 0, 99, T_JOINABLE);
>>         err = rt_task_start(&task1, &cond_task, NULL);
>>         rt_mutex_acquire(&mutex, TM_INFINITE);
>>         err = rt_cond_signal(&cond);
>>         rt_mutex_release(&mutex);
>>         if (err) {
>>                 printf("Error: rt_cond_signal failed, err = %d", err);
>>                 exit(-1);
>>         }
>>         printf("%s --> cond signal success: %d\n", __func__, err);
>>         printf("Waiting for task to finish....\n");
>>         rt_task_join(&task1);
>>
>>         return 0;
>> }
>
> --
> Philippe.

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

Reply via email to