logd: Release() then wait for reader to exit in PrintAllLogs::End()
Otherwise, the reader thread will still be active and hold references
to logs when ~PrintAllMessages() destroys its LogBuffer instance,
which then triggers the CHECK() in ~SerializedLogChunk().
Test: ReplayMessages print_all_logs succeeds without error
Change-Id: Icee69deafa498de4ccf4d0c5eff19bef6261927e
diff --git a/logd/ReplayMessages.cpp b/logd/ReplayMessages.cpp
index bad8c56..2382ed0 100644
--- a/logd/ReplayMessages.cpp
+++ b/logd/ReplayMessages.cpp
@@ -387,6 +387,23 @@
// the incoming log rate.
usleep(100);
}
+
+ void End() override {
+ // Release the reader thread.
+ {
+ auto lock = std::lock_guard{logd_lock};
+ reader_list_.reader_threads().back()->Release();
+ }
+
+ // Wait until it has deleted itself.
+ while (true) {
+ usleep(500);
+ auto lock = std::lock_guard{logd_lock};
+ if (reader_list_.reader_threads().size() == 0) {
+ break;
+ }
+ }
+ }
};
int main(int argc, char** argv) {