1
0
mirror of https://github.com/wjwwood/serial.git synced 2026-01-23 04:04:54 +08:00

style changes to new/old timespec functions

This commit is contained in:
William Woodall 2013-10-15 11:45:53 -07:00
parent 9f63f4d2b5
commit 282b79efc6

View File

@ -54,13 +54,13 @@ using serial::IOException;
/* Timespec related functions provided by @mikepurvis of Clearpath Robotics */ /* Timespec related functions provided by @mikepurvis of Clearpath Robotics */
/*! Smooth over platform variances in getting an accurate timespec /* Smooth over platform variances in getting an accurate timespec
* representing the present moment. */ * representing the present moment. */
static inline struct timespec static inline struct timespec
timespec_now () timespec_now ()
{ {
struct timespec ts; struct timespec ts;
# ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time #ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock; clock_serv_t cclock;
mach_timespec_t mts; mach_timespec_t mts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock); host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
@ -68,78 +68,91 @@ timespec_now ()
mach_port_deallocate(mach_task_self(), cclock); mach_port_deallocate(mach_task_self(), cclock);
ts.tv_sec = mts.tv_sec; ts.tv_sec = mts.tv_sec;
ts.tv_nsec = mts.tv_nsec; ts.tv_nsec = mts.tv_nsec;
# else #else
clock_gettime(CLOCK_REALTIME, &ts); clock_gettime(CLOCK_REALTIME, &ts);
# endif #endif
return ts; return ts;
} }
/*! Simple function to normalize the tv_nsec field to [0..1e9), carrying /* Simple function to normalize the tv_nsec field to [0..1e9), carrying
* the remainder into the tv_sec field. This will not protect against the * the remainder into the tv_sec field. This will not protect against the
* possibility of an overflow in the nsec field--proceed with caution. */ * possibility of an overflow in the nsec field--proceed with caution. */
static inline void static inline void
normalize(struct timespec* ts) { normalize (struct timespec* ts)
while (ts->tv_nsec < 0) { {
while (ts->tv_nsec < 0)
{
ts->tv_nsec += 1e9; ts->tv_nsec += 1e9;
ts->tv_sec -= 1; ts->tv_sec -= 1;
} }
while (ts->tv_nsec >= 1e9) { while (ts->tv_nsec >= 1e9)
{
ts->tv_nsec -= 1e9; ts->tv_nsec -= 1e9;
ts->tv_sec += 1; ts->tv_sec += 1;
} }
} }
/*! Return a timespec which is the sum of two other timespecs. This /* Return a timespec which is the sum of two other timespecs. This
* operator only makes logical sense when one or both of the arguments * operator only makes logical sense when one or both of the arguments
* represents a duration. */ * represents a duration. */
static inline timespec static inline timespec
operator+ (const struct timespec &a, const struct timespec &b) { operator+ (const struct timespec &a, const struct timespec &b)
struct timespec result = { a.tv_sec + b.tv_sec, {
a.tv_nsec + b.tv_nsec }; struct timespec result = {
a.tv_sec + b.tv_sec,
a.tv_nsec + b.tv_nsec
};
normalize(&result); normalize(&result);
return result; return result;
} }
/*! Return a timespec which is the difference of two other timespecs. /* Return a timespec which is the difference of two other timespecs.
* This operator only makes logical sense when one or both of the arguments * This operator only makes logical sense when one or both of the arguments
* represents a duration. */ * represents a duration. */
static inline timespec static inline timespec
operator- (const struct timespec &a, const struct timespec &b) { operator- (const struct timespec &a, const struct timespec &b)
struct timespec result = { a.tv_sec - b.tv_sec, {
a.tv_nsec - b.tv_nsec }; struct timespec result = {
a.tv_sec - b.tv_sec,
a.tv_nsec - b.tv_nsec
};
normalize(&result); normalize(&result);
return result; return result;
} }
/*! Return a timespec which is a multiplication of a timespec and a positive /* Return a timespec which is a multiplication of a timespec and a positive
* integer. No overflow protection-- not suitable for multiplications with * integer. No overflow protection-- not suitable for multiplications with
* large carries, eg a <1s timespec multiplied by a large enough integer * large carries, eg a <1s timespec multiplied by a large enough integer
* that the result is muliple seconds. Only makes sense when the timespec * that the result is muliple seconds. Only makes sense when the timespec
* argument is a duration. */ * argument is a duration. */
static inline timespec static inline timespec
operator* (const struct timespec &ts, const size_t mul) { operator* (const struct timespec &ts, const size_t mul)
struct timespec result = { ts.tv_sec * mul, {
ts.tv_nsec * mul }; struct timespec result = {
ts.tv_sec * mul,
ts.tv_nsec * mul
};
normalize(&result); normalize(&result);
return result; return result;
} }
/*! Return whichever of two timespec durations represents the shortest or most /* Return whichever of two timespec durations represents the shortest or most
* negative period. */ * negative period. */
static inline struct timespec static inline struct timespec
min (const struct timespec &a, const struct timespec &b) { min (const struct timespec &a, const struct timespec &b)
if (a.tv_sec < b.tv_sec {
|| (a.tv_sec == b.tv_sec && a.tv_nsec < b.tv_nsec)) { if (a.tv_sec < b.tv_sec || (a.tv_sec == b.tv_sec && a.tv_nsec < b.tv_nsec))
{
return a; return a;
} else {
return b;
} }
return b;
} }
/*! Return a timespec duration set from a provided number of milliseconds. */ /* Return a timespec duration set from a provided number of milliseconds. */
static struct timespec static struct timespec
timespec_from_millis(const size_t millis) { timespec_from_millis (const size_t millis)
struct timespec result = { 0, millis * 1000000 }; {
struct timespec result = {0, millis * 1000000};
normalize(&result); normalize(&result);
return result; return result;
} }