1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker * Copyright (C) 2019 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker *
4*6dbdd20aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker *
8*6dbdd20aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker *
10*6dbdd20aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker */
16*6dbdd20aSAndroid Build Coastguard Worker
17*6dbdd20aSAndroid Build Coastguard Worker #include "src/perfetto_cmd/trigger_producer.h"
18*6dbdd20aSAndroid Build Coastguard Worker
19*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
20*6dbdd20aSAndroid Build Coastguard Worker
21*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/producer.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/ipc/producer_ipc_client.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/default_socket.h"
25*6dbdd20aSAndroid Build Coastguard Worker
26*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
27*6dbdd20aSAndroid Build Coastguard Worker
TriggerProducer(base::TaskRunner * task_runner,std::function<void (bool)> callback,const std::vector<std::string> * const triggers)28*6dbdd20aSAndroid Build Coastguard Worker TriggerProducer::TriggerProducer(base::TaskRunner* task_runner,
29*6dbdd20aSAndroid Build Coastguard Worker std::function<void(bool)> callback,
30*6dbdd20aSAndroid Build Coastguard Worker const std::vector<std::string>* const triggers)
31*6dbdd20aSAndroid Build Coastguard Worker : task_runner_(task_runner),
32*6dbdd20aSAndroid Build Coastguard Worker callback_(std::move(callback)),
33*6dbdd20aSAndroid Build Coastguard Worker triggers_(triggers),
34*6dbdd20aSAndroid Build Coastguard Worker producer_endpoint_(ProducerIPCClient::Connect(GetProducerSocket(),
35*6dbdd20aSAndroid Build Coastguard Worker this,
36*6dbdd20aSAndroid Build Coastguard Worker "perfetto_cmd_producer",
37*6dbdd20aSAndroid Build Coastguard Worker task_runner)),
38*6dbdd20aSAndroid Build Coastguard Worker weak_factory_(this) {
39*6dbdd20aSAndroid Build Coastguard Worker // Give the socket up to 10 seconds to attach and send the triggers before
40*6dbdd20aSAndroid Build Coastguard Worker // reporting a failure.
41*6dbdd20aSAndroid Build Coastguard Worker auto weak_this = weak_factory_.GetWeakPtr();
42*6dbdd20aSAndroid Build Coastguard Worker task_runner_->PostDelayedTask(
43*6dbdd20aSAndroid Build Coastguard Worker [weak_this]() {
44*6dbdd20aSAndroid Build Coastguard Worker if (!weak_this || weak_this->issued_callback_)
45*6dbdd20aSAndroid Build Coastguard Worker return;
46*6dbdd20aSAndroid Build Coastguard Worker weak_this->issued_callback_ = true;
47*6dbdd20aSAndroid Build Coastguard Worker weak_this->callback_(false);
48*6dbdd20aSAndroid Build Coastguard Worker },
49*6dbdd20aSAndroid Build Coastguard Worker 10000);
50*6dbdd20aSAndroid Build Coastguard Worker }
51*6dbdd20aSAndroid Build Coastguard Worker
~TriggerProducer()52*6dbdd20aSAndroid Build Coastguard Worker TriggerProducer::~TriggerProducer() {}
53*6dbdd20aSAndroid Build Coastguard Worker
OnConnect()54*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::OnConnect() {
55*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DLOG("Producer connected, sending triggers.");
56*6dbdd20aSAndroid Build Coastguard Worker // Send activation signal.
57*6dbdd20aSAndroid Build Coastguard Worker producer_endpoint_->ActivateTriggers(*triggers_);
58*6dbdd20aSAndroid Build Coastguard Worker auto weak_this = weak_factory_.GetWeakPtr();
59*6dbdd20aSAndroid Build Coastguard Worker task_runner_->PostTask([weak_this]() {
60*6dbdd20aSAndroid Build Coastguard Worker if (!weak_this || weak_this->issued_callback_)
61*6dbdd20aSAndroid Build Coastguard Worker return;
62*6dbdd20aSAndroid Build Coastguard Worker weak_this->issued_callback_ = true;
63*6dbdd20aSAndroid Build Coastguard Worker weak_this->callback_(true);
64*6dbdd20aSAndroid Build Coastguard Worker });
65*6dbdd20aSAndroid Build Coastguard Worker }
66*6dbdd20aSAndroid Build Coastguard Worker
OnDisconnect()67*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::OnDisconnect() {}
68*6dbdd20aSAndroid Build Coastguard Worker
OnTracingSetup()69*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::OnTracingSetup() {}
70*6dbdd20aSAndroid Build Coastguard Worker
SetupDataSource(DataSourceInstanceID,const DataSourceConfig &)71*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::SetupDataSource(DataSourceInstanceID,
72*6dbdd20aSAndroid Build Coastguard Worker const DataSourceConfig&) {
73*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DFATAL("Attempted to SetupDataSource() on commandline producer");
74*6dbdd20aSAndroid Build Coastguard Worker }
StartDataSource(DataSourceInstanceID,const DataSourceConfig &)75*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::StartDataSource(DataSourceInstanceID,
76*6dbdd20aSAndroid Build Coastguard Worker const DataSourceConfig&) {
77*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DFATAL("Attempted to StartDataSource() on commandline producer");
78*6dbdd20aSAndroid Build Coastguard Worker }
StopDataSource(DataSourceInstanceID)79*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::StopDataSource(DataSourceInstanceID) {
80*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DFATAL("Attempted to StopDataSource() on commandline producer");
81*6dbdd20aSAndroid Build Coastguard Worker }
Flush(FlushRequestID,const DataSourceInstanceID *,size_t,FlushFlags)82*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::Flush(FlushRequestID,
83*6dbdd20aSAndroid Build Coastguard Worker const DataSourceInstanceID*,
84*6dbdd20aSAndroid Build Coastguard Worker size_t,
85*6dbdd20aSAndroid Build Coastguard Worker FlushFlags) {
86*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DFATAL("Attempted to Flush() on commandline producer");
87*6dbdd20aSAndroid Build Coastguard Worker }
88*6dbdd20aSAndroid Build Coastguard Worker
ClearIncrementalState(const DataSourceInstanceID *,size_t)89*6dbdd20aSAndroid Build Coastguard Worker void TriggerProducer::ClearIncrementalState(const DataSourceInstanceID*,
90*6dbdd20aSAndroid Build Coastguard Worker size_t) {
91*6dbdd20aSAndroid Build Coastguard Worker PERFETTO_DFATAL(
92*6dbdd20aSAndroid Build Coastguard Worker "Attempted to ClearIncrementalState() on commandline producer");
93*6dbdd20aSAndroid Build Coastguard Worker }
94*6dbdd20aSAndroid Build Coastguard Worker
95*6dbdd20aSAndroid Build Coastguard Worker } // namespace perfetto
96