blob: 965d72643fd4a81e6fe66e7131ca8d01fd98a441 [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef INCLUDE_PERFETTO_TRACING_TRACING_BACKEND_H_
#define INCLUDE_PERFETTO_TRACING_TRACING_BACKEND_H_
#include <memory>
#include <string>
#include "perfetto/base/export.h"
// The embedder can (but doesn't have to) extend the TracingBackend class and
// pass as an argument to Tracing::Initialize(kCustomBackend) to override the
// way to reach the service. This is for peculiar cases where the embedder has
// a multi-process architecture and wants to override the IPC transport. The
// real use-case for this at the time of writing is chromium (+ Mojo IPC).
// Extending this class requires depending on the full set of perfetto headers
// (not just /public/). Contact the team before doing so as the non-public
// headers are not guaranteed to be API stable.
namespace perfetto {
namespace base {
class TaskRunner;
}
// These classes are declared in headers outside of /public/.
class Consumer;
class ConsumerEndpoint;
class Producer;
class ProducerEndpoint;
// Responsible for connecting to the producer.
class PERFETTO_EXPORT_COMPONENT TracingProducerBackend {
public:
virtual ~TracingProducerBackend();
// Connects a Producer instance and obtains a ProducerEndpoint, which is
// essentially a 1:1 channel between one Producer and the Service.
// To disconnect just destroy the returned endpoint object. It is safe to
// destroy the Producer once Producer::OnDisconnect() has been invoked.
struct ConnectProducerArgs {
std::string producer_name;
// The Producer object that will receive calls like Start/StopDataSource().
// The caller has to guarantee that this object is valid as long as the
// returned ProducerEndpoint is alive.
Producer* producer = nullptr;
// The task runner where the Producer methods will be called onto.
// The caller has to guarantee that the passed TaskRunner is valid as long
// as the returned ProducerEndpoint is alive.
::perfetto::base::TaskRunner* task_runner = nullptr;
// These get propagated from TracingInitArgs and are optionally provided by
// the client when calling Tracing::Initialize().
uint32_t shmem_size_hint_bytes = 0;
uint32_t shmem_page_size_hint_bytes = 0;
// If true, the backend should allocate a shared memory buffer and provide
// it to the service when connecting.
// It's used in startup tracing.
bool use_producer_provided_smb = false;
};
virtual std::unique_ptr<ProducerEndpoint> ConnectProducer(
const ConnectProducerArgs&) = 0;
};
// Responsible for connecting to the consumer.
class PERFETTO_EXPORT_COMPONENT TracingConsumerBackend {
public:
virtual ~TracingConsumerBackend();
// As above, for the Consumer-side.
struct ConnectConsumerArgs {
// The Consumer object that will receive calls like OnTracingDisabled(),
// OnTraceData().
Consumer* consumer{};
// The task runner where the Consumer methods will be called onto.
::perfetto::base::TaskRunner* task_runner{};
};
virtual std::unique_ptr<ConsumerEndpoint> ConnectConsumer(
const ConnectConsumerArgs&) = 0;
};
class PERFETTO_EXPORT_COMPONENT TracingBackend : public TracingProducerBackend,
public TracingConsumerBackend {
public:
~TracingBackend() override;
};
} // namespace perfetto
#endif // INCLUDE_PERFETTO_TRACING_TRACING_BACKEND_H_