tracing_service.cc 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/tracing/tracing_service.h"
  5. #include <utility>
  6. #include "base/bind.h"
  7. #include "build/build_config.h"
  8. #include "services/tracing/perfetto/consumer_host.h"
  9. #include "services/tracing/perfetto/perfetto_service.h"
  10. #include "services/tracing/public/mojom/traced_process.mojom.h"
  11. namespace tracing {
  12. namespace {
  13. void OnProcessConnectFailed(PerfettoService* perfetto_service, uint32_t pid) {
  14. perfetto_service->RemoveActiveServicePidIfNoActiveConnections(pid);
  15. }
  16. void OnProcessConnected(
  17. PerfettoService* perfetto_service,
  18. mojo::Remote<mojom::TracedProcess> traced_process,
  19. uint32_t pid,
  20. mojo::PendingReceiver<mojom::PerfettoService> service_receiver) {
  21. perfetto_service->BindReceiver(std::move(service_receiver), pid);
  22. }
  23. } // namespace
  24. TracingService::TracingService(PerfettoService* perfetto_service)
  25. : perfetto_service_(perfetto_service ? perfetto_service
  26. : PerfettoService::GetInstance()) {}
  27. TracingService::TracingService(
  28. mojo::PendingReceiver<mojom::TracingService> receiver)
  29. : receiver_(this, std::move(receiver)),
  30. perfetto_service_(PerfettoService::GetInstance()) {}
  31. TracingService::~TracingService() = default;
  32. void TracingService::Initialize(std::vector<mojom::ClientInfoPtr> clients) {
  33. for (auto& client : clients) {
  34. AddClient(std::move(client));
  35. }
  36. perfetto_service_->SetActiveServicePidsInitialized();
  37. }
  38. void TracingService::AddClient(mojom::ClientInfoPtr client) {
  39. mojo::Remote<mojom::TracedProcess> process(std::move(client->process));
  40. perfetto_service_->AddActiveServicePid(client->pid);
  41. // If the remote traced process goes away before ConnectToTracingService
  42. // responds, the PID should be removed from the list of active service PID.
  43. // Note that the perfetto service will start monitoring disconnects after the
  44. // service receiver is bound to it in OnProcessConnected().
  45. process.set_disconnect_handler(
  46. base::BindOnce(&OnProcessConnectFailed,
  47. base::Unretained(perfetto_service_), client->pid));
  48. auto new_connection_request = mojom::ConnectToTracingRequest::New();
  49. auto service_receiver =
  50. new_connection_request->perfetto_service.InitWithNewPipeAndPassReceiver();
  51. mojom::TracedProcess* raw_process = process.get();
  52. raw_process->ConnectToTracingService(
  53. std::move(new_connection_request),
  54. base::BindOnce(&OnProcessConnected, base::Unretained(perfetto_service_),
  55. std::move(process), client->pid,
  56. std::move(service_receiver)));
  57. }
  58. #if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_IOS)
  59. void TracingService::BindConsumerHost(
  60. mojo::PendingReceiver<mojom::ConsumerHost> receiver) {
  61. ConsumerHost::BindConsumerReceiver(perfetto_service_, std::move(receiver));
  62. }
  63. #endif
  64. } // namespace tracing