Changeset da7fe39 for src/libcfa/time
- Timestamp:
- Apr 23, 2018, 12:57:46 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 57acae0
- Parents:
- ba89e9b7 (diff), c8ad5d9 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/libcfa/time (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/time
rba89e9b7 rda7fe39 1 1 // 2 // Cforall Version 1.0.0 Copyright (C) 201 6University of Waterloo2 // Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo 3 3 // 4 4 // The contents of this file are covered under the licence agreement in the 5 5 // file "LICENCE" distributed with Cforall. 6 6 // 7 // calendar--7 // time -- 8 8 // 9 9 // Author : Peter A. Buhr 10 10 // Created On : Wed Mar 14 23:18:57 2018 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Mar 22 17:11:19201813 // Update Count : 49512 // Last Modified On : Sat Apr 14 17:48:23 2018 13 // Update Count : 636 14 14 // 15 15 … … 19 19 // http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0355r5.html#refcc 20 20 21 #include <time.h> 21 #include <time.h> // timespec 22 22 extern "C" { 23 #include <sys/time.h> 24 int snprintf( char * buf, size_t size, const char * fmt, ... ); 23 #include <sys/time.h> // timeval 25 24 } 26 #include <fstream> 27 28 enum { 29 CLOCKGRAN = 15_000_000L, // ALWAYS in nanoseconds, MUST BE less than 1 second 30 TIMEGRAN = 1_000_000_000L // nanosecond granularity, except for timeval 31 }; 32 33 34 #if defined( REALTIME_POSIX ) 35 #define tv_XSEC tv_nsec 36 #else 37 #define tv_XSEC tv_usec 38 #endif 39 40 41 #if defined( __linux__ ) 42 // fake a few things 43 #define CLOCK_REALTIME 0 // real (clock on the wall) time 44 #endif 45 46 // conversions for existing time types 47 static inline void ?{}( timeval & t ) {} 48 static inline void ?{}( timeval & t, time_t sec ) { t.tv_sec = sec; t.tv_usec = 0; } 49 static inline void ?{}( timeval & t, time_t sec, suseconds_t usec ) { t.tv_sec = sec; t.tv_usec = usec; } 50 51 static inline void ?{}( timespec & t ) {} 52 static inline void ?{}( timespec & t, time_t sec ) { t.tv_sec = sec; t.tv_nsec = 0; } 53 static inline void ?{}( timespec & t, time_t sec, __syscall_slong_t nsec ) { t.tv_sec = sec; t.tv_nsec = nsec; } 54 55 static inline char * ctime( time_t tp ) { char * buf = ctime( &tp ); buf[24] = '\0'; return buf; } 56 static inline char * ctime_r( time_t tp, char * buf ) { ctime_r( &tp, buf ); buf[24] = '\0'; return buf; } 57 static inline tm * gmtime( time_t tp ) { return gmtime( &tp ); } 58 static inline tm * gmtime_r( time_t tp, tm * result ) { return gmtime_r( &tp, result ); } 59 static inline tm * localtime( time_t tp ) { return localtime( &tp ); } 60 static inline tm * localtime_r( time_t tp, tm * result ) { return localtime_r( &tp, result ); } 25 #include <time_t.h> // Duration/Time types 26 27 enum { TIMEGRAN = 1_000_000_000LL }; // nanosecond granularity, except for timeval 61 28 62 29 63 30 //######################### Duration ######################### 64 31 65 struct Duration { 66 int64_t tv; 67 }; 68 69 static inline void ?{}( Duration & dur ) with( dur ) { tv = 0; } 70 static inline void ?{}( Duration & dur, Duration d ) with( dur ) { tv = d.tv; } 71 72 static inline void ?{}( Duration & dur, timeval t ) with( dur ) { 73 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; 74 } // Duration 75 76 static inline void ?{}( Duration & dur, timespec t ) with( dur ) { 77 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; 78 } // Duration 79 80 static inline Duration ?=?( Duration & dur, timeval t ) with( dur ) { 81 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; 82 return dur; 83 } // ?=? 84 85 static inline Duration ?=?( Duration & dur, timespec t ) with( dur ) { 86 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; 87 return dur; 88 } // ?=? timespec 89 90 static inline void ?{}( timeval & t, Duration dur ) with( dur ) { 91 t.tv_sec = tv / TIMEGRAN; // seconds 92 t.tv_usec = tv % TIMEGRAN / ( TIMEGRAN / 1000000L ); // microseconds 93 } // ?{} 94 95 static inline void ?{}( timespec & t, Duration dur ) with( dur ) { 96 t.tv_sec = tv / TIMEGRAN; // seconds 97 t.tv_nsec = tv % TIMEGRAN; // nanoseconds 98 } // Timespec 99 100 static inline int64_t nsecs( Duration dur ) with( dur ) { return tv; } 32 static inline Duration ?=?( Duration & dur, zero_t ) { return dur{ 0 }; } 101 33 102 34 static inline Duration +?( Duration rhs ) with( rhs ) { return (Duration)@{ +tv }; } … … 112 44 static inline Duration ?*=?( Duration & lhs, int64_t rhs ) { lhs = lhs * rhs; return lhs; } 113 45 46 static inline int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tv / rhs.tv; } 114 47 static inline Duration ?/?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv / rhs }; } 115 static inline int64_t ?/?( Duration lhs, Duration rhs ) { return lhs.tv / rhs.tv; }116 48 static inline Duration ?/=?( Duration & lhs, int64_t rhs ) { lhs = lhs / rhs; return lhs; } 117 118 static inline Duration ?%?( Duration lhs, int64_t rhs ) { return (Duration)@{ lhs.tv % rhs }; } 119 static inline int64_t ?%?( int64_t lhs, Duration rhs ) { return lhs % (rhs.tv / TIMEGRAN); }120 static inline int64_t ?%?( Duration lhs, Duration rhs ) { return lhs.tv % rhs.tv; }49 static inline double div( Duration lhs, Duration rhs ) { return (double)lhs.tv / (double)rhs.tv; } 50 51 static inline Duration ?%?( Duration lhs, Duration rhs ) { return (Duration)@{ lhs.tv % rhs.tv }; } 52 static inline Duration ?%=?( Duration & lhs, Duration rhs ) { lhs = lhs % rhs; return lhs; } 121 53 122 54 static inline _Bool ?==?( Duration lhs, Duration rhs ) { return lhs.tv == rhs.tv; } 123 55 static inline _Bool ?!=?( Duration lhs, Duration rhs ) { return lhs.tv != rhs.tv; } 124 static inline _Bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tv <rhs.tv; }56 static inline _Bool ?<? ( Duration lhs, Duration rhs ) { return lhs.tv < rhs.tv; } 125 57 static inline _Bool ?<=?( Duration lhs, Duration rhs ) { return lhs.tv <= rhs.tv; } 126 static inline _Bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tv >rhs.tv; }58 static inline _Bool ?>? ( Duration lhs, Duration rhs ) { return lhs.tv > rhs.tv; } 127 59 static inline _Bool ?>=?( Duration lhs, Duration rhs ) { return lhs.tv >= rhs.tv; } 128 60 129 static inline Duration abs( Duration lhs ) { 130 return lhs.tv >= 0 ? lhs : -lhs; 131 } // abs 132 133 static inline forall( dtype ostype | ostream( ostype ) ) 134 ostype & ?|?( ostype & os, Duration dur ) with( dur ) { 135 os | tv / TIMEGRAN; 136 char buf[16]; 137 snprintf( buf, 16, "%09ld", ((tv < 0 ? -tv : tv) % TIMEGRAN) ); 138 int i; 139 for ( i = 8; i >= 0 && buf[i] == '0' ; i -= 1 ); // find least significant digit 140 if ( i != -1 ) { buf[i + 1] = '\0'; os | '.' | buf; } 141 return os; 142 } 61 static inline _Bool ?==?( Duration lhs, zero_t ) { return lhs.tv == 0; } 62 static inline _Bool ?!=?( Duration lhs, zero_t ) { return lhs.tv != 0; } 63 static inline _Bool ?<? ( Duration lhs, zero_t ) { return lhs.tv < 0; } 64 static inline _Bool ?<=?( Duration lhs, zero_t ) { return lhs.tv <= 0; } 65 static inline _Bool ?>? ( Duration lhs, zero_t ) { return lhs.tv > 0; } 66 static inline _Bool ?>=?( Duration lhs, zero_t ) { return lhs.tv >= 0; } 67 68 static inline Duration abs( Duration rhs ) { return rhs.tv >= 0 ? rhs : -rhs; } 143 69 144 70 static inline Duration ?`ns( int64_t nsec ) { return (Duration)@{ nsec }; } 145 static inline Duration ?`us( int64_t usec ) { return (Duration)@{ usec * (TIMEGRAN / 1_000l) }; } 146 static inline Duration ?`ms( int64_t msec ) { return (Duration)@{ msec * (TIMEGRAN / 1_000_000l) }; } 147 static inline Duration ?`s ( int64_t sec ) { return (Duration)@{ sec * TIMEGRAN }; } 148 static inline Duration ?`s ( double sec ) { return (Duration)@{ sec * TIMEGRAN }; } 149 static inline Duration ?`m ( int64_t min ) { return (Duration)@{ min * (60L * TIMEGRAN) }; } 150 static inline Duration ?`m ( double min ) { return (Duration)@{ min * (60L * TIMEGRAN) }; } 151 static inline Duration ?`h ( int64_t hours ) { return (Duration)@{ hours * (3600L * TIMEGRAN) }; } 152 static inline Duration ?`h ( double hours ) { return (Duration)@{ hours * (3600L * TIMEGRAN) }; } 153 static inline Duration ?`d ( int64_t days ) { return (Duration)@{ days * (24L * 3600L * TIMEGRAN) }; } 154 static inline Duration ?`d ( double days ) { return (Duration)@{ days * (24L * 3600L * TIMEGRAN) }; } 155 static inline Duration ?`w ( int64_t weeks ) { return (Duration)@{ weeks * (7L * 24L * 3600L * TIMEGRAN) }; } 156 static inline Duration ?`f ( int64_t fortnight ) { return (Duration)@{ fortnight * (14L * 24L * 3600L * TIMEGRAN) }; } 157 158 static inline int64_t ?`s ( Duration dur ) { return dur.tv / TIMEGRAN; } 159 static inline int64_t ?`m ( Duration dur ) { return dur.tv / (60L * TIMEGRAN); } 160 static inline int64_t ?`h ( Duration dur ) { return dur.tv / (3600L * TIMEGRAN); } 161 static inline int64_t ?`d ( Duration dur ) { return dur.tv / (24L * 3600L * TIMEGRAN); } 162 static inline int64_t ?`w ( Duration dur ) { return dur.tv / (7L * 24L * 3600L * TIMEGRAN); } 163 static inline int64_t ?`f ( Duration dur ) { return dur.tv / (14L * 24L * 3600L * TIMEGRAN); } 71 static inline Duration ?`us( int64_t usec ) { return (Duration)@{ usec * (TIMEGRAN / 1_000_000LL) }; } 72 static inline Duration ?`ms( int64_t msec ) { return (Duration)@{ msec * (TIMEGRAN / 1_000LL) }; } 73 static inline Duration ?`s( int64_t sec ) { return (Duration)@{ sec * TIMEGRAN }; } 74 static inline Duration ?`s( double sec ) { return (Duration)@{ sec * TIMEGRAN }; } 75 static inline Duration ?`m( int64_t min ) { return (Duration)@{ min * (60LL * TIMEGRAN) }; } 76 static inline Duration ?`m( double min ) { return (Duration)@{ min * (60LL * TIMEGRAN) }; } 77 static inline Duration ?`h( int64_t hours ) { return (Duration)@{ hours * (60LL * 60LL * TIMEGRAN) }; } 78 static inline Duration ?`h( double hours ) { return (Duration)@{ hours * (60LL * 60LL * TIMEGRAN) }; } 79 static inline Duration ?`d( int64_t days ) { return (Duration)@{ days * (24LL * 60LL * 60LL * TIMEGRAN) }; } 80 static inline Duration ?`d( double days ) { return (Duration)@{ days * (24LL * 60LL * 60LL * TIMEGRAN) }; } 81 static inline Duration ?`w( int64_t weeks ) { return (Duration)@{ weeks * (7LL * 24LL * 60LL * 60LL * TIMEGRAN) }; } 82 static inline Duration ?`w( double weeks ) { return (Duration)@{ weeks * (7LL * 24LL * 60LL * 60LL * TIMEGRAN) }; } 83 84 static inline int64_t ?`ns( Duration dur ) { return dur.tv; } 85 static inline int64_t ?`us( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000_000LL); } 86 static inline int64_t ?`ms( Duration dur ) { return dur.tv / (TIMEGRAN / 1_000LL); } 87 static inline int64_t ?`s( Duration dur ) { return dur.tv / TIMEGRAN; } 88 static inline int64_t ?`m( Duration dur ) { return dur.tv / (60LL * TIMEGRAN); } 89 static inline int64_t ?`h( Duration dur ) { return dur.tv / (60LL * 60LL * TIMEGRAN); } 90 static inline int64_t ?`d( Duration dur ) { return dur.tv / (24LL * 60LL * 60LL * TIMEGRAN); } 91 static inline int64_t ?`w( Duration dur ) { return dur.tv / (7LL * 24LL * 60LL * 60LL * TIMEGRAN); } 92 93 94 //######################### C timeval ######################### 95 96 static inline void ?{}( timeval & t ) {} 97 static inline void ?{}( timeval & t, time_t sec, suseconds_t usec ) { t.tv_sec = sec; t.tv_usec = usec; } 98 static inline void ?{}( timeval & t, time_t sec ) { t{ sec, 0 }; } 99 static inline void ?{}( timeval & t, zero_t ) { t{ 0, 0 }; } 100 static inline timeval ?=?( timeval & t, zero_t ) { return t{ 0 }; } 101 static inline timeval ?+?( timeval & lhs, timeval rhs ) { return (timeval)@{ lhs.tv_sec + rhs.tv_sec, lhs.tv_usec + rhs.tv_usec }; } 102 static inline timeval ?-?( timeval & lhs, timeval rhs ) { return (timeval)@{ lhs.tv_sec - rhs.tv_sec, lhs.tv_usec - rhs.tv_usec }; } 103 static inline _Bool ?==?( timeval lhs, timeval rhs ) { return lhs.tv_sec == rhs.tv_sec && lhs.tv_usec == rhs.tv_usec; } 104 static inline _Bool ?!=?( timeval lhs, timeval rhs ) { return lhs.tv_sec != rhs.tv_sec || lhs.tv_usec != rhs.tv_usec; } 105 106 107 //######################### C timespec ######################### 108 109 static inline void ?{}( timespec & t ) {} 110 static inline void ?{}( timespec & t, time_t sec, __syscall_slong_t nsec ) { t.tv_sec = sec; t.tv_nsec = nsec; } 111 static inline void ?{}( timespec & t, time_t sec ) { t{ sec, 0}; } 112 static inline void ?{}( timespec & t, zero_t ) { t{ 0, 0 }; } 113 static inline timespec ?=?( timespec & t, zero_t ) { return t{ 0 }; } 114 static inline timespec ?+?( timespec & lhs, timespec rhs ) { return (timespec)@{ lhs.tv_sec + rhs.tv_sec, lhs.tv_nsec + rhs.tv_nsec }; } 115 static inline timespec ?-?( timespec & lhs, timespec rhs ) { return (timespec)@{ lhs.tv_sec - rhs.tv_sec, lhs.tv_nsec - rhs.tv_nsec }; } 116 static inline _Bool ?==?( timespec lhs, timespec rhs ) { return lhs.tv_sec == rhs.tv_sec && lhs.tv_nsec == rhs.tv_nsec; } 117 static inline _Bool ?!=?( timespec lhs, timespec rhs ) { return lhs.tv_sec != rhs.tv_sec || lhs.tv_nsec != rhs.tv_nsec; } 118 119 120 //######################### C itimerval ######################### 121 122 static inline void ?{}( itimerval & itv, Duration alarm ) with( itv ) { 123 // itimerval contains durations but but uses time data-structure timeval. 124 it_value{ alarm`s, (alarm % 1`s)`us }; // seconds, microseconds 125 it_interval{ 0 }; // 0 seconds, 0 microseconds 126 } // itimerval 127 128 static inline void ?{}( itimerval & itv, Duration alarm, Duration interval ) with( itv ) { 129 // itimerval contains durations but but uses time data-structure timeval. 130 it_value{ alarm`s, (alarm % 1`s)`us }; // seconds, microseconds 131 it_interval{ interval`s, interval`us }; // seconds, microseconds 132 } // itimerval 164 133 165 134 166 135 //######################### Time ######################### 167 136 168 169 struct Time { 170 uint64_t tv; 171 }; 172 173 #ifdef __CFA_DEBUG__ 174 #define CreateFmt "Attempt to create Time( year=%d, month=%d, day=%d, hour=%d, min=%d, sec=%d, nsec=%d ), " \ 175 "which exceeds range 00:00:00 UTC, January 1, 1970 to 03:14:07 UTC, January 19, 2038." 176 #endif // __CFA_DEBUG__ 177 178 void mktime( Time & time, int year, int month, int day, int hour, int min, int sec, int nsec ) with( time ) { 179 tm tm; 180 181 // tzset(); // initialize time global variables 182 tm.tm_isdst = -1; // let mktime determine if alternate timezone is in effect 183 tm.tm_year = year - 1900; // mktime uses 1900 as its starting point 184 tm.tm_mon = month - 1; 185 tm.tm_mday = day; // mktime uses range 1-31 186 tm.tm_hour = hour; 187 tm.tm_min = min; 188 tm.tm_sec = sec; 189 time_t epochsec = mktime( &tm ); 190 #ifdef __CFA_DEBUG__ 191 if ( epochsec == (time_t)-1 ) { 192 abort( CreateFmt, year, month, day, hour, min, sec, nsec ); 193 } // if 194 #endif // __CFA_DEBUG__ 195 tv = (int64_t)(epochsec) * TIMEGRAN + nsec; // convert to nanoseconds 196 #ifdef __CFA_DEBUG__ 197 if ( tv > 2147483647LL * TIMEGRAN ) { // between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038. 198 abort( CreateFmt, year, month, day, hour, min, sec, nsec ); 199 } // if 200 #endif // __CFA_DEBUG__ 201 } // mktime 202 203 static inline void ?{}( Time & t ) with( t ) { 204 tv = 0; 205 } // Time 206 207 // These two constructors must not call mktime because it calls malloc. The malloc calls lead to recursion problems 208 // because Time values are created from the sigalrm handler in composing the next context switch event. 209 210 static inline void ?{}( Time & t, int sec ) with( t ) { 211 #ifdef __CFA_DEBUG__ 212 if ( tv < 0 || tv > 2147483647LL ) { // between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038. 213 abort( CreateFmt, 1970, 0, 0, 0, 0, sec, 0 ); 214 } // if 215 #endif // __CFA_DEBUG__ 216 tv = (int64_t)sec * TIMEGRAN; 217 } // Time 218 219 static inline void ?{}( Time & t, int sec, int nsec ) with( t ) { 220 #ifdef __U_DEBUG__ 221 if ( tv < 0 || tv > 2147483647LL || nsec < 0 ) { // between 00:00:00 UTC, January 1, 1970 and 03:14:07 UTC, January 19, 2038. 222 abort( CreateFmt, 1970, 0, 0, 0, 0, sec, nsec ); 223 } // if 224 #endif // __U_DEBUG__ 225 tv = (int64_t)sec * TIMEGRAN + nsec; 226 } // Time 227 228 static inline void ?{}( Time & time, int min, int sec, long int nsec ) { 229 mktime( time, 1970, 1, 1, 0, min, sec, nsec ); 230 } // Time 231 232 static inline void ?{}( Time & time, int hour, int min, int sec, long int nsec ) { 233 mktime( time, 1970, 1, 1, hour, min, sec, nsec ); 234 } // Time 235 236 static inline void ?{}( Time & time, int day, int hour, int min, int sec, long int nsec ) { 237 mktime( time, 1970, 1, day, hour, min, sec, nsec ); 238 } // Time 239 240 static inline void ?{}( Time & time, int month, int day, int hour, int min, int sec, long int nsec ) { 241 mktime( time, 1970, month, day, hour, min, sec, nsec ); 242 } // Time 243 244 static inline void ?{}( Time & time, int year, int month, int day, int hour, int min, int sec, long int nsec ) { 245 mktime( time, year, month, day, hour, min, sec, nsec ); 246 } // Time 247 248 static inline void ?{}( Time & time, timeval t ) with( time ) { 249 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; 250 } // Time 251 252 static inline void ?{}( Time & time, timespec t ) with( time ) { 253 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; 254 } // Time 255 137 void ?{}( Time & time, int year, int month = 0, int day = 0, int hour = 0, int min = 0, int sec = 0, int nsec = 0 ); 138 static inline Time ?=?( Time & time, zero_t ) { return time{ 0 }; } 139 140 static inline void ?{}( Time & time, timeval t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000; } 256 141 static inline Time ?=?( Time & time, timeval t ) with( time ) { 257 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * 1000;142 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_usec * (TIMEGRAN / 1_000_000LL); 258 143 return time; 259 144 } // ?=? 260 145 146 static inline void ?{}( Time & time, timespec t ) with( time ) { tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; } 261 147 static inline Time ?=?( Time & time, timespec t ) with( time ) { 262 148 tv = (int64_t)t.tv_sec * TIMEGRAN + t.tv_nsec; 263 149 return time; 264 150 } // ?=? 265 266 static inline void ?{}( timeval & t, Time time ) with( time ) {267 t.tv_sec = tv / TIMEGRAN; // seconds268 t.tv_usec = tv % TIMEGRAN / ( TIMEGRAN / 1_000_000L ); // microseconds269 } // ?{}270 271 static inline void ?{}( timespec & t, Time time ) with( time ) {272 t.tv_sec = tv / TIMEGRAN; // seconds273 t.tv_nsec = tv % TIMEGRAN; // nanoseconds274 } // ?{}275 276 static inline int64_t nsec( Time time ) with( time ) { return tv; }277 151 278 152 static inline Time ?+?( Time & lhs, Duration rhs ) { return (Time)@{ lhs.tv + rhs.tv }; } … … 290 164 static inline _Bool ?>=?( Time lhs, Time rhs ) { return lhs.tv >= rhs.tv; } 291 165 292 static inline char * yymmd( Time time, char * buf ) with( time ) { 293 tm tm; 294 time_t s = tv / TIMEGRAN; 295 gmtime_r( &s, &tm ); 296 snprintf( buf, 9, "%02d/%02d/%02d", tm.tm_year % 99, tm.tm_mon, tm.tm_mday ); 297 return buf; 298 } // yymmd 299 300 static inline char * mmyyd( Time time, char * buf ) with( time ) { 301 tm tm; 302 time_t s = tv / TIMEGRAN; 303 gmtime_r( &s, &tm ); 304 snprintf( buf, 9, "%02d/%02d/%02d", tm.tm_mon, tm.tm_year % 99, tm.tm_mday ); 305 return buf; 306 } // yymmd 307 308 static inline char * dmmyy( Time time, char * buf ) with( time ) { 309 tm tm; 310 time_t s = tv / TIMEGRAN; 311 gmtime_r( &s, &tm ); 312 snprintf( buf, 9, "%02d/%02d/%02d", tm.tm_mday, tm.tm_mon, tm.tm_year % 99 ); 313 return buf; 314 } // yymmd 315 316 static inline forall( dtype ostype | ostream( ostype ) ) 317 ostype & ?|?( ostype & os, Time time ) with( time ) { 318 char buf[32]; // at least 26 319 time_t s = tv / TIMEGRAN; 320 tm tm; 321 gmtime_r( &s, &tm ); // ctime_r adjusts for timezone 322 asctime_r( &tm, (char *)&buf ); 323 buf[24] = '\0'; // remove trailing '\n' 324 long int ns = (tv < 0 ? -tv : tv) % TIMEGRAN; 325 if ( ns == 0 ) { 326 os | buf; 327 } else { 328 buf[19] = '\0'; 329 os | buf; 330 char buf2[16]; 331 snprintf( buf2, 16, "%09ld", ns ); 332 int i; 333 for ( i = 8; i >= 0 && buf2[i] == '0' ; i -= 1 ); // find least significant digit 334 if ( i != -1 ) { buf2[i + 1] = '\0'; os | '.' | buf2; } 335 os | ' ' | &buf[20]; 336 } // if 337 return os; 338 } // ?|? 339 340 //######################### Clock ######################### 341 342 343 struct Clock { 344 Duration offset; // for virtual clock: contains offset from real-time 345 int clocktype; // implementation only -1 (virtual), CLOCK_REALTIME 346 }; 347 348 void resetClock( Clock & clk ) with( clk ) { 349 clocktype = CLOCK_REALTIME; 350 } // Clock::resetClock 351 352 void resetClock( Clock & clk, Duration adj ) with( clk ) { 353 clocktype = -1; 354 Duration tz = (timeval){ timezone, 0 }; 355 offset = adj + tz; 356 } // resetClock 357 358 void ?{}( Clock & clk ) { 359 resetClock( clk ); 360 } // Clock 361 362 void ?{}( Clock & clk, Duration adj ) { 363 resetClock( clk, adj ); 364 } // Clock 365 366 Duration getRes() { 367 struct timespec res; 368 clock_getres( CLOCK_REALTIME, &res ); 369 return (Duration){ res }; 370 } // getRes 371 372 Time getTime() { 373 timespec curr; 374 clock_gettime( CLOCK_REALTIME_COARSE, &curr ); 375 return (Time){ curr }; 376 } // getTime 377 378 Time getTime( Clock & clk ) with( clk ) { 379 return getTime() + offset; 380 } // getTime 381 382 Time ?()( Clock & clk ) with( clk ) { // alternative syntax 383 return getTime() + offset; 384 } // getTime 385 386 timeval getTime( Clock & clk ) { 387 return (timeval){ clk() }; 388 } // getTime 389 390 tm getTime( Clock & clk ) with( clk ) { 391 tm ret; 392 localtime_r( getTime( clk ).tv_sec, &ret ); 393 return ret; 394 } // getTime 166 char * yy_mm_dd( Time time, char * buf ); 167 static inline char * ?`ymd( Time time, char * buf ) { // short form 168 return yy_mm_dd( time, buf ); 169 } // ymd 170 171 char * mm_dd_yy( Time time, char * buf ); 172 static inline char * ?`mdy( Time time, char * buf ) { // short form 173 return mm_dd_yy( time, buf ); 174 } // mdy 175 176 char * dd_mm_yy( Time time, char * buf ); 177 static inline char * ?`dmy( Time time, char * buf ) { // short form 178 return dd_mm_yy( time, buf );; 179 } // dmy 180 181 size_t strftime( char * buf, size_t size, const char * fmt, Time time ); 182 183 //------------------------- timeval (cont) ------------------------- 184 185 static inline void ?{}( timeval & t, Time time ) with( t, time ) { 186 tv_sec = tv / TIMEGRAN; // seconds 187 tv_usec = tv % TIMEGRAN / (TIMEGRAN / 1_000_000LL); // microseconds 188 } // ?{} 189 190 //------------------------- timespec (cont) ------------------------- 191 192 static inline void ?{}( timespec & t, Time time ) with( t, time ) { 193 tv_sec = tv / TIMEGRAN; // seconds 194 tv_nsec = tv % TIMEGRAN; // nanoseconds 195 } // ?{} 395 196 396 197 // Local Variables: // … … 398 199 // tab-width: 4 // 399 200 // End: // 400
Note:
See TracChangeset
for help on using the changeset viewer.