time-util.c revision 2f2244332687187931e9541e5ff312aa6c5aa705
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2008-2009 Dovecot authors, see the included COPYING file */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
2d49f150b4bce6f2f59a84e268e4777901c3e42cTimo Sirainen#include "time-util.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include <sys/time.h>
1dd875d96ab5640f78250079961c10e99ed4aa79Timo Sirainen
bb10ebcf076c959c752f583746d83805d7686df8Timo Sirainenint timeval_cmp(const struct timeval *tv1, const struct timeval *tv2)
ffd9a1898a18fadfc5dce399162c25d50548f905Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (tv1->tv_sec < tv2->tv_sec)
89b548af722113acb5d63dfffb44423cb60f91e4Timo Sirainen return -1;
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen if (tv1->tv_sec > tv2->tv_sec)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 1;
ac26a4607cb12b156f6a42f1ead2881bedd43d94Timo Sirainen if (tv1->tv_usec < tv2->tv_usec)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
66ae183b6e895216037bd921367670f4b0665911Timo Sirainen if (tv1->tv_usec > tv2->tv_usec)
e86d0d34fe365da4c7ca4312d575bfcbf3a01c0eTimo Sirainen return 1;
a2f250a332dfc1e6cd4ffd196c621eb9dbf7b8a1Timo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
da5d50534cfca45d0aaaf0bdac17b287b4588809Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint timeval_diff_msecs(const struct timeval *tv1, const struct timeval *tv2)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return timeval_diff_usecs(tv1, tv2) / 1000;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainen
31ddc75584c5cde53d2e78a737587f2e7fdcb0d2Timo Sirainenlong long timeval_diff_usecs(const struct timeval *tv1,
46c31f64b9f0949f00b7819f45b22f2d64b2ea27Timo Sirainen const struct timeval *tv2)
d6badc27cd6e8d3398877b6766cb0aaeef3a7800Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen time_t secs;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int usecs;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen secs = tv1->tv_sec - tv2->tv_sec;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen usecs = tv1->tv_usec - tv2->tv_usec;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (usecs < 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen secs--;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen usecs += 1000000;
024815ea2ffdda9ea79919f18e865663977f73eaTimo Sirainen }
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen return ((long long)secs * 1000000ULL) + usecs;
8fa41238067c854435884c459963fde6f8c6436bTimo Sirainen}
91dca97b367c54a139c268b56a0c67f564bd9197Timo Sirainen