1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #pragma once 18*ec779b8eSAndroid Build Coastguard Worker 19*ec779b8eSAndroid Build Coastguard Worker #include "Configuration.h" 20*ec779b8eSAndroid Build Coastguard Worker #ifdef CPU_FREQUENCY_STATISTICS 21*ec779b8eSAndroid Build Coastguard Worker #include <cpustats/ThreadCpuUsage.h> 22*ec779b8eSAndroid Build Coastguard Worker #endif 23*ec779b8eSAndroid Build Coastguard Worker #include <utils/Thread.h> 24*ec779b8eSAndroid Build Coastguard Worker #include "FastThreadState.h" 25*ec779b8eSAndroid Build Coastguard Worker 26*ec779b8eSAndroid Build Coastguard Worker namespace android { 27*ec779b8eSAndroid Build Coastguard Worker 28*ec779b8eSAndroid Build Coastguard Worker // FastThread is the common abstract base class of FastMixer and FastCapture 29*ec779b8eSAndroid Build Coastguard Worker class FastThread : public Thread { 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker public: 32*ec779b8eSAndroid Build Coastguard Worker FastThread(const char *cycleMs, const char *loadUs); 33*ec779b8eSAndroid Build Coastguard Worker 34*ec779b8eSAndroid Build Coastguard Worker private: 35*ec779b8eSAndroid Build Coastguard Worker // implement Thread::threadLoop() 36*ec779b8eSAndroid Build Coastguard Worker bool threadLoop() override; 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Worker protected: 39*ec779b8eSAndroid Build Coastguard Worker // callouts to subclass in same lexical order as they were in original FastMixer.cpp 40*ec779b8eSAndroid Build Coastguard Worker // FIXME need comments 41*ec779b8eSAndroid Build Coastguard Worker virtual const FastThreadState *poll() = 0; setNBLogWriter(NBLog::Writer * logWriter __unused)42*ec779b8eSAndroid Build Coastguard Worker virtual void setNBLogWriter(NBLog::Writer *logWriter __unused) { } 43*ec779b8eSAndroid Build Coastguard Worker virtual void onIdle() = 0; 44*ec779b8eSAndroid Build Coastguard Worker virtual void onExit() = 0; 45*ec779b8eSAndroid Build Coastguard Worker virtual bool isSubClassCommand(FastThreadState::Command command) = 0; 46*ec779b8eSAndroid Build Coastguard Worker virtual void onStateChange() = 0; 47*ec779b8eSAndroid Build Coastguard Worker virtual void onWork() = 0; 48*ec779b8eSAndroid Build Coastguard Worker 49*ec779b8eSAndroid Build Coastguard Worker // FIXME these former local variables need comments 50*ec779b8eSAndroid Build Coastguard Worker const FastThreadState* mPrevious = nullptr; 51*ec779b8eSAndroid Build Coastguard Worker const FastThreadState* mCurrent = nullptr; 52*ec779b8eSAndroid Build Coastguard Worker struct timespec mOldTs{}; 53*ec779b8eSAndroid Build Coastguard Worker bool mOldTsValid = false; 54*ec779b8eSAndroid Build Coastguard Worker int64_t mSleepNs = -1; // -1: busy wait, 0: sched_yield, > 0: nanosleep 55*ec779b8eSAndroid Build Coastguard Worker int64_t mPeriodNs = 0; // expected period; the time required to 56*ec779b8eSAndroid Build Coastguard Worker // render one mix buffer 57*ec779b8eSAndroid Build Coastguard Worker int64_t mUnderrunNs = 0; // underrun likely when write cycle 58*ec779b8eSAndroid Build Coastguard Worker // is greater than this value 59*ec779b8eSAndroid Build Coastguard Worker int64_t mOverrunNs = 0; // overrun likely when write cycle is less than this value 60*ec779b8eSAndroid Build Coastguard Worker int64_t mForceNs = 0; // if overrun detected, 61*ec779b8eSAndroid Build Coastguard Worker // force the write cycle to take this much time 62*ec779b8eSAndroid Build Coastguard Worker int64_t mWarmupNsMin = 0; // warmup complete when write cycle is greater 63*ec779b8eSAndroid Build Coastguard Worker // than or equal to this value 64*ec779b8eSAndroid Build Coastguard Worker int64_t mWarmupNsMax = INT64_MAX; // and less than or equal to this value 65*ec779b8eSAndroid Build Coastguard Worker FastThreadDumpState* mDummyDumpState = nullptr; 66*ec779b8eSAndroid Build Coastguard Worker FastThreadDumpState* mDumpState = nullptr; 67*ec779b8eSAndroid Build Coastguard Worker bool mIgnoreNextOverrun = true; // used to ignore initial overrun 68*ec779b8eSAndroid Build Coastguard Worker // and first after an underrun 69*ec779b8eSAndroid Build Coastguard Worker #ifdef FAST_THREAD_STATISTICS 70*ec779b8eSAndroid Build Coastguard Worker struct timespec mOldLoad; // previous value of clock_gettime(CLOCK_THREAD_CPUTIME_ID) 71*ec779b8eSAndroid Build Coastguard Worker bool mOldLoadValid = false; // whether oldLoad is valid 72*ec779b8eSAndroid Build Coastguard Worker uint32_t mBounds = 0; 73*ec779b8eSAndroid Build Coastguard Worker bool mFull = false; // whether we have collected at least mSamplingN samples 74*ec779b8eSAndroid Build Coastguard Worker #ifdef CPU_FREQUENCY_STATISTICS 75*ec779b8eSAndroid Build Coastguard Worker ThreadCpuUsage mTcu; // for reading the current CPU clock frequency in kHz 76*ec779b8eSAndroid Build Coastguard Worker #endif 77*ec779b8eSAndroid Build Coastguard Worker #endif 78*ec779b8eSAndroid Build Coastguard Worker unsigned mColdGen = 0; // last observed mColdGen 79*ec779b8eSAndroid Build Coastguard Worker bool mIsWarm = false; // true means ready to mix, 80*ec779b8eSAndroid Build Coastguard Worker // false means wait for warmup before mixing 81*ec779b8eSAndroid Build Coastguard Worker struct timespec mMeasuredWarmupTs{}; // how long did it take for warmup to complete 82*ec779b8eSAndroid Build Coastguard Worker uint32_t mWarmupCycles = 0; // counter of number of loop cycles during warmup phase 83*ec779b8eSAndroid Build Coastguard Worker uint32_t mWarmupConsecutiveInRangeCycles = 0; // number of consecutive cycles in range 84*ec779b8eSAndroid Build Coastguard Worker const sp<NBLog::Writer> mDummyNBLogWriter{new NBLog::Writer()}; 85*ec779b8eSAndroid Build Coastguard Worker status_t mTimestampStatus = INVALID_OPERATION; 86*ec779b8eSAndroid Build Coastguard Worker 87*ec779b8eSAndroid Build Coastguard Worker FastThreadState::Command mCommand = FastThreadState::INITIAL; 88*ec779b8eSAndroid Build Coastguard Worker bool mAttemptedWrite = false; 89*ec779b8eSAndroid Build Coastguard Worker 90*ec779b8eSAndroid Build Coastguard Worker // init in constructor 91*ec779b8eSAndroid Build Coastguard Worker char mCycleMs[16]; // cycle_ms + suffix 92*ec779b8eSAndroid Build Coastguard Worker char mLoadUs[16]; // load_us + suffix 93*ec779b8eSAndroid Build Coastguard Worker 94*ec779b8eSAndroid Build Coastguard Worker }; // class FastThread 95*ec779b8eSAndroid Build Coastguard Worker 96*ec779b8eSAndroid Build Coastguard Worker } // namespace android 97