From 7a2c28c7b9e5b3f3f70da80ea24806f162e48a0f Mon Sep 17 00:00:00 2001 From: Cheng-Yu Chung Date: Mon, 17 Oct 2022 12:21:26 -0400 Subject: [PATCH] Remove `include/grpcpp/impl/codegen/server_interceptor.h` (#31281) --- .../grpcpp/impl/codegen/server_interceptor.h | 120 +----------------- include/grpcpp/server_builder.h | 2 +- include/grpcpp/support/server_interceptor.h | 117 ++++++++++++++++- 3 files changed, 120 insertions(+), 119 deletions(-) diff --git a/include/grpcpp/impl/codegen/server_interceptor.h b/include/grpcpp/impl/codegen/server_interceptor.h index 3a8fd52acba..7d71ba695b2 100644 --- a/include/grpcpp/impl/codegen/server_interceptor.h +++ b/include/grpcpp/impl/codegen/server_interceptor.h @@ -19,123 +19,9 @@ #ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H #define GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H -// IWYU pragma: private, include +// IWYU pragma: private -#include -#include - -#include -#include -#include - -namespace grpc { -class ServerContextBase; -namespace internal { -class InterceptorBatchMethodsImpl; -} - -namespace experimental { -class ServerRpcInfo; - -// A factory interface for creation of server interceptors. A vector of -// factories can be provided to ServerBuilder which will be used to create a new -// vector of server interceptors per RPC. Server interceptor authors should -// create a subclass of ServerInterceptorFactorInterface which creates objects -// of their interceptors. -class ServerInterceptorFactoryInterface { - public: - virtual ~ServerInterceptorFactoryInterface() {} - // Returns a pointer to an Interceptor object on successful creation, nullptr - // otherwise. If nullptr is returned, this server interceptor factory is - // ignored for the purposes of that RPC. - virtual Interceptor* CreateServerInterceptor(ServerRpcInfo* info) = 0; -}; - -/// ServerRpcInfo represents the state of a particular RPC as it -/// appears to an interceptor. It is created and owned by the library and -/// passed to the CreateServerInterceptor method of the application's -/// ServerInterceptorFactoryInterface implementation -class ServerRpcInfo { - public: - /// Type categorizes RPCs by unary or streaming type - enum class Type { UNARY, CLIENT_STREAMING, SERVER_STREAMING, BIDI_STREAMING }; - - ~ServerRpcInfo() {} - - // Delete all copy and move constructors and assignments - ServerRpcInfo(const ServerRpcInfo&) = delete; - ServerRpcInfo& operator=(const ServerRpcInfo&) = delete; - ServerRpcInfo(ServerRpcInfo&&) = delete; - ServerRpcInfo& operator=(ServerRpcInfo&&) = delete; - - // Getter methods - - /// Return the fully-specified method name - const char* method() const { return method_; } - - /// Return the type of the RPC (unary or a streaming flavor) - Type type() const { return type_; } - - /// Return a pointer to the underlying ServerContext structure associated - /// with the RPC to support features that apply to it - ServerContextBase* server_context() { return ctx_; } - - private: - static_assert(Type::UNARY == - static_cast(internal::RpcMethod::NORMAL_RPC), - "violated expectation about Type enum"); - static_assert(Type::CLIENT_STREAMING == - static_cast(internal::RpcMethod::CLIENT_STREAMING), - "violated expectation about Type enum"); - static_assert(Type::SERVER_STREAMING == - static_cast(internal::RpcMethod::SERVER_STREAMING), - "violated expectation about Type enum"); - static_assert(Type::BIDI_STREAMING == - static_cast(internal::RpcMethod::BIDI_STREAMING), - "violated expectation about Type enum"); - - ServerRpcInfo(ServerContextBase* ctx, const char* method, - internal::RpcMethod::RpcType type) - : ctx_(ctx), method_(method), type_(static_cast(type)) {} - - // Runs interceptor at pos \a pos. - void RunInterceptor( - experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { - GPR_CODEGEN_ASSERT(pos < interceptors_.size()); - interceptors_[pos]->Intercept(interceptor_methods); - } - - void RegisterInterceptors( - const std::vector< - std::unique_ptr>& - creators) { - for (const auto& creator : creators) { - auto* interceptor = creator->CreateServerInterceptor(this); - if (interceptor != nullptr) { - interceptors_.push_back( - std::unique_ptr(interceptor)); - } - } - } - - void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); } - void Unref() { - if (GPR_UNLIKELY(ref_.fetch_sub(1, std::memory_order_acq_rel) == 1)) { - delete this; - } - } - - ServerContextBase* ctx_ = nullptr; - const char* method_ = nullptr; - const Type type_; - std::atomic ref_{1}; - std::vector> interceptors_; - - friend class internal::InterceptorBatchMethodsImpl; - friend class grpc::ServerContextBase; -}; - -} // namespace experimental -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include #endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H diff --git a/include/grpcpp/server_builder.h b/include/grpcpp/server_builder.h index 2f72a872dfe..60d8650eb49 100644 --- a/include/grpcpp/server_builder.h +++ b/include/grpcpp/server_builder.h @@ -30,12 +30,12 @@ #include #include #include -#include #include #include #include #include #include +#include struct grpc_resource_quota; diff --git a/include/grpcpp/support/server_interceptor.h b/include/grpcpp/support/server_interceptor.h index ad9c7a18693..af2c028b62c 100644 --- a/include/grpcpp/support/server_interceptor.h +++ b/include/grpcpp/support/server_interceptor.h @@ -19,6 +19,121 @@ #ifndef GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H #define GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H -#include // IWYU pragma: export +#include +#include + +#include +#include +#include + +namespace grpc { +class ServerContextBase; +namespace internal { +class InterceptorBatchMethodsImpl; +} + +namespace experimental { +class ServerRpcInfo; + +// A factory interface for creation of server interceptors. A vector of +// factories can be provided to ServerBuilder which will be used to create a new +// vector of server interceptors per RPC. Server interceptor authors should +// create a subclass of ServerInterceptorFactorInterface which creates objects +// of their interceptors. +class ServerInterceptorFactoryInterface { + public: + virtual ~ServerInterceptorFactoryInterface() {} + // Returns a pointer to an Interceptor object on successful creation, nullptr + // otherwise. If nullptr is returned, this server interceptor factory is + // ignored for the purposes of that RPC. + virtual Interceptor* CreateServerInterceptor(ServerRpcInfo* info) = 0; +}; + +/// ServerRpcInfo represents the state of a particular RPC as it +/// appears to an interceptor. It is created and owned by the library and +/// passed to the CreateServerInterceptor method of the application's +/// ServerInterceptorFactoryInterface implementation +class ServerRpcInfo { + public: + /// Type categorizes RPCs by unary or streaming type + enum class Type { UNARY, CLIENT_STREAMING, SERVER_STREAMING, BIDI_STREAMING }; + + ~ServerRpcInfo() {} + + // Delete all copy and move constructors and assignments + ServerRpcInfo(const ServerRpcInfo&) = delete; + ServerRpcInfo& operator=(const ServerRpcInfo&) = delete; + ServerRpcInfo(ServerRpcInfo&&) = delete; + ServerRpcInfo& operator=(ServerRpcInfo&&) = delete; + + // Getter methods + + /// Return the fully-specified method name + const char* method() const { return method_; } + + /// Return the type of the RPC (unary or a streaming flavor) + Type type() const { return type_; } + + /// Return a pointer to the underlying ServerContext structure associated + /// with the RPC to support features that apply to it + ServerContextBase* server_context() { return ctx_; } + + private: + static_assert(Type::UNARY == + static_cast(internal::RpcMethod::NORMAL_RPC), + "violated expectation about Type enum"); + static_assert(Type::CLIENT_STREAMING == + static_cast(internal::RpcMethod::CLIENT_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::SERVER_STREAMING == + static_cast(internal::RpcMethod::SERVER_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::BIDI_STREAMING == + static_cast(internal::RpcMethod::BIDI_STREAMING), + "violated expectation about Type enum"); + + ServerRpcInfo(ServerContextBase* ctx, const char* method, + internal::RpcMethod::RpcType type) + : ctx_(ctx), method_(method), type_(static_cast(type)) {} + + // Runs interceptor at pos \a pos. + void RunInterceptor( + experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { + GPR_CODEGEN_ASSERT(pos < interceptors_.size()); + interceptors_[pos]->Intercept(interceptor_methods); + } + + void RegisterInterceptors( + const std::vector< + std::unique_ptr>& + creators) { + for (const auto& creator : creators) { + auto* interceptor = creator->CreateServerInterceptor(this); + if (interceptor != nullptr) { + interceptors_.push_back( + std::unique_ptr(interceptor)); + } + } + } + + void Ref() { ref_.fetch_add(1, std::memory_order_relaxed); } + void Unref() { + if (GPR_UNLIKELY(ref_.fetch_sub(1, std::memory_order_acq_rel) == 1)) { + delete this; + } + } + + ServerContextBase* ctx_ = nullptr; + const char* method_ = nullptr; + const Type type_; + std::atomic ref_{1}; + std::vector> interceptors_; + + friend class internal::InterceptorBatchMethodsImpl; + friend class grpc::ServerContextBase; +}; + +} // namespace experimental +} // namespace grpc #endif // GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H