#ifndef _DB_CLOCK_H_
#define _DB_CLOCK_H_
#if defined(__cplusplus)
extern "C" {
#endif
typedef struct {
time_t tv_sec;
#ifdef HAVE_MIXED_SIZE_ADDRESSING
int32_t tv_nsec;
#else
long tv_nsec;
#endif
} db_timespec;
#undef timespecclear
#define timespecclear(tvp) ((tvp)->tv_sec = (tvp)->tv_nsec = 0)
#undef timespecisset
#define timespecisset(tvp) ((tvp)->tv_sec || (tvp)->tv_nsec)
#undef timespeccmp
#define timespeccmp(tvp, uvp, cmp) \
(((tvp)->tv_sec == (uvp)->tv_sec) ? \
((tvp)->tv_nsec cmp (uvp)->tv_nsec) : \
((tvp)->tv_sec cmp (uvp)->tv_sec))
#undef timespecadd
#define timespecadd(vvp, uvp) \
do { \
(vvp)->tv_sec += (uvp)->tv_sec; \
(vvp)->tv_nsec += (uvp)->tv_nsec; \
if ((vvp)->tv_nsec >= 1000000000) { \
(vvp)->tv_sec++; \
(vvp)->tv_nsec -= 1000000000; \
} \
} while (0)
#undef timespecsub
#define timespecsub(vvp, uvp) \
do { \
(vvp)->tv_sec -= (uvp)->tv_sec; \
(vvp)->tv_nsec -= (uvp)->tv_nsec; \
if ((vvp)->tv_nsec < 0) { \
(vvp)->tv_sec--; \
(vvp)->tv_nsec += 1000000000; \
} \
} while (0)
#undef timespecset
#define timespecset(vvp, sec, nsec) \
do { \
(vvp)->tv_sec = (time_t)(sec); \
(vvp)->tv_nsec = (long)(nsec); \
} while (0)
#define DB_TIMEOUT_TO_TIMESPEC(t, vvp) \
do { \
(vvp)->tv_sec = (time_t)((t) / 1000000); \
(vvp)->tv_nsec = (long)(((t) % 1000000) * 1000); \
} while (0)
#define DB_TIMESPEC_TO_TIMEOUT(t, vvp, prec) \
do { \
t = (u_long)((vvp)->tv_sec * 1000000); \
t += (u_long)((vvp)->tv_nsec / 1000); \
\
if (prec) \
t++; \
} while (0)
#define TIMESPEC_ADD_DB_TIMEOUT(vvp, t) \
do { \
db_timespec __tmp; \
DB_TIMEOUT_TO_TIMESPEC(t, &__tmp); \
timespecadd((vvp), &__tmp); \
} while (0)
#if defined(__cplusplus)
}
#endif
#endif