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. > > > > #endif /* !DOXYGEN_CPP */ > > > > int rtdm_exec_in_rt(struct rtdm_dev_context *context, > > diff --git a/ksrc/skins/rtdm/drvlib.c b/ksrc/skins/rtdm/drvlib.c > > index 3b04493..6e26501 100644 > > --- a/ksrc/skins/rtdm/drvlib.c > > +++ b/ksrc/skins/rtdm/drvlib.c > > @@ -2341,6 +2341,31 @@ int rtdm_strncpy_from_user(rtdm_user_info_t > > *user_info, char *dst, > > */ > > int rtdm_in_rt_context(void); > > > > +/** > > + * Test if the caller is capable of running in real-time context > > + * > > + * @return Non-zero is returned if the caller is able to execute in > > real-time > > + * context (independent of its current execution mode), 0 otherwise. > > + * > > + * @note This function can be used by drivers that provide different > > + * implementations for the same service depending on the execution mode of > > + * the caller. If a caller requests such a service in non-real-time context > > + * but is capable of running in real-time as well, it might be appropriate > > + * for the driver to reject the request via -ENOSYS so that RTDM can switch > > + * the caller and restart the request in real-time context. > > + * > > + * Environments: > > + * > > + * This service can be called from: > > + * > > + * - Kernel module initialization/cleanup code > > + * - Kernel-based task > > + * - User-space task (RT, non-RT) > > + * > > + * Rescheduling: never. > > + */ > > +int rtdm_rt_capable(void); > > + > > #endif /* DOXYGEN_CPP */ > > > > /** @} Utility Services */ > > -- Philippe. _______________________________________________ Xenomai-core mailing list Xenomai-core@gna.org https://mail.gna.org/listinfo/xenomai-core