xref: /aosp_15_r20/frameworks/av/services/audioflinger/fastpath/FastThread.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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