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) {