xref: /aosp_15_r20/external/perfetto/src/ipc/client_impl.h (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 #ifndef SRC_IPC_CLIENT_IMPL_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_IPC_CLIENT_IMPL_H_
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include <list>
21*6dbdd20aSAndroid Build Coastguard Worker #include <map>
22*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
23*6dbdd20aSAndroid Build Coastguard Worker 
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/task_runner.h"
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/unix_socket.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/ipc/client.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "src/ipc/buffered_frame_deserializer.h"
29*6dbdd20aSAndroid Build Coastguard Worker 
30*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
31*6dbdd20aSAndroid Build Coastguard Worker 
32*6dbdd20aSAndroid Build Coastguard Worker namespace protos {
33*6dbdd20aSAndroid Build Coastguard Worker namespace gen {
34*6dbdd20aSAndroid Build Coastguard Worker class IPCFrame_BindServiceReply;
35*6dbdd20aSAndroid Build Coastguard Worker class IPCFrame_InvokeMethodReply;
36*6dbdd20aSAndroid Build Coastguard Worker }  // namespace gen
37*6dbdd20aSAndroid Build Coastguard Worker }  // namespace protos
38*6dbdd20aSAndroid Build Coastguard Worker 
39*6dbdd20aSAndroid Build Coastguard Worker namespace base {
40*6dbdd20aSAndroid Build Coastguard Worker class TaskRunner;
41*6dbdd20aSAndroid Build Coastguard Worker }  // namespace base
42*6dbdd20aSAndroid Build Coastguard Worker 
43*6dbdd20aSAndroid Build Coastguard Worker namespace ipc {
44*6dbdd20aSAndroid Build Coastguard Worker 
45*6dbdd20aSAndroid Build Coastguard Worker class ServiceDescriptor;
46*6dbdd20aSAndroid Build Coastguard Worker 
47*6dbdd20aSAndroid Build Coastguard Worker class ClientImpl : public Client, public base::UnixSocket::EventListener {
48*6dbdd20aSAndroid Build Coastguard Worker  public:
49*6dbdd20aSAndroid Build Coastguard Worker   ClientImpl(ConnArgs, base::TaskRunner*);
50*6dbdd20aSAndroid Build Coastguard Worker   ~ClientImpl() override;
51*6dbdd20aSAndroid Build Coastguard Worker 
52*6dbdd20aSAndroid Build Coastguard Worker   // Client implementation.
53*6dbdd20aSAndroid Build Coastguard Worker   void BindService(base::WeakPtr<ServiceProxy>) override;
54*6dbdd20aSAndroid Build Coastguard Worker   void UnbindService(ServiceID) override;
55*6dbdd20aSAndroid Build Coastguard Worker   base::ScopedFile TakeReceivedFD() override;
56*6dbdd20aSAndroid Build Coastguard Worker 
57*6dbdd20aSAndroid Build Coastguard Worker   // base::UnixSocket::EventListener implementation.
58*6dbdd20aSAndroid Build Coastguard Worker   void OnConnect(base::UnixSocket*, bool connected) override;
59*6dbdd20aSAndroid Build Coastguard Worker   void OnDisconnect(base::UnixSocket*) override;
60*6dbdd20aSAndroid Build Coastguard Worker   void OnDataAvailable(base::UnixSocket*) override;
61*6dbdd20aSAndroid Build Coastguard Worker 
62*6dbdd20aSAndroid Build Coastguard Worker   RequestID BeginInvoke(ServiceID,
63*6dbdd20aSAndroid Build Coastguard Worker                         const std::string& method_name,
64*6dbdd20aSAndroid Build Coastguard Worker                         MethodID remote_method_id,
65*6dbdd20aSAndroid Build Coastguard Worker                         const ProtoMessage& method_args,
66*6dbdd20aSAndroid Build Coastguard Worker                         bool drop_reply,
67*6dbdd20aSAndroid Build Coastguard Worker                         base::WeakPtr<ServiceProxy>,
68*6dbdd20aSAndroid Build Coastguard Worker                         int fd = -1);
69*6dbdd20aSAndroid Build Coastguard Worker 
GetUnixSocketForTesting()70*6dbdd20aSAndroid Build Coastguard Worker   base::UnixSocket* GetUnixSocketForTesting() { return sock_.get(); }
71*6dbdd20aSAndroid Build Coastguard Worker 
72*6dbdd20aSAndroid Build Coastguard Worker  private:
73*6dbdd20aSAndroid Build Coastguard Worker   struct QueuedRequest {
74*6dbdd20aSAndroid Build Coastguard Worker     QueuedRequest();
75*6dbdd20aSAndroid Build Coastguard Worker     int type = 0;  // From Frame::msg_case(), see wire_protocol.proto.
76*6dbdd20aSAndroid Build Coastguard Worker     RequestID request_id = 0;
77*6dbdd20aSAndroid Build Coastguard Worker     base::WeakPtr<ServiceProxy> service_proxy;
78*6dbdd20aSAndroid Build Coastguard Worker 
79*6dbdd20aSAndroid Build Coastguard Worker     // Only for type == kMsgInvokeMethod.
80*6dbdd20aSAndroid Build Coastguard Worker     std::string method_name;
81*6dbdd20aSAndroid Build Coastguard Worker   };
82*6dbdd20aSAndroid Build Coastguard Worker 
83*6dbdd20aSAndroid Build Coastguard Worker   ClientImpl(const ClientImpl&) = delete;
84*6dbdd20aSAndroid Build Coastguard Worker   ClientImpl& operator=(const ClientImpl&) = delete;
85*6dbdd20aSAndroid Build Coastguard Worker 
86*6dbdd20aSAndroid Build Coastguard Worker   void TryConnect();
87*6dbdd20aSAndroid Build Coastguard Worker   bool SendFrame(const Frame&, int fd = -1);
88*6dbdd20aSAndroid Build Coastguard Worker   void OnFrameReceived(const Frame&);
89*6dbdd20aSAndroid Build Coastguard Worker   void OnBindServiceReply(QueuedRequest,
90*6dbdd20aSAndroid Build Coastguard Worker                           const protos::gen::IPCFrame_BindServiceReply&);
91*6dbdd20aSAndroid Build Coastguard Worker   void OnInvokeMethodReply(QueuedRequest,
92*6dbdd20aSAndroid Build Coastguard Worker                            const protos::gen::IPCFrame_InvokeMethodReply&);
93*6dbdd20aSAndroid Build Coastguard Worker 
94*6dbdd20aSAndroid Build Coastguard Worker   bool invoking_method_reply_ = false;
95*6dbdd20aSAndroid Build Coastguard Worker   const char* socket_name_ = nullptr;
96*6dbdd20aSAndroid Build Coastguard Worker   bool socket_retry_ = false;
97*6dbdd20aSAndroid Build Coastguard Worker   uint32_t socket_backoff_ms_ = 0;
98*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<base::UnixSocket> sock_;
99*6dbdd20aSAndroid Build Coastguard Worker   base::TaskRunner* const task_runner_;
100*6dbdd20aSAndroid Build Coastguard Worker   RequestID last_request_id_ = 0;
101*6dbdd20aSAndroid Build Coastguard Worker   BufferedFrameDeserializer frame_deserializer_;
102*6dbdd20aSAndroid Build Coastguard Worker   base::ScopedFile received_fd_;
103*6dbdd20aSAndroid Build Coastguard Worker   std::map<RequestID, QueuedRequest> queued_requests_;
104*6dbdd20aSAndroid Build Coastguard Worker   std::map<ServiceID, base::WeakPtr<ServiceProxy>> service_bindings_;
105*6dbdd20aSAndroid Build Coastguard Worker 
106*6dbdd20aSAndroid Build Coastguard Worker   // Queue of calls to BindService() that happened before the socket connected.
107*6dbdd20aSAndroid Build Coastguard Worker   std::list<base::WeakPtr<ServiceProxy>> queued_bindings_;
108*6dbdd20aSAndroid Build Coastguard Worker 
109*6dbdd20aSAndroid Build Coastguard Worker   base::WeakPtrFactory<Client> weak_ptr_factory_;  // Keep last.
110*6dbdd20aSAndroid Build Coastguard Worker };
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker }  // namespace ipc
113*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
114*6dbdd20aSAndroid Build Coastguard Worker 
115*6dbdd20aSAndroid Build Coastguard Worker #endif  // SRC_IPC_CLIENT_IMPL_H_
116