blob: c0c3b392653fafa04e9338452ff5c302f9489b51 [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SERVICES_TRACING_PUBLIC_CPP_SYSTEM_TRACING_SERVICE_H_
#define SERVICES_TRACING_PUBLIC_CPP_SYSTEM_TRACING_SERVICE_H_
#include "base/component_export.h"
#include "base/sequence_checker.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/shared_remote.h"
#include "services/tracing/public/mojom/system_tracing_service.mojom.h"
#include "third_party/perfetto/include/perfetto/ext/base/unix_socket.h"
namespace tracing {
// Mojo implementation between a child and the browser process for connecting to
// the Perfetto system tracing service daemon (traced) from within a sandboxed
// child process. This enables system-wide trace collection with
// traced that includes trace data from all Chrome processes.
//
// Example:
// (In the browser process: bind the receiver and pass the pending remote
// using the ChildProcess mojo interface)
// auto system_tracing_service = std::make_unique<SystemTracingService>();
// child_process->EnableSystemTracingService(
// system_tracing_service->BindAndPassPendingRemote());
//
// (In the child process, where a pending remote is received)
// mojo::SharedRemote<SystemTracingService> remote;
// remote.Bind(std::move(pending_remote));
// (Request to open the producer socket in the browser process)
// OpenProducerSocketCallback cb = ...;
// remote->OpenProducerSocket(std::move(cb));
class COMPONENT_EXPORT(TRACING_CPP) SystemTracingService
: public mojom::SystemTracingService {
public:
SystemTracingService();
SystemTracingService(const SystemTracingService&) = delete;
SystemTracingService& operator=(const SystemTracingService&) = delete;
~SystemTracingService() override;
void OpenProducerSocket(OpenProducerSocketCallback callback) override;
using OnConnectCallback = base::OnceCallback<void(bool)>;
// Same as OpenProducerSocket() with an extra parameter for testing the socket
// connection callback.
void OpenProducerSocketForTesting(OpenProducerSocketCallback callback,
OnConnectCallback on_connect_callback);
mojo::PendingRemote<mojom::SystemTracingService> BindAndPassPendingRemote();
private:
void OnConnectionError();
mojo::Receiver<mojom::SystemTracingService> receiver_{this};
};
} // namespace tracing
#endif // SERVICES_TRACING_PUBLIC_CPP_SYSTEM_TRACING_SERVICE_H_