#include "ucore/time.h" struct timeval * uc_tvadd(struct timeval *dst, const struct timeval *a, const struct timeval *b) { dst->tv_sec = a->tv_sec + b->tv_sec; dst->tv_usec = a->tv_usec + b->tv_usec; if (dst->tv_usec >= 1000000) { dst->tv_sec++; dst->tv_usec -= 1000000; } return dst; } struct timeval * uc_tvsub(struct timeval *dst, const struct timeval *a, const struct timeval *b) { dst->tv_sec = a->tv_sec - b->tv_sec; dst->tv_usec = a->tv_usec - b->tv_usec; if (dst->tv_usec < 0) { dst->tv_sec--; dst->tv_usec += 1000000; } return dst; } int uc_tvcmp(const struct timeval *a, const struct timeval *b) { if (a->tv_sec < b->tv_sec) return -1; else if (a->tv_sec > b->tv_sec) return 1; if (a->tv_usec < b->tv_usec) return -1; else if (a->tv_usec > b->tv_usec) return 1; return 0; } struct timespec * uc_tsadd(struct timespec *dst, const struct timespec *a, const struct timespec *b) { dst->tv_sec = a->tv_sec + b->tv_sec; dst->tv_nsec = a->tv_nsec + b->tv_nsec; if (dst->tv_nsec >= 1000000000) { dst->tv_sec++; dst->tv_nsec -= 1000000000; } return dst; } struct timespec * uc_tssub(struct timespec *dst, const struct timespec *a, const struct timespec *b) { dst->tv_sec = a->tv_sec - b->tv_sec; dst->tv_nsec = a->tv_nsec - b->tv_nsec; if (dst->tv_nsec < 0) { dst->tv_sec--; dst->tv_nsec += 1000000000; } return dst; } int uc_tscmp(const struct timespec *a, const struct timespec *b) { if (a->tv_sec < b->tv_sec) return -1; else if (a->tv_sec > b->tv_sec) return 1; if (a->tv_nsec < b->tv_nsec) return -1; else if (a->tv_nsec > b->tv_nsec) return 1; return 0; } struct timeval * uc_ms2tv(struct timeval *dst, uint64_t ms) { dst->tv_sec = ms / 1000; dst->tv_usec = ms % 1000 * 1000; return dst; }