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;
}


>  #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

Reply via email to