/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.os; import android.annotation.Nullable; import android.os.Process; /** * Reads CPU usage statistics about a selected process identified by its cmdline. * * Handles finding the pid for the process and delegates CPU usage reading from the eBPF map to * KernelSingleProcessCpuThreadReader. Exactly one long-lived instance of the process is expected. * Otherwise, no statistics are returned. * * See also SystemServerCpuThreadReader. */ public final class SelectedProcessCpuThreadReader { private final String[] mCmdline; private int mPid; private KernelSingleProcessCpuThreadReader mKernelCpuThreadReader; public SelectedProcessCpuThreadReader(String cmdline) { mCmdline = new String[] { cmdline }; } /** Returns CPU times, per thread group, since tracking started. */ @Nullable public KernelSingleProcessCpuThreadReader.ProcessCpuUsage readAbsolute() { int[] pids = Process.getPidsForCommands(mCmdline); if (pids == null || pids.length != 1) { return null; } int pid = pids[0]; if (mPid == pid) { return mKernelCpuThreadReader.getProcessCpuUsage(); } mPid = pid; mKernelCpuThreadReader = KernelSingleProcessCpuThreadReader.create(mPid); mKernelCpuThreadReader.startTrackingThreadCpuTimes(); return null; } }