Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Unified Diff: components/crash/content/browser/crash_dump_observer_android.cc

Issue 2393853002: Refactor CrashDump*Manager to use a shared CrashDumpObserver singleton. (Closed)
Patch Set: Cleanups, pre re-review Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/crash/content/browser/crash_dump_observer_android.cc
diff --git a/components/crash/content/browser/crash_dump_observer_android.cc b/components/crash/content/browser/crash_dump_observer_android.cc
new file mode 100644
index 0000000000000000000000000000000000000000..fb66db50d7a63863393ec7922f67258d15a6a17c
--- /dev/null
+++ b/components/crash/content/browser/crash_dump_observer_android.cc
@@ -0,0 +1,147 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/crash/content/browser/crash_dump_observer_android.h"
+
+#include <unistd.h>
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "base/stl_util.h"
+#include "base/threading/sequenced_worker_pool.h"
+#include "content/public/browser/browser_thread.h"
+#include "content/public/browser/child_process_data.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/browser/notification_types.h"
+#include "content/public/browser/render_process_host.h"
+
+using content::BrowserThread;
+
+namespace breakpad {
+
+CrashDumpObserver::Client::Client() {}
+
+CrashDumpObserver::Client::~Client() {}
+
+// static
+CrashDumpObserver* CrashDumpObserver::instance_ = NULL;
Lei Zhang 2016/10/05 16:57:45 nit: nullptr
+
+// static
+CrashDumpObserver* CrashDumpObserver::GetInstance() {
+ CHECK(instance_);
+ return instance_;
+}
+
+CrashDumpObserver::CrashDumpObserver() {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK(!instance_);
+ instance_ = this;
+ notification_registrar_.Add(this,
+ content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
+ content::NotificationService::AllSources());
+ notification_registrar_.Add(this,
+ content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
+ content::NotificationService::AllSources());
+ BrowserChildProcessObserver::Add(this);
+}
+
+CrashDumpObserver::~CrashDumpObserver() {
+ instance_ = nullptr;
+ BrowserChildProcessObserver::Remove(this);
+}
+
+void CrashDumpObserver::OnChildExit(int child_process_id,
+ base::ProcessHandle pid,
+ content::ProcessType process_type,
+ base::TerminationStatus termination_status,
+ base::android::ApplicationState app_state) {
+ base::AutoLock auto_lock(registered_clients_lock_);
+ base::SequencedWorkerPool* pool = BrowserThread::GetBlockingPool();
+ base::SequencedWorkerPool::SequenceToken token = pool->GetSequenceToken();
+
+ for (auto& client : registered_clients_) {
+ pool->PostSequencedWorkerTask(
+ token, FROM_HERE,
+ base::Bind(&Client::OnChildExit, client, child_process_id, pid,
+ process_type, termination_status, app_state));
+ }
+}
+
+void CrashDumpObserver::RegisterClient(scoped_refptr<Client> client) {
+ base::AutoLock auto_lock(registered_clients_lock_);
+ if (!ContainsValue(registered_clients_, client))
+ registered_clients_.push_back(std::move(client));
+}
+
+void CrashDumpObserver::UnregisterClient(scoped_refptr<Client> client) {
Lei Zhang 2016/10/05 18:00:00 I don't see anyone ever calling this.
Tobias Sargeant 2016/10/06 17:42:22 True, but it seems like it's reasonable to have it
+ base::AutoLock auto_lock(registered_clients_lock_);
+ registered_clients_.remove(client);
+}
+
+void CrashDumpObserver::BrowserChildProcessStarted(
+ int child_process_id,
+ content::FileDescriptorInfo* mappings) {
+ base::AutoLock auto_lock(registered_clients_lock_);
+ for (auto& client : registered_clients_) {
+ client->OnChildStart(child_process_id, mappings);
+ }
+}
+
+void CrashDumpObserver::BrowserChildProcessHostDisconnected(
+ const content::ChildProcessData& data) {
+ OnChildExit(data.id, data.handle,
+ static_cast<content::ProcessType>(data.process_type),
+ base::TERMINATION_STATUS_MAX_ENUM,
+ base::android::APPLICATION_STATE_UNKNOWN);
+}
+
+void CrashDumpObserver::BrowserChildProcessCrashed(
+ const content::ChildProcessData& data,
+ int exit_code) {
+ OnChildExit(data.id, data.handle,
+ static_cast<content::ProcessType>(data.process_type),
+ base::TERMINATION_STATUS_ABNORMAL_TERMINATION,
+ base::android::APPLICATION_STATE_UNKNOWN);
+}
+
+void CrashDumpObserver::Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ content::RenderProcessHost* rph =
+ content::Source<content::RenderProcessHost>(source).ptr();
+ base::TerminationStatus term_status = base::TERMINATION_STATUS_MAX_ENUM;
+ base::android::ApplicationState app_state =
+ base::android::APPLICATION_STATE_UNKNOWN;
+ switch (type) {
+ case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: {
+ // NOTIFICATION_RENDERER_PROCESS_TERMINATED is sent when the renderer
+ // process is cleanly shutdown. However, we still need to close the
+ // minidump_fd we kept open.
+ term_status = base::TERMINATION_STATUS_NORMAL_TERMINATION;
+ break;
+ }
+ case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
+ // We do not care about android fast shutdowns as it is a known case where
+ // the renderer is intentionally killed when we are done with it.
+ if (rph->FastShutdownStarted()) {
+ break;
+ }
+ content::RenderProcessHost::RendererClosedDetails* process_details =
+ content::Details<content::RenderProcessHost::RendererClosedDetails>(
+ details)
+ .ptr();
+ term_status = process_details->status;
+ app_state = base::android::ApplicationStatusListener::GetState();
+ break;
+ }
+ default:
+ NOTREACHED();
+ return;
+ }
+
+ OnChildExit(rph->GetID(), rph->GetHandle(), content::PROCESS_TYPE_RENDERER,
+ term_status, app_state);
+}
+
+} // namespace breakpad

Powered by Google App Engine
This is Rietveld 408576698