#ifndef SERVICES_TRACING_PERFETTO_PRODUCER_HOST_H_
#define SERVICES_TRACING_PERFETTO_PRODUCER_HOST_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h"
#include "third_party/perfetto/include/perfetto/ext/tracing/core/producer.h"
#include "third_party/perfetto/include/perfetto/ext/tracing/core/tracing_service.h"
#include "third_party/perfetto/include/perfetto/tracing/core/forward_decls.h"
namespace tracing {
class ProducerHost : public tracing::mojom::ProducerHost,
public perfetto::Producer {
public:
explicit ProducerHost();
ProducerHost(const ProducerHost&) = delete;
ProducerHost& operator=(const ProducerHost&) = delete;
~ProducerHost() override;
enum class InitializationResult {
kSuccess = 0,
kSmbMappingFailed = 1,
kSmbNotAdopted = 2,
kProducerEndpointConstructionFailed = 3,
kMaxValue = kProducerEndpointConstructionFailed
};
InitializationResult Initialize(
mojo::PendingRemote<mojom::ProducerClient> producer_client,
perfetto::TracingService* service,
const std::string& name,
base::UnsafeSharedMemoryRegion shared_memory,
uint64_t shared_memory_buffer_page_size_bytes);
void OnConnect() override;
void OnDisconnect() override;
void SetupDataSource(perfetto::DataSourceInstanceID id,
const perfetto::DataSourceConfig& config) override;
void StartDataSource(perfetto::DataSourceInstanceID id,
const perfetto::DataSourceConfig& config) override;
void StopDataSource(perfetto::DataSourceInstanceID) override;
void OnTracingSetup() override;
void Flush(perfetto::FlushRequestID,
const perfetto::DataSourceInstanceID* raw_data_source_ids,
size_t num_data_sources,
perfetto::FlushFlags) override;
void ClearIncrementalState(
const perfetto::DataSourceInstanceID* data_source_ids,
size_t num_data_sources) override;
void CommitData(const perfetto::CommitDataRequest& data_request,
CommitDataCallback callback) override;
void RegisterDataSource(
const perfetto::DataSourceDescriptor& registration_info) override;
void UpdateDataSource(
const perfetto::DataSourceDescriptor& registration_info) override;
void RegisterTraceWriter(uint32_t writer_id, uint32_t target_buffer) override;
void UnregisterTraceWriter(uint32_t writer_id) override;
protected:
base::RepeatingCallback<void(const perfetto::CommitDataRequest&)>
on_commit_callback_for_testing_;
private:
mojo::Remote<mojom::ProducerClient> producer_client_;
protected:
std::unique_ptr<perfetto::TracingService::ProducerEndpoint>
producer_endpoint_;
};
}
#endif