| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/metrics/leak_detector/leak_detector_remote_controller.h
" | 5 #include "chrome/browser/metrics/leak_detector/leak_detector_remote_controller.h
" |
| 6 | 6 |
| 7 #include "base/bind.h" |
| 8 #include "base/callback.h" |
| 7 #include "components/metrics/leak_detector/protobuf_to_mojo_converter.h" | 9 #include "components/metrics/leak_detector/protobuf_to_mojo_converter.h" |
| 8 #include "content/public/browser/browser_thread.h" | 10 #include "content/public/browser/browser_thread.h" |
| 11 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 9 | 12 |
| 10 namespace metrics { | 13 namespace metrics { |
| 11 | 14 |
| 12 namespace { | 15 namespace { |
| 13 | 16 |
| 14 // All instances of LeakDetectorRemoteController will need to reference a single | 17 // All instances of LeakDetectorRemoteController will need to reference a single |
| 15 // LocalController instance, referenced by this pointer. All remote LeakDetector | 18 // LocalController instance, referenced by this pointer. All remote LeakDetector |
| 16 // clients will get their params from and send leak reports to this instance. | 19 // clients will get their params from and send leak reports to this instance. |
| 17 LeakDetectorRemoteController::LocalController* g_local_controller = nullptr; | 20 LeakDetectorRemoteController::LocalController* g_local_controller = nullptr; |
| 18 | 21 |
| 19 } // namespace | 22 } // namespace |
| 20 | 23 |
| 21 LeakDetectorRemoteController::~LeakDetectorRemoteController() {} | 24 LeakDetectorRemoteController::~LeakDetectorRemoteController() {} |
| 22 | 25 |
| 23 // static | 26 // static |
| 24 void LeakDetectorRemoteController::Create(mojom::LeakDetectorRequest request) { | 27 void LeakDetectorRemoteController::Create(mojom::LeakDetectorRequest request) { |
| 25 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 28 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 26 new LeakDetectorRemoteController(std::move(request)); | 29 std::unique_ptr<LeakDetectorRemoteController> controller = |
| 30 base::WrapUnique(new LeakDetectorRemoteController); |
| 31 base::Closure error_handler = |
| 32 base::Bind(&LeakDetectorRemoteController::OnRemoteProcessShutdown, |
| 33 base::Unretained(controller.get())); |
| 34 auto binding = |
| 35 mojo::MakeStrongBinding(std::move(controller), std::move(request)); |
| 36 binding->set_connection_error_handler(error_handler); |
| 27 } | 37 } |
| 28 | 38 |
| 29 void LeakDetectorRemoteController::GetParams( | 39 void LeakDetectorRemoteController::GetParams( |
| 30 const mojom::LeakDetector::GetParamsCallback& callback) { | 40 const mojom::LeakDetector::GetParamsCallback& callback) { |
| 31 // If no controller exists, send an empty param protobuf. The remote caller | 41 // If no controller exists, send an empty param protobuf. The remote caller |
| 32 // should not initialize anything if the params are empty. | 42 // should not initialize anything if the params are empty. |
| 33 MemoryLeakReportProto_Params params; | 43 MemoryLeakReportProto_Params params; |
| 34 if (g_local_controller) { | 44 if (g_local_controller) { |
| 35 params = g_local_controller->GetParamsAndRecordRequest(); | 45 params = g_local_controller->GetParamsAndRecordRequest(); |
| 36 // A non-zero sampling rate tells the remote process to enable the leak | 46 // A non-zero sampling rate tells the remote process to enable the leak |
| (...skipping 24 matching lines...) Expand all Loading... |
| 61 g_local_controller->SendLeakReports(report_protos); | 71 g_local_controller->SendLeakReports(report_protos); |
| 62 } | 72 } |
| 63 } | 73 } |
| 64 | 74 |
| 65 void LeakDetectorRemoteController::OnRemoteProcessShutdown() { | 75 void LeakDetectorRemoteController::OnRemoteProcessShutdown() { |
| 66 if (leak_detector_enabled_on_remote_process_ && g_local_controller) { | 76 if (leak_detector_enabled_on_remote_process_ && g_local_controller) { |
| 67 g_local_controller->OnRemoteProcessShutdown(); | 77 g_local_controller->OnRemoteProcessShutdown(); |
| 68 } | 78 } |
| 69 } | 79 } |
| 70 | 80 |
| 71 LeakDetectorRemoteController::LeakDetectorRemoteController( | 81 LeakDetectorRemoteController::LeakDetectorRemoteController() |
| 72 mojom::LeakDetectorRequest request) | 82 : leak_detector_enabled_on_remote_process_(false) {} |
| 73 : binding_(this, std::move(request)), | |
| 74 leak_detector_enabled_on_remote_process_(false) { | |
| 75 binding_.set_connection_error_handler( | |
| 76 base::Bind(&LeakDetectorRemoteController::OnRemoteProcessShutdown, | |
| 77 base::Unretained(this))); | |
| 78 } | |
| 79 | 83 |
| 80 // static | 84 // static |
| 81 void LeakDetectorRemoteController::SetLocalControllerInstance( | 85 void LeakDetectorRemoteController::SetLocalControllerInstance( |
| 82 LocalController* controller) { | 86 LocalController* controller) { |
| 83 // This must be on the same thread as the Mojo-based functions of this class, | 87 // This must be on the same thread as the Mojo-based functions of this class, |
| 84 // to avoid race conditions on |g_local_controller|. | 88 // to avoid race conditions on |g_local_controller|. |
| 85 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 89 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 86 g_local_controller = controller; | 90 g_local_controller = controller; |
| 87 } | 91 } |
| 88 | 92 |
| 89 } // namespace metrics | 93 } // namespace metrics |
| OLD | NEW |