Implement log merging.
Still missing:
* Put in separate periodical thread
Bug: 35329293
Test: manual
Change-Id: Ie8802fb7972e20d8dec493376ea253bb782f3a46
diff --git a/services/medialog/MediaLogService.cpp b/services/medialog/MediaLogService.cpp
index ab2f925..4c81436 100644
--- a/services/medialog/MediaLogService.cpp
+++ b/services/medialog/MediaLogService.cpp
@@ -26,7 +26,7 @@
namespace android {
-static const char kDeadlockedString[] = "MediaLogService may be deadlocked\n";
+// static const char kDeadlockedString[] = "MediaLogService may be deadlocked\n";
void MediaLogService::registerWriter(const sp<IMemory>& shared, size_t size, const char *name)
{
@@ -36,9 +36,10 @@
return;
}
sp<NBLog::Reader> reader(new NBLog::Reader(shared, size));
- NamedReader namedReader(reader, name);
+ NBLog::NamedReader namedReader(reader, name);
Mutex::Autolock _l(mLock);
mNamedReaders.add(namedReader);
+ mMerger.addReader(namedReader);
}
void MediaLogService::unregisterWriter(const sp<IMemory>& shared)
@@ -81,7 +82,8 @@
return NO_ERROR;
}
- Vector<NamedReader> namedReaders;
+#if 0
+ Vector<NBLog::NamedReader> namedReaders;
{
bool locked = dumpTryLock(mLock);
@@ -95,19 +97,23 @@
}
return NO_ERROR;
}
- namedReaders = mNamedReaders;
+ // namedReaders = mNamedReaders;
+ // for (size_t i = 0; i < namedReaders.size(); i++) {
+ // const NBLog::NamedReader& namedReader = namedReaders[i];
+ // if (fd >= 0) {
+ // dprintf(fd, "\n%s:\n", namedReader.name());
+ // } else {
+ // ALOGI("%s:", namedReader.name());
+ // }
+ // namedReader.reader()->dump(fd, 0 /*indent*/);
+ // }
+
mLock.unlock();
}
+#endif
- for (size_t i = 0; i < namedReaders.size(); i++) {
- const NamedReader& namedReader = namedReaders[i];
- if (fd >= 0) {
- dprintf(fd, "\n%s:\n", namedReader.name());
- } else {
- ALOGI("%s:", namedReader.name());
- }
- namedReader.reader()->dump(fd, 0 /*indent*/);
- }
+ mMerger.merge();
+ mMergeReader.dump(fd);
return NO_ERROR;
}
diff --git a/services/medialog/MediaLogService.h b/services/medialog/MediaLogService.h
index c9bf2eb..e934844 100644
--- a/services/medialog/MediaLogService.h
+++ b/services/medialog/MediaLogService.h
@@ -27,8 +27,13 @@
{
friend class BinderService<MediaLogService>; // for MediaLogService()
public:
- MediaLogService() : BnMediaLogService() { }
- virtual ~MediaLogService() { }
+ MediaLogService() :
+ BnMediaLogService(),
+ mMergerShared((NBLog::Shared*) malloc(NBLog::Timeline::sharedSize(kMergeBufferSize))),
+ mMerger(mMergerShared, kMergeBufferSize),
+ mMergeReader(mMergerShared, kMergeBufferSize, mMerger)
+ {ALOGI("Nico creating MergeReader");}
+ virtual ~MediaLogService() { free(mMergerShared); }
virtual void onFirstRef() { }
static const char* getServiceName() { return "media.log"; }
@@ -47,23 +52,16 @@
// Internal dump
static const int kDumpLockRetries = 50;
static const int kDumpLockSleepUs = 20000;
+ static const size_t kMergeBufferSize = 16 * 1024; // TODO determine good value for this
static bool dumpTryLock(Mutex& mutex);
Mutex mLock;
- class NamedReader {
- public:
- NamedReader() : mReader(0) { mName[0] = '\0'; } // for Vector
- NamedReader(const sp<NBLog::Reader>& reader, const char *name) : mReader(reader)
- { strlcpy(mName, name, sizeof(mName)); }
- ~NamedReader() { }
- const sp<NBLog::Reader>& reader() const { return mReader; }
- const char* name() const { return mName; }
- private:
- sp<NBLog::Reader> mReader;
- static const size_t kMaxName = 32;
- char mName[kMaxName];
- };
- Vector<NamedReader> mNamedReaders;
+
+ Vector<NBLog::NamedReader> mNamedReaders;
+
+ NBLog::Shared *mMergerShared;
+ NBLog::Merger mMerger;
+ NBLog::MergeReader mMergeReader;
};
} // namespace android