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
