1a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten/*
2a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * Copyright (C) 2014 The Android Open Source Project
3a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten *
4a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * you may not use this file except in compliance with the License.
6a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * You may obtain a copy of the License at
7a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten *
8a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten *
10a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * Unless required by applicable law or agreed to in writing, software
11a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * See the License for the specific language governing permissions and
14a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten * limitations under the License.
15a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten */
16a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
17a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten#ifndef ANDROID_AUDIO_FAST_THREAD_STATE_H
18a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten#define ANDROID_AUDIO_FAST_THREAD_STATE_H
19a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
202234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#include "Configuration.h"
21a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten#include <stdint.h>
22a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten#include <media/nbaio/NBLog.h>
23a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
24a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kastennamespace android {
25a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
262234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kastenstruct FastThreadDumpState;
272234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
28a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten// Represents a single state of a FastThread
29a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kastenstruct FastThreadState {
30a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten                FastThreadState();
31a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    /*virtual*/ ~FastThreadState();
32a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
33a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    typedef uint32_t Command;
34a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    static const Command
35a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        INITIAL = 0,            // used only for the initial state
36a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        HOT_IDLE = 1,           // do nothing
37a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        COLD_IDLE = 2,          // wait for the futex
38a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        IDLE = 3,               // either HOT_IDLE or COLD_IDLE
39a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        EXIT = 4;               // exit from thread
40a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten        // additional values defined per subclass
412234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    Command     mCommand;       // current command
42a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    int32_t*    mColdFutexAddr; // for COLD_IDLE only, pointer to the associated futex
43a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    unsigned    mColdGen;       // increment when COLD_IDLE is requested so it's only performed once
44a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
452234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // This might be a one-time configuration rather than per-state
462234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    FastThreadDumpState* mDumpState; // if non-NULL, then update dump state periodically
47a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten    NBLog::Writer* mNBLogWriter; // non-blocking logger
482234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
49a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten};  // struct FastThreadState
50a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
512234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
522234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten// FIXME extract common part of comment at FastMixerDumpState
532234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kastenstruct FastThreadDumpState {
542234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    FastThreadDumpState();
552234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    /*virtual*/ ~FastThreadDumpState();
562234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
572234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    FastThreadState::Command mCommand;   // current command
582234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mUnderruns;        // total number of underruns
592234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mOverruns;         // total number of overruns
602234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    struct timespec mMeasuredWarmupTs;  // measured warmup time
612234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mWarmupCycles;     // number of loop cycles required to warmup
622234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
632234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#ifdef FAST_MIXER_STATISTICS
642234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // Recently collected samples of per-cycle monotonic time, thread CPU time, and CPU frequency.
652234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // kSamplingN is max size of sampling frame (statistics), and must be a power of 2 <= 0x8000.
662234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // The sample arrays are virtually allocated based on this compile-time constant,
672234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // but are only initialized and used based on the runtime parameter mSamplingN.
682234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    static const uint32_t kSamplingN = 0x8000;
692234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // Corresponding runtime maximum size of sample arrays, must be a power of 2 <= kSamplingN.
702234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mSamplingN;
712234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // The bounds define the interval of valid samples, and are represented as follows:
722234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    //      newest open (excluded) endpoint   = lower 16 bits of bounds, modulo N
732234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    //      oldest closed (included) endpoint = upper 16 bits of bounds, modulo N
742234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // Number of valid samples is newest - oldest.
752234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mBounds;                   // bounds for mMonotonicNs, mThreadCpuNs, and mCpukHz
762234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    // The elements in the *Ns arrays are in units of nanoseconds <= 3999999999.
772234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mMonotonicNs[kSamplingN];  // delta monotonic (wall clock) time
782234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mLoadNs[kSamplingN];       // delta CPU load in time
792234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#ifdef CPU_FREQUENCY_STATISTICS
802234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten    uint32_t mCpukHz[kSamplingN];       // absolute CPU clock frequency in kHz, bits 0-3 are CPU#
812234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#endif
822234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten#endif
832234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
842234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten};  // struct FastThreadDumpState
852234002b0710c8db73f82d397cb945cd541c6bbbGlenn Kasten
86a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten}   // android
87a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten
88a18f644ce5eb4ab876b343e24ea613566c00058fGlenn Kasten#endif  // ANDROID_AUDIO_FAST_THREAD_STATE_H
89