1*cc02d7e2SAndroid Build Coastguard Worker /* 2*cc02d7e2SAndroid Build Coastguard Worker * 3*cc02d7e2SAndroid Build Coastguard Worker * Copyright 2015 gRPC authors. 4*cc02d7e2SAndroid Build Coastguard Worker * 5*cc02d7e2SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*cc02d7e2SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*cc02d7e2SAndroid Build Coastguard Worker * You may obtain a copy of the License at 8*cc02d7e2SAndroid Build Coastguard Worker * 9*cc02d7e2SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*cc02d7e2SAndroid Build Coastguard Worker * 11*cc02d7e2SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*cc02d7e2SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*cc02d7e2SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*cc02d7e2SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*cc02d7e2SAndroid Build Coastguard Worker * limitations under the License. 16*cc02d7e2SAndroid Build Coastguard Worker * 17*cc02d7e2SAndroid Build Coastguard Worker */ 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPC_SUPPORT_TIME_H 20*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_SUPPORT_TIME_H 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker #include <stddef.h> 23*cc02d7e2SAndroid Build Coastguard Worker #include <time.h> 24*cc02d7e2SAndroid Build Coastguard Worker 25*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/port_platform.h> 26*cc02d7e2SAndroid Build Coastguard Worker 27*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 28*cc02d7e2SAndroid Build Coastguard Worker extern "C" { 29*cc02d7e2SAndroid Build Coastguard Worker #endif 30*cc02d7e2SAndroid Build Coastguard Worker 31*cc02d7e2SAndroid Build Coastguard Worker /** The clocks we support. */ 32*cc02d7e2SAndroid Build Coastguard Worker typedef enum { 33*cc02d7e2SAndroid Build Coastguard Worker /** Monotonic clock. Epoch undefined. Always moves forwards. */ 34*cc02d7e2SAndroid Build Coastguard Worker GPR_CLOCK_MONOTONIC = 0, 35*cc02d7e2SAndroid Build Coastguard Worker /** Realtime clock. May jump forwards or backwards. Settable by 36*cc02d7e2SAndroid Build Coastguard Worker the system administrator. Has its epoch at 0:00:00 UTC 1 Jan 1970. */ 37*cc02d7e2SAndroid Build Coastguard Worker GPR_CLOCK_REALTIME, 38*cc02d7e2SAndroid Build Coastguard Worker /** CPU cycle time obtained by rdtsc instruction on x86 platforms. Epoch 39*cc02d7e2SAndroid Build Coastguard Worker undefined. Degrades to GPR_CLOCK_REALTIME on other platforms. */ 40*cc02d7e2SAndroid Build Coastguard Worker GPR_CLOCK_PRECISE, 41*cc02d7e2SAndroid Build Coastguard Worker /** Unmeasurable clock type: no base, created by taking the difference 42*cc02d7e2SAndroid Build Coastguard Worker between two times */ 43*cc02d7e2SAndroid Build Coastguard Worker GPR_TIMESPAN 44*cc02d7e2SAndroid Build Coastguard Worker } gpr_clock_type; 45*cc02d7e2SAndroid Build Coastguard Worker 46*cc02d7e2SAndroid Build Coastguard Worker /** Analogous to struct timespec. On some machines, absolute times may be in 47*cc02d7e2SAndroid Build Coastguard Worker * local time. */ 48*cc02d7e2SAndroid Build Coastguard Worker typedef struct gpr_timespec { 49*cc02d7e2SAndroid Build Coastguard Worker int64_t tv_sec; 50*cc02d7e2SAndroid Build Coastguard Worker int32_t tv_nsec; 51*cc02d7e2SAndroid Build Coastguard Worker /** Against which clock was this time measured? (or GPR_TIMESPAN if 52*cc02d7e2SAndroid Build Coastguard Worker this is a relative time measure) */ 53*cc02d7e2SAndroid Build Coastguard Worker gpr_clock_type clock_type; 54*cc02d7e2SAndroid Build Coastguard Worker } gpr_timespec; 55*cc02d7e2SAndroid Build Coastguard Worker 56*cc02d7e2SAndroid Build Coastguard Worker /** Time constants. */ 57*cc02d7e2SAndroid Build Coastguard Worker /** The zero time interval. */ 58*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_0(gpr_clock_type type); 59*cc02d7e2SAndroid Build Coastguard Worker /** The far future */ 60*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type); 61*cc02d7e2SAndroid Build Coastguard Worker /** The far past. */ 62*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_inf_past(gpr_clock_type type); 63*cc02d7e2SAndroid Build Coastguard Worker 64*cc02d7e2SAndroid Build Coastguard Worker #define GPR_MS_PER_SEC 1000 65*cc02d7e2SAndroid Build Coastguard Worker #define GPR_US_PER_SEC 1000000 66*cc02d7e2SAndroid Build Coastguard Worker #define GPR_NS_PER_SEC 1000000000 67*cc02d7e2SAndroid Build Coastguard Worker #define GPR_NS_PER_MS 1000000 68*cc02d7e2SAndroid Build Coastguard Worker #define GPR_NS_PER_US 1000 69*cc02d7e2SAndroid Build Coastguard Worker #define GPR_US_PER_MS 1000 70*cc02d7e2SAndroid Build Coastguard Worker 71*cc02d7e2SAndroid Build Coastguard Worker /** initialize time subsystem */ 72*cc02d7e2SAndroid Build Coastguard Worker GPRAPI void gpr_time_init(void); 73*cc02d7e2SAndroid Build Coastguard Worker 74*cc02d7e2SAndroid Build Coastguard Worker /** Return the current time measured from the given clocks epoch. */ 75*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_now(gpr_clock_type clock); 76*cc02d7e2SAndroid Build Coastguard Worker 77*cc02d7e2SAndroid Build Coastguard Worker /** Convert a timespec from one clock to another */ 78*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_convert_clock_type(gpr_timespec t, 79*cc02d7e2SAndroid Build Coastguard Worker gpr_clock_type clock_type); 80*cc02d7e2SAndroid Build Coastguard Worker 81*cc02d7e2SAndroid Build Coastguard Worker /** Return -ve, 0, or +ve according to whether a < b, a == b, or a > b 82*cc02d7e2SAndroid Build Coastguard Worker respectively. */ 83*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int gpr_time_cmp(gpr_timespec a, gpr_timespec b); 84*cc02d7e2SAndroid Build Coastguard Worker 85*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b); 86*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b); 87*cc02d7e2SAndroid Build Coastguard Worker 88*cc02d7e2SAndroid Build Coastguard Worker /** Add and subtract times. Calculations saturate at infinities. */ 89*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b); 90*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b); 91*cc02d7e2SAndroid Build Coastguard Worker 92*cc02d7e2SAndroid Build Coastguard Worker /** Return a timespec representing a given number of time units. INT64_MIN is 93*cc02d7e2SAndroid Build Coastguard Worker interpreted as gpr_inf_past, and INT64_MAX as gpr_inf_future. */ 94*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type clock_type); 95*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_nanos(int64_t ns, gpr_clock_type clock_type); 96*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_millis(int64_t ms, gpr_clock_type clock_type); 97*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type clock_type); 98*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_minutes(int64_t m, gpr_clock_type clock_type); 99*cc02d7e2SAndroid Build Coastguard Worker GPRAPI gpr_timespec gpr_time_from_hours(int64_t h, gpr_clock_type clock_type); 100*cc02d7e2SAndroid Build Coastguard Worker 101*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int32_t gpr_time_to_millis(gpr_timespec timespec); 102*cc02d7e2SAndroid Build Coastguard Worker 103*cc02d7e2SAndroid Build Coastguard Worker /** Return 1 if two times are equal or within threshold of each other, 104*cc02d7e2SAndroid Build Coastguard Worker 0 otherwise */ 105*cc02d7e2SAndroid Build Coastguard Worker GPRAPI int gpr_time_similar(gpr_timespec a, gpr_timespec b, 106*cc02d7e2SAndroid Build Coastguard Worker gpr_timespec threshold); 107*cc02d7e2SAndroid Build Coastguard Worker 108*cc02d7e2SAndroid Build Coastguard Worker /** Sleep until at least 'until' - an absolute timeout */ 109*cc02d7e2SAndroid Build Coastguard Worker GPRAPI void gpr_sleep_until(gpr_timespec until); 110*cc02d7e2SAndroid Build Coastguard Worker 111*cc02d7e2SAndroid Build Coastguard Worker GPRAPI double gpr_timespec_to_micros(gpr_timespec t); 112*cc02d7e2SAndroid Build Coastguard Worker 113*cc02d7e2SAndroid Build Coastguard Worker #ifdef __cplusplus 114*cc02d7e2SAndroid Build Coastguard Worker } 115*cc02d7e2SAndroid Build Coastguard Worker #endif 116*cc02d7e2SAndroid Build Coastguard Worker 117*cc02d7e2SAndroid Build Coastguard Worker #endif /* GRPC_SUPPORT_TIME_H */ 118