xref: /aosp_15_r20/system/extras/simpleperf/runtest/run_and_sleep.cpp (revision 288bf5226967eb3dac5cce6c939ccc2a7f2b4fe5)
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 Worker static 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 Worker uint64_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 Worker uint64_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 Worker void 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 Worker int main() {
44*288bf522SAndroid Build Coastguard Worker   GlobalFunction();
45*288bf522SAndroid Build Coastguard Worker   return 0;
46*288bf522SAndroid Build Coastguard Worker }
47