Module: xenomai-forge Branch: master Commit: 3d43735528324673626b306f6bb40b42cd5abed6 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=3d43735528324673626b306f6bb40b42cd5abed6
Author: Philippe Gerum <r...@xenomai.org> Date: Wed Sep 24 12:10:08 2014 +0200 copperplate/clockobj, alchemy: sanitize clockobj_get_time() interface --- include/alchemy/timer.h | 19 +++++++++++++++++ include/copperplate/clockobj.h | 3 +-- lib/alchemy/task.c | 2 +- lib/alchemy/timer.c | 26 ++--------------------- lib/copperplate/clockobj.c | 46 ++++++++++++---------------------------- 5 files changed, 37 insertions(+), 59 deletions(-) diff --git a/include/alchemy/timer.h b/include/alchemy/timer.h index c85d80f..fc33db9 100644 --- a/include/alchemy/timer.h +++ b/include/alchemy/timer.h @@ -99,6 +99,25 @@ int alchemy_poll_mode(const struct timespec *abs_timeout) extern "C" { #endif +/** + * @fn RTIME rt_timer_read(void) + * @brief Return the current system time. + * + * Return the current time maintained by the Xenomai core clock. + * + * @return The current time expressed in clock ticks (see note). + * + * @apitags{unrestricted} + * + * @note The @a time value is a multiple of the Alchemy clock + * resolution (see --alchemy-clock-resolution option, defaults to 1 + * nanosecond). + */ +static inline RTIME rt_timer_read(void) +{ + return clockobj_get_time(&alchemy_clock); +} + static inline RTIME rt_timer_tsc(void) { return clockobj_get_tsc(); diff --git a/include/copperplate/clockobj.h b/include/copperplate/clockobj.h index 1543589..f480214 100644 --- a/include/copperplate/clockobj.h +++ b/include/copperplate/clockobj.h @@ -71,8 +71,7 @@ void clockobj_set_date(struct clockobj *clkobj, ticks_t ticks); void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks); -void clockobj_get_time(struct clockobj *clkobj, - ticks_t *pticks, ticks_t *ptsc); +ticks_t clockobj_get_time(struct clockobj *clkobj); void clockobj_get_distance(struct clockobj *clkobj, const struct itimerspec *itm, diff --git a/lib/alchemy/task.c b/lib/alchemy/task.c index bd309c9..c9ec272 100644 --- a/lib/alchemy/task.c +++ b/lib/alchemy/task.c @@ -959,7 +959,7 @@ int rt_task_sleep_until(RTIME date) if (date == TM_INFINITE) ts = zero_time; else { - clockobj_get_time(&alchemy_clock, &now, NULL); + now = clockobj_get_time(&alchemy_clock); if (date <= now) return -ETIMEDOUT; CANCEL_DEFER(svc); diff --git a/lib/alchemy/timer.c b/lib/alchemy/timer.c index dfe4f6d..323273c 100644 --- a/lib/alchemy/timer.c +++ b/lib/alchemy/timer.c @@ -31,29 +31,6 @@ struct clockobj alchemy_clock; /** - * @fn RTIME rt_timer_read(void) - * @brief Return the current system time. - * - * Return the current time maintained by the Xenomai core clock. - * - * @return The current time expressed in clock ticks (see note). - * - * @apitags{unrestricted} - * - * @note The @a time value is a multiple of the Alchemy clock - * resolution (see --alchemy-clock-resolution option, defaults to 1 - * nanosecond). - */ -RTIME rt_timer_read(void) -{ - ticks_t ticks; - - clockobj_get_time(&alchemy_clock, &ticks, NULL); - - return ticks; -} - -/** * @fn RTIME rt_timer_ns2ticks(SRTIME ns) * @brief Convert nanoseconds to Alchemy clock ticks. * @@ -113,7 +90,8 @@ SRTIME rt_timer_ticks2ns(SRTIME ticks) int rt_timer_inquire(RT_TIMER_INFO *info) { info->period = clockobj_get_resolution(&alchemy_clock); - clockobj_get_time(&alchemy_clock, &info->date, &info->tsc); + info->date = clockobj_get_time(&alchemy_clock); + info->tsc = clockobj_get_tsc(); return 0; } diff --git a/lib/copperplate/clockobj.c b/lib/copperplate/clockobj.c index 1b6f5f6..8ee3ed7 100644 --- a/lib/copperplate/clockobj.c +++ b/lib/copperplate/clockobj.c @@ -237,21 +237,18 @@ ticks_t clockobj_get_tsc(void) { struct timespec now; - /* Rare case with legacy uClibc+linuxthreads combo. */ + /* + * Rare case with legacy uClibc+linuxthreads combo over + * Cobalt, we actually return nanoseconds just like in the + * Mercury case. + */ __RT(clock_gettime(CLOCK_REALTIME, &now)); return xnarch_ullmul(now.tv_sec, 1000000000) + now.tv_nsec; } -void clockobj_get_time(struct clockobj *clkobj, - ticks_t *pticks, ticks_t *ptsc) +ticks_t clockobj_get_time(struct clockobj *clkobj) { - ticks_t ns; - - ns = clockobj_get_tsc(); - if (ptsc) - *ptsc = ns; - - *pticks = clockobj_ns_to_ticks(clkobj, ns); + return clockobj_ns_to_ticks(clkobj, clockobj_get_tsc()); } #else /* !CONFIG_XENO_COPPERPLATE_CLOCK_RESTRICTED */ @@ -266,17 +263,10 @@ ticks_t clockobj_get_tsc(void) return cobalt_read_tsc(); } -void clockobj_get_time(struct clockobj *clkobj, - ticks_t *pticks, ticks_t *ptsc) +ticks_t clockobj_get_time(struct clockobj *clkobj) { - ticks_t ns, tsc; - - tsc = cobalt_read_tsc(); - if (ptsc) - *ptsc = tsc; - - ns = cobalt_ticks_to_ns_rounded(tsc); - *pticks = clockobj_ns_to_ticks(clkobj, ns); + ticks_t ns = cobalt_ticks_to_ns_rounded(cobalt_read_tsc()); + return clockobj_ns_to_ticks(clkobj, ns); } #endif /* !CONFIG_XENO_COPPERPLATE_CLOCK_RESTRICTED */ @@ -326,8 +316,7 @@ sticks_t clockobj_ns_to_ticks(struct clockobj *clkobj, sticks_t ns) #endif /* !CONFIG_XENO_LORES_CLOCK_DISABLED */ -void clockobj_get_time(struct clockobj *clkobj, ticks_t *pticks, - ticks_t *ptsc) +ticks_t clockobj_get_time(struct clockobj *clkobj) { struct timespec now; @@ -335,17 +324,10 @@ void clockobj_get_time(struct clockobj *clkobj, ticks_t *pticks, /* Convert the time value to ticks, with no offset. */ if (clockobj_get_resolution(clkobj) > 1) - *pticks = (ticks_t)now.tv_sec * clockobj_get_frequency(clkobj) + return (ticks_t)now.tv_sec * clockobj_get_frequency(clkobj) + (ticks_t)now.tv_nsec / clockobj_get_resolution(clkobj); - else - *pticks = timespec_scalar(&now); - /* - * Mercury has a single time source, with TSC == monotonic - * time. - */ - if (ptsc) - *ptsc = *pticks; + return timespec_scalar(&now); } void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks) @@ -391,7 +373,7 @@ void clockobj_get_distance(struct clockobj *clkobj, { ticks_t now, start, interval, dist; - clockobj_get_time(clkobj, &now, NULL); + now = clockobj_get_time(clkobj); start = timespec_scalar(&itm->it_value); if (start >= now) _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git