You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

channel.h 4.9 kB

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