Wolfgang Grandegger wrote: > Gilles Chanteperdrix wrote: >> Wolfgang Grandegger wrote: >>> Gilles Chanteperdrix wrote: >>>> Wolfgang Grandegger wrote: >>>>> Gilles Chanteperdrix wrote: >>>>>> Wolfgang Grandegger wrote: >>>>>>> Running under gdb shows: >>>>>>> >>>>>>> Program received signal SIGSEGV, Segmentation fault. >>>>>>> [Switching to Thread 0x4885d4b0 (LWP 1127)] >>>>>>> 0x0ff49100 in pthread_cancel () from /lib/libpthread.so.0 >>>>>>> (gdb) where >>>>>>> #0 0x0ff49100 in pthread_cancel () from /lib/libpthread.so.0 >>>>>>> #1 0x10001d64 in ctrl_func (parm=0x0) at cancel-test.c:104 >>>>>>> #2 0x0ffa98e4 in __pthread_trampoline () >>>>>>> from /home/wolf/xenomai/lib/libpthread_rt.so.1 >>>>>>> #3 0x0ff42a6c in start_thread () from /lib/libpthread.so.0 >>>>>>> #4 0x0fdd18a0 in clone () from /lib/libc.so.6 >>>>>>> Backtrace stopped: previous frame inner to this frame (corrupt stack?) >>>>>>> >>>>>>> Is pthread_cancel used from the Linux pthread library? And >>>>>>> pthread_testcancel() as well? >>>>>> Yes, and I guess, as you said, that it happens because calc_func is dead >>>>>> when you try and cancel it. >>>>> Yep, but it should not crash. >>>> The spec says: >>>> The pthread_cancel() function may fail if: >>>> >>>> [ESRCH] >>>> No thread could be found corresponding to that specified by the >>>> given thread ID. >>>> >>>> >>>> So, it is a "may", returning ESRCH, as Xenomai does in kernel-space, is >>>> not mandatory. >>> I also got the return value ESRCH in another test. Nevertheless, a crash >>> is not the expected behaviour, to say the least. Here pthread_cancel() >>> obvoiusly get's interrupted and the calc_thread continues. Is it >>> possible that pthread_cancel() switches to secondary mode? >> pthread_cancel switches to secondary mode if it has to send a signal (if >> cancellation is in asynchronous mode, this happens when the target >> thread is blocked inside a blocking call). But this should not be a >> problem with RPI. > > I disabled priority coupling in the kernel and it did not help or harm. > This test uses PTHREAD_CANCEL_DEFERRED, which is also the default, if > I understood correctly.
You should definitely enable priority coupling. Even if you use PTHREAD_CANCEL_DEFERRED, when you call a blocking call, the cancellation is switched for the time of the blocking call to asynchronous. But since you do not call any blocking call, I agree that pthread_cancel should not switch to secondary mode, it should just set a bit in some TCB attached to the target thread. > >> But the problem you should focus on is why the scheduler does not let >> pthread_cancel run earlier. > > Don't know what you mean. The calc_func gets preempted and the ctrl_func > calls pthread_cancel as expected... > > calc_func: at count 20 > calc_func: at count 21 > calc_func: at count 22 > ctrl_func: cancel at count 23 > ^^^^^^^^^ > calc_func: at count 23 > > But then it stops somehow in pthread_cancel and calc_func continues to run. Yes, but since "ctrl_func: stopped at count 23" does not appear, it means that ctrl_func is somehow blocked in pthread_cancel. Does the test work if calc_func calls nanosleep instead of create_load_100ms ? -- Gilles. _______________________________________________ Xenomai-help mailing list Xenomai-help@gna.org https://mail.gna.org/listinfo/xenomai-help