111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten/*
2d0dfe43a46bd1705c11b405f5f376524391bfb1aSanna Catherine de Treville Wager * Copyright (C) 2017 The Android Open Source Project
311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten *
411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * you may not use this file except in compliance with the License.
611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * You may obtain a copy of the License at
711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten *
811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten *
1011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Unless required by applicable law or agreed to in writing, software
1111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * See the License for the specific language governing permissions and
1411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * limitations under the License.
1511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten */
1611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
1711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Non-blocking event logger intended for safe communication between processes via shared memory
1811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
1911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#ifndef ANDROID_MEDIA_NBLOG_H
2011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#define ANDROID_MEDIA_NBLOG_H
2111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
229484bae02627b7827ac4e6f092923185ccfbf855Sanna Catherine de Treville Wager#include <deque>
23e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager#include <map>
24537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet#include <set>
2540a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet#include <vector>
2640a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
27e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager#include <audio_utils/fifo.h>
28e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager#include <binder/IMemory.h>
298589ce7045fd4f5520aabbc773f00c7136925fd7Glenn Kasten#include <media/nblog/PerformanceAnalysis.h>
308589ce7045fd4f5520aabbc773f00c7136925fd7Glenn Kasten#include <media/nblog/ReportPerformance.h>
31e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager#include <utils/Mutex.h>
32e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager#include <utils/threads.h>
33e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
3411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastennamespace android {
3511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
364e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kastenclass String8;
374e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten
3811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass NBLog {
3911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
4011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
4111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
426ad40ee051e75ed3d986327e9967cf493047148dSanna Catherine de Treville Wager    using log_hash_t = ReportPerformance::log_hash_t;
438c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
448c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // FIXME Everything needed for client (writer API and registration) should be isolated
458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //       from the rest of the implementation.
468c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Writer;
478c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Reader;
488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
498c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    enum Event : uint8_t {
508c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_RESERVED,
518c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_STRING,               // ASCII string, not NUL-terminated
528c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                    // TODO: make timestamp optional
538c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_TIMESTAMP,            // clock_gettime(CLOCK_MONOTONIC)
548c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_INTEGER,              // integer value entry
558c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_FLOAT,                // floating point value entry
568c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_PID,                  // process ID and process name
578c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_AUTHOR,               // author index (present in merged logs) tracks entry's
588c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                    // original log
598c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_START_FMT,            // logFormat start event: entry includes format string,
608c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                    // following entries contain format arguments
618c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_HASH,                 // unique HASH of log origin, originates from hash of file name
628c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                    // and line number
638c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_HISTOGRAM_ENTRY_TS,   // single datum for timestamp histogram
648c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_AUDIO_STATE,          // audio on/off event: logged on FastMixer::onStateChange call
658c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_END_FMT,              // end of logFormat argument list
668c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EVENT_UPPER_BOUND,          // to check for invalid events
688c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
6911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
70a8a8a47da86e181d835eab7f858d6b1d2c3a8357Sanna Catherine de Treville Wagerprivate:
7111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
728c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
738c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // API for handling format entry operations
748c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
758c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // a formatted entry has the following structure:
768c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * START_FMT entry, containing the format string
778c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * TIMESTAMP entry
788c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * HASH entry
798c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * author entry of the thread that generated it (optional, present in merged log)
808c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * format arg1
818c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * format arg2
828c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * ...
838c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //    * END_FMT entry
848c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
858c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // entry representation in memory
868c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct entry {
878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const uint8_t type;
888c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const uint8_t length;
898c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const uint8_t data[0];
908c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
91537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // entry tail representation (after data)
938c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct ending {
948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        uint8_t length;
958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        uint8_t next[0];
968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
97cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
988c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // entry iterator
998c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class EntryIterator {
1008c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
1018c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator();
1028c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        explicit EntryIterator(const uint8_t *entry);
1038c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator(const EntryIterator &other);
1048c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
1058c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // dereference underlying entry
1068c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const entry&    operator*() const;
1078c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const entry*    operator->() const;
1088c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // advance to next entry
1098c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator&       operator++(); // ++i
1108c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // back to previous entry
1118c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator&       operator--(); // --i
1128c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator        next() const;
1138c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator        prev() const;
1148c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool            operator!=(const EntryIterator &other) const;
1158c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int             operator-(const EntryIterator &other) const;
1168c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
1178c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool            hasConsistentLength() const;
1188c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void            copyTo(std::unique_ptr<audio_utils_fifo_writer> &dst) const;
1198c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void            copyData(uint8_t *dst) const;
1208c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
1218c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        template<typename T>
1228c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        inline const T& payload() {
1238c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            return *reinterpret_cast<const T *>(ptr + offsetof(entry, data));
1248c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        }
1258c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
1268c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        inline operator const uint8_t*() const {
1278c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            return ptr;
1288c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        }
129cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
1308c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
1318c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const uint8_t  *ptr;
1328c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
133cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
1348c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class AbstractEntry {
1358c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
136537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1378c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Entry starting in the given pointer
1388c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        explicit AbstractEntry(const uint8_t *entry);
1398c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~AbstractEntry() {}
140537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1418c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // build concrete entry of appropriate class from pointer
1428c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static std::unique_ptr<AbstractEntry> buildEntry(const uint8_t *ptr);
143537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1448c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // get format entry timestamp
1458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int64_t      timestamp() const = 0;
146537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1478c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // get format entry's unique id
1488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual log_hash_t   hash() const = 0;
149537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1508c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // entry's author index (-1 if none present)
1518c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // a Merger has a vector of Readers, author simply points to the index of the
1528c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Reader that originated the entry
1538c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // TODO consider changing to uint32_t
1548c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int          author() const = 0;
155537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1568c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // copy entry, adding author before timestamp, returns iterator to end of entry
1578c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual EntryIterator    copyWithAuthor(std::unique_ptr<audio_utils_fifo_writer> &dst,
1588c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                int author) const = 0;
159537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1608c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    protected:
1618c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // copies ordinary entry from src to dst, and returns length of entry
1628c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // size_t      copyEntry(audio_utils_fifo_writer *dst, const iterator &it);
1638c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const uint8_t  *mEntry;
1648c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
16540a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1668c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class FormatEntry : public AbstractEntry {
1678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
1688c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // explicit FormatEntry(const EntryIterator &it);
1698c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        explicit FormatEntry(const uint8_t *ptr) : AbstractEntry(ptr) {}
1708c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~FormatEntry() {}
171dd92d7e37298d57be41f8ffd1bab6786cf8b74b9Sanna Catherine de Treville Wager
1728c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator begin() const;
17340a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1748c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Entry's format string
1758c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const   char* formatString() const;
17640a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1778c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Enrty's format string length
1788c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        size_t      formatStringLength() const;
17940a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1808c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Format arguments (excluding format string, timestamp and author)
1818c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        EntryIterator    args() const;
18240a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1838c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // get format entry timestamp
1848c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int64_t     timestamp() const override;
185bd0c6b47a93840e166f34308eb7660d81e949666Nicolas Roulet
1868c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // get format entry's unique id
1878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual log_hash_t  hash() const override;
18840a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
1898c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // entry's author index (-1 if none present)
1908c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // a Merger has a vector of Readers, author simply points to the index of the
1918c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Reader that originated the entry
1928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int         author() const override;
193cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
1948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // copy entry, adding author before timestamp, returns size of original entry
1958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual EntryIterator    copyWithAuthor(std::unique_ptr<audio_utils_fifo_writer> &dst,
1968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                int author) const override;
197537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
1988c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
199537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
2008c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class HistogramEntry : public AbstractEntry {
2018c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
2028c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        explicit HistogramEntry(const uint8_t *ptr) : AbstractEntry(ptr) {
2038c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        }
2048c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~HistogramEntry() {}
205537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
2068c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int64_t     timestamp() const override;
207537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
2088c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual log_hash_t  hash() const override;
209537ad7dab88ee1b489331094a325726a26b8c1b1Nicolas Roulet
2108c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual int         author() const override;
211cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
2128c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual EntryIterator    copyWithAuthor(std::unique_ptr<audio_utils_fifo_writer> &dst,
2138c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                int author) const override;
21440a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
2158c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
216cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
2178c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
218cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
2198c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // representation of a single log entry in private memory
2208c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct Entry {
2218c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Entry(Event event, const void *data, size_t length)
2228c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            : mEvent(event), mLength(length), mData(data) { }
2238c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        /*virtual*/ ~Entry() { }
224cd5dd016657b351d9c74dcdff87547a781108ccbNicolas Roulet
2258c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // used during writing to format Entry information as follows:
2268c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // [type][length][data ... ][length]
2278c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int     copyEntryDataAt(size_t offset) const;
2288c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
2298c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
2308c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        friend class Writer;
2318c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Event       mEvent;     // event type
2328c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        uint8_t     mLength;    // length of additional data, 0 <= mLength <= kMaxLength
2338c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const void *mData;      // event type-specific data
2348c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const size_t kMaxLength = 255;
2358c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
2368c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // mEvent, mLength, mData[...], duplicate mLength
2378c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const size_t kOverhead = sizeof(entry) + sizeof(ending);
2388c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // endind length of previous entry
239248f34f11b8942ea711957243c168b913ea90ee6Ivan Lozano        static const ssize_t kPreviousLengthOffset = - sizeof(ending) +
2408c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            offsetof(ending, length);
2418c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
2428c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
2438c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct HistTsEntry {
2448c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        log_hash_t hash;
2458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int64_t ts;
2468c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    }; //TODO __attribute__((packed));
2478c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
2488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct HistTsEntryWithAuthor {
2498c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        log_hash_t hash;
2508c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int64_t ts;
2518c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int author;
2528c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    }; //TODO __attribute__((packed));
2538c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
2548c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct HistIntEntry {
2558c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        log_hash_t hash;
2568c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int value;
2578c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    }; //TODO __attribute__((packed));
2588c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
2598c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // representation of a single log entry in shared memory
2608c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[0]             mEvent
2618c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[1]             mLength
2628c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[2]             mData[0]
2638c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  ...
2648c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[2+i]           mData[i]
2658c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  ...
2668c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[2+mLength-1]   mData[mLength-1]
2678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[2+mLength]     duplicate copy of mLength to permit reverse scan
2688c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    //  byte[3+mLength]     start of next log entry
26911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
270fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendInt(String8 *body, const void *data);
271fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendFloat(String8 *body, const void *data);
272c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    static void    appendPID(String8 *body, const void *data, size_t length);
273fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendTimestamp(String8 *body, const void *data);
27440a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet    static size_t  fmtEntryLength(const uint8_t *data);
275f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    static String8 bufferDump(const uint8_t *buffer, size_t size);
276f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    static String8 bufferDump(const EntryIterator &it);
277535e161e2e404dffb8389dd331be0132704b6d82Glenn Kastenpublic:
278535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten
2798c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Located in shared memory, must be POD.
2808c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Exactly one process must explicitly call the constructor or use placement new.
2818c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Since this is a POD, the destructor is empty and unnecessary to call it explicitly.
2828c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    struct Shared {
2838c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Shared() /* mRear initialized via default constructor */ { }
2848c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        /*virtual*/ ~Shared() { }
28511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
2868c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        audio_utils_fifo_index  mRear;  // index one byte past the end of most recent Entry
2878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        char    mBuffer[0];             // circular buffer for entries
2888c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
28911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
29011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
29111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
2928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
29311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
2948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // FIXME Timeline was intended to wrap Writer and Reader, but isn't actually used yet.
2958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // For now it is just a namespace for sharedSize().
2968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Timeline : public RefBase {
2978c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
29811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0
2998c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Timeline(size_t size, void *shared = NULL);
3008c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~Timeline();
30111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif
30211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3038c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Input parameter 'size' is the desired size of the timeline in byte units.
3048c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Returns the size rounded up to a power-of-2, plus the constant size overhead for indices.
3058c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static size_t sharedSize(size_t size);
30611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
30711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0
3088c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
3098c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        friend class    Writer;
3108c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        friend class    Reader;
31111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3128c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const size_t    mSize;      // circular buffer size in bytes, must be a power of 2
3138c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool            mOwn;       // whether I own the memory at mShared
3148c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Shared* const   mShared;    // pointer to shared memory
31511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif
3168c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
31711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3188c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
31911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3208c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Writer is thread-safe with respect to Reader, but not with respect to multiple threads
3218c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // calling Writer methods.  If you need multi-thread safety for writing, use LockedWriter.
3228c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Writer : public RefBase {
3238c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
3248c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Writer();                   // dummy nop implementation without shared memory
3258c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3268c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Input parameter 'size' is the desired size of the timeline in byte units.
3278c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // The size of the shared memory must be at least Timeline::sharedSize(size).
3288c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Writer(void *shared, size_t size);
3298c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Writer(const sp<IMemory>& iMemory, size_t size);
3308c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3318c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~Writer();
3328c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3338c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // FIXME needs comments, and some should be private
3348c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    log(const char *string);
3358c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
3368c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logvf(const char *fmt, va_list ap);
3378c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logTimestamp();
3388c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logTimestamp(const int64_t ts);
3398c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logInteger(const int x);
3408c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logFloat(const float x);
3418c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logPID();
3428c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logFormat(const char *fmt, log_hash_t hash, ...);
3438c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logVFormat(const char *fmt, log_hash_t hash, va_list ap);
3448c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logStart(const char *fmt);
3458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logEnd();
3468c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logHash(log_hash_t hash);
3478c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logEventHistTs(Event event, log_hash_t hash);
3488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3498c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual bool    isEnabled() const;
3508c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3518c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // return value for all of these is the previous isEnabled()
3528c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual bool    setEnabled(bool enabled);   // but won't enable if no shared memory
3538c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool    enable()    { return setEnabled(true); }
3548c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool    disable()   { return setEnabled(false); }
3558c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3568c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        sp<IMemory>     getIMemory() const  { return mIMemory; }
35711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3588c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
3598c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // 0 <= length <= kMaxLength
3608c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // writes a single Entry to the FIFO
3618c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void    log(Event event, const void *data, size_t length);
3628c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // checks validity of an event before calling log above this one
3638c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void    log(const Entry *entry, bool trusted = false);
3648c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3658c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Shared* const   mShared;    // raw pointer to shared memory
3668c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        sp<IMemory>     mIMemory;   // ref-counted version, initialized in constructor
3678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                    // and then const
3688c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        audio_utils_fifo * const mFifo;                 // FIFO itself, non-NULL
3698c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                        // unless constructor fails
3708c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        audio_utils_fifo_writer * const mFifoWriter;    // used to write to FIFO, non-NULL
3718c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                        // unless dummy constructor used
3728c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool            mEnabled;   // whether to actually log
3738c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3748c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // cached pid and process name to use in %p format specifier
3758c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // total tag length is mPidTagSize and process name is not zero terminated
3768c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        char   *mPidTag;
3778c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        size_t  mPidTagSize;
3788c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
37911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3808c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
38111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3828c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Similar to Writer, but safe for multiple threads to call concurrently
3838c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class LockedWriter : public Writer {
3848c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
3858c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        LockedWriter();
3868c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        LockedWriter(void *shared, size_t size);
3878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
3888c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    log(const char *string);
3898c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
3908c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logvf(const char *fmt, va_list ap);
3918c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logTimestamp();
3928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logTimestamp(const int64_t ts);
3938c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logInteger(const int x);
3948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logFloat(const float x);
3958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logPID();
3968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logStart(const char *fmt);
3978c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logEnd();
3988c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual void    logHash(log_hash_t hash);
3998c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
4008c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual bool    isEnabled() const;
4018c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual bool    setEnabled(bool enabled);
40211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
4038c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
4048c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        mutable Mutex   mLock;
4058c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
4068c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
4078c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
408fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
4098c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Reader : public RefBase {
41040a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet    public:
4118c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // A snapshot of a readers buffer
4128c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // This is raw data. No analysis has been done on it
4138c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        class Snapshot {
4148c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        public:
4158c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            Snapshot() : mData(NULL), mLost(0) {}
41640a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4178c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            Snapshot(size_t bufferSize) : mData(new uint8_t[bufferSize]) {}
41840a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4198c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            ~Snapshot() { delete[] mData; }
42040a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4218c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            // copy of the buffer
4228c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            uint8_t *data() const { return mData; }
42340a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4248c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            // amount of data lost (given by audio_utils_fifo_reader)
4258c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            size_t   lost() const { return mLost; }
4266ea1d7e449e5796068a4fcd7f22cad4316b0b8cfNicolas Roulet
4278c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            // iterator to beginning of readable segment of snapshot
4288c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            // data between begin and end has valid entries
4298c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            EntryIterator begin() { return mBegin; }
4306ea1d7e449e5796068a4fcd7f22cad4316b0b8cfNicolas Roulet
4318c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            // iterator to end of readable segment of snapshot
4328c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            EntryIterator end() { return mEnd; }
43340a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4348c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        private:
435e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager            friend class MergeReader;
4368c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            friend class Reader;
4378c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            uint8_t              *mData;
4388c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            size_t                mLost;
4398c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            EntryIterator mBegin;
4408c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            EntryIterator mEnd;
4418c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        };
442fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
4438c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Input parameter 'size' is the desired size of the timeline in byte units.
4448c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // The size of the shared memory must be at least Timeline::sharedSize(size).
4458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Reader(const void *shared, size_t size);
4468c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Reader(const sp<IMemory>& iMemory, size_t size);
44711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
4488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~Reader();
44911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
4508c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // get snapshot of readers fifo buffer, effectively consuming the buffer
4518c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        std::unique_ptr<Snapshot> getSnapshot();
452cf6c75a45416a90d2afdf42f0ac2f0b26f67839aSanna Catherine de Treville Wager
4538c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        bool     isIMemory(const sp<IMemory>& iMemory) const;
4549484bae02627b7827ac4e6f092923185ccfbf855Sanna Catherine de Treville Wager
455e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    protected:
456cf6c75a45416a90d2afdf42f0ac2f0b26f67839aSanna Catherine de Treville Wager        // print a summary of the performance to the console
457e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        void    dumpLine(const String8& timestamp, String8& body);
458e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        EntryIterator   handleFormat(const FormatEntry &fmtEntry,
459e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager                                     String8 *timestamp,
460e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager                                     String8 *body);
461e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        int mFd;                // file descriptor
462e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        int mIndent;            // indentation level
463e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        int mLost;              // bytes of data lost before buffer was read
46440a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
465e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    private:
4668c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const std::set<Event> startingTypes;
4678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const std::set<Event> endingTypes;
468e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
4698c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // declared as const because audio_utils_fifo() constructor
4708c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        sp<IMemory> mIMemory;       // ref-counted version, assigned only in constructor
471e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
472e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        /*const*/ Shared* const mShared;    // raw pointer to shared memory, actually const but not
4738c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        audio_utils_fifo * const mFifo;                 // FIFO itself,
4748c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // non-NULL unless constructor fails
4758c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        audio_utils_fifo_reader * const mFifoReader;    // used to read from FIFO,
4768c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // non-NULL unless constructor fails
4778c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
4788c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Searches for the last entry of type <type> in the range [front, back)
4798c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // back has to be entry-aligned. Returns nullptr if none enconuntered.
4808c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const uint8_t *findLastEntryOfTypes(const uint8_t *front, const uint8_t *back,
4818c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager                                                   const std::set<Event> &types);
4828c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
483e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        // dummy method for handling absent author entry
484e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        virtual void handleAuthor(const AbstractEntry& /*fmtEntry*/, String8* /*body*/) {}
4858c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
48640a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // Wrapper for a reader with a name. Contains a pointer to the reader and a pointer to the name
4888c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class NamedReader {
4898c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
4908c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        NamedReader() { mName[0] = '\0'; } // for Vector
4918c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        NamedReader(const sp<NBLog::Reader>& reader, const char *name) :
4928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            mReader(reader)
4938c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager            { strlcpy(mName, name, sizeof(mName)); }
4948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        ~NamedReader() { }
4958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const sp<NBLog::Reader>&  reader() const { return mReader; }
4968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const char*               name() const { return mName; }
49740a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
4988c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
4998c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        sp<NBLog::Reader>   mReader;
5008c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const size_t kMaxName = 32;
5018c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        char                mName[kMaxName];
5028c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
50340a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
5048c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // ---------------------------------------------------------------------------
50540a4498b967d000c93e8561db5fdd0488cc1d824Nicolas Roulet
506e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    // This class is used to read data from each thread's individual FIFO in shared memory
507e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    // and write it to a single FIFO in local memory.
5088c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class Merger : public RefBase {
5098c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
5108c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Merger(const void *shared, size_t size);
511dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5128c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~Merger() {}
513dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5148c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void addReader(const NamedReader &reader);
5158c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // TODO add removeReader
5168c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void merge();
517e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
5188c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // FIXME This is returning a reference to a shared variable that needs a lock
5198c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const std::vector<NamedReader>& getNamedReaders() const;
520e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
5218c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
5228c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // vector of the readers the merger is supposed to merge from.
5238c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // every reader reads from a writer's buffer
5248c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // FIXME Needs to be protected by a lock
5258c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        std::vector<NamedReader> mNamedReaders;
5268c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
527e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        Shared * const mShared; // raw pointer to shared memory
528e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        std::unique_ptr<audio_utils_fifo> mFifo; // FIFO itself
529e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        std::unique_ptr<audio_utils_fifo_writer> mFifoWriter; // used to write to FIFO
5308c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
531dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
532e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    // This class has a pointer to the FIFO in local memory which stores the merged
533e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    // data collected by NBLog::Merger from all NamedReaders. It is used to process
534e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager    // this data and write the result to PerformanceAnalysis.
5358c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class MergeReader : public Reader {
5368c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
5378c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        MergeReader(const void *shared, size_t size, Merger &merger);
538e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
539cf6c75a45416a90d2afdf42f0ac2f0b26f67839aSanna Catherine de Treville Wager        void dump(int fd, int indent = 0);
540e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        // process a particular snapshot of the reader
541e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        void getAndProcessSnapshot(Snapshot & snap);
542e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        // call getSnapshot of the content of the reader's buffer and process the data
543e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        void getAndProcessSnapshot();
544e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
5458c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
5468c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // FIXME Needs to be protected by a lock,
5478c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        //       because even though our use of it is read-only there may be asynchronous updates
5488c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        const std::vector<NamedReader>& mNamedReaders;
549e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
550e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        // analyzes, compresses and stores the merged data
551d096517201332e03679c913e0d098c61ec6e4f0cSanna Catherine de Treville Wager        // contains a separate instance for every author (thread), and for every source file
552d096517201332e03679c913e0d098c61ec6e4f0cSanna Catherine de Treville Wager        // location within each author
553d096517201332e03679c913e0d098c61ec6e4f0cSanna Catherine de Treville Wager        ReportPerformance::PerformanceAnalysisMap mThreadPerformanceAnalysis;
554e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
5558c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // handle author entry by looking up the author's name and appending it to the body
5568c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // returns number of bytes read from fmtEntry
5578c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void handleAuthor(const AbstractEntry &fmtEntry, String8 *body);
5588c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
559dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5608c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // MergeThread is a thread that contains a Merger. It works as a retriggerable one-shot:
5618c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // when triggered, it awakes for a lapse of time, during which it periodically merges; if
5628c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // retriggered, the timeout is reset.
5638c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    // The thread is triggered on AudioFlinger binder activity.
5648c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    class MergeThread : public Thread {
5658c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    public:
566e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        MergeThread(Merger &merger, MergeReader &mergeReader);
5678c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual ~MergeThread() override;
568dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5698c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Reset timeout and activate thread to merge periodically if it's idle
5708c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void wakeup();
571dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5728c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // Set timeout period until the merging thread goes idle again
5738c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        void setTimeoutUs(int time);
5748c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
5758c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    private:
5768c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        virtual bool threadLoop() override;
577dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5788c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // the merger who actually does the work of merging the logs
5798c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Merger&     mMerger;
580dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
581e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        // the mergereader used to process data merged by mMerger
582e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager        MergeReader& mMergeReader;
583e48652674ebd4047363a79d38a6018978087223eSanna Catherine de Treville Wager
5848c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // mutex for the condition variable
5858c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Mutex       mMutex;
586dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
5878c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // condition variable to activate merging on timeout >= 0
5888c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        Condition   mCond;
5898c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
5908c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // time left until the thread blocks again (in microseconds)
5918c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        int         mTimeoutUs;
5928c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
5938c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // merging period when the thread is awake
5948c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const int  kThreadSleepPeriodUs = 1000000 /*1s*/;
5958c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager
5968c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        // initial timeout value when triggered
5978c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager        static const int  kThreadWakeupPeriodUs = 3000000 /*3s*/;
5988c3d2e89ece54232f23c179d979cc5599f742232Sanna Catherine de Treville Wager    };
599dcdfaecc1fa630a799e1fdb508a9b92da55abc36Nicolas Roulet
60011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};  // class NBLog
60111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
602f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet// TODO put somewhere else
603f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Rouletstatic inline int64_t get_monotonic_ns() {
604f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    timespec ts;
605f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
606f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet        return (uint64_t) ts.tv_sec * 1000 * 1000 * 1000 + ts.tv_nsec;
607f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    }
608f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet    return 0; // should not happen.
609f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet}
610f42f15685ee622b1e341c8958f616c17801a1ad0Nicolas Roulet
61111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}   // namespace android
61211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
61311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif  // ANDROID_MEDIA_NBLOG_H
614