On Mon, 2010-04-19 at 09:31 +0200, Jan Kiszka wrote:
> 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.

No problem, I think the whole rtdm_rt_capable() approach leads to this
kind of ambiguity by design anyway. So people should leave with it and
use that predicate in high level handler code only, where the current
context can be assessed easily, not deep in their helpers or core
routines which might be traversed by a broader set of callers.

> 
> Jan
> 


-- 
Philippe.



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

Reply via email to