[Xenomai] trying to shadow a pthread fails with -EINVAL error

Andrea andrea.schiappacasse at camelotbio.com
Tue Apr 19 17:22:56 CEST 2016


Hello Philippe,

Thank you very much for your prompt answer,
I tried the proposed workaround and it seems to work fine on threads
created with both pthread_create and boost library, effectively solving my
problem.

After shadowing the thread in the suggested way, it seems that I can use
libalchemy as intended and even spawn new rt_tasks from the shadowed thread.

I'll keep using libalchemy, with the workaround where needed, as you
suggested.

Thank you again for your very useful help,

Andrea





2016-04-19 16:31 GMT+02:00 Philippe Gerum <rpm at xenomai.org>:

> On 04/19/2016 04:08 PM, Andrea wrote:
>
>> Hello,
>>
>> I'm currently trying to integrate Xenomai 3.0.2 using Cobalt with alchemy
>> skin in a C++  project, under kernel 4.1.8  with i-pipe patch.
>>
>> In my application I'm creating some threads using boost library, and I
>> would like to shadow one of them to a rt_task in order to use some xenomai
>> function in there.
>>
>> If I call rt_task_shadow(NULL, NULL, 0,0) from the running thread, -EINVAL
>> is returned.
>>
>> While the API docs says that this can be due to an invalid prio, tracking
>> down the source of the error, it appears that in my case it is generated
>> in
>> the function syncobj_lock (copperplate/syncobj.c), where a call to
>> monitor_enter (which internally calls cobalt_monitor_enter) fails and
>> returns -1.
>>
>> The same happens with threads created both using standard pthread_create
>> or
>> via the boost library.
>>
>> Trying to shadow the main thread (or creating rt_task from there) works
>> correctly. instead.
>>
>> A reproducible example in my system:
>>
>> #include "pthread.h"
>> #include "alchemy/task.h"
>> #include <iostream>
>> #include <unistd.h>
>>
>> void* shadow(void*)
>> {
>>      std::cerr<<"Shadow returned "<< rt_task_shadow(NULL, NULL, 0,0);
>> }
>>
>> int main(int argc, char* argv[])
>> {
>>      pthread_t test_thread;
>>     // new boost::thread(shadow);
>>      pthread_create(&test_thread, NULL, shadow, NULL);
>>      sleep(10);
>>
>>      return 0;
>> }
>>
>> with output: Shadow returned -22
>>
>> Do you have any insight on where the problem could be? Am I missing
>> something basic?
>>
>>
> I suspect some chicken and egg situation in the rt_task_shadow()
> implementation. I'll have a look as soon as I can.
>
> If possible, I would like to stick to alchemy skin.
>>
>
> Unfortunately, the only way to work around this issue at the moment would
> be to call libcobalt's pthread_setschedparam() for pthread_self(), until
> this issue is fixed in libalchemy. You could do this for a particular
> statement without wrapping the POSIX API by calling:
>
> struct sched_param parm = { .sched_priority = 0 };
> __RT(pthread_setschedparam(phread_self(), SCHED_OTHER, &parm);
>
> instead of rt_task_shadow(). libcobalt is underlying all Xenomai 3
> applications, so you would not need to fixup the build rules or
> dependencies. It's already there.
>
> --
> Philippe.
>


More information about the Xenomai mailing list