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