25 #include <utils/time/time.h> 26 #include <utils/time/clock.h> 28 #include <core/exception.h> 29 #include <core/exceptions/software.h> 112 __time.tv_sec = tv->tv_sec;
113 __time.tv_usec = tv->tv_usec;
129 __time.tv_usec = usec;
145 time_t sec = (time_t) (ms / 1000.0);
146 suseconds_t usec = (ms % 1000) * 1000;
149 __time.tv_usec = usec;
161 time_t sec = (time_t) s;
162 suseconds_t usec = (suseconds_t)roundf((s - sec) * 1000000.f);
165 __time.tv_usec = usec;
178 this->__clock = clock;
189 __time.tv_sec = t.__time.tv_sec;
190 __time.tv_usec = t.__time.tv_usec;
206 __time.tv_sec = t->__time.tv_sec;
207 __time.tv_usec = t->__time.tv_usec;
208 __clock = t->__clock;
221 if (__timestr) free(__timestr);
234 return ((
double)__time.tv_sec + (
double)__time.tv_usec / 1000000.);
244 return (__time.tv_sec * 1000 + (
long) (__time.tv_usec / 1000));
254 return (__time.tv_sec * 1000000 + __time.tv_usec);
264 __time.tv_sec = tv->tv_sec;
265 __time.tv_usec = tv->tv_usec;
277 __time.tv_usec = usec;
287 __time.tv_sec = (time_t) (ms / 1000.0);
288 __time.tv_usec = (ms % 1000) * 1000;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
616 *
this = *
this - usec;
628 __time.tv_sec = t.__time.tv_sec;
629 __time.tv_usec = t.__time.tv_usec;
642 return (__time.tv_sec == t.__time.tv_sec) &&
643 (__time.tv_usec == t.__time.tv_usec);
654 return (__time.tv_sec == t->__time.tv_sec) &&
655 (__time.tv_usec == t->__time.tv_usec);
666 return (__time.tv_sec != t.__time.tv_sec) ||
667 (__time.tv_usec != t.__time.tv_usec);
678 return (__time.tv_sec != t->__time.tv_sec) ||
679 (__time.tv_usec != t->__time.tv_usec);
690 return (__time.tv_sec > t.__time.tv_sec) ||
691 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec > t.__time.tv_usec));
702 return (__time.tv_sec > t->__time.tv_sec) ||
703 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec > t->__time.tv_usec));
714 return (__time.tv_sec > t.__time.tv_sec) ||
715 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec >= t.__time.tv_usec));
726 return (__time.tv_sec > t->__time.tv_sec) ||
727 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec >= t->__time.tv_usec));
738 return (__time.tv_sec < t.__time.tv_sec) ||
739 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec < t.__time.tv_usec));
750 return (__time.tv_sec < t->__time.tv_sec) ||
751 ((__time.tv_sec == t->__time.tv_sec) && (__time.tv_usec < t->__time.tv_usec));
762 return (__time.tv_sec < t.__time.tv_sec) ||
763 ((__time.tv_sec == t.__time.tv_sec) && (__time.tv_usec <= t.__time.tv_usec));
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 ) {
788 throw Exception(
"Clock not set, cannot stamp time");
802 if ( NULL != __clock ) {
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();
854 long int remaining_usec = (until - now).
in_usec();
855 while ( remaining_usec > 0 ) {
856 usleep(remaining_usec);
858 remaining_usec = (until - now).
in_usec();
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;
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;
static const unsigned int TIMESTR_SIZE
Maximum size of string returned by str() and the minimum size of the string passwd to str_r()...
Time & operator=(const Time &t)
Assign operator.
double in_sec() const
Convet time to seconds.
Time & operator-=(const Time &t)
-= operator.
static Clock * instance()
Clock initializer.
const char * str(bool utc=false) const
Output function.
void get_time(struct timeval *tv) const
Returns the time of the selected time source.
Time & stamp_systime()
Set this time to the current system time.
bool operator<=(const Time &t) const
Less than or equal to operator.
Fawkes library namespace.
void get_systime(struct timeval *tv) const
Returns the system time.
This is supposed to be the central clock in Fawkes.
Time & operator+=(const long int usec)
+= operator
A class for handling time.
A NULL pointer was supplied where not allowed.
bool operator<(const Time &t) const
Less than operator.
void str_r(char *s, bool utc=false)
Output function.
bool operator==(const Time &t) const
Check equality of times.
void wait()
Wait (sleep) for this time.
void wait_systime()
Wait (sleep) for this system time.
Time operator-(const Time &t) const
Operator that substracts one Time from another.
const Time TIME_MIN
Instance of Time denoting the minimum value possible.
long in_msec() const
Convert the stored time into milli-seconds.
void add(double seconds)
Add seconds.
Base class for exceptions in Fawkes.
void set_clock(Clock *clock)
Set clock for this instance.
bool operator>=(const Time &t) const
Greater than or equal to operator.
double time_diff_sec(const timeval &a, const timeval &b)
Calculate time difference of two time structs.
const Time TIME_MAX
Instance of Time denoting the maximum value possible.
void set_time(const timeval *tv)
Sets the time.
bool operator>(const Time &t) const
Greater than operator.
Time operator+(const double sec) const
Operator that adds times.
long in_usec() const
Convert the stored time into micro-seconds.
Time & stamp()
Set this time to the current time.
bool operator!=(const Time &t) const
Check inequality of times.