From 37ad7e3bae090c8791dc638bfc3f952fb5c12acf Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Wed, 1 Mar 2017 11:34:02 +0000 Subject: [PATCH] timespec: Add timespec_to_msec helper Paralleling timespec_to_nsec, converts to milliseconds. Signed-off-by: Daniel Stone Reviewed-by: Pekka Paalanen [Pekka: added doc about flooring] Signed-off-by: Pekka Paalanen --- libweston/compositor.c | 2 +- shared/timespec-util.h | 13 +++++++++++++ tests/timespec-test.c | 9 +++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libweston/compositor.c b/libweston/compositor.c index 9ded23f3..2a9f476d 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -2388,7 +2388,7 @@ weston_output_finish_frame(struct weston_output *output, output->msc, presented_flags); - output->frame_time = stamp->tv_sec * 1000 + stamp->tv_nsec / 1000000; + output->frame_time = timespec_to_msec(stamp); weston_compositor_read_presentation_clock(compositor, &now); timespec_sub(&gone, &now, stamp); diff --git a/shared/timespec-util.h b/shared/timespec-util.h index 13948b1a..958adb05 100644 --- a/shared/timespec-util.h +++ b/shared/timespec-util.h @@ -93,6 +93,19 @@ timespec_to_nsec(const struct timespec *a) return (int64_t)a->tv_sec * NSEC_PER_SEC + a->tv_nsec; } +/* Convert timespec to milliseconds + * + * \param a timespec + * \return milliseconds + * + * Rounding to integer milliseconds happens always down (floor()). + */ +static inline int64_t +timespec_to_msec(const struct timespec *a) +{ + return (int64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000; +} + /* Convert milli-Hertz to nanoseconds * * \param mhz frequency in mHz, not zero diff --git a/tests/timespec-test.c b/tests/timespec-test.c index cd3b1c1a..712d1acd 100644 --- a/tests/timespec-test.c +++ b/tests/timespec-test.c @@ -60,6 +60,15 @@ ZUC_TEST(timespec_test, timespec_to_nsec) ZUC_ASSERT_EQ(timespec_to_nsec(&a), (NSEC_PER_SEC * 4ULL) + 4); } +ZUC_TEST(timespec_test, timespec_to_msec) +{ + struct timespec a; + + a.tv_sec = 4; + a.tv_nsec = 4000000; + ZUC_ASSERT_EQ(timespec_to_msec(&a), (4000ULL) + 4); +} + ZUC_TEST(timespec_test, millihz_to_nsec) { ZUC_ASSERT_EQ(millihz_to_nsec(60000), 16666666);