On Mon, 2010-04-19 at 09:37 +0200, Philippe Gerum wrote: > 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
s,leave,live,g Interesting lapsus. > 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