timespec: Add timespec subtraction helpers

Add helpers to subtract two timespecs, then return the difference in
either milliseconds or nanoseconds. These will be used to compare
timestamps during the repaint cycle.

Signed-off-by: Daniel Stone <daniels@collabora.com>
Suggested-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
dev
Daniel Stone 8 years ago committed by Pekka Paalanen
parent 37ad7e3bae
commit 839b63546d
  1. 26
      shared/timespec-util.h
  2. 22
      tests/timespec-test.c

@ -93,6 +93,20 @@ timespec_to_nsec(const struct timespec *a)
return (int64_t)a->tv_sec * NSEC_PER_SEC + a->tv_nsec; return (int64_t)a->tv_sec * NSEC_PER_SEC + a->tv_nsec;
} }
/* Subtract timespecs and return result in nanoseconds
*
* \param a[in] operand
* \param b[in] operand
* \return to_nanoseconds(a - b)
*/
static inline int64_t
timespec_sub_to_nsec(const struct timespec *a, const struct timespec *b)
{
struct timespec r;
timespec_sub(&r, a, b);
return timespec_to_nsec(&r);
}
/* Convert timespec to milliseconds /* Convert timespec to milliseconds
* *
* \param a timespec * \param a timespec
@ -106,6 +120,18 @@ timespec_to_msec(const struct timespec *a)
return (int64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000; return (int64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000;
} }
/* Subtract timespecs and return result in milliseconds
*
* \param a[in] operand
* \param b[in] operand
* \return to_milliseconds(a - b)
*/
static inline int64_t
timespec_sub_to_msec(const struct timespec *a, const struct timespec *b)
{
return timespec_sub_to_nsec(a, b) / 1000000;
}
/* Convert milli-Hertz to nanoseconds /* Convert milli-Hertz to nanoseconds
* *
* \param mhz frequency in mHz, not zero * \param mhz frequency in mHz, not zero

@ -142,3 +142,25 @@ ZUC_TEST(timespec_test, timespec_add_msec)
ZUC_ASSERT_EQ(1002, r.tv_sec); ZUC_ASSERT_EQ(1002, r.tv_sec);
ZUC_ASSERT_EQ(2000001, r.tv_nsec); ZUC_ASSERT_EQ(2000001, r.tv_nsec);
} }
ZUC_TEST(timespec_test, timespec_sub_to_nsec)
{
struct timespec a, b;
a.tv_sec = 1000;
a.tv_nsec = 1;
b.tv_sec = 1;
b.tv_nsec = 2;
ZUC_ASSERT_EQ((999L * NSEC_PER_SEC) - 1, timespec_sub_to_nsec(&a, &b));
}
ZUC_TEST(timespec_test, timespec_sub_to_msec)
{
struct timespec a, b;
a.tv_sec = 1000;
a.tv_nsec = 2000000L;
b.tv_sec = 2;
b.tv_nsec = 1000000L;
ZUC_ASSERT_EQ((998 * 1000) + 1, timespec_sub_to_msec(&a, &b));
}

Loading…
Cancel
Save