1*6dbdd20aSAndroid Build Coastguard Worker /* 2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2020 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 #ifndef SRC_PROFILING_COMMON_PROFILER_GUARDRAILS_H_ 18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_PROFILING_COMMON_PROFILER_GUARDRAILS_H_ 19*6dbdd20aSAndroid Build Coastguard Worker 20*6dbdd20aSAndroid Build Coastguard Worker #include <fcntl.h> 21*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h> 22*6dbdd20aSAndroid Build Coastguard Worker 23*6dbdd20aSAndroid Build Coastguard Worker #include <cinttypes> 24*6dbdd20aSAndroid Build Coastguard Worker #include <optional> 25*6dbdd20aSAndroid Build Coastguard Worker 26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/file_utils.h" 27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h" 28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/basic_types.h" 29*6dbdd20aSAndroid Build Coastguard Worker #include "src/profiling/common/proc_utils.h" 30*6dbdd20aSAndroid Build Coastguard Worker 31*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto { 32*6dbdd20aSAndroid Build Coastguard Worker namespace profiling { 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Worker std::optional<uint64_t> GetCputimeSecForCurrentProcess(); 35*6dbdd20aSAndroid Build Coastguard Worker // For testing. 36*6dbdd20aSAndroid Build Coastguard Worker std::optional<uint64_t> GetCputimeSecForCurrentProcess( 37*6dbdd20aSAndroid Build Coastguard Worker base::ScopedFile stat_fd); 38*6dbdd20aSAndroid Build Coastguard Worker 39*6dbdd20aSAndroid Build Coastguard Worker struct GuardrailConfig { 40*6dbdd20aSAndroid Build Coastguard Worker uint64_t cpu_guardrail_sec = 0; 41*6dbdd20aSAndroid Build Coastguard Worker std::optional<uint64_t> cpu_start_secs; 42*6dbdd20aSAndroid Build Coastguard Worker uint32_t memory_guardrail_kb = 0; 43*6dbdd20aSAndroid Build Coastguard Worker }; 44*6dbdd20aSAndroid Build Coastguard Worker 45*6dbdd20aSAndroid Build Coastguard Worker class ProfilerCpuGuardrails { 46*6dbdd20aSAndroid Build Coastguard Worker public: 47*6dbdd20aSAndroid Build Coastguard Worker ProfilerCpuGuardrails(); 48*6dbdd20aSAndroid Build Coastguard Worker // Allows to supply custom stat fd for testing. 49*6dbdd20aSAndroid Build Coastguard Worker explicit ProfilerCpuGuardrails(base::ScopedFile stat_fd); 50*6dbdd20aSAndroid Build Coastguard Worker 51*6dbdd20aSAndroid Build Coastguard Worker bool IsOverCpuThreshold(const GuardrailConfig& ds); 52*6dbdd20aSAndroid Build Coastguard Worker 53*6dbdd20aSAndroid Build Coastguard Worker private: 54*6dbdd20aSAndroid Build Coastguard Worker std::optional<uint64_t> opt_cputime_sec_; 55*6dbdd20aSAndroid Build Coastguard Worker }; 56*6dbdd20aSAndroid Build Coastguard Worker 57*6dbdd20aSAndroid Build Coastguard Worker class ProfilerMemoryGuardrails { 58*6dbdd20aSAndroid Build Coastguard Worker public: 59*6dbdd20aSAndroid Build Coastguard Worker ProfilerMemoryGuardrails(); 60*6dbdd20aSAndroid Build Coastguard Worker // Allows to supply custom status fd for testing. 61*6dbdd20aSAndroid Build Coastguard Worker explicit ProfilerMemoryGuardrails(base::ScopedFile status_fd); 62*6dbdd20aSAndroid Build Coastguard Worker 63*6dbdd20aSAndroid Build Coastguard Worker bool IsOverMemoryThreshold(const GuardrailConfig& ds); 64*6dbdd20aSAndroid Build Coastguard Worker 65*6dbdd20aSAndroid Build Coastguard Worker private: 66*6dbdd20aSAndroid Build Coastguard Worker std::optional<uint32_t> anon_and_swap_; 67*6dbdd20aSAndroid Build Coastguard Worker }; 68*6dbdd20aSAndroid Build Coastguard Worker 69*6dbdd20aSAndroid Build Coastguard Worker } // namespace profiling 70*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto 71*6dbdd20aSAndroid Build Coastguard Worker 72*6dbdd20aSAndroid Build Coastguard Worker #endif // SRC_PROFILING_COMMON_PROFILER_GUARDRAILS_H_ 73