25 #include <utils/time/time.h>
26 #include <utils/time/clock.h>
28 #include <core/exception.h>
29 #include <core/exceptions/software.h>
92 const unsigned int Time::TIMESTR_SIZE = 26;
100 __clock = Clock::instance();
101 __clock->get_time(&__time);
110 Time::Time(
const timeval* tv)
112 __time.tv_sec = tv->tv_sec;
113 __time.tv_usec = tv->tv_usec;
114 __clock = Clock::instance();
126 Time::Time(
long sec,
long usec,
Clock *clock)
129 __time.tv_usec = usec;
133 __clock = Clock::instance();
145 time_t sec = (time_t) (ms / 1000.0);
146 suseconds_t usec = (ms % 1000) * 1000;
149 __time.tv_usec = usec;
150 __clock = Clock::instance();
161 time_t sec = (time_t) s;
162 suseconds_t usec = (suseconds_t)roundf((s - sec) * 1000000.f);
165 __time.tv_usec = usec;
166 __clock = Clock::instance();
178 this->__clock = clock;
189 __time.tv_sec = t.__time.tv_sec;
190 __time.tv_usec = t.__time.tv_usec;
193 __timestr = (
char *)malloc(TIMESTR_SIZE);
194 strncpy(__timestr, t.__timestr, TIMESTR_SIZE);
206 __time.tv_sec = t->__time.tv_sec;
207 __time.tv_usec = t->__time.tv_usec;
208 __clock = t->__clock;
210 __timestr = (
char *)malloc(TIMESTR_SIZE);
211 strncpy(__timestr, t->__timestr, TIMESTR_SIZE);
221 if (__timestr) free(__timestr);
234 return ((
double)__time.tv_sec + (
double)__time.tv_usec / 1000000.);
242 Time::in_msec()
const
244 return (__time.tv_sec * 1000 + (
long) (__time.tv_usec / 1000));
252 Time::in_usec()
const
254 return (__time.tv_sec * 1000000 + __time.tv_usec);
262 Time::set_time(
const timeval* tv)
264 __time.tv_sec = tv->tv_sec;
265 __time.tv_usec = tv->tv_usec;
274 Time::set_time(
long int sec,
long int usec)
277 __time.tv_usec = usec;
285 Time::set_time(
long ms)
287 __time.tv_sec = (time_t) (ms / 1000.0);
288 __time.tv_usec = (ms % 1000) * 1000;
296 Time::set_time(
double s)
298 __time.tv_sec = (time_t)floor(s);
299 __time.tv_usec = (suseconds_t)(s - __time.tv_sec) * 1000000;
320 __time.tv_sec = t->__time.tv_sec;
321 __time.tv_usec = t->__time.tv_usec;
343 Time::add(
double seconds)
353 Time::operator+(
const Time& t)
const
356 if (__time.tv_usec + t.__time.tv_usec >= 1000000)
358 ret.__time.tv_usec = __time.tv_usec + t.__time.tv_usec - 1000000;
359 ret.__time.tv_sec = __time.tv_sec + t.__time.tv_sec + 1;
363 ret.__time.tv_usec = __time.tv_usec + t.__time.tv_usec;
364 ret.__time.tv_sec = __time.tv_sec + t.__time.tv_sec;
376 Time::operator+(
const Time* t)
const
387 Time::operator+(
const double sec)
const
390 time_t sec_only = (time_t)floor(sec);
391 suseconds_t usec_only = (suseconds_t)roundf((sec - sec_only) * 1000000);
392 if ((__time.tv_usec + usec_only) >= 1000000)
394 ret.__time.tv_usec = __time.tv_usec + usec_only - 1000000;
395 ret.__time.tv_sec = __time.tv_sec + sec_only + 1;
399 ret.__time.tv_usec = __time.tv_usec + usec_only;
400 ret.__time.tv_sec = __time.tv_sec + sec_only;
412 Time::operator+(
const long int usec)
const
415 if ( __time.tv_usec + usec >= 1000000 )
418 long int tmp_usec = __time.tv_usec + usec;
419 ret.__time.tv_usec = tmp_usec % 1000000;
420 ret.__time.tv_sec = __time.tv_sec + (tmp_usec / 1000000);
424 ret.__time.tv_sec = __time.tv_sec;
425 ret.__time.tv_usec += usec;
437 Time::operator-(
const Time& t)
const
440 if (__time.tv_usec < t.__time.tv_usec)
442 ret.__time.tv_usec = 1000000 + __time.tv_usec - t.__time.tv_usec;
443 ret.__time.tv_sec = __time.tv_sec - t.__time.tv_sec - 1;
447 ret.__time.tv_usec = __time.tv_usec - t.__time.tv_usec;
448 ret.__time.tv_sec = __time.tv_sec - t.__time.tv_sec;
460 Time::operator-(
const Time* t)
const
471 Time::operator-(
const double sec)
const
474 time_t sec_only = (time_t)floor(sec);
475 suseconds_t usec_only = (suseconds_t)roundf((sec - sec_only) * 1000000);
476 if (__time.tv_usec < usec_only)
478 ret.__time.tv_usec = 1000000 + __time.tv_usec - usec_only;
479 ret.__time.tv_sec = __time.tv_sec - sec_only - 1;
483 ret.__time.tv_usec = __time.tv_usec - usec_only;
484 ret.__time.tv_sec = __time.tv_sec - sec_only;
496 Time::operator-(
const long int usec)
const
499 time_t sec_only = usec / 1000000;
500 suseconds_t usec_only = usec % 1000000;
501 if (__time.tv_usec < usec_only)
503 ret.__time.tv_usec = 1000000 + __time.tv_usec - usec_only;
504 ret.__time.tv_sec = __time.tv_sec - sec_only - 1;
508 ret.__time.tv_usec = __time.tv_usec - usec_only;
509 ret.__time.tv_sec = __time.tv_sec - sec_only;
521 Time::operator+=(
const Time& t)
523 if (__time.tv_usec + t.__time.tv_usec >= 1000000)
525 __time.tv_usec += t.__time.tv_usec - 1000000;
526 __time.tv_sec += t.__time.tv_sec + 1;
530 __time.tv_usec += t.__time.tv_usec;
531 __time.tv_sec += t.__time.tv_sec;
543 Time::operator+=(
const long int usec)
545 if ( __time.tv_usec + usec >= 1000000 )
548 long int tmp_usec = __time.tv_usec + usec;
549 __time.tv_usec = tmp_usec % 1000000;
550 __time.tv_sec += tmp_usec / 1000000;
554 __time.tv_usec += usec;
566 Time::operator+=(
const double sec)
568 time_t sec_only = (time_t)floor(sec);
569 suseconds_t usec_only = (suseconds_t)roundf((sec - sec_only) * 1000000);
570 if ((__time.tv_usec + usec_only) >= 1000000)
572 __time.tv_usec += usec_only - 1000000;
573 __time.tv_sec += sec_only + 1;
577 __time.tv_usec += usec_only;
578 __time.tv_sec += sec_only;
590 Time::operator-=(
const Time& t)
602 Time::operator-=(
const double sec)
614 Time::operator-=(
const long int usec)
616 *
this = *
this - usec;
628 __time.tv_sec = t.__time.tv_sec;
629 __time.tv_usec = t.__time.tv_usec;
640 Time::operator==(
const Time& t)
const
642 return (__time.tv_sec == t.__time.tv_sec) &&
643 (__time.tv_usec == t.__time.tv_usec);
652 Time::operator==(
const Time* t)
const
654 return (__time.tv_sec == t->__time.tv_sec) &&
655 (__time.tv_usec == t->__time.tv_usec);
664 Time::operator!=(
const Time& t)
const
666 return (__time.tv_sec != t.__time.tv_sec) ||
667 (__time.tv_usec != t.__time.tv_usec);
676 Time::operator!=(
const Time* t)
const
678 return (__time.tv_sec != t->__time.tv_sec) ||
679 (__time.tv_usec != t->__time.tv_usec);
688 Time::operator>(
const Time& t)
const
690 return (__time.tv_sec > t.__time.tv_sec) ||
691 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec > t.__time.tv_usec));
700 Time::operator>(
const Time* t)
const
702 return (__time.tv_sec > t->__time.tv_sec) ||
703 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec > t->__time.tv_usec));
712 Time::operator>=(
const Time& t)
const
714 return (__time.tv_sec > t.__time.tv_sec) ||
715 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec >= t.__time.tv_usec));
724 Time::operator>=(
const Time* t)
const
726 return (__time.tv_sec > t->__time.tv_sec) ||
727 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec >= t->__time.tv_usec));
736 Time::operator<(
const Time& t)
const
738 return (__time.tv_sec < t.__time.tv_sec) ||
739 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec < t.__time.tv_usec));
748 Time::operator<(
const Time* t)
const
750 return (__time.tv_sec < t->__time.tv_sec) ||
751 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec < t->__time.tv_usec));
760 Time::operator<=(
const Time& t)
const
762 return (__time.tv_sec < t.__time.tv_sec) ||
763 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec <= t.__time.tv_usec));
772 Time::operator<=(
const Time* t)
const
774 return (__time.tv_sec < t->__time.tv_sec) ||
775 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec <= t->__time.tv_usec));
785 if ( NULL != __clock ) {
786 __clock->get_time(&__time);
788 throw Exception(
"Clock not set, cannot stamp time");
800 Time::stamp_systime()
802 if ( NULL != __clock ) {
803 __clock->get_systime(&__time);
805 throw Exception(
"Clock not set, cannot stamp time (systime)");
825 long int remaining_usec = (until - now).in_usec();
826 while ( remaining_usec > 0 ) {
827 usleep(remaining_usec);
829 remaining_usec = (until - now).in_usec();
846 __clock->get_systime(until);
849 __clock->get_systime(now);
854 long int remaining_usec = (until - now).in_usec();
855 while ( remaining_usec > 0 ) {
856 usleep(remaining_usec);
857 __clock->get_systime(now);
858 remaining_usec = (until - now).in_usec();
872 Time::str(
bool utc)
const
875 if ( ! __timestr ) __timestr = (
char *)malloc(TIMESTR_SIZE);
878 if (__time.tv_sec < 1000000000) {
879 snprintf(__timestr, TIMESTR_SIZE,
"%li:%li", __time.tv_sec, (
long)__time.tv_usec);
883 gmtime_r( &(__time.tv_sec), &time_tm );
885 localtime_r( &(__time.tv_sec), &time_tm );
887 asctime_r(&time_tm, __timestr);
888 __timestr[strlen(__timestr) - 1] = 0;
901 Time::str_r(
char *s,
bool utc)
904 if (__time.tv_sec < 1000000000) {
905 snprintf(s, TIMESTR_SIZE,
"%li:%li", __time.tv_sec, (
long)__time.tv_usec);
909 gmtime_r( &(__time.tv_sec), &time_tm );
911 localtime_r( &(__time.tv_sec), &time_tm );
913 asctime_r(&time_tm, s);
914 s[strlen(s) - 1] = 0;