1045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten/* 2045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * Copyright (C) 2014 The Android Open Source Project 3045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * 4045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * you may not use this file except in compliance with the License. 6045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * You may obtain a copy of the License at 7045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * 8045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * 10045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * Unless required by applicable law or agreed to in writing, software 11045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * See the License for the specific language governing permissions and 14045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten * limitations under the License. 15045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten */ 16045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 17045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#ifndef ANDROID_AUDIO_FAST_THREAD_DUMP_STATE_H 18045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#define ANDROID_AUDIO_FAST_THREAD_DUMP_STATE_H 19045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 20045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#include "Configuration.h" 21045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#include "FastThreadState.h" 22045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 23045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kastennamespace android { 24045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 258a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// The FastThreadDumpState keeps a cache of FastThread statistics that can be logged by dumpsys. 268a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// Each individual native word-sized field is accessed atomically. But the 278a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// overall structure is non-atomic, that is there may be an inconsistency between fields. 288a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// No barriers or locks are used for either writing or reading. 298a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// Only POD types are permitted, and the contents shouldn't be trusted (i.e. do range checks). 308a0554c63dc40a2a7c066b03041079ec9eb220e5Glenn Kasten// It has a different lifetime than the FastThread, and so it can't be a member of FastThread. 31045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kastenstruct FastThreadDumpState { 32045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten FastThreadDumpState(); 33045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten /*virtual*/ ~FastThreadDumpState(); 34045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 35045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten FastThreadState::Command mCommand; // current command 36045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mUnderruns; // total number of underruns 37045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mOverruns; // total number of overruns 38045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten struct timespec mMeasuredWarmupTs; // measured warmup time 39045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mWarmupCycles; // number of loop cycles required to warmup 40045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 41214b406c813e5baca3e4b5cdc1d986de35f09bbbGlenn Kasten#ifdef FAST_THREAD_STATISTICS 42045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // Recently collected samples of per-cycle monotonic time, thread CPU time, and CPU frequency. 43045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // kSamplingN is max size of sampling frame (statistics), and must be a power of 2 <= 0x8000. 44045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // The sample arrays are virtually allocated based on this compile-time constant, 45045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // but are only initialized and used based on the runtime parameter mSamplingN. 46045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten static const uint32_t kSamplingN = 0x8000; 47fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten // Compile-time constant for a "low RAM device", must be a power of 2 <= kSamplingN. 48fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten // This value was chosen such that each array uses 1 small page (4 Kbytes). 49fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten static const uint32_t kSamplingNforLowRamDevice = 0x400; 50045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // Corresponding runtime maximum size of sample arrays, must be a power of 2 <= kSamplingN. 51045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mSamplingN; 52045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // The bounds define the interval of valid samples, and are represented as follows: 53045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // newest open (excluded) endpoint = lower 16 bits of bounds, modulo N 54045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // oldest closed (included) endpoint = upper 16 bits of bounds, modulo N 55045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // Number of valid samples is newest - oldest. 56045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mBounds; // bounds for mMonotonicNs, mThreadCpuNs, and mCpukHz 57045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten // The elements in the *Ns arrays are in units of nanoseconds <= 3999999999. 58045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mMonotonicNs[kSamplingN]; // delta monotonic (wall clock) time 59045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mLoadNs[kSamplingN]; // delta CPU load in time 60045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#ifdef CPU_FREQUENCY_STATISTICS 61045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten uint32_t mCpukHz[kSamplingN]; // absolute CPU clock frequency in kHz, bits 0-3 are CPU# 62045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#endif 63fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten 64fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten // Increase sampling window after construction, must be a power of 2 <= kSamplingN 65fbdb2aceab7317aa44bc8f301a93eb49e17b2bceGlenn Kasten void increaseSamplingN(uint32_t samplingN); 66045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#endif 67045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 68045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten}; // struct FastThreadDumpState 69045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 70045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten} // android 71045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten 72045ee7ea3e42b8657869d81c917feed5fb0c2b4aGlenn Kasten#endif // ANDROID_AUDIO_FAST_THREAD_DUMP_STATE_H 73