X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcommon.c;h=7cc1d9d44e591f5a93a917016752350cf2d2a649;hb=a28ebbb8265605a09f0555d1eb036f50b9a784c8;hp=aeea28d3529e6b4ef766de64e4688adc10ca7e46;hpb=61c19cc11f325017d0186e9c345b6b4f01a4dc72;p=collectd.git diff --git a/src/common.c b/src/common.c index aeea28d3..7cc1d9d4 100644 --- a/src/common.c +++ b/src/common.c @@ -347,28 +347,56 @@ int escape_slashes (char *buf, int buf_len) return (0); } /* int escape_slashes */ -int timeval_sub_timespec (struct timeval *tv0, struct timeval *tv1, struct timespec *ret) +int timeval_cmp (struct timeval tv0, struct timeval tv1, struct timeval *delta) { - if ((tv0 == NULL) || (tv1 == NULL) || (ret == NULL)) - return (-2); + struct timeval *larger; + struct timeval *smaller; - if ((tv0->tv_sec < tv1->tv_sec) - || ((tv0->tv_sec == tv1->tv_sec) && (tv0->tv_usec < tv1->tv_usec))) - return (-1); + int status; - ret->tv_sec = tv0->tv_sec - tv1->tv_sec; - ret->tv_nsec = 1000 * ((long) (tv0->tv_usec - tv1->tv_usec)); + NORMALIZE_TIMEVAL (tv0); + NORMALIZE_TIMEVAL (tv1); - if (ret->tv_nsec < 0) + if ((tv0.tv_sec == tv1.tv_sec) && (tv0.tv_usec == tv1.tv_usec)) { - assert (ret->tv_sec > 0); + if (delta != NULL) { + delta->tv_sec = 0; + delta->tv_usec = 0; + } + return (0); + } - ret->tv_nsec += 1000000000; - ret->tv_sec -= 1; + if ((tv0.tv_sec < tv1.tv_sec) + || ((tv0.tv_sec == tv1.tv_sec) && (tv0.tv_usec < tv1.tv_usec))) + { + larger = &tv1; + smaller = &tv0; + status = -1; + } + else + { + larger = &tv0; + smaller = &tv1; + status = 1; } - return (0); -} + if (delta != NULL) { + delta->tv_sec = larger->tv_sec - smaller->tv_sec; + + if (smaller->tv_usec <= larger->tv_usec) + delta->tv_usec = larger->tv_usec - smaller->tv_usec; + else + { + --delta->tv_sec; + delta->tv_usec = 1000000 + larger->tv_usec - smaller->tv_usec; + } + } + + assert ((delta == NULL) + || ((0 <= delta->tv_usec) && (delta->tv_usec < 1000000))); + + return (status); +} /* int timeval_cmp */ int check_create_dir (const char *file_orig) {