diff options
author | Glenn Kasten <gkasten@google.com> | 2012-05-30 14:52:57 -0700 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2012-06-11 11:39:54 -0700 |
commit | c15d6657a17d7cef91f800f40d11760e2e7340af (patch) | |
tree | c4346cb0fcde7483e42900aecce64df96250889b /services/audioflinger/AudioWatchdog.h | |
parent | b7acdfb8068bf408ed859dfdd441b4a8722eb12a (diff) | |
download | frameworks_av-c15d6657a17d7cef91f800f40d11760e2e7340af.zip frameworks_av-c15d6657a17d7cef91f800f40d11760e2e7340af.tar.gz frameworks_av-c15d6657a17d7cef91f800f40d11760e2e7340af.tar.bz2 |
Add audio watchdog thread
Change-Id: I4ed62087bd6554179abb8258d2da606050e762c0
Diffstat (limited to 'services/audioflinger/AudioWatchdog.h')
-rw-r--r-- | services/audioflinger/AudioWatchdog.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/services/audioflinger/AudioWatchdog.h b/services/audioflinger/AudioWatchdog.h new file mode 100644 index 0000000..4657530 --- /dev/null +++ b/services/audioflinger/AudioWatchdog.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// The watchdog thread runs periodically. It has two functions: +// (a) verify that adequate CPU time is available, and log +// as soon as possible when there appears to be a CPU shortage +// (b) monitor the other threads [not yet implemented] + +#ifndef AUDIO_WATCHDOG_H +#define AUDIO_WATCHDOG_H + +#include <time.h> +#include <utils/Thread.h> + +namespace android { + +// Keeps a cache of AudioWatchdog statistics that can be logged by dumpsys. +// The usual caveats about atomicity of information apply. +struct AudioWatchdogDump { + AudioWatchdogDump() : mUnderruns(0), mLogs(0), mMostRecent(0) { } + /*virtual*/ ~AudioWatchdogDump() { } + uint32_t mUnderruns; // total number of underruns + uint32_t mLogs; // total number of log messages + time_t mMostRecent; // time of most recent log + void dump(int fd); // should only be called on a stable copy, not the original +}; + +class AudioWatchdog : public Thread { + +public: + AudioWatchdog(unsigned periodMs = 50) : Thread(false /*canCallJava*/), mPaused(false), + mPeriodNs(periodMs * 1000000), mMaxCycleNs(mPeriodNs * 2), + // mOldTs + // mLogTs initialized below + mOldTsValid(false), mUnderruns(0), mLogs(0), mDump(&mDummyDump) + { +#define MIN_TIME_BETWEEN_LOGS_SEC 60 + // force an immediate log on first underrun + mLogTs.tv_sec = MIN_TIME_BETWEEN_LOGS_SEC; + mLogTs.tv_nsec = 0; + } + virtual ~AudioWatchdog() { } + + // Do not call Thread::requestExitAndWait() without first calling requestExit(). + // Thread::requestExitAndWait() is not virtual, and the implementation doesn't do enough. + virtual void requestExit(); + + // FIXME merge API and implementation with AudioTrackThread + void pause(); // suspend thread from execution at next loop boundary + void resume(); // allow thread to execute, if not requested to exit + + // Where to store the dump, or NULL to not update + void setDump(AudioWatchdogDump* dump); + +private: + virtual bool threadLoop(); + + Mutex mMyLock; // Thread::mLock is private + Condition mMyCond; // Thread::mThreadExitedCondition is private + bool mPaused; // whether thread is currently paused + + uint32_t mPeriodNs; // nominal period + uint32_t mMaxCycleNs; // maximum allowed time of one cycle before declaring underrun + struct timespec mOldTs; // monotonic time when threadLoop last ran + struct timespec mLogTs; // time since last log + bool mOldTsValid; // whether mOldTs is valid + uint32_t mUnderruns; // total number of underruns + uint32_t mLogs; // total number of logs + AudioWatchdogDump* mDump; // where to store the dump, always non-NULL + AudioWatchdogDump mDummyDump; // default area for dump in case setDump() is not called +}; + +} // namespace android + +#endif // AUDIO_WATCHDOG_H |