xref: /aosp_15_r20/external/perfetto/src/perfetto_cmd/trigger_producer.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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