On Wed, Mar 28, 2018 at 1:42 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); >> >> 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; >> } >> ----------------------------------------------------- >> >> Is there any fix available in Xenomai-3 for this? >> Please let me know if there is something wrong here. >> >> > > You are not using condition variables the right way, those have no > semaphore semantics. Please read a POSIX documentation about them like > [1], the alchemy API does not differ in behavior. >
Thank you for your reply. Can you point out the mistake in this program? I will try to develop the posix equivalent and check. I even tried removing mutex from rt_cond_signal, but it did not help. > [1] http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_cond_wait.html > > -- > Philippe. _______________________________________________ Xenomai mailing list [email protected] https://xenomai.org/mailman/listinfo/xenomai
