Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #if !defined (_ink_hrtime_h_)
00032 #define _ink_hrtime_h_
00033
00034 #include "ink_config.h"
00035 #include "ink_assert.h"
00036 #include "Compatability.h"
00037
00038 int squid_timestamp_to_buf(char *buf, unsigned int buf_size, long timestamp_sec, long timestamp_usec);
00039 char *int64_to_str(char *buf, unsigned int buf_size, int64_t val, unsigned int *total_chars, unsigned int req_width=0, char pad_char='0');
00040
00041 #ifdef NEED_HRTIME
00042 #include <time.h>
00043 #include <sys/time.h>
00044 #include <stdlib.h>
00045 typedef int64_t ink_hrtime;
00046 #else
00047 #include <sys/time.h>
00048 typedef hrtime_t ink_hrtime;
00049 #endif
00050
00051
00052
00053
00054
00055
00056
00057 #ifdef USE_TIME_STAMP_COUNTER_HRTIME
00058 extern ink_hrtime init_hrtime_TSC();
00059 extern uint32_t hrtime_freq;
00060 extern double hrtime_freq_float;
00061 static inline ink_hrtime
00062 hrtime_rdtsc()
00063 {
00064 ink_hrtime rv;
00065 asm volatile (".byte 0x0f, 0x31":"=A" (rv));
00066 return (rv);
00067 }
00068 static inline uint64_t
00069 get_hrtime_rdtsc()
00070 {
00071
00072 return (uint64_t) (hrtime_freq_float * hrtime_rdtsc());
00073 }
00074 #endif
00075
00076
00077
00078
00079
00080
00081
00082 #define HRTIME_FOREVER (10*HRTIME_DECADE)
00083 #define HRTIME_DECADE (10*HRTIME_YEAR)
00084 #define HRTIME_YEAR (365*HRTIME_DAY+HRTIME_DAY/4)
00085 #define HRTIME_WEEK (7*HRTIME_DAY)
00086 #define HRTIME_DAY (24*HRTIME_HOUR)
00087 #define HRTIME_HOUR (60*HRTIME_MINUTE)
00088 #define HRTIME_MINUTE (60*HRTIME_SECOND)
00089 #define HRTIME_SECOND (1000*HRTIME_MSECOND)
00090 #define HRTIME_MSECOND (1000*HRTIME_USECOND)
00091 #define HRTIME_USECOND (1000*HRTIME_NSECOND)
00092 #define HRTIME_NSECOND (1LL)
00093
00094 #define HRTIME_APPROX_SECONDS(_x) ((_x)>>30) // off by 7.3%
00095 #define HRTIME_APPROX_FACTOR (((float)(1<<30))/(((float)HRTIME_SECOND)))
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 #define HRTIME_YEARS(_x) ((_x)*HRTIME_YEAR)
00106 #define HRTIME_WEEKS(_x) ((_x)*HRTIME_WEEK)
00107 #define HRTIME_DAYS(_x) ((_x)*HRTIME_DAY)
00108 #define HRTIME_HOURS(_x) ((_x)*HRTIME_HOUR)
00109 #define HRTIME_MINUTES(_x) ((_x)*HRTIME_MINUTE)
00110 #define HRTIME_SECONDS(_x) ((_x)*HRTIME_SECOND)
00111 #define HRTIME_MSECONDS(_x) ((_x)*HRTIME_MSECOND)
00112 #define HRTIME_USECONDS(_x) ((_x)*HRTIME_USECOND)
00113 #define HRTIME_NSECONDS(_x) ((_x)*HRTIME_NSECOND)
00114
00115
00116
00117 static inline ink_hrtime
00118 ink_hrtime_from_years(unsigned int years)
00119 {
00120 return (HRTIME_YEARS(years));
00121 }
00122 static inline ink_hrtime
00123 ink_hrtime_from_weeks(unsigned int weeks)
00124 {
00125 return (HRTIME_WEEKS(weeks));
00126 }
00127 static inline ink_hrtime
00128 ink_hrtime_from_days(unsigned int days)
00129 {
00130 return (HRTIME_DAYS(days));
00131 }
00132 static inline ink_hrtime
00133 ink_hrtime_from_mins(unsigned int mins)
00134 {
00135 return (HRTIME_MINUTES(mins));
00136 }
00137 static inline ink_hrtime
00138 ink_hrtime_from_sec(unsigned int sec)
00139 {
00140 return (HRTIME_SECONDS(sec));
00141 }
00142 static inline ink_hrtime
00143 ink_hrtime_from_msec(unsigned int msec)
00144 {
00145 return (HRTIME_MSECONDS(msec));
00146 }
00147 static inline ink_hrtime
00148 ink_hrtime_from_usec(unsigned int usec)
00149 {
00150 return (HRTIME_USECONDS(usec));
00151 }
00152 static inline ink_hrtime
00153 ink_hrtime_from_nsec(unsigned int nsec)
00154 {
00155 return (HRTIME_NSECONDS(nsec));
00156 }
00157
00158 static inline ink_hrtime
00159 ink_hrtime_from_timespec(const struct timespec * ts)
00160 {
00161 return ink_hrtime_from_sec(ts->tv_sec) + ink_hrtime_from_nsec(ts->tv_nsec);
00162 }
00163
00164 static inline ink_hrtime
00165 ink_hrtime_from_timeval(const struct timeval * tv)
00166 {
00167 return ink_hrtime_from_sec(tv->tv_sec) + ink_hrtime_from_usec(tv->tv_usec);
00168 }
00169
00170
00171
00172
00173
00174
00175
00176 static inline ink_hrtime
00177 ink_hrtime_to_years(ink_hrtime t)
00178 {
00179 return ((ink_hrtime) (t / HRTIME_YEAR));
00180 }
00181 static inline ink_hrtime
00182 ink_hrtime_to_weeks(ink_hrtime t)
00183 {
00184 return ((ink_hrtime) (t / HRTIME_WEEK));
00185 }
00186 static inline ink_hrtime
00187 ink_hrtime_to_days(ink_hrtime t)
00188 {
00189 return ((ink_hrtime) (t / HRTIME_DAY));
00190 }
00191 static inline ink_hrtime
00192 ink_hrtime_to_mins(ink_hrtime t)
00193 {
00194 return ((ink_hrtime) (t / HRTIME_MINUTE));
00195 }
00196 static inline ink_hrtime
00197 ink_hrtime_to_sec(ink_hrtime t)
00198 {
00199 return ((ink_hrtime) (t / HRTIME_SECOND));
00200 }
00201 static inline ink_hrtime
00202 ink_hrtime_to_msec(ink_hrtime t)
00203 {
00204 return ((ink_hrtime) (t / HRTIME_MSECOND));
00205 }
00206 static inline ink_hrtime
00207 ink_hrtime_to_usec(ink_hrtime t)
00208 {
00209 return ((ink_hrtime) (t / HRTIME_USECOND));
00210 }
00211 static inline ink_hrtime
00212 ink_hrtime_to_nsec(ink_hrtime t)
00213 {
00214 return ((ink_hrtime) (t / HRTIME_NSECOND));
00215 }
00216
00217 static inline struct timespec
00218 ink_hrtime_to_timespec(ink_hrtime t)
00219 {
00220 struct timespec ts;
00221
00222 ts.tv_sec = ink_hrtime_to_sec(t);
00223 ts.tv_nsec = t % HRTIME_SECOND;
00224 return (ts);
00225 }
00226
00227 static inline struct timeval
00228 ink_hrtime_to_timeval(ink_hrtime t)
00229 {
00230 int64_t usecs;
00231 struct timeval tv;
00232
00233 usecs = ink_hrtime_to_usec(t);
00234 tv.tv_sec = usecs / 1000000;
00235 tv.tv_usec = usecs % 1000000;
00236 return (tv);
00237 }
00238
00239 static inline int
00240 ink_hrtime_to_timeval2(ink_hrtime t, struct timeval *tv)
00241 {
00242 int64_t usecs = ink_hrtime_to_usec(t);
00243 tv->tv_sec = usecs / 1000000;
00244 tv->tv_usec = usecs % 1000000;
00245 return 0;
00246 }
00247
00248
00249
00250
00251
00252 #define NT_TIMEBASE_DIFFERENCE_100NSECS 116444736000000000i64
00253
00254
00255 static inline ink_hrtime
00256 ink_get_hrtime_internal()
00257 {
00258 #if defined (NEED_HRTIME)
00259 #if defined (USE_TIME_STAMP_COUNTER_HRTIME)
00260 return get_hrtime_rdtsc();
00261 #elif defined(freebsd)
00262 timespec ts;
00263 clock_gettime(CLOCK_REALTIME, &ts);
00264 return ink_hrtime_from_timespec(&ts);
00265 #else
00266 timeval tv;
00267 gettimeofday(&tv, NULL);
00268 return ink_hrtime_from_timeval(&tv);
00269 #endif
00270 #else
00271 return gethrtime();
00272 #endif
00273 }
00274
00275 static inline ink_hrtime
00276 ink_get_based_hrtime_internal()
00277 {
00278 #if defined(USE_TIME_STAMP_COUNTER_HRTIME)
00279 return hrtime_offset + ink_get_hrtime_internal();
00280 #elif !HAVE_CLOCK_GETTIME
00281 timeval tv;
00282 gettimeofday(&tv, NULL);
00283 return ink_hrtime_from_timeval(&tv);
00284 #else
00285 timespec ts;
00286 clock_gettime(CLOCK_REALTIME, &ts);
00287 return ink_hrtime_from_timespec(&ts);
00288 #endif
00289 }
00290
00291
00292
00293 static inline struct timeval
00294 ink_gettimeofday()
00295 {
00296 return ink_hrtime_to_timeval(ink_get_based_hrtime_internal());
00297 }
00298
00299 static inline int
00300 ink_gethrtimeofday(struct timeval *tp, void *)
00301 {
00302 return ink_hrtime_to_timeval2(ink_get_based_hrtime_internal(), tp);
00303 }
00304
00305 static inline int
00306 ink_time()
00307 {
00308 return (int) ink_hrtime_to_sec(ink_get_based_hrtime_internal());
00309 }
00310
00311 static inline int
00312 ink_hrtime_diff_msec(ink_hrtime t1, ink_hrtime t2)
00313 {
00314 return (int) ink_hrtime_to_msec(t1 - t2);
00315 }
00316
00317 static inline ink_hrtime
00318 ink_hrtime_diff(ink_hrtime t1, ink_hrtime t2)
00319 {
00320 return (t1 - t2);
00321 }
00322
00323 static inline ink_hrtime
00324 ink_hrtime_add(ink_hrtime t1, ink_hrtime t2)
00325 {
00326 return (t1 + t2);
00327 }
00328
00329 static inline void
00330 ink_hrtime_sleep(ink_hrtime delay)
00331 {
00332 struct timespec ts = ink_hrtime_to_timespec(delay);
00333 nanosleep(&ts, NULL);
00334 }
00335
00336 #endif