Philippe Gerum wrote:
> On Sun, 2010-04-18 at 15:40 +0200, Jan Kiszka wrote:
>> Philippe Gerum wrote:
>>> On Sun, 2010-04-18 at 15:26 +0200, Philippe Gerum wrote:
>>>> On Sun, 2010-04-18 at 15:12 +0200, Jan Kiszka wrote:
>>>>> From: Jan Kiszka <jan.kis...@siemens.com>
>>>>>
>>>>> This adds rtdm_rt_capable(), a function that can be used by drivers to
>>>>> detect callers that could issue a service request also from the
>>>>> (typically preferred) real-time context. If that is the case, the driver
>>>>> can trigger a restart of the request if the current context is not
>>>>> real-time.
>>>>>
>>>>> CC: Philippe Gerum <r...@xenomai.org>
>>>>> CC: Alexis Berlemont <berlemont.h...@free.fr>
>>>>> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
>>>>> ---
>>>>>  include/rtdm/rtdm_driver.h |    6 ++++++
>>>>>  ksrc/skins/rtdm/drvlib.c   |   25 +++++++++++++++++++++++++
>>>>>  2 files changed, 31 insertions(+), 0 deletions(-)
>>>>>
>>>>> diff --git a/include/rtdm/rtdm_driver.h b/include/rtdm/rtdm_driver.h
>>>>> index 0fc1496..45be404 100644
>>>>> --- a/include/rtdm/rtdm_driver.h
>>>>> +++ b/include/rtdm/rtdm_driver.h
>>>>> @@ -1296,6 +1296,12 @@ static inline int rtdm_in_rt_context(void)
>>>>>  {
>>>>>   return (rthal_current_domain != rthal_root_domain);
>>>>>  }
>>>>> +
>>>>> +static inline int rtdm_rt_capable(void)
>>>>> +{
>>>>> + return xnpod_shadow_p();
>>>>> +}
>>>>> +
>>>> This won't do what your comment states; xnpod_shadow_p() would always
>>>> return false on behalf of a relaxed shadow, since it tests the status
>>>> bits of the current Xenomai thread, which has to be the root one in that
>>>> case. xnpod_shadow_p is to be used in primary context only, to
>>>> distinguish between kernel-based and userland Xenomai callers. 
>>>>
>>>> What you want is probably something like:
>>>>
>>>> static inline int rtdm_rt_capable(void)
>>>> {
>>>>    return xnshadow_thread(current) != NULL;
>>>> }
>>> Btw, the predicate as you defined it would not work over kernel-based
>>> Xenomai threads. rtdm_rt_capable() is ambiguous here.
>> (!xnpod_root_p() || xnshadow_thread(current) != NULL) ?
>>
>> That would also avoid dereferencing current in a potentially unsafe
>> context (if we still have such problematic archs).
> 
> Depending on how precise you want that predicate to be,
> 
> (!xnpod_asynch_p() && (!xnpod_root_p() || xnshadow_thread(current) !=
> NULL))
> 
> may be better, in a sense that it also excludes IRQ handlers and nucleus
> callouts.

IRQ handlers are not a valid invocation context (as documented). I don't
think it's worth bothering.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to