xref: /aosp_15_r20/external/perfetto/src/ipc/deferred.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2017 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 "perfetto/ext/ipc/deferred.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/utils.h"
21*6dbdd20aSAndroid Build Coastguard Worker 
22*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
23*6dbdd20aSAndroid Build Coastguard Worker namespace ipc {
24*6dbdd20aSAndroid Build Coastguard Worker 
DeferredBase(std::function<void (AsyncResult<ProtoMessage>)> callback)25*6dbdd20aSAndroid Build Coastguard Worker DeferredBase::DeferredBase(
26*6dbdd20aSAndroid Build Coastguard Worker     std::function<void(AsyncResult<ProtoMessage>)> callback)
27*6dbdd20aSAndroid Build Coastguard Worker     : callback_(std::move(callback)) {}
28*6dbdd20aSAndroid Build Coastguard Worker 
~DeferredBase()29*6dbdd20aSAndroid Build Coastguard Worker DeferredBase::~DeferredBase() {
30*6dbdd20aSAndroid Build Coastguard Worker   if (callback_)
31*6dbdd20aSAndroid Build Coastguard Worker     Reject();
32*6dbdd20aSAndroid Build Coastguard Worker }
33*6dbdd20aSAndroid Build Coastguard Worker 
34*6dbdd20aSAndroid Build Coastguard Worker // Can't just use "= default" here because the default move operator for
35*6dbdd20aSAndroid Build Coastguard Worker // std::function doesn't necessarily swap and hence can leave a copy of the
36*6dbdd20aSAndroid Build Coastguard Worker // bind state around, which is undesirable.
DeferredBase(DeferredBase && other)37*6dbdd20aSAndroid Build Coastguard Worker DeferredBase::DeferredBase(DeferredBase&& other) noexcept {
38*6dbdd20aSAndroid Build Coastguard Worker   Move(other);
39*6dbdd20aSAndroid Build Coastguard Worker }
40*6dbdd20aSAndroid Build Coastguard Worker 
operator =(DeferredBase && other)41*6dbdd20aSAndroid Build Coastguard Worker DeferredBase& DeferredBase::operator=(DeferredBase&& other) {
42*6dbdd20aSAndroid Build Coastguard Worker   if (callback_)
43*6dbdd20aSAndroid Build Coastguard Worker     Reject();
44*6dbdd20aSAndroid Build Coastguard Worker   Move(other);
45*6dbdd20aSAndroid Build Coastguard Worker   return *this;
46*6dbdd20aSAndroid Build Coastguard Worker }
47*6dbdd20aSAndroid Build Coastguard Worker 
Move(DeferredBase & other)48*6dbdd20aSAndroid Build Coastguard Worker void DeferredBase::Move(DeferredBase& other) {
49*6dbdd20aSAndroid Build Coastguard Worker   callback_ = std::move(other.callback_);
50*6dbdd20aSAndroid Build Coastguard Worker   other.callback_ = nullptr;
51*6dbdd20aSAndroid Build Coastguard Worker }
52*6dbdd20aSAndroid Build Coastguard Worker 
Bind(std::function<void (AsyncResult<ProtoMessage>)> callback)53*6dbdd20aSAndroid Build Coastguard Worker void DeferredBase::Bind(
54*6dbdd20aSAndroid Build Coastguard Worker     std::function<void(AsyncResult<ProtoMessage>)> callback) {
55*6dbdd20aSAndroid Build Coastguard Worker   callback_ = std::move(callback);
56*6dbdd20aSAndroid Build Coastguard Worker }
57*6dbdd20aSAndroid Build Coastguard Worker 
IsBound() const58*6dbdd20aSAndroid Build Coastguard Worker bool DeferredBase::IsBound() const {
59*6dbdd20aSAndroid Build Coastguard Worker   return !!callback_;
60*6dbdd20aSAndroid Build Coastguard Worker }
61*6dbdd20aSAndroid Build Coastguard Worker 
Resolve(AsyncResult<ProtoMessage> async_result)62*6dbdd20aSAndroid Build Coastguard Worker void DeferredBase::Resolve(AsyncResult<ProtoMessage> async_result) {
63*6dbdd20aSAndroid Build Coastguard Worker   if (!callback_) {
64*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_DFATAL("No callback set.");
65*6dbdd20aSAndroid Build Coastguard Worker     return;
66*6dbdd20aSAndroid Build Coastguard Worker   }
67*6dbdd20aSAndroid Build Coastguard Worker   bool has_more = async_result.has_more();
68*6dbdd20aSAndroid Build Coastguard Worker   callback_(std::move(async_result));
69*6dbdd20aSAndroid Build Coastguard Worker   if (!has_more)
70*6dbdd20aSAndroid Build Coastguard Worker     callback_ = nullptr;
71*6dbdd20aSAndroid Build Coastguard Worker }
72*6dbdd20aSAndroid Build Coastguard Worker 
73*6dbdd20aSAndroid Build Coastguard Worker // Resolves with a nullptr |msg_|, signalling failure to |callback_|.
Reject()74*6dbdd20aSAndroid Build Coastguard Worker void DeferredBase::Reject() {
75*6dbdd20aSAndroid Build Coastguard Worker   Resolve(AsyncResult<ProtoMessage>());
76*6dbdd20aSAndroid Build Coastguard Worker }
77*6dbdd20aSAndroid Build Coastguard Worker 
78*6dbdd20aSAndroid Build Coastguard Worker }  // namespace ipc
79*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
80