1bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/* 2bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * Copyright 2017 The Android Open Source Project 3bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 4bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * Licensed under the Apache License, Version 2.0 (the "License"); 5bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * you may not use this file except in compliance with the License. 6bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * You may obtain a copy of the License at 7bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 8bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * http://www.apache.org/licenses/LICENSE-2.0 9bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 10bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * Unless required by applicable law or agreed to in writing, software 11bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * distributed under the License is distributed on an "AS IS" BASIS, 12bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * See the License for the specific language governing permissions and 14bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * limitations under the License. 15bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 16bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 17bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#ifndef ANDROID_AUDIO_ERROR_LOG_H 18bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#define ANDROID_AUDIO_ERROR_LOG_H 19bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 20bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#ifdef __cplusplus 21bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 22bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <iomanip> 23bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <mutex> 24bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <sstream> 25bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <unistd.h> 26bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <vector> 27bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 28bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <audio_utils/clock.h> 29bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#include <utils/Errors.h> 30bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 31bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungnamespace android { 32bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 33bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** 34bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * ErrorLog captures audio errors codes, combining consecutive identical error codes 35bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * (within a specified time) into a single entry (to reduce log spamming). 36bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 37bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * The entry thus contains the number of consecutive error codes, 38bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * together with the first time the error code occurs and the last time the error code occurs. 39bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 40bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * The type T represents the error code type and is an int32_t for the C API. 41bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 42bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungtemplate <typename T> 43bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungclass ErrorLog { 44bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungpublic: 45bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung /** 46bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Creates an ErrorLog object 47bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 48bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param entries the length of error history. 49bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param aggregateNs the maximum time in nanoseconds between identical error codes 50bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * to be aggregated into a single entry. 51bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 52bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung explicit ErrorLog(size_t entries, int64_t aggregateNs = 1000000000 /* one second */) 53bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung : mErrors(0) 54bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mIdx(0) 55bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mAggregateNs(aggregateNs) 56bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mEntries(entries) 57bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung { 58bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 59bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 60bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung /** 61bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Adds new error code to the error log. 62bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 63bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * Consecutive errors with the same code will be aggregated 64bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * if they occur within aggregateNs. 65bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 66bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param code error code of type T. 67bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param nowNs current time in nanoseconds. 68bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 69bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung void log(const T &code, int64_t nowNs) 70bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung { 71bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung std::lock_guard<std::mutex> guard(mLock); 72bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 73bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung ++mErrors; 74bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 75bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung // Within mAggregateNs (1 second by default), aggregate error codes together. 76bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (code == mEntries[mIdx].mCode 77bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung && nowNs - mEntries[mIdx].mLastTime < mAggregateNs) { 78bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mEntries[mIdx].mCount++; 79bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mEntries[mIdx].mLastTime = nowNs; 80bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung return; 81bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 82bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 83bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung // Add new error entry. 84bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (++mIdx >= mEntries.size()) { 85bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mIdx = 0; 86bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 87bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mEntries[mIdx].setFirstError(code, nowNs); 88bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 89bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 90bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung /** 91bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Dumps the log to a std::string. 92bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param prefix the prefix to use for each line 93bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * (generally a null terminated string of spaces). 94bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param lines maximum number of lines to output (0 disables). 95bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param limitNs limit dump to data more recent than limitNs (0 disables). 96bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \return std::string of the dump. 97bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 98bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung std::string dumpToString(const char *prefix = "", size_t lines = 0, int64_t limitNs = 0) const 99bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung { 100bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung std::lock_guard<std::mutex> guard(mLock); 101bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 102bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung std::stringstream ss; 103bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const size_t numberOfEntries = mEntries.size(); 104bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const size_t headerLines = 2; 105bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 106bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (lines == 0) { 107bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung lines = SIZE_MAX; 108bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 109bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung ss << prefix << "Errors: " << mErrors << "\n"; 110bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 111bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (mErrors == 0 || lines <= headerLines) { 112bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung return ss.str(); 113bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 114bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 115bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung lines = std::min(lines - headerLines, numberOfEntries); 116bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung // compute where to start dump log 117bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung ssize_t offset; 118bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung for (offset = 0; offset < (ssize_t)lines; ++offset) { 119bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const auto &entry = 120bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mEntries[(mIdx + numberOfEntries - offset) % numberOfEntries]; 121bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (entry.mCount == 0 || entry.mLastTime < limitNs) { 122bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung break; 123bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 124bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 125bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (offset > 0) { 126bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung offset--; 127bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung ss << prefix << " Code Freq First time Last time\n"; 128bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung for (; offset >= 0; --offset) { 129bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const auto &entry = 130bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mEntries[(mIdx + numberOfEntries - offset) % numberOfEntries]; 1316b711100b6ca72660da6c1db1a5af5997d08432fAndy Hung 132bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung ss << prefix << std::setw(5) << entry.mCode 133bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung << " " << std::setw(5) << entry.mCount 1346b711100b6ca72660da6c1db1a5af5997d08432fAndy Hung << " " << audio_utils_time_string_from_ns(entry.mFirstTime).time 1356b711100b6ca72660da6c1db1a5af5997d08432fAndy Hung << " " << audio_utils_time_string_from_ns(entry.mLastTime).time << "\n"; 136bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 137bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 138bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung return ss.str(); 139bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 140bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 141bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung /** 142bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Dumps the log to a raw file descriptor. 143bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param fd file descriptor to use. 144bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param prefix the prefix to use for each line 145bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * (generally a null terminated string of spaces). 146bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param lines maximum number of lines to output (0 disables). 147bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param limitNs limit dump to data more recent than limitNs (0 disables). 148bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \return 149bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * NO_ERROR on success or a negative number (-errno) on failure of write(). 150bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 151bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung status_t dump(int fd, const char *prefix = "", size_t lines = 0, int64_t limitNs = 0) const 152bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung { 153bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung // thread safe but not necessarily serial with respect to concurrent dumps to the same fd. 154bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const std::string s = dumpToString(prefix, lines, limitNs); 155bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung if (s.size() > 0 && write(fd, s.c_str(), s.size()) < 0) { 156bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung return -errno; 157bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 158bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung return NO_ERROR; 159bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 160bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 161bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung struct Entry { 162bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung Entry() 163bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung : mCode(0) 164bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mCount(0) 165bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mFirstTime(0) 166bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung , mLastTime(0) 167bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung { 168bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 169bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 170bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung // Initialize entry with code as the first error at the given time. 171bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung void setFirstError(T code, int64_t time) { 172bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mCode = code; 173bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mCount = 1; 174bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mFirstTime = time; 175bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mLastTime = time; 176bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung } 177bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 178bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung T mCode; // error code 179bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung uint32_t mCount; // number of consecutive errors of the same code. 180bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung int64_t mFirstTime; // first time of the error code. 181bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung int64_t mLastTime; // last time of the error code. 182bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung }; 183bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 184bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungprivate: 185bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung mutable std::mutex mLock; // monitor mutex 186bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung int64_t mErrors; // total number of errors registered 187bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung size_t mIdx; // current index into mEntries (active) 188bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung const int64_t mAggregateNs; // number of nanoseconds to aggregate consecutive error codes. 189bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung std::vector<Entry> mEntries; // circular buffer of error entries. 190bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung}; 191bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 192bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung} // namespace android 193bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 194bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#endif // __cplusplus 195bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 196bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung// C API (see C++ API above for details) 197bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 198bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** \cond */ 199bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung__BEGIN_DECLS 200bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** \endcond */ 201bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 202bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungtypedef struct error_log_t error_log_t; 203bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 204bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** 205bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Creates an error log object 206bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 207bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param entries the length of error history. 208bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param aggregate_ns the maximum time in nanoseconds between identical error codes 209bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * to be aggregated into a single entry. 210bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \return the error log object or NULL on failure. 211bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 212bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungerror_log_t *error_log_create(size_t entries, int64_t aggregate_ns); 213bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 214bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** 215bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Adds new error code to the error log. 216bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 217bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * Consecutive errors with the same code will be aggregated if 218bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * they occur within aggregate_ns. 219bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 220bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param error_log object returned by create, if NULL nothing happens. 221bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param code error code of type T. 222bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param now_ns current time in nanoseconds. 223bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 224bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungvoid error_log_log(error_log_t *error_log, int32_t code, int64_t now_ns); 225bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 226bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** 227bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Dumps the log to a raw file descriptor. 228bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param error_log object returned by create, if NULL nothing happens. 229bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param prefix the prefix to use for each line 230bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * (generally a null terminated string of spaces). 231bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param fd file descriptor to use. 232bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param lines maximum number of lines to output (0 disables). 233bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param limit_ns limit dump to data more recent than limit_ns (0 disables). 234bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \return 235bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * NO_ERROR on success or a negative number (-errno) on failure of write(). 236bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * if power_log is NULL, BAD_VALUE is returned. 237bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 238bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungint error_log_dump( 239bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung error_log_t *error_log, int fd, const char *prefix, size_t lines, int64_t limit_ns); 240bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 241bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** 242bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \brief Destroys the error log object. 243bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * 244bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung * \param error_log object returned by create, if NULL nothing happens. 245bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung */ 246bb8f172c77c5823a0989c66e22608a392bd95088Andy Hungvoid error_log_destroy(error_log_t *error_log); 247bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 248bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** \cond */ 249bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung__END_DECLS 250bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung/** \endcond */ 251bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung 252bb8f172c77c5823a0989c66e22608a392bd95088Andy Hung#endif // !ANDROID_AUDIO_ERROR_LOG_H 253