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

Reply via email to