NBLog.h revision c20cb50c1c14cd765874511872f087c875f43ed9
111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten/*
211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten * Copyright (C) 2013 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
2211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#include <binder/IMemory.h>
2311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#include <utils/Mutex.h>
24535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten#include <audio_utils/fifo.h>
2511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
2611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastennamespace android {
2711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
284e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kastenclass String8;
294e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten
3011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass NBLog {
3111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
3311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Writer;
3511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Reader;
3611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
3811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
3911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenenum Event {
4011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    EVENT_RESERVED,
4111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    EVENT_STRING,               // ASCII string, not NUL-terminated
4211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    EVENT_TIMESTAMP,            // clock_gettime(CLOCK_MONOTONIC)
43fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    EVENT_INTEGER,
44fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    EVENT_FLOAT,
45fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    EVENT_PID,
46fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    EVENT_START_FMT,            // logFormat start event: entry includes format string, following
47fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet                                // entries contain format arguments
48fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    EVENT_END_FMT,              // end of logFormat argument list
4911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
5011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
5111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ---------------------------------------------------------------------------
5211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
5311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// representation of a single log entry in private memory
5411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenstruct Entry {
5511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Entry(Event event, const void *data, size_t length)
5611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten        : mEvent(event), mLength(length), mData(data) { }
5711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    /*virtual*/ ~Entry() { }
5811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
5911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    int     readAt(size_t offset) const;
6011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
6111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
6211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    friend class Writer;
6311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Event       mEvent;     // event type
64535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    uint8_t     mLength;    // length of additional data, 0 <= mLength <= kMaxLength
6511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    const void *mData;      // event type-specific data
66535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    static const size_t kMaxLength = 255;
67535e161e2e404dffb8389dd331be0132704b6d82Glenn Kastenpublic:
68535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    static const size_t kOverhead = 3;  // mEvent, mLength, mData[...], duplicate mLength
6911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
7011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
7111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// representation of a single log entry in shared memory
7211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[0]             mEvent
7311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[1]             mLength
7411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[2]             mData[0]
7511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  ...
7611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[2+i]           mData[i]
7711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  ...
7811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[2+mLength-1]   mData[mLength-1]
7911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[2+mLength]     duplicate copy of mLength to permit reverse scan
8011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten//  byte[3+mLength]     start of next log entry
8111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
82fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendInt(String8 *body, const void *data);
83fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendFloat(String8 *body, const void *data);
84c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    static void    appendPID(String8 *body, const void *data, size_t length);
85fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static int     handleFormat(const char *fmt, size_t length, const uint8_t *data,
86fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet                                String8 *timestamp, String8 *body);
87fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    static void    appendTimestamp(String8 *body, const void *data);
88fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet
89535e161e2e404dffb8389dd331be0132704b6d82Glenn Kastenpublic:
90535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten
91535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Located in shared memory, must be POD.
92535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Exactly one process must explicitly call the constructor or use placement new.
93535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten// Since this is a POD, the destructor is empty and unnecessary to call it explicitly.
9411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenstruct Shared {
95535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    Shared() /* mRear initialized via default constructor */ { }
9611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    /*virtual*/ ~Shared() { }
9711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
98535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    audio_utils_fifo_index  mRear;  // index one byte past the end of most recent Entry
99535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    char    mBuffer[0];             // circular buffer for entries
10011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
10111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
10211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
10311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
10411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ---------------------------------------------------------------------------
10511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
10611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// FIXME Timeline was intended to wrap Writer and Reader, but isn't actually used yet.
10711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// For now it is just a namespace for sharedSize().
10811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Timeline : public RefBase {
10911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
11011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0
11111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Timeline(size_t size, void *shared = NULL);
11211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual ~Timeline();
11311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif
11411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
115fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // Input parameter 'size' is the desired size of the timeline in byte units.
116fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // Returns the size rounded up to a power-of-2, plus the constant size overhead for indices.
11711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    static size_t sharedSize(size_t size);
11811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
11911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#if 0
12011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
12111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    friend class    Writer;
12211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    friend class    Reader;
12311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
12411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    const size_t    mSize;      // circular buffer size in bytes, must be a power of 2
12511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    bool            mOwn;       // whether I own the memory at mShared
12611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Shared* const   mShared;    // pointer to shared memory
12711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif
12811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
12911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
13011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ---------------------------------------------------------------------------
13111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
13211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Writer is thread-safe with respect to Reader, but not with respect to multiple threads
13311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// calling Writer methods.  If you need multi-thread safety for writing, use LockedWriter.
13411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Writer : public RefBase {
13511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
13611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Writer();                   // dummy nop implementation without shared memory
137fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
138fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // Input parameter 'size' is the desired size of the timeline in byte units.
139fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // The size of the shared memory must be at least Timeline::sharedSize(size).
140535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    Writer(void *shared, size_t size);
141535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    Writer(const sp<IMemory>& iMemory, size_t size);
142fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
143535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    virtual ~Writer();
14411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
14511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    log(const char *string);
146ab7d72f0804fbb7e91ad9d2a16f826d97e20e5d0Glenn Kasten    virtual void    logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
14711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    logvf(const char *fmt, va_list ap);
14811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    logTimestamp();
149fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logTimestamp(const struct timespec &ts);
150fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logInteger(const int x);
151fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logFloat(const float x);
152fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logPID();
153fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logFormat(const char *fmt, ...);
154fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logVFormat(const char *fmt, va_list ap);
155fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logStart(const char *fmt);
156fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logEnd();
157fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet
15811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
15911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual bool    isEnabled() const;
16011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
16111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    // return value for all of these is the previous isEnabled()
16211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual bool    setEnabled(bool enabled);   // but won't enable if no shared memory
16311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten            bool    enable()    { return setEnabled(true); }
16411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten            bool    disable()   { return setEnabled(false); }
16511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
16611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    sp<IMemory>     getIMemory() const  { return mIMemory; }
16711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
16811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
169535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    // 0 <= length <= kMaxLength
17011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    void    log(Event event, const void *data, size_t length);
17111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    void    log(const Entry *entry, bool trusted = false);
17211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
17311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    Shared* const   mShared;    // raw pointer to shared memory
174535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    sp<IMemory>     mIMemory;   // ref-counted version, initialized in constructor and then const
175535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    audio_utils_fifo * const mFifo;                 // FIFO itself,
176535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten                                                    // non-NULL unless constructor fails
177535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    audio_utils_fifo_writer * const mFifoWriter;    // used to write to FIFO,
178535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten                                                    // non-NULL unless dummy constructor used
17911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    bool            mEnabled;   // whether to actually log
180c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet
181c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    // cached pid and process name to use in %p format specifier
182c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    // total tag length is mPidTagSize and process name is not zero terminated
183c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    char   *mPidTag;
184c20cb50c1c14cd765874511872f087c875f43ed9Nicolas Roulet    size_t  mPidTagSize;
18511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
18611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
18711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ---------------------------------------------------------------------------
18811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
18911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// Similar to Writer, but safe for multiple threads to call concurrently
19011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass LockedWriter : public Writer {
19111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
19211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    LockedWriter();
193535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    LockedWriter(void *shared, size_t size);
19411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
19511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    log(const char *string);
196ab7d72f0804fbb7e91ad9d2a16f826d97e20e5d0Glenn Kasten    virtual void    logf(const char *fmt, ...) __attribute__ ((format (printf, 2, 3)));
19711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    logvf(const char *fmt, va_list ap);
19811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual void    logTimestamp();
199fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logTimestamp(const struct timespec &ts);
200fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logInteger(const int x);
201fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logFloat(const float x);
202fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logPID();
203fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logStart(const char *fmt);
204fe1e1449cadff4f946c33403aecc73b4b4a11e56Nicolas Roulet    virtual void    logEnd();
20511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
20611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual bool    isEnabled() const;
20711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    virtual bool    setEnabled(bool enabled);
20811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
20911d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
21011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    mutable Mutex   mLock;
21111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
21211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
21311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten// ---------------------------------------------------------------------------
21411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
21511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenclass Reader : public RefBase {
21611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenpublic:
217fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
218fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // Input parameter 'size' is the desired size of the timeline in byte units.
219fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten    // The size of the shared memory must be at least Timeline::sharedSize(size).
220535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    Reader(const void *shared, size_t size);
221535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    Reader(const sp<IMemory>& iMemory, size_t size);
222fb1fdc9d6603aa228362e7349451f6455c9849c2Glenn Kasten
223535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    virtual ~Reader();
22411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
22511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    void    dump(int fd, size_t indent = 0);
22611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    bool    isIMemory(const sp<IMemory>& iMemory) const;
22711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
22811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kastenprivate:
229535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    /*const*/ Shared* const mShared;    // raw pointer to shared memory, actually const but not
230535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten                                        // declared as const because audio_utils_fifo() constructor
231535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    sp<IMemory> mIMemory;       // ref-counted version, assigned only in constructor
2324e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten    int     mFd;                // file descriptor
2334e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten    int     mIndent;            // indentation level
234535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    audio_utils_fifo * const mFifo;                 // FIFO itself,
235535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten                                                    // non-NULL unless constructor fails
236535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten    audio_utils_fifo_reader * const mFifoReader;    // used to read from FIFO,
237535e161e2e404dffb8389dd331be0132704b6d82Glenn Kasten                                                    // non-NULL unless constructor fails
2384e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten
2394e01ef6b2f6d288b9aa83b5817adad02cecc429fGlenn Kasten    void    dumpLine(const String8& timestamp, String8& body);
24011d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
24111d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten    static const size_t kSquashTimestamp = 5; // squash this many or more adjacent timestamps
24211d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};
24311d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
24411d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten};  // class NBLog
24511d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
24611d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten}   // namespace android
24711d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten
24811d8dfcc063425ae7d59229f54b6752fd8987c10Glenn Kasten#endif  // ANDROID_MEDIA_NBLOG_H
249