On Tue, Dec 31, 2019 at 04:35:59PM +0100, Martin Pieuchot wrote:
> Since I don't know C I'd appreciate any pointer about the checks that
> should be added to TIMESPEC_TO_NSEC().

Perhaps this way?

static inline uint64_t
TIMESPEC_TO_NSEC(const struct timespec *ts)
{
        if (ts->tv_sec > (UINT64_MAX - ts->tv_nsec) / 1000000000ULL)
                return UINT64_MAX;
        return ts->tv_sec * 1000000000ULL + ts->tv_nsec;
}

Should we use inline instead of __inline for new code?

bluhm

Index: sys/time.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/sys/time.h,v
retrieving revision 1.47
diff -u -p -r1.47 time.h
--- sys/time.h  22 Oct 2019 20:19:41 -0000      1.47
+++ sys/time.h  31 Dec 2019 16:38:20 -0000
@@ -177,7 +177,7 @@ struct bintime {
            (btp)->frac cmp (ctp)->frac :                               \
            (btp)->sec cmp (ctp)->sec)

-static __inline void
+static inline void
 bintimeaddfrac(const struct bintime *bt, uint64_t x, struct bintime *ct)
 {
        ct->sec = bt->sec;
@@ -186,7 +186,7 @@ bintimeaddfrac(const struct bintime *bt,
        ct->frac = bt->frac + x;
 }

-static __inline void
+static inline void
 bintimeadd(const struct bintime *bt, const struct bintime *ct,
     struct bintime *dt)
 {
@@ -196,7 +196,7 @@ bintimeadd(const struct bintime *bt, con
        dt->frac = bt->frac + ct->frac;
 }

-static __inline void
+static inline void
 bintimesub(const struct bintime *bt, const struct bintime *ct,
     struct bintime *dt)
 {
@@ -220,14 +220,14 @@ bintimesub(const struct bintime *bt, con
  *   time_second ticks after N.999999999 not after N.4999999999
  */

-static __inline void
+static inline void
 BINTIME_TO_TIMESPEC(const struct bintime *bt, struct timespec *ts)
 {
        ts->tv_sec = bt->sec;
        ts->tv_nsec = (long)(((uint64_t)1000000000 * (uint32_t)(bt->frac >> 
32)) >> 32);
 }

-static __inline void
+static inline void
 TIMESPEC_TO_BINTIME(const struct timespec *ts, struct bintime *bt)
 {
        bt->sec = ts->tv_sec;
@@ -235,14 +235,14 @@ TIMESPEC_TO_BINTIME(const struct timespe
        bt->frac = (uint64_t)ts->tv_nsec * (uint64_t)18446744073ULL;
 }

-static __inline void
+static inline void
 BINTIME_TO_TIMEVAL(const struct bintime *bt, struct timeval *tv)
 {
        tv->tv_sec = bt->sec;
        tv->tv_usec = (long)(((uint64_t)1000000 * (uint32_t)(bt->frac >> 32)) 
>> 32);
 }

-static __inline void
+static inline void
 TIMEVAL_TO_BINTIME(const struct timeval *tv, struct bintime *bt)
 {
        bt->sec = (time_t)tv->tv_sec;
@@ -332,14 +332,14 @@ void clock_secs_to_ymdhms(time_t, struct
 /* Traditional POSIX base year */
 #define POSIX_BASE_YEAR 1970

-static __inline void
+static inline void
 NSEC_TO_TIMEVAL(uint64_t ns, struct timeval *tv)
 {
        tv->tv_sec = ns / 1000000000L;
        tv->tv_usec = (ns % 1000000000L) / 1000;
 }

-static __inline void
+static inline void
 NSEC_TO_TIMESPEC(uint64_t ns, struct timespec *ts)
 {
        ts->tv_sec = ns / 1000000000L;
@@ -348,7 +348,7 @@ NSEC_TO_TIMESPEC(uint64_t ns, struct tim

 #include <sys/stdint.h>

-static __inline uint64_t
+static inline uint64_t
 SEC_TO_NSEC(uint64_t seconds)
 {
        if (seconds > UINT64_MAX / 1000000000ULL)
@@ -356,7 +356,7 @@ SEC_TO_NSEC(uint64_t seconds)
        return seconds * 1000000000ULL;
 }

-static __inline uint64_t
+static inline uint64_t
 MSEC_TO_NSEC(uint64_t milliseconds)
 {
        if (milliseconds > UINT64_MAX / 1000000ULL)
@@ -364,7 +364,7 @@ MSEC_TO_NSEC(uint64_t milliseconds)
        return milliseconds * 1000000ULL;
 }

-static __inline uint64_t
+static inline uint64_t
 USEC_TO_NSEC(uint64_t microseconds)
 {
        if (microseconds > UINT64_MAX / 1000ULL)

Reply via email to