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.

> 
> Jan
> 


-- 
Philippe.



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

Reply via email to