1*288bf522SAndroid Build Coastguard Worker #include <inttypes.h> 2*288bf522SAndroid Build Coastguard Worker #include <sys/types.h> 3*288bf522SAndroid Build Coastguard Worker #include <time.h> 4*288bf522SAndroid Build Coastguard Worker #include <unistd.h> 5*288bf522SAndroid Build Coastguard Worker 6*288bf522SAndroid Build Coastguard Worker #define noinline __attribute__((__noinline__)) 7*288bf522SAndroid Build Coastguard Worker GetSystemClock()8*288bf522SAndroid Build Coastguard Workerstatic inline uint64_t GetSystemClock() { 9*288bf522SAndroid Build Coastguard Worker timespec ts; 10*288bf522SAndroid Build Coastguard Worker // Assume clock_gettime() doesn't fail. 11*288bf522SAndroid Build Coastguard Worker clock_gettime(CLOCK_MONOTONIC, &ts); 12*288bf522SAndroid Build Coastguard Worker return ts.tv_sec * 1000000000ULL + ts.tv_nsec; 13*288bf522SAndroid Build Coastguard Worker } 14*288bf522SAndroid Build Coastguard Worker 15*288bf522SAndroid Build Coastguard Worker constexpr int LOOP_COUNT = 100000000; RunFunction()16*288bf522SAndroid Build Coastguard Workeruint64_t noinline RunFunction() { 17*288bf522SAndroid Build Coastguard Worker uint64_t start_time_in_ns = GetSystemClock(); 18*288bf522SAndroid Build Coastguard Worker for (volatile int i = 0; i < LOOP_COUNT; ++i) { 19*288bf522SAndroid Build Coastguard Worker } 20*288bf522SAndroid Build Coastguard Worker return GetSystemClock() - start_time_in_ns; 21*288bf522SAndroid Build Coastguard Worker } 22*288bf522SAndroid Build Coastguard Worker SleepFunction(unsigned long long sleep_time_in_ns)23*288bf522SAndroid Build Coastguard Workeruint64_t noinline SleepFunction(unsigned long long sleep_time_in_ns) { 24*288bf522SAndroid Build Coastguard Worker uint64_t start_time_in_ns = GetSystemClock(); 25*288bf522SAndroid Build Coastguard Worker struct timespec req; 26*288bf522SAndroid Build Coastguard Worker req.tv_sec = sleep_time_in_ns / 1000000000; 27*288bf522SAndroid Build Coastguard Worker req.tv_nsec = sleep_time_in_ns % 1000000000; 28*288bf522SAndroid Build Coastguard Worker nanosleep(&req, nullptr); 29*288bf522SAndroid Build Coastguard Worker return GetSystemClock() - start_time_in_ns; 30*288bf522SAndroid Build Coastguard Worker } 31*288bf522SAndroid Build Coastguard Worker GlobalFunction()32*288bf522SAndroid Build Coastguard Workervoid noinline GlobalFunction() { 33*288bf522SAndroid Build Coastguard Worker uint64_t total_sleep_time_in_ns = 0; 34*288bf522SAndroid Build Coastguard Worker uint64_t total_run_time_in_ns = 0; 35*288bf522SAndroid Build Coastguard Worker while (true) { 36*288bf522SAndroid Build Coastguard Worker total_run_time_in_ns += RunFunction(); 37*288bf522SAndroid Build Coastguard Worker if (total_sleep_time_in_ns < total_run_time_in_ns) { 38*288bf522SAndroid Build Coastguard Worker total_sleep_time_in_ns += SleepFunction(total_run_time_in_ns - total_sleep_time_in_ns); 39*288bf522SAndroid Build Coastguard Worker } 40*288bf522SAndroid Build Coastguard Worker } 41*288bf522SAndroid Build Coastguard Worker } 42*288bf522SAndroid Build Coastguard Worker main()43*288bf522SAndroid Build Coastguard Workerint main() { 44*288bf522SAndroid Build Coastguard Worker GlobalFunction(); 45*288bf522SAndroid Build Coastguard Worker return 0; 46*288bf522SAndroid Build Coastguard Worker } 47