123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- // Copyright 2018 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.
- #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 base {
- namespace tracing {
- class PerfettoTaskRunner;
- } // namespace tracing
- } // namespace base
- namespace tracing {
- // This class is the service-side part of the Perfetto Producer pair
- // and is responsible for registering any available DataSources
- // with Perfetto (like ChromeTracing) in OnConnect(). It will forward
- // control messages from Perfetto to its per-process ProducerClient
- // counterpart, like starting tracing with a specific shared memory buffer,
- // create/teardown instances of specific data sources, etc.
- // It's managed by PerfettoService which is responsible for
- // creating a ProducerHost when a ProducerClient registers itself
- // and connects them together.
- class ProducerHost : public tracing::mojom::ProducerHost,
- public perfetto::Producer {
- public:
- explicit ProducerHost(base::tracing::PerfettoTaskRunner*);
- ProducerHost(const ProducerHost&) = delete;
- ProducerHost& operator=(const ProducerHost&) = delete;
- ~ProducerHost() override;
- // Keep in sync with tools/metrics/histograms/enums.xml. These values are
- // persisted to logs. Entries should not be renumbered and numeric values
- // should never be reused.
- enum class InitializationResult {
- kSuccess = 0,
- kSmbMappingFailed = 1,
- kSmbNotAdopted = 2,
- kProducerEndpointConstructionFailed = 3,
- kMaxValue = kProducerEndpointConstructionFailed
- };
- // Called by the ProducerService to register the Producer with Perfetto,
- // connect to the corresponding remote ProducerClient, and setup the provided
- // shared memory buffer for tracing data exchange.
- 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);
- // perfetto::Producer implementation.
- // Gets called by perfetto::TracingService to toggle specific data sources
- // when requested by a Perfetto Consumer.
- 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) override;
- void ClearIncrementalState(
- const perfetto::DataSourceInstanceID* data_source_ids,
- size_t num_data_sources) override;
- // mojom::ProducerHost implementation.
- // This interface gets called by the per-process ProducerClients
- // to signal that there's changes to be committed to the
- // Shared Memory buffer (like finished chunks).
- void CommitData(const perfetto::CommitDataRequest& data_request,
- CommitDataCallback callback) override;
- // Called by the ProducerClient to signal the Host that it can
- // provide a specific data source.
- void RegisterDataSource(
- const perfetto::DataSourceDescriptor& registration_info) override;
- // Called by the ProducerClient to associate a TraceWriter with a target
- // buffer, which is required to support scraping of the SMB by the service.
- 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_;
- raw_ptr<base::tracing::PerfettoTaskRunner> task_runner_;
- protected:
- // Perfetto guarantees that no OnXX callbacks are invoked on |this|
- // immediately after |producer_endpoint_| is destroyed.
- std::unique_ptr<perfetto::TracingService::ProducerEndpoint>
- producer_endpoint_;
- };
- } // namespace tracing
- #endif // SERVICES_TRACING_PERFETTO_PRODUCER_HOST_H_
|