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