1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*6dbdd20aSAndroid Build Coastguard Worker * 4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*6dbdd20aSAndroid Build Coastguard Worker * 8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*6dbdd20aSAndroid Build Coastguard Worker * 10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License. 15*6dbdd20aSAndroid Build Coastguard Worker */ 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker #include <sched.h> 18*6dbdd20aSAndroid Build Coastguard Worker #include <sys/stat.h> 19*6dbdd20aSAndroid Build Coastguard Worker #include <sys/types.h> 20*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h> 21*6dbdd20aSAndroid Build Coastguard Worker 22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h" 23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/time.h" 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker // Skippy is a program that produces a visually identifiable stepping pattern 26*6dbdd20aSAndroid Build Coastguard Worker // in the systrace UI that is useful for debugging dropped or corrupted data. 27*6dbdd20aSAndroid Build Coastguard Worker 28*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 29*6dbdd20aSAndroid Build Coastguard Worker namespace { 30*6dbdd20aSAndroid Build Coastguard Worker SetAffinity(size_t cpu)31*6dbdd20aSAndroid Build Coastguard Workervoid SetAffinity(size_t cpu) { 32*6dbdd20aSAndroid Build Coastguard Worker cpu_set_t set{}; 33*6dbdd20aSAndroid Build Coastguard Worker CPU_SET(cpu, &set); 34*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_CHECK( 35*6dbdd20aSAndroid Build Coastguard Worker sched_setaffinity(0 /* calling process */, sizeof(cpu_set_t), &set) == 0); 36*6dbdd20aSAndroid Build Coastguard Worker } 37*6dbdd20aSAndroid Build Coastguard Worker SkippyMain()38*6dbdd20aSAndroid Build Coastguard Workerint SkippyMain() { 39*6dbdd20aSAndroid Build Coastguard Worker static size_t num_cpus = static_cast<size_t>(sysconf(_SC_NPROCESSORS_CONF)); 40*6dbdd20aSAndroid Build Coastguard Worker size_t cpu = 0; 41*6dbdd20aSAndroid Build Coastguard Worker base::TimeMillis last = base::GetWallTimeMs(); 42*6dbdd20aSAndroid Build Coastguard Worker 43*6dbdd20aSAndroid Build Coastguard Worker SetAffinity(cpu); 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Worker for (;;) { 46*6dbdd20aSAndroid Build Coastguard Worker base::TimeMillis now = base::GetWallTimeMs(); 47*6dbdd20aSAndroid Build Coastguard Worker if ((now - last) < base::TimeMillis(100)) 48*6dbdd20aSAndroid Build Coastguard Worker continue; 49*6dbdd20aSAndroid Build Coastguard Worker last = now; 50*6dbdd20aSAndroid Build Coastguard Worker cpu = (cpu + 1) % num_cpus; 51*6dbdd20aSAndroid Build Coastguard Worker SetAffinity(cpu); 52*6dbdd20aSAndroid Build Coastguard Worker } 53*6dbdd20aSAndroid Build Coastguard Worker } 54*6dbdd20aSAndroid Build Coastguard Worker 55*6dbdd20aSAndroid Build Coastguard Worker } // namespace 56*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 57*6dbdd20aSAndroid Build Coastguard Worker main()58*6dbdd20aSAndroid Build Coastguard Workerint main() { 59*6dbdd20aSAndroid Build Coastguard Worker return perfetto::SkippyMain(); 60*6dbdd20aSAndroid Build Coastguard Worker } 61