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