xref: /aosp_15_r20/external/grpc-grpc/include/grpcpp/channel.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker //
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker 
19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPCPP_CHANNEL_H
20*cc02d7e2SAndroid Build Coastguard Worker #define GRPCPP_CHANNEL_H
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
23*cc02d7e2SAndroid Build Coastguard Worker 
24*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/grpc.h>
25*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/completion_queue.h>
26*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/call.h>
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/channel_interface.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/grpc_library.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/impl/sync.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/client_interceptor.h>
31*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/support/config.h>
32*cc02d7e2SAndroid Build Coastguard Worker 
33*cc02d7e2SAndroid Build Coastguard Worker struct grpc_channel;
34*cc02d7e2SAndroid Build Coastguard Worker 
35*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
36*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
37*cc02d7e2SAndroid Build Coastguard Worker class ChannelTestPeer;
38*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
39*cc02d7e2SAndroid Build Coastguard Worker 
40*cc02d7e2SAndroid Build Coastguard Worker std::shared_ptr<Channel> CreateChannelInternal(
41*cc02d7e2SAndroid Build Coastguard Worker     const std::string& host, grpc_channel* c_channel,
42*cc02d7e2SAndroid Build Coastguard Worker     std::vector<
43*cc02d7e2SAndroid Build Coastguard Worker         std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
44*cc02d7e2SAndroid Build Coastguard Worker         interceptor_creators);
45*cc02d7e2SAndroid Build Coastguard Worker 
46*cc02d7e2SAndroid Build Coastguard Worker namespace experimental {
47*cc02d7e2SAndroid Build Coastguard Worker /// Resets the channel's connection backoff.
48*cc02d7e2SAndroid Build Coastguard Worker /// TODO(roth): Once we see whether this proves useful, either create a gRFC
49*cc02d7e2SAndroid Build Coastguard Worker /// and change this to be a method of the Channel class, or remove it.
50*cc02d7e2SAndroid Build Coastguard Worker void ChannelResetConnectionBackoff(Channel* channel);
51*cc02d7e2SAndroid Build Coastguard Worker }  // namespace experimental
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker /// Channels represent a connection to an endpoint. Created by \a CreateChannel.
54*cc02d7e2SAndroid Build Coastguard Worker class Channel final : public grpc::ChannelInterface,
55*cc02d7e2SAndroid Build Coastguard Worker                       public grpc::internal::CallHook,
56*cc02d7e2SAndroid Build Coastguard Worker                       public std::enable_shared_from_this<Channel>,
57*cc02d7e2SAndroid Build Coastguard Worker                       private grpc::internal::GrpcLibrary {
58*cc02d7e2SAndroid Build Coastguard Worker  public:
59*cc02d7e2SAndroid Build Coastguard Worker   ~Channel() override;
60*cc02d7e2SAndroid Build Coastguard Worker 
61*cc02d7e2SAndroid Build Coastguard Worker   /// Get the current channel state. If the channel is in IDLE and
62*cc02d7e2SAndroid Build Coastguard Worker   /// \a try_to_connect is set to true, try to connect.
63*cc02d7e2SAndroid Build Coastguard Worker   grpc_connectivity_state GetState(bool try_to_connect) override;
64*cc02d7e2SAndroid Build Coastguard Worker 
65*cc02d7e2SAndroid Build Coastguard Worker   /// Returns the LB policy name, or the empty string if not yet available.
66*cc02d7e2SAndroid Build Coastguard Worker   std::string GetLoadBalancingPolicyName() const;
67*cc02d7e2SAndroid Build Coastguard Worker 
68*cc02d7e2SAndroid Build Coastguard Worker   /// Returns the service config in JSON form, or the empty string if
69*cc02d7e2SAndroid Build Coastguard Worker   /// not available.
70*cc02d7e2SAndroid Build Coastguard Worker   std::string GetServiceConfigJSON() const;
71*cc02d7e2SAndroid Build Coastguard Worker 
72*cc02d7e2SAndroid Build Coastguard Worker  private:
73*cc02d7e2SAndroid Build Coastguard Worker   template <class InputMessage, class OutputMessage>
74*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::BlockingUnaryCallImpl;
75*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::testing::ChannelTestPeer;
76*cc02d7e2SAndroid Build Coastguard Worker   friend void experimental::ChannelResetConnectionBackoff(Channel* channel);
77*cc02d7e2SAndroid Build Coastguard Worker   friend std::shared_ptr<Channel> grpc::CreateChannelInternal(
78*cc02d7e2SAndroid Build Coastguard Worker       const std::string& host, grpc_channel* c_channel,
79*cc02d7e2SAndroid Build Coastguard Worker       std::vector<std::unique_ptr<
80*cc02d7e2SAndroid Build Coastguard Worker           grpc::experimental::ClientInterceptorFactoryInterface>>
81*cc02d7e2SAndroid Build Coastguard Worker           interceptor_creators);
82*cc02d7e2SAndroid Build Coastguard Worker   friend class grpc::internal::InterceptedChannel;
83*cc02d7e2SAndroid Build Coastguard Worker   Channel(const std::string& host, grpc_channel* c_channel,
84*cc02d7e2SAndroid Build Coastguard Worker           std::vector<std::unique_ptr<
85*cc02d7e2SAndroid Build Coastguard Worker               grpc::experimental::ClientInterceptorFactoryInterface>>
86*cc02d7e2SAndroid Build Coastguard Worker               interceptor_creators);
87*cc02d7e2SAndroid Build Coastguard Worker 
88*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::Call CreateCall(const grpc::internal::RpcMethod& method,
89*cc02d7e2SAndroid Build Coastguard Worker                                   grpc::ClientContext* context,
90*cc02d7e2SAndroid Build Coastguard Worker                                   grpc::CompletionQueue* cq) override;
91*cc02d7e2SAndroid Build Coastguard Worker   void PerformOpsOnCall(grpc::internal::CallOpSetInterface* ops,
92*cc02d7e2SAndroid Build Coastguard Worker                         grpc::internal::Call* call) override;
93*cc02d7e2SAndroid Build Coastguard Worker   void* RegisterMethod(const char* method) override;
94*cc02d7e2SAndroid Build Coastguard Worker 
95*cc02d7e2SAndroid Build Coastguard Worker   void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed,
96*cc02d7e2SAndroid Build Coastguard Worker                                gpr_timespec deadline, grpc::CompletionQueue* cq,
97*cc02d7e2SAndroid Build Coastguard Worker                                void* tag) override;
98*cc02d7e2SAndroid Build Coastguard Worker   bool WaitForStateChangeImpl(grpc_connectivity_state last_observed,
99*cc02d7e2SAndroid Build Coastguard Worker                               gpr_timespec deadline) override;
100*cc02d7e2SAndroid Build Coastguard Worker 
101*cc02d7e2SAndroid Build Coastguard Worker   grpc::CompletionQueue* CallbackCQ() override;
102*cc02d7e2SAndroid Build Coastguard Worker 
103*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::Call CreateCallInternal(
104*cc02d7e2SAndroid Build Coastguard Worker       const grpc::internal::RpcMethod& method, grpc::ClientContext* context,
105*cc02d7e2SAndroid Build Coastguard Worker       grpc::CompletionQueue* cq, size_t interceptor_pos) override;
106*cc02d7e2SAndroid Build Coastguard Worker 
107*cc02d7e2SAndroid Build Coastguard Worker   const std::string host_;
108*cc02d7e2SAndroid Build Coastguard Worker   grpc_channel* const c_channel_;  // owned
109*cc02d7e2SAndroid Build Coastguard Worker 
110*cc02d7e2SAndroid Build Coastguard Worker   // mu_ protects callback_cq_ (the per-channel callbackable completion queue)
111*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::Mutex mu_;
112*cc02d7e2SAndroid Build Coastguard Worker 
113*cc02d7e2SAndroid Build Coastguard Worker   // callback_cq_ references the callbackable completion queue associated
114*cc02d7e2SAndroid Build Coastguard Worker   // with this channel (if any). It is set on the first call to CallbackCQ().
115*cc02d7e2SAndroid Build Coastguard Worker   // It is _not owned_ by the channel; ownership belongs with its internal
116*cc02d7e2SAndroid Build Coastguard Worker   // shutdown callback tag (invoked when the CQ is fully shutdown).
117*cc02d7e2SAndroid Build Coastguard Worker   std::atomic<CompletionQueue*> callback_cq_{nullptr};
118*cc02d7e2SAndroid Build Coastguard Worker 
119*cc02d7e2SAndroid Build Coastguard Worker   std::vector<
120*cc02d7e2SAndroid Build Coastguard Worker       std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>>
121*cc02d7e2SAndroid Build Coastguard Worker       interceptor_creators_;
122*cc02d7e2SAndroid Build Coastguard Worker };
123*cc02d7e2SAndroid Build Coastguard Worker 
124*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
125*cc02d7e2SAndroid Build Coastguard Worker 
126*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPCPP_CHANNEL_H
127