rt_task_unblock() POSIX alternative

Jan Kiszka jan.kiszka at siemens.com
Tue Apr 14 12:28:45 CEST 2020


On 14.04.20 12:23, Richard Weinberger wrote:
> On Tue, Apr 14, 2020 at 12:07 PM Jan Kiszka <jan.kiszka at siemens.com> wrote:
>>
>> On 14.04.20 11:46, Richard Weinberger wrote:
>>> On Tue, Apr 14, 2020 at 11:11 AM Petr ńĆervenka <grugh at centrum.cz> wrote:
>>>>
>>>>> I fear there seems to be a confusion between POSIX tasks and POSIX skin.
>>>>> Is your goal programming Xenomai realtime threads using POSIX alike APIs?
>>>>> Or are you looking for a pedant of rt_task_unblock() to unblock a
>>>>> POSIX task, without Xenomai realtime threads?
>>>>>
>>>>> The solution I provided is for the latter case.
>>>>
>>>>
>>>>
>>>> My original goal was to port a very complex realtime application from Xenomai 2.6.5 Native skin to Xenomai 3.1 POSIX skin. So I made series of examples, where I tried to verify porting of several designs used in the orig. application. And rt_task_unblock() for reconfiguration of the waiting threads in the orig app was one of them.
>>>>
>>>> Now I'm very curious, why the (my explicit) signals in Xenomai POSIX skin are not working for me as I would expect.
>>>>
>>>>
>>>>
>>>> Here is my compile command:
>>>>
>>>> g++ -fasynchronous-unwind-tables   -c -g -D_DEBUG -D_GNU_SOURCE -D_REENTRANT -D__COBALT_WRAP__ -D__COBALT__ -I/usr/xenomai/include/cobalt -I/usr/xenomai/include -MMD -MP -MF "build/Debug/GNU-Linux/main.o.d" -o build/Debug/GNU-Linux/main.o main.cpp
>>>>
>>>>
>>>>
>>>> Here is my link command:
>>>>
>>>> g++ -fasynchronous-unwind-tables    -o dist/Debug/GNU-Linux/countertestapp_4 build/Debug/GNU-Linux/main.o -L/usr/xenomai/lib -Wl,-rpath,'/usr/xenomai/lib' -Wl,--no-as-needed -Wl,@/usr/xenomai/lib/cobalt.wrappers -Wl,@/usr/xenomai/lib/modechk.wrappers /usr/xenomai/lib/xenomai/bootstrap.o -Wl,--wrap=main -Wl,--dynamic-list=/usr/xenomai/lib/dynlist.ld -lcobalt -lmodechk -lpthread -lrt
>>>>
>>>>
>>>>
>>>> I'm using Netbeans IDE for my attemps, but the I tried to integrate xeno-config --posix --cflags or --ldflags result into the project settings as much as possible.
>>>
>>> Okay. Now things get clearer.
>>> pthread_kill() will be wrapped to Xenomai, but you installed a signal
>>> handler for a Linux process.
>>>
>>> What you basically need is a function in the Xenomai POSIX skin which
>>> calls threadobj_unblock().
>>>
>>
>> Below the working version for unblocking the RT task with non-RT signal.
> 
> This interrupts the Linux syscall, yes. Does this also work when the
> thread blocks on the Xenomai/Cobalt side?
> 

That ::read is a Xenomai syscall, being handled in the end by 
timerfd_read in the core. So, yes.

There were two "tricks" needed: avoid syscall restart (as you already 
noticed) and using __STD (i.e. __real) pthread_kill in order to get a 
normal signal out. Oh, and the flag var should better be volatile, but 
that may still work when lucky.

Jan

-- 
Siemens AG, Corporate Technology, CT RDA IOT SES-DE
Corporate Competence Center Embedded Linux



More information about the Xenomai mailing list