| // Copyright 2017 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/child_process_crash_observer_android.h" |
| |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/files/file_util.h" |
| #include "base/task/post_task.h" |
| #include "components/crash/content/app/breakpad_linux.h" |
| #include "components/crash/content/browser/crash_dump_manager_android.h" |
| |
| namespace crash_reporter { |
| |
| ChildProcessCrashObserver::ChildProcessCrashObserver( |
| const base::FilePath crash_dump_dir, |
| int descriptor_id) |
| : crash_dump_dir_(crash_dump_dir), descriptor_id_(descriptor_id) {} |
| |
| ChildProcessCrashObserver::~ChildProcessCrashObserver() {} |
| |
| void ChildProcessCrashObserver::OnChildStart( |
| int process_host_id, |
| content::PosixFileDescriptorInfo* mappings) { |
| if (!breakpad::IsCrashReporterEnabled()) |
| return; |
| |
| base::ScopedFD file( |
| breakpad::CrashDumpManager::GetInstance()->CreateMinidumpFileForChild( |
| process_host_id)); |
| if (file.is_valid()) |
| mappings->Transfer(descriptor_id_, std::move(file)); |
| } |
| |
| void ChildProcessCrashObserver::OnChildExit( |
| const ChildExitObserver::TerminationInfo& info) { |
| // This might be called twice for a given child process, with a |
| // NOTIFICATION_RENDERER_PROCESS_TERMINATED and then with |
| // NOTIFICATION_RENDERER_PROCESS_CLOSED. |
| |
| base::PostTaskWithTraits( |
| FROM_HERE, {base::MayBlock(), base::TaskPriority::BEST_EFFORT}, |
| base::Bind(&breakpad::CrashDumpManager::ProcessMinidumpFileFromChild, |
| base::Unretained(breakpad::CrashDumpManager::GetInstance()), |
| crash_dump_dir_, info)); |
| } |
| |
| } // namespace crash_reporter |