diff options
author | leonidlazarev <leonidlazarev@yandex-team.com> | 2023-07-17 19:35:29 +0300 |
---|---|---|
committer | leonidlazarev <leonidlazarev@yandex-team.com> | 2023-07-17 19:35:29 +0300 |
commit | cb8e9a6330e4e5d9a0e2f8506e7469bbd641ec63 (patch) | |
tree | eddb7b81e7d1f5a7ac8078591799509e95572f4e /contrib/libs/grpc/include/grpcpp | |
parent | 029cf29f3669091012394221f00dfa0f3631d91b (diff) | |
download | ydb-cb8e9a6330e4e5d9a0e2f8506e7469bbd641ec63.tar.gz |
feat grpc: update to grpc 1.53.1
update grpc to 1.53.1
update grpcio/py3 to 1.53.1
Added patches:
22-grpc-code-output.patch - allow translation of grpc code to internal string type.
23-max-thread-limitation.patch - to provide interface for settings of thread number limit, as
grpc::DynamicThreadPool doesn't provide interface to limit thread number anymore.
24-support_for-non-abort-grpc.patch - generate exception instead of application crash
25-forkable-destruction-order.patch - correct forkable logic for TimerManager
27-skip-child-post-fork-operations.patch - allow to skip child post fork operations to exclude UB (used for unified agent only)
pr33495_fox_nested_fork.patch - fix issues with nested forks
pr33582_fork_handler.patch - disable fork handler support if it is not requested intentionally
Diffstat (limited to 'contrib/libs/grpc/include/grpcpp')
117 files changed, 9403 insertions, 10053 deletions
diff --git a/contrib/libs/grpc/include/grpcpp/alarm.h b/contrib/libs/grpc/include/grpcpp/alarm.h index 1b5ddfe840..319fc29f1e 100644 --- a/contrib/libs/grpc/include/grpcpp/alarm.h +++ b/contrib/libs/grpc/include/grpcpp/alarm.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// /// An Alarm posts the user-provided tag to its associated completion queue or /// invokes the user-provided function on expiry or cancellation. @@ -24,15 +24,14 @@ #include <functional> #include <grpc/grpc.h> -#include <grpcpp/impl/codegen/completion_queue.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/grpc_library.h> -#include <grpcpp/impl/codegen/time.h> +#include <grpcpp/completion_queue.h> +#include <grpcpp/impl/completion_queue_tag.h> #include <grpcpp/impl/grpc_library.h> +#include <grpcpp/support/time.h> namespace grpc { -class Alarm : private grpc::GrpcLibraryCodegen { +class Alarm : private grpc::internal::GrpcLibrary { public: /// Create an unset completion queue alarm Alarm(); diff --git a/contrib/libs/grpc/include/grpcpp/channel.h b/contrib/libs/grpc/include/grpcpp/channel.h index cf7ec3d4bb..1326426eb1 100644 --- a/contrib/libs/grpc/include/grpcpp/channel.h +++ b/contrib/libs/grpc/include/grpcpp/channel.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_CHANNEL_H #define GRPCPP_CHANNEL_H @@ -22,13 +22,13 @@ #include <memory> #include <grpc/grpc.h> +#include <grpcpp/completion_queue.h> #include <grpcpp/impl/call.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/completion_queue.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/grpc_library.h> -#include <grpcpp/impl/codegen/sync.h> +#include <grpcpp/impl/channel_interface.h> +#include <grpcpp/impl/grpc_library.h> +#include <grpcpp/impl/sync.h> #include <grpcpp/support/client_interceptor.h> +#include <grpcpp/support/config.h> struct grpc_channel; @@ -54,7 +54,7 @@ void ChannelResetConnectionBackoff(Channel* channel); class Channel final : public grpc::ChannelInterface, public grpc::internal::CallHook, public std::enable_shared_from_this<Channel>, - private grpc::GrpcLibraryCodegen { + private grpc::internal::GrpcLibrary { public: ~Channel() override; diff --git a/contrib/libs/grpc/include/grpcpp/client_context.h b/contrib/libs/grpc/include/grpcpp/client_context.h index 74a91e2642..b496328599 100644 --- a/contrib/libs/grpc/include/grpcpp/client_context.h +++ b/contrib/libs/grpc/include/grpcpp/client_context.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// /// A ClientContext allows the person implementing a service client to: /// @@ -34,6 +34,485 @@ #ifndef GRPCPP_CLIENT_CONTEXT_H #define GRPCPP_CLIENT_CONTEXT_H -#include <grpcpp/impl/codegen/client_context.h> // IWYU pragma: export +#include <map> +#include <memory> +#include <util/generic/string.h> +#include <util/string/cast.h> + +#include <grpc/impl/compression_types.h> +#include <grpc/impl/propagation_bits.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/create_auth_context.h> +#include <grpcpp/impl/metadata_map.h> +#include <grpcpp/impl/rpc_method.h> +#include <grpcpp/impl/sync.h> +#include <grpcpp/security/auth_context.h> +#include <grpcpp/support/client_interceptor.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/slice.h> +#include <grpcpp/support/status.h> +#include <grpcpp/support/string_ref.h> +#include <grpcpp/support/time.h> + +struct census_context; +struct grpc_call; + +namespace grpc { +class ServerContext; +class ServerContextBase; +class CallbackServerContext; + +namespace internal { +template <class InputMessage, class OutputMessage> +class CallbackUnaryCallImpl; +template <class Request, class Response> +class ClientCallbackReaderWriterImpl; +template <class Response> +class ClientCallbackReaderImpl; +template <class Request> +class ClientCallbackWriterImpl; +class ClientCallbackUnaryImpl; +class ClientContextAccessor; +class ClientAsyncResponseReaderHelper; +} // namespace internal + +template <class R> +class ClientReader; +template <class W> +class ClientWriter; +template <class W, class R> +class ClientReaderWriter; +template <class R> +class ClientAsyncReader; +template <class W> +class ClientAsyncWriter; +template <class W, class R> +class ClientAsyncReaderWriter; +template <class R> +class ClientAsyncResponseReader; + +namespace testing { +class InteropClientContextInspector; +class ClientContextTestPeer; +} // namespace testing + +namespace internal { +class RpcMethod; +template <class InputMessage, class OutputMessage> +class BlockingUnaryCallImpl; +class CallOpClientRecvStatus; +class CallOpRecvInitialMetadata; +class ServerContextImpl; +template <class InputMessage, class OutputMessage> +class CallbackUnaryCallImpl; +template <class Request, class Response> +class ClientCallbackReaderWriterImpl; +template <class Response> +class ClientCallbackReaderImpl; +template <class Request> +class ClientCallbackWriterImpl; +class ClientCallbackUnaryImpl; +class ClientContextAccessor; +} // namespace internal + +class CallCredentials; +class Channel; +class ChannelInterface; +class CompletionQueue; + +/// Options for \a ClientContext::FromServerContext specifying which traits from +/// the \a ServerContext to propagate (copy) from it into a new \a +/// ClientContext. +/// +/// \see ClientContext::FromServerContext +class PropagationOptions { + public: + PropagationOptions() : propagate_(GRPC_PROPAGATE_DEFAULTS) {} + + PropagationOptions& enable_deadline_propagation() { + propagate_ |= GRPC_PROPAGATE_DEADLINE; + return *this; + } + + PropagationOptions& disable_deadline_propagation() { + propagate_ &= ~GRPC_PROPAGATE_DEADLINE; + return *this; + } + + PropagationOptions& enable_census_stats_propagation() { + propagate_ |= GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; + return *this; + } + + PropagationOptions& disable_census_stats_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; + return *this; + } + + PropagationOptions& enable_census_tracing_propagation() { + propagate_ |= GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; + return *this; + } + + PropagationOptions& disable_census_tracing_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; + return *this; + } + + PropagationOptions& enable_cancellation_propagation() { + propagate_ |= GRPC_PROPAGATE_CANCELLATION; + return *this; + } + + PropagationOptions& disable_cancellation_propagation() { + propagate_ &= ~GRPC_PROPAGATE_CANCELLATION; + return *this; + } + + uint32_t c_bitmask() const { return propagate_; } + + private: + uint32_t propagate_; +}; + +/// A ClientContext allows the person implementing a service client to: +/// +/// - Add custom metadata key-value pairs that will propagated to the server +/// side. +/// - Control call settings such as compression and authentication. +/// - Initial and trailing metadata coming from the server. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call they are invoked with, that +/// is to say, they aren't sticky. Some of these settings, such as the +/// compression options, can be made persistent at channel construction time +/// (see \a grpc::CreateCustomChannel). +/// +/// \warning ClientContext instances should \em not be reused across rpcs. +/// \warning The ClientContext instance used for creating an rpc must remain +/// alive and valid for the lifetime of the rpc. +class ClientContext { + public: + ClientContext(); + ~ClientContext(); + + /// Create a new \a ClientContext as a child of an incoming server call, + /// according to \a options (\see PropagationOptions). + /// + /// \param server_context The source server context to use as the basis for + /// constructing the client context. + /// \param options The options controlling what to copy from the \a + /// server_context. + /// + /// \return A newly constructed \a ClientContext instance based on \a + /// server_context, with traits propagated (copied) according to \a options. + static std::unique_ptr<ClientContext> FromServerContext( + const grpc::ServerContextBase& server_context, + PropagationOptions options = PropagationOptions()); + static std::unique_ptr<ClientContext> FromCallbackServerContext( + const grpc::CallbackServerContext& server_context, + PropagationOptions options = PropagationOptions()); + + /// Add the (\a meta_key, \a meta_value) pair to the metadata associated with + /// a client call. These are made available at the server side by the \a + /// grpc::ServerContext::client_metadata() method. + /// + /// \warning This method should only be called before invoking the rpc. + /// + /// \param meta_key The metadata key. If \a meta_value is binary data, it must + /// end in "-bin". + /// \param meta_value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// + ///\verbatim + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + /// Custom-Metadata -> Binary-Header / ASCII-Header + ///\endverbatim + /// + void AddMetadata(const TString& meta_key, const TString& meta_value); + + /// Return a collection of initial metadata key-value pairs. Note that keys + /// may happen more than once (ie, a \a std::multimap is returned). + /// + /// \warning This method should only be called after initial metadata has been + /// received. For streaming calls, see \a + /// ClientReaderInterface::WaitForInitialMetadata(). + /// + /// \return A multimap of initial metadata key-value pairs from the server. + const std::multimap<grpc::string_ref, grpc::string_ref>& + GetServerInitialMetadata() const { + GPR_ASSERT(initial_metadata_received_); + return *recv_initial_metadata_.map(); + } + + /// Return a collection of trailing metadata key-value pairs. Note that keys + /// may happen more than once (ie, a \a std::multimap is returned). + /// + /// \warning This method is only callable once the stream has finished. + /// + /// \return A multimap of metadata trailing key-value pairs from the server. + const std::multimap<grpc::string_ref, grpc::string_ref>& + GetServerTrailingMetadata() const { + // TODO(yangg) check finished + return *trailing_metadata_.map(); + } + + /// Set the deadline for the client call. + /// + /// \warning This method should only be called before invoking the rpc. + /// + /// \param deadline the deadline for the client call. Units are determined by + /// the type used. The deadline is an absolute (not relative) time. + template <typename T> + void set_deadline(const T& deadline) { + grpc::TimePoint<T> deadline_tp(deadline); + deadline_ = deadline_tp.raw_time(); + } + + /// Trigger wait-for-ready or not on this request. + /// See https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. + /// If set, if an RPC is made when a channel's connectivity state is + /// TRANSIENT_FAILURE or CONNECTING, the call will not "fail fast", + /// and the channel will wait until the channel is READY before making the + /// call. + void set_wait_for_ready(bool wait_for_ready) { + wait_for_ready_ = wait_for_ready; + wait_for_ready_explicitly_set_ = true; + } + + /// DEPRECATED: Use set_wait_for_ready() instead. + void set_fail_fast(bool fail_fast) { set_wait_for_ready(!fail_fast); } + + /// Return the deadline for the client call. + std::chrono::system_clock::time_point deadline() const { + return grpc::Timespec2Timepoint(deadline_); + } + + /// Return a \a gpr_timespec representation of the client call's deadline. + gpr_timespec raw_deadline() const { return deadline_; } + + /// Set the per call authority header (see + /// https://tools.ietf.org/html/rfc7540#section-8.1.2.3). + void set_authority(const TString& authority) { authority_ = authority; } + + /// Return the authentication context for the associated client call. + /// It is only valid to call this during the lifetime of the client call. + /// + /// \see grpc::AuthContext. + std::shared_ptr<const grpc::AuthContext> auth_context() const { + if (auth_context_ == nullptr) { + auth_context_ = grpc::CreateAuthContext(call_); + } + return auth_context_; + } + + /// Set credentials for the client call. + /// + /// A credentials object encapsulates all the state needed by a client to + /// authenticate with a server and make various assertions, e.g., about the + /// client’s identity, role, or whether it is authorized to make a particular + /// call. + /// + /// It is legal to call this only before initial metadata is sent. + /// + /// \see https://grpc.io/docs/guides/auth.html + void set_credentials(const std::shared_ptr<grpc::CallCredentials>& creds); + + /// EXPERIMENTAL debugging API + /// + /// Returns the credentials for the client call. This should be used only in + /// tests and for diagnostic purposes, and should not be used by application + /// logic. + std::shared_ptr<grpc::CallCredentials> credentials() { return creds_; } + + /// Return the compression algorithm the client call will request be used. + /// Note that the gRPC runtime may decide to ignore this request, for example, + /// due to resource constraints. + grpc_compression_algorithm compression_algorithm() const { + return compression_algorithm_; + } + + /// Set \a algorithm to be the compression algorithm used for the client call. + /// + /// \param algorithm The compression algorithm used for the client call. + void set_compression_algorithm(grpc_compression_algorithm algorithm); + + /// Flag whether the initial metadata should be \a corked + /// + /// If \a corked is true, then the initial metadata will be coalesced with the + /// write of first message in the stream. As a result, any tag set for the + /// initial metadata operation (starting a client-streaming or bidi-streaming + /// RPC) will not actually be sent to the completion queue or delivered + /// via Next. + /// + /// \param corked The flag indicating whether the initial metadata is to be + /// corked or not. + void set_initial_metadata_corked(bool corked) { + initial_metadata_corked_ = corked; + } + + /// Return the peer uri in a string. + /// It is only valid to call this during the lifetime of the client call. + /// + /// \warning This value is never authenticated or subject to any security + /// related code. It must not be used for any authentication related + /// functionality. Instead, use auth_context. + /// + /// \return The call's peer URI. + TString peer() const; + + /// Sets the census context. + /// It is only valid to call this before the client call is created. A common + /// place of setting census context is from within the DefaultConstructor + /// method of GlobalCallbacks. + void set_census_context(struct census_context* ccp) { census_context_ = ccp; } + + /// Returns the census context that has been set, or nullptr if not set. + struct census_context* census_context() const { return census_context_; } + + /// Send a best-effort out-of-band cancel on the call associated with + /// this client context. The call could be in any stage; e.g., if it is + /// already finished, it may still return success. + /// + /// There is no guarantee the call will be cancelled. + /// + /// Note that TryCancel() does not change any of the tags that are pending + /// on the completion queue. All pending tags will still be delivered + /// (though their ok result may reflect the effect of cancellation). + /// + /// This method is thread-safe, and can be called multiple times from any + /// thread. + void TryCancel(); + + /// Global Callbacks + /// + /// Can be set exactly once per application to install hooks whenever + /// a client context is constructed and destructed. + class GlobalCallbacks { + public: + virtual ~GlobalCallbacks() {} + virtual void DefaultConstructor(ClientContext* context) = 0; + virtual void Destructor(ClientContext* context) = 0; + }; + static void SetGlobalCallbacks(GlobalCallbacks* callbacks); + + /// Should be used for framework-level extensions only. + /// Applications never need to call this method. + grpc_call* c_call() { return call_; } + + /// EXPERIMENTAL debugging API + /// + /// if status is not ok() for an RPC, this will return a detailed string + /// of the gRPC Core error that led to the failure. It should not be relied + /// upon for anything other than gaining more debug data in failure cases. + TString debug_error_string() const { return debug_error_string_; } + + private: + // Disallow copy and assign. + ClientContext(const ClientContext&); + ClientContext& operator=(const ClientContext&); + + friend class grpc::testing::InteropClientContextInspector; + friend class grpc::testing::ClientContextTestPeer; + friend class grpc::internal::CallOpClientRecvStatus; + friend class grpc::internal::CallOpRecvInitialMetadata; + friend class grpc::Channel; + template <class R> + friend class grpc::ClientReader; + template <class W> + friend class grpc::ClientWriter; + template <class W, class R> + friend class grpc::ClientReaderWriter; + template <class R> + friend class grpc::ClientAsyncReader; + template <class W> + friend class grpc::ClientAsyncWriter; + template <class W, class R> + friend class grpc::ClientAsyncReaderWriter; + template <class R> + friend class grpc::ClientAsyncResponseReader; + friend class grpc::internal::ClientAsyncResponseReaderHelper; + template <class InputMessage, class OutputMessage> + friend class grpc::internal::BlockingUnaryCallImpl; + template <class InputMessage, class OutputMessage> + friend class grpc::internal::CallbackUnaryCallImpl; + template <class Request, class Response> + friend class grpc::internal::ClientCallbackReaderWriterImpl; + template <class Response> + friend class grpc::internal::ClientCallbackReaderImpl; + template <class Request> + friend class grpc::internal::ClientCallbackWriterImpl; + friend class grpc::internal::ClientCallbackUnaryImpl; + friend class grpc::internal::ClientContextAccessor; + + // Used by friend class CallOpClientRecvStatus + void set_debug_error_string(const TString& debug_error_string) { + debug_error_string_ = debug_error_string; + } + + grpc_call* call() const { return call_; } + void set_call(grpc_call* call, const std::shared_ptr<grpc::Channel>& channel); + + grpc::experimental::ClientRpcInfo* set_client_rpc_info( + const char* method, const char* suffix_for_stats, + grpc::internal::RpcMethod::RpcType type, grpc::ChannelInterface* channel, + const std::vector<std::unique_ptr< + grpc::experimental::ClientInterceptorFactoryInterface>>& creators, + size_t interceptor_pos) { + rpc_info_ = grpc::experimental::ClientRpcInfo(this, type, method, + suffix_for_stats, channel); + rpc_info_.RegisterInterceptors(creators, interceptor_pos); + return &rpc_info_; + } + + uint32_t initial_metadata_flags() const { + return (wait_for_ready_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY : 0) | + (wait_for_ready_explicitly_set_ + ? GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET + : 0); + } + + TString authority() { return authority_; } + + void SendCancelToInterceptors(); + + static std::unique_ptr<ClientContext> FromInternalServerContext( + const grpc::ServerContextBase& server_context, + PropagationOptions options); + + bool initial_metadata_received_; + bool wait_for_ready_; + bool wait_for_ready_explicitly_set_; + std::shared_ptr<grpc::Channel> channel_; + grpc::internal::Mutex mu_; + grpc_call* call_; + bool call_canceled_; + gpr_timespec deadline_; + grpc::string authority_; + std::shared_ptr<grpc::CallCredentials> creds_; + mutable std::shared_ptr<const grpc::AuthContext> auth_context_; + struct census_context* census_context_; + std::multimap<TString, TString> send_initial_metadata_; + mutable grpc::internal::MetadataMap recv_initial_metadata_; + mutable grpc::internal::MetadataMap trailing_metadata_; + + grpc_call* propagate_from_call_; + PropagationOptions propagation_options_; + + grpc_compression_algorithm compression_algorithm_; + bool initial_metadata_corked_; + + TString debug_error_string_; + + grpc::experimental::ClientRpcInfo rpc_info_; +}; + +} // namespace grpc #endif // GRPCPP_CLIENT_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/completion_queue.h b/contrib/libs/grpc/include/grpcpp/completion_queue.h index 42637b5927..23c98e0974 100644 --- a/contrib/libs/grpc/include/grpcpp/completion_queue.h +++ b/contrib/libs/grpc/include/grpcpp/completion_queue.h @@ -1,24 +1,455 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// +/// A completion queue implements a concurrent producer-consumer queue, with +/// two main API-exposed methods: \a Next and \a AsyncNext. These +/// methods are the essential component of the gRPC C++ asynchronous API. +/// There is also a \a Shutdown method to indicate that a given completion queue +/// will no longer have regular events. This must be called before the +/// completion queue is destroyed. +/// All completion queue APIs are thread-safe and may be used concurrently with +/// any other completion queue API invocation; it is acceptable to have +/// multiple threads calling \a Next or \a AsyncNext on the same or different +/// completion queues, or to call these methods concurrently with a \a Shutdown +/// elsewhere. +/// \remark{All other API calls on completion queue should be completed before +/// a completion queue destructor is called.} #ifndef GRPCPP_COMPLETION_QUEUE_H #define GRPCPP_COMPLETION_QUEUE_H -#include <grpcpp/impl/codegen/completion_queue.h> // IWYU pragma: export +#include <list> + +#include <grpc/grpc.h> +#include <grpc/support/atm.h> +#include <grpc/support/log.h> +#include <grpc/support/time.h> +#include <grpcpp/impl/codegen/rpc_service_method.h> +#include <grpcpp/impl/codegen/status.h> +#include <grpcpp/impl/codegen/sync.h> +#include <grpcpp/impl/codegen/time.h> +#include <grpcpp/impl/completion_queue_tag.h> +#include <grpcpp/impl/grpc_library.h> +#include <grpcpp/impl/sync.h> + +struct grpc_completion_queue; + +namespace grpc { +template <class R> +class ClientReader; +template <class W> +class ClientWriter; +template <class W, class R> +class ClientReaderWriter; +template <class R> +class ServerReader; +template <class W> +class ServerWriter; +namespace internal { +template <class W, class R> +class ServerReaderWriterBody; + +template <class ResponseType> +void UnaryRunHandlerHelper( + const grpc::internal::MethodHandler::HandlerParameter&, ResponseType*, + grpc::Status&); +template <class ServiceType, class RequestType, class ResponseType, + class BaseRequestType, class BaseResponseType> +class RpcMethodHandler; +template <class ServiceType, class RequestType, class ResponseType> +class ClientStreamingHandler; +template <class ServiceType, class RequestType, class ResponseType> +class ServerStreamingHandler; +template <class Streamer, bool WriteNeeded> +class TemplatedBidiStreamingHandler; +template <grpc::StatusCode code> +class ErrorMethodHandler; +} // namespace internal + +class Channel; +class ChannelInterface; +class Server; +class ServerBuilder; +class ServerContextBase; +class ServerInterface; + +namespace internal { +class CompletionQueueTag; +class RpcMethod; +template <class InputMessage, class OutputMessage> +class BlockingUnaryCallImpl; +template <class Op1, class Op2, class Op3, class Op4, class Op5, class Op6> +class CallOpSet; +} // namespace internal + +/// A thin wrapper around \ref grpc_completion_queue (see \ref +/// src/core/lib/surface/completion_queue.h). +/// See \ref doc/cpp/perf_notes.md for notes on best practices for high +/// performance servers. +class CompletionQueue : private grpc::internal::GrpcLibrary { + public: + /// Default constructor. Implicitly creates a \a grpc_completion_queue + /// instance. + CompletionQueue() + : CompletionQueue(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, GRPC_CQ_DEFAULT_POLLING, + nullptr}) {} + + /// Wrap \a take, taking ownership of the instance. + /// + /// \param take The completion queue instance to wrap. Ownership is taken. + explicit CompletionQueue(grpc_completion_queue* take); + + /// Destructor. Destroys the owned wrapped completion queue / instance. + ~CompletionQueue() override { grpc_completion_queue_destroy(cq_); } + + /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. + enum NextStatus { + SHUTDOWN, ///< The completion queue has been shutdown and fully-drained + GOT_EVENT, ///< Got a new event; \a tag will be filled in with its + ///< associated value; \a ok indicating its success. + TIMEOUT ///< deadline was reached. + }; + + /// Read from the queue, blocking until an event is available or the queue is + /// shutting down. + /// + /// \param[out] tag Updated to point to the read event's tag. + /// \param[out] ok true if read a successful event, false otherwise. + /// + /// Note that each tag sent to the completion queue (through RPC operations + /// or alarms) will be delivered out of the completion queue by a call to + /// Next (or a related method), regardless of whether the operation succeeded + /// or not. Success here means that this operation completed in the normal + /// valid manner. + /// + /// Server-side RPC request: \a ok indicates that the RPC has indeed + /// been started. If it is false, the server has been Shutdown + /// before this particular call got matched to an incoming RPC. + /// + /// Client-side StartCall/RPC invocation: \a ok indicates that the RPC is + /// going to go to the wire. If it is false, it not going to the wire. This + /// would happen if the channel is either permanently broken or + /// transiently broken but with the fail-fast option. (Note that async unary + /// RPCs don't post a CQ tag at this point, nor do client-streaming + /// or bidi-streaming RPCs that have the initial metadata corked option set.) + /// + /// Client-side Write, Client-side WritesDone, Server-side Write, + /// Server-side Finish, Server-side SendInitialMetadata (which is + /// typically included in Write or Finish when not done explicitly): + /// \a ok means that the data/metadata/status/etc is going to go to the + /// wire. If it is false, it not going to the wire because the call + /// is already dead (i.e., canceled, deadline expired, other side + /// dropped the channel, etc). + /// + /// Client-side Read, Server-side Read, Client-side + /// RecvInitialMetadata (which is typically included in Read if not + /// done explicitly): \a ok indicates whether there is a valid message + /// that got read. If not, you know that there are certainly no more + /// messages that can ever be read from this stream. For the client-side + /// operations, this only happens because the call is dead. For the + /// server-sider operation, though, this could happen because the client + /// has done a WritesDone already. + /// + /// Client-side Finish: \a ok should always be true + /// + /// Server-side AsyncNotifyWhenDone: \a ok should always be true + /// + /// Alarm: \a ok is true if it expired, false if it was canceled + /// + /// \return true if got an event, false if the queue is fully drained and + /// shut down. + bool Next(void** tag, bool* ok) { + // Check return type == GOT_EVENT... cases: + // SHUTDOWN - queue has been shutdown, return false. + // TIMEOUT - we passed infinity time => queue has been shutdown, return + // false. + // GOT_EVENT - we actually got an event, return true. + return (AsyncNextInternal(tag, ok, gpr_inf_future(GPR_CLOCK_REALTIME)) == + GOT_EVENT); + } + + /// Read from the queue, blocking up to \a deadline (or the queue's shutdown). + /// Both \a tag and \a ok are updated upon success (if an event is available + /// within the \a deadline). A \a tag points to an arbitrary location usually + /// employed to uniquely identify an event. + /// + /// \param[out] tag Upon success, updated to point to the event's tag. + /// \param[out] ok Upon success, true if a successful event, false otherwise + /// See documentation for CompletionQueue::Next for explanation of ok + /// \param[in] deadline How long to block in wait for an event. + /// + /// \return The type of event read. + template <typename T> + NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) { + grpc::TimePoint<T> deadline_tp(deadline); + return AsyncNextInternal(tag, ok, deadline_tp.raw_time()); + } + + /// EXPERIMENTAL + /// First executes \a F, then reads from the queue, blocking up to + /// \a deadline (or the queue's shutdown). + /// Both \a tag and \a ok are updated upon success (if an event is available + /// within the \a deadline). A \a tag points to an arbitrary location usually + /// employed to uniquely identify an event. + /// + /// \param[in] f Function to execute before calling AsyncNext on this queue. + /// \param[out] tag Upon success, updated to point to the event's tag. + /// \param[out] ok Upon success, true if read a regular event, false + /// otherwise. + /// \param[in] deadline How long to block in wait for an event. + /// + /// \return The type of event read. + template <typename T, typename F> + NextStatus DoThenAsyncNext(F&& f, void** tag, bool* ok, const T& deadline) { + CompletionQueueTLSCache cache = CompletionQueueTLSCache(this); + f(); + if (cache.Flush(tag, ok)) { + return GOT_EVENT; + } else { + return AsyncNext(tag, ok, deadline); + } + } + + /// Request the shutdown of the queue. + /// + /// \warning This method must be called at some point if this completion queue + /// is accessed with Next or AsyncNext. \a Next will not return false + /// until this method has been called and all pending tags have been drained. + /// (Likewise for \a AsyncNext returning \a NextStatus::SHUTDOWN .) + /// Only once either one of these methods does that (that is, once the queue + /// has been \em drained) can an instance of this class be destroyed. + /// Also note that applications must ensure that no work is enqueued on this + /// completion queue after this method is called. + void Shutdown(); + + /// Returns a \em raw pointer to the underlying \a grpc_completion_queue + /// instance. + /// + /// \warning Remember that the returned instance is owned. No transfer of + /// ownership is performed. + grpc_completion_queue* cq() { return cq_; } + + protected: + /// Private constructor of CompletionQueue only visible to friend classes + explicit CompletionQueue(const grpc_completion_queue_attributes& attributes) { + cq_ = grpc_completion_queue_create( + grpc_completion_queue_factory_lookup(&attributes), &attributes, + nullptr); + InitialAvalanching(); // reserve this for the future shutdown + } + + private: + // Friends for access to server registration lists that enable checking and + // logging on shutdown + friend class grpc::ServerBuilder; + friend class grpc::Server; + + // Friend synchronous wrappers so that they can access Pluck(), which is + // a semi-private API geared towards the synchronous implementation. + template <class R> + friend class grpc::ClientReader; + template <class W> + friend class grpc::ClientWriter; + template <class W, class R> + friend class grpc::ClientReaderWriter; + template <class R> + friend class grpc::ServerReader; + template <class W> + friend class grpc::ServerWriter; + template <class W, class R> + friend class grpc::internal::ServerReaderWriterBody; + template <class ResponseType> + friend void grpc::internal::UnaryRunHandlerHelper( + const grpc::internal::MethodHandler::HandlerParameter&, ResponseType*, + grpc::Status&); + template <class ServiceType, class RequestType, class ResponseType> + friend class grpc::internal::ClientStreamingHandler; + template <class ServiceType, class RequestType, class ResponseType> + friend class grpc::internal::ServerStreamingHandler; + template <class Streamer, bool WriteNeeded> + friend class grpc::internal::TemplatedBidiStreamingHandler; + template <grpc::StatusCode code> + friend class grpc::internal::ErrorMethodHandler; + friend class grpc::ServerContextBase; + friend class grpc::ServerInterface; + template <class InputMessage, class OutputMessage> + friend class grpc::internal::BlockingUnaryCallImpl; + + // Friends that need access to constructor for callback CQ + friend class grpc::Channel; + + // For access to Register/CompleteAvalanching + template <class Op1, class Op2, class Op3, class Op4, class Op5, class Op6> + friend class grpc::internal::CallOpSet; + + /// EXPERIMENTAL + /// Creates a Thread Local cache to store the first event + /// On this completion queue queued from this thread. Once + /// initialized, it must be flushed on the same thread. + class CompletionQueueTLSCache { + public: + explicit CompletionQueueTLSCache(CompletionQueue* cq); + ~CompletionQueueTLSCache(); + bool Flush(void** tag, bool* ok); + + private: + CompletionQueue* cq_; + bool flushed_; + }; + + NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline); + + /// Wraps \a grpc_completion_queue_pluck. + /// \warning Must not be mixed with calls to \a Next. + bool Pluck(grpc::internal::CompletionQueueTag* tag) { + auto deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + while (true) { + auto ev = grpc_completion_queue_pluck(cq_, tag, deadline, nullptr); + bool ok = ev.success != 0; + void* ignored = tag; + if (tag->FinalizeResult(&ignored, &ok)) { + GPR_ASSERT(ignored == tag); + return ok; + } + } + } + + /// Performs a single polling pluck on \a tag. + /// \warning Must not be mixed with calls to \a Next. + /// + /// TODO: sreek - This calls tag->FinalizeResult() even if the cq_ is already + /// shutdown. This is most likely a bug and if it is a bug, then change this + /// implementation to simple call the other TryPluck function with a zero + /// timeout. i.e: + /// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME)) + void TryPluck(grpc::internal::CompletionQueueTag* tag) { + auto deadline = gpr_time_0(GPR_CLOCK_REALTIME); + auto ev = grpc_completion_queue_pluck(cq_, tag, deadline, nullptr); + if (ev.type == GRPC_QUEUE_TIMEOUT) return; + bool ok = ev.success != 0; + void* ignored = tag; + // the tag must be swallowed if using TryPluck + GPR_ASSERT(!tag->FinalizeResult(&ignored, &ok)); + } + + /// Performs a single polling pluck on \a tag. Calls tag->FinalizeResult if + /// the pluck() was successful and returned the tag. + /// + /// This exects tag->FinalizeResult (if called) to return 'false' i.e expects + /// that the tag is internal not something that is returned to the user. + void TryPluck(grpc::internal::CompletionQueueTag* tag, + gpr_timespec deadline) { + auto ev = grpc_completion_queue_pluck(cq_, tag, deadline, nullptr); + if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) { + return; + } + + bool ok = ev.success != 0; + void* ignored = tag; + GPR_ASSERT(!tag->FinalizeResult(&ignored, &ok)); + } + + /// Manage state of avalanching operations : completion queue tags that + /// trigger other completion queue operations. The underlying core completion + /// queue should not really shutdown until all avalanching operations have + /// been finalized. Note that we maintain the requirement that an avalanche + /// registration must take place before CQ shutdown (which must be maintained + /// elsewhere) + void InitialAvalanching() { + gpr_atm_rel_store(&avalanches_in_flight_, gpr_atm{1}); + } + void RegisterAvalanching() { + gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, gpr_atm{1}); + } + void CompleteAvalanching() { + if (gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, gpr_atm{-1}) == + 1) { + grpc_completion_queue_shutdown(cq_); + } + } + + void RegisterServer(const grpc::Server* server) { + (void)server; +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + server_list_.push_back(server); +#endif + } + void UnregisterServer(const grpc::Server* server) { + (void)server; +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + server_list_.remove(server); +#endif + } + bool ServerListEmpty() const { +#ifndef NDEBUG + grpc::internal::MutexLock l(&server_list_mutex_); + return server_list_.empty(); +#endif + return true; + } + + static CompletionQueue* CallbackAlternativeCQ(); + static void ReleaseCallbackAlternativeCQ(CompletionQueue* cq); + + grpc_completion_queue* cq_; // owned + + gpr_atm avalanches_in_flight_; + + // List of servers associated with this CQ. Even though this is only used with + // NDEBUG, instantiate it in all cases since otherwise the size will be + // inconsistent. + mutable grpc::internal::Mutex server_list_mutex_; + std::list<const grpc::Server*> + server_list_ /* GUARDED_BY(server_list_mutex_) */; +}; + +/// A specific type of completion queue used by the processing of notifications +/// by servers. Instantiated by \a ServerBuilder or Server (for health checker). +class ServerCompletionQueue : public CompletionQueue { + public: + bool IsFrequentlyPolled() { return polling_type_ != GRPC_CQ_NON_LISTENING; } + + protected: + /// Default constructor + ServerCompletionQueue() : polling_type_(GRPC_CQ_DEFAULT_POLLING) {} + + private: + /// \param completion_type indicates whether this is a NEXT or CALLBACK + /// completion queue. + /// \param polling_type Informs the GRPC library about the type of polling + /// allowed on this completion queue. See grpc_cq_polling_type's description + /// in grpc_types.h for more details. + /// \param shutdown_cb is the shutdown callback used for CALLBACK api queues + ServerCompletionQueue(grpc_cq_completion_type completion_type, + grpc_cq_polling_type polling_type, + grpc_completion_queue_functor* shutdown_cb) + : CompletionQueue(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, completion_type, polling_type, + shutdown_cb}), + polling_type_(polling_type) {} + + grpc_cq_polling_type polling_type_; + friend class grpc::ServerBuilder; + friend class grpc::Server; +}; + +} // namespace grpc #endif // GRPCPP_COMPLETION_QUEUE_H diff --git a/contrib/libs/grpc/include/grpcpp/create_channel.h b/contrib/libs/grpc/include/grpcpp/create_channel.h index df015b9869..83f905e776 100644 --- a/contrib/libs/grpc/include/grpcpp/create_channel.h +++ b/contrib/libs/grpc/include/grpcpp/create_channel.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_CREATE_CHANNEL_H #define GRPCPP_CREATE_CHANNEL_H diff --git a/contrib/libs/grpc/include/grpcpp/create_channel_binder.h b/contrib/libs/grpc/include/grpcpp/create_channel_binder.h index 377e4d4cd6..1a2963b40e 100644 --- a/contrib/libs/grpc/include/grpcpp/create_channel_binder.h +++ b/contrib/libs/grpc/include/grpcpp/create_channel_binder.h @@ -36,7 +36,7 @@ namespace experimental { /// name and class name will be used identify the specific application component /// to connect to. /// -/// \param jni_env Pointer to a JNIEnv structure +/// \param jni_env_void Pointer to a JNIEnv structure /// \param context The context that we will use to invoke \a bindService See /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int) /// for detail. @@ -45,7 +45,7 @@ namespace experimental { /// \param security_policy Used for checking if remote component is allowed to /// connect std::shared_ptr<grpc::Channel> CreateBinderChannel( - void* jni_env, jobject context, y_absl::string_view package_name, + void* jni_env_void, jobject context, y_absl::string_view package_name, y_absl::string_view class_name, std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy); @@ -54,7 +54,7 @@ std::shared_ptr<grpc::Channel> CreateBinderChannel( /// name and class name will be used identify the specific application component /// to connect to. /// -/// \param jni_env Pointer to a JNIEnv structure +/// \param jni_env_void Pointer to a JNIEnv structure /// \param context The context that we will use to invoke \a bindService See /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int) /// for detail. @@ -64,14 +64,14 @@ std::shared_ptr<grpc::Channel> CreateBinderChannel( /// connect /// \param args Options for channel creation. std::shared_ptr<grpc::Channel> CreateCustomBinderChannel( - void* jni_env_void, jobject application, y_absl::string_view package_name, + void* jni_env_void, jobject context, y_absl::string_view package_name, y_absl::string_view class_name, std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy, const ChannelArguments& args); /// EXPERIMENTAL Create a new \a Channel based on binder transport. /// -/// \param jni_env Pointer to a JNIEnv structure +/// \param jni_env_void Pointer to a JNIEnv structure /// \param context The context that we will use to invoke \a bindService See /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int) /// for detail. @@ -80,13 +80,13 @@ std::shared_ptr<grpc::Channel> CreateCustomBinderChannel( /// \param security_policy Used for checking if remote component is allowed to /// connect std::shared_ptr<grpc::Channel> CreateBinderChannel( - void* jni_env, jobject context, y_absl::string_view uri, + void* jni_env_void, jobject context, y_absl::string_view uri, std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy); /// EXPERIMENTAL Create a new \a Channel based on binder transport. /// -/// \param jni_env Pointer to a JNIEnv structure +/// \param jni_env_void Pointer to a JNIEnv structure /// \param context The context that we will use to invoke \a bindService See /// https://developer.android.com/reference/android/content/Context#bindService(android.content.Intent,%20android.content.ServiceConnection,%20int) /// for detail. @@ -96,7 +96,7 @@ std::shared_ptr<grpc::Channel> CreateBinderChannel( /// connect /// \param args Options for channel creation. std::shared_ptr<grpc::Channel> CreateCustomBinderChannel( - void* jni_env, jobject context, y_absl::string_view uri, + void* jni_env_void, jobject context, y_absl::string_view uri, std::shared_ptr<grpc::experimental::binder::SecurityPolicy> security_policy, const ChannelArguments& args); diff --git a/contrib/libs/grpc/include/grpcpp/create_channel_posix.h b/contrib/libs/grpc/include/grpcpp/create_channel_posix.h index a57b4deeb1..1d3f32eb18 100644 --- a/contrib/libs/grpc/include/grpcpp/create_channel_posix.h +++ b/contrib/libs/grpc/include/grpcpp/create_channel_posix.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_CREATE_CHANNEL_POSIX_H #define GRPCPP_CREATE_CHANNEL_POSIX_H diff --git a/contrib/libs/grpc/include/grpcpp/ext/call_metric_recorder.h b/contrib/libs/grpc/include/grpcpp/ext/call_metric_recorder.h index 91e25760f3..66a0e99d33 100644 --- a/contrib/libs/grpc/include/grpcpp/ext/call_metric_recorder.h +++ b/contrib/libs/grpc/include/grpcpp/ext/call_metric_recorder.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2022 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2022 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_EXT_CALL_METRIC_RECORDER_H #define GRPCPP_EXT_CALL_METRIC_RECORDER_H @@ -26,42 +26,33 @@ #include "y_absl/strings/string_view.h" #include "y_absl/types/optional.h" -#include <grpcpp/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/sync.h> - -namespace grpc_core { -class Arena; -struct BackendMetricData; -} // namespace grpc_core +#include <grpcpp/impl/sync.h> +#include <grpcpp/support/slice.h> namespace grpc { -class ServerBuilder; - namespace experimental { -class OrcaServerInterceptor; - -// Registers the per-rpc orca load reporter into the \a ServerBuilder. -// Once this is done, the server will automatically send the load metrics -// after each RPC as they were reported. In order to report load metrics, -// call the \a ServerContext::ExperimentalGetCallMetricRecorder() method to -// retrieve the recorder for the current call. -void EnableCallMetricRecording(ServerBuilder*); /// Records call metrics for the purpose of load balancing. /// During an RPC, call \a ServerContext::ExperimentalGetCallMetricRecorder() /// method to retrive the recorder for the current call. class CallMetricRecorder { public: - explicit CallMetricRecorder(grpc_core::Arena* arena); - ~CallMetricRecorder(); + virtual ~CallMetricRecorder() = default; /// Records a call metric measurement for CPU utilization. /// Multiple calls to this method will override the stored value. - CallMetricRecorder& RecordCpuUtilizationMetric(double value); + /// Values outside of the valid range [0, 1] are ignored. + virtual CallMetricRecorder& RecordCpuUtilizationMetric(double value) = 0; /// Records a call metric measurement for memory utilization. /// Multiple calls to this method will override the stored value. - CallMetricRecorder& RecordMemoryUtilizationMetric(double value); + /// Values outside of the valid range [0, 1] are ignored. + virtual CallMetricRecorder& RecordMemoryUtilizationMetric(double value) = 0; + + /// Records a call metric measurement for queries per second. + /// Multiple calls to this method will override the stored value. + /// Values outside of the valid range [0, infy) are ignored. + virtual CallMetricRecorder& RecordQpsMetric(double value) = 0; /// Records a call metric measurement for utilization. /// Multiple calls to this method with the same name will @@ -70,7 +61,9 @@ class CallMetricRecorder { /// itself, since it's going to be sent as trailers after the RPC /// finishes. It is assumed the strings are common names that /// are global constants. - CallMetricRecorder& RecordUtilizationMetric(string_ref name, double value); + /// Values outside of the valid range [0, 1] are ignored. + virtual CallMetricRecorder& RecordUtilizationMetric(string_ref name, + double value) = 0; /// Records a call metric measurement for request cost. /// Multiple calls to this method with the same name will @@ -79,14 +72,8 @@ class CallMetricRecorder { /// itself, since it's going to be sent as trailers after the RPC /// finishes. It is assumed the strings are common names that /// are global constants. - CallMetricRecorder& RecordRequestCostMetric(string_ref name, double value); - - private: - y_absl::optional<TString> CreateSerializedReport(); - - internal::Mutex mu_; - grpc_core::BackendMetricData* backend_metric_data_ Y_ABSL_GUARDED_BY(&mu_); - friend class experimental::OrcaServerInterceptor; + virtual CallMetricRecorder& RecordRequestCostMetric(string_ref name, + double value) = 0; }; } // namespace experimental diff --git a/contrib/libs/grpc/include/grpcpp/ext/channelz_service_plugin.h b/contrib/libs/grpc/include/grpcpp/ext/channelz_service_plugin.h index af3192d451..23882abb50 100644 --- a/contrib/libs/grpc/include/grpcpp/ext/channelz_service_plugin.h +++ b/contrib/libs/grpc/include/grpcpp/ext/channelz_service_plugin.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H #define GRPCPP_EXT_CHANNELZ_SERVICE_PLUGIN_H diff --git a/contrib/libs/grpc/include/grpcpp/ext/health_check_service_server_builder_option.h b/contrib/libs/grpc/include/grpcpp/ext/health_check_service_server_builder_option.h index dd43b05ef0..85b661ee51 100644 --- a/contrib/libs/grpc/include/grpcpp/ext/health_check_service_server_builder_option.h +++ b/contrib/libs/grpc/include/grpcpp/ext/health_check_service_server_builder_option.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H #define GRPCPP_EXT_HEALTH_CHECK_SERVICE_SERVER_BUILDER_OPTION_H diff --git a/contrib/libs/grpc/include/grpcpp/ext/proto_server_reflection_plugin.h b/contrib/libs/grpc/include/grpcpp/ext/proto_server_reflection_plugin.h index f693c00ae4..9c618fbd46 100644 --- a/contrib/libs/grpc/include/grpcpp/ext/proto_server_reflection_plugin.h +++ b/contrib/libs/grpc/include/grpcpp/ext/proto_server_reflection_plugin.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H #define GRPCPP_EXT_PROTO_SERVER_REFLECTION_PLUGIN_H diff --git a/contrib/libs/grpc/include/grpcpp/ext/server_metric_recorder.h b/contrib/libs/grpc/include/grpcpp/ext/server_metric_recorder.h new file mode 100644 index 0000000000..6333072214 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/ext/server_metric_recorder.h @@ -0,0 +1,108 @@ +// +// +// Copyright 2023 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_EXT_SERVER_METRIC_RECORDER_H +#define GRPCPP_EXT_SERVER_METRIC_RECORDER_H + +#include <functional> +#include <map> +#include <memory> + +#include <grpcpp/impl/sync.h> +#include <grpcpp/support/string_ref.h> + +namespace grpc_core { +struct BackendMetricData; +} // namespace grpc_core + +namespace grpc { +class BackendMetricState; + +namespace experimental { +/// Records server wide metrics to be reported to the client. +/// Server implementation creates an instance and reports server metrics to it, +/// and then passes it to +/// ServerBuilder::experimental_type::EnableCallMetricRecording or +/// experimental::OrcaService that read metrics to include in the report. +class ServerMetricRecorder { + public: + // Factory method. Use this to create. + static std::unique_ptr<ServerMetricRecorder> Create(); + /// Records the server CPU utilization in the range [0, 1]. + /// Values outside of the valid range are rejected. + /// Overrides the stored value when called again with a valid value. + void SetCpuUtilization(double value); + /// Records the server memory utilization in the range [0, 1]. + /// Values outside of the valid range are rejected. + /// Overrides the stored value when called again with a valid value. + void SetMemoryUtilization(double value); + /// Records number of queries per second to the server in the range [0, infy). + /// Values outside of the valid range are rejected. + /// Overrides the stored value when called again with a valid value. + void SetQps(double value); + /// Records a named resource utilization value in the range [0, 1]. + /// Values outside of the valid range are rejected. + /// Overrides the stored value when called again with the same name. + /// The name string should remain valid while this utilization remains + /// in this recorder. It is assumed that strings are common names that are + /// global constants. + void SetNamedUtilization(string_ref name, double value); + /// Replaces all named resource utilization values. No range validation. + /// The name strings should remain valid while utilization values remain + /// in this recorder. It is assumed that strings are common names that are + /// global constants. + void SetAllNamedUtilization(std::map<string_ref, double> named_utilization); + + /// Clears the server CPU utilization if recorded. + void ClearCpuUtilization(); + /// Clears the server memory utilization if recorded. + void ClearMemoryUtilization(); + /// Clears number of queries per second to the server if recorded. + void ClearQps(); + /// Clears a named utilization value if exists. + void ClearNamedUtilization(string_ref name); + + private: + // To access GetMetrics(). + friend class grpc::BackendMetricState; + friend class OrcaService; + + struct BackendMetricDataState; + + // No direct creation, use the factory method Create() above. + ServerMetricRecorder(); + + // Updates the metric state by applying `updater` to the data and incrementing + // the sequence number. + void UpdateBackendMetricDataState( + std::function<void(grpc_core::BackendMetricData*)> updater); + + grpc_core::BackendMetricData GetMetrics() const; + // Returned metric data is guaranteed to be identical between two calls if the + // sequence numbers match. + std::shared_ptr<const BackendMetricDataState> GetMetricsIfChanged() const; + + mutable grpc::internal::Mutex mu_; + std::shared_ptr<const BackendMetricDataState> metric_state_ + Y_ABSL_GUARDED_BY(mu_); +}; + +} // namespace experimental +} // namespace grpc + +#endif // GRPCPP_EXT_SERVER_METRIC_RECORDER_H diff --git a/contrib/libs/grpc/include/grpcpp/generic/async_generic_service.h b/contrib/libs/grpc/include/grpcpp/generic/async_generic_service.h index 9fb2bb9acb..40eeb0e56e 100644 --- a/contrib/libs/grpc/include/grpcpp/generic/async_generic_service.h +++ b/contrib/libs/grpc/include/grpcpp/generic/async_generic_service.h @@ -1,27 +1,27 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H #define GRPCPP_GENERIC_ASYNC_GENERIC_SERVICE_H -#include <grpc/impl/codegen/port_platform.h> +#include <grpc/support/port_platform.h> -#include <grpcpp/impl/codegen/server_callback_handlers.h> +#include <grpcpp/impl/server_callback_handlers.h> #include <grpcpp/support/async_stream.h> #include <grpcpp/support/byte_buffer.h> #include <grpcpp/support/server_callback.h> diff --git a/contrib/libs/grpc/include/grpcpp/grpcpp.h b/contrib/libs/grpc/include/grpcpp/grpcpp.h index fbc161bec1..49154de8b0 100644 --- a/contrib/libs/grpc/include/grpcpp/grpcpp.h +++ b/contrib/libs/grpc/include/grpcpp/grpcpp.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// /// \mainpage gRPC C++ API /// @@ -58,6 +58,7 @@ #include <grpcpp/server_builder.h> #include <grpcpp/server_context.h> #include <grpcpp/server_posix.h> +#include <grpcpp/version_info.h> // IWYU pragma: end_exports namespace grpc { diff --git a/contrib/libs/grpc/include/grpcpp/health_check_service_interface.h b/contrib/libs/grpc/include/grpcpp/health_check_service_interface.h index de055a82ea..23e4e99f53 100644 --- a/contrib/libs/grpc/include/grpcpp/health_check_service_interface.h +++ b/contrib/libs/grpc/include/grpcpp/health_check_service_interface.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H #define GRPCPP_HEALTH_CHECK_SERVICE_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/call.h b/contrib/libs/grpc/include/grpcpp/impl/call.h index 2a119963f5..32c5817532 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/call.h +++ b/contrib/libs/grpc/include/grpcpp/impl/call.h @@ -1,25 +1,25 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CALL_H #define GRPCPP_IMPL_CALL_H -#include <grpc/impl/codegen/grpc_types.h> +#include <grpc/impl/grpc_types.h> #include <grpcpp/impl/call_hook.h> namespace grpc { @@ -40,7 +40,7 @@ class Call final { cq_(nullptr), call_(nullptr), max_receive_message_size_(-1) {} - /** call is owned by the caller */ + /// call is owned by the caller Call(grpc_call* call, CallHook* call_hook, grpc::CompletionQueue* cq) : call_hook_(call_hook), cq_(cq), diff --git a/contrib/libs/grpc/include/grpcpp/impl/call_hook.h b/contrib/libs/grpc/include/grpcpp/impl/call_hook.h index 8903b9a06e..2376769194 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/call_hook.h +++ b/contrib/libs/grpc/include/grpcpp/impl/call_hook.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CALL_HOOK_H #define GRPCPP_IMPL_CALL_HOOK_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_op_set.h b/contrib/libs/grpc/include/grpcpp/impl/call_op_set.h index ce8b363d6a..88f0ea0e00 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_op_set.h +++ b/contrib/libs/grpc/include/grpcpp/impl/call_op_set.h @@ -1,55 +1,50 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#if defined(__GNUC__) -#pragma GCC system_header -#endif - -#ifndef GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H -#define GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H - -// IWYU pragma: private +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_CALL_OP_SET_H +#define GRPCPP_IMPL_CALL_OP_SET_H #include <cstring> #include <map> #include <memory> -#include <grpc/impl/codegen/compression_types.h> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_hook.h> -#include <grpcpp/impl/codegen/call_op_set_interface.h> -#include <grpcpp/impl/codegen/client_context.h> -#include <grpcpp/impl/codegen/completion_queue.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> +#include <grpc/grpc.h> +#include <grpc/impl/compression_types.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/slice.h> +#include <grpc/support/alloc.h> +#include <grpc/support/log.h> +#include <grpcpp/client_context.h> +#include <grpcpp/completion_queue.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_hook.h> +#include <grpcpp/impl/call_op_set_interface.h> #include <grpcpp/impl/codegen/intercepted_channel.h> -#include <grpcpp/impl/codegen/interceptor_common.h> -#include <grpcpp/impl/codegen/serialization_traits.h> -#include <grpcpp/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/string_ref.h> +#include <grpcpp/impl/completion_queue_tag.h> +#include <grpcpp/impl/interceptor_common.h> +#include <grpcpp/impl/serialization_traits.h> #include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/slice.h> +#include <grpcpp/support/string_ref.h> namespace grpc { -extern CoreCodegenInterface* g_core_codegen_interface; - namespace internal { class Call; class CallHook; @@ -63,18 +58,16 @@ inline grpc_metadata* FillMetadataArray( if (*metadata_count == 0) { return nullptr; } - grpc_metadata* metadata_array = - static_cast<grpc_metadata*>(g_core_codegen_interface->gpr_malloc( - (*metadata_count) * sizeof(grpc_metadata))); + grpc_metadata* metadata_array = static_cast<grpc_metadata*>( + gpr_malloc((*metadata_count) * sizeof(grpc_metadata))); size_t i = 0; for (auto iter = metadata.cbegin(); iter != metadata.cend(); ++iter, ++i) { metadata_array[i].key = SliceReferencingString(iter->first); metadata_array[i].value = SliceReferencingString(iter->second); } if (!optional_error_details.empty()) { - metadata_array[i].key = - g_core_codegen_interface->grpc_slice_from_static_buffer( - kBinaryErrorDetailsKey, sizeof(kBinaryErrorDetailsKey) - 1); + metadata_array[i].key = grpc_slice_from_static_buffer( + kBinaryErrorDetailsKey, sizeof(kBinaryErrorDetailsKey) - 1); metadata_array[i].value = SliceReferencingString(optional_error_details); } return metadata_array; @@ -259,7 +252,7 @@ class CallOpSendInitialMetadata { } void FinishOp(bool* /*status*/) { if (!send_ || hijacked_) return; - g_core_codegen_interface->gpr_free(initial_metadata_); + gpr_free(initial_metadata_); send_ = false; } @@ -323,7 +316,7 @@ class CallOpSendMessage { return; } if (msg_ != nullptr) { - GPR_CODEGEN_ASSERT(serializer_(msg_).ok()); + GPR_ASSERT(serializer_(msg_).ok()); } serializer_ = nullptr; grpc_op* op = &ops[(*nops)++]; @@ -387,11 +380,7 @@ Status CallOpSendMessage::SendMessage(const M& message, WriteOptions options) { write_options_ = options; // Serialize immediately since we do not have access to the message pointer bool own_buf; - // TODO(vjpai): Remove the void below when possible - // The void in the template parameter below should not be needed - // (since it should be implicit) but is needed due to an observed - // difference in behavior between clang and gcc for certain internal users - Status result = SerializationTraits<M, void>::Serialize( + Status result = SerializationTraits<M>::Serialize( message, send_buf_.bbuf_ptr(), &own_buf); if (!own_buf) { send_buf_.Duplicate(); @@ -416,7 +405,7 @@ Status CallOpSendMessage::SendMessagePtr(const M* message, // The void in the template parameter below should not be needed // (since it should be implicit) but is needed due to an observed // difference in behavior between clang and gcc for certain internal users - Status result = SerializationTraits<M, void>::Serialize( + Status result = SerializationTraits<M>::Serialize( *static_cast<const M*>(message), send_buf_.bbuf_ptr(), &own_buf); if (!own_buf) { send_buf_.Duplicate(); @@ -696,7 +685,7 @@ class CallOpServerSendStatus { void FinishOp(bool* /*status*/) { if (!send_status_available_ || hijacked_) return; - g_core_codegen_interface->gpr_free(trailing_metadata_); + gpr_free(trailing_metadata_); send_status_available_ = false; } @@ -786,7 +775,7 @@ class CallOpClientRecvStatus { client_context_ = context; metadata_map_ = &client_context_->trailing_metadata_; recv_status_ = status; - error_message_ = g_core_codegen_interface->grpc_empty_slice(); + error_message_ = grpc_empty_slice(); } protected: @@ -806,7 +795,7 @@ class CallOpClientRecvStatus { if (recv_status_ == nullptr || hijacked_) return; if (static_cast<StatusCode>(status_code_) == StatusCode::OK) { *recv_status_ = Status(); - GPR_CODEGEN_DEBUG_ASSERT(debug_error_string_ == nullptr); + GPR_DEBUG_ASSERT(debug_error_string_ == nullptr); } else { *recv_status_ = Status(static_cast<StatusCode>(status_code_), @@ -817,13 +806,12 @@ class CallOpClientRecvStatus { metadata_map_->GetBinaryErrorDetails()); if (debug_error_string_ != nullptr) { client_context_->set_debug_error_string(debug_error_string_); - g_core_codegen_interface->gpr_free( - const_cast<char*>(debug_error_string_)); + gpr_free(const_cast<char*>(debug_error_string_)); } } // TODO(soheil): Find callers that set debug string even for status OK, // and fix them. - g_core_codegen_interface->grpc_slice_unref(error_message_); + grpc_slice_unref(error_message_); } void SetInterceptionHookPoint( @@ -902,7 +890,7 @@ class CallOpSet : public CallOpSetInterface, void FillOps(Call* call) override { done_intercepting_ = false; - g_core_codegen_interface->grpc_call_ref(call->call()); + grpc_call_ref(call->call()); call_ = *call; // It's fine to create a copy of call since it's just pointers @@ -923,7 +911,7 @@ class CallOpSet : public CallOpSetInterface, // run *tag = return_tag_; *status = saved_status_; - g_core_codegen_interface->grpc_call_unref(call_.call()); + grpc_call_unref(call_.call()); return true; } @@ -936,7 +924,7 @@ class CallOpSet : public CallOpSetInterface, saved_status_ = *status; if (RunInterceptorsPostRecv()) { *tag = return_tag_; - g_core_codegen_interface->grpc_call_unref(call_.call()); + grpc_call_unref(call_.call()); return true; } // Interceptors are going to be run, so we can't return the tag just yet. @@ -977,16 +965,16 @@ class CallOpSet : public CallOpSetInterface, this->Op5::AddOp(ops, &nops); this->Op6::AddOp(ops, &nops); - grpc_call_error err = g_core_codegen_interface->grpc_call_start_batch( - call_.call(), ops, nops, core_cq_tag(), nullptr); + grpc_call_error err = + grpc_call_start_batch(call_.call(), ops, nops, core_cq_tag(), nullptr); if (err != GRPC_CALL_OK) { // A failure here indicates an API misuse; for example, doing a Write // while another Write is already pending on the same RPC or invoking // WritesDone multiple times - // gpr_log(GPR_ERROR, "API misuse of type %s observed", - // g_core_codegen_interface->grpc_call_error_to_string(err)); - GPR_CODEGEN_ASSERT(false); + gpr_log(GPR_ERROR, "API misuse of type %s observed", + grpc_call_error_to_string(err)); + GPR_ASSERT(false); } } @@ -996,9 +984,8 @@ class CallOpSet : public CallOpSetInterface, done_intercepting_ = true; // The following call_start_batch is internally-generated so no need for an // explanatory log on failure. - GPR_CODEGEN_ASSERT(g_core_codegen_interface->grpc_call_start_batch( - call_.call(), nullptr, 0, core_cq_tag(), nullptr) == - GRPC_CALL_OK); + GPR_ASSERT(grpc_call_start_batch(call_.call(), nullptr, 0, core_cq_tag(), + nullptr) == GRPC_CALL_OK); } private: @@ -1046,4 +1033,4 @@ class CallOpSet : public CallOpSetInterface, } // namespace internal } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_CALL_OP_SET_H +#endif // GRPCPP_IMPL_CALL_OP_SET_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/call_op_set_interface.h b/contrib/libs/grpc/include/grpcpp/impl/call_op_set_interface.h index 43ed4ed94d..c9667bd391 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/call_op_set_interface.h +++ b/contrib/libs/grpc/include/grpcpp/impl/call_op_set_interface.h @@ -1,27 +1,27 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CALL_OP_SET_INTERFACE_H #define GRPCPP_IMPL_CALL_OP_SET_INTERFACE_H // IWYU pragma: private -#include <grpcpp/impl/codegen/completion_queue_tag.h> +#include <grpcpp/impl/completion_queue_tag.h> namespace grpc { namespace internal { diff --git a/contrib/libs/grpc/include/grpcpp/impl/channel_argument_option.h b/contrib/libs/grpc/include/grpcpp/impl/channel_argument_option.h index 6e93199694..bf91845a29 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/channel_argument_option.h +++ b/contrib/libs/grpc/include/grpcpp/impl/channel_argument_option.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2017 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H #define GRPCPP_IMPL_CHANNEL_ARGUMENT_OPTION_H @@ -31,6 +31,8 @@ std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption( const TString& name, const TString& value); std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption( const TString& name, int value); +std::unique_ptr<ServerBuilderOption> MakeChannelArgumentOption( + const TString& name, void* value); } // namespace grpc diff --git a/contrib/libs/grpc/include/grpcpp/impl/channel_interface.h b/contrib/libs/grpc/include/grpcpp/impl/channel_interface.h new file mode 100644 index 0000000000..48d9661f6f --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/channel_interface.h @@ -0,0 +1,170 @@ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_CHANNEL_INTERFACE_H +#define GRPCPP_IMPL_CHANNEL_INTERFACE_H + +#include <grpc/impl/connectivity_state.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/support/status.h> +#include <grpcpp/support/time.h> + +namespace grpc { +template <class R> +class ClientReader; +template <class W> +class ClientWriter; +template <class W, class R> +class ClientReaderWriter; +namespace internal { +template <class InputMessage, class OutputMessage> +class CallbackUnaryCallImpl; +template <class R> +class ClientAsyncReaderFactory; +template <class W> +class ClientAsyncWriterFactory; +template <class W, class R> +class ClientAsyncReaderWriterFactory; +class ClientAsyncResponseReaderHelper; +template <class W, class R> +class ClientCallbackReaderWriterFactory; +template <class R> +class ClientCallbackReaderFactory; +template <class W> +class ClientCallbackWriterFactory; +class ClientCallbackUnaryFactory; +} // namespace internal + +class ChannelInterface; +class ClientContext; +class CompletionQueue; + +namespace experimental { +class DelegatingChannel; +} + +namespace internal { +class Call; +class CallOpSetInterface; +class RpcMethod; +class InterceptedChannel; +template <class InputMessage, class OutputMessage> +class BlockingUnaryCallImpl; +} // namespace internal + +/// Codegen interface for \a grpc::Channel. +class ChannelInterface { + public: + virtual ~ChannelInterface() {} + /// Get the current channel state. If the channel is in IDLE and + /// \a try_to_connect is set to true, try to connect. + virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; + + /// Return the \a tag on \a cq when the channel state is changed or \a + /// deadline expires. \a GetState needs to called to get the current state. + template <typename T> + void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline, + grpc::CompletionQueue* cq, void* tag) { + TimePoint<T> deadline_tp(deadline); + NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag); + } + + /// Blocking wait for channel state change or \a deadline expiration. + /// \a GetState needs to called to get the current state. + template <typename T> + bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) { + TimePoint<T> deadline_tp(deadline); + return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); + } + + /// Wait for this channel to be connected + template <typename T> + bool WaitForConnected(T deadline) { + grpc_connectivity_state state; + while ((state = GetState(true)) != GRPC_CHANNEL_READY) { + if (!WaitForStateChange(state, deadline)) return false; + } + return true; + } + + private: + template <class R> + friend class grpc::ClientReader; + template <class W> + friend class grpc::ClientWriter; + template <class W, class R> + friend class grpc::ClientReaderWriter; + template <class R> + friend class grpc::internal::ClientAsyncReaderFactory; + template <class W> + friend class grpc::internal::ClientAsyncWriterFactory; + template <class W, class R> + friend class grpc::internal::ClientAsyncReaderWriterFactory; + friend class grpc::internal::ClientAsyncResponseReaderHelper; + template <class W, class R> + friend class grpc::internal::ClientCallbackReaderWriterFactory; + template <class R> + friend class grpc::internal::ClientCallbackReaderFactory; + template <class W> + friend class grpc::internal::ClientCallbackWriterFactory; + friend class grpc::internal::ClientCallbackUnaryFactory; + template <class InputMessage, class OutputMessage> + friend class grpc::internal::BlockingUnaryCallImpl; + template <class InputMessage, class OutputMessage> + friend class grpc::internal::CallbackUnaryCallImpl; + friend class grpc::internal::RpcMethod; + friend class grpc::experimental::DelegatingChannel; + friend class grpc::internal::InterceptedChannel; + virtual internal::Call CreateCall(const internal::RpcMethod& method, + grpc::ClientContext* context, + grpc::CompletionQueue* cq) = 0; + virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, + internal::Call* call) = 0; + virtual void* RegisterMethod(const char* method) = 0; + virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, + grpc::CompletionQueue* cq, + void* tag) = 0; + virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) = 0; + + // EXPERIMENTAL + // This is needed to keep codegen_test_minimal happy. InterceptedChannel needs + // to make use of this but can't directly call Channel's implementation + // because of the test. + // Returns an empty Call object (rather than being pure) since this is a new + // method and adding a new pure method to an interface would be a breaking + // change (even though this is private and non-API) + virtual internal::Call CreateCallInternal( + const internal::RpcMethod& /*method*/, grpc::ClientContext* /*context*/, + grpc::CompletionQueue* /*cq*/, size_t /*interceptor_pos*/) { + return internal::Call(); + } + + // A method to get the callbackable completion queue associated with this + // channel. If the return value is nullptr, this channel doesn't support + // callback operations. + // TODO(vjpai): Consider a better default like using a global CQ + // Returns nullptr (rather than being pure) since this is a post-1.0 method + // and adding a new pure method to an interface would be a breaking change + // (even though this is private and non-API) + virtual grpc::CompletionQueue* CallbackCQ() { return nullptr; } +}; +} // namespace grpc + +#endif // GRPCPP_IMPL_CHANNEL_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_unary_call.h b/contrib/libs/grpc/include/grpcpp/impl/client_unary_call.h index 86adb3e33e..c2fdcd99a3 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_unary_call.h +++ b/contrib/libs/grpc/include/grpcpp/impl/client_unary_call.h @@ -1,32 +1,29 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// -#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H -#define GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H +#ifndef GRPCPP_IMPL_CLIENT_UNARY_CALL_H +#define GRPCPP_IMPL_CLIENT_UNARY_CALL_H -// IWYU pragma: private, include <grpcpp/impl/client_unary_call.h> - -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_op_set.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/status.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set.h> +#include <grpcpp/impl/channel_interface.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> namespace grpc { @@ -102,4 +99,4 @@ class BlockingUnaryCallImpl { } // namespace internal } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_CLIENT_UNARY_CALL_H +#endif // GRPCPP_IMPL_CLIENT_UNARY_CALL_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_generic_service.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/async_generic_service.h deleted file mode 100644 index 03a096c52b..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_generic_service.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H -#define GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H - -// IWYU pragma: private - -/// TODO(chengyuc): Remove this file after solving compatibility. -#include <grpcpp/generic/async_generic_service.h> - -#endif // GRPCPP_IMPL_CODEGEN_ASYNC_GENERIC_SERVICE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_stream.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/async_stream.h index 524f619f81..e10bc8c219 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_stream.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/async_stream.h @@ -1,19 +1,19 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// #ifndef GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H #define GRPCPP_IMPL_CODEGEN_ASYNC_STREAM_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_unary_call.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/async_unary_call.h deleted file mode 100644 index 55227b2e4a..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/async_unary_call.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H -#define GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H - -// IWYU pragma: private - -/// TODO(chengyuc): Remove this file after solving compatibility. -#include <grpcpp/support/async_unary_call.h> - -#endif // GRPCPP_IMPL_CODEGEN_ASYNC_UNARY_CALL_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/byte_buffer.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/byte_buffer.h index d196995392..4e01e92f35 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/byte_buffer.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/byte_buffer.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2017 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2017 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H #define GRPCPP_IMPL_CODEGEN_BYTE_BUFFER_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/call.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/call.h deleted file mode 100644 index 71f6cb8e4e..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/call.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -#ifndef GRPCPP_IMPL_CODEGEN_CALL_H -#define GRPCPP_IMPL_CODEGEN_CALL_H - -// IWYU pragma: private - -/// TODO(chengyuc): Remove this file after solving compatibility. -#include <grpcpp/impl/call.h> - -#endif // GRPCPP_IMPL_CODEGEN_CALL_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_hook.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/call_hook.h deleted file mode 100644 index db10a0fc2b..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_hook.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CALL_HOOK_H -#define GRPCPP_IMPL_CODEGEN_CALL_HOOK_H - -// IWYU pragma: private - -/// TODO(chengyuc): Remove this file after solving compatibility. -#include <grpcpp/impl/call_hook.h> - -#endif // GRPCPP_IMPL_CODEGEN_CALL_HOOK_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_op_set_interface.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/call_op_set_interface.h deleted file mode 100644 index ce5f2036d1..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/call_op_set_interface.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H -#define GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H - -// IWYU pragma: private - -#include <grpcpp/impl/call_op_set_interface.h> - -#endif // GRPCPP_IMPL_CODEGEN_CALL_OP_SET_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/channel_interface.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/channel_interface.h index a3f162cc87..2464409d5d 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/channel_interface.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/channel_interface.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #if defined(__GNUC__) #pragma GCC system_header @@ -25,152 +25,7 @@ // IWYU pragma: private -#include <grpc/impl/codegen/connectivity_state.h> -#include <grpcpp/impl/call.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/time.h> - -namespace grpc { -template <class R> -class ClientReader; -template <class W> -class ClientWriter; -template <class W, class R> -class ClientReaderWriter; -namespace internal { -template <class InputMessage, class OutputMessage> -class CallbackUnaryCallImpl; -template <class R> -class ClientAsyncReaderFactory; -template <class W> -class ClientAsyncWriterFactory; -template <class W, class R> -class ClientAsyncReaderWriterFactory; -class ClientAsyncResponseReaderHelper; -template <class W, class R> -class ClientCallbackReaderWriterFactory; -template <class R> -class ClientCallbackReaderFactory; -template <class W> -class ClientCallbackWriterFactory; -class ClientCallbackUnaryFactory; -} // namespace internal - -class ChannelInterface; -class ClientContext; -class CompletionQueue; - -namespace experimental { -class DelegatingChannel; -} - -namespace internal { -class Call; -class CallOpSetInterface; -class RpcMethod; -class InterceptedChannel; -template <class InputMessage, class OutputMessage> -class BlockingUnaryCallImpl; -} // namespace internal - -/// Codegen interface for \a grpc::Channel. -class ChannelInterface { - public: - virtual ~ChannelInterface() {} - /// Get the current channel state. If the channel is in IDLE and - /// \a try_to_connect is set to true, try to connect. - virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; - - /// Return the \a tag on \a cq when the channel state is changed or \a - /// deadline expires. \a GetState needs to called to get the current state. - template <typename T> - void NotifyOnStateChange(grpc_connectivity_state last_observed, T deadline, - grpc::CompletionQueue* cq, void* tag) { - TimePoint<T> deadline_tp(deadline); - NotifyOnStateChangeImpl(last_observed, deadline_tp.raw_time(), cq, tag); - } - - /// Blocking wait for channel state change or \a deadline expiration. - /// \a GetState needs to called to get the current state. - template <typename T> - bool WaitForStateChange(grpc_connectivity_state last_observed, T deadline) { - TimePoint<T> deadline_tp(deadline); - return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); - } - - /// Wait for this channel to be connected - template <typename T> - bool WaitForConnected(T deadline) { - grpc_connectivity_state state; - while ((state = GetState(true)) != GRPC_CHANNEL_READY) { - if (!WaitForStateChange(state, deadline)) return false; - } - return true; - } - - private: - template <class R> - friend class grpc::ClientReader; - template <class W> - friend class grpc::ClientWriter; - template <class W, class R> - friend class grpc::ClientReaderWriter; - template <class R> - friend class grpc::internal::ClientAsyncReaderFactory; - template <class W> - friend class grpc::internal::ClientAsyncWriterFactory; - template <class W, class R> - friend class grpc::internal::ClientAsyncReaderWriterFactory; - friend class grpc::internal::ClientAsyncResponseReaderHelper; - template <class W, class R> - friend class grpc::internal::ClientCallbackReaderWriterFactory; - template <class R> - friend class grpc::internal::ClientCallbackReaderFactory; - template <class W> - friend class grpc::internal::ClientCallbackWriterFactory; - friend class grpc::internal::ClientCallbackUnaryFactory; - template <class InputMessage, class OutputMessage> - friend class grpc::internal::BlockingUnaryCallImpl; - template <class InputMessage, class OutputMessage> - friend class grpc::internal::CallbackUnaryCallImpl; - friend class grpc::internal::RpcMethod; - friend class grpc::experimental::DelegatingChannel; - friend class grpc::internal::InterceptedChannel; - virtual internal::Call CreateCall(const internal::RpcMethod& method, - grpc::ClientContext* context, - grpc::CompletionQueue* cq) = 0; - virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops, - internal::Call* call) = 0; - virtual void* RegisterMethod(const char* method) = 0; - virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline, - grpc::CompletionQueue* cq, - void* tag) = 0; - virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline) = 0; - - // EXPERIMENTAL - // This is needed to keep codegen_test_minimal happy. InterceptedChannel needs - // to make use of this but can't directly call Channel's implementation - // because of the test. - // Returns an empty Call object (rather than being pure) since this is a new - // method and adding a new pure method to an interface would be a breaking - // change (even though this is private and non-API) - virtual internal::Call CreateCallInternal( - const internal::RpcMethod& /*method*/, grpc::ClientContext* /*context*/, - grpc::CompletionQueue* /*cq*/, size_t /*interceptor_pos*/) { - return internal::Call(); - } - - // A method to get the callbackable completion queue associated with this - // channel. If the return value is nullptr, this channel doesn't support - // callback operations. - // TODO(vjpai): Consider a better default like using a global CQ - // Returns nullptr (rather than being pure) since this is a post-1.0 method - // and adding a new pure method to an interface would be a breaking change - // (even though this is private and non-API) - virtual grpc::CompletionQueue* CallbackCQ() { return nullptr; } -}; -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/channel_interface.h> #endif // GRPCPP_IMPL_CODEGEN_CHANNEL_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_callback.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/client_callback.h deleted file mode 100644 index 06fef2e929..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_callback.h +++ /dev/null @@ -1,1229 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H -#define GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H - -// IWYU pragma: private, include <grpcpp/support/client_callback.h> - -#include <atomic> -#include <functional> - -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_op_set.h> -#include <grpcpp/impl/codegen/callback_common.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/sync.h> - -namespace grpc { -class Channel; -class ClientContext; - -namespace internal { -class RpcMethod; - -/// Perform a callback-based unary call. May optionally specify the base -/// class of the Request and Response so that the internal calls and structures -/// below this may be based on those base classes and thus achieve code reuse -/// across different RPCs (e.g., for protobuf, MessageLite would be a base -/// class). -/// TODO(vjpai): Combine as much as possible with the blocking unary call code -template <class InputMessage, class OutputMessage, - class BaseInputMessage = InputMessage, - class BaseOutputMessage = OutputMessage> -void CallbackUnaryCall(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, - const InputMessage* request, OutputMessage* result, - std::function<void(grpc::Status)> on_completion) { - static_assert(std::is_base_of<BaseInputMessage, InputMessage>::value, - "Invalid input message specification"); - static_assert(std::is_base_of<BaseOutputMessage, OutputMessage>::value, - "Invalid output message specification"); - CallbackUnaryCallImpl<BaseInputMessage, BaseOutputMessage> x( - channel, method, context, request, result, on_completion); -} - -template <class InputMessage, class OutputMessage> -class CallbackUnaryCallImpl { - public: - CallbackUnaryCallImpl(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, - const InputMessage* request, OutputMessage* result, - std::function<void(grpc::Status)> on_completion) { - grpc::CompletionQueue* cq = channel->CallbackCQ(); - GPR_CODEGEN_ASSERT(cq != nullptr); - grpc::internal::Call call(channel->CreateCall(method, context, cq)); - - using FullCallOpSet = grpc::internal::CallOpSet< - grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpRecvMessage<OutputMessage>, - grpc::internal::CallOpClientSendClose, - grpc::internal::CallOpClientRecvStatus>; - - struct OpSetAndTag { - FullCallOpSet opset; - grpc::internal::CallbackWithStatusTag tag; - }; - const size_t alloc_sz = sizeof(OpSetAndTag); - auto* const alloced = static_cast<OpSetAndTag*>( - grpc::g_core_codegen_interface->grpc_call_arena_alloc(call.call(), - alloc_sz)); - auto* ops = new (&alloced->opset) FullCallOpSet; - auto* tag = new (&alloced->tag) - grpc::internal::CallbackWithStatusTag(call.call(), on_completion, ops); - - // TODO(vjpai): Unify code with sync API as much as possible - grpc::Status s = ops->SendMessagePtr(request); - if (!s.ok()) { - tag->force_run(s); - return; - } - ops->SendInitialMetadata(&context->send_initial_metadata_, - context->initial_metadata_flags()); - ops->RecvInitialMetadata(context); - ops->RecvMessage(result); - ops->AllowNoMessage(); - ops->ClientSendClose(); - ops->ClientRecvStatus(context, tag->status_ptr()); - ops->set_core_cq_tag(tag); - call.PerformOps(ops); - } -}; - -// Base class for public API classes. -class ClientReactor { - public: - virtual ~ClientReactor() = default; - - /// Called by the library when all operations associated with this RPC have - /// completed and all Holds have been removed. OnDone provides the RPC status - /// outcome for both successful and failed RPCs. If it is never called on an - /// RPC, it indicates an application-level problem (like failure to remove a - /// hold). - /// - /// \param[in] s The status outcome of this RPC - virtual void OnDone(const grpc::Status& /*s*/) = 0; - - /// InternalScheduleOnDone is not part of the API and is not meant to be - /// overridden. It is virtual to allow successful builds for certain bazel - /// build users that only want to depend on gRPC codegen headers and not the - /// full library (although this is not a generally-supported option). Although - /// the virtual call is slower than a direct call, this function is - /// heavyweight and the cost of the virtual call is not much in comparison. - /// This function may be removed or devirtualized in the future. - virtual void InternalScheduleOnDone(grpc::Status s); - - /// InternalTrailersOnly is not part of the API and is not meant to be - /// overridden. It is virtual to allow successful builds for certain bazel - /// build users that only want to depend on gRPC codegen headers and not the - /// full library (although this is not a generally-supported option). Although - /// the virtual call is slower than a direct call, this function is - /// heavyweight and the cost of the virtual call is not much in comparison. - /// This function may be removed or devirtualized in the future. - virtual bool InternalTrailersOnly(const grpc_call* call) const; -}; - -} // namespace internal - -// Forward declarations -template <class Request, class Response> -class ClientBidiReactor; -template <class Response> -class ClientReadReactor; -template <class Request> -class ClientWriteReactor; -class ClientUnaryReactor; - -// NOTE: The streaming objects are not actually implemented in the public API. -// These interfaces are provided for mocking only. Typical applications -// will interact exclusively with the reactors that they define. -template <class Request, class Response> -class ClientCallbackReaderWriter { - public: - virtual ~ClientCallbackReaderWriter() {} - virtual void StartCall() = 0; - virtual void Write(const Request* req, grpc::WriteOptions options) = 0; - virtual void WritesDone() = 0; - virtual void Read(Response* resp) = 0; - virtual void AddHold(int holds) = 0; - virtual void RemoveHold() = 0; - - protected: - void BindReactor(ClientBidiReactor<Request, Response>* reactor) { - reactor->BindStream(this); - } -}; - -template <class Response> -class ClientCallbackReader { - public: - virtual ~ClientCallbackReader() {} - virtual void StartCall() = 0; - virtual void Read(Response* resp) = 0; - virtual void AddHold(int holds) = 0; - virtual void RemoveHold() = 0; - - protected: - void BindReactor(ClientReadReactor<Response>* reactor) { - reactor->BindReader(this); - } -}; - -template <class Request> -class ClientCallbackWriter { - public: - virtual ~ClientCallbackWriter() {} - virtual void StartCall() = 0; - void Write(const Request* req) { Write(req, grpc::WriteOptions()); } - virtual void Write(const Request* req, grpc::WriteOptions options) = 0; - void WriteLast(const Request* req, grpc::WriteOptions options) { - Write(req, options.set_last_message()); - } - virtual void WritesDone() = 0; - - virtual void AddHold(int holds) = 0; - virtual void RemoveHold() = 0; - - protected: - void BindReactor(ClientWriteReactor<Request>* reactor) { - reactor->BindWriter(this); - } -}; - -class ClientCallbackUnary { - public: - virtual ~ClientCallbackUnary() {} - virtual void StartCall() = 0; - - protected: - void BindReactor(ClientUnaryReactor* reactor); -}; - -// The following classes are the reactor interfaces that are to be implemented -// by the user. They are passed in to the library as an argument to a call on a -// stub (either a codegen-ed call or a generic call). The streaming RPC is -// activated by calling StartCall, possibly after initiating StartRead, -// StartWrite, or AddHold operations on the streaming object. Note that none of -// the classes are pure; all reactions have a default empty reaction so that the -// user class only needs to override those reactions that it cares about. -// The reactor must be passed to the stub invocation before any of the below -// operations can be called and its reactions will be invoked by the library in -// response to the completion of various operations. Reactions must not include -// blocking operations (such as blocking I/O, starting synchronous RPCs, or -// waiting on condition variables). Reactions may be invoked concurrently, -// except that OnDone is called after all others (assuming proper API usage). -// The reactor may not be deleted until OnDone is called. - -/// \a ClientBidiReactor is the interface for a bidirectional streaming RPC. -template <class Request, class Response> -class ClientBidiReactor : public internal::ClientReactor { - public: - /// Activate the RPC and initiate any reads or writes that have been Start'ed - /// before this call. All streaming RPCs issued by the client MUST have - /// StartCall invoked on them (even if they are canceled) as this call is the - /// activation of their lifecycle. - void StartCall() { stream_->StartCall(); } - - /// Initiate a read operation (or post it for later initiation if StartCall - /// has not yet been invoked). - /// - /// \param[out] resp Where to eventually store the read message. Valid when - /// the library calls OnReadDone - void StartRead(Response* resp) { stream_->Read(resp); } - - /// Initiate a write operation (or post it for later initiation if StartCall - /// has not yet been invoked). - /// - /// \param[in] req The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - void StartWrite(const Request* req) { StartWrite(req, grpc::WriteOptions()); } - - /// Initiate/post a write operation with specified options. - /// - /// \param[in] req The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - /// \param[in] options The WriteOptions to use for writing this message - void StartWrite(const Request* req, grpc::WriteOptions options) { - stream_->Write(req, options); - } - - /// Initiate/post a write operation with specified options and an indication - /// that this is the last write (like StartWrite and StartWritesDone, merged). - /// Note that calling this means that no more calls to StartWrite, - /// StartWriteLast, or StartWritesDone are allowed. - /// - /// \param[in] req The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - /// \param[in] options The WriteOptions to use for writing this message - void StartWriteLast(const Request* req, grpc::WriteOptions options) { - StartWrite(req, options.set_last_message()); - } - - /// Indicate that the RPC will have no more write operations. This can only be - /// issued once for a given RPC. This is not required or allowed if - /// StartWriteLast is used since that already has the same implication. - /// Note that calling this means that no more calls to StartWrite, - /// StartWriteLast, or StartWritesDone are allowed. - void StartWritesDone() { stream_->WritesDone(); } - - /// Holds are needed if (and only if) this stream has operations that take - /// place on it after StartCall but from outside one of the reactions - /// (OnReadDone, etc). This is _not_ a common use of the streaming API. - /// - /// Holds must be added before calling StartCall. If a stream still has a hold - /// in place, its resources will not be destroyed even if the status has - /// already come in from the wire and there are currently no active callbacks - /// outstanding. Similarly, the stream will not call OnDone if there are still - /// holds on it. - /// - /// For example, if a StartRead or StartWrite operation is going to be - /// initiated from elsewhere in the application, the application should call - /// AddHold or AddMultipleHolds before StartCall. If there is going to be, - /// for example, a read-flow and a write-flow taking place outside the - /// reactions, then call AddMultipleHolds(2) before StartCall. When the - /// application knows that it won't issue any more read operations (such as - /// when a read comes back as not ok), it should issue a RemoveHold(). It - /// should also call RemoveHold() again after it does StartWriteLast or - /// StartWritesDone that indicates that there will be no more write ops. - /// The number of RemoveHold calls must match the total number of AddHold - /// calls plus the number of holds added by AddMultipleHolds. - /// The argument to AddMultipleHolds must be positive. - void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { - GPR_CODEGEN_DEBUG_ASSERT(holds > 0); - stream_->AddHold(holds); - } - void RemoveHold() { stream_->RemoveHold(); } - - /// Notifies the application that all operations associated with this RPC - /// have completed and all Holds have been removed. OnDone provides the RPC - /// status outcome for both successful and failed RPCs and will be called in - /// all cases. If it is not called, it indicates an application-level problem - /// (like failure to remove a hold). - /// - /// \param[in] s The status outcome of this RPC - void OnDone(const grpc::Status& /*s*/) override {} - - /// Notifies the application that a read of initial metadata from the - /// server is done. If the application chooses not to implement this method, - /// it can assume that the initial metadata has been read before the first - /// call of OnReadDone or OnDone. - /// - /// \param[in] ok Was the initial metadata read successfully? If false, no - /// new read/write operation will succeed, and any further - /// Start* operations should not be called. - virtual void OnReadInitialMetadataDone(bool /*ok*/) {} - - /// Notifies the application that a StartRead operation completed. - /// - /// \param[in] ok Was it successful? If false, no new read/write operation - /// will succeed, and any further Start* should not be called. - virtual void OnReadDone(bool /*ok*/) {} - - /// Notifies the application that a StartWrite or StartWriteLast operation - /// completed. - /// - /// \param[in] ok Was it successful? If false, no new read/write operation - /// will succeed, and any further Start* should not be called. - virtual void OnWriteDone(bool /*ok*/) {} - - /// Notifies the application that a StartWritesDone operation completed. Note - /// that this is only used on explicit StartWritesDone operations and not for - /// those that are implicitly invoked as part of a StartWriteLast. - /// - /// \param[in] ok Was it successful? If false, the application will later see - /// the failure reflected as a bad status in OnDone and no - /// further Start* should be called. - virtual void OnWritesDoneDone(bool /*ok*/) {} - - private: - friend class ClientCallbackReaderWriter<Request, Response>; - void BindStream(ClientCallbackReaderWriter<Request, Response>* stream) { - stream_ = stream; - } - ClientCallbackReaderWriter<Request, Response>* stream_; -}; - -/// \a ClientReadReactor is the interface for a server-streaming RPC. -/// All public methods behave as in ClientBidiReactor. -template <class Response> -class ClientReadReactor : public internal::ClientReactor { - public: - void StartCall() { reader_->StartCall(); } - void StartRead(Response* resp) { reader_->Read(resp); } - - void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { - GPR_CODEGEN_DEBUG_ASSERT(holds > 0); - reader_->AddHold(holds); - } - void RemoveHold() { reader_->RemoveHold(); } - - void OnDone(const grpc::Status& /*s*/) override {} - virtual void OnReadInitialMetadataDone(bool /*ok*/) {} - virtual void OnReadDone(bool /*ok*/) {} - - private: - friend class ClientCallbackReader<Response>; - void BindReader(ClientCallbackReader<Response>* reader) { reader_ = reader; } - ClientCallbackReader<Response>* reader_; -}; - -/// \a ClientWriteReactor is the interface for a client-streaming RPC. -/// All public methods behave as in ClientBidiReactor. -template <class Request> -class ClientWriteReactor : public internal::ClientReactor { - public: - void StartCall() { writer_->StartCall(); } - void StartWrite(const Request* req) { StartWrite(req, grpc::WriteOptions()); } - void StartWrite(const Request* req, grpc::WriteOptions options) { - writer_->Write(req, options); - } - void StartWriteLast(const Request* req, grpc::WriteOptions options) { - StartWrite(req, options.set_last_message()); - } - void StartWritesDone() { writer_->WritesDone(); } - - void AddHold() { AddMultipleHolds(1); } - void AddMultipleHolds(int holds) { - GPR_CODEGEN_DEBUG_ASSERT(holds > 0); - writer_->AddHold(holds); - } - void RemoveHold() { writer_->RemoveHold(); } - - void OnDone(const grpc::Status& /*s*/) override {} - virtual void OnReadInitialMetadataDone(bool /*ok*/) {} - virtual void OnWriteDone(bool /*ok*/) {} - virtual void OnWritesDoneDone(bool /*ok*/) {} - - private: - friend class ClientCallbackWriter<Request>; - void BindWriter(ClientCallbackWriter<Request>* writer) { writer_ = writer; } - - ClientCallbackWriter<Request>* writer_; -}; - -/// \a ClientUnaryReactor is a reactor-style interface for a unary RPC. -/// This is _not_ a common way of invoking a unary RPC. In practice, this -/// option should be used only if the unary RPC wants to receive initial -/// metadata without waiting for the response to complete. Most deployments of -/// RPC systems do not use this option, but it is needed for generality. -/// All public methods behave as in ClientBidiReactor. -/// StartCall is included for consistency with the other reactor flavors: even -/// though there are no StartRead or StartWrite operations to queue before the -/// call (that is part of the unary call itself) and there is no reactor object -/// being created as a result of this call, we keep a consistent 2-phase -/// initiation API among all the reactor flavors. -class ClientUnaryReactor : public internal::ClientReactor { - public: - void StartCall() { call_->StartCall(); } - void OnDone(const grpc::Status& /*s*/) override {} - virtual void OnReadInitialMetadataDone(bool /*ok*/) {} - - private: - friend class ClientCallbackUnary; - void BindCall(ClientCallbackUnary* call) { call_ = call; } - ClientCallbackUnary* call_; -}; - -// Define function out-of-line from class to avoid forward declaration issue -inline void ClientCallbackUnary::BindReactor(ClientUnaryReactor* reactor) { - reactor->BindCall(this); -} - -namespace internal { - -// Forward declare factory classes for friendship -template <class Request, class Response> -class ClientCallbackReaderWriterFactory; -template <class Response> -class ClientCallbackReaderFactory; -template <class Request> -class ClientCallbackWriterFactory; - -template <class Request, class Response> -class ClientCallbackReaderWriterImpl - : public ClientCallbackReaderWriter<Request, Response> { - public: - // always allocated against a call arena, no memory free required - static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackReaderWriterImpl)); - } - - // This operator should never be called as the memory should be freed as part - // of the arena destruction. It only exists to provide a matching operator - // delete to the operator new so that some compilers will not complain (see - // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this - // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } - - void StartCall() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - // This call initiates two batches, plus any backlog, each with a callback - // 1. Send initial metadata (unless corked) + recv initial metadata - // 2. Any read backlog - // 3. Any write backlog - // 4. Recv trailing metadata (unless corked) - if (!start_corked_) { - start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - } - - call_.PerformOps(&start_ops_); - - { - grpc::internal::MutexLock lock(&start_mu_); - - if (backlog_.read_ops) { - call_.PerformOps(&read_ops_); - } - if (backlog_.write_ops) { - call_.PerformOps(&write_ops_); - } - if (backlog_.writes_done_ops) { - call_.PerformOps(&writes_done_ops_); - } - call_.PerformOps(&finish_ops_); - // The last thing in this critical section is to set started_ so that it - // can be used lock-free as well. - started_.store(true, std::memory_order_release); - } - // MaybeFinish outside the lock to make sure that destruction of this object - // doesn't take place while holding the lock (which would cause the lock to - // be released after destruction) - this->MaybeFinish(/*from_reaction=*/false); - } - - void Read(Response* msg) override { - read_ops_.RecvMessage(msg); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.read_ops = true; - return; - } - } - call_.PerformOps(&read_ops_); - } - - void Write(const Request* msg, grpc::WriteOptions options) - Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - if (options.is_last_message()) { - options.set_buffer_hint(); - write_ops_.ClientSendClose(); - } - // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - if (GPR_UNLIKELY(corked_write_needed_)) { - write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - corked_write_needed_ = false; - } - - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.write_ops = true; - return; - } - } - call_.PerformOps(&write_ops_); - } - void WritesDone() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - writes_done_ops_.ClientSendClose(); - writes_done_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnWritesDoneDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &writes_done_ops_, /*can_inline=*/false); - writes_done_ops_.set_core_cq_tag(&writes_done_tag_); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - if (GPR_UNLIKELY(corked_write_needed_)) { - writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - corked_write_needed_ = false; - } - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.writes_done_ops = true; - return; - } - } - call_.PerformOps(&writes_done_ops_); - } - - void AddHold(int holds) override { - callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); - } - void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } - - private: - friend class ClientCallbackReaderWriterFactory<Request, Response>; - - ClientCallbackReaderWriterImpl(grpc::internal::Call call, - grpc::ClientContext* context, - ClientBidiReactor<Request, Response>* reactor) - : context_(context), - call_(call), - reactor_(reactor), - start_corked_(context_->initial_metadata_corked_), - corked_write_needed_(start_corked_) { - this->BindReactor(reactor); - - // Set up the unchanging parts of the start, read, and write tags and ops. - start_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadInitialMetadataDone( - ok && !reactor_->InternalTrailersOnly(call_.call())); - MaybeFinish(/*from_reaction=*/true); - }, - &start_ops_, /*can_inline=*/false); - start_ops_.RecvInitialMetadata(context_); - start_ops_.set_core_cq_tag(&start_tag_); - - write_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnWriteDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &write_ops_, /*can_inline=*/false); - write_ops_.set_core_cq_tag(&write_tag_); - - read_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &read_ops_, /*can_inline=*/false); - read_ops_.set_core_cq_tag(&read_tag_); - - // Also set up the Finish tag and op set. - finish_tag_.Set( - call_.call(), - [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, - &finish_ops_, - /*can_inline=*/false); - finish_ops_.ClientRecvStatus(context_, &finish_status_); - finish_ops_.set_core_cq_tag(&finish_tag_); - } - - // MaybeFinish can be called from reactions or from user-initiated operations - // like StartCall or RemoveHold. If this is the last operation or hold on this - // object, it will invoke the OnDone reaction. If MaybeFinish was called from - // a reaction, it can call OnDone directly. If not, it would need to schedule - // OnDone onto an executor thread to avoid the possibility of deadlocking with - // any locks in the user code that invoked it. - void MaybeFinish(bool from_reaction) { - if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( - 1, std::memory_order_acq_rel) == 1)) { - grpc::Status s = std::move(finish_status_); - auto* reactor = reactor_; - auto* call = call_.call(); - this->~ClientCallbackReaderWriterImpl(); - grpc::g_core_codegen_interface->grpc_call_unref(call); - if (GPR_LIKELY(from_reaction)) { - reactor->OnDone(s); - } else { - reactor->InternalScheduleOnDone(std::move(s)); - } - } - } - - grpc::ClientContext* const context_; - grpc::internal::Call call_; - ClientBidiReactor<Request, Response>* const reactor_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpRecvInitialMetadata> - start_ops_; - grpc::internal::CallbackWithSuccessTag start_tag_; - const bool start_corked_; - bool corked_write_needed_; // no lock needed since only accessed in - // Write/WritesDone which cannot be concurrent - - grpc::internal::CallOpSet<grpc::internal::CallOpClientRecvStatus> finish_ops_; - grpc::internal::CallbackWithSuccessTag finish_tag_; - grpc::Status finish_status_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose> - write_ops_; - grpc::internal::CallbackWithSuccessTag write_tag_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpClientSendClose> - writes_done_ops_; - grpc::internal::CallbackWithSuccessTag writes_done_tag_; - - grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<Response>> - read_ops_; - grpc::internal::CallbackWithSuccessTag read_tag_; - - struct StartCallBacklog { - bool write_ops = false; - bool writes_done_ops = false; - bool read_ops = false; - }; - StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); - - // Minimum of 3 callbacks to pre-register for start ops, StartCall, and finish - std::atomic<intptr_t> callbacks_outstanding_{3}; - std::atomic_bool started_{false}; - grpc::internal::Mutex start_mu_; -}; - -template <class Request, class Response> -class ClientCallbackReaderWriterFactory { - public: - static void Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, - ClientBidiReactor<Request, Response>* reactor) { - grpc::internal::Call call = - channel->CreateCall(method, context, channel->CallbackCQ()); - - grpc::g_core_codegen_interface->grpc_call_ref(call.call()); - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientCallbackReaderWriterImpl<Request, Response>))) - ClientCallbackReaderWriterImpl<Request, Response>(call, context, - reactor); - } -}; - -template <class Response> -class ClientCallbackReaderImpl : public ClientCallbackReader<Response> { - public: - // always allocated against a call arena, no memory free required - static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackReaderImpl)); - } - - // This operator should never be called as the memory should be freed as part - // of the arena destruction. It only exists to provide a matching operator - // delete to the operator new so that some compilers will not complain (see - // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this - // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } - - void StartCall() override { - // This call initiates two batches, plus any backlog, each with a callback - // 1. Send initial metadata (unless corked) + recv initial metadata - // 2. Any backlog - // 3. Recv trailing metadata - - start_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadInitialMetadataDone( - ok && !reactor_->InternalTrailersOnly(call_.call())); - MaybeFinish(/*from_reaction=*/true); - }, - &start_ops_, /*can_inline=*/false); - start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - start_ops_.RecvInitialMetadata(context_); - start_ops_.set_core_cq_tag(&start_tag_); - call_.PerformOps(&start_ops_); - - // Also set up the read tag so it doesn't have to be set up each time - read_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &read_ops_, /*can_inline=*/false); - read_ops_.set_core_cq_tag(&read_tag_); - - { - grpc::internal::MutexLock lock(&start_mu_); - if (backlog_.read_ops) { - call_.PerformOps(&read_ops_); - } - started_.store(true, std::memory_order_release); - } - - finish_tag_.Set( - call_.call(), - [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, - &finish_ops_, /*can_inline=*/false); - finish_ops_.ClientRecvStatus(context_, &finish_status_); - finish_ops_.set_core_cq_tag(&finish_tag_); - call_.PerformOps(&finish_ops_); - } - - void Read(Response* msg) override { - read_ops_.RecvMessage(msg); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.read_ops = true; - return; - } - } - call_.PerformOps(&read_ops_); - } - - void AddHold(int holds) override { - callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); - } - void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } - - private: - friend class ClientCallbackReaderFactory<Response>; - - template <class Request> - ClientCallbackReaderImpl(grpc::internal::Call call, - grpc::ClientContext* context, Request* request, - ClientReadReactor<Response>* reactor) - : context_(context), call_(call), reactor_(reactor) { - this->BindReactor(reactor); - // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok()); - start_ops_.ClientSendClose(); - } - - // MaybeFinish behaves as in ClientCallbackReaderWriterImpl. - void MaybeFinish(bool from_reaction) { - if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( - 1, std::memory_order_acq_rel) == 1)) { - grpc::Status s = std::move(finish_status_); - auto* reactor = reactor_; - auto* call = call_.call(); - this->~ClientCallbackReaderImpl(); - grpc::g_core_codegen_interface->grpc_call_unref(call); - if (GPR_LIKELY(from_reaction)) { - reactor->OnDone(s); - } else { - reactor->InternalScheduleOnDone(std::move(s)); - } - } - } - - grpc::ClientContext* const context_; - grpc::internal::Call call_; - ClientReadReactor<Response>* const reactor_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose, - grpc::internal::CallOpRecvInitialMetadata> - start_ops_; - grpc::internal::CallbackWithSuccessTag start_tag_; - - grpc::internal::CallOpSet<grpc::internal::CallOpClientRecvStatus> finish_ops_; - grpc::internal::CallbackWithSuccessTag finish_tag_; - grpc::Status finish_status_; - - grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<Response>> - read_ops_; - grpc::internal::CallbackWithSuccessTag read_tag_; - - struct StartCallBacklog { - bool read_ops = false; - }; - StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); - - // Minimum of 2 callbacks to pre-register for start and finish - std::atomic<intptr_t> callbacks_outstanding_{2}; - std::atomic_bool started_{false}; - grpc::internal::Mutex start_mu_; -}; - -template <class Response> -class ClientCallbackReaderFactory { - public: - template <class Request> - static void Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, const Request* request, - ClientReadReactor<Response>* reactor) { - grpc::internal::Call call = - channel->CreateCall(method, context, channel->CallbackCQ()); - - grpc::g_core_codegen_interface->grpc_call_ref(call.call()); - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientCallbackReaderImpl<Response>))) - ClientCallbackReaderImpl<Response>(call, context, request, reactor); - } -}; - -template <class Request> -class ClientCallbackWriterImpl : public ClientCallbackWriter<Request> { - public: - // always allocated against a call arena, no memory free required - static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackWriterImpl)); - } - - // This operator should never be called as the memory should be freed as part - // of the arena destruction. It only exists to provide a matching operator - // delete to the operator new so that some compilers will not complain (see - // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this - // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } - - void StartCall() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - // This call initiates two batches, plus any backlog, each with a callback - // 1. Send initial metadata (unless corked) + recv initial metadata - // 2. Any backlog - // 3. Recv trailing metadata - - if (!start_corked_) { - start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - } - call_.PerformOps(&start_ops_); - - { - grpc::internal::MutexLock lock(&start_mu_); - - if (backlog_.write_ops) { - call_.PerformOps(&write_ops_); - } - if (backlog_.writes_done_ops) { - call_.PerformOps(&writes_done_ops_); - } - call_.PerformOps(&finish_ops_); - // The last thing in this critical section is to set started_ so that it - // can be used lock-free as well. - started_.store(true, std::memory_order_release); - } - // MaybeFinish outside the lock to make sure that destruction of this object - // doesn't take place while holding the lock (which would cause the lock to - // be released after destruction) - this->MaybeFinish(/*from_reaction=*/false); - } - - void Write(const Request* msg, grpc::WriteOptions options) - Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - if (GPR_UNLIKELY(options.is_last_message())) { - options.set_buffer_hint(); - write_ops_.ClientSendClose(); - } - // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - - if (GPR_UNLIKELY(corked_write_needed_)) { - write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - corked_write_needed_ = false; - } - - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.write_ops = true; - return; - } - } - call_.PerformOps(&write_ops_); - } - - void WritesDone() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { - writes_done_ops_.ClientSendClose(); - writes_done_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnWritesDoneDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &writes_done_ops_, /*can_inline=*/false); - writes_done_ops_.set_core_cq_tag(&writes_done_tag_); - callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); - - if (GPR_UNLIKELY(corked_write_needed_)) { - writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - corked_write_needed_ = false; - } - - if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { - grpc::internal::MutexLock lock(&start_mu_); - if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { - backlog_.writes_done_ops = true; - return; - } - } - call_.PerformOps(&writes_done_ops_); - } - - void AddHold(int holds) override { - callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); - } - void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } - - private: - friend class ClientCallbackWriterFactory<Request>; - - template <class Response> - ClientCallbackWriterImpl(grpc::internal::Call call, - grpc::ClientContext* context, Response* response, - ClientWriteReactor<Request>* reactor) - : context_(context), - call_(call), - reactor_(reactor), - start_corked_(context_->initial_metadata_corked_), - corked_write_needed_(start_corked_) { - this->BindReactor(reactor); - - // Set up the unchanging parts of the start and write tags and ops. - start_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadInitialMetadataDone( - ok && !reactor_->InternalTrailersOnly(call_.call())); - MaybeFinish(/*from_reaction=*/true); - }, - &start_ops_, /*can_inline=*/false); - start_ops_.RecvInitialMetadata(context_); - start_ops_.set_core_cq_tag(&start_tag_); - - write_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnWriteDone(ok); - MaybeFinish(/*from_reaction=*/true); - }, - &write_ops_, /*can_inline=*/false); - write_ops_.set_core_cq_tag(&write_tag_); - - // Also set up the Finish tag and op set. - finish_ops_.RecvMessage(response); - finish_ops_.AllowNoMessage(); - finish_tag_.Set( - call_.call(), - [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, - &finish_ops_, - /*can_inline=*/false); - finish_ops_.ClientRecvStatus(context_, &finish_status_); - finish_ops_.set_core_cq_tag(&finish_tag_); - } - - // MaybeFinish behaves as in ClientCallbackReaderWriterImpl. - void MaybeFinish(bool from_reaction) { - if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( - 1, std::memory_order_acq_rel) == 1)) { - grpc::Status s = std::move(finish_status_); - auto* reactor = reactor_; - auto* call = call_.call(); - this->~ClientCallbackWriterImpl(); - grpc::g_core_codegen_interface->grpc_call_unref(call); - if (GPR_LIKELY(from_reaction)) { - reactor->OnDone(s); - } else { - reactor->InternalScheduleOnDone(std::move(s)); - } - } - } - - grpc::ClientContext* const context_; - grpc::internal::Call call_; - ClientWriteReactor<Request>* const reactor_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpRecvInitialMetadata> - start_ops_; - grpc::internal::CallbackWithSuccessTag start_tag_; - const bool start_corked_; - bool corked_write_needed_; // no lock needed since only accessed in - // Write/WritesDone which cannot be concurrent - - grpc::internal::CallOpSet<grpc::internal::CallOpGenericRecvMessage, - grpc::internal::CallOpClientRecvStatus> - finish_ops_; - grpc::internal::CallbackWithSuccessTag finish_tag_; - grpc::Status finish_status_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose> - write_ops_; - grpc::internal::CallbackWithSuccessTag write_tag_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpClientSendClose> - writes_done_ops_; - grpc::internal::CallbackWithSuccessTag writes_done_tag_; - - struct StartCallBacklog { - bool write_ops = false; - bool writes_done_ops = false; - }; - StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); - - // Minimum of 3 callbacks to pre-register for start ops, StartCall, and finish - std::atomic<intptr_t> callbacks_outstanding_{3}; - std::atomic_bool started_{false}; - grpc::internal::Mutex start_mu_; -}; - -template <class Request> -class ClientCallbackWriterFactory { - public: - template <class Response> - static void Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, Response* response, - ClientWriteReactor<Request>* reactor) { - grpc::internal::Call call = - channel->CreateCall(method, context, channel->CallbackCQ()); - - grpc::g_core_codegen_interface->grpc_call_ref(call.call()); - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientCallbackWriterImpl<Request>))) - ClientCallbackWriterImpl<Request>(call, context, response, reactor); - } -}; - -class ClientCallbackUnaryImpl final : public ClientCallbackUnary { - public: - // always allocated against a call arena, no memory free required - static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientCallbackUnaryImpl)); - } - - // This operator should never be called as the memory should be freed as part - // of the arena destruction. It only exists to provide a matching operator - // delete to the operator new so that some compilers will not complain (see - // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this - // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } - - void StartCall() override { - // This call initiates two batches, each with a callback - // 1. Send initial metadata + write + writes done + recv initial metadata - // 2. Read message, recv trailing metadata - - start_tag_.Set( - call_.call(), - [this](bool ok) { - reactor_->OnReadInitialMetadataDone( - ok && !reactor_->InternalTrailersOnly(call_.call())); - MaybeFinish(); - }, - &start_ops_, /*can_inline=*/false); - start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - start_ops_.RecvInitialMetadata(context_); - start_ops_.set_core_cq_tag(&start_tag_); - call_.PerformOps(&start_ops_); - - finish_tag_.Set( - call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, &finish_ops_, - /*can_inline=*/false); - finish_ops_.ClientRecvStatus(context_, &finish_status_); - finish_ops_.set_core_cq_tag(&finish_tag_); - call_.PerformOps(&finish_ops_); - } - - private: - friend class ClientCallbackUnaryFactory; - - template <class Request, class Response> - ClientCallbackUnaryImpl(grpc::internal::Call call, - grpc::ClientContext* context, Request* request, - Response* response, ClientUnaryReactor* reactor) - : context_(context), call_(call), reactor_(reactor) { - this->BindReactor(reactor); - // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok()); - start_ops_.ClientSendClose(); - finish_ops_.RecvMessage(response); - finish_ops_.AllowNoMessage(); - } - - // In the unary case, MaybeFinish is only ever invoked from a - // library-initiated reaction, so it will just directly call OnDone if this is - // the last reaction for this RPC. - void MaybeFinish() { - if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( - 1, std::memory_order_acq_rel) == 1)) { - grpc::Status s = std::move(finish_status_); - auto* reactor = reactor_; - auto* call = call_.call(); - this->~ClientCallbackUnaryImpl(); - grpc::g_core_codegen_interface->grpc_call_unref(call); - reactor->OnDone(s); - } - } - - grpc::ClientContext* const context_; - grpc::internal::Call call_; - ClientUnaryReactor* const reactor_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose, - grpc::internal::CallOpRecvInitialMetadata> - start_ops_; - grpc::internal::CallbackWithSuccessTag start_tag_; - - grpc::internal::CallOpSet<grpc::internal::CallOpGenericRecvMessage, - grpc::internal::CallOpClientRecvStatus> - finish_ops_; - grpc::internal::CallbackWithSuccessTag finish_tag_; - grpc::Status finish_status_; - - // This call will have 2 callbacks: start and finish - std::atomic<intptr_t> callbacks_outstanding_{2}; -}; - -class ClientCallbackUnaryFactory { - public: - template <class Request, class Response, class BaseRequest = Request, - class BaseResponse = Response> - static void Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, const Request* request, - Response* response, ClientUnaryReactor* reactor) { - grpc::internal::Call call = - channel->CreateCall(method, context, channel->CallbackCQ()); - - grpc::g_core_codegen_interface->grpc_call_ref(call.call()); - - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientCallbackUnaryImpl))) - ClientCallbackUnaryImpl(call, context, - static_cast<const BaseRequest*>(request), - static_cast<BaseResponse*>(response), reactor); - } -}; - -} // namespace internal -} // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_context.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/client_context.h deleted file mode 100644 index d24dd38b3c..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_context.h +++ /dev/null @@ -1,519 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/// A ClientContext allows the person implementing a service client to: -/// -/// - Add custom metadata key-value pairs that will propagated to the server -/// side. -/// - Control call settings such as compression and authentication. -/// - Initial and trailing metadata coming from the server. -/// - Get performance metrics (ie, census). -/// -/// Context settings are only relevant to the call they are invoked with, that -/// is to say, they aren't sticky. Some of these settings, such as the -/// compression options, can be made persistent at channel construction time -/// (see \a grpc::CreateCustomChannel). -/// -/// \warning ClientContext instances should \em not be reused across rpcs. - -#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H -#define GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H - -// IWYU pragma: private, include <grpcpp/client_context.h> - -#include <map> -#include <memory> -#include <util/generic/string.h> -#include <util/string/cast.h> - -#include <grpc/impl/codegen/compression_types.h> -#include <grpc/impl/codegen/propagation_bits.h> -#include <grpcpp/impl/codegen/client_interceptor.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/create_auth_context.h> -#include <grpcpp/impl/codegen/metadata_map.h> -#include <grpcpp/impl/codegen/rpc_method.h> -#include <grpcpp/impl/codegen/security/auth_context.h> -#include <grpcpp/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/string_ref.h> -#include <grpcpp/impl/codegen/sync.h> -#include <grpcpp/impl/codegen/time.h> - -struct census_context; -struct grpc_call; - -namespace grpc { -class ServerContext; -class ServerContextBase; -class CallbackServerContext; - -namespace internal { -template <class InputMessage, class OutputMessage> -class CallbackUnaryCallImpl; -template <class Request, class Response> -class ClientCallbackReaderWriterImpl; -template <class Response> -class ClientCallbackReaderImpl; -template <class Request> -class ClientCallbackWriterImpl; -class ClientCallbackUnaryImpl; -class ClientContextAccessor; -class ClientAsyncResponseReaderHelper; -} // namespace internal - -template <class R> -class ClientReader; -template <class W> -class ClientWriter; -template <class W, class R> -class ClientReaderWriter; -template <class R> -class ClientAsyncReader; -template <class W> -class ClientAsyncWriter; -template <class W, class R> -class ClientAsyncReaderWriter; -template <class R> -class ClientAsyncResponseReader; - -namespace testing { -class InteropClientContextInspector; -class ClientContextTestPeer; -} // namespace testing - -namespace internal { -class RpcMethod; -template <class InputMessage, class OutputMessage> -class BlockingUnaryCallImpl; -class CallOpClientRecvStatus; -class CallOpRecvInitialMetadata; -class ServerContextImpl; -template <class InputMessage, class OutputMessage> -class CallbackUnaryCallImpl; -template <class Request, class Response> -class ClientCallbackReaderWriterImpl; -template <class Response> -class ClientCallbackReaderImpl; -template <class Request> -class ClientCallbackWriterImpl; -class ClientCallbackUnaryImpl; -class ClientContextAccessor; -} // namespace internal - -class CallCredentials; -class Channel; -class ChannelInterface; -class CompletionQueue; - -/// Options for \a ClientContext::FromServerContext specifying which traits from -/// the \a ServerContext to propagate (copy) from it into a new \a -/// ClientContext. -/// -/// \see ClientContext::FromServerContext -class PropagationOptions { - public: - PropagationOptions() : propagate_(GRPC_PROPAGATE_DEFAULTS) {} - - PropagationOptions& enable_deadline_propagation() { - propagate_ |= GRPC_PROPAGATE_DEADLINE; - return *this; - } - - PropagationOptions& disable_deadline_propagation() { - propagate_ &= ~GRPC_PROPAGATE_DEADLINE; - return *this; - } - - PropagationOptions& enable_census_stats_propagation() { - propagate_ |= GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; - return *this; - } - - PropagationOptions& disable_census_stats_propagation() { - propagate_ &= ~GRPC_PROPAGATE_CENSUS_STATS_CONTEXT; - return *this; - } - - PropagationOptions& enable_census_tracing_propagation() { - propagate_ |= GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; - return *this; - } - - PropagationOptions& disable_census_tracing_propagation() { - propagate_ &= ~GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT; - return *this; - } - - PropagationOptions& enable_cancellation_propagation() { - propagate_ |= GRPC_PROPAGATE_CANCELLATION; - return *this; - } - - PropagationOptions& disable_cancellation_propagation() { - propagate_ &= ~GRPC_PROPAGATE_CANCELLATION; - return *this; - } - - uint32_t c_bitmask() const { return propagate_; } - - private: - uint32_t propagate_; -}; - -/// A ClientContext allows the person implementing a service client to: -/// -/// - Add custom metadata key-value pairs that will propagated to the server -/// side. -/// - Control call settings such as compression and authentication. -/// - Initial and trailing metadata coming from the server. -/// - Get performance metrics (ie, census). -/// -/// Context settings are only relevant to the call they are invoked with, that -/// is to say, they aren't sticky. Some of these settings, such as the -/// compression options, can be made persistent at channel construction time -/// (see \a grpc::CreateCustomChannel). -/// -/// \warning ClientContext instances should \em not be reused across rpcs. -/// \warning The ClientContext instance used for creating an rpc must remain -/// alive and valid for the lifetime of the rpc. -class ClientContext { - public: - ClientContext(); - ~ClientContext(); - - /// Create a new \a ClientContext as a child of an incoming server call, - /// according to \a options (\see PropagationOptions). - /// - /// \param server_context The source server context to use as the basis for - /// constructing the client context. - /// \param options The options controlling what to copy from the \a - /// server_context. - /// - /// \return A newly constructed \a ClientContext instance based on \a - /// server_context, with traits propagated (copied) according to \a options. - static std::unique_ptr<ClientContext> FromServerContext( - const grpc::ServerContextBase& server_context, - PropagationOptions options = PropagationOptions()); - static std::unique_ptr<ClientContext> FromCallbackServerContext( - const grpc::CallbackServerContext& server_context, - PropagationOptions options = PropagationOptions()); - - /// Add the (\a meta_key, \a meta_value) pair to the metadata associated with - /// a client call. These are made available at the server side by the \a - /// grpc::ServerContext::client_metadata() method. - /// - /// \warning This method should only be called before invoking the rpc. - /// - /// \param meta_key The metadata key. If \a meta_value is binary data, it must - /// end in "-bin". - /// \param meta_value The metadata value. If its value is binary, the key name - /// must end in "-bin". - /// - /// Metadata must conform to the following format: - /** - \verbatim - Custom-Metadata -> Binary-Header / ASCII-Header - Binary-Header -> {Header-Name "-bin" } {binary value} - ASCII-Header -> Header-Name ASCII-Value - Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . - ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII - Custom-Metadata -> Binary-Header / ASCII-Header - \endverbatim - **/ - void AddMetadata(const TString& meta_key, const TString& meta_value); - - /// Return a collection of initial metadata key-value pairs. Note that keys - /// may happen more than once (ie, a \a std::multimap is returned). - /// - /// \warning This method should only be called after initial metadata has been - /// received. For streaming calls, see \a - /// ClientReaderInterface::WaitForInitialMetadata(). - /// - /// \return A multimap of initial metadata key-value pairs from the server. - const std::multimap<grpc::string_ref, grpc::string_ref>& - GetServerInitialMetadata() const { - GPR_CODEGEN_ASSERT(initial_metadata_received_); - return *recv_initial_metadata_.map(); - } - - /// Return a collection of trailing metadata key-value pairs. Note that keys - /// may happen more than once (ie, a \a std::multimap is returned). - /// - /// \warning This method is only callable once the stream has finished. - /// - /// \return A multimap of metadata trailing key-value pairs from the server. - const std::multimap<grpc::string_ref, grpc::string_ref>& - GetServerTrailingMetadata() const { - // TODO(yangg) check finished - return *trailing_metadata_.map(); - } - - /// Set the deadline for the client call. - /// - /// \warning This method should only be called before invoking the rpc. - /// - /// \param deadline the deadline for the client call. Units are determined by - /// the type used. The deadline is an absolute (not relative) time. - template <typename T> - void set_deadline(const T& deadline) { - grpc::TimePoint<T> deadline_tp(deadline); - deadline_ = deadline_tp.raw_time(); - } - - /// Trigger wait-for-ready or not on this request. - /// See https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md. - /// If set, if an RPC is made when a channel's connectivity state is - /// TRANSIENT_FAILURE or CONNECTING, the call will not "fail fast", - /// and the channel will wait until the channel is READY before making the - /// call. - void set_wait_for_ready(bool wait_for_ready) { - wait_for_ready_ = wait_for_ready; - wait_for_ready_explicitly_set_ = true; - } - - /// DEPRECATED: Use set_wait_for_ready() instead. - void set_fail_fast(bool fail_fast) { set_wait_for_ready(!fail_fast); } - - /// Return the deadline for the client call. - std::chrono::system_clock::time_point deadline() const { - return grpc::Timespec2Timepoint(deadline_); - } - - /// Return a \a gpr_timespec representation of the client call's deadline. - gpr_timespec raw_deadline() const { return deadline_; } - - /// Set the per call authority header (see - /// https://tools.ietf.org/html/rfc7540#section-8.1.2.3). - void set_authority(const TString& authority) { authority_ = authority; } - - /// Return the authentication context for the associated client call. - /// It is only valid to call this during the lifetime of the client call. - /// - /// \see grpc::AuthContext. - std::shared_ptr<const grpc::AuthContext> auth_context() const { - if (auth_context_ == nullptr) { - auth_context_ = grpc::CreateAuthContext(call_); - } - return auth_context_; - } - - /// Set credentials for the client call. - /// - /// A credentials object encapsulates all the state needed by a client to - /// authenticate with a server and make various assertions, e.g., about the - /// client’s identity, role, or whether it is authorized to make a particular - /// call. - /// - /// It is legal to call this only before initial metadata is sent. - /// - /// \see https://grpc.io/docs/guides/auth.html - void set_credentials(const std::shared_ptr<grpc::CallCredentials>& creds); - - /// EXPERIMENTAL debugging API - /// - /// Returns the credentials for the client call. This should be used only in - /// tests and for diagnostic purposes, and should not be used by application - /// logic. - std::shared_ptr<grpc::CallCredentials> credentials() { return creds_; } - - /// Return the compression algorithm the client call will request be used. - /// Note that the gRPC runtime may decide to ignore this request, for example, - /// due to resource constraints. - grpc_compression_algorithm compression_algorithm() const { - return compression_algorithm_; - } - - /// Set \a algorithm to be the compression algorithm used for the client call. - /// - /// \param algorithm The compression algorithm used for the client call. - void set_compression_algorithm(grpc_compression_algorithm algorithm); - - /// Flag whether the initial metadata should be \a corked - /// - /// If \a corked is true, then the initial metadata will be coalesced with the - /// write of first message in the stream. As a result, any tag set for the - /// initial metadata operation (starting a client-streaming or bidi-streaming - /// RPC) will not actually be sent to the completion queue or delivered - /// via Next. - /// - /// \param corked The flag indicating whether the initial metadata is to be - /// corked or not. - void set_initial_metadata_corked(bool corked) { - initial_metadata_corked_ = corked; - } - - /// Return the peer uri in a string. - /// It is only valid to call this during the lifetime of the client call. - /// - /// \warning This value is never authenticated or subject to any security - /// related code. It must not be used for any authentication related - /// functionality. Instead, use auth_context. - /// - /// \return The call's peer URI. - TString peer() const; - - /// Sets the census context. - /// It is only valid to call this before the client call is created. A common - /// place of setting census context is from within the DefaultConstructor - /// method of GlobalCallbacks. - void set_census_context(struct census_context* ccp) { census_context_ = ccp; } - - /// Returns the census context that has been set, or nullptr if not set. - struct census_context* census_context() const { - return census_context_; - } - - /// Send a best-effort out-of-band cancel on the call associated with - /// this client context. The call could be in any stage; e.g., if it is - /// already finished, it may still return success. - /// - /// There is no guarantee the call will be cancelled. - /// - /// Note that TryCancel() does not change any of the tags that are pending - /// on the completion queue. All pending tags will still be delivered - /// (though their ok result may reflect the effect of cancellation). - void TryCancel(); - - /// Global Callbacks - /// - /// Can be set exactly once per application to install hooks whenever - /// a client context is constructed and destructed. - class GlobalCallbacks { - public: - virtual ~GlobalCallbacks() {} - virtual void DefaultConstructor(ClientContext* context) = 0; - virtual void Destructor(ClientContext* context) = 0; - }; - static void SetGlobalCallbacks(GlobalCallbacks* callbacks); - - /// Should be used for framework-level extensions only. - /// Applications never need to call this method. - grpc_call* c_call() { return call_; } - - /// EXPERIMENTAL debugging API - /// - /// if status is not ok() for an RPC, this will return a detailed string - /// of the gRPC Core error that led to the failure. It should not be relied - /// upon for anything other than gaining more debug data in failure cases. - TString debug_error_string() const { return debug_error_string_; } - - private: - // Disallow copy and assign. - ClientContext(const ClientContext&); - ClientContext& operator=(const ClientContext&); - - friend class grpc::testing::InteropClientContextInspector; - friend class grpc::testing::ClientContextTestPeer; - friend class grpc::internal::CallOpClientRecvStatus; - friend class grpc::internal::CallOpRecvInitialMetadata; - friend class grpc::Channel; - template <class R> - friend class grpc::ClientReader; - template <class W> - friend class grpc::ClientWriter; - template <class W, class R> - friend class grpc::ClientReaderWriter; - template <class R> - friend class grpc::ClientAsyncReader; - template <class W> - friend class grpc::ClientAsyncWriter; - template <class W, class R> - friend class grpc::ClientAsyncReaderWriter; - template <class R> - friend class grpc::ClientAsyncResponseReader; - friend class grpc::internal::ClientAsyncResponseReaderHelper; - template <class InputMessage, class OutputMessage> - friend class grpc::internal::BlockingUnaryCallImpl; - template <class InputMessage, class OutputMessage> - friend class grpc::internal::CallbackUnaryCallImpl; - template <class Request, class Response> - friend class grpc::internal::ClientCallbackReaderWriterImpl; - template <class Response> - friend class grpc::internal::ClientCallbackReaderImpl; - template <class Request> - friend class grpc::internal::ClientCallbackWriterImpl; - friend class grpc::internal::ClientCallbackUnaryImpl; - friend class grpc::internal::ClientContextAccessor; - - // Used by friend class CallOpClientRecvStatus - void set_debug_error_string(const TString& debug_error_string) { - debug_error_string_ = debug_error_string; - } - - grpc_call* call() const { return call_; } - void set_call(grpc_call* call, const std::shared_ptr<grpc::Channel>& channel); - - grpc::experimental::ClientRpcInfo* set_client_rpc_info( - const char* method, const char* suffix_for_stats, - grpc::internal::RpcMethod::RpcType type, grpc::ChannelInterface* channel, - const std::vector<std::unique_ptr< - grpc::experimental::ClientInterceptorFactoryInterface>>& creators, - size_t interceptor_pos) { - rpc_info_ = grpc::experimental::ClientRpcInfo(this, type, method, - suffix_for_stats, channel); - rpc_info_.RegisterInterceptors(creators, interceptor_pos); - return &rpc_info_; - } - - uint32_t initial_metadata_flags() const { - return (wait_for_ready_ ? GRPC_INITIAL_METADATA_WAIT_FOR_READY : 0) | - (wait_for_ready_explicitly_set_ - ? GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET - : 0); - } - - TString authority() { return authority_; } - - void SendCancelToInterceptors(); - - static std::unique_ptr<ClientContext> FromInternalServerContext( - const grpc::ServerContextBase& server_context, - PropagationOptions options); - - bool initial_metadata_received_; - bool wait_for_ready_; - bool wait_for_ready_explicitly_set_; - std::shared_ptr<grpc::Channel> channel_; - grpc::internal::Mutex mu_; - grpc_call* call_; - bool call_canceled_; - gpr_timespec deadline_; - grpc::string authority_; - std::shared_ptr<grpc::CallCredentials> creds_; - mutable std::shared_ptr<const grpc::AuthContext> auth_context_; - struct census_context* census_context_; - std::multimap<TString, TString> send_initial_metadata_; - mutable grpc::internal::MetadataMap recv_initial_metadata_; - mutable grpc::internal::MetadataMap trailing_metadata_; - - grpc_call* propagate_from_call_; - PropagationOptions propagation_options_; - - grpc_compression_algorithm compression_algorithm_; - bool initial_metadata_corked_; - - TString debug_error_string_; - - grpc::experimental::ClientRpcInfo rpc_info_; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_CLIENT_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_interceptor.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/client_interceptor.h deleted file mode 100644 index 1c6b8ce51f..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/client_interceptor.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H -#define GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H - -// IWYU pragma: private - -/// TODO(chengyuc): Remove this file after solving compatibility. -#include <grpcpp/support/client_interceptor.h> - -#endif // GRPCPP_IMPL_CODEGEN_CLIENT_INTERCEPTOR_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/completion_queue.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/completion_queue.h deleted file mode 100644 index 33786f6e65..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/completion_queue.h +++ /dev/null @@ -1,466 +0,0 @@ -/* - * - * Copyright 2015-2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -/// A completion queue implements a concurrent producer-consumer queue, with -/// two main API-exposed methods: \a Next and \a AsyncNext. These -/// methods are the essential component of the gRPC C++ asynchronous API. -/// There is also a \a Shutdown method to indicate that a given completion queue -/// will no longer have regular events. This must be called before the -/// completion queue is destroyed. -/// All completion queue APIs are thread-safe and may be used concurrently with -/// any other completion queue API invocation; it is acceptable to have -/// multiple threads calling \a Next or \a AsyncNext on the same or different -/// completion queues, or to call these methods concurrently with a \a Shutdown -/// elsewhere. -/// \remark{All other API calls on completion queue should be completed before -/// a completion queue destructor is called.} -#ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H -#define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H - -// IWYU pragma: private, include <grpcpp/completion_queue.h> - -#include <list> - -#include <grpc/impl/codegen/atm.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/grpc_library.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/sync.h> -#include <grpcpp/impl/codegen/time.h> - -struct grpc_completion_queue; - -namespace grpc { -template <class R> -class ClientReader; -template <class W> -class ClientWriter; -template <class W, class R> -class ClientReaderWriter; -template <class R> -class ServerReader; -template <class W> -class ServerWriter; -namespace internal { -template <class W, class R> -class ServerReaderWriterBody; - -template <class ResponseType> -void UnaryRunHandlerHelper( - const grpc::internal::MethodHandler::HandlerParameter&, ResponseType*, - grpc::Status&); -template <class ServiceType, class RequestType, class ResponseType, - class BaseRequestType, class BaseResponseType> -class RpcMethodHandler; -template <class ServiceType, class RequestType, class ResponseType> -class ClientStreamingHandler; -template <class ServiceType, class RequestType, class ResponseType> -class ServerStreamingHandler; -template <class Streamer, bool WriteNeeded> -class TemplatedBidiStreamingHandler; -template <grpc::StatusCode code> -class ErrorMethodHandler; -} // namespace internal - -class Channel; -class ChannelInterface; -class Server; -class ServerBuilder; -class ServerContextBase; -class ServerInterface; - -namespace internal { -class CompletionQueueTag; -class RpcMethod; -template <class InputMessage, class OutputMessage> -class BlockingUnaryCallImpl; -template <class Op1, class Op2, class Op3, class Op4, class Op5, class Op6> -class CallOpSet; -} // namespace internal - -extern CoreCodegenInterface* g_core_codegen_interface; - -/// A thin wrapper around \ref grpc_completion_queue (see \ref -/// src/core/lib/surface/completion_queue.h). -/// See \ref doc/cpp/perf_notes.md for notes on best practices for high -/// performance servers. -class CompletionQueue : private grpc::GrpcLibraryCodegen { - public: - /// Default constructor. Implicitly creates a \a grpc_completion_queue - /// instance. - CompletionQueue() - : CompletionQueue(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, GRPC_CQ_NEXT, GRPC_CQ_DEFAULT_POLLING, - nullptr}) {} - - /// Wrap \a take, taking ownership of the instance. - /// - /// \param take The completion queue instance to wrap. Ownership is taken. - explicit CompletionQueue(grpc_completion_queue* take); - - /// Destructor. Destroys the owned wrapped completion queue / instance. - ~CompletionQueue() override { - grpc::g_core_codegen_interface->grpc_completion_queue_destroy(cq_); - } - - /// Tri-state return for AsyncNext: SHUTDOWN, GOT_EVENT, TIMEOUT. - enum NextStatus { - SHUTDOWN, ///< The completion queue has been shutdown and fully-drained - GOT_EVENT, ///< Got a new event; \a tag will be filled in with its - ///< associated value; \a ok indicating its success. - TIMEOUT ///< deadline was reached. - }; - - /// Read from the queue, blocking until an event is available or the queue is - /// shutting down. - /// - /// \param[out] tag Updated to point to the read event's tag. - /// \param[out] ok true if read a successful event, false otherwise. - /// - /// Note that each tag sent to the completion queue (through RPC operations - /// or alarms) will be delivered out of the completion queue by a call to - /// Next (or a related method), regardless of whether the operation succeeded - /// or not. Success here means that this operation completed in the normal - /// valid manner. - /// - /// Server-side RPC request: \a ok indicates that the RPC has indeed - /// been started. If it is false, the server has been Shutdown - /// before this particular call got matched to an incoming RPC. - /// - /// Client-side StartCall/RPC invocation: \a ok indicates that the RPC is - /// going to go to the wire. If it is false, it not going to the wire. This - /// would happen if the channel is either permanently broken or - /// transiently broken but with the fail-fast option. (Note that async unary - /// RPCs don't post a CQ tag at this point, nor do client-streaming - /// or bidi-streaming RPCs that have the initial metadata corked option set.) - /// - /// Client-side Write, Client-side WritesDone, Server-side Write, - /// Server-side Finish, Server-side SendInitialMetadata (which is - /// typically included in Write or Finish when not done explicitly): - /// \a ok means that the data/metadata/status/etc is going to go to the - /// wire. If it is false, it not going to the wire because the call - /// is already dead (i.e., canceled, deadline expired, other side - /// dropped the channel, etc). - /// - /// Client-side Read, Server-side Read, Client-side - /// RecvInitialMetadata (which is typically included in Read if not - /// done explicitly): \a ok indicates whether there is a valid message - /// that got read. If not, you know that there are certainly no more - /// messages that can ever be read from this stream. For the client-side - /// operations, this only happens because the call is dead. For the - /// server-sider operation, though, this could happen because the client - /// has done a WritesDone already. - /// - /// Client-side Finish: \a ok should always be true - /// - /// Server-side AsyncNotifyWhenDone: \a ok should always be true - /// - /// Alarm: \a ok is true if it expired, false if it was canceled - /// - /// \return true if got an event, false if the queue is fully drained and - /// shut down. - bool Next(void** tag, bool* ok) { - // Check return type == GOT_EVENT... cases: - // SHUTDOWN - queue has been shutdown, return false. - // TIMEOUT - we passed infinity time => queue has been shutdown, return - // false. - // GOT_EVENT - we actually got an event, return true. - return (AsyncNextInternal(tag, ok, - grpc::g_core_codegen_interface->gpr_inf_future( - GPR_CLOCK_REALTIME)) == GOT_EVENT); - } - - /// Read from the queue, blocking up to \a deadline (or the queue's shutdown). - /// Both \a tag and \a ok are updated upon success (if an event is available - /// within the \a deadline). A \a tag points to an arbitrary location usually - /// employed to uniquely identify an event. - /// - /// \param[out] tag Upon success, updated to point to the event's tag. - /// \param[out] ok Upon success, true if a successful event, false otherwise - /// See documentation for CompletionQueue::Next for explanation of ok - /// \param[in] deadline How long to block in wait for an event. - /// - /// \return The type of event read. - template <typename T> - NextStatus AsyncNext(void** tag, bool* ok, const T& deadline) { - grpc::TimePoint<T> deadline_tp(deadline); - return AsyncNextInternal(tag, ok, deadline_tp.raw_time()); - } - - /// EXPERIMENTAL - /// First executes \a F, then reads from the queue, blocking up to - /// \a deadline (or the queue's shutdown). - /// Both \a tag and \a ok are updated upon success (if an event is available - /// within the \a deadline). A \a tag points to an arbitrary location usually - /// employed to uniquely identify an event. - /// - /// \param[in] f Function to execute before calling AsyncNext on this queue. - /// \param[out] tag Upon success, updated to point to the event's tag. - /// \param[out] ok Upon success, true if read a regular event, false - /// otherwise. - /// \param[in] deadline How long to block in wait for an event. - /// - /// \return The type of event read. - template <typename T, typename F> - NextStatus DoThenAsyncNext(F&& f, void** tag, bool* ok, const T& deadline) { - CompletionQueueTLSCache cache = CompletionQueueTLSCache(this); - f(); - if (cache.Flush(tag, ok)) { - return GOT_EVENT; - } else { - return AsyncNext(tag, ok, deadline); - } - } - - /// Request the shutdown of the queue. - /// - /// \warning This method must be called at some point if this completion queue - /// is accessed with Next or AsyncNext. \a Next will not return false - /// until this method has been called and all pending tags have been drained. - /// (Likewise for \a AsyncNext returning \a NextStatus::SHUTDOWN .) - /// Only once either one of these methods does that (that is, once the queue - /// has been \em drained) can an instance of this class be destroyed. - /// Also note that applications must ensure that no work is enqueued on this - /// completion queue after this method is called. - void Shutdown(); - - /// Returns a \em raw pointer to the underlying \a grpc_completion_queue - /// instance. - /// - /// \warning Remember that the returned instance is owned. No transfer of - /// owership is performed. - grpc_completion_queue* cq() { return cq_; } - - protected: - /// Private constructor of CompletionQueue only visible to friend classes - explicit CompletionQueue(const grpc_completion_queue_attributes& attributes) { - cq_ = grpc::g_core_codegen_interface->grpc_completion_queue_create( - grpc::g_core_codegen_interface->grpc_completion_queue_factory_lookup( - &attributes), - &attributes, nullptr); - InitialAvalanching(); // reserve this for the future shutdown - } - - private: - // Friends for access to server registration lists that enable checking and - // logging on shutdown - friend class grpc::ServerBuilder; - friend class grpc::Server; - - // Friend synchronous wrappers so that they can access Pluck(), which is - // a semi-private API geared towards the synchronous implementation. - template <class R> - friend class grpc::ClientReader; - template <class W> - friend class grpc::ClientWriter; - template <class W, class R> - friend class grpc::ClientReaderWriter; - template <class R> - friend class grpc::ServerReader; - template <class W> - friend class grpc::ServerWriter; - template <class W, class R> - friend class grpc::internal::ServerReaderWriterBody; - template <class ResponseType> - friend void grpc::internal::UnaryRunHandlerHelper( - const grpc::internal::MethodHandler::HandlerParameter&, ResponseType*, - grpc::Status&); - template <class ServiceType, class RequestType, class ResponseType> - friend class grpc::internal::ClientStreamingHandler; - template <class ServiceType, class RequestType, class ResponseType> - friend class grpc::internal::ServerStreamingHandler; - template <class Streamer, bool WriteNeeded> - friend class grpc::internal::TemplatedBidiStreamingHandler; - template <grpc::StatusCode code> - friend class grpc::internal::ErrorMethodHandler; - friend class grpc::ServerContextBase; - friend class grpc::ServerInterface; - template <class InputMessage, class OutputMessage> - friend class grpc::internal::BlockingUnaryCallImpl; - - // Friends that need access to constructor for callback CQ - friend class grpc::Channel; - - // For access to Register/CompleteAvalanching - template <class Op1, class Op2, class Op3, class Op4, class Op5, class Op6> - friend class grpc::internal::CallOpSet; - - /// EXPERIMENTAL - /// Creates a Thread Local cache to store the first event - /// On this completion queue queued from this thread. Once - /// initialized, it must be flushed on the same thread. - class CompletionQueueTLSCache { - public: - explicit CompletionQueueTLSCache(CompletionQueue* cq); - ~CompletionQueueTLSCache(); - bool Flush(void** tag, bool* ok); - - private: - CompletionQueue* cq_; - bool flushed_; - }; - - NextStatus AsyncNextInternal(void** tag, bool* ok, gpr_timespec deadline); - - /// Wraps \a grpc_completion_queue_pluck. - /// \warning Must not be mixed with calls to \a Next. - bool Pluck(grpc::internal::CompletionQueueTag* tag) { - auto deadline = - grpc::g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME); - while (true) { - auto ev = grpc::g_core_codegen_interface->grpc_completion_queue_pluck( - cq_, tag, deadline, nullptr); - bool ok = ev.success != 0; - void* ignored = tag; - if (tag->FinalizeResult(&ignored, &ok)) { - GPR_CODEGEN_ASSERT(ignored == tag); - return ok; - } - } - } - - /// Performs a single polling pluck on \a tag. - /// \warning Must not be mixed with calls to \a Next. - /// - /// TODO: sreek - This calls tag->FinalizeResult() even if the cq_ is already - /// shutdown. This is most likely a bug and if it is a bug, then change this - /// implementation to simple call the other TryPluck function with a zero - /// timeout. i.e: - /// TryPluck(tag, gpr_time_0(GPR_CLOCK_REALTIME)) - void TryPluck(grpc::internal::CompletionQueueTag* tag) { - auto deadline = - grpc::g_core_codegen_interface->gpr_time_0(GPR_CLOCK_REALTIME); - auto ev = grpc::g_core_codegen_interface->grpc_completion_queue_pluck( - cq_, tag, deadline, nullptr); - if (ev.type == GRPC_QUEUE_TIMEOUT) return; - bool ok = ev.success != 0; - void* ignored = tag; - // the tag must be swallowed if using TryPluck - GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); - } - - /// Performs a single polling pluck on \a tag. Calls tag->FinalizeResult if - /// the pluck() was successful and returned the tag. - /// - /// This exects tag->FinalizeResult (if called) to return 'false' i.e expects - /// that the tag is internal not something that is returned to the user. - void TryPluck(grpc::internal::CompletionQueueTag* tag, - gpr_timespec deadline) { - auto ev = grpc::g_core_codegen_interface->grpc_completion_queue_pluck( - cq_, tag, deadline, nullptr); - if (ev.type == GRPC_QUEUE_TIMEOUT || ev.type == GRPC_QUEUE_SHUTDOWN) { - return; - } - - bool ok = ev.success != 0; - void* ignored = tag; - GPR_CODEGEN_ASSERT(!tag->FinalizeResult(&ignored, &ok)); - } - - /// Manage state of avalanching operations : completion queue tags that - /// trigger other completion queue operations. The underlying core completion - /// queue should not really shutdown until all avalanching operations have - /// been finalized. Note that we maintain the requirement that an avalanche - /// registration must take place before CQ shutdown (which must be maintained - /// elsehwere) - void InitialAvalanching() { - gpr_atm_rel_store(&avalanches_in_flight_, static_cast<gpr_atm>(1)); - } - void RegisterAvalanching() { - gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, - static_cast<gpr_atm>(1)); - } - void CompleteAvalanching() { - if (gpr_atm_no_barrier_fetch_add(&avalanches_in_flight_, - static_cast<gpr_atm>(-1)) == 1) { - grpc::g_core_codegen_interface->grpc_completion_queue_shutdown(cq_); - } - } - - void RegisterServer(const grpc::Server* server) { - (void)server; -#ifndef NDEBUG - grpc::internal::MutexLock l(&server_list_mutex_); - server_list_.push_back(server); -#endif - } - void UnregisterServer(const grpc::Server* server) { - (void)server; -#ifndef NDEBUG - grpc::internal::MutexLock l(&server_list_mutex_); - server_list_.remove(server); -#endif - } - bool ServerListEmpty() const { -#ifndef NDEBUG - grpc::internal::MutexLock l(&server_list_mutex_); - return server_list_.empty(); -#endif - return true; - } - - static CompletionQueue* CallbackAlternativeCQ(); - static void ReleaseCallbackAlternativeCQ(CompletionQueue* cq); - - grpc_completion_queue* cq_; // owned - - gpr_atm avalanches_in_flight_; - - // List of servers associated with this CQ. Even though this is only used with - // NDEBUG, instantiate it in all cases since otherwise the size will be - // inconsistent. - mutable grpc::internal::Mutex server_list_mutex_; - std::list<const grpc::Server*> - server_list_ /* GUARDED_BY(server_list_mutex_) */; -}; - -/// A specific type of completion queue used by the processing of notifications -/// by servers. Instantiated by \a ServerBuilder or Server (for health checker). -class ServerCompletionQueue : public CompletionQueue { - public: - bool IsFrequentlyPolled() { return polling_type_ != GRPC_CQ_NON_LISTENING; } - - protected: - /// Default constructor - ServerCompletionQueue() : polling_type_(GRPC_CQ_DEFAULT_POLLING) {} - - private: - /// \param completion_type indicates whether this is a NEXT or CALLBACK - /// completion queue. - /// \param polling_type Informs the GRPC library about the type of polling - /// allowed on this completion queue. See grpc_cq_polling_type's description - /// in grpc_types.h for more details. - /// \param shutdown_cb is the shutdown callback used for CALLBACK api queues - ServerCompletionQueue(grpc_cq_completion_type completion_type, - grpc_cq_polling_type polling_type, - grpc_completion_queue_functor* shutdown_cb) - : CompletionQueue(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, completion_type, polling_type, - shutdown_cb}), - polling_type_(polling_type) {} - - grpc_cq_polling_type polling_type_; - friend class grpc::ServerBuilder; - friend class grpc::Server; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/config.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/config.h index 688fb3a24f..c7bfb198e8 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/config.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/config.h @@ -1,46 +1,27 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_CONFIG_H #define GRPCPP_IMPL_CODEGEN_CONFIG_H -// IWYU pragma: private, include <grpcpp/support/config.h> +// IWYU pragma: private -#include <util/generic/string.h> -#include <util/string/cast.h> - -/// The following macros are deprecated and appear only for users -/// with PB files generated using gRPC 1.0.x plugins. They should -/// not be used in new code -#define GRPC_OVERRIDE override // deprecated -#define GRPC_FINAL final // deprecated - -#ifdef GRPC_CUSTOM_STRING -#warning GRPC_CUSTOM_STRING is no longer supported. Please use TString. -#endif - -namespace grpc { - -// Using grpc::string and grpc::to_string is discouraged in favor of -// TString and ::ToString. This is only for legacy code using -// them explictly. -typedef TString string; - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/support/config.h> #endif // GRPCPP_IMPL_CODEGEN_CONFIG_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/config_protobuf.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/config_protobuf.h index da874c58eb..e1f3d40ac9 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/config_protobuf.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/config_protobuf.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H #define GRPCPP_IMPL_CODEGEN_CONFIG_PROTOBUF_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen.h deleted file mode 100644 index 340dc47faa..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H -#define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H - -// IWYU pragma: private - -// This file should be compiled as part of grpcpp. - -#include <grpc/byte_buffer.h> -#include <grpc/grpc.h> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> - -namespace grpc { - -/// Implementation of the core codegen interface. -class CoreCodegen final : public CoreCodegenInterface { - private: - const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( - const grpc_completion_queue_attributes* attributes) override; - grpc_completion_queue* grpc_completion_queue_create( - const grpc_completion_queue_factory* factory, - const grpc_completion_queue_attributes* attributes, - void* reserved) override; - grpc_completion_queue* grpc_completion_queue_create_for_next( - void* reserved) override; - grpc_completion_queue* grpc_completion_queue_create_for_pluck( - void* reserved) override; - void grpc_completion_queue_shutdown(grpc_completion_queue* cq) override; - void grpc_completion_queue_destroy(grpc_completion_queue* cq) override; - grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, void* tag, - gpr_timespec deadline, - void* reserved) override; - - void* gpr_malloc(size_t size) override; - void gpr_free(void* p) override; - - void grpc_init() override; - void grpc_shutdown() override; - - void gpr_mu_init(gpr_mu* mu) override; - void gpr_mu_destroy(gpr_mu* mu) override; - void gpr_mu_lock(gpr_mu* mu) override; - void gpr_mu_unlock(gpr_mu* mu) override; - void gpr_cv_init(gpr_cv* cv) override; - void gpr_cv_destroy(gpr_cv* cv) override; - int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) override; - void gpr_cv_signal(gpr_cv* cv) override; - void gpr_cv_broadcast(gpr_cv* cv) override; - - grpc_call_error grpc_call_start_batch(grpc_call* call, const grpc_op* ops, - size_t nops, void* tag, - void* reserved) override; - grpc_call_error grpc_call_cancel_with_status(grpc_call* call, - grpc_status_code status, - const char* description, - void* reserved) override; - int grpc_call_failed_before_recv_message(const grpc_call* c) override; - void grpc_call_ref(grpc_call* call) override; - void grpc_call_unref(grpc_call* call) override; - void* grpc_call_arena_alloc(grpc_call* call, size_t length) override; - const char* grpc_call_error_to_string(grpc_call_error error) override; - - grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) override; - void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) override; - size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) override; - - int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, - grpc_byte_buffer* buffer) override; - void grpc_byte_buffer_reader_destroy( - grpc_byte_buffer_reader* reader) override; - int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, - grpc_slice* slice) override; - int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, - grpc_slice** slice) override; - - grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, - size_t nslices) override; - grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, - void (*destroy)(void*), - void* user_data) override; - grpc_slice grpc_slice_new_with_len(void* p, size_t len, - void (*destroy)(void*, size_t)) override; - grpc_slice grpc_empty_slice() override; - grpc_slice grpc_slice_malloc(size_t length) override; - void grpc_slice_unref(grpc_slice slice) override; - grpc_slice grpc_slice_ref(grpc_slice slice) override; - grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) override; - grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) override; - grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) override; - void grpc_slice_buffer_add(grpc_slice_buffer* sb, grpc_slice slice) override; - void grpc_slice_buffer_pop(grpc_slice_buffer* sb) override; - void grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb, - grpc_slice slice) override; - grpc_slice grpc_slice_from_static_buffer(const void* buffer, - size_t length) override; - grpc_slice grpc_slice_from_copied_buffer(const void* buffer, - size_t length) override; - void grpc_metadata_array_init(grpc_metadata_array* array) override; - void grpc_metadata_array_destroy(grpc_metadata_array* array) override; - - gpr_timespec gpr_inf_future(gpr_clock_type type) override; - gpr_timespec gpr_time_0(gpr_clock_type type) override; - - const Status& ok() override; - const Status& cancelled() override; - - void assert_fail(const char* failed_assertion, const char* file, - int line) override; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen_interface.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen_interface.h deleted file mode 100644 index 5ca1feff08..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/core_codegen_interface.h +++ /dev/null @@ -1,169 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H -#define GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H - -// IWYU pragma: private - -#include <grpc/impl/codegen/byte_buffer.h> -#include <grpc/impl/codegen/byte_buffer_reader.h> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpc/impl/codegen/sync.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/status.h> - -namespace grpc { - -/// Interface between the codegen library and the minimal subset of core -/// features required by the generated code. -/// -/// All undocumented methods are simply forwarding the call to their namesakes. -/// Please refer to their corresponding documentation for details. -/// -/// \warning This interface should be considered internal and private. -class CoreCodegenInterface { - public: - virtual ~CoreCodegenInterface() = default; - - /// Upon a failed assertion, log the error. - virtual void assert_fail(const char* failed_assertion, const char* file, - int line) = 0; - - virtual const grpc_completion_queue_factory* - grpc_completion_queue_factory_lookup( - const grpc_completion_queue_attributes* attributes) = 0; - virtual grpc_completion_queue* grpc_completion_queue_create( - const grpc_completion_queue_factory* factory, - const grpc_completion_queue_attributes* attributes, void* reserved) = 0; - virtual grpc_completion_queue* grpc_completion_queue_create_for_next( - void* reserved) = 0; - virtual grpc_completion_queue* grpc_completion_queue_create_for_pluck( - void* reserved) = 0; - virtual void grpc_completion_queue_shutdown(grpc_completion_queue* cq) = 0; - virtual void grpc_completion_queue_destroy(grpc_completion_queue* cq) = 0; - virtual grpc_event grpc_completion_queue_pluck(grpc_completion_queue* cq, - void* tag, - gpr_timespec deadline, - void* reserved) = 0; - - virtual void* gpr_malloc(size_t size) = 0; - virtual void gpr_free(void* p) = 0; - - // These are only to be used to fix edge cases involving grpc_init and - // grpc_shutdown. Calling grpc_init from the codegen interface before - // the real grpc_init is called will cause a crash, so if you use this - // function, ensure that it is not the first call to grpc_init. - virtual void grpc_init() = 0; - virtual void grpc_shutdown() = 0; - - virtual void gpr_mu_init(gpr_mu* mu) = 0; - virtual void gpr_mu_destroy(gpr_mu* mu) = 0; - virtual void gpr_mu_lock(gpr_mu* mu) = 0; - virtual void gpr_mu_unlock(gpr_mu* mu) = 0; - virtual void gpr_cv_init(gpr_cv* cv) = 0; - virtual void gpr_cv_destroy(gpr_cv* cv) = 0; - virtual int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, - gpr_timespec abs_deadline) = 0; - virtual void gpr_cv_signal(gpr_cv* cv) = 0; - virtual void gpr_cv_broadcast(gpr_cv* cv) = 0; - - virtual grpc_byte_buffer* grpc_byte_buffer_copy(grpc_byte_buffer* bb) = 0; - virtual void grpc_byte_buffer_destroy(grpc_byte_buffer* bb) = 0; - virtual size_t grpc_byte_buffer_length(grpc_byte_buffer* bb) - GRPC_MUST_USE_RESULT = 0; - - virtual int grpc_byte_buffer_reader_init(grpc_byte_buffer_reader* reader, - grpc_byte_buffer* buffer) - GRPC_MUST_USE_RESULT = 0; - virtual void grpc_byte_buffer_reader_destroy( - grpc_byte_buffer_reader* reader) = 0; - virtual int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader* reader, - grpc_slice* slice) = 0; - virtual int grpc_byte_buffer_reader_peek(grpc_byte_buffer_reader* reader, - grpc_slice** slice) = 0; - - virtual grpc_byte_buffer* grpc_raw_byte_buffer_create(grpc_slice* slice, - size_t nslices) = 0; - virtual grpc_slice grpc_slice_new_with_user_data(void* p, size_t len, - void (*destroy)(void*), - void* user_data) = 0; - virtual grpc_slice grpc_slice_new_with_len(void* p, size_t len, - void (*destroy)(void*, - size_t)) = 0; - virtual grpc_call_error grpc_call_start_batch(grpc_call* call, - const grpc_op* ops, size_t nops, - void* tag, void* reserved) = 0; - virtual grpc_call_error grpc_call_cancel_with_status(grpc_call* call, - grpc_status_code status, - const char* description, - void* reserved) = 0; - virtual int grpc_call_failed_before_recv_message(const grpc_call* c) = 0; - virtual void grpc_call_ref(grpc_call* call) = 0; - virtual void grpc_call_unref(grpc_call* call) = 0; - virtual void* grpc_call_arena_alloc(grpc_call* call, size_t length) = 0; - virtual const char* grpc_call_error_to_string(grpc_call_error error) = 0; - virtual grpc_slice grpc_empty_slice() = 0; - virtual grpc_slice grpc_slice_malloc(size_t length) = 0; - virtual void grpc_slice_unref(grpc_slice slice) = 0; - virtual grpc_slice grpc_slice_ref(grpc_slice slice) = 0; - virtual grpc_slice grpc_slice_split_tail(grpc_slice* s, size_t split) = 0; - virtual grpc_slice grpc_slice_split_head(grpc_slice* s, size_t split) = 0; - virtual grpc_slice grpc_slice_sub(grpc_slice s, size_t begin, size_t end) = 0; - virtual void grpc_slice_buffer_add(grpc_slice_buffer* sb, - grpc_slice slice) = 0; - virtual void grpc_slice_buffer_add_indexed(grpc_slice_buffer* sb, - grpc_slice slice) = 0; - virtual void grpc_slice_buffer_pop(grpc_slice_buffer* sb) = 0; - virtual grpc_slice grpc_slice_from_static_buffer(const void* buffer, - size_t length) = 0; - virtual grpc_slice grpc_slice_from_copied_buffer(const void* buffer, - size_t length) = 0; - - virtual void grpc_metadata_array_init(grpc_metadata_array* array) = 0; - virtual void grpc_metadata_array_destroy(grpc_metadata_array* array) = 0; - - virtual const Status& ok() = 0; - virtual const Status& cancelled() = 0; - - virtual gpr_timespec gpr_inf_future(gpr_clock_type type) = 0; - virtual gpr_timespec gpr_time_0(gpr_clock_type type) = 0; -}; - -extern CoreCodegenInterface* g_core_codegen_interface; - -/// Codegen specific version of \a GPR_ASSERT. -#define GPR_CODEGEN_ASSERT(x) \ - do { \ - if (GPR_UNLIKELY(!(x))) { \ - grpc::g_core_codegen_interface->assert_fail(#x, __FILE__, __LINE__); \ - } \ - } while (0) - -/// Codegen specific version of \a GPR_DEBUG_ASSERT. -#ifndef NDEBUG -#define GPR_CODEGEN_DEBUG_ASSERT(x) GPR_CODEGEN_ASSERT(x) -#else -#define GPR_CODEGEN_DEBUG_ASSERT(x) \ - do { \ - } while (0) -#endif - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_CORE_CODEGEN_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/create_auth_context.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/create_auth_context.h index 817988f3aa..9120100cd6 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/create_auth_context.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/create_auth_context.h @@ -1,35 +1,27 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H #define GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H // IWYU pragma: private -#include <memory> - -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/security/auth_context.h> - -namespace grpc { - -std::shared_ptr<const AuthContext> CreateAuthContext(grpc_call* call); - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/create_auth_context.h> #endif // GRPCPP_IMPL_CODEGEN_CREATE_AUTH_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/grpc_library.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/grpc_library.h deleted file mode 100644 index 9f83a7f938..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/grpc_library.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H -#define GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H - -// IWYU pragma: private, include <grpcpp/impl/grpc_library.h> - -#include <grpcpp/impl/codegen/core_codegen_interface.h> - -namespace grpc { - -class GrpcLibraryInterface { - public: - virtual ~GrpcLibraryInterface() = default; - virtual void init() = 0; - virtual void shutdown() = 0; -}; - -/// Initialized by \a grpc::GrpcLibraryInitializer from -/// <grpcpp/impl/grpc_library.h> -extern GrpcLibraryInterface* g_glip; - -/// Classes that require gRPC to be initialized should inherit from this class. -class GrpcLibraryCodegen { - public: - explicit GrpcLibraryCodegen(bool call_grpc_init = true) - : grpc_init_called_(false) { - if (call_grpc_init) { - GPR_CODEGEN_ASSERT(g_glip && - "gRPC library not initialized. See " - "grpc::internal::GrpcLibraryInitializer."); - g_glip->init(); - grpc_init_called_ = true; - } - } - virtual ~GrpcLibraryCodegen() { - if (grpc_init_called_) { - GPR_CODEGEN_ASSERT(g_glip && - "gRPC library not initialized. See " - "grpc::internal::GrpcLibraryInitializer."); - g_glip->shutdown(); - } - } - - private: - bool grpc_init_called_; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_GRPC_LIBRARY_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/intercepted_channel.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/intercepted_channel.h index 57c97dd60f..2f41207868 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/intercepted_channel.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/intercepted_channel.h @@ -1,85 +1,27 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H #define GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H // IWYU pragma: private -#include <grpcpp/impl/codegen/channel_interface.h> - -namespace grpc { -class CompletionQueue; - -namespace internal { - -class InterceptorBatchMethodsImpl; - -/// An InterceptedChannel is available to client Interceptors. An -/// InterceptedChannel is unique to an interceptor, and when an RPC is started -/// on this channel, only those interceptors that come after this interceptor -/// see the RPC. -class InterceptedChannel : public ChannelInterface { - public: - ~InterceptedChannel() override { channel_ = nullptr; } - - /// Get the current channel state. If the channel is in IDLE and - /// \a try_to_connect is set to true, try to connect. - grpc_connectivity_state GetState(bool try_to_connect) override { - return channel_->GetState(try_to_connect); - } - - private: - InterceptedChannel(ChannelInterface* channel, size_t pos) - : channel_(channel), interceptor_pos_(pos) {} - - Call CreateCall(const RpcMethod& method, grpc::ClientContext* context, - grpc::CompletionQueue* cq) override { - return channel_->CreateCallInternal(method, context, cq, interceptor_pos_); - } - - void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override { - return channel_->PerformOpsOnCall(ops, call); - } - void* RegisterMethod(const char* method) override { - return channel_->RegisterMethod(method); - } - - void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline, grpc::CompletionQueue* cq, - void* tag) override { - return channel_->NotifyOnStateChangeImpl(last_observed, deadline, cq, tag); - } - bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline) override { - return channel_->WaitForStateChangeImpl(last_observed, deadline); - } - - grpc::CompletionQueue* CallbackCQ() override { - return channel_->CallbackCQ(); - } - - ChannelInterface* channel_; - size_t interceptor_pos_; - - friend class InterceptorBatchMethodsImpl; -}; -} // namespace internal -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/intercepted_channel.h> #endif // GRPCPP_IMPL_CODEGEN_INTERCEPTED_CHANNEL_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor.h deleted file mode 100644 index b66c6656ae..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor.h +++ /dev/null @@ -1,234 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H -#define GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H - -// IWYU pragma: private, include <grpcpp/support/interceptor.h> - -#include <map> -#include <memory> -#include <util/generic/string.h> -#include <util/string/cast.h> - -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/metadata_map.h> -#include <grpcpp/impl/codegen/string_ref.h> -#include <grpcpp/support/byte_buffer.h> - -namespace grpc { - -class ChannelInterface; -class Status; - -namespace experimental { - -/// An enumeration of different possible points at which the \a Intercept -/// method of the \a Interceptor interface may be called. Any given call -/// to \a Intercept will include one or more of these hook points, and -/// each hook point makes certain types of information available to the -/// interceptor. -/// In these enumeration names, PRE_SEND means that an interception has taken -/// place between the time the application provided a certain type of data -/// (e.g., initial metadata, status) and the time that that data goes to the -/// other side. POST_SEND means that the data has been committed for going to -/// the other side (even if it has not yet been received at the other side). -/// PRE_RECV means an interception between the time that a certain -/// operation has been requested and it is available. POST_RECV means that a -/// result is available but has not yet been passed back to the application. -/// A batch of interception points will only contain either PRE or POST hooks -/// but not both types. For example, a batch with PRE_SEND hook points will not -/// contain POST_RECV or POST_SEND ops. Likewise, a batch with POST_* ops can -/// not contain PRE_* ops. -enum class InterceptionHookPoints { - /// The first three in this list are for clients and servers - PRE_SEND_INITIAL_METADATA, - PRE_SEND_MESSAGE, - POST_SEND_MESSAGE, - PRE_SEND_STATUS, // server only - PRE_SEND_CLOSE, // client only: WritesDone for stream; after write in unary - /// The following three are for hijacked clients only. A batch with PRE_RECV_* - /// hook points will never contain hook points of other types. - PRE_RECV_INITIAL_METADATA, - PRE_RECV_MESSAGE, - PRE_RECV_STATUS, - /// The following two are for all clients and servers - POST_RECV_INITIAL_METADATA, - POST_RECV_MESSAGE, - POST_RECV_STATUS, // client only - POST_RECV_CLOSE, // server only - /// This is a special hook point available to both clients and servers when - /// TryCancel() is performed. - /// - No other hook points will be present along with this. - /// - It is illegal for an interceptor to block/delay this operation. - /// - ALL interceptors see this hook point irrespective of whether the - /// RPC was hijacked or not. - PRE_SEND_CANCEL, - NUM_INTERCEPTION_HOOKS -}; - -/// Class that is passed as an argument to the \a Intercept method -/// of the application's \a Interceptor interface implementation. It has five -/// purposes: -/// 1. Indicate which hook points are present at a specific interception -/// 2. Allow an interceptor to inform the library that an RPC should -/// continue to the next stage of its processing (which may be another -/// interceptor or the main path of the library) -/// 3. Allow an interceptor to hijack the processing of the RPC (only for -/// client-side RPCs with PRE_SEND_INITIAL_METADATA) so that it does not -/// proceed with normal processing beyond that stage -/// 4. Access the relevant fields of an RPC at each interception point -/// 5. Set some fields of an RPC at each interception point, when possible -class InterceptorBatchMethods { - public: - virtual ~InterceptorBatchMethods() {} - /// Determine whether the current batch has an interception hook point - /// of type \a type - virtual bool QueryInterceptionHookPoint(InterceptionHookPoints type) = 0; - /// Signal that the interceptor is done intercepting the current batch of the - /// RPC. Every interceptor must either call Proceed or Hijack on each - /// interception. In most cases, only Proceed will be used. Explicit use of - /// Proceed is what enables interceptors to delay the processing of RPCs - /// while they perform other work. - /// Proceed is a no-op if the batch contains PRE_SEND_CANCEL. Simply returning - /// from the Intercept method does the job of continuing the RPC in this case. - /// This is because PRE_SEND_CANCEL is always in a separate batch and is not - /// allowed to be delayed. - virtual void Proceed() = 0; - /// Indicate that the interceptor has hijacked the RPC (only valid if the - /// batch contains send_initial_metadata on the client side). Later - /// interceptors in the interceptor list will not be called. Later batches - /// on the same RPC will go through interception, but only up to the point - /// of the hijacking interceptor. - virtual void Hijack() = 0; - - /// Send Message Methods - /// GetSerializedSendMessage and GetSendMessage/ModifySendMessage are the - /// available methods to view and modify the request payload. An interceptor - /// can access the payload in either serialized form or non-serialized form - /// but not both at the same time. - /// gRPC performs serialization in a lazy manner, which means - /// that a call to GetSerializedSendMessage will result in a serialization - /// operation if the payload stored is not in the serialized form already; the - /// non-serialized form will be lost and GetSendMessage will no longer return - /// a valid pointer, and this will remain true for later interceptors too. - /// This can change however if ModifySendMessage is used to replace the - /// current payload. Note that ModifySendMessage requires a new payload - /// message in the non-serialized form. This will overwrite the existing - /// payload irrespective of whether it had been serialized earlier. Also note - /// that gRPC Async API requires early serialization of the payload which - /// means that the payload would be available in the serialized form only - /// unless an interceptor replaces the payload with ModifySendMessage. - - /// Returns a modifable ByteBuffer holding the serialized form of the message - /// that is going to be sent. Valid for PRE_SEND_MESSAGE interceptions. - /// A return value of nullptr indicates that this ByteBuffer is not valid. - virtual ByteBuffer* GetSerializedSendMessage() = 0; - - /// Returns a non-modifiable pointer to the non-serialized form of the message - /// to be sent. Valid for PRE_SEND_MESSAGE interceptions. A return value of - /// nullptr indicates that this field is not valid. - virtual const void* GetSendMessage() = 0; - - /// Overwrites the message to be sent with \a message. \a message should be in - /// the non-serialized form expected by the method. Valid for PRE_SEND_MESSAGE - /// interceptions. Note that the interceptor is responsible for maintaining - /// the life of the message till it is serialized or it receives the - /// POST_SEND_MESSAGE interception point, whichever happens earlier. The - /// modifying interceptor may itself force early serialization by calling - /// GetSerializedSendMessage. - virtual void ModifySendMessage(const void* message) = 0; - - /// Checks whether the SEND MESSAGE op succeeded. Valid for POST_SEND_MESSAGE - /// interceptions. - virtual bool GetSendMessageStatus() = 0; - - /// Returns a modifiable multimap of the initial metadata to be sent. Valid - /// for PRE_SEND_INITIAL_METADATA interceptions. A value of nullptr indicates - /// that this field is not valid. - virtual std::multimap<TString, TString>* GetSendInitialMetadata() = 0; - - /// Returns the status to be sent. Valid for PRE_SEND_STATUS interceptions. - virtual Status GetSendStatus() = 0; - - /// Overwrites the status with \a status. Valid for PRE_SEND_STATUS - /// interceptions. - virtual void ModifySendStatus(const Status& status) = 0; - - /// Returns a modifiable multimap of the trailing metadata to be sent. Valid - /// for PRE_SEND_STATUS interceptions. A value of nullptr indicates - /// that this field is not valid. - virtual std::multimap<TString, TString>* - GetSendTrailingMetadata() = 0; - - /// Returns a pointer to the modifiable received message. Note that the - /// message is already deserialized but the type is not set; the interceptor - /// should static_cast to the appropriate type before using it. This is valid - /// for PRE_RECV_MESSAGE and POST_RECV_MESSAGE interceptions; nullptr for not - /// valid - virtual void* GetRecvMessage() = 0; - - /// Returns a modifiable multimap of the received initial metadata. - /// Valid for PRE_RECV_INITIAL_METADATA and POST_RECV_INITIAL_METADATA - /// interceptions; nullptr if not valid - virtual std::multimap<grpc::string_ref, grpc::string_ref>* - GetRecvInitialMetadata() = 0; - - /// Returns a modifiable view of the received status on PRE_RECV_STATUS and - /// POST_RECV_STATUS interceptions; nullptr if not valid. - virtual Status* GetRecvStatus() = 0; - - /// Returns a modifiable multimap of the received trailing metadata on - /// PRE_RECV_STATUS and POST_RECV_STATUS interceptions; nullptr if not valid - virtual std::multimap<grpc::string_ref, grpc::string_ref>* - GetRecvTrailingMetadata() = 0; - - /// Gets an intercepted channel. When a call is started on this interceptor, - /// only interceptors after the current interceptor are created from the - /// factory objects registered with the channel. This allows calls to be - /// started from interceptors without infinite regress through the interceptor - /// list. - virtual std::unique_ptr<ChannelInterface> GetInterceptedChannel() = 0; - - /// On a hijacked RPC, an interceptor can decide to fail a PRE_RECV_MESSAGE - /// op. This would be a signal to the reader that there will be no more - /// messages, or the stream has failed or been cancelled. - virtual void FailHijackedRecvMessage() = 0; - - /// On a hijacked RPC/ to-be hijacked RPC, this can be called to fail a SEND - /// MESSAGE op - virtual void FailHijackedSendMessage() = 0; -}; - -/// Interface for an interceptor. Interceptor authors must create a class -/// that derives from this parent class. -class Interceptor { - public: - virtual ~Interceptor() {} - - /// The one public method of an Interceptor interface. Override this to - /// trigger the desired actions at the hook points described above. - virtual void Intercept(InterceptorBatchMethods* methods) = 0; -}; - -} // namespace experimental -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_INTERCEPTOR_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor_common.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor_common.h index f26b82b27e..ddd282d7d3 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor_common.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/interceptor_common.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #if defined(__GNUC__) #pragma GCC system_header @@ -25,520 +25,7 @@ // IWYU pragma: private -#include <array> -#include <functional> - -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/call_op_set_interface.h> -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/client_interceptor.h> -#include <grpcpp/impl/codegen/intercepted_channel.h> -#include <grpcpp/impl/codegen/server_interceptor.h> - -namespace grpc { -namespace internal { - -class InterceptorBatchMethodsImpl - : public experimental::InterceptorBatchMethods { - public: - InterceptorBatchMethodsImpl() { - for (auto i = static_cast<experimental::InterceptionHookPoints>(0); - i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; - i = static_cast<experimental::InterceptionHookPoints>( - static_cast<size_t>(i) + 1)) { - hooks_[static_cast<size_t>(i)] = false; - } - } - - ~InterceptorBatchMethodsImpl() override {} - - bool QueryInterceptionHookPoint( - experimental::InterceptionHookPoints type) override { - return hooks_[static_cast<size_t>(type)]; - } - - void Proceed() override { - if (call_->client_rpc_info() != nullptr) { - return ProceedClient(); - } - GPR_CODEGEN_ASSERT(call_->server_rpc_info() != nullptr); - ProceedServer(); - } - - void Hijack() override { - // Only the client can hijack when sending down initial metadata - GPR_CODEGEN_ASSERT(!reverse_ && ops_ != nullptr && - call_->client_rpc_info() != nullptr); - // It is illegal to call Hijack twice - GPR_CODEGEN_ASSERT(!ran_hijacking_interceptor_); - auto* rpc_info = call_->client_rpc_info(); - rpc_info->hijacked_ = true; - rpc_info->hijacked_interceptor_ = current_interceptor_index_; - ClearHookPoints(); - ops_->SetHijackingState(); - ran_hijacking_interceptor_ = true; - rpc_info->RunInterceptor(this, current_interceptor_index_); - } - - void AddInterceptionHookPoint(experimental::InterceptionHookPoints type) { - hooks_[static_cast<size_t>(type)] = true; - } - - ByteBuffer* GetSerializedSendMessage() override { - GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); - if (*orig_send_message_ != nullptr) { - GPR_CODEGEN_ASSERT(serializer_(*orig_send_message_).ok()); - *orig_send_message_ = nullptr; - } - return send_message_; - } - - const void* GetSendMessage() override { - GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); - return *orig_send_message_; - } - - void ModifySendMessage(const void* message) override { - GPR_CODEGEN_ASSERT(orig_send_message_ != nullptr); - *orig_send_message_ = message; - } - - bool GetSendMessageStatus() override { return !*fail_send_message_; } - - std::multimap<TString, TString>* GetSendInitialMetadata() override { - return send_initial_metadata_; - } - - Status GetSendStatus() override { - return Status(static_cast<StatusCode>(*code_), *error_message_, - *error_details_); - } - - void ModifySendStatus(const Status& status) override { - *code_ = static_cast<grpc_status_code>(status.error_code()); - *error_details_ = status.error_details(); - *error_message_ = status.error_message(); - } - - std::multimap<TString, TString>* GetSendTrailingMetadata() override { - return send_trailing_metadata_; - } - - void* GetRecvMessage() override { return recv_message_; } - - std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvInitialMetadata() - override { - return recv_initial_metadata_->map(); - } - - Status* GetRecvStatus() override { return recv_status_; } - - void FailHijackedSendMessage() override { - GPR_CODEGEN_ASSERT(hooks_[static_cast<size_t>( - experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)]); - *fail_send_message_ = true; - } - - std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata() - override { - return recv_trailing_metadata_->map(); - } - - void SetSendMessage(ByteBuffer* buf, const void** msg, - bool* fail_send_message, - std::function<Status(const void*)> serializer) { - send_message_ = buf; - orig_send_message_ = msg; - fail_send_message_ = fail_send_message; - serializer_ = serializer; - } - - void SetSendInitialMetadata( - std::multimap<TString, TString>* metadata) { - send_initial_metadata_ = metadata; - } - - void SetSendStatus(grpc_status_code* code, TString* error_details, - TString* error_message) { - code_ = code; - error_details_ = error_details; - error_message_ = error_message; - } - - void SetSendTrailingMetadata( - std::multimap<TString, TString>* metadata) { - send_trailing_metadata_ = metadata; - } - - void SetRecvMessage(void* message, bool* hijacked_recv_message_failed) { - recv_message_ = message; - hijacked_recv_message_failed_ = hijacked_recv_message_failed; - } - - void SetRecvInitialMetadata(MetadataMap* map) { - recv_initial_metadata_ = map; - } - - void SetRecvStatus(Status* status) { recv_status_ = status; } - - void SetRecvTrailingMetadata(MetadataMap* map) { - recv_trailing_metadata_ = map; - } - - std::unique_ptr<ChannelInterface> GetInterceptedChannel() override { - auto* info = call_->client_rpc_info(); - if (info == nullptr) { - return std::unique_ptr<ChannelInterface>(nullptr); - } - // The intercepted channel starts from the interceptor just after the - // current interceptor - return std::unique_ptr<ChannelInterface>(new InterceptedChannel( - info->channel(), current_interceptor_index_ + 1)); - } - - void FailHijackedRecvMessage() override { - GPR_CODEGEN_ASSERT(hooks_[static_cast<size_t>( - experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]); - *hijacked_recv_message_failed_ = true; - } - - // Clears all state - void ClearState() { - reverse_ = false; - ran_hijacking_interceptor_ = false; - ClearHookPoints(); - } - - // Prepares for Post_recv operations - void SetReverse() { - reverse_ = true; - ran_hijacking_interceptor_ = false; - ClearHookPoints(); - } - - // This needs to be set before interceptors are run - void SetCall(Call* call) { call_ = call; } - - // This needs to be set before interceptors are run using RunInterceptors(). - // Alternatively, RunInterceptors(std::function<void(void)> f) can be used. - void SetCallOpSetInterface(CallOpSetInterface* ops) { ops_ = ops; } - - // SetCall should have been called before this. - // Returns true if the interceptors list is empty - bool InterceptorsListEmpty() { - auto* client_rpc_info = call_->client_rpc_info(); - if (client_rpc_info != nullptr) { - return client_rpc_info->interceptors_.empty(); - } - - auto* server_rpc_info = call_->server_rpc_info(); - return server_rpc_info == nullptr || server_rpc_info->interceptors_.empty(); - } - - // This should be used only by subclasses of CallOpSetInterface. SetCall and - // SetCallOpSetInterface should have been called before this. After all the - // interceptors are done running, either ContinueFillOpsAfterInterception or - // ContinueFinalizeOpsAfterInterception will be called. Note that neither of - // them is invoked if there were no interceptors registered. - bool RunInterceptors() { - GPR_CODEGEN_ASSERT(ops_); - auto* client_rpc_info = call_->client_rpc_info(); - if (client_rpc_info != nullptr) { - if (client_rpc_info->interceptors_.empty()) { - return true; - } else { - RunClientInterceptors(); - return false; - } - } - - auto* server_rpc_info = call_->server_rpc_info(); - if (server_rpc_info == nullptr || server_rpc_info->interceptors_.empty()) { - return true; - } - RunServerInterceptors(); - return false; - } - - // Returns true if no interceptors are run. Returns false otherwise if there - // are interceptors registered. After the interceptors are done running \a f - // will be invoked. This is to be used only by BaseAsyncRequest and - // SyncRequest. - bool RunInterceptors(std::function<void(void)> f) { - // This is used only by the server for initial call request - GPR_CODEGEN_ASSERT(reverse_ == true); - GPR_CODEGEN_ASSERT(call_->client_rpc_info() == nullptr); - auto* server_rpc_info = call_->server_rpc_info(); - if (server_rpc_info == nullptr || server_rpc_info->interceptors_.empty()) { - return true; - } - callback_ = std::move(f); - RunServerInterceptors(); - return false; - } - - private: - void RunClientInterceptors() { - auto* rpc_info = call_->client_rpc_info(); - if (!reverse_) { - current_interceptor_index_ = 0; - } else { - if (rpc_info->hijacked_) { - current_interceptor_index_ = rpc_info->hijacked_interceptor_; - } else { - current_interceptor_index_ = rpc_info->interceptors_.size() - 1; - } - } - rpc_info->RunInterceptor(this, current_interceptor_index_); - } - - void RunServerInterceptors() { - auto* rpc_info = call_->server_rpc_info(); - if (!reverse_) { - current_interceptor_index_ = 0; - } else { - current_interceptor_index_ = rpc_info->interceptors_.size() - 1; - } - rpc_info->RunInterceptor(this, current_interceptor_index_); - } - - void ProceedClient() { - auto* rpc_info = call_->client_rpc_info(); - if (rpc_info->hijacked_ && !reverse_ && - current_interceptor_index_ == rpc_info->hijacked_interceptor_ && - !ran_hijacking_interceptor_) { - // We now need to provide hijacked recv ops to this interceptor - ClearHookPoints(); - ops_->SetHijackingState(); - ran_hijacking_interceptor_ = true; - rpc_info->RunInterceptor(this, current_interceptor_index_); - return; - } - if (!reverse_) { - current_interceptor_index_++; - // We are going down the stack of interceptors - if (current_interceptor_index_ < rpc_info->interceptors_.size()) { - if (rpc_info->hijacked_ && - current_interceptor_index_ > rpc_info->hijacked_interceptor_) { - // This is a hijacked RPC and we are done with hijacking - ops_->ContinueFillOpsAfterInterception(); - } else { - rpc_info->RunInterceptor(this, current_interceptor_index_); - } - } else { - // we are done running all the interceptors without any hijacking - ops_->ContinueFillOpsAfterInterception(); - } - } else { - // We are going up the stack of interceptors - if (current_interceptor_index_ > 0) { - // Continue running interceptors - current_interceptor_index_--; - rpc_info->RunInterceptor(this, current_interceptor_index_); - } else { - // we are done running all the interceptors without any hijacking - ops_->ContinueFinalizeResultAfterInterception(); - } - } - } - - void ProceedServer() { - auto* rpc_info = call_->server_rpc_info(); - if (!reverse_) { - current_interceptor_index_++; - if (current_interceptor_index_ < rpc_info->interceptors_.size()) { - return rpc_info->RunInterceptor(this, current_interceptor_index_); - } else if (ops_) { - return ops_->ContinueFillOpsAfterInterception(); - } - } else { - // We are going up the stack of interceptors - if (current_interceptor_index_ > 0) { - // Continue running interceptors - current_interceptor_index_--; - return rpc_info->RunInterceptor(this, current_interceptor_index_); - } else if (ops_) { - return ops_->ContinueFinalizeResultAfterInterception(); - } - } - GPR_CODEGEN_ASSERT(callback_); - callback_(); - } - - void ClearHookPoints() { - for (auto i = static_cast<experimental::InterceptionHookPoints>(0); - i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; - i = static_cast<experimental::InterceptionHookPoints>( - static_cast<size_t>(i) + 1)) { - hooks_[static_cast<size_t>(i)] = false; - } - } - - std::array<bool, - static_cast<size_t>( - experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS)> - hooks_; - - size_t current_interceptor_index_ = 0; // Current iterator - bool reverse_ = false; - bool ran_hijacking_interceptor_ = false; - Call* call_ = nullptr; // The Call object is present along with CallOpSet - // object/callback - CallOpSetInterface* ops_ = nullptr; - std::function<void(void)> callback_; - - ByteBuffer* send_message_ = nullptr; - bool* fail_send_message_ = nullptr; - const void** orig_send_message_ = nullptr; - std::function<Status(const void*)> serializer_; - - std::multimap<TString, TString>* send_initial_metadata_; - - grpc_status_code* code_ = nullptr; - TString* error_details_ = nullptr; - TString* error_message_ = nullptr; - - std::multimap<TString, TString>* send_trailing_metadata_ = nullptr; - - void* recv_message_ = nullptr; - bool* hijacked_recv_message_failed_ = nullptr; - - MetadataMap* recv_initial_metadata_ = nullptr; - - Status* recv_status_ = nullptr; - - MetadataMap* recv_trailing_metadata_ = nullptr; -}; - -// A special implementation of InterceptorBatchMethods to send a Cancel -// notification down the interceptor stack -class CancelInterceptorBatchMethods - : public experimental::InterceptorBatchMethods { - public: - bool QueryInterceptionHookPoint( - experimental::InterceptionHookPoints type) override { - return type == experimental::InterceptionHookPoints::PRE_SEND_CANCEL; - } - - void Proceed() override { - // This is a no-op. For actual continuation of the RPC simply needs to - // return from the Intercept method - } - - void Hijack() override { - // Only the client can hijack when sending down initial metadata - GPR_CODEGEN_ASSERT(false && - "It is illegal to call Hijack on a method which has a " - "Cancel notification"); - } - - ByteBuffer* GetSerializedSendMessage() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetSendMessage on a method which " - "has a Cancel notification"); - return nullptr; - } - - bool GetSendMessageStatus() override { - GPR_CODEGEN_ASSERT( - false && - "It is illegal to call GetSendMessageStatus on a method which " - "has a Cancel notification"); - return false; - } - - const void* GetSendMessage() override { - GPR_CODEGEN_ASSERT( - false && - "It is illegal to call GetOriginalSendMessage on a method which " - "has a Cancel notification"); - return nullptr; - } - - void ModifySendMessage(const void* /*message*/) override { - GPR_CODEGEN_ASSERT( - false && - "It is illegal to call ModifySendMessage on a method which " - "has a Cancel notification"); - } - - std::multimap<TString, TString>* GetSendInitialMetadata() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetSendInitialMetadata on a " - "method which has a Cancel notification"); - return nullptr; - } - - Status GetSendStatus() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetSendStatus on a method which " - "has a Cancel notification"); - return Status(); - } - - void ModifySendStatus(const Status& /*status*/) override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call ModifySendStatus on a method " - "which has a Cancel notification"); - } - - std::multimap<TString, TString>* GetSendTrailingMetadata() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetSendTrailingMetadata on a " - "method which has a Cancel notification"); - return nullptr; - } - - void* GetRecvMessage() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetRecvMessage on a method which " - "has a Cancel notification"); - return nullptr; - } - - std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvInitialMetadata() - override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetRecvInitialMetadata on a " - "method which has a Cancel notification"); - return nullptr; - } - - Status* GetRecvStatus() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetRecvStatus on a method which " - "has a Cancel notification"); - return nullptr; - } - - std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata() - override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetRecvTrailingMetadata on a " - "method which has a Cancel notification"); - return nullptr; - } - - std::unique_ptr<ChannelInterface> GetInterceptedChannel() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call GetInterceptedChannel on a " - "method which has a Cancel notification"); - return std::unique_ptr<ChannelInterface>(nullptr); - } - - void FailHijackedRecvMessage() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call FailHijackedRecvMessage on a " - "method which has a Cancel notification"); - } - - void FailHijackedSendMessage() override { - GPR_CODEGEN_ASSERT(false && - "It is illegal to call FailHijackedSendMessage on a " - "method which has a Cancel notification"); - } -}; -} // namespace internal -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/interceptor_common.h> #endif // GRPCPP_IMPL_CODEGEN_INTERCEPTOR_COMMON_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/metadata_map.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/metadata_map.h index 430d6b6744..aad4d5ab78 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/metadata_map.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/metadata_map.h @@ -1,107 +1,27 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_METADATA_MAP_H #define GRPCPP_IMPL_CODEGEN_METADATA_MAP_H // IWYU pragma: private -#include <map> - -#include <grpc/impl/codegen/log.h> -#include <grpcpp/impl/codegen/slice.h> - -namespace grpc { - -namespace internal { - -const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin"; - -class MetadataMap { - public: - MetadataMap() { Setup(); } - - ~MetadataMap() { Destroy(); } - - TString GetBinaryErrorDetails() { - // if filled_, extract from the multimap for O(log(n)) - if (filled_) { - auto iter = map_.find(kBinaryErrorDetailsKey); - if (iter != map_.end()) { - return TString(iter->second.begin(), iter->second.length()); - } - } - // if not yet filled, take the O(n) lookup to avoid allocating the - // multimap until it is requested. - // TODO(ncteisen): plumb this through core as a first class object, just - // like code and message. - else { - for (size_t i = 0; i < arr_.count; i++) { - if (strncmp(reinterpret_cast<const char*>( - GRPC_SLICE_START_PTR(arr_.metadata[i].key)), - kBinaryErrorDetailsKey, - GRPC_SLICE_LENGTH(arr_.metadata[i].key)) == 0) { - return TString(reinterpret_cast<const char*>( - GRPC_SLICE_START_PTR(arr_.metadata[i].value)), - GRPC_SLICE_LENGTH(arr_.metadata[i].value)); - } - } - } - return TString(); - } - - std::multimap<grpc::string_ref, grpc::string_ref>* map() { - FillMap(); - return &map_; - } - grpc_metadata_array* arr() { return &arr_; } - - void Reset() { - filled_ = false; - map_.clear(); - Destroy(); - Setup(); - } - - private: - bool filled_ = false; - grpc_metadata_array arr_; - std::multimap<grpc::string_ref, grpc::string_ref> map_; - - void Destroy() { - g_core_codegen_interface->grpc_metadata_array_destroy(&arr_); - } - - void Setup() { memset(&arr_, 0, sizeof(arr_)); } - - void FillMap() { - if (filled_) return; - filled_ = true; - for (size_t i = 0; i < arr_.count; i++) { - // TODO(yangg) handle duplicates? - map_.insert(std::pair<grpc::string_ref, grpc::string_ref>( - StringRefFromSlice(&arr_.metadata[i].key), - StringRefFromSlice(&arr_.metadata[i].value))); - } - } -}; -} // namespace internal - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/metadata_map.h> #endif // GRPCPP_IMPL_CODEGEN_METADATA_MAP_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/method_handler.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/method_handler.h deleted file mode 100644 index 4f00728b57..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/method_handler.h +++ /dev/null @@ -1,406 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H -#define GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H - -// IWYU pragma: private, include <grpcpp/support/method_handler.h> - -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/sync_stream.h> -#include <grpcpp/support/byte_buffer.h> - -namespace grpc { - -namespace internal { - -// Invoke the method handler, fill in the status, and -// return whether or not we finished safely (without an exception). -// Note that exception handling is 0-cost in most compiler/library -// implementations (except when an exception is actually thrown), -// so this process doesn't require additional overhead in the common case. -// Additionally, we don't need to return if we caught an exception or not; -// the handling is the same in either case. -template <class Callable> -::grpc::Status CatchingFunctionHandler(Callable&& handler) { -#if GRPC_ALLOW_EXCEPTIONS - try { - return handler(); - } catch (...) { - return grpc::Status(grpc::StatusCode::UNKNOWN, - "Unexpected error in RPC handling"); - } -#else // GRPC_ALLOW_EXCEPTIONS - return handler(); -#endif // GRPC_ALLOW_EXCEPTIONS -} - -/// A helper function with reduced templating to do the common work needed to -/// actually send the server response. Uses non-const parameter for Status since -/// this should only ever be called from the end of the RunHandler method. - -template <class ResponseType> -void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter& param, - ResponseType* rsp, grpc::Status& status) { - GPR_CODEGEN_ASSERT(!param.server_context->sent_initial_metadata_); - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpServerSendStatus> - ops; - ops.SendInitialMetadata(¶m.server_context->initial_metadata_, - param.server_context->initial_metadata_flags()); - if (param.server_context->compression_level_set()) { - ops.set_compression_level(param.server_context->compression_level()); - } - if (status.ok()) { - status = ops.SendMessagePtr(rsp); - } - ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); - param.call->PerformOps(&ops); - param.call->cq()->Pluck(&ops); -} - -/// A helper function with reduced templating to do deserializing. - -template <class RequestType> -void* UnaryDeserializeHelper(grpc_byte_buffer* req, grpc::Status* status, - RequestType* request) { - grpc::ByteBuffer buf; - buf.set_buffer(req); - *status = grpc::SerializationTraits<RequestType>::Deserialize( - &buf, static_cast<RequestType*>(request)); - buf.Release(); - if (status->ok()) { - return request; - } - request->~RequestType(); - return nullptr; -} - -/// A wrapper class of an application provided rpc method handler. -template <class ServiceType, class RequestType, class ResponseType, - class BaseRequestType = RequestType, - class BaseResponseType = ResponseType> -class RpcMethodHandler : public grpc::internal::MethodHandler { - public: - RpcMethodHandler( - std::function<grpc::Status(ServiceType*, grpc::ServerContext*, - const RequestType*, ResponseType*)> - func, - ServiceType* service) - : func_(func), service_(service) {} - - void RunHandler(const HandlerParameter& param) final { - ResponseType rsp; - grpc::Status status = param.status; - if (status.ok()) { - status = CatchingFunctionHandler([this, ¶m, &rsp] { - return func_(service_, - static_cast<grpc::ServerContext*>(param.server_context), - static_cast<RequestType*>(param.request), &rsp); - }); - static_cast<RequestType*>(param.request)->~RequestType(); - } - UnaryRunHandlerHelper(param, static_cast<BaseResponseType*>(&rsp), status); - } - - void* Deserialize(grpc_call* call, grpc_byte_buffer* req, - grpc::Status* status, void** /*handler_data*/) final { - auto* request = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call, sizeof(RequestType))) RequestType; - return UnaryDeserializeHelper(req, status, - static_cast<BaseRequestType*>(request)); - } - - private: - /// Application provided rpc handler function. - std::function<grpc::Status(ServiceType*, grpc::ServerContext*, - const RequestType*, ResponseType*)> - func_; - // The class the above handler function lives in. - ServiceType* service_; -}; - -/// A wrapper class of an application provided client streaming handler. -template <class ServiceType, class RequestType, class ResponseType> -class ClientStreamingHandler : public grpc::internal::MethodHandler { - public: - ClientStreamingHandler( - std::function<grpc::Status(ServiceType*, grpc::ServerContext*, - ServerReader<RequestType>*, ResponseType*)> - func, - ServiceType* service) - : func_(func), service_(service) {} - - void RunHandler(const HandlerParameter& param) final { - ServerReader<RequestType> reader( - param.call, static_cast<grpc::ServerContext*>(param.server_context)); - ResponseType rsp; - grpc::Status status = - CatchingFunctionHandler([this, ¶m, &reader, &rsp] { - return func_(service_, - static_cast<grpc::ServerContext*>(param.server_context), - &reader, &rsp); - }); - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpServerSendStatus> - ops; - if (!param.server_context->sent_initial_metadata_) { - ops.SendInitialMetadata(¶m.server_context->initial_metadata_, - param.server_context->initial_metadata_flags()); - if (param.server_context->compression_level_set()) { - ops.set_compression_level(param.server_context->compression_level()); - } - } - if (status.ok()) { - status = ops.SendMessagePtr(&rsp); - } - ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); - param.call->PerformOps(&ops); - param.call->cq()->Pluck(&ops); - } - - private: - std::function<grpc::Status(ServiceType*, grpc::ServerContext*, - ServerReader<RequestType>*, ResponseType*)> - func_; - ServiceType* service_; -}; - -/// A wrapper class of an application provided server streaming handler. -template <class ServiceType, class RequestType, class ResponseType> -class ServerStreamingHandler : public grpc::internal::MethodHandler { - public: - ServerStreamingHandler(std::function<grpc::Status( - ServiceType*, grpc::ServerContext*, - const RequestType*, ServerWriter<ResponseType>*)> - func, - ServiceType* service) - : func_(func), service_(service) {} - - void RunHandler(const HandlerParameter& param) final { - grpc::Status status = param.status; - if (status.ok()) { - ServerWriter<ResponseType> writer( - param.call, static_cast<grpc::ServerContext*>(param.server_context)); - status = CatchingFunctionHandler([this, ¶m, &writer] { - return func_(service_, - static_cast<grpc::ServerContext*>(param.server_context), - static_cast<RequestType*>(param.request), &writer); - }); - static_cast<RequestType*>(param.request)->~RequestType(); - } - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpServerSendStatus> - ops; - if (!param.server_context->sent_initial_metadata_) { - ops.SendInitialMetadata(¶m.server_context->initial_metadata_, - param.server_context->initial_metadata_flags()); - if (param.server_context->compression_level_set()) { - ops.set_compression_level(param.server_context->compression_level()); - } - } - ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); - param.call->PerformOps(&ops); - if (param.server_context->has_pending_ops_) { - param.call->cq()->Pluck(¶m.server_context->pending_ops_); - } - param.call->cq()->Pluck(&ops); - } - - void* Deserialize(grpc_call* call, grpc_byte_buffer* req, - grpc::Status* status, void** /*handler_data*/) final { - grpc::ByteBuffer buf; - buf.set_buffer(req); - auto* request = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call, sizeof(RequestType))) RequestType(); - *status = - grpc::SerializationTraits<RequestType>::Deserialize(&buf, request); - buf.Release(); - if (status->ok()) { - return request; - } - request->~RequestType(); - return nullptr; - } - - private: - std::function<grpc::Status(ServiceType*, grpc::ServerContext*, - const RequestType*, ServerWriter<ResponseType>*)> - func_; - ServiceType* service_; -}; - -/// A wrapper class of an application provided bidi-streaming handler. -/// This also applies to server-streamed implementation of a unary method -/// with the additional requirement that such methods must have done a -/// write for status to be ok -/// Since this is used by more than 1 class, the service is not passed in. -/// Instead, it is expected to be an implicitly-captured argument of func -/// (through bind or something along those lines) -template <class Streamer, bool WriteNeeded> -class TemplatedBidiStreamingHandler : public grpc::internal::MethodHandler { - public: - explicit TemplatedBidiStreamingHandler( - std::function<grpc::Status(grpc::ServerContext*, Streamer*)> func) - : func_(func), write_needed_(WriteNeeded) {} - - void RunHandler(const HandlerParameter& param) final { - Streamer stream(param.call, - static_cast<grpc::ServerContext*>(param.server_context)); - grpc::Status status = CatchingFunctionHandler([this, ¶m, &stream] { - return func_(static_cast<grpc::ServerContext*>(param.server_context), - &stream); - }); - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpServerSendStatus> - ops; - if (!param.server_context->sent_initial_metadata_) { - ops.SendInitialMetadata(¶m.server_context->initial_metadata_, - param.server_context->initial_metadata_flags()); - if (param.server_context->compression_level_set()) { - ops.set_compression_level(param.server_context->compression_level()); - } - if (write_needed_ && status.ok()) { - // If we needed a write but never did one, we need to mark the - // status as a fail - status = grpc::Status(grpc::StatusCode::INTERNAL, - "Service did not provide response message"); - } - } - ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); - param.call->PerformOps(&ops); - if (param.server_context->has_pending_ops_) { - param.call->cq()->Pluck(¶m.server_context->pending_ops_); - } - param.call->cq()->Pluck(&ops); - } - - private: - std::function<grpc::Status(grpc::ServerContext*, Streamer*)> func_; - const bool write_needed_; -}; - -template <class ServiceType, class RequestType, class ResponseType> -class BidiStreamingHandler - : public TemplatedBidiStreamingHandler< - ServerReaderWriter<ResponseType, RequestType>, false> { - public: - BidiStreamingHandler(std::function<grpc::Status( - ServiceType*, grpc::ServerContext*, - ServerReaderWriter<ResponseType, RequestType>*)> - func, - ServiceType* service) - // TODO(vjpai): When gRPC supports C++14, move-capture func in the below - : TemplatedBidiStreamingHandler< - ServerReaderWriter<ResponseType, RequestType>, false>( - [func, service]( - grpc::ServerContext* ctx, - ServerReaderWriter<ResponseType, RequestType>* streamer) { - return func(service, ctx, streamer); - }) {} -}; - -template <class RequestType, class ResponseType> -class StreamedUnaryHandler - : public TemplatedBidiStreamingHandler< - ServerUnaryStreamer<RequestType, ResponseType>, true> { - public: - explicit StreamedUnaryHandler( - std::function< - grpc::Status(grpc::ServerContext*, - ServerUnaryStreamer<RequestType, ResponseType>*)> - func) - : TemplatedBidiStreamingHandler< - ServerUnaryStreamer<RequestType, ResponseType>, true>( - std::move(func)) {} -}; - -template <class RequestType, class ResponseType> -class SplitServerStreamingHandler - : public TemplatedBidiStreamingHandler< - ServerSplitStreamer<RequestType, ResponseType>, false> { - public: - explicit SplitServerStreamingHandler( - std::function< - grpc::Status(grpc::ServerContext*, - ServerSplitStreamer<RequestType, ResponseType>*)> - func) - : TemplatedBidiStreamingHandler< - ServerSplitStreamer<RequestType, ResponseType>, false>( - std::move(func)) {} -}; - -/// General method handler class for errors that prevent real method use -/// e.g., handle unknown method by returning UNIMPLEMENTED error. -template <grpc::StatusCode code> -class ErrorMethodHandler : public grpc::internal::MethodHandler { - public: - explicit ErrorMethodHandler(const TString& message) : message_(message) {} - - template <class T> - static void FillOps(grpc::ServerContextBase* context, - const TString& message, T* ops) { - grpc::Status status(code, message); - if (!context->sent_initial_metadata_) { - ops->SendInitialMetadata(&context->initial_metadata_, - context->initial_metadata_flags()); - if (context->compression_level_set()) { - ops->set_compression_level(context->compression_level()); - } - context->sent_initial_metadata_ = true; - } - ops->ServerSendStatus(&context->trailing_metadata_, status); - } - - void RunHandler(const HandlerParameter& param) final { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpServerSendStatus> - ops; - FillOps(param.server_context, message_, &ops); - param.call->PerformOps(&ops); - param.call->cq()->Pluck(&ops); - } - - void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, - grpc::Status* /*status*/, void** /*handler_data*/) final { - // We have to destroy any request payload - if (req != nullptr) { - grpc::g_core_codegen_interface->grpc_byte_buffer_destroy(req); - } - return nullptr; - } - - private: - const TString message_; -}; - -typedef ErrorMethodHandler<grpc::StatusCode::UNIMPLEMENTED> - UnknownMethodHandler; -typedef ErrorMethodHandler<grpc::StatusCode::RESOURCE_EXHAUSTED> - ResourceExhaustedHandler; - -} // namespace internal -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_METHOD_HANDLER_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_utils.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_utils.h index 9f9eb77b53..e5c57a4025 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_utils.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_utils.h @@ -1,121 +1,27 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H #define GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H // IWYU pragma: private -#include <type_traits> - -#include <grpc/impl/codegen/byte_buffer_reader.h> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpc/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/config_protobuf.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/proto_buffer_reader.h> -#include <grpcpp/impl/codegen/proto_buffer_writer.h> -#include <grpcpp/impl/codegen/serialization_traits.h> -#include <grpcpp/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/support/byte_buffer.h> - -/// This header provides serialization and deserialization between gRPC -/// messages serialized using protobuf and the C++ objects they represent. - -namespace grpc { - -extern CoreCodegenInterface* g_core_codegen_interface; - -// ProtoBufferWriter must be a subclass of ::protobuf::io::ZeroCopyOutputStream. -template <class ProtoBufferWriter, class T> -Status GenericSerialize(const grpc::protobuf::MessageLite& msg, ByteBuffer* bb, - bool* own_buffer) { - static_assert(std::is_base_of<protobuf::io::ZeroCopyOutputStream, - ProtoBufferWriter>::value, - "ProtoBufferWriter must be a subclass of " - "::protobuf::io::ZeroCopyOutputStream"); - *own_buffer = true; - int byte_size = static_cast<int>(msg.ByteSizeLong()); - if (static_cast<size_t>(byte_size) <= GRPC_SLICE_INLINED_SIZE) { - Slice slice(byte_size); - // We serialize directly into the allocated slices memory - GPR_CODEGEN_ASSERT(slice.end() == msg.SerializeWithCachedSizesToArray( - const_cast<uint8_t*>(slice.begin()))); - ByteBuffer tmp(&slice, 1); - bb->Swap(&tmp); - - return g_core_codegen_interface->ok(); - } - ProtoBufferWriter writer(bb, kProtoBufferWriterMaxBufferLength, byte_size); - return msg.SerializeToZeroCopyStream(&writer) - ? g_core_codegen_interface->ok() - : Status(StatusCode::INTERNAL, "Failed to serialize message"); -} - -// BufferReader must be a subclass of ::protobuf::io::ZeroCopyInputStream. -template <class ProtoBufferReader, class T> -Status GenericDeserialize(ByteBuffer* buffer, - grpc::protobuf::MessageLite* msg) { - static_assert(std::is_base_of<protobuf::io::ZeroCopyInputStream, - ProtoBufferReader>::value, - "ProtoBufferReader must be a subclass of " - "::protobuf::io::ZeroCopyInputStream"); - if (buffer == nullptr) { - return Status(StatusCode::INTERNAL, "No payload"); - } - Status result = g_core_codegen_interface->ok(); - { - ProtoBufferReader reader(buffer); - if (!reader.status().ok()) { - return reader.status(); - } - if (!msg->ParseFromZeroCopyStream(&reader)) { - result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); - } - } - buffer->Clear(); - return result; -} - -// this is needed so the following class does not conflict with protobuf -// serializers that utilize internal-only tools. -#ifdef GRPC_OPEN_SOURCE_PROTO -// This class provides a protobuf serializer. It translates between protobuf -// objects and grpc_byte_buffers. More information about SerializationTraits can -// be found in include/grpcpp/impl/codegen/serialization_traits.h. -template <class T> -class SerializationTraits< - T, typename std::enable_if< - std::is_base_of<grpc::protobuf::MessageLite, T>::value>::type> { - public: - static Status Serialize(const grpc::protobuf::MessageLite& msg, - ByteBuffer* bb, bool* own_buffer) { - return GenericSerialize<ProtoBufferWriter, T>(msg, bb, own_buffer); - } - - static Status Deserialize(ByteBuffer* buffer, - grpc::protobuf::MessageLite* msg) { - return GenericDeserialize<ProtoBufferReader, T>(buffer, msg); - } -}; -#endif - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/proto_utils.h> #endif // GRPCPP_IMPL_CODEGEN_PROTO_UTILS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_method.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_method.h deleted file mode 100644 index 83dedda42c..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_method.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_RPC_METHOD_H -#define GRPCPP_IMPL_CODEGEN_RPC_METHOD_H - -// IWYU pragma: private, include <grpcpp/impl/rpc_method.h> - -#include <memory> - -#include <grpcpp/impl/codegen/channel_interface.h> - -namespace grpc { -namespace internal { -/// Descriptor of an RPC method -class RpcMethod { - public: - enum RpcType { - NORMAL_RPC = 0, - CLIENT_STREAMING, // request streaming - SERVER_STREAMING, // response streaming - BIDI_STREAMING - }; - - RpcMethod(const char* name, RpcType type) - : name_(name), - suffix_for_stats_(nullptr), - method_type_(type), - channel_tag_(nullptr) {} - - RpcMethod(const char* name, const char* suffix_for_stats, RpcType type) - : name_(name), - suffix_for_stats_(suffix_for_stats), - method_type_(type), - channel_tag_(nullptr) {} - - RpcMethod(const char* name, RpcType type, - const std::shared_ptr<ChannelInterface>& channel) - : name_(name), - suffix_for_stats_(nullptr), - method_type_(type), - channel_tag_(channel->RegisterMethod(name)) {} - - RpcMethod(const char* name, const char* suffix_for_stats, RpcType type, - const std::shared_ptr<ChannelInterface>& channel) - : name_(name), - suffix_for_stats_(suffix_for_stats), - method_type_(type), - channel_tag_(channel->RegisterMethod(name)) {} - - const char* name() const { return name_; } - const char* suffix_for_stats() const { return suffix_for_stats_; } - RpcType method_type() const { return method_type_; } - void SetMethodType(RpcType type) { method_type_ = type; } - void* channel_tag() const { return channel_tag_; } - - private: - const char* const name_; - const char* const suffix_for_stats_; - RpcType method_type_; - void* const channel_tag_; -}; - -} // namespace internal -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_RPC_METHOD_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_service_method.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_service_method.h index 2aa7774ab5..d6f6c5da94 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_service_method.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/rpc_service_method.h @@ -1,155 +1,27 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H #define GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H -// IWYU pragma: private, include <grpcpp/impl/rpc_service_method.h> +// IWYU pragma: private -#include <climits> -#include <functional> -#include <map> -#include <memory> -#include <vector> - -#include <grpc/impl/codegen/log.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/rpc_method.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/support/byte_buffer.h> - -namespace grpc { -class ServerContextBase; -namespace internal { -/// Base class for running an RPC handler. -class MethodHandler { - public: - virtual ~MethodHandler() {} - struct HandlerParameter { - /// Constructor for HandlerParameter - /// - /// \param c : the gRPC Call structure for this server call - /// \param context : the ServerContext structure for this server call - /// \param req : the request payload, if appropriate for this RPC - /// \param req_status : the request status after any interceptors have run - /// \param handler_data: internal data for the handler. - /// \param requester : used only by the callback API. It is a function - /// called by the RPC Controller to request another RPC (and also - /// to set up the state required to make that request possible) - HandlerParameter(Call* c, grpc::ServerContextBase* context, void* req, - Status req_status, void* handler_data, - std::function<void()> requester) - : call(c), - server_context(context), - request(req), - status(req_status), - internal_data(handler_data), - call_requester(std::move(requester)) {} - ~HandlerParameter() {} - Call* const call; - grpc::ServerContextBase* const server_context; - void* const request; - const Status status; - void* const internal_data; - const std::function<void()> call_requester; - }; - virtual void RunHandler(const HandlerParameter& param) = 0; - - /* Returns a pointer to the deserialized request. \a status reflects the - result of deserialization. This pointer and the status should be filled in - a HandlerParameter and passed to RunHandler. It is illegal to access the - pointer after calling RunHandler. Ownership of the deserialized request is - retained by the handler. Returns nullptr if deserialization failed. */ - virtual void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, - Status* /*status*/, void** /*handler_data*/) { - GPR_CODEGEN_ASSERT(req == nullptr); - return nullptr; - } -}; - -/// Server side rpc method class -class RpcServiceMethod : public RpcMethod { - public: - /// Takes ownership of the handler - RpcServiceMethod(const char* name, RpcMethod::RpcType type, - MethodHandler* handler) - : RpcMethod(name, type), - server_tag_(nullptr), - api_type_(ApiType::SYNC), - handler_(handler) {} - - enum class ApiType { - SYNC, - ASYNC, - RAW, - CALL_BACK, // not CALLBACK because that is reserved in Windows - RAW_CALL_BACK, - }; - - void set_server_tag(void* tag) { server_tag_ = tag; } - void* server_tag() const { return server_tag_; } - /// if MethodHandler is nullptr, then this is an async method - MethodHandler* handler() const { return handler_.get(); } - ApiType api_type() const { return api_type_; } - void SetHandler(MethodHandler* handler) { handler_.reset(handler); } - void SetServerApiType(RpcServiceMethod::ApiType type) { - if ((api_type_ == ApiType::SYNC) && - (type == ApiType::ASYNC || type == ApiType::RAW)) { - // this marks this method as async - handler_.reset(); - } else if (api_type_ != ApiType::SYNC) { - // this is not an error condition, as it allows users to declare a server - // like WithRawMethod_foo<AsyncService>. However since it - // overwrites behavior, it should be logged. - gpr_log( - GPR_INFO, - "You are marking method %s as '%s', even though it was " - "previously marked '%s'. This behavior will overwrite the original " - "behavior. If you expected this then ignore this message.", - name(), TypeToString(api_type_), TypeToString(type)); - } - api_type_ = type; - } - - private: - void* server_tag_; - ApiType api_type_; - std::unique_ptr<MethodHandler> handler_; - - const char* TypeToString(RpcServiceMethod::ApiType type) { - switch (type) { - case ApiType::SYNC: - return "sync"; - case ApiType::ASYNC: - return "async"; - case ApiType::RAW: - return "raw"; - case ApiType::CALL_BACK: - return "callback"; - case ApiType::RAW_CALL_BACK: - return "raw_callback"; - default: - GPR_UNREACHABLE_CODE(return "unknown"); - } - } -}; -} // namespace internal - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/rpc_service_method.h> #endif // GRPCPP_IMPL_CODEGEN_RPC_SERVICE_METHOD_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/security/auth_context.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/security/auth_context.h deleted file mode 100644 index 8343832c27..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/security/auth_context.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H -#define GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H - -// IWYU pragma: private, include <grpcpp/security/auth_context.h> - -#include <iterator> -#include <vector> - -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/string_ref.h> - -struct grpc_auth_context; -struct grpc_auth_property; -struct grpc_auth_property_iterator; - -namespace grpc { -class SecureAuthContext; - -typedef std::pair<string_ref, string_ref> AuthProperty; - -class AuthPropertyIterator { - public: - using iterator_category = std::forward_iterator_tag; - using value_type = const AuthProperty; - using pointer = void; - using reference = void; - using difference_type = std::ptrdiff_t; - - ~AuthPropertyIterator(); - AuthPropertyIterator& operator++(); - AuthPropertyIterator operator++(int); - bool operator==(const AuthPropertyIterator& rhs) const; - bool operator!=(const AuthPropertyIterator& rhs) const; - AuthProperty operator*(); - - protected: - AuthPropertyIterator(); - AuthPropertyIterator(const grpc_auth_property* property, - const grpc_auth_property_iterator* iter); - - private: - friend class SecureAuthContext; - const grpc_auth_property* property_; - // The following items form a grpc_auth_property_iterator. - const grpc_auth_context* ctx_; - size_t index_; - const char* name_; -}; - -/// Class encapsulating the Authentication Information. -/// -/// It includes the secure identity of the peer, the type of secure transport -/// used as well as any other properties required by the authorization layer. -class AuthContext { - public: - virtual ~AuthContext() {} - - /// Returns true if the peer is authenticated. - virtual bool IsPeerAuthenticated() const = 0; - - /// A peer identity. - /// - /// It is, in general, comprised of one or more properties (in which case they - /// have the same name). - virtual std::vector<grpc::string_ref> GetPeerIdentity() const = 0; - virtual TString GetPeerIdentityPropertyName() const = 0; - - /// Returns all the property values with the given name. - virtual std::vector<grpc::string_ref> FindPropertyValues( - const TString& name) const = 0; - - /// Iteration over all the properties. - virtual AuthPropertyIterator begin() const = 0; - virtual AuthPropertyIterator end() const = 0; - - /// Mutation functions: should only be used by an AuthMetadataProcessor. - virtual void AddProperty(const TString& key, const string_ref& value) = 0; - virtual bool SetPeerIdentityPropertyName(const TString& name) = 0; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SECURITY_AUTH_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/serialization_traits.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/serialization_traits.h deleted file mode 100644 index 3148dffc80..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/serialization_traits.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H -#define GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H - -// IWYU pragma: private, include <grpcpp/impl/serialization_traits.h> - -namespace grpc { - -/// Defines how to serialize and deserialize some type. -/// -/// Used for hooking different message serialization API's into GRPC. -/// Each SerializationTraits<Message> implementation must provide the -/// following functions: -/// 1. static Status Serialize(const Message& msg, -/// ByteBuffer* buffer, -/// bool* own_buffer); -/// OR -/// static Status Serialize(const Message& msg, -/// grpc_byte_buffer** buffer, -/// bool* own_buffer); -/// The former is preferred; the latter is deprecated -/// -/// 2. static Status Deserialize(ByteBuffer* buffer, -/// Message* msg); -/// OR -/// static Status Deserialize(grpc_byte_buffer* buffer, -/// Message* msg); -/// The former is preferred; the latter is deprecated -/// -/// Serialize is required to convert message to a ByteBuffer, and -/// return that byte buffer through *buffer. *own_buffer should -/// be set to true if the caller owns said byte buffer, or false if -/// ownership is retained elsewhere. -/// -/// Deserialize is required to convert buffer into the message stored at -/// msg. max_receive_message_size is passed in as a bound on the maximum -/// number of message bytes Deserialize should accept. -/// -/// Both functions return a Status, allowing them to explain what went -/// wrong if required. -template <class Message, - class UnusedButHereForPartialTemplateSpecialization = void> -class SerializationTraits; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SERIALIZATION_TRAITS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_callback.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/server_callback.h deleted file mode 100644 index 962a27d4cc..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_callback.h +++ /dev/null @@ -1,799 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H -#define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H - -// IWYU pragma: private, include <grpcpp/support/server_callback.h> - -#include <atomic> -#include <functional> -#include <type_traits> - -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_op_set.h> -#include <grpcpp/impl/codegen/callback_common.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/message_allocator.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/sync.h> - -namespace grpc { - -// Declare base class of all reactors as internal -namespace internal { - -// Forward declarations -template <class Request, class Response> -class CallbackUnaryHandler; -template <class Request, class Response> -class CallbackClientStreamingHandler; -template <class Request, class Response> -class CallbackServerStreamingHandler; -template <class Request, class Response> -class CallbackBidiHandler; - -class ServerReactor { - public: - virtual ~ServerReactor() = default; - virtual void OnDone() = 0; - virtual void OnCancel() = 0; - - // The following is not API. It is for internal use only and specifies whether - // all reactions of this Reactor can be run without an extra executor - // scheduling. This should only be used for internally-defined reactors with - // trivial reactions. - virtual bool InternalInlineable() { return false; } - - private: - template <class Request, class Response> - friend class CallbackUnaryHandler; - template <class Request, class Response> - friend class CallbackClientStreamingHandler; - template <class Request, class Response> - friend class CallbackServerStreamingHandler; - template <class Request, class Response> - friend class CallbackBidiHandler; -}; - -/// The base class of ServerCallbackUnary etc. -class ServerCallbackCall { - public: - virtual ~ServerCallbackCall() {} - - // This object is responsible for tracking when it is safe to call OnDone and - // OnCancel. OnDone should not be called until the method handler is complete, - // Finish has been called, the ServerContext CompletionOp (which tracks - // cancellation or successful completion) has completed, and all outstanding - // Read/Write actions have seen their reactions. OnCancel should not be called - // until after the method handler is done and the RPC has completed with a - // cancellation. This is tracked by counting how many of these conditions have - // been met and calling OnCancel when none remain unmet. - - // Public versions of MaybeDone: one where we don't know the reactor in - // advance (used for the ServerContext CompletionOp), and one for where we - // know the inlineability of the OnDone reaction. You should set the inline - // flag to true if either the Reactor is InternalInlineable() or if this - // callback is already being forced to run dispatched to an executor - // (typically because it contains additional work than just the MaybeDone). - - void MaybeDone() { - if (GPR_UNLIKELY(Unref() == 1)) { - ScheduleOnDone(reactor()->InternalInlineable()); - } - } - - void MaybeDone(bool inline_ondone) { - if (GPR_UNLIKELY(Unref() == 1)) { - ScheduleOnDone(inline_ondone); - } - } - - // Fast version called with known reactor passed in, used from derived - // classes, typically in non-cancel case - void MaybeCallOnCancel(ServerReactor* reactor) { - if (GPR_UNLIKELY(UnblockCancellation())) { - CallOnCancel(reactor); - } - } - - // Slower version called from object that doesn't know the reactor a priori - // (such as the ServerContext CompletionOp which is formed before the - // reactor). This is used in cancel cases only, so it's ok to be slower and - // invoke a virtual function. - void MaybeCallOnCancel() { - if (GPR_UNLIKELY(UnblockCancellation())) { - CallOnCancel(reactor()); - } - } - - protected: - /// Increases the reference count - void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); } - - private: - virtual ServerReactor* reactor() = 0; - - // CallOnDone performs the work required at completion of the RPC: invoking - // the OnDone function and doing all necessary cleanup. This function is only - // ever invoked on a fully-Unref'fed ServerCallbackCall. - virtual void CallOnDone() = 0; - - // If the OnDone reaction is inlineable, execute it inline. Otherwise send it - // to an executor. - void ScheduleOnDone(bool inline_ondone); - - // If the OnCancel reaction is inlineable, execute it inline. Otherwise send - // it to an executor. - void CallOnCancel(ServerReactor* reactor); - - // Implement the cancellation constraint counter. Return true if OnCancel - // should be called, false otherwise. - bool UnblockCancellation() { - return on_cancel_conditions_remaining_.fetch_sub( - 1, std::memory_order_acq_rel) == 1; - } - - /// Decreases the reference count and returns the previous value - int Unref() { - return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel); - } - - std::atomic_int on_cancel_conditions_remaining_{2}; - std::atomic_int callbacks_outstanding_{ - 3}; // reserve for start, Finish, and CompletionOp -}; - -template <class Request, class Response> -class DefaultMessageHolder : public MessageHolder<Request, Response> { - public: - DefaultMessageHolder() { - this->set_request(&request_obj_); - this->set_response(&response_obj_); - } - void Release() override { - // the object is allocated in the call arena. - this->~DefaultMessageHolder<Request, Response>(); - } - - private: - Request request_obj_; - Response response_obj_; -}; - -} // namespace internal - -// Forward declarations -class ServerUnaryReactor; -template <class Request> -class ServerReadReactor; -template <class Response> -class ServerWriteReactor; -template <class Request, class Response> -class ServerBidiReactor; - -// NOTE: The actual call/stream object classes are provided as API only to -// support mocking. There are no implementations of these class interfaces in -// the API. -class ServerCallbackUnary : public internal::ServerCallbackCall { - public: - ~ServerCallbackUnary() override {} - virtual void Finish(grpc::Status s) = 0; - virtual void SendInitialMetadata() = 0; - - protected: - // Use a template rather than explicitly specifying ServerUnaryReactor to - // delay binding and avoid a circular forward declaration issue - template <class Reactor> - void BindReactor(Reactor* reactor) { - reactor->InternalBindCall(this); - } -}; - -template <class Request> -class ServerCallbackReader : public internal::ServerCallbackCall { - public: - ~ServerCallbackReader() override {} - virtual void Finish(grpc::Status s) = 0; - virtual void SendInitialMetadata() = 0; - virtual void Read(Request* msg) = 0; - - protected: - void BindReactor(ServerReadReactor<Request>* reactor) { - reactor->InternalBindReader(this); - } -}; - -template <class Response> -class ServerCallbackWriter : public internal::ServerCallbackCall { - public: - ~ServerCallbackWriter() override {} - - virtual void Finish(grpc::Status s) = 0; - virtual void SendInitialMetadata() = 0; - virtual void Write(const Response* msg, grpc::WriteOptions options) = 0; - virtual void WriteAndFinish(const Response* msg, grpc::WriteOptions options, - grpc::Status s) = 0; - - protected: - void BindReactor(ServerWriteReactor<Response>* reactor) { - reactor->InternalBindWriter(this); - } -}; - -template <class Request, class Response> -class ServerCallbackReaderWriter : public internal::ServerCallbackCall { - public: - ~ServerCallbackReaderWriter() override {} - - virtual void Finish(grpc::Status s) = 0; - virtual void SendInitialMetadata() = 0; - virtual void Read(Request* msg) = 0; - virtual void Write(const Response* msg, grpc::WriteOptions options) = 0; - virtual void WriteAndFinish(const Response* msg, grpc::WriteOptions options, - grpc::Status s) = 0; - - protected: - void BindReactor(ServerBidiReactor<Request, Response>* reactor) { - reactor->InternalBindStream(this); - } -}; - -// The following classes are the reactor interfaces that are to be implemented -// by the user, returned as the output parameter of the method handler for a -// callback method. Note that none of the classes are pure; all reactions have a -// default empty reaction so that the user class only needs to override those -// reactions that it cares about. The reaction methods will be invoked by the -// library in response to the completion of various operations. Reactions must -// not include blocking operations (such as blocking I/O, starting synchronous -// RPCs, or waiting on condition variables). Reactions may be invoked -// concurrently, except that OnDone is called after all others (assuming proper -// API usage). The reactor may not be deleted until OnDone is called. - -/// \a ServerBidiReactor is the interface for a bidirectional streaming RPC. -template <class Request, class Response> -class ServerBidiReactor : public internal::ServerReactor { - public: - // NOTE: Initializing stream_ as a constructor initializer rather than a - // default initializer because gcc-4.x requires a copy constructor for - // default initializing a templated member, which isn't ok for atomic. - // TODO(vjpai): Switch to default constructor and default initializer when - // gcc-4.x is no longer supported - ServerBidiReactor() : stream_(nullptr) {} - ~ServerBidiReactor() override = default; - - /// Send any initial metadata stored in the RPC context. If not invoked, - /// any initial metadata will be passed along with the first Write or the - /// Finish (if there are no writes). - void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { - ServerCallbackReaderWriter<Request, Response>* stream = - stream_.load(std::memory_order_acquire); - if (stream == nullptr) { - grpc::internal::MutexLock l(&stream_mu_); - stream = stream_.load(std::memory_order_relaxed); - if (stream == nullptr) { - backlog_.send_initial_metadata_wanted = true; - return; - } - } - stream->SendInitialMetadata(); - } - - /// Initiate a read operation. - /// - /// \param[out] req Where to eventually store the read message. Valid when - /// the library calls OnReadDone - void StartRead(Request* req) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { - ServerCallbackReaderWriter<Request, Response>* stream = - stream_.load(std::memory_order_acquire); - if (stream == nullptr) { - grpc::internal::MutexLock l(&stream_mu_); - stream = stream_.load(std::memory_order_relaxed); - if (stream == nullptr) { - backlog_.read_wanted = req; - return; - } - } - stream->Read(req); - } - - /// Initiate a write operation. - /// - /// \param[in] resp The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - void StartWrite(const Response* resp) { - StartWrite(resp, grpc::WriteOptions()); - } - - /// Initiate a write operation with specified options. - /// - /// \param[in] resp The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - /// \param[in] options The WriteOptions to use for writing this message - void StartWrite(const Response* resp, grpc::WriteOptions options) - Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { - ServerCallbackReaderWriter<Request, Response>* stream = - stream_.load(std::memory_order_acquire); - if (stream == nullptr) { - grpc::internal::MutexLock l(&stream_mu_); - stream = stream_.load(std::memory_order_relaxed); - if (stream == nullptr) { - backlog_.write_wanted = resp; - backlog_.write_options_wanted = options; - return; - } - } - stream->Write(resp, options); - } - - /// Initiate a write operation with specified options and final RPC Status, - /// which also causes any trailing metadata for this RPC to be sent out. - /// StartWriteAndFinish is like merging StartWriteLast and Finish into a - /// single step. A key difference, though, is that this operation doesn't have - /// an OnWriteDone reaction - it is considered complete only when OnDone is - /// available. An RPC can either have StartWriteAndFinish or Finish, but not - /// both. - /// - /// \param[in] resp The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnDone is called. - /// \param[in] options The WriteOptions to use for writing this message - /// \param[in] s The status outcome of this RPC - void StartWriteAndFinish(const Response* resp, grpc::WriteOptions options, - grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { - ServerCallbackReaderWriter<Request, Response>* stream = - stream_.load(std::memory_order_acquire); - if (stream == nullptr) { - grpc::internal::MutexLock l(&stream_mu_); - stream = stream_.load(std::memory_order_relaxed); - if (stream == nullptr) { - backlog_.write_and_finish_wanted = true; - backlog_.write_wanted = resp; - backlog_.write_options_wanted = options; - backlog_.status_wanted = std::move(s); - return; - } - } - stream->WriteAndFinish(resp, options, std::move(s)); - } - - /// Inform system of a planned write operation with specified options, but - /// allow the library to schedule the actual write coalesced with the writing - /// of trailing metadata (which takes place on a Finish call). - /// - /// \param[in] resp The message to be written. The library does not take - /// ownership but the caller must ensure that the message is - /// not deleted or modified until OnWriteDone is called. - /// \param[in] options The WriteOptions to use for writing this message - void StartWriteLast(const Response* resp, grpc::WriteOptions options) { - StartWrite(resp, options.set_last_message()); - } - - /// Indicate that the stream is to be finished and the trailing metadata and - /// RPC status are to be sent. Every RPC MUST be finished using either Finish - /// or StartWriteAndFinish (but not both), even if the RPC is already - /// cancelled. - /// - /// \param[in] s The status outcome of this RPC - void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { - ServerCallbackReaderWriter<Request, Response>* stream = - stream_.load(std::memory_order_acquire); - if (stream == nullptr) { - grpc::internal::MutexLock l(&stream_mu_); - stream = stream_.load(std::memory_order_relaxed); - if (stream == nullptr) { - backlog_.finish_wanted = true; - backlog_.status_wanted = std::move(s); - return; - } - } - stream->Finish(std::move(s)); - } - - /// Notifies the application that an explicit StartSendInitialMetadata - /// operation completed. Not used when the sending of initial metadata - /// piggybacks onto the first write. - /// - /// \param[in] ok Was it successful? If false, no further write-side operation - /// will succeed. - virtual void OnSendInitialMetadataDone(bool /*ok*/) {} - - /// Notifies the application that a StartRead operation completed. - /// - /// \param[in] ok Was it successful? If false, no further read-side operation - /// will succeed. - virtual void OnReadDone(bool /*ok*/) {} - - /// Notifies the application that a StartWrite (or StartWriteLast) operation - /// completed. - /// - /// \param[in] ok Was it successful? If false, no further write-side operation - /// will succeed. - virtual void OnWriteDone(bool /*ok*/) {} - - /// Notifies the application that all operations associated with this RPC - /// have completed. This is an override (from the internal base class) but - /// still abstract, so derived classes MUST override it to be instantiated. - void OnDone() override = 0; - - /// Notifies the application that this RPC has been cancelled. This is an - /// override (from the internal base class) but not final, so derived classes - /// should override it if they want to take action. - void OnCancel() override {} - - private: - friend class ServerCallbackReaderWriter<Request, Response>; - // May be overridden by internal implementation details. This is not a public - // customization point. - virtual void InternalBindStream( - ServerCallbackReaderWriter<Request, Response>* stream) { - grpc::internal::MutexLock l(&stream_mu_); - - if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { - stream->SendInitialMetadata(); - } - if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) { - stream->Read(backlog_.read_wanted); - } - if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) { - stream->WriteAndFinish(backlog_.write_wanted, - std::move(backlog_.write_options_wanted), - std::move(backlog_.status_wanted)); - } else { - if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) { - stream->Write(backlog_.write_wanted, - std::move(backlog_.write_options_wanted)); - } - if (GPR_UNLIKELY(backlog_.finish_wanted)) { - stream->Finish(std::move(backlog_.status_wanted)); - } - } - // Set stream_ last so that other functions can use it lock-free - stream_.store(stream, std::memory_order_release); - } - - grpc::internal::Mutex stream_mu_; - // TODO(vjpai): Make stream_or_backlog_ into a std::variant or y_absl::variant - // once C++17 or ABSL is supported since stream and backlog are - // mutually exclusive in this class. Do likewise with the - // remaining reactor classes and their backlogs as well. - std::atomic<ServerCallbackReaderWriter<Request, Response>*> stream_{nullptr}; - struct PreBindBacklog { - bool send_initial_metadata_wanted = false; - bool write_and_finish_wanted = false; - bool finish_wanted = false; - Request* read_wanted = nullptr; - const Response* write_wanted = nullptr; - grpc::WriteOptions write_options_wanted; - grpc::Status status_wanted; - }; - PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(stream_mu_); -}; - -/// \a ServerReadReactor is the interface for a client-streaming RPC. -template <class Request> -class ServerReadReactor : public internal::ServerReactor { - public: - ServerReadReactor() : reader_(nullptr) {} - ~ServerReadReactor() override = default; - - /// The following operation initiations are exactly like ServerBidiReactor. - void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { - ServerCallbackReader<Request>* reader = - reader_.load(std::memory_order_acquire); - if (reader == nullptr) { - grpc::internal::MutexLock l(&reader_mu_); - reader = reader_.load(std::memory_order_relaxed); - if (reader == nullptr) { - backlog_.send_initial_metadata_wanted = true; - return; - } - } - reader->SendInitialMetadata(); - } - void StartRead(Request* req) Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { - ServerCallbackReader<Request>* reader = - reader_.load(std::memory_order_acquire); - if (reader == nullptr) { - grpc::internal::MutexLock l(&reader_mu_); - reader = reader_.load(std::memory_order_relaxed); - if (reader == nullptr) { - backlog_.read_wanted = req; - return; - } - } - reader->Read(req); - } - void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { - ServerCallbackReader<Request>* reader = - reader_.load(std::memory_order_acquire); - if (reader == nullptr) { - grpc::internal::MutexLock l(&reader_mu_); - reader = reader_.load(std::memory_order_relaxed); - if (reader == nullptr) { - backlog_.finish_wanted = true; - backlog_.status_wanted = std::move(s); - return; - } - } - reader->Finish(std::move(s)); - } - - /// The following notifications are exactly like ServerBidiReactor. - virtual void OnSendInitialMetadataDone(bool /*ok*/) {} - virtual void OnReadDone(bool /*ok*/) {} - void OnDone() override = 0; - void OnCancel() override {} - - private: - friend class ServerCallbackReader<Request>; - - // May be overridden by internal implementation details. This is not a public - // customization point. - virtual void InternalBindReader(ServerCallbackReader<Request>* reader) - Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { - grpc::internal::MutexLock l(&reader_mu_); - - if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { - reader->SendInitialMetadata(); - } - if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) { - reader->Read(backlog_.read_wanted); - } - if (GPR_UNLIKELY(backlog_.finish_wanted)) { - reader->Finish(std::move(backlog_.status_wanted)); - } - // Set reader_ last so that other functions can use it lock-free - reader_.store(reader, std::memory_order_release); - } - - grpc::internal::Mutex reader_mu_; - std::atomic<ServerCallbackReader<Request>*> reader_{nullptr}; - struct PreBindBacklog { - bool send_initial_metadata_wanted = false; - bool finish_wanted = false; - Request* read_wanted = nullptr; - grpc::Status status_wanted; - }; - PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(reader_mu_); -}; - -/// \a ServerWriteReactor is the interface for a server-streaming RPC. -template <class Response> -class ServerWriteReactor : public internal::ServerReactor { - public: - ServerWriteReactor() : writer_(nullptr) {} - ~ServerWriteReactor() override = default; - - /// The following operation initiations are exactly like ServerBidiReactor. - void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { - ServerCallbackWriter<Response>* writer = - writer_.load(std::memory_order_acquire); - if (writer == nullptr) { - grpc::internal::MutexLock l(&writer_mu_); - writer = writer_.load(std::memory_order_relaxed); - if (writer == nullptr) { - backlog_.send_initial_metadata_wanted = true; - return; - } - } - writer->SendInitialMetadata(); - } - void StartWrite(const Response* resp) { - StartWrite(resp, grpc::WriteOptions()); - } - void StartWrite(const Response* resp, grpc::WriteOptions options) - Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { - ServerCallbackWriter<Response>* writer = - writer_.load(std::memory_order_acquire); - if (writer == nullptr) { - grpc::internal::MutexLock l(&writer_mu_); - writer = writer_.load(std::memory_order_relaxed); - if (writer == nullptr) { - backlog_.write_wanted = resp; - backlog_.write_options_wanted = options; - return; - } - } - writer->Write(resp, options); - } - void StartWriteAndFinish(const Response* resp, grpc::WriteOptions options, - grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { - ServerCallbackWriter<Response>* writer = - writer_.load(std::memory_order_acquire); - if (writer == nullptr) { - grpc::internal::MutexLock l(&writer_mu_); - writer = writer_.load(std::memory_order_relaxed); - if (writer == nullptr) { - backlog_.write_and_finish_wanted = true; - backlog_.write_wanted = resp; - backlog_.write_options_wanted = options; - backlog_.status_wanted = std::move(s); - return; - } - } - writer->WriteAndFinish(resp, options, std::move(s)); - } - void StartWriteLast(const Response* resp, grpc::WriteOptions options) { - StartWrite(resp, options.set_last_message()); - } - void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { - ServerCallbackWriter<Response>* writer = - writer_.load(std::memory_order_acquire); - if (writer == nullptr) { - grpc::internal::MutexLock l(&writer_mu_); - writer = writer_.load(std::memory_order_relaxed); - if (writer == nullptr) { - backlog_.finish_wanted = true; - backlog_.status_wanted = std::move(s); - return; - } - } - writer->Finish(std::move(s)); - } - - /// The following notifications are exactly like ServerBidiReactor. - virtual void OnSendInitialMetadataDone(bool /*ok*/) {} - virtual void OnWriteDone(bool /*ok*/) {} - void OnDone() override = 0; - void OnCancel() override {} - - private: - friend class ServerCallbackWriter<Response>; - // May be overridden by internal implementation details. This is not a public - // customization point. - virtual void InternalBindWriter(ServerCallbackWriter<Response>* writer) - Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { - grpc::internal::MutexLock l(&writer_mu_); - - if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { - writer->SendInitialMetadata(); - } - if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) { - writer->WriteAndFinish(backlog_.write_wanted, - std::move(backlog_.write_options_wanted), - std::move(backlog_.status_wanted)); - } else { - if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) { - writer->Write(backlog_.write_wanted, - std::move(backlog_.write_options_wanted)); - } - if (GPR_UNLIKELY(backlog_.finish_wanted)) { - writer->Finish(std::move(backlog_.status_wanted)); - } - } - // Set writer_ last so that other functions can use it lock-free - writer_.store(writer, std::memory_order_release); - } - - grpc::internal::Mutex writer_mu_; - std::atomic<ServerCallbackWriter<Response>*> writer_{nullptr}; - struct PreBindBacklog { - bool send_initial_metadata_wanted = false; - bool write_and_finish_wanted = false; - bool finish_wanted = false; - const Response* write_wanted = nullptr; - grpc::WriteOptions write_options_wanted; - grpc::Status status_wanted; - }; - PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(writer_mu_); -}; - -class ServerUnaryReactor : public internal::ServerReactor { - public: - ServerUnaryReactor() : call_(nullptr) {} - ~ServerUnaryReactor() override = default; - - /// StartSendInitialMetadata is exactly like ServerBidiReactor. - void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(call_mu_) { - ServerCallbackUnary* call = call_.load(std::memory_order_acquire); - if (call == nullptr) { - grpc::internal::MutexLock l(&call_mu_); - call = call_.load(std::memory_order_relaxed); - if (call == nullptr) { - backlog_.send_initial_metadata_wanted = true; - return; - } - } - call->SendInitialMetadata(); - } - /// Finish is similar to ServerBidiReactor except for one detail. - /// If the status is non-OK, any message will not be sent. Instead, - /// the client will only receive the status and any trailing metadata. - void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(call_mu_) { - ServerCallbackUnary* call = call_.load(std::memory_order_acquire); - if (call == nullptr) { - grpc::internal::MutexLock l(&call_mu_); - call = call_.load(std::memory_order_relaxed); - if (call == nullptr) { - backlog_.finish_wanted = true; - backlog_.status_wanted = std::move(s); - return; - } - } - call->Finish(std::move(s)); - } - - /// The following notifications are exactly like ServerBidiReactor. - virtual void OnSendInitialMetadataDone(bool /*ok*/) {} - void OnDone() override = 0; - void OnCancel() override {} - - private: - friend class ServerCallbackUnary; - // May be overridden by internal implementation details. This is not a public - // customization point. - virtual void InternalBindCall(ServerCallbackUnary* call) - Y_ABSL_LOCKS_EXCLUDED(call_mu_) { - grpc::internal::MutexLock l(&call_mu_); - - if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { - call->SendInitialMetadata(); - } - if (GPR_UNLIKELY(backlog_.finish_wanted)) { - call->Finish(std::move(backlog_.status_wanted)); - } - // Set call_ last so that other functions can use it lock-free - call_.store(call, std::memory_order_release); - } - - grpc::internal::Mutex call_mu_; - std::atomic<ServerCallbackUnary*> call_{nullptr}; - struct PreBindBacklog { - bool send_initial_metadata_wanted = false; - bool finish_wanted = false; - grpc::Status status_wanted; - }; - PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(call_mu_); -}; - -namespace internal { - -template <class Base> -class FinishOnlyReactor : public Base { - public: - explicit FinishOnlyReactor(grpc::Status s) { this->Finish(std::move(s)); } - void OnDone() override { this->~FinishOnlyReactor(); } -}; - -using UnimplementedUnaryReactor = FinishOnlyReactor<ServerUnaryReactor>; -template <class Request> -using UnimplementedReadReactor = FinishOnlyReactor<ServerReadReactor<Request>>; -template <class Response> -using UnimplementedWriteReactor = - FinishOnlyReactor<ServerWriteReactor<Response>>; -template <class Request, class Response> -using UnimplementedBidiReactor = - FinishOnlyReactor<ServerBidiReactor<Request, Response>>; - -} // namespace internal - -// TODO(vjpai): Remove namespace experimental when last known users are migrated -// off. -namespace experimental { - -template <class Request, class Response> -using ServerBidiReactor = ::grpc::ServerBidiReactor<Request, Response>; - -} // namespace experimental - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_context.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/server_context.h deleted file mode 100644 index 406fc90802..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_context.h +++ /dev/null @@ -1,679 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H -#define GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H - -// IWYU pragma: private, include <grpcpp/server_context.h> - -#include <grpc/impl/codegen/port_platform.h> - -#include <atomic> -#include <cassert> -#include <map> -#include <memory> -#include <type_traits> -#include <vector> - -#include <grpc/impl/codegen/compression_types.h> -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_op_set.h> -#include <grpcpp/impl/codegen/callback_common.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/create_auth_context.h> -#include <grpcpp/impl/codegen/message_allocator.h> -#include <grpcpp/impl/codegen/metadata_map.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/security/auth_context.h> -#include <grpcpp/impl/codegen/server_callback.h> -#include <grpcpp/impl/codegen/server_interceptor.h> -#include <grpcpp/impl/codegen/status.h> -#include <grpcpp/impl/codegen/string_ref.h> -#include <grpcpp/impl/codegen/time.h> - -struct grpc_metadata; -struct grpc_call; -struct census_context; - -namespace grpc { -template <class W, class R> -class ServerAsyncReader; -template <class W> -class ServerAsyncWriter; -template <class W> -class ServerAsyncResponseWriter; -template <class W, class R> -class ServerAsyncReaderWriter; -template <class R> -class ServerReader; -template <class W> -class ServerWriter; - -extern CoreCodegenInterface* g_core_codegen_interface; - -namespace internal { -template <class ServiceType, class RequestType, class ResponseType> -class BidiStreamingHandler; -template <class RequestType, class ResponseType> -class CallbackUnaryHandler; -template <class RequestType, class ResponseType> -class CallbackClientStreamingHandler; -template <class RequestType, class ResponseType> -class CallbackServerStreamingHandler; -template <class RequestType, class ResponseType> -class CallbackBidiHandler; -template <class ServiceType, class RequestType, class ResponseType> -class ClientStreamingHandler; -template <class ResponseType> -void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter&, - ResponseType*, Status&); -template <class ServiceType, class RequestType, class ResponseType, - class BaseRequestType, class BaseResponseType> -class RpcMethodHandler; -template <class Base> -class FinishOnlyReactor; -template <class W, class R> -class ServerReaderWriterBody; -template <class ServiceType, class RequestType, class ResponseType> -class ServerStreamingHandler; -class ServerReactor; -template <class Streamer, bool WriteNeeded> -class TemplatedBidiStreamingHandler; -template <grpc::StatusCode code> -class ErrorMethodHandler; -} // namespace internal - -class ClientContext; -class CompletionQueue; -class GenericServerContext; -class Server; -class ServerInterface; -class ContextAllocator; -class GenericCallbackServerContext; - -namespace internal { -class Call; -} // namespace internal - -namespace testing { -class InteropServerContextInspector; -class ServerContextTestSpouse; -class DefaultReactorTestPeer; -} // namespace testing - -namespace experimental { -class OrcaServerInterceptor; -class CallMetricRecorder; -} // namespace experimental - -/// Base class of ServerContext. -class ServerContextBase { - public: - virtual ~ServerContextBase(); - - /// Return the deadline for the server call. - std::chrono::system_clock::time_point deadline() const { - return grpc::Timespec2Timepoint(deadline_); - } - - /// Return a \a gpr_timespec representation of the server call's deadline. - gpr_timespec raw_deadline() const { return deadline_; } - - /// Add the (\a key, \a value) pair to the initial metadata - /// associated with a server call. These are made available at the client side - /// by the \a grpc::ClientContext::GetServerInitialMetadata() method. - /// - /// \warning This method should only be called before sending initial metadata - /// to the client (which can happen explicitly, or implicitly when sending a - /// a response message or status to the client). - /// - /// \param key The metadata key. If \a value is binary data, it must - /// end in "-bin". - /// \param value The metadata value. If its value is binary, the key name - /// must end in "-bin". - /// - /// Metadata must conform to the following format: - /** - \verbatim - Custom-Metadata -> Binary-Header / ASCII-Header - Binary-Header -> {Header-Name "-bin" } {binary value} - ASCII-Header -> Header-Name ASCII-Value - Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . - ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII - \endverbatim - **/ - void AddInitialMetadata(const TString& key, const TString& value); - - /// Add the (\a key, \a value) pair to the initial metadata - /// associated with a server call. These are made available at the client - /// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method. - /// - /// \warning This method should only be called before sending trailing - /// metadata to the client (which happens when the call is finished and a - /// status is sent to the client). - /// - /// \param key The metadata key. If \a value is binary data, - /// it must end in "-bin". - /// \param value The metadata value. If its value is binary, the key name - /// must end in "-bin". - /// - /// Metadata must conform to the following format: - /** - \verbatim - Custom-Metadata -> Binary-Header / ASCII-Header - Binary-Header -> {Header-Name "-bin" } {binary value} - ASCII-Header -> Header-Name ASCII-Value - Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . - ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII - \endverbatim - **/ - void AddTrailingMetadata(const TString& key, const TString& value); - - /// Return whether this RPC failed before the server could provide its status - /// back to the client. This could be because of explicit API cancellation - /// from the client-side or server-side, because of deadline exceeded, network - /// connection reset, HTTP/2 parameter configuration (e.g., max message size, - /// max connection age), etc. It does NOT include failure due to a non-OK - /// status return from the server application's request handler, including - /// Status::CANCELLED. - /// - /// IsCancelled is always safe to call when using sync or callback API. - /// When using async API, it is only safe to call IsCancelled after - /// the AsyncNotifyWhenDone tag has been delivered. Thread-safe. - bool IsCancelled() const; - - /// Cancel the Call from the server. This is a best-effort API and - /// depending on when it is called, the RPC may still appear successful to - /// the client. For example, if TryCancel() is called on a separate thread, it - /// might race with the server handler which might return success to the - /// client before TryCancel() was even started by the thread. - /// - /// It is the caller's responsibility to prevent such races and ensure that if - /// TryCancel() is called, the serverhandler must return Status::CANCELLED. - /// The only exception is that if the serverhandler is already returning an - /// error status code, it is ok to not return Status::CANCELLED even if - /// TryCancel() was called. - /// - /// For reasons such as the above, it is generally preferred to explicitly - /// finish an RPC by returning Status::CANCELLED rather than using TryCancel. - /// - /// Note that TryCancel() does not change any of the tags that are pending - /// on the completion queue. All pending tags will still be delivered - /// (though their ok result may reflect the effect of cancellation). - void TryCancel() const; - - /// Return a collection of initial metadata key-value pairs sent from the - /// client. Note that keys may happen more than - /// once (ie, a \a std::multimap is returned). - /// - /// It is safe to use this method after initial metadata has been received, - /// Calls always begin with the client sending initial metadata, so this is - /// safe to access as soon as the call has begun on the server side. - /// - /// \return A multimap of initial metadata key-value pairs from the server. - const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata() - const { - return *client_metadata_.map(); - } - - /// Return the compression algorithm to be used by the server call. - grpc_compression_level compression_level() const { - return compression_level_; - } - - /// Set \a level to be the compression level used for the server call. - /// - /// \param level The compression level used for the server call. - void set_compression_level(grpc_compression_level level) { - compression_level_set_ = true; - compression_level_ = level; - } - - /// Return a bool indicating whether the compression level for this call - /// has been set (either implicitly or through a previous call to - /// \a set_compression_level. - bool compression_level_set() const { return compression_level_set_; } - - /// Return the compression algorithm the server call will request be used. - /// Note that the gRPC runtime may decide to ignore this request, for example, - /// due to resource constraints, or if the server is aware the client doesn't - /// support the requested algorithm. - grpc_compression_algorithm compression_algorithm() const { - return compression_algorithm_; - } - /// Set \a algorithm to be the compression algorithm used for the server call. - /// - /// \param algorithm The compression algorithm used for the server call. - void set_compression_algorithm(grpc_compression_algorithm algorithm); - - /// Set the serialized load reporting costs in \a cost_data for the call. - void SetLoadReportingCosts(const std::vector<TString>& cost_data); - - /// Return the authentication context for this server call. - /// - /// \see grpc::AuthContext. - std::shared_ptr<const grpc::AuthContext> auth_context() const { - if (auth_context_ == nullptr) { - auth_context_ = grpc::CreateAuthContext(call_.call); - } - return auth_context_; - } - - /// Return the peer uri in a string. - /// WARNING: this value is never authenticated or subject to any security - /// related code. It must not be used for any authentication related - /// functionality. Instead, use auth_context. - TString peer() const; - - /// Get the census context associated with this server call. - const struct census_context* census_context() const; - - /// Should be used for framework-level extensions only. - /// Applications never need to call this method. - grpc_call* c_call() { return call_.call; } - - /// Get the \a CallMetricRecorder object for the current RPC. - /// Use it to record metrics during your RPC to send back to the - /// client in order to make load balancing decisions. This will - /// return nullptr if the feature hasn't been enabled using - /// \a EnableCallMetricRecording. - experimental::CallMetricRecorder* ExperimentalGetCallMetricRecorder() { - return call_metric_recorder_; - } - - /// EXPERIMENTAL API - /// Returns the call's authority. - grpc::string_ref ExperimentalGetAuthority() const; - - protected: - /// Async only. Has to be called before the rpc starts. - /// Returns the tag in completion queue when the rpc finishes. - /// IsCancelled() can then be called to check whether the rpc was cancelled. - /// TODO(vjpai): Fix this so that the tag is returned even if the call never - /// starts (https://github.com/grpc/grpc/issues/10136). - void AsyncNotifyWhenDone(void* tag) { - has_notify_when_done_tag_ = true; - async_notify_when_done_tag_ = tag; - } - - /// NOTE: This is an API for advanced users who need custom allocators. - /// Get and maybe mutate the allocator state associated with the current RPC. - /// Currently only applicable for callback unary RPC methods. - RpcAllocatorState* GetRpcAllocatorState() { return message_allocator_state_; } - - /// Get a library-owned default unary reactor for use in minimal reaction - /// cases. This supports typical unary RPC usage of providing a response and - /// status. It supports immediate Finish (finish from within the method - /// handler) or delayed Finish (finish called after the method handler - /// invocation). It does not support reacting to cancellation or completion, - /// or early sending of initial metadata. Since this is a library-owned - /// reactor, it should not be delete'd or freed in any way. This is more - /// efficient than creating a user-owned reactor both because of avoiding an - /// allocation and because its minimal reactions are optimized using a core - /// surface flag that allows their reactions to run inline without any - /// thread-hop. - /// - /// This method should not be called more than once or called after return - /// from the method handler. - grpc::ServerUnaryReactor* DefaultReactor() { - // Short-circuit the case where a default reactor was already set up by - // the TestPeer. - if (test_unary_ != nullptr) { - return reinterpret_cast<Reactor*>(&default_reactor_); - } - new (&default_reactor_) Reactor; -#ifndef NDEBUG - bool old = false; - assert(default_reactor_used_.compare_exchange_strong( - old, true, std::memory_order_relaxed)); -#else - default_reactor_used_.store(true, std::memory_order_relaxed); -#endif - return reinterpret_cast<Reactor*>(&default_reactor_); - } - - /// Constructors for use by derived classes - ServerContextBase(); - ServerContextBase(gpr_timespec deadline, grpc_metadata_array* arr); - - void set_context_allocator(ContextAllocator* context_allocator) { - context_allocator_ = context_allocator; - } - - ContextAllocator* context_allocator() const { return context_allocator_; } - - private: - friend class grpc::testing::InteropServerContextInspector; - friend class grpc::testing::ServerContextTestSpouse; - friend class grpc::testing::DefaultReactorTestPeer; - friend class grpc::ServerInterface; - friend class grpc::Server; - template <class W, class R> - friend class grpc::ServerAsyncReader; - template <class W> - friend class grpc::ServerAsyncWriter; - template <class W> - friend class grpc::ServerAsyncResponseWriter; - template <class W, class R> - friend class grpc::ServerAsyncReaderWriter; - template <class R> - friend class grpc::ServerReader; - template <class W> - friend class grpc::ServerWriter; - template <class W, class R> - friend class grpc::internal::ServerReaderWriterBody; - template <class ResponseType> - friend void grpc::internal::UnaryRunHandlerHelper( - const internal::MethodHandler::HandlerParameter& param, ResponseType* rsp, - Status& status); - template <class ServiceType, class RequestType, class ResponseType, - class BaseRequestType, class BaseResponseType> - friend class grpc::internal::RpcMethodHandler; - template <class ServiceType, class RequestType, class ResponseType> - friend class grpc::internal::ClientStreamingHandler; - template <class ServiceType, class RequestType, class ResponseType> - friend class grpc::internal::ServerStreamingHandler; - template <class Streamer, bool WriteNeeded> - friend class grpc::internal::TemplatedBidiStreamingHandler; - template <class RequestType, class ResponseType> - friend class grpc::internal::CallbackUnaryHandler; - template <class RequestType, class ResponseType> - friend class grpc::internal::CallbackClientStreamingHandler; - template <class RequestType, class ResponseType> - friend class grpc::internal::CallbackServerStreamingHandler; - template <class RequestType, class ResponseType> - friend class grpc::internal::CallbackBidiHandler; - template <grpc::StatusCode code> - friend class grpc::internal::ErrorMethodHandler; - template <class Base> - friend class grpc::internal::FinishOnlyReactor; - friend class grpc::ClientContext; - friend class grpc::GenericServerContext; - friend class grpc::GenericCallbackServerContext; - friend class grpc::experimental::OrcaServerInterceptor; - - /// Prevent copying. - ServerContextBase(const ServerContextBase&); - ServerContextBase& operator=(const ServerContextBase&); - - class CompletionOp; - - void BeginCompletionOp( - grpc::internal::Call* call, std::function<void(bool)> callback, - grpc::internal::ServerCallbackCall* callback_controller); - /// Return the tag queued by BeginCompletionOp() - grpc::internal::CompletionQueueTag* GetCompletionOpTag(); - - void set_call(grpc_call* call) { call_.call = call; } - - void BindDeadlineAndMetadata(gpr_timespec deadline, grpc_metadata_array* arr); - - uint32_t initial_metadata_flags() const { return 0; } - - grpc::experimental::ServerRpcInfo* set_server_rpc_info( - const char* method, grpc::internal::RpcMethod::RpcType type, - const std::vector<std::unique_ptr< - grpc::experimental::ServerInterceptorFactoryInterface>>& creators) { - if (!creators.empty()) { - rpc_info_ = new grpc::experimental::ServerRpcInfo(this, method, type); - rpc_info_->RegisterInterceptors(creators); - } - return rpc_info_; - } - - void set_message_allocator_state(RpcAllocatorState* allocator_state) { - message_allocator_state_ = allocator_state; - } - - void MaybeMarkCancelledOnRead() { - if (g_core_codegen_interface->grpc_call_failed_before_recv_message( - call_.call)) { - marked_cancelled_.store(true, std::memory_order_release); - } - } - - void CreateCallMetricRecorder(); - - struct CallWrapper { - ~CallWrapper(); - - grpc_call* call = nullptr; - }; - - // NOTE: call_ must be the first data member of this object so that its - // destructor is the last to be called, since its destructor may unref - // the underlying core call which holds the arena that may be used to - // hold this object. - CallWrapper call_; - - CompletionOp* completion_op_ = nullptr; - bool has_notify_when_done_tag_ = false; - void* async_notify_when_done_tag_ = nullptr; - grpc::internal::CallbackWithSuccessTag completion_tag_; - - gpr_timespec deadline_; - grpc::CompletionQueue* cq_ = nullptr; - bool sent_initial_metadata_ = false; - mutable std::shared_ptr<const grpc::AuthContext> auth_context_; - mutable grpc::internal::MetadataMap client_metadata_; - std::multimap<TString, TString> initial_metadata_; - std::multimap<TString, TString> trailing_metadata_; - - bool compression_level_set_ = false; - grpc_compression_level compression_level_; - grpc_compression_algorithm compression_algorithm_; - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage> - pending_ops_; - bool has_pending_ops_ = false; - - grpc::experimental::ServerRpcInfo* rpc_info_ = nullptr; - RpcAllocatorState* message_allocator_state_ = nullptr; - ContextAllocator* context_allocator_ = nullptr; - experimental::CallMetricRecorder* call_metric_recorder_ = nullptr; - - class Reactor : public grpc::ServerUnaryReactor { - public: - void OnCancel() override {} - void OnDone() override {} - // Override InternalInlineable for this class since its reactions are - // trivial and thus do not need to be run from the executor (triggering a - // thread hop). This should only be used by internal reactors (thus the - // name) and not by user application code. - bool InternalInlineable() override { return true; } - }; - - void SetupTestDefaultReactor(std::function<void(grpc::Status)> func) { - // NOLINTNEXTLINE(modernize-make-unique) - test_unary_.reset(new TestServerCallbackUnary(this, std::move(func))); - } - bool test_status_set() const { - return (test_unary_ != nullptr) && test_unary_->status_set(); - } - grpc::Status test_status() const { return test_unary_->status(); } - - class TestServerCallbackUnary : public grpc::ServerCallbackUnary { - public: - TestServerCallbackUnary(ServerContextBase* ctx, - std::function<void(grpc::Status)> func) - : reactor_(ctx->DefaultReactor()), func_(std::move(func)) { - this->BindReactor(reactor_); - } - void Finish(grpc::Status s) override { - status_ = s; - func_(std::move(s)); - status_set_.store(true, std::memory_order_release); - } - void SendInitialMetadata() override {} - - bool status_set() const { - return status_set_.load(std::memory_order_acquire); - } - grpc::Status status() const { return status_; } - - private: - void CallOnDone() override {} - grpc::internal::ServerReactor* reactor() override { return reactor_; } - - grpc::ServerUnaryReactor* const reactor_; - std::atomic_bool status_set_{false}; - grpc::Status status_; - const std::function<void(grpc::Status s)> func_; - }; - - typename std::aligned_storage<sizeof(Reactor), alignof(Reactor)>::type - default_reactor_; - std::atomic_bool default_reactor_used_{false}; - - std::atomic_bool marked_cancelled_{false}; - - std::unique_ptr<TestServerCallbackUnary> test_unary_; -}; - -/// A ServerContext or CallbackServerContext allows the code implementing a -/// service handler to: -/// -/// - Add custom initial and trailing metadata key-value pairs that will -/// propagated to the client side. -/// - Control call settings such as compression and authentication. -/// - Access metadata coming from the client. -/// - Get performance metrics (ie, census). -/// -/// Context settings are only relevant to the call handler they are supplied to, -/// that is to say, they aren't sticky across multiple calls. Some of these -/// settings, such as the compression options, can be made persistent at server -/// construction time by specifying the appropriate \a ChannelArguments -/// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument. -/// -/// \warning ServerContext instances should \em not be reused across rpcs. -class ServerContext : public ServerContextBase { - public: - ServerContext() {} // for async calls - - using ServerContextBase::AddInitialMetadata; - using ServerContextBase::AddTrailingMetadata; - using ServerContextBase::auth_context; - using ServerContextBase::c_call; - using ServerContextBase::census_context; - using ServerContextBase::client_metadata; - using ServerContextBase::compression_algorithm; - using ServerContextBase::compression_level; - using ServerContextBase::compression_level_set; - using ServerContextBase::deadline; - using ServerContextBase::IsCancelled; - using ServerContextBase::peer; - using ServerContextBase::raw_deadline; - using ServerContextBase::set_compression_algorithm; - using ServerContextBase::set_compression_level; - using ServerContextBase::SetLoadReportingCosts; - using ServerContextBase::TryCancel; - - // Sync/CQ-based Async ServerContext only - using ServerContextBase::AsyncNotifyWhenDone; - - private: - // Constructor for internal use by server only - friend class grpc::Server; - ServerContext(gpr_timespec deadline, grpc_metadata_array* arr) - : ServerContextBase(deadline, arr) {} - - // CallbackServerContext only - using ServerContextBase::DefaultReactor; - using ServerContextBase::GetRpcAllocatorState; - - /// Prevent copying. - ServerContext(const ServerContext&) = delete; - ServerContext& operator=(const ServerContext&) = delete; -}; - -class CallbackServerContext : public ServerContextBase { - public: - /// Public constructors are for direct use only by mocking tests. In practice, - /// these objects will be owned by the library. - CallbackServerContext() {} - - using ServerContextBase::AddInitialMetadata; - using ServerContextBase::AddTrailingMetadata; - using ServerContextBase::auth_context; - using ServerContextBase::c_call; - using ServerContextBase::census_context; - using ServerContextBase::client_metadata; - using ServerContextBase::compression_algorithm; - using ServerContextBase::compression_level; - using ServerContextBase::compression_level_set; - using ServerContextBase::context_allocator; - using ServerContextBase::deadline; - using ServerContextBase::IsCancelled; - using ServerContextBase::peer; - using ServerContextBase::raw_deadline; - using ServerContextBase::set_compression_algorithm; - using ServerContextBase::set_compression_level; - using ServerContextBase::set_context_allocator; - using ServerContextBase::SetLoadReportingCosts; - using ServerContextBase::TryCancel; - - // CallbackServerContext only - using ServerContextBase::DefaultReactor; - using ServerContextBase::GetRpcAllocatorState; - - private: - // Sync/CQ-based Async ServerContext only - using ServerContextBase::AsyncNotifyWhenDone; - - /// Prevent copying. - CallbackServerContext(const CallbackServerContext&) = delete; - CallbackServerContext& operator=(const CallbackServerContext&) = delete; -}; - -/// A CallbackServerContext allows users to use the contents of the -/// CallbackServerContext or GenericCallbackServerContext structure for the -/// callback API. -/// The library will invoke the allocator any time a new call is initiated. -/// and call the Release method after the server OnDone. -class ContextAllocator { - public: - virtual ~ContextAllocator() {} - - virtual CallbackServerContext* NewCallbackServerContext() { return nullptr; } - - virtual GenericCallbackServerContext* NewGenericCallbackServerContext() { - return nullptr; - } - - virtual void Release(CallbackServerContext*) {} - - virtual void Release(GenericCallbackServerContext*) {} -}; - -} // namespace grpc - -static_assert( - std::is_base_of<grpc::ServerContextBase, grpc::ServerContext>::value, - "improper base class"); -static_assert(std::is_base_of<grpc::ServerContextBase, - grpc::CallbackServerContext>::value, - "improper base class"); -static_assert(sizeof(grpc::ServerContextBase) == sizeof(grpc::ServerContext), - "wrong size"); -static_assert(sizeof(grpc::ServerContextBase) == - sizeof(grpc::CallbackServerContext), - "wrong size"); - -#endif // GRPCPP_IMPL_CODEGEN_SERVER_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_interceptor.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/server_interceptor.h deleted file mode 100644 index 3a8fd52acb..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_interceptor.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H -#define GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H - -// IWYU pragma: private, include <grpcpp/support/server_interceptor.h> - -#include <atomic> -#include <vector> - -#include <grpcpp/impl/codegen/interceptor.h> -#include <grpcpp/impl/codegen/rpc_method.h> -#include <grpcpp/impl/codegen/string_ref.h> - -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<Type>(internal::RpcMethod::NORMAL_RPC), - "violated expectation about Type enum"); - static_assert(Type::CLIENT_STREAMING == - static_cast<Type>(internal::RpcMethod::CLIENT_STREAMING), - "violated expectation about Type enum"); - static_assert(Type::SERVER_STREAMING == - static_cast<Type>(internal::RpcMethod::SERVER_STREAMING), - "violated expectation about Type enum"); - static_assert(Type::BIDI_STREAMING == - static_cast<Type>(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>(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<experimental::ServerInterceptorFactoryInterface>>& - creators) { - for (const auto& creator : creators) { - auto* interceptor = creator->CreateServerInterceptor(this); - if (interceptor != nullptr) { - interceptors_.push_back( - std::unique_ptr<experimental::Interceptor>(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<intptr_t> ref_{1}; - std::vector<std::unique_ptr<experimental::Interceptor>> interceptors_; - - friend class internal::InterceptorBatchMethodsImpl; - friend class grpc::ServerContextBase; -}; - -} // namespace experimental -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERCEPTOR_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/service_type.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/service_type.h deleted file mode 100644 index 88bcb4a9e4..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/service_type.h +++ /dev/null @@ -1,238 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H -#define GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H - -// IWYU pragma: private, include <grpcpp/impl/service_type.h> - -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/serialization_traits.h> -#include <grpcpp/impl/codegen/server_interface.h> -#include <grpcpp/impl/codegen/status.h> - -namespace grpc { - -class CompletionQueue; -class ServerContext; -class ServerInterface; - -namespace internal { -class Call; -class ServerAsyncStreamingInterface { - public: - virtual ~ServerAsyncStreamingInterface() {} - - /// Request notification of the sending of initial metadata to the client. - /// Completion will be notified by \a tag on the associated completion - /// queue. This call is optional, but if it is used, it cannot be used - /// concurrently with or after the \a Finish method. - /// - /// \param[in] tag Tag identifying this request. - virtual void SendInitialMetadata(void* tag) = 0; - - private: - friend class grpc::ServerInterface; - virtual void BindCall(Call* call) = 0; -}; -} // namespace internal - -/// Desriptor of an RPC service and its various RPC methods -class Service { - public: - Service() : server_(nullptr) {} - virtual ~Service() {} - - bool has_async_methods() const { - for (const auto& method : methods_) { - if (method && method->handler() == nullptr) { - return true; - } - } - return false; - } - - bool has_synchronous_methods() const { - for (const auto& method : methods_) { - if (method && - method->api_type() == internal::RpcServiceMethod::ApiType::SYNC) { - return true; - } - } - return false; - } - - bool has_callback_methods() const { - for (const auto& method : methods_) { - if (method && (method->api_type() == - internal::RpcServiceMethod::ApiType::CALL_BACK || - method->api_type() == - internal::RpcServiceMethod::ApiType::RAW_CALL_BACK)) { - return true; - } - } - return false; - } - - bool has_generic_methods() const { - for (const auto& method : methods_) { - if (method == nullptr) { - return true; - } - } - return false; - } - - protected: - template <class Message> - void RequestAsyncUnary(int index, grpc::ServerContext* context, - Message* request, - internal::ServerAsyncStreamingInterface* stream, - grpc::CompletionQueue* call_cq, - grpc::ServerCompletionQueue* notification_cq, - void* tag) { - // Typecast the index to size_t for indexing into a vector - // while preserving the API that existed before a compiler - // warning was first seen (grpc/grpc#11664) - size_t idx = static_cast<size_t>(index); - server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, - notification_cq, tag, request); - } - void RequestAsyncClientStreaming( - int index, grpc::ServerContext* context, - internal::ServerAsyncStreamingInterface* stream, - grpc::CompletionQueue* call_cq, - grpc::ServerCompletionQueue* notification_cq, void* tag) { - size_t idx = static_cast<size_t>(index); - server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, - notification_cq, tag); - } - template <class Message> - void RequestAsyncServerStreaming( - int index, grpc::ServerContext* context, Message* request, - internal::ServerAsyncStreamingInterface* stream, - grpc::CompletionQueue* call_cq, - grpc::ServerCompletionQueue* notification_cq, void* tag) { - size_t idx = static_cast<size_t>(index); - server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, - notification_cq, tag, request); - } - void RequestAsyncBidiStreaming( - int index, grpc::ServerContext* context, - internal::ServerAsyncStreamingInterface* stream, - grpc::CompletionQueue* call_cq, - grpc::ServerCompletionQueue* notification_cq, void* tag) { - size_t idx = static_cast<size_t>(index); - server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, - notification_cq, tag); - } - - void AddMethod(internal::RpcServiceMethod* method) { - methods_.emplace_back(method); - } - - void MarkMethodAsync(int index) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT( - methods_[idx].get() != nullptr && - "Cannot mark the method as 'async' because it has already been " - "marked as 'generic'."); - methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::ASYNC); - } - - void MarkMethodRaw(int index) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT(methods_[idx].get() != nullptr && - "Cannot mark the method as 'raw' because it has already " - "been marked as 'generic'."); - methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::RAW); - } - - void MarkMethodGeneric(int index) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT( - methods_[idx]->handler() != nullptr && - "Cannot mark the method as 'generic' because it has already been " - "marked as 'async' or 'raw'."); - methods_[idx].reset(); - } - - void MarkMethodStreamed(int index, internal::MethodHandler* streamed_method) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT(methods_[idx] && methods_[idx]->handler() && - "Cannot mark an async or generic method Streamed"); - methods_[idx]->SetHandler(streamed_method); - - // From the server's point of view, streamed unary is a special - // case of BIDI_STREAMING that has 1 read and 1 write, in that order, - // and split server-side streaming is BIDI_STREAMING with 1 read and - // any number of writes, in that order. - methods_[idx]->SetMethodType(internal::RpcMethod::BIDI_STREAMING); - } - - void MarkMethodCallback(int index, internal::MethodHandler* handler) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT( - methods_[idx].get() != nullptr && - "Cannot mark the method as 'callback' because it has already been " - "marked as 'generic'."); - methods_[idx]->SetHandler(handler); - methods_[idx]->SetServerApiType( - internal::RpcServiceMethod::ApiType::CALL_BACK); - } - - void MarkMethodRawCallback(int index, internal::MethodHandler* handler) { - // This does not have to be a hard error, however no one has approached us - // with a use case yet. Please file an issue if you believe you have one. - size_t idx = static_cast<size_t>(index); - GPR_CODEGEN_ASSERT( - methods_[idx].get() != nullptr && - "Cannot mark the method as 'raw callback' because it has already " - "been marked as 'generic'."); - methods_[idx]->SetHandler(handler); - methods_[idx]->SetServerApiType( - internal::RpcServiceMethod::ApiType::RAW_CALL_BACK); - } - - internal::MethodHandler* GetHandler(int index) { - size_t idx = static_cast<size_t>(index); - return methods_[idx]->handler(); - } - - private: - friend class Server; - friend class ServerInterface; - ServerInterface* server_; - std::vector<std::unique_ptr<internal::RpcServiceMethod>> methods_; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SERVICE_TYPE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/slice.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/slice.h deleted file mode 100644 index 3de44c8f90..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/slice.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SLICE_H -#define GRPCPP_IMPL_CODEGEN_SLICE_H - -// IWYU pragma: private, include <grpcpp/support/slice.h> - -#include <grpc/impl/codegen/slice.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/string_ref.h> - -namespace grpc { - -/// A wrapper around \a grpc_slice. -/// -/// A slice represents a contiguous reference counted array of bytes. -/// It is cheap to take references to a slice, and it is cheap to create a -/// slice pointing to a subset of another slice. -class Slice final { - public: - /// Construct an empty slice. - Slice() : slice_(g_core_codegen_interface->grpc_empty_slice()) {} - /// Destructor - drops one reference. - ~Slice() { g_core_codegen_interface->grpc_slice_unref(slice_); } - - enum AddRef { ADD_REF }; - /// Construct a slice from \a slice, adding a reference. - Slice(grpc_slice slice, AddRef) - : slice_(g_core_codegen_interface->grpc_slice_ref(slice)) {} - - enum StealRef { STEAL_REF }; - /// Construct a slice from \a slice, stealing a reference. - Slice(grpc_slice slice, StealRef) : slice_(slice) {} - - /// Allocate a slice of specified size - explicit Slice(size_t len) - : slice_(g_core_codegen_interface->grpc_slice_malloc(len)) {} - - /// Construct a slice from a copied buffer - Slice(const void* buf, size_t len) - : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( - reinterpret_cast<const char*>(buf), len)) {} - - /// Construct a slice from a copied string - /* NOLINTNEXTLINE(google-explicit-constructor) */ - Slice(const TString& str) - : slice_(g_core_codegen_interface->grpc_slice_from_copied_buffer( - str.c_str(), str.length())) {} - - enum StaticSlice { STATIC_SLICE }; - - /// Construct a slice from a static buffer - Slice(const void* buf, size_t len, StaticSlice) - : slice_(g_core_codegen_interface->grpc_slice_from_static_buffer( - reinterpret_cast<const char*>(buf), len)) {} - - /// Copy constructor, adds a reference. - Slice(const Slice& other) - : slice_(g_core_codegen_interface->grpc_slice_ref(other.slice_)) {} - - /// Move constructor, steals a reference. - Slice(Slice&& other) noexcept : slice_(other.slice_) { - other.slice_ = g_core_codegen_interface->grpc_empty_slice(); - } - - /// Assignment, reference count is unchanged. - Slice& operator=(Slice other) { - std::swap(slice_, other.slice_); - return *this; - } - - /// Create a slice pointing at some data. Calls malloc to allocate a refcount - /// for the object, and arranges that destroy will be called with the - /// user data pointer passed in at destruction. Can be the same as buf or - /// different (e.g., if data is part of a larger structure that must be - /// destroyed when the data is no longer needed) - Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data) - : slice_(g_core_codegen_interface->grpc_slice_new_with_user_data( - buf, len, destroy, user_data)) {} - - /// Specialization of above for common case where buf == user_data - Slice(void* buf, size_t len, void (*destroy)(void*)) - : Slice(buf, len, destroy, buf) {} - - /// Similar to the above but has a destroy that also takes slice length - Slice(void* buf, size_t len, void (*destroy)(void*, size_t)) - : slice_(g_core_codegen_interface->grpc_slice_new_with_len(buf, len, - destroy)) {} - - /// Byte size. - size_t size() const { return GRPC_SLICE_LENGTH(slice_); } - - /// Raw pointer to the beginning (first element) of the slice. - const uint8_t* begin() const { return GRPC_SLICE_START_PTR(slice_); } - - /// Raw pointer to the end (one byte \em past the last element) of the slice. - const uint8_t* end() const { return GRPC_SLICE_END_PTR(slice_); } - - /// Returns a substring of the `slice` as another slice. - Slice sub(size_t begin, size_t end) const { - return Slice(g_core_codegen_interface->grpc_slice_sub(slice_, begin, end), - STEAL_REF); - } - - /// Raw C slice. Caller needs to call grpc_slice_unref when done. - grpc_slice c_slice() const { - return g_core_codegen_interface->grpc_slice_ref(slice_); - } - - private: - friend class ByteBuffer; - - grpc_slice slice_; -}; - -inline grpc::string_ref StringRefFromSlice(const grpc_slice* slice) { - return grpc::string_ref( - reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(*slice)), - GRPC_SLICE_LENGTH(*slice)); -} - -inline TString StringFromCopiedSlice(grpc_slice slice) { - return TString(reinterpret_cast<char*>(GRPC_SLICE_START_PTR(slice)), - GRPC_SLICE_LENGTH(slice)); -} - -inline grpc_slice SliceReferencingString(const TString& str) { - return g_core_codegen_interface->grpc_slice_from_static_buffer(str.data(), - str.length()); -} - -inline grpc_slice SliceFromCopiedString(const TString& str) { - return g_core_codegen_interface->grpc_slice_from_copied_buffer(str.data(), - str.length()); -} - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SLICE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/status.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/status.h index a3ab974a93..0f69185968 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/status.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/status.h @@ -1,141 +1,27 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_STATUS_H #define GRPCPP_IMPL_CODEGEN_STATUS_H -// IWYU pragma: private, include <grpcpp/support/status.h> +// IWYU pragma: private -#include <grpc/impl/codegen/port_platform.h> - -#include <grpc/impl/codegen/status.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/status_code_enum.h> - -namespace grpc { - -/// Did it work? If it didn't, why? -/// -/// See \a grpc::StatusCode for details on the available code and their meaning. -class GRPC_MUST_USE_RESULT_WHEN_USE_STRICT_WARNING Status { - public: - /// Construct an OK instance. - Status() : code_(StatusCode::OK) { - // Static assertions to make sure that the C++ API value correctly - // maps to the core surface API value - static_assert(StatusCode::OK == static_cast<StatusCode>(GRPC_STATUS_OK), - "Mismatched status code"); - static_assert( - StatusCode::CANCELLED == static_cast<StatusCode>(GRPC_STATUS_CANCELLED), - "Mismatched status code"); - static_assert( - StatusCode::UNKNOWN == static_cast<StatusCode>(GRPC_STATUS_UNKNOWN), - "Mismatched status code"); - static_assert(StatusCode::INVALID_ARGUMENT == - static_cast<StatusCode>(GRPC_STATUS_INVALID_ARGUMENT), - "Mismatched status code"); - static_assert(StatusCode::DEADLINE_EXCEEDED == - static_cast<StatusCode>(GRPC_STATUS_DEADLINE_EXCEEDED), - "Mismatched status code"); - static_assert( - StatusCode::NOT_FOUND == static_cast<StatusCode>(GRPC_STATUS_NOT_FOUND), - "Mismatched status code"); - static_assert(StatusCode::ALREADY_EXISTS == - static_cast<StatusCode>(GRPC_STATUS_ALREADY_EXISTS), - "Mismatched status code"); - static_assert(StatusCode::PERMISSION_DENIED == - static_cast<StatusCode>(GRPC_STATUS_PERMISSION_DENIED), - "Mismatched status code"); - static_assert(StatusCode::UNAUTHENTICATED == - static_cast<StatusCode>(GRPC_STATUS_UNAUTHENTICATED), - "Mismatched status code"); - static_assert(StatusCode::RESOURCE_EXHAUSTED == - static_cast<StatusCode>(GRPC_STATUS_RESOURCE_EXHAUSTED), - "Mismatched status code"); - static_assert(StatusCode::FAILED_PRECONDITION == - static_cast<StatusCode>(GRPC_STATUS_FAILED_PRECONDITION), - "Mismatched status code"); - static_assert( - StatusCode::ABORTED == static_cast<StatusCode>(GRPC_STATUS_ABORTED), - "Mismatched status code"); - static_assert(StatusCode::OUT_OF_RANGE == - static_cast<StatusCode>(GRPC_STATUS_OUT_OF_RANGE), - "Mismatched status code"); - static_assert(StatusCode::UNIMPLEMENTED == - static_cast<StatusCode>(GRPC_STATUS_UNIMPLEMENTED), - "Mismatched status code"); - static_assert( - StatusCode::INTERNAL == static_cast<StatusCode>(GRPC_STATUS_INTERNAL), - "Mismatched status code"); - static_assert(StatusCode::UNAVAILABLE == - static_cast<StatusCode>(GRPC_STATUS_UNAVAILABLE), - "Mismatched status code"); - static_assert( - StatusCode::DATA_LOSS == static_cast<StatusCode>(GRPC_STATUS_DATA_LOSS), - "Mismatched status code"); - } - - /// Construct an instance with associated \a code and \a error_message. - /// It is an error to construct an OK status with non-empty \a error_message. - /// Note that \a message is intentionally accepted as a const reference - /// instead of a value (which results in a copy instead of a move) to allow - /// for easy transition to y_absl::Status in the future which accepts an - /// y_absl::string_view as a parameter. - Status(StatusCode code, const TString& error_message) - : code_(code), error_message_(error_message) {} - - /// Construct an instance with \a code, \a error_message and - /// \a error_details. It is an error to construct an OK status with non-empty - /// \a error_message and/or \a error_details. - Status(StatusCode code, const TString& error_message, - const TString& error_details) - : code_(code), - error_message_(error_message), - binary_error_details_(error_details) {} - - // Pre-defined special status objects. - /// An OK pre-defined instance. - static const Status& OK; - /// A CANCELLED pre-defined instance. - static const Status& CANCELLED; - - /// Return the instance's error code. - StatusCode error_code() const { return code_; } - /// Return the instance's error message. - TString error_message() const { return error_message_; } - /// Return the (binary) error details. - // Usually it contains a serialized google.rpc.Status proto. - TString error_details() const { return binary_error_details_; } - - /// Is the status OK? - bool ok() const { return code_ == StatusCode::OK; } - - // Ignores any errors. This method does nothing except potentially suppress - // complaints from any tools that are checking that errors are not dropped on - // the floor. - void IgnoreError() const {} - - private: - StatusCode code_; - TString error_message_; - TString binary_error_details_; -}; - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/support/status.h> #endif // GRPCPP_IMPL_CODEGEN_STATUS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/status_code_enum.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/status_code_enum.h index 6950eab57d..6ed1d8d8cb 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/status_code_enum.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/status_code_enum.h @@ -1,145 +1,27 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H #define GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H // IWYU pragma: private, include <grpcpp/support/status.h> -namespace grpc { - -enum StatusCode { - /// Not an error; returned on success. - OK = 0, - - /// The operation was cancelled (typically by the caller). - CANCELLED = 1, - - /// Unknown error. An example of where this error may be returned is if a - /// Status value received from another address space belongs to an error-space - /// that is not known in this address space. Also errors raised by APIs that - /// do not return enough error information may be converted to this error. - UNKNOWN = 2, - - /// Client specified an invalid argument. Note that this differs from - /// FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are - /// problematic regardless of the state of the system (e.g., a malformed file - /// name). - INVALID_ARGUMENT = 3, - - /// Deadline expired before operation could complete. For operations that - /// change the state of the system, this error may be returned even if the - /// operation has completed successfully. For example, a successful response - /// from a server could have been delayed long enough for the deadline to - /// expire. - DEADLINE_EXCEEDED = 4, - - /// Some requested entity (e.g., file or directory) was not found. - NOT_FOUND = 5, - - /// Some entity that we attempted to create (e.g., file or directory) already - /// exists. - ALREADY_EXISTS = 6, - - /// The caller does not have permission to execute the specified operation. - /// PERMISSION_DENIED must not be used for rejections caused by exhausting - /// some resource (use RESOURCE_EXHAUSTED instead for those errors). - /// PERMISSION_DENIED must not be used if the caller can not be identified - /// (use UNAUTHENTICATED instead for those errors). - PERMISSION_DENIED = 7, - - /// The request does not have valid authentication credentials for the - /// operation. - UNAUTHENTICATED = 16, - - /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the - /// entire file system is out of space. - RESOURCE_EXHAUSTED = 8, - - /// Operation was rejected because the system is not in a state required for - /// the operation's execution. For example, directory to be deleted may be - /// non-empty, an rmdir operation is applied to a non-directory, etc. - /// - /// A litmus test that may help a service implementor in deciding - /// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: - /// (a) Use UNAVAILABLE if the client can retry just the failing call. - /// (b) Use ABORTED if the client should retry at a higher-level - /// (e.g., restarting a read-modify-write sequence). - /// (c) Use FAILED_PRECONDITION if the client should not retry until - /// the system state has been explicitly fixed. E.g., if an "rmdir" - /// fails because the directory is non-empty, FAILED_PRECONDITION - /// should be returned since the client should not retry unless - /// they have first fixed up the directory by deleting files from it. - /// (d) Use FAILED_PRECONDITION if the client performs conditional - /// REST Get/Update/Delete on a resource and the resource on the - /// server does not match the condition. E.g., conflicting - /// read-modify-write on the same resource. - FAILED_PRECONDITION = 9, - - /// The operation was aborted, typically due to a concurrency issue like - /// sequencer check failures, transaction aborts, etc. - /// - /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - /// and UNAVAILABLE. - ABORTED = 10, - - /// Operation was attempted past the valid range. E.g., seeking or reading - /// past end of file. - /// - /// Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed - /// if the system state changes. For example, a 32-bit file system will - /// generate INVALID_ARGUMENT if asked to read at an offset that is not in the - /// range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from - /// an offset past the current file size. - /// - /// There is a fair bit of overlap between FAILED_PRECONDITION and - /// OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) - /// when it applies so that callers who are iterating through a space can - /// easily look for an OUT_OF_RANGE error to detect when they are done. - OUT_OF_RANGE = 11, - - /// Operation is not implemented or not supported/enabled in this service. - UNIMPLEMENTED = 12, - - /// Internal errors. Means some invariants expected by underlying System has - /// been broken. If you see one of these errors, Something is very broken. - INTERNAL = 13, - - /// The service is currently unavailable. This is a most likely a transient - /// condition and may be corrected by retrying with a backoff. Note that it is - /// not always safe to retry non-idempotent operations. - /// - /// \warning Although data MIGHT not have been transmitted when this - /// status occurs, there is NOT A GUARANTEE that the server has not seen - /// anything. So in general it is unsafe to retry on this status code - /// if the call is non-idempotent. - /// - /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, - /// and UNAVAILABLE. - UNAVAILABLE = 14, - - /// Unrecoverable data loss or corruption. - DATA_LOSS = 15, - - /// Force users to include a default branch: - DO_NOT_USE = -1 -}; - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/support/status_code_enum.h> #endif // GRPCPP_IMPL_CODEGEN_STATUS_CODE_ENUM_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/string_ref.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/string_ref.h deleted file mode 100644 index f0bb76ea5c..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/string_ref.h +++ /dev/null @@ -1,154 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_STRING_REF_H -#define GRPCPP_IMPL_CODEGEN_STRING_REF_H - -// IWYU pragma: private, include <grpcpp/support/string_ref.h> - -#include <string.h> - -#include <algorithm> -#include <iosfwd> -#include <iostream> -#include <iterator> - -#include <grpcpp/impl/codegen/config.h> - -#include <util/stream/output.h> - -namespace grpc { - -/// This class is a non owning reference to a string. -/// -/// It should be a strict subset of the upcoming std::string_ref. -/// -/// \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html -/// -/// The constexpr is dropped or replaced with const for legacy compiler -/// compatibility. -class string_ref { - public: - /// types - typedef const char* const_iterator; - typedef std::reverse_iterator<const_iterator> const_reverse_iterator; - - /// constants - const static size_t npos; - - /// construct/copy. - string_ref() : data_(nullptr), length_(0) {} - string_ref(const string_ref& other) - : data_(other.data_), length_(other.length_) {} - // NOLINTNEXTLINE(bugprone-unhandled-self-assignment) - string_ref& operator=(const string_ref& rhs) { - data_ = rhs.data_; - length_ = rhs.length_; - return *this; - } - - /* NOLINTNEXTLINE(google-explicit-constructor) */ - string_ref(const char* s) : data_(s), length_(strlen(s)) {} - string_ref(const char* s, size_t l) : data_(s), length_(l) {} - /* NOLINTNEXTLINE(google-explicit-constructor) */ - string_ref(const TString& s) : data_(s.data()), length_(s.length()) {} - - /// iterators - const_iterator begin() const { return data_; } - const_iterator end() const { return data_ + length_; } - const_iterator cbegin() const { return data_; } - const_iterator cend() const { return data_ + length_; } - const_reverse_iterator rbegin() const { - return const_reverse_iterator(end()); - } - const_reverse_iterator rend() const { - return const_reverse_iterator(begin()); - } - const_reverse_iterator crbegin() const { - return const_reverse_iterator(end()); - } - const_reverse_iterator crend() const { - return const_reverse_iterator(begin()); - } - - /// capacity - size_t size() const { return length_; } - size_t length() const { return length_; } - size_t max_size() const { return length_; } - bool empty() const { return length_ == 0; } - - /// element access - const char* data() const { return data_; } - - /// string operations - int compare(string_ref x) const { - size_t min_size = length_ < x.length_ ? length_ : x.length_; - int r = memcmp(data_, x.data_, min_size); - if (r < 0) return -1; - if (r > 0) return 1; - if (length_ < x.length_) return -1; - if (length_ > x.length_) return 1; - return 0; - } - - bool starts_with(string_ref x) const { - return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0); - } - - bool ends_with(string_ref x) const { - return length_ >= x.length_ && - (memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0); - } - - size_t find(string_ref s) const { - auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend()); - return it == cend() ? npos : std::distance(cbegin(), it); - } - - size_t find(char c) const { - auto it = std::find(cbegin(), cend(), c); - return it == cend() ? npos : std::distance(cbegin(), it); - } - - string_ref substr(size_t pos, size_t n = npos) const { - if (pos > length_) pos = length_; - if (n > (length_ - pos)) n = length_ - pos; - return string_ref(data_ + pos, n); - } - - private: - const char* data_; - size_t length_; -}; - -/// Comparison operators -inline bool operator==(string_ref x, string_ref y) { return x.compare(y) == 0; } -inline bool operator!=(string_ref x, string_ref y) { return x.compare(y) != 0; } -inline bool operator<(string_ref x, string_ref y) { return x.compare(y) < 0; } -inline bool operator<=(string_ref x, string_ref y) { return x.compare(y) <= 0; } -inline bool operator>(string_ref x, string_ref y) { return x.compare(y) > 0; } -inline bool operator>=(string_ref x, string_ref y) { return x.compare(y) >= 0; } - -inline IOutputStream& operator<<(IOutputStream& out, const string_ref& string) { - TString t(string.begin(), string.end()); - return out << t; -} - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_STRING_REF_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/stub_options.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/stub_options.h deleted file mode 100644 index efa1e38ee0..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/stub_options.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H -#define GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H - -// IWYU pragma: private, include <grpcpp/support/stub_options.h> - -namespace grpc { - -/// Useful interface for generated stubs -class StubOptions { - public: - StubOptions() = default; - explicit StubOptions(const char* suffix_for_stats) - : suffix_for_stats_(suffix_for_stats) {} - - void set_suffix_for_stats(const char* suffix_for_stats) { - suffix_for_stats_ = suffix_for_stats; - } - const char* suffix_for_stats() const { return suffix_for_stats_; } - - private: - const char* suffix_for_stats_ = nullptr; -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_STUB_OPTIONS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/sync.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/sync.h index e3954cc731..c4a2c4a43d 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/sync.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/sync.h @@ -1,158 +1,27 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_SYNC_H #define GRPCPP_IMPL_CODEGEN_SYNC_H // IWYU pragma: private -#include <grpc/impl/codegen/port_platform.h> - -#ifdef GPR_HAS_PTHREAD_H -#include <pthread.h> -#endif - -#include <mutex> - -#include "y_absl/synchronization/mutex.h" - -#include <grpc/impl/codegen/log.h> -#include <grpc/impl/codegen/sync.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> - -// The core library is not accessible in C++ codegen headers, and vice versa. -// Thus, we need to have duplicate headers with similar functionality. -// Make sure any change to this file is also reflected in -// src/core/lib/gprpp/sync.h too. -// -// Whenever possible, prefer "src/core/lib/gprpp/sync.h" over this file, -// since in core we do not rely on g_core_codegen_interface and hence do not -// pay the costs of virtual function calls. - -namespace grpc { -namespace internal { - -#ifdef GPR_ABSEIL_SYNC - -using Mutex = y_absl::Mutex; -using MutexLock = y_absl::MutexLock; -using ReleasableMutexLock = y_absl::ReleasableMutexLock; -using CondVar = y_absl::CondVar; - -#else - -class Y_ABSL_LOCKABLE Mutex { - public: - Mutex() { g_core_codegen_interface->gpr_mu_init(&mu_); } - ~Mutex() { g_core_codegen_interface->gpr_mu_destroy(&mu_); } - - Mutex(const Mutex&) = delete; - Mutex& operator=(const Mutex&) = delete; - - void Lock() Y_ABSL_EXCLUSIVE_LOCK_FUNCTION() { - g_core_codegen_interface->gpr_mu_lock(&mu_); - } - void Unlock() Y_ABSL_UNLOCK_FUNCTION() { - g_core_codegen_interface->gpr_mu_unlock(&mu_); - } - - private: - union { - gpr_mu mu_; - std::mutex do_not_use_sth_; -#ifdef GPR_HAS_PTHREAD_H - pthread_mutex_t do_not_use_pth_; -#endif - }; - - friend class CondVar; -}; - -class Y_ABSL_SCOPED_LOCKABLE MutexLock { - public: - explicit MutexLock(Mutex* mu) Y_ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) { - mu_->Lock(); - } - ~MutexLock() Y_ABSL_UNLOCK_FUNCTION() { mu_->Unlock(); } - - MutexLock(const MutexLock&) = delete; - MutexLock& operator=(const MutexLock&) = delete; - - private: - Mutex* const mu_; -}; - -class Y_ABSL_SCOPED_LOCKABLE ReleasableMutexLock { - public: - explicit ReleasableMutexLock(Mutex* mu) Y_ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) - : mu_(mu) { - mu_->Lock(); - } - ~ReleasableMutexLock() Y_ABSL_UNLOCK_FUNCTION() { - if (!released_) mu_->Unlock(); - } - - ReleasableMutexLock(const ReleasableMutexLock&) = delete; - ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete; - - void Release() Y_ABSL_UNLOCK_FUNCTION() { - GPR_DEBUG_ASSERT(!released_); - released_ = true; - mu_->Unlock(); - } - - private: - Mutex* const mu_; - bool released_ = false; -}; - -class CondVar { - public: - CondVar() { g_core_codegen_interface->gpr_cv_init(&cv_); } - ~CondVar() { g_core_codegen_interface->gpr_cv_destroy(&cv_); } - - CondVar(const CondVar&) = delete; - CondVar& operator=(const CondVar&) = delete; - - void Signal() { g_core_codegen_interface->gpr_cv_signal(&cv_); } - void SignalAll() { g_core_codegen_interface->gpr_cv_broadcast(&cv_); } - - void Wait(Mutex* mu) { - g_core_codegen_interface->gpr_cv_wait( - &cv_, &mu->mu_, - g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_REALTIME)); - } - - private: - gpr_cv cv_; -}; - -#endif // GPR_ABSEIL_SYNC - -template <typename Predicate> -GRPC_DEPRECATED("incompatible with thread safety analysis") -static void WaitUntil(CondVar* cv, Mutex* mu, Predicate pred) { - while (!pred()) { - cv->Wait(mu); - } -} - -} // namespace internal -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/impl/sync.h> #endif // GRPCPP_IMPL_CODEGEN_SYNC_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/sync_stream.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/sync_stream.h deleted file mode 100644 index 1235b8de44..0000000000 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/sync_stream.h +++ /dev/null @@ -1,950 +0,0 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H -#define GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H - -// IWYU pragma: private, include <grpcpp/support/sync_stream.h> - -#include <grpcpp/impl/call.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/client_context.h> -#include <grpcpp/impl/codegen/completion_queue.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/server_context.h> -#include <grpcpp/impl/codegen/service_type.h> -#include <grpcpp/impl/codegen/status.h> - -namespace grpc { - -namespace internal { -/// Common interface for all synchronous client side streaming. -class ClientStreamingInterface { - public: - virtual ~ClientStreamingInterface() {} - - /// Block waiting until the stream finishes and a final status of the call is - /// available. - /// - /// It is appropriate to call this method exactly once when both: - /// * the calling code (client-side) has no more message to send - /// (this can be declared implicitly by calling this method, or - /// explicitly through an earlier call to <i>WritesDone</i> method of the - /// class in use, e.g. \a ClientWriterInterface::WritesDone or - /// \a ClientReaderWriterInterface::WritesDone). - /// * there are no more messages to be received from the server (which can - /// be known implicitly, or explicitly from an earlier call to \a - /// ReaderInterface::Read that returned "false"). - /// - /// This function will return either: - /// - when all incoming messages have been read and the server has - /// returned status. - /// - when the server has returned a non-OK status. - /// - OR when the call failed for some reason and the library generated a - /// status. - /// - /// Return values: - /// - \a Status contains the status code, message and details for the call - /// - the \a ClientContext associated with this call is updated with - /// possible trailing metadata sent from the server. - virtual grpc::Status Finish() = 0; -}; - -/// Common interface for all synchronous server side streaming. -class ServerStreamingInterface { - public: - virtual ~ServerStreamingInterface() {} - - /// Block to send initial metadata to client. - /// This call is optional, but if it is used, it cannot be used concurrently - /// with or after the \a Finish method. - /// - /// The initial metadata that will be sent to the client will be - /// taken from the \a ServerContext associated with the call. - virtual void SendInitialMetadata() = 0; -}; - -/// An interface that yields a sequence of messages of type \a R. -template <class R> -class ReaderInterface { - public: - virtual ~ReaderInterface() {} - - /// Get an upper bound on the next message size available for reading on this - /// stream. - virtual bool NextMessageSize(uint32_t* sz) = 0; - - /// Block to read a message and parse to \a msg. Returns \a true on success. - /// This is thread-safe with respect to \a Write or \WritesDone methods on - /// the same stream. It should not be called concurrently with another \a - /// Read on the same stream as the order of delivery will not be defined. - /// - /// \param[out] msg The read message. - /// - /// \return \a false when there will be no more incoming messages, either - /// because the other side has called \a WritesDone() or the stream has failed - /// (or been cancelled). - virtual bool Read(R* msg) = 0; -}; - -/// An interface that can be fed a sequence of messages of type \a W. -template <class W> -class WriterInterface { - public: - virtual ~WriterInterface() {} - - /// Block to write \a msg to the stream with WriteOptions \a options. - /// This is thread-safe with respect to \a ReaderInterface::Read - /// - /// \param msg The message to be written to the stream. - /// \param options The WriteOptions affecting the write operation. - /// - /// \return \a true on success, \a false when the stream has been closed. - virtual bool Write(const W& msg, grpc::WriteOptions options) = 0; - - /// Block to write \a msg to the stream with default write options. - /// This is thread-safe with respect to \a ReaderInterface::Read - /// - /// \param msg The message to be written to the stream. - /// - /// \return \a true on success, \a false when the stream has been closed. - inline bool Write(const W& msg) { return Write(msg, grpc::WriteOptions()); } - - /// Write \a msg and coalesce it with the writing of trailing metadata, using - /// WriteOptions \a options. - /// - /// For client, WriteLast is equivalent of performing Write and WritesDone in - /// a single step. \a msg and trailing metadata are coalesced and sent on wire - /// by calling this function. For server, WriteLast buffers the \a msg. - /// The writing of \a msg is held until the service handler returns, - /// where \a msg and trailing metadata are coalesced and sent on wire. - /// Note that WriteLast can only buffer \a msg up to the flow control window - /// size. If \a msg size is larger than the window size, it will be sent on - /// wire without buffering. - /// - /// \param[in] msg The message to be written to the stream. - /// \param[in] options The WriteOptions to be used to write this message. - void WriteLast(const W& msg, grpc::WriteOptions options) { - Write(msg, options.set_last_message()); - } -}; - -} // namespace internal - -/// Client-side interface for streaming reads of message of type \a R. -template <class R> -class ClientReaderInterface : public internal::ClientStreamingInterface, - public internal::ReaderInterface<R> { - public: - /// Block to wait for initial metadata from server. The received metadata - /// can only be accessed after this call returns. Should only be called before - /// the first read. Calling this method is optional, and if it is not called - /// the metadata will be available in ClientContext after the first read. - virtual void WaitForInitialMetadata() = 0; -}; - -namespace internal { -template <class R> -class ClientReaderFactory { - public: - template <class W> - static ClientReader<R>* Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, - const W& request) { - return new ClientReader<R>(channel, method, context, request); - } -}; -} // namespace internal - -/// Synchronous (blocking) client-side API for doing server-streaming RPCs, -/// where the stream of messages coming from the server has messages -/// of type \a R. -template <class R> -class ClientReader final : public ClientReaderInterface<R> { - public: - /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for - /// semantics. - /// - // Side effect: - /// Once complete, the initial metadata read from - /// the server will be accessible through the \a ClientContext used to - /// construct this object. - void WaitForInitialMetadata() override { - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); - - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; - ops.RecvInitialMetadata(context_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); /// status ignored - } - - bool NextMessageSize(uint32_t* sz) override { - int result = call_.max_receive_message_size(); - *sz = (result > 0) ? result : UINT32_MAX; - return true; - } - - /// See the \a ReaderInterface.Read method for semantics. - /// Side effect: - /// This also receives initial metadata from the server, if not - /// already received (if initial metadata is received, it can be then - /// accessed through the \a ClientContext associated with this call). - bool Read(R* msg) override { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpRecvMessage<R>> - ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - ops.RecvMessage(msg); - call_.PerformOps(&ops); - return cq_.Pluck(&ops) && ops.got_message; - } - - /// See the \a ClientStreamingInterface.Finish method for semantics. - /// - /// Side effect: - /// The \a ClientContext associated with this call is updated with - /// possible metadata received from the server. - grpc::Status Finish() override { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpClientRecvStatus> - ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - grpc::Status status; - ops.ClientRecvStatus(context_, &status); - call_.PerformOps(&ops); - GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); - return status; - } - - private: - friend class internal::ClientReaderFactory<R>; - grpc::ClientContext* context_; - grpc::CompletionQueue cq_; - grpc::internal::Call call_; - - /// Block to create a stream and write the initial metadata and \a request - /// out. Note that \a context will be used to fill in custom initial - /// metadata used to send to the server when starting the call. - template <class W> - ClientReader(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, const W& request) - : context_(context), - cq_(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, - nullptr}), // Pluckable cq - call_(channel->CreateCall(method, context, &cq_)) { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose> - ops; - ops.SendInitialMetadata(&context->send_initial_metadata_, - context->initial_metadata_flags()); - // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(ops.SendMessagePtr(&request).ok()); - ops.ClientSendClose(); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } -}; - -/// Client-side interface for streaming writes of message type \a W. -template <class W> -class ClientWriterInterface : public internal::ClientStreamingInterface, - public internal::WriterInterface<W> { - public: - /// Half close writing from the client. (signal that the stream of messages - /// coming from the client is complete). - /// Blocks until currently-pending writes are completed. - /// Thread safe with respect to \a ReaderInterface::Read operations only - /// - /// \return Whether the writes were successful. - virtual bool WritesDone() = 0; -}; - -namespace internal { -template <class W> -class ClientWriterFactory { - public: - template <class R> - static ClientWriter<W>* Create(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, R* response) { - return new ClientWriter<W>(channel, method, context, response); - } -}; -} // namespace internal - -/// Synchronous (blocking) client-side API for doing client-streaming RPCs, -/// where the outgoing message stream coming from the client has messages of -/// type \a W. -template <class W> -class ClientWriter : public ClientWriterInterface<W> { - public: - /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for - /// semantics. - /// - // Side effect: - /// Once complete, the initial metadata read from the server will be - /// accessible through the \a ClientContext used to construct this object. - void WaitForInitialMetadata() { - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); - - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; - ops.RecvInitialMetadata(context_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); // status ignored - } - - /// See the WriterInterface.Write(const W& msg, WriteOptions options) method - /// for semantics. - /// - /// Side effect: - /// Also sends initial metadata if not already sent (using the - /// \a ClientContext associated with this call). - using internal::WriterInterface<W>::Write; - bool Write(const W& msg, grpc::WriteOptions options) override { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose> - ops; - - if (options.is_last_message()) { - options.set_buffer_hint(); - ops.ClientSendClose(); - } - if (context_->initial_metadata_corked_) { - ops.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - context_->set_initial_metadata_corked(false); - } - if (!ops.SendMessagePtr(&msg, options).ok()) { - return false; - } - - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - bool WritesDone() override { - grpc::internal::CallOpSet<grpc::internal::CallOpClientSendClose> ops; - ops.ClientSendClose(); - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - /// See the ClientStreamingInterface.Finish method for semantics. - /// Side effects: - /// - Also receives initial metadata if not already received. - /// - Attempts to fill in the \a response parameter passed - /// to the constructor of this instance with the response - /// message from the server. - grpc::Status Finish() override { - grpc::Status status; - if (!context_->initial_metadata_received_) { - finish_ops_.RecvInitialMetadata(context_); - } - finish_ops_.ClientRecvStatus(context_, &status); - call_.PerformOps(&finish_ops_); - GPR_CODEGEN_ASSERT(cq_.Pluck(&finish_ops_)); - return status; - } - - private: - friend class internal::ClientWriterFactory<W>; - - /// Block to create a stream (i.e. send request headers and other initial - /// metadata to the server). Note that \a context will be used to fill - /// in custom initial metadata. \a response will be filled in with the - /// single expected response message from the server upon a successful - /// call to the \a Finish method of this instance. - template <class R> - ClientWriter(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context, R* response) - : context_(context), - cq_(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, - nullptr}), // Pluckable cq - call_(channel->CreateCall(method, context, &cq_)) { - finish_ops_.RecvMessage(response); - finish_ops_.AllowNoMessage(); - - if (!context_->initial_metadata_corked_) { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(&context->send_initial_metadata_, - context->initial_metadata_flags()); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } - } - - grpc::ClientContext* context_; - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpGenericRecvMessage, - grpc::internal::CallOpClientRecvStatus> - finish_ops_; - grpc::CompletionQueue cq_; - grpc::internal::Call call_; -}; - -/// Client-side interface for bi-directional streaming with -/// client-to-server stream messages of type \a W and -/// server-to-client stream messages of type \a R. -template <class W, class R> -class ClientReaderWriterInterface : public internal::ClientStreamingInterface, - public internal::WriterInterface<W>, - public internal::ReaderInterface<R> { - public: - /// Block to wait for initial metadata from server. The received metadata - /// can only be accessed after this call returns. Should only be called before - /// the first read. Calling this method is optional, and if it is not called - /// the metadata will be available in ClientContext after the first read. - virtual void WaitForInitialMetadata() = 0; - - /// Half close writing from the client. (signal that the stream of messages - /// coming from the client is complete). - /// Blocks until currently-pending writes are completed. - /// Thread-safe with respect to \a ReaderInterface::Read - /// - /// \return Whether the writes were successful. - virtual bool WritesDone() = 0; -}; - -namespace internal { -template <class W, class R> -class ClientReaderWriterFactory { - public: - static ClientReaderWriter<W, R>* Create( - grpc::ChannelInterface* channel, const grpc::internal::RpcMethod& method, - grpc::ClientContext* context) { - return new ClientReaderWriter<W, R>(channel, method, context); - } -}; -} // namespace internal - -/// Synchronous (blocking) client-side API for bi-directional streaming RPCs, -/// where the outgoing message stream coming from the client has messages of -/// type \a W, and the incoming messages stream coming from the server has -/// messages of type \a R. -template <class W, class R> -class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> { - public: - /// Block waiting to read initial metadata from the server. - /// This call is optional, but if it is used, it cannot be used concurrently - /// with or after the \a Finish method. - /// - /// Once complete, the initial metadata read from the server will be - /// accessible through the \a ClientContext used to construct this object. - void WaitForInitialMetadata() override { - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); - - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; - ops.RecvInitialMetadata(context_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); // status ignored - } - - bool NextMessageSize(uint32_t* sz) override { - int result = call_.max_receive_message_size(); - *sz = (result > 0) ? result : UINT32_MAX; - return true; - } - - /// See the \a ReaderInterface.Read method for semantics. - /// Side effect: - /// Also receives initial metadata if not already received (updates the \a - /// ClientContext associated with this call in that case). - bool Read(R* msg) override { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpRecvMessage<R>> - ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - ops.RecvMessage(msg); - call_.PerformOps(&ops); - return cq_.Pluck(&ops) && ops.got_message; - } - - /// See the \a WriterInterface.Write method for semantics. - /// - /// Side effect: - /// Also sends initial metadata if not already sent (using the - /// \a ClientContext associated with this call to fill in values). - using internal::WriterInterface<W>::Write; - bool Write(const W& msg, grpc::WriteOptions options) override { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, - grpc::internal::CallOpSendMessage, - grpc::internal::CallOpClientSendClose> - ops; - - if (options.is_last_message()) { - options.set_buffer_hint(); - ops.ClientSendClose(); - } - if (context_->initial_metadata_corked_) { - ops.SendInitialMetadata(&context_->send_initial_metadata_, - context_->initial_metadata_flags()); - context_->set_initial_metadata_corked(false); - } - if (!ops.SendMessagePtr(&msg, options).ok()) { - return false; - } - - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - bool WritesDone() override { - grpc::internal::CallOpSet<grpc::internal::CallOpClientSendClose> ops; - ops.ClientSendClose(); - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - /// See the ClientStreamingInterface.Finish method for semantics. - /// - /// Side effect: - /// - the \a ClientContext associated with this call is updated with - /// possible trailing metadata sent from the server. - grpc::Status Finish() override { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, - grpc::internal::CallOpClientRecvStatus> - ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - grpc::Status status; - ops.ClientRecvStatus(context_, &status); - call_.PerformOps(&ops); - GPR_CODEGEN_ASSERT(cq_.Pluck(&ops)); - return status; - } - - private: - friend class internal::ClientReaderWriterFactory<W, R>; - - grpc::ClientContext* context_; - grpc::CompletionQueue cq_; - grpc::internal::Call call_; - - /// Block to create a stream and write the initial metadata and \a request - /// out. Note that \a context will be used to fill in custom initial metadata - /// used to send to the server when starting the call. - ClientReaderWriter(grpc::ChannelInterface* channel, - const grpc::internal::RpcMethod& method, - grpc::ClientContext* context) - : context_(context), - cq_(grpc_completion_queue_attributes{ - GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, - nullptr}), // Pluckable cq - call_(channel->CreateCall(method, context, &cq_)) { - if (!context_->initial_metadata_corked_) { - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(&context->send_initial_metadata_, - context->initial_metadata_flags()); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } - } -}; - -/// Server-side interface for streaming reads of message of type \a R. -template <class R> -class ServerReaderInterface : public internal::ServerStreamingInterface, - public internal::ReaderInterface<R> {}; - -/// Synchronous (blocking) server-side API for doing client-streaming RPCs, -/// where the incoming message stream coming from the client has messages of -/// type \a R. -template <class R> -class ServerReader final : public ServerReaderInterface<R> { - public: - /// See the \a ServerStreamingInterface.SendInitialMetadata method - /// for semantics. Note that initial metadata will be affected by the - /// \a ServerContext associated with this call. - void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(&ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - if (ctx_->compression_level_set()) { - ops.set_compression_level(ctx_->compression_level()); - } - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - bool NextMessageSize(uint32_t* sz) override { - int result = call_->max_receive_message_size(); - *sz = (result > 0) ? result : UINT32_MAX; - return true; - } - - bool Read(R* msg) override { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<R>> ops; - ops.RecvMessage(msg); - call_->PerformOps(&ops); - bool ok = call_->cq()->Pluck(&ops) && ops.got_message; - if (!ok) { - ctx_->MaybeMarkCancelledOnRead(); - } - return ok; - } - - private: - grpc::internal::Call* const call_; - ServerContext* const ctx_; - - template <class ServiceType, class RequestType, class ResponseType> - friend class internal::ClientStreamingHandler; - - ServerReader(grpc::internal::Call* call, grpc::ServerContext* ctx) - : call_(call), ctx_(ctx) {} -}; - -/// Server-side interface for streaming writes of message of type \a W. -template <class W> -class ServerWriterInterface : public internal::ServerStreamingInterface, - public internal::WriterInterface<W> {}; - -/// Synchronous (blocking) server-side API for doing for doing a -/// server-streaming RPCs, where the outgoing message stream coming from the -/// server has messages of type \a W. -template <class W> -class ServerWriter final : public ServerWriterInterface<W> { - public: - /// See the \a ServerStreamingInterface.SendInitialMetadata method - /// for semantics. - /// Note that initial metadata will be affected by the - /// \a ServerContext associated with this call. - void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(&ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - if (ctx_->compression_level_set()) { - ops.set_compression_level(ctx_->compression_level()); - } - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - /// See the \a WriterInterface.Write method for semantics. - /// - /// Side effect: - /// Also sends initial metadata if not already sent (using the - /// \a ClientContext associated with this call to fill in values). - using internal::WriterInterface<W>::Write; - bool Write(const W& msg, grpc::WriteOptions options) override { - if (options.is_last_message()) { - options.set_buffer_hint(); - } - - if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { - return false; - } - if (!ctx_->sent_initial_metadata_) { - ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - if (ctx_->compression_level_set()) { - ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); - } - ctx_->sent_initial_metadata_ = true; - } - call_->PerformOps(&ctx_->pending_ops_); - // if this is the last message we defer the pluck until AFTER we start - // the trailing md op. This prevents hangs. See - // https://github.com/grpc/grpc/issues/11546 - if (options.is_last_message()) { - ctx_->has_pending_ops_ = true; - return true; - } - ctx_->has_pending_ops_ = false; - return call_->cq()->Pluck(&ctx_->pending_ops_); - } - - private: - grpc::internal::Call* const call_; - grpc::ServerContext* const ctx_; - - template <class ServiceType, class RequestType, class ResponseType> - friend class internal::ServerStreamingHandler; - - ServerWriter(grpc::internal::Call* call, grpc::ServerContext* ctx) - : call_(call), ctx_(ctx) {} -}; - -/// Server-side interface for bi-directional streaming. -template <class W, class R> -class ServerReaderWriterInterface : public internal::ServerStreamingInterface, - public internal::WriterInterface<W>, - public internal::ReaderInterface<R> {}; - -/// Actual implementation of bi-directional streaming -namespace internal { -template <class W, class R> -class ServerReaderWriterBody final { - public: - ServerReaderWriterBody(grpc::internal::Call* call, grpc::ServerContext* ctx) - : call_(call), ctx_(ctx) {} - - void SendInitialMetadata() { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); - - grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(&ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - if (ctx_->compression_level_set()) { - ops.set_compression_level(ctx_->compression_level()); - } - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - bool NextMessageSize(uint32_t* sz) { - int result = call_->max_receive_message_size(); - *sz = (result > 0) ? result : UINT32_MAX; - return true; - } - - bool Read(R* msg) { - grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<R>> ops; - ops.RecvMessage(msg); - call_->PerformOps(&ops); - bool ok = call_->cq()->Pluck(&ops) && ops.got_message; - if (!ok) { - ctx_->MaybeMarkCancelledOnRead(); - } - return ok; - } - - bool Write(const W& msg, grpc::WriteOptions options) { - if (options.is_last_message()) { - options.set_buffer_hint(); - } - if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { - return false; - } - if (!ctx_->sent_initial_metadata_) { - ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, - ctx_->initial_metadata_flags()); - if (ctx_->compression_level_set()) { - ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); - } - ctx_->sent_initial_metadata_ = true; - } - call_->PerformOps(&ctx_->pending_ops_); - // if this is the last message we defer the pluck until AFTER we start - // the trailing md op. This prevents hangs. See - // https://github.com/grpc/grpc/issues/11546 - if (options.is_last_message()) { - ctx_->has_pending_ops_ = true; - return true; - } - ctx_->has_pending_ops_ = false; - return call_->cq()->Pluck(&ctx_->pending_ops_); - } - - private: - grpc::internal::Call* const call_; - grpc::ServerContext* const ctx_; -}; - -} // namespace internal - -/// Synchronous (blocking) server-side API for a bidirectional -/// streaming call, where the incoming message stream coming from the client has -/// messages of type \a R, and the outgoing message streaming coming from -/// the server has messages of type \a W. -template <class W, class R> -class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> { - public: - /// See the \a ServerStreamingInterface.SendInitialMetadata method - /// for semantics. Note that initial metadata will be affected by the - /// \a ServerContext associated with this call. - void SendInitialMetadata() override { body_.SendInitialMetadata(); } - - bool NextMessageSize(uint32_t* sz) override { - return body_.NextMessageSize(sz); - } - - bool Read(R* msg) override { return body_.Read(msg); } - - /// See the \a WriterInterface.Write(const W& msg, WriteOptions options) - /// method for semantics. - /// Side effect: - /// Also sends initial metadata if not already sent (using the \a - /// ServerContext associated with this call). - using internal::WriterInterface<W>::Write; - bool Write(const W& msg, grpc::WriteOptions options) override { - return body_.Write(msg, options); - } - - private: - internal::ServerReaderWriterBody<W, R> body_; - - friend class internal::TemplatedBidiStreamingHandler<ServerReaderWriter<W, R>, - false>; - ServerReaderWriter(grpc::internal::Call* call, grpc::ServerContext* ctx) - : body_(call, ctx) {} -}; - -/// A class to represent a flow-controlled unary call. This is something -/// of a hybrid between conventional unary and streaming. This is invoked -/// through a unary call on the client side, but the server responds to it -/// as though it were a single-ping-pong streaming call. The server can use -/// the \a NextMessageSize method to determine an upper-bound on the size of -/// the message. A key difference relative to streaming: ServerUnaryStreamer -/// must have exactly 1 Read and exactly 1 Write, in that order, to function -/// correctly. Otherwise, the RPC is in error. -template <class RequestType, class ResponseType> -class ServerUnaryStreamer final - : public ServerReaderWriterInterface<ResponseType, RequestType> { - public: - /// Block to send initial metadata to client. - /// Implicit input parameter: - /// - the \a ServerContext associated with this call will be used for - /// sending initial metadata. - void SendInitialMetadata() override { body_.SendInitialMetadata(); } - - /// Get an upper bound on the request message size from the client. - bool NextMessageSize(uint32_t* sz) override { - return body_.NextMessageSize(sz); - } - - /// Read a message of type \a R into \a msg. Completion will be notified by \a - /// tag on the associated completion queue. - /// This is thread-safe with respect to \a Write or \a WritesDone methods. It - /// should not be called concurrently with other streaming APIs - /// on the same stream. It is not meaningful to call it concurrently - /// with another \a ReaderInterface::Read on the same stream since reads on - /// the same stream are delivered in order. - /// - /// \param[out] msg Where to eventually store the read message. - /// \param[in] tag The tag identifying the operation. - bool Read(RequestType* request) override { - if (read_done_) { - return false; - } - read_done_ = true; - return body_.Read(request); - } - - /// Block to write \a msg to the stream with WriteOptions \a options. - /// This is thread-safe with respect to \a ReaderInterface::Read - /// - /// \param msg The message to be written to the stream. - /// \param options The WriteOptions affecting the write operation. - /// - /// \return \a true on success, \a false when the stream has been closed. - using internal::WriterInterface<ResponseType>::Write; - bool Write(const ResponseType& response, - grpc::WriteOptions options) override { - if (write_done_ || !read_done_) { - return false; - } - write_done_ = true; - return body_.Write(response, options); - } - - private: - internal::ServerReaderWriterBody<ResponseType, RequestType> body_; - bool read_done_; - bool write_done_; - - friend class internal::TemplatedBidiStreamingHandler< - ServerUnaryStreamer<RequestType, ResponseType>, true>; - ServerUnaryStreamer(grpc::internal::Call* call, grpc::ServerContext* ctx) - : body_(call, ctx), read_done_(false), write_done_(false) {} -}; - -/// A class to represent a flow-controlled server-side streaming call. -/// This is something of a hybrid between server-side and bidi streaming. -/// This is invoked through a server-side streaming call on the client side, -/// but the server responds to it as though it were a bidi streaming call that -/// must first have exactly 1 Read and then any number of Writes. -template <class RequestType, class ResponseType> -class ServerSplitStreamer final - : public ServerReaderWriterInterface<ResponseType, RequestType> { - public: - /// Block to send initial metadata to client. - /// Implicit input parameter: - /// - the \a ServerContext associated with this call will be used for - /// sending initial metadata. - void SendInitialMetadata() override { body_.SendInitialMetadata(); } - - /// Get an upper bound on the request message size from the client. - bool NextMessageSize(uint32_t* sz) override { - return body_.NextMessageSize(sz); - } - - /// Read a message of type \a R into \a msg. Completion will be notified by \a - /// tag on the associated completion queue. - /// This is thread-safe with respect to \a Write or \a WritesDone methods. It - /// should not be called concurrently with other streaming APIs - /// on the same stream. It is not meaningful to call it concurrently - /// with another \a ReaderInterface::Read on the same stream since reads on - /// the same stream are delivered in order. - /// - /// \param[out] msg Where to eventually store the read message. - /// \param[in] tag The tag identifying the operation. - bool Read(RequestType* request) override { - if (read_done_) { - return false; - } - read_done_ = true; - return body_.Read(request); - } - - /// Block to write \a msg to the stream with WriteOptions \a options. - /// This is thread-safe with respect to \a ReaderInterface::Read - /// - /// \param msg The message to be written to the stream. - /// \param options The WriteOptions affecting the write operation. - /// - /// \return \a true on success, \a false when the stream has been closed. - using internal::WriterInterface<ResponseType>::Write; - bool Write(const ResponseType& response, - grpc::WriteOptions options) override { - return read_done_ && body_.Write(response, options); - } - - private: - internal::ServerReaderWriterBody<ResponseType, RequestType> body_; - bool read_done_; - - friend class internal::TemplatedBidiStreamingHandler< - ServerSplitStreamer<RequestType, ResponseType>, false>; - ServerSplitStreamer(grpc::internal::Call* call, grpc::ServerContext* ctx) - : body_(call, ctx), read_done_(false) {} -}; - -} // namespace grpc - -#endif // GRPCPP_IMPL_CODEGEN_SYNC_STREAM_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/time.h b/contrib/libs/grpc/include/grpcpp/impl/codegen/time.h index 41bf69f376..71aeed8c78 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/time.h +++ b/contrib/libs/grpc/include/grpcpp/impl/codegen/time.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_CODEGEN_TIME_H #define GRPCPP_IMPL_CODEGEN_TIME_H @@ -23,73 +23,9 @@ #pragma GCC system_header #endif -// IWYU pragma: private, include <grpcpp/support/time.h> +// IWYU pragma: private -#include <chrono> - -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/config.h> - -namespace grpc { - -/** If you are trying to use CompletionQueue::AsyncNext with a time class that - isn't either gpr_timespec or std::chrono::system_clock::time_point, you - will most likely be looking at this comment as your compiler will have - fired an error below. In order to fix this issue, you have two potential - solutions: - - 1. Use gpr_timespec or std::chrono::system_clock::time_point instead - 2. Specialize the TimePoint class with whichever time class that you - want to use here. See below for two examples of how to do this. - */ -template <typename T> -class TimePoint { - public: - // If you see the error with methods below, you may need either - // i) using the existing types having a conversion class such as - // gpr_timespec and std::chrono::system_clock::time_point or - // ii) writing a new TimePoint<YourType> to address your case. - TimePoint(const T& /*time*/) = delete; - gpr_timespec raw_time() = delete; -}; - -template <> -class TimePoint<gpr_timespec> { - public: - /* NOLINTNEXTLINE(google-explicit-constructor) */ - TimePoint(const gpr_timespec& time) : time_(time) {} - gpr_timespec raw_time() { return time_; } - - private: - gpr_timespec time_; -}; - -} // namespace grpc - -namespace grpc { - -// from and to should be absolute time. -void Timepoint2Timespec(const std::chrono::system_clock::time_point& from, - gpr_timespec* to); -void TimepointHR2Timespec( - const std::chrono::high_resolution_clock::time_point& from, - gpr_timespec* to); - -std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t); - -template <> -class TimePoint<std::chrono::system_clock::time_point> { - public: - /* NOLINTNEXTLINE(google-explicit-constructor) */ - TimePoint(const std::chrono::system_clock::time_point& time) { - Timepoint2Timespec(time, &time_); - } - gpr_timespec raw_time() const { return time_; } - - private: - gpr_timespec time_; -}; - -} // namespace grpc +/// TODO(chengyuc): Remove this file after solving compatibility. +#include <grpcpp/support/time.h> #endif // GRPCPP_IMPL_CODEGEN_TIME_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/completion_queue_tag.h b/contrib/libs/grpc/include/grpcpp/impl/completion_queue_tag.h index 9af470b750..bb1fa96087 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/completion_queue_tag.h +++ b/contrib/libs/grpc/include/grpcpp/impl/completion_queue_tag.h @@ -1,25 +1,23 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// -#ifndef GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H -#define GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H - -// IWYU pragma: private +#ifndef GRPCPP_IMPL_COMPLETION_QUEUE_TAG_H +#define GRPCPP_IMPL_COMPLETION_QUEUE_TAG_H namespace grpc { @@ -53,4 +51,4 @@ class CompletionQueueTag { } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_COMPLETION_QUEUE_TAG_H +#endif // GRPCPP_IMPL_COMPLETION_QUEUE_TAG_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/create_auth_context.h b/contrib/libs/grpc/include/grpcpp/impl/create_auth_context.h new file mode 100644 index 0000000000..10844bec92 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/create_auth_context.h @@ -0,0 +1,34 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_CREATE_AUTH_CONTEXT_H +#define GRPCPP_IMPL_CREATE_AUTH_CONTEXT_H + +#include <memory> + +#include <grpc/impl/grpc_types.h> +#include <grpcpp/security/auth_context.h> + +namespace grpc { + +/// TODO(ctiller): not sure we want to make this a permanent thing +std::shared_ptr<const AuthContext> CreateAuthContext(grpc_call* call); + +} // namespace grpc + +#endif // GRPCPP_IMPL_CREATE_AUTH_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/grpc_library.h b/contrib/libs/grpc/include/grpcpp/impl/grpc_library.h index 0afca8e46f..6f20d2bf41 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/grpc_library.h +++ b/contrib/libs/grpc/include/grpcpp/impl/grpc_library.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_GRPC_LIBRARY_H #define GRPCPP_IMPL_GRPC_LIBRARY_H @@ -23,35 +23,28 @@ #include <grpc/grpc.h> #include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen.h> -#include <grpcpp/impl/codegen/grpc_library.h> // IWYU pragma: export namespace grpc { namespace internal { -class GrpcLibrary final : public GrpcLibraryInterface { - public: - void init() override { grpc_init(); } - void shutdown() override { grpc_shutdown(); } -}; -/// Instantiating this class ensures the proper initialization of gRPC. -class GrpcLibraryInitializer final { +/// Classes that require gRPC to be initialized should inherit from this class. +class GrpcLibrary { public: - GrpcLibraryInitializer() { - if (grpc::g_glip == nullptr) { - static auto* const g_gli = new GrpcLibrary(); - grpc::g_glip = g_gli; + explicit GrpcLibrary(bool call_grpc_init = true) : grpc_init_called_(false) { + if (call_grpc_init) { + grpc_init(); + grpc_init_called_ = true; } - if (grpc::g_core_codegen_interface == nullptr) { - static auto* const g_core_codegen = new CoreCodegen(); - grpc::g_core_codegen_interface = g_core_codegen; + } + virtual ~GrpcLibrary() { + if (grpc_init_called_) { + grpc_shutdown(); } } - /// A no-op method to force the linker to reference this class, which will - /// take care of initializing and shutting down the gRPC runtime. - int summon() { return 0; } + private: + bool grpc_init_called_; }; } // namespace internal diff --git a/contrib/libs/grpc/include/grpcpp/impl/intercepted_channel.h b/contrib/libs/grpc/include/grpcpp/impl/intercepted_channel.h new file mode 100644 index 0000000000..908655a6e4 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/intercepted_channel.h @@ -0,0 +1,83 @@ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_INTERCEPTED_CHANNEL_H +#define GRPCPP_IMPL_INTERCEPTED_CHANNEL_H + +#include <grpcpp/impl/channel_interface.h> + +namespace grpc { +class CompletionQueue; + +namespace internal { + +class InterceptorBatchMethodsImpl; + +/// An InterceptedChannel is available to client Interceptors. An +/// InterceptedChannel is unique to an interceptor, and when an RPC is started +/// on this channel, only those interceptors that come after this interceptor +/// see the RPC. +class InterceptedChannel : public ChannelInterface { + public: + ~InterceptedChannel() override { channel_ = nullptr; } + + /// Get the current channel state. If the channel is in IDLE and + /// \a try_to_connect is set to true, try to connect. + grpc_connectivity_state GetState(bool try_to_connect) override { + return channel_->GetState(try_to_connect); + } + + private: + InterceptedChannel(ChannelInterface* channel, size_t pos) + : channel_(channel), interceptor_pos_(pos) {} + + Call CreateCall(const RpcMethod& method, grpc::ClientContext* context, + grpc::CompletionQueue* cq) override { + return channel_->CreateCallInternal(method, context, cq, interceptor_pos_); + } + + void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) override { + return channel_->PerformOpsOnCall(ops, call); + } + void* RegisterMethod(const char* method) override { + return channel_->RegisterMethod(method); + } + + void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, grpc::CompletionQueue* cq, + void* tag) override { + return channel_->NotifyOnStateChangeImpl(last_observed, deadline, cq, tag); + } + bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline) override { + return channel_->WaitForStateChangeImpl(last_observed, deadline); + } + + grpc::CompletionQueue* CallbackCQ() override { + return channel_->CallbackCQ(); + } + + ChannelInterface* channel_; + size_t interceptor_pos_; + + friend class InterceptorBatchMethodsImpl; +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_INTERCEPTED_CHANNEL_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/interceptor_common.h b/contrib/libs/grpc/include/grpcpp/impl/interceptor_common.h new file mode 100644 index 0000000000..59aa8add44 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/interceptor_common.h @@ -0,0 +1,536 @@ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_INTERCEPTOR_COMMON_H +#define GRPCPP_IMPL_INTERCEPTOR_COMMON_H + +#include <array> +#include <functional> + +#include <grpc/impl/grpc_types.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set_interface.h> +#include <grpcpp/impl/intercepted_channel.h> +#include <grpcpp/support/client_interceptor.h> +#include <grpcpp/support/server_interceptor.h> + +namespace grpc { +namespace internal { + +class InterceptorBatchMethodsImpl + : public experimental::InterceptorBatchMethods { + public: + InterceptorBatchMethodsImpl() { + for (auto i = static_cast<experimental::InterceptionHookPoints>(0); + i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; + i = static_cast<experimental::InterceptionHookPoints>( + static_cast<size_t>(i) + 1)) { + hooks_[static_cast<size_t>(i)] = false; + } + } + + ~InterceptorBatchMethodsImpl() override {} + + bool QueryInterceptionHookPoint( + experimental::InterceptionHookPoints type) override { + return hooks_[static_cast<size_t>(type)]; + } + + void Proceed() override { + if (call_->client_rpc_info() != nullptr) { + return ProceedClient(); + } + GPR_ASSERT(call_->server_rpc_info() != nullptr); + ProceedServer(); + } + + void Hijack() override { + // Only the client can hijack when sending down initial metadata + GPR_ASSERT(!reverse_ && ops_ != nullptr && + call_->client_rpc_info() != nullptr); + // It is illegal to call Hijack twice + GPR_ASSERT(!ran_hijacking_interceptor_); + auto* rpc_info = call_->client_rpc_info(); + rpc_info->hijacked_ = true; + rpc_info->hijacked_interceptor_ = current_interceptor_index_; + ClearHookPoints(); + ops_->SetHijackingState(); + ran_hijacking_interceptor_ = true; + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void AddInterceptionHookPoint(experimental::InterceptionHookPoints type) { + hooks_[static_cast<size_t>(type)] = true; + } + + ByteBuffer* GetSerializedSendMessage() override { + GPR_ASSERT(orig_send_message_ != nullptr); + if (*orig_send_message_ != nullptr) { + GPR_ASSERT(serializer_(*orig_send_message_).ok()); + *orig_send_message_ = nullptr; + } + return send_message_; + } + + const void* GetSendMessage() override { + GPR_ASSERT(orig_send_message_ != nullptr); + return *orig_send_message_; + } + + void ModifySendMessage(const void* message) override { + GPR_ASSERT(orig_send_message_ != nullptr); + *orig_send_message_ = message; + } + + bool GetSendMessageStatus() override { return !*fail_send_message_; } + + std::multimap<TString, TString>* GetSendInitialMetadata() override { + return send_initial_metadata_; + } + + Status GetSendStatus() override { + return Status(static_cast<StatusCode>(*code_), *error_message_, + *error_details_); + } + + void ModifySendStatus(const Status& status) override { + *code_ = static_cast<grpc_status_code>(status.error_code()); + *error_details_ = status.error_details(); + *error_message_ = status.error_message(); + } + + std::multimap<TString, TString>* GetSendTrailingMetadata() override { + return send_trailing_metadata_; + } + + void* GetRecvMessage() override { return recv_message_; } + + std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvInitialMetadata() + override { + return recv_initial_metadata_->map(); + } + + Status* GetRecvStatus() override { return recv_status_; } + + void FailHijackedSendMessage() override { + GPR_ASSERT(hooks_[static_cast<size_t>( + experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)]); + *fail_send_message_ = true; + } + + std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata() + override { + return recv_trailing_metadata_->map(); + } + + void SetSendMessage(ByteBuffer* buf, const void** msg, + bool* fail_send_message, + std::function<Status(const void*)> serializer) { + send_message_ = buf; + orig_send_message_ = msg; + fail_send_message_ = fail_send_message; + serializer_ = serializer; + } + + void SetSendInitialMetadata( + std::multimap<TString, TString>* metadata) { + send_initial_metadata_ = metadata; + } + + void SetSendStatus(grpc_status_code* code, TString* error_details, + TString* error_message) { + code_ = code; + error_details_ = error_details; + error_message_ = error_message; + } + + void SetSendTrailingMetadata( + std::multimap<TString, TString>* metadata) { + send_trailing_metadata_ = metadata; + } + + void SetRecvMessage(void* message, bool* hijacked_recv_message_failed) { + recv_message_ = message; + hijacked_recv_message_failed_ = hijacked_recv_message_failed; + } + + void SetRecvInitialMetadata(MetadataMap* map) { + recv_initial_metadata_ = map; + } + + void SetRecvStatus(Status* status) { recv_status_ = status; } + + void SetRecvTrailingMetadata(MetadataMap* map) { + recv_trailing_metadata_ = map; + } + + std::unique_ptr<ChannelInterface> GetInterceptedChannel() override { + auto* info = call_->client_rpc_info(); + if (info == nullptr) { + return std::unique_ptr<ChannelInterface>(nullptr); + } + // The intercepted channel starts from the interceptor just after the + // current interceptor + return std::unique_ptr<ChannelInterface>(new InterceptedChannel( + info->channel(), current_interceptor_index_ + 1)); + } + + void FailHijackedRecvMessage() override { + GPR_ASSERT(hooks_[static_cast<size_t>( + experimental::InterceptionHookPoints::PRE_RECV_MESSAGE)]); + *hijacked_recv_message_failed_ = true; + } + + // Clears all state + void ClearState() { + reverse_ = false; + ran_hijacking_interceptor_ = false; + ClearHookPoints(); + } + + // Prepares for Post_recv operations + void SetReverse() { + reverse_ = true; + ran_hijacking_interceptor_ = false; + ClearHookPoints(); + } + + // This needs to be set before interceptors are run + void SetCall(Call* call) { call_ = call; } + + // This needs to be set before interceptors are run using RunInterceptors(). + // Alternatively, RunInterceptors(std::function<void(void)> f) can be used. + void SetCallOpSetInterface(CallOpSetInterface* ops) { ops_ = ops; } + + // SetCall should have been called before this. + // Returns true if the interceptors list is empty + bool InterceptorsListEmpty() { + auto* client_rpc_info = call_->client_rpc_info(); + if (client_rpc_info != nullptr) { + return client_rpc_info->interceptors_.empty(); + } + + auto* server_rpc_info = call_->server_rpc_info(); + return server_rpc_info == nullptr || server_rpc_info->interceptors_.empty(); + } + + // This should be used only by subclasses of CallOpSetInterface. SetCall and + // SetCallOpSetInterface should have been called before this. After all the + // interceptors are done running, either ContinueFillOpsAfterInterception or + // ContinueFinalizeOpsAfterInterception will be called. Note that neither of + // them is invoked if there were no interceptors registered. + bool RunInterceptors() { + GPR_ASSERT(ops_); + auto* client_rpc_info = call_->client_rpc_info(); + if (client_rpc_info != nullptr) { + if (client_rpc_info->interceptors_.empty()) { + return true; + } else { + RunClientInterceptors(); + return false; + } + } + + auto* server_rpc_info = call_->server_rpc_info(); + if (server_rpc_info == nullptr || server_rpc_info->interceptors_.empty()) { + return true; + } + RunServerInterceptors(); + return false; + } + + // Returns true if no interceptors are run. Returns false otherwise if there + // are interceptors registered. After the interceptors are done running \a f + // will be invoked. This is to be used only by BaseAsyncRequest and + // SyncRequest. + bool RunInterceptors(std::function<void(void)> f) { + // This is used only by the server for initial call request + GPR_ASSERT(reverse_ == true); + GPR_ASSERT(call_->client_rpc_info() == nullptr); + auto* server_rpc_info = call_->server_rpc_info(); + if (server_rpc_info == nullptr || server_rpc_info->interceptors_.empty()) { + return true; + } + callback_ = std::move(f); + RunServerInterceptors(); + return false; + } + + private: + void RunClientInterceptors() { + auto* rpc_info = call_->client_rpc_info(); + if (!reverse_) { + current_interceptor_index_ = 0; + } else { + if (rpc_info->hijacked_) { + current_interceptor_index_ = rpc_info->hijacked_interceptor_; + } else { + current_interceptor_index_ = rpc_info->interceptors_.size() - 1; + } + } + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void RunServerInterceptors() { + auto* rpc_info = call_->server_rpc_info(); + if (!reverse_) { + current_interceptor_index_ = 0; + } else { + current_interceptor_index_ = rpc_info->interceptors_.size() - 1; + } + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + + void ProceedClient() { + auto* rpc_info = call_->client_rpc_info(); + if (rpc_info->hijacked_ && !reverse_ && + current_interceptor_index_ == rpc_info->hijacked_interceptor_ && + !ran_hijacking_interceptor_) { + // We now need to provide hijacked recv ops to this interceptor + ClearHookPoints(); + ops_->SetHijackingState(); + ran_hijacking_interceptor_ = true; + rpc_info->RunInterceptor(this, current_interceptor_index_); + return; + } + if (!reverse_) { + current_interceptor_index_++; + // We are going down the stack of interceptors + if (current_interceptor_index_ < rpc_info->interceptors_.size()) { + if (rpc_info->hijacked_ && + current_interceptor_index_ > rpc_info->hijacked_interceptor_) { + // This is a hijacked RPC and we are done with hijacking + ops_->ContinueFillOpsAfterInterception(); + } else { + rpc_info->RunInterceptor(this, current_interceptor_index_); + } + } else { + // we are done running all the interceptors without any hijacking + ops_->ContinueFillOpsAfterInterception(); + } + } else { + // We are going up the stack of interceptors + if (current_interceptor_index_ > 0) { + // Continue running interceptors + current_interceptor_index_--; + rpc_info->RunInterceptor(this, current_interceptor_index_); + } else { + // we are done running all the interceptors without any hijacking + ops_->ContinueFinalizeResultAfterInterception(); + } + } + } + + void ProceedServer() { + auto* rpc_info = call_->server_rpc_info(); + if (!reverse_) { + current_interceptor_index_++; + if (current_interceptor_index_ < rpc_info->interceptors_.size()) { + return rpc_info->RunInterceptor(this, current_interceptor_index_); + } else if (ops_) { + return ops_->ContinueFillOpsAfterInterception(); + } + } else { + // We are going up the stack of interceptors + if (current_interceptor_index_ > 0) { + // Continue running interceptors + current_interceptor_index_--; + return rpc_info->RunInterceptor(this, current_interceptor_index_); + } else if (ops_) { + return ops_->ContinueFinalizeResultAfterInterception(); + } + } + GPR_ASSERT(callback_); + callback_(); + } + + void ClearHookPoints() { + for (auto i = static_cast<experimental::InterceptionHookPoints>(0); + i < experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS; + i = static_cast<experimental::InterceptionHookPoints>( + static_cast<size_t>(i) + 1)) { + hooks_[static_cast<size_t>(i)] = false; + } + } + + std::array<bool, + static_cast<size_t>( + experimental::InterceptionHookPoints::NUM_INTERCEPTION_HOOKS)> + hooks_; + + size_t current_interceptor_index_ = 0; // Current iterator + bool reverse_ = false; + bool ran_hijacking_interceptor_ = false; + Call* call_ = nullptr; // The Call object is present along with CallOpSet + // object/callback + CallOpSetInterface* ops_ = nullptr; + std::function<void(void)> callback_; + + ByteBuffer* send_message_ = nullptr; + bool* fail_send_message_ = nullptr; + const void** orig_send_message_ = nullptr; + std::function<Status(const void*)> serializer_; + + std::multimap<TString, TString>* send_initial_metadata_; + + grpc_status_code* code_ = nullptr; + TString* error_details_ = nullptr; + TString* error_message_ = nullptr; + + std::multimap<TString, TString>* send_trailing_metadata_ = nullptr; + + void* recv_message_ = nullptr; + bool* hijacked_recv_message_failed_ = nullptr; + + MetadataMap* recv_initial_metadata_ = nullptr; + + Status* recv_status_ = nullptr; + + MetadataMap* recv_trailing_metadata_ = nullptr; +}; + +// A special implementation of InterceptorBatchMethods to send a Cancel +// notification down the interceptor stack +class CancelInterceptorBatchMethods + : public experimental::InterceptorBatchMethods { + public: + bool QueryInterceptionHookPoint( + experimental::InterceptionHookPoints type) override { + return type == experimental::InterceptionHookPoints::PRE_SEND_CANCEL; + } + + void Proceed() override { + // This is a no-op. For actual continuation of the RPC simply needs to + // return from the Intercept method + } + + void Hijack() override { + // Only the client can hijack when sending down initial metadata + GPR_ASSERT(false && + "It is illegal to call Hijack on a method which has a " + "Cancel notification"); + } + + ByteBuffer* GetSerializedSendMessage() override { + GPR_ASSERT(false && + "It is illegal to call GetSendMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + bool GetSendMessageStatus() override { + GPR_ASSERT(false && + "It is illegal to call GetSendMessageStatus on a method which " + "has a Cancel notification"); + return false; + } + + const void* GetSendMessage() override { + GPR_ASSERT(false && + "It is illegal to call GetOriginalSendMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + void ModifySendMessage(const void* /*message*/) override { + GPR_ASSERT(false && + "It is illegal to call ModifySendMessage on a method which " + "has a Cancel notification"); + } + + std::multimap<TString, TString>* GetSendInitialMetadata() override { + GPR_ASSERT(false && + "It is illegal to call GetSendInitialMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + Status GetSendStatus() override { + GPR_ASSERT(false && + "It is illegal to call GetSendStatus on a method which " + "has a Cancel notification"); + return Status(); + } + + void ModifySendStatus(const Status& /*status*/) override { + GPR_ASSERT(false && + "It is illegal to call ModifySendStatus on a method " + "which has a Cancel notification"); + } + + std::multimap<TString, TString>* GetSendTrailingMetadata() override { + GPR_ASSERT(false && + "It is illegal to call GetSendTrailingMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + void* GetRecvMessage() override { + GPR_ASSERT(false && + "It is illegal to call GetRecvMessage on a method which " + "has a Cancel notification"); + return nullptr; + } + + std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvInitialMetadata() + override { + GPR_ASSERT(false && + "It is illegal to call GetRecvInitialMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + Status* GetRecvStatus() override { + GPR_ASSERT(false && + "It is illegal to call GetRecvStatus on a method which " + "has a Cancel notification"); + return nullptr; + } + + std::multimap<grpc::string_ref, grpc::string_ref>* GetRecvTrailingMetadata() + override { + GPR_ASSERT(false && + "It is illegal to call GetRecvTrailingMetadata on a " + "method which has a Cancel notification"); + return nullptr; + } + + std::unique_ptr<ChannelInterface> GetInterceptedChannel() override { + GPR_ASSERT(false && + "It is illegal to call GetInterceptedChannel on a " + "method which has a Cancel notification"); + return std::unique_ptr<ChannelInterface>(nullptr); + } + + void FailHijackedRecvMessage() override { + GPR_ASSERT(false && + "It is illegal to call FailHijackedRecvMessage on a " + "method which has a Cancel notification"); + } + + void FailHijackedSendMessage() override { + GPR_ASSERT(false && + "It is illegal to call FailHijackedSendMessage on a " + "method which has a Cancel notification"); + } +}; +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_INTERCEPTOR_COMMON_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/metadata_map.h b/contrib/libs/grpc/include/grpcpp/impl/metadata_map.h new file mode 100644 index 0000000000..17ce95c27a --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/metadata_map.h @@ -0,0 +1,104 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_METADATA_MAP_H +#define GRPCPP_IMPL_METADATA_MAP_H + +#include <map> + +#include <grpc/grpc.h> +#include <grpc/support/log.h> +#include <grpcpp/support/slice.h> + +namespace grpc { + +namespace internal { + +const char kBinaryErrorDetailsKey[] = "grpc-status-details-bin"; + +class MetadataMap { + public: + MetadataMap() { Setup(); } + + ~MetadataMap() { Destroy(); } + + TString GetBinaryErrorDetails() { + // if filled_, extract from the multimap for O(log(n)) + if (filled_) { + auto iter = map_.find(kBinaryErrorDetailsKey); + if (iter != map_.end()) { + return TString(iter->second.begin(), iter->second.length()); + } + } + // if not yet filled, take the O(n) lookup to avoid allocating the + // multimap until it is requested. + // TODO(ncteisen): plumb this through core as a first class object, just + // like code and message. + else { + for (size_t i = 0; i < arr_.count; i++) { + if (strncmp(reinterpret_cast<const char*>( + GRPC_SLICE_START_PTR(arr_.metadata[i].key)), + kBinaryErrorDetailsKey, + GRPC_SLICE_LENGTH(arr_.metadata[i].key)) == 0) { + return TString(reinterpret_cast<const char*>( + GRPC_SLICE_START_PTR(arr_.metadata[i].value)), + GRPC_SLICE_LENGTH(arr_.metadata[i].value)); + } + } + } + return TString(); + } + + std::multimap<grpc::string_ref, grpc::string_ref>* map() { + FillMap(); + return &map_; + } + grpc_metadata_array* arr() { return &arr_; } + + void Reset() { + filled_ = false; + map_.clear(); + Destroy(); + Setup(); + } + + private: + bool filled_ = false; + grpc_metadata_array arr_; + std::multimap<grpc::string_ref, grpc::string_ref> map_; + + void Destroy() { grpc_metadata_array_destroy(&arr_); } + + void Setup() { memset(&arr_, 0, sizeof(arr_)); } + + void FillMap() { + if (filled_) return; + filled_ = true; + for (size_t i = 0; i < arr_.count; i++) { + // TODO(yangg) handle duplicates? + map_.insert(std::pair<grpc::string_ref, grpc::string_ref>( + StringRefFromSlice(&arr_.metadata[i].key), + StringRefFromSlice(&arr_.metadata[i].value))); + } + } +}; +} // namespace internal + +} // namespace grpc + +#endif // GRPCPP_IMPL_METADATA_MAP_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/proto_utils.h b/contrib/libs/grpc/include/grpcpp/impl/proto_utils.h new file mode 100644 index 0000000000..c6240ffa84 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/proto_utils.h @@ -0,0 +1,117 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_PROTO_UTILS_H +#define GRPCPP_IMPL_PROTO_UTILS_H + +#include <type_traits> + +#include <grpc/byte_buffer_reader.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/slice.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/codegen/config_protobuf.h> +#include <grpcpp/impl/serialization_traits.h> +#include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/proto_buffer_reader.h> +#include <grpcpp/support/proto_buffer_writer.h> +#include <grpcpp/support/slice.h> +#include <grpcpp/support/status.h> + +/// This header provides serialization and deserialization between gRPC +/// messages serialized using protobuf and the C++ objects they represent. + +namespace grpc { + +// ProtoBufferWriter must be a subclass of ::protobuf::io::ZeroCopyOutputStream. +template <class ProtoBufferWriter, class T> +Status GenericSerialize(const grpc::protobuf::MessageLite& msg, ByteBuffer* bb, + bool* own_buffer) { + static_assert(std::is_base_of<protobuf::io::ZeroCopyOutputStream, + ProtoBufferWriter>::value, + "ProtoBufferWriter must be a subclass of " + "::protobuf::io::ZeroCopyOutputStream"); + *own_buffer = true; + int byte_size = static_cast<int>(msg.ByteSizeLong()); + if (static_cast<size_t>(byte_size) <= GRPC_SLICE_INLINED_SIZE) { + Slice slice(byte_size); + // We serialize directly into the allocated slices memory + GPR_ASSERT(slice.end() == msg.SerializeWithCachedSizesToArray( + const_cast<uint8_t*>(slice.begin()))); + ByteBuffer tmp(&slice, 1); + bb->Swap(&tmp); + + return grpc::Status::OK; + } + ProtoBufferWriter writer(bb, kProtoBufferWriterMaxBufferLength, byte_size); + return msg.SerializeToZeroCopyStream(&writer) + ? grpc::Status::OK + : Status(StatusCode::INTERNAL, "Failed to serialize message"); +} + +// BufferReader must be a subclass of ::protobuf::io::ZeroCopyInputStream. +template <class ProtoBufferReader, class T> +Status GenericDeserialize(ByteBuffer* buffer, + grpc::protobuf::MessageLite* msg) { + static_assert(std::is_base_of<protobuf::io::ZeroCopyInputStream, + ProtoBufferReader>::value, + "ProtoBufferReader must be a subclass of " + "::protobuf::io::ZeroCopyInputStream"); + if (buffer == nullptr) { + return Status(StatusCode::INTERNAL, "No payload"); + } + Status result = grpc::Status::OK; + { + ProtoBufferReader reader(buffer); + if (!reader.status().ok()) { + return reader.status(); + } + if (!msg->ParseFromZeroCopyStream(&reader)) { + result = Status(StatusCode::INTERNAL, msg->InitializationErrorString()); + } + } + buffer->Clear(); + return result; +} + +// this is needed so the following class does not conflict with protobuf +// serializers that utilize internal-only tools. +#ifdef GRPC_OPEN_SOURCE_PROTO +// This class provides a protobuf serializer. It translates between protobuf +// objects and grpc_byte_buffers. More information about SerializationTraits can +// be found in include/grpcpp/impl/codegen/serialization_traits.h. +template <class T> +class SerializationTraits< + T, typename std::enable_if< + std::is_base_of<grpc::protobuf::MessageLite, T>::value>::type> { + public: + static Status Serialize(const grpc::protobuf::MessageLite& msg, + ByteBuffer* bb, bool* own_buffer) { + return GenericSerialize<ProtoBufferWriter, T>(msg, bb, own_buffer); + } + + static Status Deserialize(ByteBuffer* buffer, + grpc::protobuf::MessageLite* msg) { + return GenericDeserialize<ProtoBufferReader, T>(buffer, msg); + } +}; +#endif + +} // namespace grpc + +#endif // GRPCPP_IMPL_PROTO_UTILS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/rpc_method.h b/contrib/libs/grpc/include/grpcpp/impl/rpc_method.h index aeef8b778c..e1dcd00336 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/rpc_method.h +++ b/contrib/libs/grpc/include/grpcpp/impl/rpc_method.h @@ -1,24 +1,80 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_RPC_METHOD_H #define GRPCPP_IMPL_RPC_METHOD_H -#include <grpcpp/impl/codegen/rpc_method.h> // IWYU pragma: export +#include <memory> + +#include <grpcpp/impl/codegen/channel_interface.h> + +namespace grpc { +namespace internal { +/// Descriptor of an RPC method +class RpcMethod { + public: + enum RpcType { + NORMAL_RPC = 0, + CLIENT_STREAMING, // request streaming + SERVER_STREAMING, // response streaming + BIDI_STREAMING + }; + + RpcMethod(const char* name, RpcType type) + : name_(name), + suffix_for_stats_(nullptr), + method_type_(type), + channel_tag_(nullptr) {} + + RpcMethod(const char* name, const char* suffix_for_stats, RpcType type) + : name_(name), + suffix_for_stats_(suffix_for_stats), + method_type_(type), + channel_tag_(nullptr) {} + + RpcMethod(const char* name, RpcType type, + const std::shared_ptr<ChannelInterface>& channel) + : name_(name), + suffix_for_stats_(nullptr), + method_type_(type), + channel_tag_(channel->RegisterMethod(name)) {} + + RpcMethod(const char* name, const char* suffix_for_stats, RpcType type, + const std::shared_ptr<ChannelInterface>& channel) + : name_(name), + suffix_for_stats_(suffix_for_stats), + method_type_(type), + channel_tag_(channel->RegisterMethod(name)) {} + + const char* name() const { return name_; } + const char* suffix_for_stats() const { return suffix_for_stats_; } + RpcType method_type() const { return method_type_; } + void SetMethodType(RpcType type) { method_type_ = type; } + void* channel_tag() const { return channel_tag_; } + + private: + const char* const name_; + const char* const suffix_for_stats_; + RpcType method_type_; + void* const channel_tag_; +}; + +} // namespace internal +} // namespace grpc #endif // GRPCPP_IMPL_RPC_METHOD_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/rpc_service_method.h b/contrib/libs/grpc/include/grpcpp/impl/rpc_service_method.h index 86cb2dc5a7..73694263cd 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/rpc_service_method.h +++ b/contrib/libs/grpc/include/grpcpp/impl/rpc_service_method.h @@ -1,24 +1,153 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_RPC_SERVICE_METHOD_H #define GRPCPP_IMPL_RPC_SERVICE_METHOD_H -#include <grpcpp/impl/codegen/rpc_service_method.h> // IWYU pragma: export +#include <climits> +#include <functional> +#include <map> +#include <memory> +#include <vector> + +#include <grpc/support/log.h> +#include <grpcpp/impl/rpc_method.h> +#include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> + +namespace grpc { +class ServerContextBase; +namespace internal { +/// Base class for running an RPC handler. +class MethodHandler { + public: + virtual ~MethodHandler() {} + struct HandlerParameter { + /// Constructor for HandlerParameter + /// + /// \param c : the gRPC Call structure for this server call + /// \param context : the ServerContext structure for this server call + /// \param req : the request payload, if appropriate for this RPC + /// \param req_status : the request status after any interceptors have run + /// \param handler_data: internal data for the handler. + /// \param requester : used only by the callback API. It is a function + /// called by the RPC Controller to request another RPC (and also + /// to set up the state required to make that request possible) + HandlerParameter(Call* c, grpc::ServerContextBase* context, void* req, + Status req_status, void* handler_data, + std::function<void()> requester) + : call(c), + server_context(context), + request(req), + status(req_status), + internal_data(handler_data), + call_requester(std::move(requester)) {} + ~HandlerParameter() {} + Call* const call; + grpc::ServerContextBase* const server_context; + void* const request; + const Status status; + void* const internal_data; + const std::function<void()> call_requester; + }; + virtual void RunHandler(const HandlerParameter& param) = 0; + + // Returns a pointer to the deserialized request. \a status reflects the + // result of deserialization. This pointer and the status should be filled in + // a HandlerParameter and passed to RunHandler. It is illegal to access the + // pointer after calling RunHandler. Ownership of the deserialized request is + // retained by the handler. Returns nullptr if deserialization failed. + virtual void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, + Status* /*status*/, void** /*handler_data*/) { + GPR_ASSERT(req == nullptr); + return nullptr; + } +}; + +/// Server side rpc method class +class RpcServiceMethod : public RpcMethod { + public: + /// Takes ownership of the handler + RpcServiceMethod(const char* name, RpcMethod::RpcType type, + MethodHandler* handler) + : RpcMethod(name, type), + server_tag_(nullptr), + api_type_(ApiType::SYNC), + handler_(handler) {} + + enum class ApiType { + SYNC, + ASYNC, + RAW, + CALL_BACK, // not CALLBACK because that is reserved in Windows + RAW_CALL_BACK, + }; + + void set_server_tag(void* tag) { server_tag_ = tag; } + void* server_tag() const { return server_tag_; } + /// if MethodHandler is nullptr, then this is an async method + MethodHandler* handler() const { return handler_.get(); } + ApiType api_type() const { return api_type_; } + void SetHandler(MethodHandler* handler) { handler_.reset(handler); } + void SetServerApiType(RpcServiceMethod::ApiType type) { + if ((api_type_ == ApiType::SYNC) && + (type == ApiType::ASYNC || type == ApiType::RAW)) { + // this marks this method as async + handler_.reset(); + } else if (api_type_ != ApiType::SYNC) { + // this is not an error condition, as it allows users to declare a server + // like WithRawMethod_foo<AsyncService>. However since it + // overwrites behavior, it should be logged. + gpr_log( + GPR_INFO, + "You are marking method %s as '%s', even though it was " + "previously marked '%s'. This behavior will overwrite the original " + "behavior. If you expected this then ignore this message.", + name(), TypeToString(api_type_), TypeToString(type)); + } + api_type_ = type; + } + + private: + void* server_tag_; + ApiType api_type_; + std::unique_ptr<MethodHandler> handler_; + + const char* TypeToString(RpcServiceMethod::ApiType type) { + switch (type) { + case ApiType::SYNC: + return "sync"; + case ApiType::ASYNC: + return "async"; + case ApiType::RAW: + return "raw"; + case ApiType::CALL_BACK: + return "callback"; + case ApiType::RAW_CALL_BACK: + return "raw_callback"; + default: + GPR_UNREACHABLE_CODE(return "unknown"); + } + } +}; +} // namespace internal + +} // namespace grpc #endif // GRPCPP_IMPL_RPC_SERVICE_METHOD_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/serialization_traits.h b/contrib/libs/grpc/include/grpcpp/impl/serialization_traits.h index 6da8b4dfcc..83ba0bb2d5 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/serialization_traits.h +++ b/contrib/libs/grpc/include/grpcpp/impl/serialization_traits.h @@ -1,24 +1,62 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_SERIALIZATION_TRAITS_H #define GRPCPP_IMPL_SERIALIZATION_TRAITS_H -#include <grpcpp/impl/codegen/serialization_traits.h> // IWYU pragma: export +namespace grpc { + +/// Defines how to serialize and deserialize some type. +/// +/// Used for hooking different message serialization API's into GRPC. +/// Each SerializationTraits<Message> implementation must provide the +/// following functions: +/// 1. static Status Serialize(const Message& msg, +/// ByteBuffer* buffer, +/// bool* own_buffer); +/// OR +/// static Status Serialize(const Message& msg, +/// grpc_byte_buffer** buffer, +/// bool* own_buffer); +/// The former is preferred; the latter is deprecated +/// +/// 2. static Status Deserialize(ByteBuffer* buffer, +/// Message* msg); +/// OR +/// static Status Deserialize(grpc_byte_buffer* buffer, +/// Message* msg); +/// The former is preferred; the latter is deprecated +/// +/// Serialize is required to convert message to a ByteBuffer, and +/// return that byte buffer through *buffer. *own_buffer should +/// be set to true if the caller owns said byte buffer, or false if +/// ownership is retained elsewhere. +/// +/// Deserialize is required to convert buffer into the message stored at +/// msg. max_receive_message_size is passed in as a bound on the maximum +/// number of message bytes Deserialize should accept. +/// +/// Both functions return a Status, allowing them to explain what went +/// wrong if required. +template <class Message, + class UnusedButHereForPartialTemplateSpecialization = void> +class SerializationTraits; + +} // namespace grpc #endif // GRPCPP_IMPL_SERIALIZATION_TRAITS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/server_builder_option.h b/contrib/libs/grpc/include/grpcpp/impl/server_builder_option.h index c8f047b90e..d5745c6fb0 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/server_builder_option.h +++ b/contrib/libs/grpc/include/grpcpp/impl/server_builder_option.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_SERVER_BUILDER_OPTION_H #define GRPCPP_IMPL_SERVER_BUILDER_OPTION_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/server_builder_plugin.h b/contrib/libs/grpc/include/grpcpp/impl/server_builder_plugin.h index 8fedca2b14..ba5581d97e 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/server_builder_plugin.h +++ b/contrib/libs/grpc/include/grpcpp/impl/server_builder_plugin.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H #define GRPCPP_IMPL_SERVER_BUILDER_PLUGIN_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_callback_handlers.h b/contrib/libs/grpc/include/grpcpp/impl/server_callback_handlers.h index eac524f653..f8aa1d374a 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_callback_handlers.h +++ b/contrib/libs/grpc/include/grpcpp/impl/server_callback_handlers.h @@ -1,30 +1,30 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H -#define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H - -// IWYU pragma: private - -#include <grpcpp/impl/codegen/message_allocator.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/server_callback.h> -#include <grpcpp/impl/codegen/server_context.h> -#include <grpcpp/impl/codegen/status.h> +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#ifndef GRPCPP_IMPL_SERVER_CALLBACK_HANDLERS_H +#define GRPCPP_IMPL_SERVER_CALLBACK_HANDLERS_H + +#include <grpc/grpc.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/rpc_service_method.h> +#include <grpcpp/server_context.h> +#include <grpcpp/support/message_allocator.h> +#include <grpcpp/support/server_callback.h> +#include <grpcpp/support/status.h> namespace grpc { namespace internal { @@ -45,13 +45,13 @@ class CallbackUnaryHandler : public grpc::internal::MethodHandler { void RunHandler(const HandlerParameter& param) final { // Arena allocate a controller structure (that includes request/response) - grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + grpc_call_ref(param.call->call()); auto* allocator_state = static_cast<MessageHolder<RequestType, ResponseType>*>( param.internal_data); - auto* call = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - param.call->call(), sizeof(ServerCallbackUnaryImpl))) + auto* call = new (grpc_call_arena_alloc(param.call->call(), + sizeof(ServerCallbackUnaryImpl))) ServerCallbackUnaryImpl( static_cast<grpc::CallbackServerContext*>(param.server_context), param.call, allocator_state, param.call_requester); @@ -68,8 +68,8 @@ class CallbackUnaryHandler : public grpc::internal::MethodHandler { if (reactor == nullptr) { // if deserialization or reactor creator failed, we need to fail the call - reactor = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - param.call->call(), sizeof(UnimplementedUnaryReactor))) + reactor = new (grpc_call_arena_alloc(param.call->call(), + sizeof(UnimplementedUnaryReactor))) UnimplementedUnaryReactor( grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "")); } @@ -87,10 +87,9 @@ class CallbackUnaryHandler : public grpc::internal::MethodHandler { if (allocator_ != nullptr) { allocator_state = allocator_->AllocateMessages(); } else { - allocator_state = - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call, sizeof(DefaultMessageHolder<RequestType, ResponseType>))) - DefaultMessageHolder<RequestType, ResponseType>(); + allocator_state = new (grpc_call_arena_alloc( + call, sizeof(DefaultMessageHolder<RequestType, ResponseType>))) + DefaultMessageHolder<RequestType, ResponseType>(); } *handler_data = allocator_state; request = allocator_state->request(); @@ -147,7 +146,7 @@ class CallbackUnaryHandler : public grpc::internal::MethodHandler { } void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); // The callback for this function should not be marked inline because it // is directly invoking a user-controlled reaction @@ -210,7 +209,7 @@ class CallbackUnaryHandler : public grpc::internal::MethodHandler { ctx_->context_allocator()->Release(ctx_); } this->~ServerCallbackUnaryImpl(); // explicitly call destructor - grpc::g_core_codegen_interface->grpc_call_unref(call); + grpc_call_unref(call); call_requester(); } @@ -258,10 +257,10 @@ class CallbackClientStreamingHandler : public grpc::internal::MethodHandler { : get_reactor_(std::move(get_reactor)) {} void RunHandler(const HandlerParameter& param) final { // Arena allocate a reader structure (that includes response) - grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + grpc_call_ref(param.call->call()); - auto* reader = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - param.call->call(), sizeof(ServerCallbackReaderImpl))) + auto* reader = new (grpc_call_arena_alloc(param.call->call(), + sizeof(ServerCallbackReaderImpl))) ServerCallbackReaderImpl( static_cast<grpc::CallbackServerContext*>(param.server_context), param.call, param.call_requester); @@ -284,7 +283,7 @@ class CallbackClientStreamingHandler : public grpc::internal::MethodHandler { if (reactor == nullptr) { // if deserialization or reactor creator failed, we need to fail the call - reactor = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( + reactor = new (grpc_call_arena_alloc( param.call->call(), sizeof(UnimplementedReadReactor<RequestType>))) UnimplementedReadReactor<RequestType>( grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "")); @@ -333,7 +332,7 @@ class CallbackClientStreamingHandler : public grpc::internal::MethodHandler { } void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); // The callback for this function should not be inlined because it invokes // a user-controlled reaction, but any resulting OnDone can be inlined in @@ -407,7 +406,7 @@ class CallbackClientStreamingHandler : public grpc::internal::MethodHandler { ctx_->context_allocator()->Release(ctx_); } this->~ServerCallbackReaderImpl(); // explicitly call destructor - grpc::g_core_codegen_interface->grpc_call_unref(call); + grpc_call_unref(call); call_requester(); } @@ -449,10 +448,10 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { : get_reactor_(std::move(get_reactor)) {} void RunHandler(const HandlerParameter& param) final { // Arena allocate a writer structure - grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + grpc_call_ref(param.call->call()); - auto* writer = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - param.call->call(), sizeof(ServerCallbackWriterImpl))) + auto* writer = new (grpc_call_arena_alloc(param.call->call(), + sizeof(ServerCallbackWriterImpl))) ServerCallbackWriterImpl( static_cast<grpc::CallbackServerContext*>(param.server_context), param.call, static_cast<RequestType*>(param.request), @@ -475,7 +474,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { } if (reactor == nullptr) { // if deserialization or reactor creator failed, we need to fail the call - reactor = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( + reactor = new (grpc_call_arena_alloc( param.call->call(), sizeof(UnimplementedWriteReactor<ResponseType>))) UnimplementedWriteReactor<ResponseType>( grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "")); @@ -488,8 +487,8 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { grpc::Status* status, void** /*handler_data*/) final { grpc::ByteBuffer buf; buf.set_buffer(req); - auto* request = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call, sizeof(RequestType))) RequestType(); + auto* request = + new (grpc_call_arena_alloc(call, sizeof(RequestType))) RequestType(); *status = grpc::SerializationTraits<RequestType>::Deserialize(&buf, request); buf.Release(); @@ -535,7 +534,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { } void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); // The callback for this function should not be inlined because it invokes // a user-controlled reaction, but any resulting OnDone can be inlined in @@ -573,7 +572,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { ctx_->sent_initial_metadata_ = true; } // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); + GPR_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); call_.PerformOps(&write_ops_); } @@ -581,7 +580,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { grpc::Status s) override { // This combines the write into the finish callback // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); + GPR_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); Finish(std::move(s)); } @@ -632,7 +631,7 @@ class CallbackServerStreamingHandler : public grpc::internal::MethodHandler { ctx_->context_allocator()->Release(ctx_); } this->~ServerCallbackWriterImpl(); // explicitly call destructor - grpc::g_core_codegen_interface->grpc_call_unref(call); + grpc_call_unref(call); call_requester(); } @@ -674,9 +673,9 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { get_reactor) : get_reactor_(std::move(get_reactor)) {} void RunHandler(const HandlerParameter& param) final { - grpc::g_core_codegen_interface->grpc_call_ref(param.call->call()); + grpc_call_ref(param.call->call()); - auto* stream = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( + auto* stream = new (grpc_call_arena_alloc( param.call->call(), sizeof(ServerCallbackReaderWriterImpl))) ServerCallbackReaderWriterImpl( static_cast<grpc::CallbackServerContext*>(param.server_context), @@ -699,7 +698,7 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { if (reactor == nullptr) { // if deserialization or reactor creator failed, we need to fail the call - reactor = new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( + reactor = new (grpc_call_arena_alloc( param.call->call(), sizeof(UnimplementedBidiReactor<RequestType, ResponseType>))) UnimplementedBidiReactor<RequestType, ResponseType>( @@ -745,7 +744,7 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { } void SendInitialMetadata() override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); this->Ref(); // The callback for this function should not be inlined because it invokes // a user-controlled reaction, but any resulting OnDone can be inlined in @@ -783,14 +782,14 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { ctx_->sent_initial_metadata_ = true; } // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); + GPR_ASSERT(write_ops_.SendMessagePtr(resp, options).ok()); call_.PerformOps(&write_ops_); } void WriteAndFinish(const ResponseType* resp, grpc::WriteOptions options, grpc::Status s) override { // TODO(vjpai): don't assert - GPR_CODEGEN_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); + GPR_ASSERT(finish_ops_.SendMessagePtr(resp, options).ok()); Finish(std::move(s)); } @@ -848,7 +847,7 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { ctx_->context_allocator()->Release(ctx_); } this->~ServerCallbackReaderWriterImpl(); // explicitly call destructor - grpc::g_core_codegen_interface->grpc_call_unref(call); + grpc_call_unref(call); call_requester(); } @@ -886,4 +885,4 @@ class CallbackBidiHandler : public grpc::internal::MethodHandler { } // namespace internal } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_HANDLERS_H +#endif // GRPCPP_IMPL_SERVER_CALLBACK_HANDLERS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/server_initializer.h b/contrib/libs/grpc/include/grpcpp/impl/server_initializer.h index 17928e9a4a..f4981c80f9 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/server_initializer.h +++ b/contrib/libs/grpc/include/grpcpp/impl/server_initializer.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_SERVER_INITIALIZER_H #define GRPCPP_IMPL_SERVER_INITIALIZER_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/service_type.h b/contrib/libs/grpc/include/grpcpp/impl/service_type.h index de45c4266a..9699e2328d 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/service_type.h +++ b/contrib/libs/grpc/include/grpcpp/impl/service_type.h @@ -1,24 +1,235 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_IMPL_SERVICE_TYPE_H #define GRPCPP_IMPL_SERVICE_TYPE_H -#include <grpcpp/impl/codegen/service_type.h> // IWYU pragma: export +#include <grpc/support/log.h> +#include <grpcpp/impl/rpc_service_method.h> +#include <grpcpp/impl/serialization_traits.h> +#include <grpcpp/server_interface.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> + +namespace grpc { + +class CompletionQueue; +class ServerContext; +class ServerInterface; + +namespace internal { +class Call; +class ServerAsyncStreamingInterface { + public: + virtual ~ServerAsyncStreamingInterface() {} + + /// Request notification of the sending of initial metadata to the client. + /// Completion will be notified by \a tag on the associated completion + /// queue. This call is optional, but if it is used, it cannot be used + /// concurrently with or after the \a Finish method. + /// + /// \param[in] tag Tag identifying this request. + virtual void SendInitialMetadata(void* tag) = 0; + + private: + friend class grpc::ServerInterface; + virtual void BindCall(Call* call) = 0; +}; +} // namespace internal + +/// Descriptor of an RPC service and its various RPC methods +class Service { + public: + Service() : server_(nullptr) {} + virtual ~Service() {} + + bool has_async_methods() const { + for (const auto& method : methods_) { + if (method && method->handler() == nullptr) { + return true; + } + } + return false; + } + + bool has_synchronous_methods() const { + for (const auto& method : methods_) { + if (method && + method->api_type() == internal::RpcServiceMethod::ApiType::SYNC) { + return true; + } + } + return false; + } + + bool has_callback_methods() const { + for (const auto& method : methods_) { + if (method && (method->api_type() == + internal::RpcServiceMethod::ApiType::CALL_BACK || + method->api_type() == + internal::RpcServiceMethod::ApiType::RAW_CALL_BACK)) { + return true; + } + } + return false; + } + + bool has_generic_methods() const { + for (const auto& method : methods_) { + if (method == nullptr) { + return true; + } + } + return false; + } + + protected: + template <class Message> + void RequestAsyncUnary(int index, grpc::ServerContext* context, + Message* request, + internal::ServerAsyncStreamingInterface* stream, + grpc::CompletionQueue* call_cq, + grpc::ServerCompletionQueue* notification_cq, + void* tag) { + // Typecast the index to size_t for indexing into a vector + // while preserving the API that existed before a compiler + // warning was first seen (grpc/grpc#11664) + size_t idx = static_cast<size_t>(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag, request); + } + void RequestAsyncClientStreaming( + int index, grpc::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + grpc::CompletionQueue* call_cq, + grpc::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast<size_t>(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag); + } + template <class Message> + void RequestAsyncServerStreaming( + int index, grpc::ServerContext* context, Message* request, + internal::ServerAsyncStreamingInterface* stream, + grpc::CompletionQueue* call_cq, + grpc::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast<size_t>(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag, request); + } + void RequestAsyncBidiStreaming( + int index, grpc::ServerContext* context, + internal::ServerAsyncStreamingInterface* stream, + grpc::CompletionQueue* call_cq, + grpc::ServerCompletionQueue* notification_cq, void* tag) { + size_t idx = static_cast<size_t>(index); + server_->RequestAsyncCall(methods_[idx].get(), context, stream, call_cq, + notification_cq, tag); + } + + void AddMethod(internal::RpcServiceMethod* method) { + methods_.emplace_back(method); + } + + void MarkMethodAsync(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT(methods_[idx].get() != nullptr && + "Cannot mark the method as 'async' because it has already been " + "marked as 'generic'."); + methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::ASYNC); + } + + void MarkMethodRaw(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT(methods_[idx].get() != nullptr && + "Cannot mark the method as 'raw' because it has already " + "been marked as 'generic'."); + methods_[idx]->SetServerApiType(internal::RpcServiceMethod::ApiType::RAW); + } + + void MarkMethodGeneric(int index) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT( + methods_[idx]->handler() != nullptr && + "Cannot mark the method as 'generic' because it has already been " + "marked as 'async' or 'raw'."); + methods_[idx].reset(); + } + + void MarkMethodStreamed(int index, internal::MethodHandler* streamed_method) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT(methods_[idx] && methods_[idx]->handler() && + "Cannot mark an async or generic method Streamed"); + methods_[idx]->SetHandler(streamed_method); + + // From the server's point of view, streamed unary is a special + // case of BIDI_STREAMING that has 1 read and 1 write, in that order, + // and split server-side streaming is BIDI_STREAMING with 1 read and + // any number of writes, in that order. + methods_[idx]->SetMethodType(internal::RpcMethod::BIDI_STREAMING); + } + + void MarkMethodCallback(int index, internal::MethodHandler* handler) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT( + methods_[idx].get() != nullptr && + "Cannot mark the method as 'callback' because it has already been " + "marked as 'generic'."); + methods_[idx]->SetHandler(handler); + methods_[idx]->SetServerApiType( + internal::RpcServiceMethod::ApiType::CALL_BACK); + } + + void MarkMethodRawCallback(int index, internal::MethodHandler* handler) { + // This does not have to be a hard error, however no one has approached us + // with a use case yet. Please file an issue if you believe you have one. + size_t idx = static_cast<size_t>(index); + GPR_ASSERT( + methods_[idx].get() != nullptr && + "Cannot mark the method as 'raw callback' because it has already " + "been marked as 'generic'."); + methods_[idx]->SetHandler(handler); + methods_[idx]->SetServerApiType( + internal::RpcServiceMethod::ApiType::RAW_CALL_BACK); + } + + internal::MethodHandler* GetHandler(int index) { + size_t idx = static_cast<size_t>(index); + return methods_[idx]->handler(); + } + + private: + friend class Server; + friend class ServerInterface; + ServerInterface* server_; + std::vector<std::unique_ptr<internal::RpcServiceMethod>> methods_; +}; + +} // namespace grpc #endif // GRPCPP_IMPL_SERVICE_TYPE_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/status.h b/contrib/libs/grpc/include/grpcpp/impl/status.h new file mode 100644 index 0000000000..adb9b2e683 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/status.h @@ -0,0 +1,141 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_STATUS_H +#define GRPCPP_IMPL_STATUS_H + +// IWYU pragma: private, include <grpcpp/support/status.h> + +#include <grpc/support/port_platform.h> + +#include <grpc/status.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status_code_enum.h> + +namespace grpc { + +/// Did it work? If it didn't, why? +/// +/// See \a grpc::StatusCode for details on the available code and their meaning. +class GRPC_MUST_USE_RESULT_WHEN_USE_STRICT_WARNING Status { + public: + /// Construct an OK instance. + Status() : code_(StatusCode::OK) { + // Static assertions to make sure that the C++ API value correctly + // maps to the core surface API value + static_assert(StatusCode::OK == static_cast<StatusCode>(GRPC_STATUS_OK), + "Mismatched status code"); + static_assert( + StatusCode::CANCELLED == static_cast<StatusCode>(GRPC_STATUS_CANCELLED), + "Mismatched status code"); + static_assert( + StatusCode::UNKNOWN == static_cast<StatusCode>(GRPC_STATUS_UNKNOWN), + "Mismatched status code"); + static_assert(StatusCode::INVALID_ARGUMENT == + static_cast<StatusCode>(GRPC_STATUS_INVALID_ARGUMENT), + "Mismatched status code"); + static_assert(StatusCode::DEADLINE_EXCEEDED == + static_cast<StatusCode>(GRPC_STATUS_DEADLINE_EXCEEDED), + "Mismatched status code"); + static_assert( + StatusCode::NOT_FOUND == static_cast<StatusCode>(GRPC_STATUS_NOT_FOUND), + "Mismatched status code"); + static_assert(StatusCode::ALREADY_EXISTS == + static_cast<StatusCode>(GRPC_STATUS_ALREADY_EXISTS), + "Mismatched status code"); + static_assert(StatusCode::PERMISSION_DENIED == + static_cast<StatusCode>(GRPC_STATUS_PERMISSION_DENIED), + "Mismatched status code"); + static_assert(StatusCode::UNAUTHENTICATED == + static_cast<StatusCode>(GRPC_STATUS_UNAUTHENTICATED), + "Mismatched status code"); + static_assert(StatusCode::RESOURCE_EXHAUSTED == + static_cast<StatusCode>(GRPC_STATUS_RESOURCE_EXHAUSTED), + "Mismatched status code"); + static_assert(StatusCode::FAILED_PRECONDITION == + static_cast<StatusCode>(GRPC_STATUS_FAILED_PRECONDITION), + "Mismatched status code"); + static_assert( + StatusCode::ABORTED == static_cast<StatusCode>(GRPC_STATUS_ABORTED), + "Mismatched status code"); + static_assert(StatusCode::OUT_OF_RANGE == + static_cast<StatusCode>(GRPC_STATUS_OUT_OF_RANGE), + "Mismatched status code"); + static_assert(StatusCode::UNIMPLEMENTED == + static_cast<StatusCode>(GRPC_STATUS_UNIMPLEMENTED), + "Mismatched status code"); + static_assert( + StatusCode::INTERNAL == static_cast<StatusCode>(GRPC_STATUS_INTERNAL), + "Mismatched status code"); + static_assert(StatusCode::UNAVAILABLE == + static_cast<StatusCode>(GRPC_STATUS_UNAVAILABLE), + "Mismatched status code"); + static_assert( + StatusCode::DATA_LOSS == static_cast<StatusCode>(GRPC_STATUS_DATA_LOSS), + "Mismatched status code"); + } + + /// Construct an instance with associated \a code and \a error_message. + /// It is an error to construct an OK status with non-empty \a error_message. + /// Note that \a message is intentionally accepted as a const reference + /// instead of a value (which results in a copy instead of a move) to allow + /// for easy transition to y_absl::Status in the future which accepts an + /// y_absl::string_view as a parameter. + Status(StatusCode code, const TString& error_message) + : code_(code), error_message_(error_message) {} + + /// Construct an instance with \a code, \a error_message and + /// \a error_details. It is an error to construct an OK status with non-empty + /// \a error_message and/or \a error_details. + Status(StatusCode code, const TString& error_message, + const TString& error_details) + : code_(code), + error_message_(error_message), + binary_error_details_(error_details) {} + + // Pre-defined special status objects. + /// An OK pre-defined instance. + static const Status& OK; + /// A CANCELLED pre-defined instance. + static const Status& CANCELLED; + + /// Return the instance's error code. + StatusCode error_code() const { return code_; } + /// Return the instance's error message. + TString error_message() const { return error_message_; } + /// Return the (binary) error details. + // Usually it contains a serialized google.rpc.Status proto. + TString error_details() const { return binary_error_details_; } + + /// Is the status OK? + bool ok() const { return code_ == StatusCode::OK; } + + // Ignores any errors. This method does nothing except potentially suppress + // complaints from any tools that are checking that errors are not dropped on + // the floor. + void IgnoreError() const {} + + private: + StatusCode code_; + TString error_message_; + TString binary_error_details_; +}; + +} // namespace grpc + +#endif // GRPCPP_IMPL_STATUS_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/sync.h b/contrib/libs/grpc/include/grpcpp/impl/sync.h new file mode 100644 index 0000000000..1096a4bb06 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/impl/sync.h @@ -0,0 +1,150 @@ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_IMPL_SYNC_H +#define GRPCPP_IMPL_SYNC_H + +#include <grpc/support/port_platform.h> + +#ifdef GPR_HAS_PTHREAD_H +#include <pthread.h> +#endif + +#include <mutex> + +#include "y_absl/synchronization/mutex.h" + +#include <grpc/support/log.h> +#include <grpc/support/sync.h> +#include <grpc/support/time.h> + +// The core library is not accessible in C++ codegen headers, and vice versa. +// Thus, we need to have duplicate headers with similar functionality. +// Make sure any change to this file is also reflected in +// src/core/lib/gprpp/sync.h too. +// +// Whenever possible, prefer "src/core/lib/gprpp/sync.h" over this file, +// since in core we do not rely on g_core_codegen_interface and hence do not +// pay the costs of virtual function calls. + +namespace grpc { +namespace internal { + +#ifdef GPR_ABSEIL_SYNC + +using Mutex = y_absl::Mutex; +using MutexLock = y_absl::MutexLock; +using ReleasableMutexLock = y_absl::ReleasableMutexLock; +using CondVar = y_absl::CondVar; + +#else + +class Y_ABSL_LOCKABLE Mutex { + public: + Mutex() { gpr_mu_init(&mu_); } + ~Mutex() { gpr_mu_destroy(&mu_); } + + Mutex(const Mutex&) = delete; + Mutex& operator=(const Mutex&) = delete; + + void Lock() Y_ABSL_EXCLUSIVE_LOCK_FUNCTION() { gpr_mu_lock(&mu_); } + void Unlock() Y_ABSL_UNLOCK_FUNCTION() { gpr_mu_unlock(&mu_); } + + private: + union { + gpr_mu mu_; + std::mutex do_not_use_sth_; +#ifdef GPR_HAS_PTHREAD_H + pthread_mutex_t do_not_use_pth_; +#endif + }; + + friend class CondVar; +}; + +class Y_ABSL_SCOPED_LOCKABLE MutexLock { + public: + explicit MutexLock(Mutex* mu) Y_ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) : mu_(mu) { + mu_->Lock(); + } + ~MutexLock() Y_ABSL_UNLOCK_FUNCTION() { mu_->Unlock(); } + + MutexLock(const MutexLock&) = delete; + MutexLock& operator=(const MutexLock&) = delete; + + private: + Mutex* const mu_; +}; + +class Y_ABSL_SCOPED_LOCKABLE ReleasableMutexLock { + public: + explicit ReleasableMutexLock(Mutex* mu) Y_ABSL_EXCLUSIVE_LOCK_FUNCTION(mu) + : mu_(mu) { + mu_->Lock(); + } + ~ReleasableMutexLock() Y_ABSL_UNLOCK_FUNCTION() { + if (!released_) mu_->Unlock(); + } + + ReleasableMutexLock(const ReleasableMutexLock&) = delete; + ReleasableMutexLock& operator=(const ReleasableMutexLock&) = delete; + + void Release() Y_ABSL_UNLOCK_FUNCTION() { + GPR_DEBUG_ASSERT(!released_); + released_ = true; + mu_->Unlock(); + } + + private: + Mutex* const mu_; + bool released_ = false; +}; + +class CondVar { + public: + CondVar() { gpr_cv_init(&cv_); } + ~CondVar() { gpr_cv_destroy(&cv_); } + + CondVar(const CondVar&) = delete; + CondVar& operator=(const CondVar&) = delete; + + void Signal() { gpr_cv_signal(&cv_); } + void SignalAll() { gpr_cv_broadcast(&cv_); } + + void Wait(Mutex* mu) { + gpr_cv_wait(&cv_, &mu->mu_, gpr_inf_future(GPR_CLOCK_REALTIME)); + } + + private: + gpr_cv cv_; +}; + +#endif // GPR_ABSEIL_SYNC + +template <typename Predicate> +GRPC_DEPRECATED("incompatible with thread safety analysis") +static void WaitUntil(CondVar* cv, Mutex* mu, Predicate pred) { + while (!pred()) { + cv->Wait(mu); + } +} + +} // namespace internal +} // namespace grpc + +#endif // GRPCPP_IMPL_SYNC_H diff --git a/contrib/libs/grpc/include/grpcpp/resource_quota.h b/contrib/libs/grpc/include/grpcpp/resource_quota.h index 1a8ac2c58b..c482f46b84 100644 --- a/contrib/libs/grpc/include/grpcpp/resource_quota.h +++ b/contrib/libs/grpc/include/grpcpp/resource_quota.h @@ -1,28 +1,28 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_RESOURCE_QUOTA_H #define GRPCPP_RESOURCE_QUOTA_H struct grpc_resource_quota; -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/grpc_library.h> +#include <grpcpp/impl/grpc_library.h> +#include <grpcpp/support/config.h> namespace grpc { @@ -31,7 +31,7 @@ namespace grpc { /// or a client channel (via \a ChannelArguments). /// gRPC will attempt to keep memory and threads used by all attached entities /// below the ResourceQuota bound. -class ResourceQuota final : private grpc::GrpcLibraryCodegen { +class ResourceQuota final : private grpc::internal::GrpcLibrary { public: /// \param name - a unique name for this ResourceQuota. explicit ResourceQuota(const TString& name); diff --git a/contrib/libs/grpc/include/grpcpp/security/auth_context.h b/contrib/libs/grpc/include/grpcpp/security/auth_context.h index 17784508e2..19be46f878 100644 --- a/contrib/libs/grpc/include/grpcpp/security/auth_context.h +++ b/contrib/libs/grpc/include/grpcpp/security/auth_context.h @@ -1,24 +1,99 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SECURITY_AUTH_CONTEXT_H #define GRPCPP_SECURITY_AUTH_CONTEXT_H -#include <grpcpp/impl/codegen/security/auth_context.h> // IWYU pragma: export +#include <iterator> +#include <vector> + +#include <grpcpp/support/config.h> +#include <grpcpp/support/string_ref.h> + +struct grpc_auth_context; +struct grpc_auth_property; +struct grpc_auth_property_iterator; + +namespace grpc { +class SecureAuthContext; + +typedef std::pair<string_ref, string_ref> AuthProperty; + +class AuthPropertyIterator { + public: + using iterator_category = std::forward_iterator_tag; + using value_type = const AuthProperty; + using pointer = void; + using reference = void; + using difference_type = std::ptrdiff_t; + + ~AuthPropertyIterator(); + AuthPropertyIterator& operator++(); + AuthPropertyIterator operator++(int); + bool operator==(const AuthPropertyIterator& rhs) const; + bool operator!=(const AuthPropertyIterator& rhs) const; + AuthProperty operator*(); + + protected: + AuthPropertyIterator(); + AuthPropertyIterator(const grpc_auth_property* property, + const grpc_auth_property_iterator* iter); + + private: + friend class SecureAuthContext; + const grpc_auth_property* property_; + // The following items form a grpc_auth_property_iterator. + const grpc_auth_context* ctx_; + size_t index_; + const char* name_; +}; + +/// Class encapsulating the Authentication Information. +/// +/// It includes the secure identity of the peer, the type of secure transport +/// used as well as any other properties required by the authorization layer. +class AuthContext { + public: + virtual ~AuthContext() {} + + /// Returns true if the peer is authenticated. + virtual bool IsPeerAuthenticated() const = 0; + + /// A peer identity. + /// + /// It is, in general, comprised of one or more properties (in which case they + /// have the same name). + virtual std::vector<grpc::string_ref> GetPeerIdentity() const = 0; + virtual TString GetPeerIdentityPropertyName() const = 0; + + /// Returns all the property values with the given name. + virtual std::vector<grpc::string_ref> FindPropertyValues( + const TString& name) const = 0; + + /// Iteration over all the properties. + virtual AuthPropertyIterator begin() const = 0; + virtual AuthPropertyIterator end() const = 0; + + /// Mutation functions: should only be used by an AuthMetadataProcessor. + virtual void AddProperty(const TString& key, const string_ref& value) = 0; + virtual bool SetPeerIdentityPropertyName(const TString& name) = 0; +}; + +} // namespace grpc #endif // GRPCPP_SECURITY_AUTH_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/security/auth_metadata_processor.h b/contrib/libs/grpc/include/grpcpp/security/auth_metadata_processor.h index 3251c8a9b8..4705053b04 100644 --- a/contrib/libs/grpc/include/grpcpp/security/auth_metadata_processor.h +++ b/contrib/libs/grpc/include/grpcpp/security/auth_metadata_processor.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H #define GRPCPP_SECURITY_AUTH_METADATA_PROCESSOR_H diff --git a/contrib/libs/grpc/include/grpcpp/security/authorization_policy_provider.h b/contrib/libs/grpc/include/grpcpp/security/authorization_policy_provider.h index 6a1193c593..26b464f1a5 100644 --- a/contrib/libs/grpc/include/grpcpp/security/authorization_policy_provider.h +++ b/contrib/libs/grpc/include/grpcpp/security/authorization_policy_provider.h @@ -19,7 +19,7 @@ #include <grpc/grpc_security.h> #include <grpc/status.h> -#include <grpcpp/impl/codegen/grpc_library.h> +#include <grpcpp/impl/codegen/status.h> namespace grpc { namespace experimental { diff --git a/contrib/libs/grpc/include/grpcpp/security/credentials.h b/contrib/libs/grpc/include/grpcpp/security/credentials.h index ec194aecc3..5a71057e6a 100644 --- a/contrib/libs/grpc/include/grpcpp/security/credentials.h +++ b/contrib/libs/grpc/include/grpcpp/security/credentials.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SECURITY_CREDENTIALS_H #define GRPCPP_SECURITY_CREDENTIALS_H @@ -29,7 +29,7 @@ #include <grpc/grpc_security_constants.h> #include <grpcpp/channel.h> -#include <grpcpp/impl/codegen/grpc_library.h> +#include <grpcpp/impl/grpc_library.h> #include <grpcpp/security/auth_context.h> #include <grpcpp/security/tls_credentials_options.h> #include <grpcpp/support/channel_arguments.h> @@ -58,12 +58,6 @@ std::shared_ptr<grpc::Channel> CreateCustomChannelWithInterceptors( std::vector< std::unique_ptr<grpc::experimental::ClientInterceptorFactoryInterface>> interceptor_creators); - -GRPC_DEPRECATED( - "Use grpc::XdsCredentials instead. The experimental version will be " - "deleted after the 1.41 release.") -std::shared_ptr<ChannelCredentials> XdsCredentials( - const std::shared_ptr<ChannelCredentials>& fallback_creds); } // namespace experimental /// Builds XDS Credentials. @@ -76,11 +70,8 @@ std::shared_ptr<ChannelCredentials> XdsCredentials( /// for all the calls on that channel. /// /// \see https://grpc.io/docs/guides/auth.html -class ChannelCredentials : private grpc::GrpcLibraryCodegen { +class ChannelCredentials : private grpc::internal::GrpcLibrary { public: - ChannelCredentials(); - ~ChannelCredentials() override; - protected: friend std::shared_ptr<ChannelCredentials> CompositeChannelCredentials( const std::shared_ptr<ChannelCredentials>& channel_creds, @@ -133,11 +124,8 @@ class ChannelCredentials : private grpc::GrpcLibraryCodegen { /// authenticate with a server for a given call on a channel. /// /// \see https://grpc.io/docs/guides/auth.html -class CallCredentials : private grpc::GrpcLibraryCodegen { +class CallCredentials : private grpc::internal::GrpcLibrary { public: - CallCredentials(); - ~CallCredentials() override; - /// Apply this instance's credentials to \a call. virtual bool ApplyToCall(grpc_call* call) = 0; virtual grpc::string DebugString() { diff --git a/contrib/libs/grpc/include/grpcpp/security/server_credentials.h b/contrib/libs/grpc/include/grpcpp/security/server_credentials.h index d402cd62a7..9731cc6a83 100644 --- a/contrib/libs/grpc/include/grpcpp/security/server_credentials.h +++ b/contrib/libs/grpc/include/grpcpp/security/server_credentials.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SECURITY_SERVER_CREDENTIALS_H #define GRPCPP_SECURITY_SERVER_CREDENTIALS_H @@ -23,6 +23,7 @@ #include <vector> #include <grpc/grpc_security_constants.h> +#include <grpcpp/impl/grpc_library.h> #include <grpcpp/security/auth_metadata_processor.h> #include <grpcpp/security/tls_credentials_options.h> #include <grpcpp/support/config.h> @@ -64,20 +65,9 @@ struct SslServerCredentialsOptions { std::shared_ptr<ServerCredentials> XdsServerCredentials( const std::shared_ptr<ServerCredentials>& fallback_credentials); -namespace experimental { -GRPC_DEPRECATED( - "Use grpc::XdsServerCredentials instead. The experimental version will be " - "deleted after the 1.41 release.") -std::shared_ptr<ServerCredentials> XdsServerCredentials( - const std::shared_ptr<ServerCredentials>& fallback_credentials); -} // namespace experimental - /// Wrapper around \a grpc_server_credentials, a way to authenticate a server. -class ServerCredentials : private grpc::GrpcLibraryCodegen { +class ServerCredentials : private grpc::internal::GrpcLibrary { public: - ServerCredentials(); - ~ServerCredentials() override; - /// This method is not thread-safe and has to be called before the server is /// started. The last call to this function wins. virtual void SetAuthMetadataProcessor( diff --git a/contrib/libs/grpc/include/grpcpp/security/tls_certificate_provider.h b/contrib/libs/grpc/include/grpcpp/security/tls_certificate_provider.h index 1e1027afe9..d5636ee223 100644 --- a/contrib/libs/grpc/include/grpcpp/security/tls_certificate_provider.h +++ b/contrib/libs/grpc/include/grpcpp/security/tls_certificate_provider.h @@ -24,7 +24,6 @@ #include <grpc/grpc_security_constants.h> #include <grpc/status.h> #include <grpc/support/log.h> -#include <grpcpp/impl/codegen/grpc_library.h> #include <grpcpp/support/config.h> namespace grpc { diff --git a/contrib/libs/grpc/include/grpcpp/security/tls_certificate_verifier.h b/contrib/libs/grpc/include/grpcpp/security/tls_certificate_verifier.h index 7635916eb7..9d0d65a2bf 100644 --- a/contrib/libs/grpc/include/grpcpp/security/tls_certificate_verifier.h +++ b/contrib/libs/grpc/include/grpcpp/security/tls_certificate_verifier.h @@ -26,10 +26,10 @@ #include <grpc/grpc_security_constants.h> #include <grpc/status.h> #include <grpc/support/log.h> -#include <grpcpp/impl/codegen/grpc_library.h> -#include <grpcpp/impl/codegen/sync.h> #include <grpcpp/impl/grpc_library.h> +#include <grpcpp/impl/sync.h> #include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> #include <grpcpp/support/string_ref.h> // TODO(yihuazhang): remove the forward declaration here and include @@ -141,8 +141,6 @@ class ExternalCertificateVerifier { // Subclass. template <typename Subclass, typename... Args> static std::shared_ptr<CertificateVerifier> Create(Args&&... args) { - grpc::internal::GrpcLibraryInitializer g_gli_initializer; - g_gli_initializer.summon(); auto* external_verifier = new Subclass(std::forward<Args>(args)...); return std::make_shared<CertificateVerifier>( grpc_tls_certificate_verifier_external_create( diff --git a/contrib/libs/grpc/include/grpcpp/security/tls_credentials_options.h b/contrib/libs/grpc/include/grpcpp/security/tls_credentials_options.h index fcb5c3f4bf..0af12aebef 100644 --- a/contrib/libs/grpc/include/grpcpp/security/tls_credentials_options.h +++ b/contrib/libs/grpc/include/grpcpp/security/tls_credentials_options.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H #define GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H diff --git a/contrib/libs/grpc/include/grpcpp/server.h b/contrib/libs/grpc/include/grpcpp/server.h index 50ee46f70e..b9d98504ff 100644 --- a/contrib/libs/grpc/include/grpcpp/server.h +++ b/contrib/libs/grpc/include/grpcpp/server.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SERVER_H #define GRPCPP_SERVER_H @@ -23,7 +23,7 @@ #pragma GCC system_header #endif -#include <grpc/impl/codegen/port_platform.h> +#include <grpc/support/port_platform.h> #include <list> #include <memory> @@ -35,11 +35,10 @@ #include <grpcpp/completion_queue.h> #include <grpcpp/health_check_service_interface.h> #include <grpcpp/impl/call.h> -#include <grpcpp/impl/codegen/completion_queue.h> -#include <grpcpp/impl/codegen/grpc_library.h> -#include <grpcpp/impl/codegen/server_interface.h> +#include <grpcpp/impl/grpc_library.h> #include <grpcpp/impl/rpc_service_method.h> #include <grpcpp/security/server_credentials.h> +#include <grpcpp/server_interface.h> #include <grpcpp/support/channel_arguments.h> #include <grpcpp/support/client_interceptor.h> #include <grpcpp/support/config.h> @@ -60,7 +59,7 @@ class ExternalConnectionAcceptorImpl; /// /// Use a \a grpc::ServerBuilder to create, configure, and start /// \a Server instances. -class Server : public ServerInterface, private GrpcLibraryCodegen { +class Server : public ServerInterface, private internal::GrpcLibrary { public: ~Server() Y_ABSL_LOCKS_EXCLUDED(mu_) override; @@ -188,7 +187,8 @@ class Server : public ServerInterface, private GrpcLibraryCodegen { std::vector< std::unique_ptr<experimental::ServerInterceptorFactoryInterface>> interceptor_creators = std::vector<std::unique_ptr< - experimental::ServerInterceptorFactoryInterface>>()); + experimental::ServerInterceptorFactoryInterface>>(), + experimental::ServerMetricRecorder* server_metric_recorder = nullptr); /// Start the server. /// @@ -200,7 +200,6 @@ class Server : public ServerInterface, private GrpcLibraryCodegen { grpc_server* server() override { return server_; } - protected: /// NOTE: This method is not part of the public API for this class. void set_health_check_service( std::unique_ptr<HealthCheckServiceInterface> service) { @@ -261,6 +260,14 @@ class Server : public ServerInterface, private GrpcLibraryCodegen { return max_receive_message_size_; } + bool call_metric_recording_enabled() const override { + return call_metric_recording_enabled_; + } + + experimental::ServerMetricRecorder* server_metric_recorder() const override { + return server_metric_recorder_; + } + CompletionQueue* CallbackCQ() Y_ABSL_LOCKS_EXCLUDED(mu_) override; ServerInitializer* initializer(); @@ -344,6 +351,12 @@ class Server : public ServerInterface, private GrpcLibraryCodegen { // Shutdown. Even though this is only used with NDEBUG, instantiate it in all // cases since otherwise the size will be inconsistent. std::vector<CompletionQueue*> cq_list_; + + // Whetner per-call load reporting is enabled. + bool call_metric_recording_enabled_ = false; + + // Interface to read or update server-wide metrics. Optional. + experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr; }; } // namespace grpc diff --git a/contrib/libs/grpc/include/grpcpp/server_builder.h b/contrib/libs/grpc/include/grpcpp/server_builder.h index 3619018c5b..5afa218f4d 100644 --- a/contrib/libs/grpc/include/grpcpp/server_builder.h +++ b/contrib/libs/grpc/include/grpcpp/server_builder.h @@ -1,25 +1,25 @@ -/* - * - * Copyright 2015-2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015-2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SERVER_BUILDER_H #define GRPCPP_SERVER_BUILDER_H -#include <grpc/impl/codegen/port_platform.h> +#include <grpc/support/port_platform.h> #include <climits> #include <map> @@ -30,12 +30,12 @@ #include <grpc/support/cpu.h> #include <grpc/support/workaround_list.h> #include <grpcpp/impl/channel_argument_option.h> -#include <grpcpp/impl/codegen/server_interceptor.h> #include <grpcpp/impl/server_builder_option.h> #include <grpcpp/impl/server_builder_plugin.h> #include <grpcpp/security/authorization_policy_provider.h> #include <grpcpp/server.h> #include <grpcpp/support/config.h> +#include <grpcpp/support/server_interceptor.h> struct grpc_resource_quota; @@ -59,7 +59,6 @@ class ExternalConnectionAcceptorImpl; class CallbackGenericService; namespace experimental { -class OrcaServerInterceptorFactory; // EXPERIMENTAL API: // Interface for a grpc server to build transports with connections created out // of band. @@ -283,6 +282,16 @@ class ServerBuilder { std::shared_ptr<experimental::AuthorizationPolicyProviderInterface> provider); + /// Enables per-call load reporting. The server will automatically send the + /// load metrics after each RPC. The caller can report load metrics for the + /// current call to what ServerContext::ExperimentalGetCallMetricRecorder() + /// returns. The server merges metrics from the optional + /// server_metric_recorder when provided where the call metric recorder take + /// a higher precedence. The caller owns and must ensure the server metric + /// recorder outlives the server. + void EnableCallMetricRecording( + experimental::ServerMetricRecorder* server_metric_recorder = nullptr); + private: ServerBuilder* builder_; }; @@ -328,6 +337,7 @@ class ServerBuilder { /// Experimental, to be deprecated std::vector<NamedService*> services() { std::vector<NamedService*> service_refs; + service_refs.reserve(services_.size()); for (auto& ptr : services_) { service_refs.push_back(ptr.get()); } @@ -337,6 +347,7 @@ class ServerBuilder { /// Experimental, to be deprecated std::vector<grpc::ServerBuilderOption*> options() { std::vector<grpc::ServerBuilderOption*> option_refs; + option_refs.reserve(options_.size()); for (auto& ptr : options_) { option_refs.push_back(ptr.get()); } @@ -353,7 +364,6 @@ class ServerBuilder { private: friend class grpc::testing::ServerBuilderPluginTest; - friend class grpc::experimental::OrcaServerInterceptorFactory; struct SyncServerSettings { SyncServerSettings() @@ -404,14 +414,12 @@ class ServerBuilder { std::vector< std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>> interceptor_creators_; - std::vector< - std::unique_ptr<grpc::experimental::ServerInterceptorFactoryInterface>> - internal_interceptor_creators_; std::vector<std::shared_ptr<grpc::internal::ExternalConnectionAcceptorImpl>> acceptors_; grpc_server_config_fetcher* server_config_fetcher_ = nullptr; std::shared_ptr<experimental::AuthorizationPolicyProviderInterface> authorization_provider_; + experimental::ServerMetricRecorder* server_metric_recorder_ = nullptr; }; } // namespace grpc diff --git a/contrib/libs/grpc/include/grpcpp/server_context.h b/contrib/libs/grpc/include/grpcpp/server_context.h index ed6bd66d06..dada6901ed 100644 --- a/contrib/libs/grpc/include/grpcpp/server_context.h +++ b/contrib/libs/grpc/include/grpcpp/server_context.h @@ -1,24 +1,684 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SERVER_CONTEXT_H #define GRPCPP_SERVER_CONTEXT_H -#include <grpcpp/impl/codegen/server_context.h> // IWYU pragma: export +#include <grpc/support/port_platform.h> + +#include <atomic> +#include <cassert> +#include <map> +#include <memory> +#include <type_traits> +#include <vector> + +#include <grpc/grpc.h> +#include <grpc/impl/compression_types.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set.h> +#include <grpcpp/impl/codegen/create_auth_context.h> +#include <grpcpp/impl/codegen/metadata_map.h> +#include <grpcpp/impl/completion_queue_tag.h> +#include <grpcpp/impl/metadata_map.h> +#include <grpcpp/impl/rpc_service_method.h> +#include <grpcpp/security/auth_context.h> +#include <grpcpp/support/callback_common.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/message_allocator.h> +#include <grpcpp/support/server_callback.h> +#include <grpcpp/support/server_interceptor.h> +#include <grpcpp/support/status.h> +#include <grpcpp/support/string_ref.h> +#include <grpcpp/support/time.h> + +struct grpc_metadata; +struct grpc_call; +struct census_context; + +namespace grpc { +template <class W, class R> +class ServerAsyncReader; +template <class W> +class ServerAsyncWriter; +template <class W> +class ServerAsyncResponseWriter; +template <class W, class R> +class ServerAsyncReaderWriter; +template <class R> +class ServerReader; +template <class W> +class ServerWriter; + +namespace internal { +template <class ServiceType, class RequestType, class ResponseType> +class BidiStreamingHandler; +template <class RequestType, class ResponseType> +class CallbackUnaryHandler; +template <class RequestType, class ResponseType> +class CallbackClientStreamingHandler; +template <class RequestType, class ResponseType> +class CallbackServerStreamingHandler; +template <class RequestType, class ResponseType> +class CallbackBidiHandler; +template <class ServiceType, class RequestType, class ResponseType> +class ClientStreamingHandler; +template <class ResponseType> +void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter&, + ResponseType*, Status&); +template <class ServiceType, class RequestType, class ResponseType, + class BaseRequestType, class BaseResponseType> +class RpcMethodHandler; +template <class Base> +class FinishOnlyReactor; +template <class W, class R> +class ServerReaderWriterBody; +template <class ServiceType, class RequestType, class ResponseType> +class ServerStreamingHandler; +class ServerReactor; +template <class Streamer, bool WriteNeeded> +class TemplatedBidiStreamingHandler; +template <grpc::StatusCode code> +class ErrorMethodHandler; +} // namespace internal + +class ClientContext; +class CompletionQueue; +class GenericServerContext; +class Server; +class ServerInterface; +class ContextAllocator; +class GenericCallbackServerContext; + +namespace internal { +class Call; +} // namespace internal + +namespace testing { +class InteropServerContextInspector; +class ServerContextTestSpouse; +class DefaultReactorTestPeer; +} // namespace testing + +namespace experimental { +class CallMetricRecorder; +class ServerMetricRecorder; +} // namespace experimental + +/// Base class of ServerContext. +class ServerContextBase { + public: + virtual ~ServerContextBase(); + + /// Return the deadline for the server call. + std::chrono::system_clock::time_point deadline() const { + return grpc::Timespec2Timepoint(deadline_); + } + + /// Return a \a gpr_timespec representation of the server call's deadline. + gpr_timespec raw_deadline() const { return deadline_; } + + /// Add the (\a key, \a value) pair to the initial metadata + /// associated with a server call. These are made available at the client side + /// by the \a grpc::ClientContext::GetServerInitialMetadata() method. + /// + /// \warning This method should only be called before sending initial metadata + /// to the client (which can happen explicitly, or implicitly when sending a + /// a response message or status to the client). + /// + /// \param key The metadata key. If \a value is binary data, it must + /// end in "-bin". + /// \param value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// + ///\verbatim + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + ///\endverbatim + /// + void AddInitialMetadata(const TString& key, const TString& value); + + /// Add the (\a key, \a value) pair to the initial metadata + /// associated with a server call. These are made available at the client + /// side by the \a grpc::ClientContext::GetServerTrailingMetadata() method. + /// + /// \warning This method should only be called before sending trailing + /// metadata to the client (which happens when the call is finished and a + /// status is sent to the client). + /// + /// \param key The metadata key. If \a value is binary data, + /// it must end in "-bin". + /// \param value The metadata value. If its value is binary, the key name + /// must end in "-bin". + /// + /// Metadata must conform to the following format: + /// + ///\verbatim + /// Custom-Metadata -> Binary-Header / ASCII-Header + /// Binary-Header -> {Header-Name "-bin" } {binary value} + /// ASCII-Header -> Header-Name ASCII-Value + /// Header-Name -> 1*( %x30-39 / %x61-7A / "_" / "-" / ".") ; 0-9 a-z _ - . + /// ASCII-Value -> 1*( %x20-%x7E ) ; space and printable ASCII + ///\endverbatim + /// + void AddTrailingMetadata(const TString& key, const TString& value); + + /// Return whether this RPC failed before the server could provide its status + /// back to the client. This could be because of explicit API cancellation + /// from the client-side or server-side, because of deadline exceeded, network + /// connection reset, HTTP/2 parameter configuration (e.g., max message size, + /// max connection age), etc. It does NOT include failure due to a non-OK + /// status return from the server application's request handler, including + /// Status::CANCELLED. + /// + /// IsCancelled is always safe to call when using sync or callback API. + /// When using async API, it is only safe to call IsCancelled after + /// the AsyncNotifyWhenDone tag has been delivered. Thread-safe. + bool IsCancelled() const; + + /// Cancel the Call from the server. This is a best-effort API and + /// depending on when it is called, the RPC may still appear successful to + /// the client. For example, if TryCancel() is called on a separate thread, it + /// might race with the server handler which might return success to the + /// client before TryCancel() was even started by the thread. + /// + /// It is the caller's responsibility to prevent such races and ensure that if + /// TryCancel() is called, the serverhandler must return Status::CANCELLED. + /// The only exception is that if the serverhandler is already returning an + /// error status code, it is ok to not return Status::CANCELLED even if + /// TryCancel() was called. + /// + /// For reasons such as the above, it is generally preferred to explicitly + /// finish an RPC by returning Status::CANCELLED rather than using TryCancel. + /// + /// Note that TryCancel() does not change any of the tags that are pending + /// on the completion queue. All pending tags will still be delivered + /// (though their ok result may reflect the effect of cancellation). + void TryCancel() const; + + /// Return a collection of initial metadata key-value pairs sent from the + /// client. Note that keys may happen more than + /// once (ie, a \a std::multimap is returned). + /// + /// It is safe to use this method after initial metadata has been received, + /// Calls always begin with the client sending initial metadata, so this is + /// safe to access as soon as the call has begun on the server side. + /// + /// \return A multimap of initial metadata key-value pairs from the server. + const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata() + const { + return *client_metadata_.map(); + } + + /// Return the compression algorithm to be used by the server call. + grpc_compression_level compression_level() const { + return compression_level_; + } + + /// Set \a level to be the compression level used for the server call. + /// + /// \param level The compression level used for the server call. + void set_compression_level(grpc_compression_level level) { + compression_level_set_ = true; + compression_level_ = level; + } + + /// Return a bool indicating whether the compression level for this call + /// has been set (either implicitly or through a previous call to + /// \a set_compression_level. + bool compression_level_set() const { return compression_level_set_; } + + /// Return the compression algorithm the server call will request be used. + /// Note that the gRPC runtime may decide to ignore this request, for example, + /// due to resource constraints, or if the server is aware the client doesn't + /// support the requested algorithm. + grpc_compression_algorithm compression_algorithm() const { + return compression_algorithm_; + } + /// Set \a algorithm to be the compression algorithm used for the server call. + /// + /// \param algorithm The compression algorithm used for the server call. + void set_compression_algorithm(grpc_compression_algorithm algorithm); + + /// Set the serialized load reporting costs in \a cost_data for the call. + void SetLoadReportingCosts(const std::vector<TString>& cost_data); + + /// Return the authentication context for this server call. + /// + /// \see grpc::AuthContext. + std::shared_ptr<const grpc::AuthContext> auth_context() const { + if (auth_context_ == nullptr) { + auth_context_ = grpc::CreateAuthContext(call_.call); + } + return auth_context_; + } + + /// Return the peer uri in a string. + /// WARNING: this value is never authenticated or subject to any security + /// related code. It must not be used for any authentication related + /// functionality. Instead, use auth_context. + TString peer() const; + + /// Get the census context associated with this server call. + const struct census_context* census_context() const; + + /// Should be used for framework-level extensions only. + /// Applications never need to call this method. + grpc_call* c_call() { return call_.call; } + + /// Get the \a CallMetricRecorder object for the current RPC. + /// Use it to record metrics during your RPC to send back to the + /// client in order to make load balancing decisions. This will + /// return nullptr if the feature hasn't been enabled using + /// \a EnableCallMetricRecording. + experimental::CallMetricRecorder* ExperimentalGetCallMetricRecorder() { + return call_metric_recorder_; + } + + /// EXPERIMENTAL API + /// Returns the call's authority. + grpc::string_ref ExperimentalGetAuthority() const; + + protected: + /// Async only. Has to be called before the rpc starts. + /// Returns the tag in completion queue when the rpc finishes. + /// IsCancelled() can then be called to check whether the rpc was cancelled. + /// TODO(vjpai): Fix this so that the tag is returned even if the call never + /// starts (https://github.com/grpc/grpc/issues/10136). + void AsyncNotifyWhenDone(void* tag) { + has_notify_when_done_tag_ = true; + async_notify_when_done_tag_ = tag; + } + + /// NOTE: This is an API for advanced users who need custom allocators. + /// Get and maybe mutate the allocator state associated with the current RPC. + /// Currently only applicable for callback unary RPC methods. + RpcAllocatorState* GetRpcAllocatorState() { return message_allocator_state_; } + + /// Get a library-owned default unary reactor for use in minimal reaction + /// cases. This supports typical unary RPC usage of providing a response and + /// status. It supports immediate Finish (finish from within the method + /// handler) or delayed Finish (finish called after the method handler + /// invocation). It does not support reacting to cancellation or completion, + /// or early sending of initial metadata. Since this is a library-owned + /// reactor, it should not be delete'd or freed in any way. This is more + /// efficient than creating a user-owned reactor both because of avoiding an + /// allocation and because its minimal reactions are optimized using a core + /// surface flag that allows their reactions to run inline without any + /// thread-hop. + /// + /// This method should not be called more than once or called after return + /// from the method handler. + grpc::ServerUnaryReactor* DefaultReactor() { + // Short-circuit the case where a default reactor was already set up by + // the TestPeer. + if (test_unary_ != nullptr) { + return reinterpret_cast<Reactor*>(&default_reactor_); + } + new (&default_reactor_) Reactor; +#ifndef NDEBUG + bool old = false; + assert(default_reactor_used_.compare_exchange_strong( + old, true, std::memory_order_relaxed)); +#else + default_reactor_used_.store(true, std::memory_order_relaxed); +#endif + return reinterpret_cast<Reactor*>(&default_reactor_); + } + + /// Constructors for use by derived classes + ServerContextBase(); + ServerContextBase(gpr_timespec deadline, grpc_metadata_array* arr); + + void set_context_allocator(ContextAllocator* context_allocator) { + context_allocator_ = context_allocator; + } + + ContextAllocator* context_allocator() const { return context_allocator_; } + + private: + friend class grpc::testing::InteropServerContextInspector; + friend class grpc::testing::ServerContextTestSpouse; + friend class grpc::testing::DefaultReactorTestPeer; + friend class grpc::ServerInterface; + friend class grpc::Server; + template <class W, class R> + friend class grpc::ServerAsyncReader; + template <class W> + friend class grpc::ServerAsyncWriter; + template <class W> + friend class grpc::ServerAsyncResponseWriter; + template <class W, class R> + friend class grpc::ServerAsyncReaderWriter; + template <class R> + friend class grpc::ServerReader; + template <class W> + friend class grpc::ServerWriter; + template <class W, class R> + friend class grpc::internal::ServerReaderWriterBody; + template <class ResponseType> + friend void grpc::internal::UnaryRunHandlerHelper( + const internal::MethodHandler::HandlerParameter& param, ResponseType* rsp, + Status& status); + template <class ServiceType, class RequestType, class ResponseType, + class BaseRequestType, class BaseResponseType> + friend class grpc::internal::RpcMethodHandler; + template <class ServiceType, class RequestType, class ResponseType> + friend class grpc::internal::ClientStreamingHandler; + template <class ServiceType, class RequestType, class ResponseType> + friend class grpc::internal::ServerStreamingHandler; + template <class Streamer, bool WriteNeeded> + friend class grpc::internal::TemplatedBidiStreamingHandler; + template <class RequestType, class ResponseType> + friend class grpc::internal::CallbackUnaryHandler; + template <class RequestType, class ResponseType> + friend class grpc::internal::CallbackClientStreamingHandler; + template <class RequestType, class ResponseType> + friend class grpc::internal::CallbackServerStreamingHandler; + template <class RequestType, class ResponseType> + friend class grpc::internal::CallbackBidiHandler; + template <grpc::StatusCode code> + friend class grpc::internal::ErrorMethodHandler; + template <class Base> + friend class grpc::internal::FinishOnlyReactor; + friend class grpc::ClientContext; + friend class grpc::GenericServerContext; + friend class grpc::GenericCallbackServerContext; + + /// Prevent copying. + ServerContextBase(const ServerContextBase&); + ServerContextBase& operator=(const ServerContextBase&); + + class CompletionOp; + + void BeginCompletionOp( + grpc::internal::Call* call, std::function<void(bool)> callback, + grpc::internal::ServerCallbackCall* callback_controller); + /// Return the tag queued by BeginCompletionOp() + grpc::internal::CompletionQueueTag* GetCompletionOpTag(); + + void set_call(grpc_call* call, bool call_metric_recording_enabled, + experimental::ServerMetricRecorder* server_metric_recorder) { + call_.call = call; + if (call_metric_recording_enabled) { + CreateCallMetricRecorder(server_metric_recorder); + } + } + + void BindDeadlineAndMetadata(gpr_timespec deadline, grpc_metadata_array* arr); + + uint32_t initial_metadata_flags() const { return 0; } + + grpc::experimental::ServerRpcInfo* set_server_rpc_info( + const char* method, grpc::internal::RpcMethod::RpcType type, + const std::vector<std::unique_ptr< + grpc::experimental::ServerInterceptorFactoryInterface>>& creators) { + if (!creators.empty()) { + rpc_info_ = new grpc::experimental::ServerRpcInfo(this, method, type); + rpc_info_->RegisterInterceptors(creators); + } + return rpc_info_; + } + + void set_message_allocator_state(RpcAllocatorState* allocator_state) { + message_allocator_state_ = allocator_state; + } + + void MaybeMarkCancelledOnRead() { + if (grpc_call_failed_before_recv_message(call_.call)) { + marked_cancelled_.store(true, std::memory_order_release); + } + } + + // This should be called only once and only when call metric recording is + // enabled. + void CreateCallMetricRecorder( + experimental::ServerMetricRecorder* server_metric_recorder = nullptr); + + struct CallWrapper { + ~CallWrapper(); + + grpc_call* call = nullptr; + }; + + // NOTE: call_ must be the first data member of this object so that its + // destructor is the last to be called, since its destructor may unref + // the underlying core call which holds the arena that may be used to + // hold this object. + CallWrapper call_; + + CompletionOp* completion_op_ = nullptr; + bool has_notify_when_done_tag_ = false; + void* async_notify_when_done_tag_ = nullptr; + grpc::internal::CallbackWithSuccessTag completion_tag_; + + gpr_timespec deadline_; + grpc::CompletionQueue* cq_ = nullptr; + bool sent_initial_metadata_ = false; + mutable std::shared_ptr<const grpc::AuthContext> auth_context_; + mutable grpc::internal::MetadataMap client_metadata_; + std::multimap<TString, TString> initial_metadata_; + std::multimap<TString, TString> trailing_metadata_; + + bool compression_level_set_ = false; + grpc_compression_level compression_level_; + grpc_compression_algorithm compression_algorithm_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage> + pending_ops_; + bool has_pending_ops_ = false; + + grpc::experimental::ServerRpcInfo* rpc_info_ = nullptr; + RpcAllocatorState* message_allocator_state_ = nullptr; + ContextAllocator* context_allocator_ = nullptr; + experimental::CallMetricRecorder* call_metric_recorder_ = nullptr; + + class Reactor : public grpc::ServerUnaryReactor { + public: + void OnCancel() override {} + void OnDone() override {} + // Override InternalInlineable for this class since its reactions are + // trivial and thus do not need to be run from the executor (triggering a + // thread hop). This should only be used by internal reactors (thus the + // name) and not by user application code. + bool InternalInlineable() override { return true; } + }; + + void SetupTestDefaultReactor(std::function<void(grpc::Status)> func) { + // NOLINTNEXTLINE(modernize-make-unique) + test_unary_.reset(new TestServerCallbackUnary(this, std::move(func))); + } + bool test_status_set() const { + return (test_unary_ != nullptr) && test_unary_->status_set(); + } + grpc::Status test_status() const { return test_unary_->status(); } + + class TestServerCallbackUnary : public grpc::ServerCallbackUnary { + public: + TestServerCallbackUnary(ServerContextBase* ctx, + std::function<void(grpc::Status)> func) + : reactor_(ctx->DefaultReactor()), func_(std::move(func)) { + this->BindReactor(reactor_); + } + void Finish(grpc::Status s) override { + status_ = s; + func_(std::move(s)); + status_set_.store(true, std::memory_order_release); + } + void SendInitialMetadata() override {} + + bool status_set() const { + return status_set_.load(std::memory_order_acquire); + } + grpc::Status status() const { return status_; } + + private: + void CallOnDone() override {} + grpc::internal::ServerReactor* reactor() override { return reactor_; } + + grpc::ServerUnaryReactor* const reactor_; + std::atomic_bool status_set_{false}; + grpc::Status status_; + const std::function<void(grpc::Status s)> func_; + }; + + typename std::aligned_storage<sizeof(Reactor), alignof(Reactor)>::type + default_reactor_; + std::atomic_bool default_reactor_used_{false}; + + std::atomic_bool marked_cancelled_{false}; + + std::unique_ptr<TestServerCallbackUnary> test_unary_; +}; + +/// A ServerContext or CallbackServerContext allows the code implementing a +/// service handler to: +/// +/// - Add custom initial and trailing metadata key-value pairs that will +/// propagated to the client side. +/// - Control call settings such as compression and authentication. +/// - Access metadata coming from the client. +/// - Get performance metrics (ie, census). +/// +/// Context settings are only relevant to the call handler they are supplied to, +/// that is to say, they aren't sticky across multiple calls. Some of these +/// settings, such as the compression options, can be made persistent at server +/// construction time by specifying the appropriate \a ChannelArguments +/// to a \a grpc::ServerBuilder, via \a ServerBuilder::AddChannelArgument. +/// +/// \warning ServerContext instances should \em not be reused across rpcs. +class ServerContext : public ServerContextBase { + public: + ServerContext() {} // for async calls + + using ServerContextBase::AddInitialMetadata; + using ServerContextBase::AddTrailingMetadata; + using ServerContextBase::auth_context; + using ServerContextBase::c_call; + using ServerContextBase::census_context; + using ServerContextBase::client_metadata; + using ServerContextBase::compression_algorithm; + using ServerContextBase::compression_level; + using ServerContextBase::compression_level_set; + using ServerContextBase::deadline; + using ServerContextBase::IsCancelled; + using ServerContextBase::peer; + using ServerContextBase::raw_deadline; + using ServerContextBase::set_compression_algorithm; + using ServerContextBase::set_compression_level; + using ServerContextBase::SetLoadReportingCosts; + using ServerContextBase::TryCancel; + + // Sync/CQ-based Async ServerContext only + using ServerContextBase::AsyncNotifyWhenDone; + + private: + // Constructor for internal use by server only + friend class grpc::Server; + ServerContext(gpr_timespec deadline, grpc_metadata_array* arr) + : ServerContextBase(deadline, arr) {} + + // CallbackServerContext only + using ServerContextBase::DefaultReactor; + using ServerContextBase::GetRpcAllocatorState; + + /// Prevent copying. + ServerContext(const ServerContext&) = delete; + ServerContext& operator=(const ServerContext&) = delete; +}; + +class CallbackServerContext : public ServerContextBase { + public: + /// Public constructors are for direct use only by mocking tests. In practice, + /// these objects will be owned by the library. + CallbackServerContext() {} + + using ServerContextBase::AddInitialMetadata; + using ServerContextBase::AddTrailingMetadata; + using ServerContextBase::auth_context; + using ServerContextBase::c_call; + using ServerContextBase::census_context; + using ServerContextBase::client_metadata; + using ServerContextBase::compression_algorithm; + using ServerContextBase::compression_level; + using ServerContextBase::compression_level_set; + using ServerContextBase::context_allocator; + using ServerContextBase::deadline; + using ServerContextBase::IsCancelled; + using ServerContextBase::peer; + using ServerContextBase::raw_deadline; + using ServerContextBase::set_compression_algorithm; + using ServerContextBase::set_compression_level; + using ServerContextBase::set_context_allocator; + using ServerContextBase::SetLoadReportingCosts; + using ServerContextBase::TryCancel; + + // CallbackServerContext only + using ServerContextBase::DefaultReactor; + using ServerContextBase::GetRpcAllocatorState; + + private: + // Sync/CQ-based Async ServerContext only + using ServerContextBase::AsyncNotifyWhenDone; + + /// Prevent copying. + CallbackServerContext(const CallbackServerContext&) = delete; + CallbackServerContext& operator=(const CallbackServerContext&) = delete; +}; + +/// A CallbackServerContext allows users to use the contents of the +/// CallbackServerContext or GenericCallbackServerContext structure for the +/// callback API. +/// The library will invoke the allocator any time a new call is initiated. +/// and call the Release method after the server OnDone. +class ContextAllocator { + public: + virtual ~ContextAllocator() {} + + virtual CallbackServerContext* NewCallbackServerContext() { return nullptr; } + + virtual GenericCallbackServerContext* NewGenericCallbackServerContext() { + return nullptr; + } + + virtual void Release(CallbackServerContext*) {} + + virtual void Release(GenericCallbackServerContext*) {} +}; + +} // namespace grpc + +static_assert( + std::is_base_of<grpc::ServerContextBase, grpc::ServerContext>::value, + "improper base class"); +static_assert(std::is_base_of<grpc::ServerContextBase, + grpc::CallbackServerContext>::value, + "improper base class"); +static_assert(sizeof(grpc::ServerContextBase) == sizeof(grpc::ServerContext), + "wrong size"); +static_assert(sizeof(grpc::ServerContextBase) == + sizeof(grpc::CallbackServerContext), + "wrong size"); #endif // GRPCPP_SERVER_CONTEXT_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_interface.h b/contrib/libs/grpc/include/grpcpp/server_interface.h index 62a43b1bb4..e7790c24b1 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/server_interface.h +++ b/contrib/libs/grpc/include/grpcpp/server_interface.h @@ -1,36 +1,36 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H -#define GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H - -// IWYU pragma: private - -#include <grpc/impl/codegen/port_platform.h> - -#include <grpc/impl/codegen/grpc_types.h> -#include <grpcpp/impl/codegen/call.h> -#include <grpcpp/impl/codegen/call_hook.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SERVER_INTERFACE_H +#define GRPCPP_SERVER_INTERFACE_H + +#include <grpc/support/port_platform.h> + +#include <grpc/grpc.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/support/log.h> +#include <grpc/support/time.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_hook.h> #include <grpcpp/impl/codegen/interceptor_common.h> -#include <grpcpp/impl/codegen/rpc_service_method.h> -#include <grpcpp/impl/codegen/server_context.h> +#include <grpcpp/impl/completion_queue_tag.h> +#include <grpcpp/impl/rpc_service_method.h> +#include <grpcpp/server_context.h> #include <grpcpp/support/byte_buffer.h> namespace grpc { @@ -43,8 +43,6 @@ class ServerCompletionQueue; class ServerCredentials; class Service; -extern CoreCodegenInterface* g_core_codegen_interface; - /// Models a gRPC server. /// /// Servers are configured and started via \a grpc::ServerBuilder. @@ -56,6 +54,7 @@ class CallbackGenericService; namespace experimental { class ServerInterceptorFactoryInterface; +class ServerMetricRecorder; } // namespace experimental class ServerInterface : public internal::CallHook { @@ -104,10 +103,7 @@ class ServerInterface : public internal::CallHook { /// All completion queue associated with the server (for example, for async /// serving) must be shutdown *after* this method has returned: /// See \a ServerBuilder::AddCompletionQueue for details. - void Shutdown() { - ShutdownInternal( - g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } + void Shutdown() { ShutdownInternal(gpr_inf_future(GPR_CLOCK_MONOTONIC)); } /// Block waiting for all work to complete. /// @@ -190,6 +186,8 @@ class ServerInterface : public internal::CallHook { internal::Call call_wrapper_; internal::InterceptorBatchMethodsImpl interceptor_methods_; bool done_intercepting_; + bool call_metric_recording_enabled_; + experimental::ServerMetricRecorder* server_metric_recorder_; }; /// RegisteredAsyncRequest is not part of the C++ API @@ -204,7 +202,7 @@ class ServerInterface : public internal::CallHook { internal::RpcMethod::RpcType type); bool FinalizeResult(void** tag, bool* status) override { - /* If we are done intercepting, then there is nothing more for us to do */ + // If we are done intercepting, then there is nothing more for us to do if (done_intercepting_) { return BaseAsyncRequest::FinalizeResult(tag, status); } @@ -262,7 +260,7 @@ class ServerInterface : public internal::CallHook { } bool FinalizeResult(void** tag, bool* status) override { - /* If we are done intercepting, then there is nothing more for us to do */ + // If we are done intercepting, then there is nothing more for us to do if (done_intercepting_) { return RegisteredAsyncRequest::FinalizeResult(tag, status); } @@ -274,9 +272,9 @@ class ServerInterface : public internal::CallHook { // a new instance of ourselves to request another call. We then // return false, which prevents the call from being returned to // the application. - g_core_codegen_interface->grpc_call_cancel_with_status( - call_, GRPC_STATUS_INTERNAL, "Unable to parse request", nullptr); - g_core_codegen_interface->grpc_call_unref(call_); + grpc_call_cancel_with_status(call_, GRPC_STATUS_INTERNAL, + "Unable to parse request", nullptr); + grpc_call_unref(call_); new PayloadAsyncRequest(registered_method_, server_, context_, stream_, call_cq_, notification_cq_, tag_, request_); @@ -284,7 +282,7 @@ class ServerInterface : public internal::CallHook { return false; } } - /* Set interception point for recv message */ + // Set interception point for recv message interceptor_methods_.AddInterceptionHookPoint( experimental::InterceptionHookPoints::POST_RECV_MESSAGE); interceptor_methods_.SetRecvMessage(request_, nullptr); @@ -321,7 +319,7 @@ class ServerInterface : public internal::CallHook { grpc::CompletionQueue* call_cq, grpc::ServerCompletionQueue* notification_cq, void* tag, Message* message) { - GPR_CODEGEN_ASSERT(method); + GPR_ASSERT(method); new PayloadAsyncRequest<Message>(method, this, context, stream, call_cq, notification_cq, tag, message); } @@ -332,7 +330,7 @@ class ServerInterface : public internal::CallHook { grpc::CompletionQueue* call_cq, grpc::ServerCompletionQueue* notification_cq, void* tag) { - GPR_CODEGEN_ASSERT(method); + GPR_ASSERT(method); new NoPayloadAsyncRequest(method, this, context, stream, call_cq, notification_cq, tag); } @@ -358,6 +356,13 @@ class ServerInterface : public internal::CallHook { return nullptr; } + // Whether per-call load reporting is enabled. + virtual bool call_metric_recording_enabled() const = 0; + + // Interface to read or update server-wide metrics. Returns null when not set. + virtual experimental::ServerMetricRecorder* server_metric_recorder() + const = 0; + // A method to get the callbackable completion queue associated with this // server. If the return value is nullptr, this server doesn't support // callback operations. @@ -370,4 +375,4 @@ class ServerInterface : public internal::CallHook { } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H +#endif // GRPCPP_SERVER_INTERFACE_H diff --git a/contrib/libs/grpc/include/grpcpp/server_posix.h b/contrib/libs/grpc/include/grpcpp/server_posix.h index 2e938624d2..75ef4470b7 100644 --- a/contrib/libs/grpc/include/grpcpp/server_posix.h +++ b/contrib/libs/grpc/include/grpcpp/server_posix.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2016 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2016 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SERVER_POSIX_H #define GRPCPP_SERVER_POSIX_H diff --git a/contrib/libs/grpc/include/grpcpp/support/async_stream.h b/contrib/libs/grpc/include/grpcpp/support/async_stream.h index 18e84dfcdb..1bf67d301d 100644 --- a/contrib/libs/grpc/include/grpcpp/support/async_stream.h +++ b/contrib/libs/grpc/include/grpcpp/support/async_stream.h @@ -1,28 +1,28 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_ASYNC_STREAM_H #define GRPCPP_SUPPORT_ASYNC_STREAM_H #include <grpc/grpc.h> +#include <grpc/support/log.h> #include <grpcpp/impl/call.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> +#include <grpcpp/impl/channel_interface.h> #include <grpcpp/impl/service_type.h> #include <grpcpp/server_context.h> #include <grpcpp/support/status.h> @@ -185,8 +185,8 @@ class ClientAsyncReaderFactory { grpc::ClientContext* context, const W& request, bool start, void* tag) { grpc::internal::Call call = channel->CreateCall(method, context, cq); - return new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientAsyncReader<R>))) + return new ( + grpc_call_arena_alloc(call.call(), sizeof(ClientAsyncReader<R>))) ClientAsyncReader<R>(call, context, request, start, tag); } }; @@ -200,7 +200,7 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncReader)); + GPR_ASSERT(size == sizeof(ClientAsyncReader)); } // This operator should never be called as the memory should be freed as part @@ -208,10 +208,10 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } void StartCall(void* tag) override { - GPR_CODEGEN_ASSERT(!started_); + GPR_ASSERT(!started_); started_ = true; StartCallInternal(tag); } @@ -225,8 +225,8 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { /// calling code can access the received metadata through the /// \a ClientContext. void ReadInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(started_); - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + GPR_ASSERT(started_); + GPR_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); @@ -234,7 +234,7 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { } void Read(R* msg, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); read_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { read_ops_.RecvInitialMetadata(context_); @@ -249,7 +249,7 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata received from the server. void Finish(grpc::Status* status, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); @@ -265,12 +265,12 @@ class ClientAsyncReader final : public ClientAsyncReaderInterface<R> { const W& request, bool start, void* tag) : context_(context), call_(call), started_(start) { // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok()); + GPR_ASSERT(init_ops_.SendMessage(request).ok()); init_ops_.ClientSendClose(); if (start) { StartCallInternal(tag); } else { - GPR_CODEGEN_ASSERT(tag == nullptr); + GPR_ASSERT(tag == nullptr); } } @@ -318,7 +318,7 @@ class ClientAsyncWriterFactory { /// Create a stream object. /// Start the RPC if \a start is set /// \a tag will be notified on \a cq when the call has been started (i.e. - /// intitial metadata sent) and \a request has been written out. + /// initial metadata sent) and \a request has been written out. /// If \a start is not set, \a tag must be nullptr and the actual call /// must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata @@ -333,8 +333,8 @@ class ClientAsyncWriterFactory { grpc::ClientContext* context, R* response, bool start, void* tag) { grpc::internal::Call call = channel->CreateCall(method, context, cq); - return new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientAsyncWriter<W>))) + return new ( + grpc_call_arena_alloc(call.call(), sizeof(ClientAsyncWriter<W>))) ClientAsyncWriter<W>(call, context, response, start, tag); } }; @@ -348,7 +348,7 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncWriter)); + GPR_ASSERT(size == sizeof(ClientAsyncWriter)); } // This operator should never be called as the memory should be freed as part @@ -356,10 +356,10 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } void StartCall(void* tag) override { - GPR_CODEGEN_ASSERT(!started_); + GPR_ASSERT(!started_); started_ = true; StartCallInternal(tag); } @@ -372,8 +372,8 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { /// associated with this call is updated, and the calling code can access /// the received metadata through the \a ClientContext. void ReadInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(started_); - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + GPR_ASSERT(started_); + GPR_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); @@ -381,27 +381,27 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { } void Write(const W& msg, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, grpc::WriteOptions options, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); write_ops_.ClientSendClose(); } // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } void WritesDone(void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); write_ops_.ClientSendClose(); call_.PerformOps(&write_ops_); @@ -415,7 +415,7 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { /// - attempts to fill in the \a response parameter passed to this class's /// constructor with the server's response message. void Finish(grpc::Status* status, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); @@ -435,7 +435,7 @@ class ClientAsyncWriter final : public ClientAsyncWriterInterface<W> { if (start) { StartCallInternal(tag); } else { - GPR_CODEGEN_ASSERT(tag == nullptr); + GPR_ASSERT(tag == nullptr); } } @@ -488,7 +488,7 @@ class ClientAsyncReaderWriterFactory { /// Create a stream object. /// Start the RPC request if \a start is set. /// \a tag will be notified on \a cq when the call has been started (i.e. - /// intitial metadata sent). If \a start is not set, \a tag must be + /// initial metadata sent). If \a start is not set, \a tag must be /// nullptr and the actual call must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. @@ -498,8 +498,8 @@ class ClientAsyncReaderWriterFactory { bool start, void* tag) { grpc::internal::Call call = channel->CreateCall(method, context, cq); - return new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientAsyncReaderWriter<W, R>))) + return new (grpc_call_arena_alloc(call.call(), + sizeof(ClientAsyncReaderWriter<W, R>))) ClientAsyncReaderWriter<W, R>(call, context, start, tag); } }; @@ -515,7 +515,7 @@ class ClientAsyncReaderWriter final public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncReaderWriter)); + GPR_ASSERT(size == sizeof(ClientAsyncReaderWriter)); } // This operator should never be called as the memory should be freed as part @@ -523,10 +523,10 @@ class ClientAsyncReaderWriter final // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } void StartCall(void* tag) override { - GPR_CODEGEN_ASSERT(!started_); + GPR_ASSERT(!started_); started_ = true; StartCallInternal(tag); } @@ -539,8 +539,8 @@ class ClientAsyncReaderWriter final /// is updated with it, and then the receiving initial metadata can /// be accessed through this \a ClientContext. void ReadInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(started_); - GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); + GPR_ASSERT(started_); + GPR_ASSERT(!context_->initial_metadata_received_); meta_ops_.set_output_tag(tag); meta_ops_.RecvInitialMetadata(context_); @@ -548,7 +548,7 @@ class ClientAsyncReaderWriter final } void Read(R* msg, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); read_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { read_ops_.RecvInitialMetadata(context_); @@ -558,27 +558,27 @@ class ClientAsyncReaderWriter final } void Write(const W& msg, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } void Write(const W& msg, grpc::WriteOptions options, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); if (options.is_last_message()) { options.set_buffer_hint(); write_ops_.ClientSendClose(); } // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } void WritesDone(void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); write_ops_.set_output_tag(tag); write_ops_.ClientSendClose(); call_.PerformOps(&write_ops_); @@ -589,7 +589,7 @@ class ClientAsyncReaderWriter final /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void Finish(grpc::Status* status, void* tag) override { - GPR_CODEGEN_ASSERT(started_); + GPR_ASSERT(started_); finish_ops_.set_output_tag(tag); if (!context_->initial_metadata_received_) { finish_ops_.RecvInitialMetadata(context_); @@ -606,7 +606,7 @@ class ClientAsyncReaderWriter final if (start) { StartCallInternal(tag); } else { - GPR_CODEGEN_ASSERT(tag == nullptr); + GPR_ASSERT(tag == nullptr); } } @@ -651,7 +651,7 @@ class ServerAsyncReaderInterface /// /// It is appropriate to call this method when: /// * all messages from the client have been received (either known - /// implictly, or explicitly because a previous + /// implicitly, or explicitly because a previous /// \a AsyncReaderInterface::Read operation with a non-ok result, /// e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'). /// @@ -706,7 +706,7 @@ class ServerAsyncReader final : public ServerAsyncReaderInterface<W, R> { /// - The initial metadata that will be sent to the client from this op will /// be taken from the \a ServerContext associated with the call. void SendInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, @@ -727,7 +727,7 @@ class ServerAsyncReader final : public ServerAsyncReaderInterface<W, R> { /// See the \a ServerAsyncReaderInterface.Read method for semantics /// /// Side effect: - /// - also sends initial metadata if not alreay sent. + /// - also sends initial metadata if not already sent. /// - uses the \a ServerContext associated with this call to send possible /// initial and trailing metadata. /// @@ -758,14 +758,14 @@ class ServerAsyncReader final : public ServerAsyncReaderInterface<W, R> { /// See the \a ServerAsyncReaderInterface.Read method for semantics /// /// Side effect: - /// - also sends initial metadata if not alreay sent. + /// - also sends initial metadata if not already sent. /// - uses the \a ServerContext associated with this call to send possible /// initial and trailing metadata. /// /// gRPC doesn't take ownership or a reference to \a status, so it is safe to /// to deallocate once FinishWithError returns. void FinishWithError(const grpc::Status& status, void* tag) override { - GPR_CODEGEN_ASSERT(!status.ok()); + GPR_ASSERT(!status.ok()); finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_ops_.SendInitialMetadata(&ctx_->initial_metadata_, @@ -805,7 +805,7 @@ class ServerAsyncWriterInterface /// /// It is appropriate to call this method when either: /// * all messages from the client have been received (either known - /// implictly, or explicitly because a previous \a + /// implicitly, or explicitly because a previous \a /// AsyncReaderInterface::Read operation with a non-ok /// result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' with 'false'. /// * it is desired to end the call early with some non-OK status code. @@ -855,7 +855,7 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> { /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, @@ -871,7 +871,7 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } @@ -883,7 +883,7 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> { EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } @@ -902,7 +902,7 @@ class ServerAsyncWriter final : public ServerAsyncWriterInterface<W> { write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); options.set_buffer_hint(); - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); write_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); call_.PerformOps(&write_ops_); } @@ -967,7 +967,7 @@ class ServerAsyncReaderWriterInterface /// /// It is appropriate to call this method when either: /// * all messages from the client have been received (either known - /// implictly, or explicitly because a previous \a + /// implicitly, or explicitly because a previous \a /// AsyncReaderInterface::Read operation /// with a non-ok result (e.g., cq->Next(&read_tag, &ok) filled in 'ok' /// with 'false'. @@ -1021,7 +1021,7 @@ class ServerAsyncReaderWriter final /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_, @@ -1043,7 +1043,7 @@ class ServerAsyncReaderWriter final write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg).ok()); call_.PerformOps(&write_ops_); } @@ -1053,7 +1053,7 @@ class ServerAsyncReaderWriter final options.set_buffer_hint(); } EnsureInitialMetadataSent(&write_ops_); - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); call_.PerformOps(&write_ops_); } @@ -1073,7 +1073,7 @@ class ServerAsyncReaderWriter final write_ops_.set_output_tag(tag); EnsureInitialMetadataSent(&write_ops_); options.set_buffer_hint(); - GPR_CODEGEN_ASSERT(write_ops_.SendMessage(msg, options).ok()); + GPR_ASSERT(write_ops_.SendMessage(msg, options).ok()); write_ops_.ServerSendStatus(&ctx_->trailing_metadata_, status); call_.PerformOps(&write_ops_); } diff --git a/contrib/libs/grpc/include/grpcpp/support/async_unary_call.h b/contrib/libs/grpc/include/grpcpp/support/async_unary_call.h index a9886031f4..a831d73f72 100644 --- a/contrib/libs/grpc/include/grpcpp/support/async_unary_call.h +++ b/contrib/libs/grpc/include/grpcpp/support/async_unary_call.h @@ -1,31 +1,31 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H #define GRPCPP_SUPPORT_ASYNC_UNARY_CALL_H #include <grpc/grpc.h> +#include <grpc/support/log.h> #include <grpcpp/client_context.h> #include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set.h> #include <grpcpp/impl/call_op_set_interface.h> -#include <grpcpp/impl/codegen/call_op_set.h> -#include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> +#include <grpcpp/impl/channel_interface.h> #include <grpcpp/impl/service_type.h> #include <grpcpp/server_context.h> #include <grpcpp/support/status.h> @@ -79,7 +79,7 @@ class ClientAsyncResponseReaderHelper { public: /// Start a call and write the request out if \a start is set. /// \a tag will be notified on \a cq when the call has been started (i.e. - /// intitial metadata sent) and \a request has been written out. + /// initial metadata sent) and \a request has been written out. /// If \a start is not set, the actual call must be initiated by StartCall /// Note that \a context will be used to fill in custom initial metadata /// used to send to the server when starting the call. @@ -95,10 +95,9 @@ class ClientAsyncResponseReaderHelper { const grpc::internal::RpcMethod& method, grpc::ClientContext* context, const W& request) /* __attribute__((noinline)) */ { grpc::internal::Call call = channel->CreateCall(method, context, cq); - ClientAsyncResponseReader<R>* result = - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call.call(), sizeof(ClientAsyncResponseReader<R>))) - ClientAsyncResponseReader<R>(call, context); + ClientAsyncResponseReader<R>* result = new (grpc_call_arena_alloc( + call.call(), sizeof(ClientAsyncResponseReader<R>))) + ClientAsyncResponseReader<R>(call, context); SetupRequest<BaseR, BaseW>( call.call(), &result->single_buf_, &result->read_initial_metadata_, &result->finish_, static_cast<const BaseW&>(request)); @@ -128,11 +127,10 @@ class ClientAsyncResponseReaderHelper { grpc::internal::CallOpRecvMessage<R>, grpc::internal::CallOpClientRecvStatus>; SingleBufType* single_buf = - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call, sizeof(SingleBufType))) SingleBufType; + new (grpc_call_arena_alloc(call, sizeof(SingleBufType))) SingleBufType; *single_buf_ptr = single_buf; // TODO(ctiller): don't assert - GPR_CODEGEN_ASSERT(single_buf->SendMessage(request).ok()); + GPR_ASSERT(single_buf->SendMessage(request).ok()); single_buf->ClientSendClose(); // The purpose of the following functions is to type-erase the actual @@ -154,7 +152,7 @@ class ClientAsyncResponseReaderHelper { // will be static-cast'ed back to the class specified here by hiding that // class information inside the function definition. Note that this feature // expects the class being specified here for R to be a base-class of the - // "real" R without any multiple-inheritance (as applies in protbuf wrt + // "real" R without any multiple-inheritance (as applies in protobuf wrt // MessageLite) *finish = [](ClientContext* context, internal::Call* call, bool initial_metadata_read, @@ -166,8 +164,8 @@ class ClientAsyncResponseReaderHelper { grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<R>, grpc::internal::CallOpClientRecvStatus>; FinishBufType* finish_buf = - new (grpc::g_core_codegen_interface->grpc_call_arena_alloc( - call->call(), sizeof(FinishBufType))) FinishBufType; + new (grpc_call_arena_alloc(call->call(), sizeof(FinishBufType))) + FinishBufType; *finish_buf_ptr = finish_buf; finish_buf->set_output_tag(tag); finish_buf->RecvMessage(static_cast<R*>(msg)); @@ -222,7 +220,7 @@ class ClientAsyncResponseReader final public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(ClientAsyncResponseReader)); + GPR_ASSERT(size == sizeof(ClientAsyncResponseReader)); } // This operator should never be called as the memory should be freed as part @@ -230,10 +228,10 @@ class ClientAsyncResponseReader final // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } void StartCall() override { - GPR_CODEGEN_DEBUG_ASSERT(!started_); + GPR_DEBUG_ASSERT(!started_); started_ = true; internal::ClientAsyncResponseReaderHelper::StartCall(context_, single_buf_); } @@ -245,8 +243,8 @@ class ClientAsyncResponseReader final /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void ReadInitialMetadata(void* tag) override { - GPR_CODEGEN_DEBUG_ASSERT(started_); - GPR_CODEGEN_DEBUG_ASSERT(!context_->initial_metadata_received_); + GPR_DEBUG_ASSERT(started_); + GPR_DEBUG_ASSERT(!context_->initial_metadata_received_); read_initial_metadata_(context_, &call_, single_buf_, tag); initial_metadata_read_ = true; } @@ -257,7 +255,7 @@ class ClientAsyncResponseReader final /// - the \a ClientContext associated with this call is updated with /// possible initial and trailing metadata sent from the server. void Finish(R* msg, grpc::Status* status, void* tag) override { - GPR_CODEGEN_DEBUG_ASSERT(started_); + GPR_DEBUG_ASSERT(started_); finish_(context_, &call_, initial_metadata_read_, single_buf_, &finish_buf_, static_cast<void*>(msg), status, tag); } @@ -306,7 +304,7 @@ class ServerAsyncResponseWriter final /// /// \param[in] tag Tag identifying this request. void SendInitialMetadata(void* tag) override { - GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); + GPR_ASSERT(!ctx_->sent_initial_metadata_); meta_buf_.set_output_tag(tag); meta_buf_.SendInitialMetadata(&ctx_->initial_metadata_, @@ -375,7 +373,7 @@ class ServerAsyncResponseWriter final /// deallocate them once the Finish operation is complete (i.e. a result /// arrives in the completion queue). void FinishWithError(const grpc::Status& status, void* tag) { - GPR_CODEGEN_ASSERT(!status.ok()); + GPR_ASSERT(!status.ok()); finish_buf_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { finish_buf_.SendInitialMetadata(&ctx_->initial_metadata_, diff --git a/contrib/libs/grpc/include/grpcpp/support/byte_buffer.h b/contrib/libs/grpc/include/grpcpp/support/byte_buffer.h index 7ca7c4b258..5bbfb66496 100644 --- a/contrib/libs/grpc/include/grpcpp/support/byte_buffer.h +++ b/contrib/libs/grpc/include/grpcpp/support/byte_buffer.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_BYTE_BUFFER_H #define GRPCPP_SUPPORT_BYTE_BUFFER_H @@ -24,7 +24,6 @@ #include <grpc/byte_buffer.h> #include <grpc/grpc.h> #include <grpc/support/log.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> #include <grpcpp/impl/serialization_traits.h> #include <grpcpp/support/config.h> #include <grpcpp/support/slice.h> @@ -85,11 +84,11 @@ class ByteBuffer final { // than its advertised side effect of increasing the reference count of the // slices it processes, and such an increase does not affect the semantics // seen by the caller of this constructor. - buffer_ = g_core_codegen_interface->grpc_raw_byte_buffer_create( + buffer_ = grpc_raw_byte_buffer_create( reinterpret_cast<grpc_slice*>(const_cast<Slice*>(slices)), nslices); } - /// Constuct a byte buffer by referencing elements of existing buffer + /// Construct a byte buffer by referencing elements of existing buffer /// \a buf. Wrapper of core function grpc_byte_buffer_copy . This is not /// a deep copy; it is just a referencing. As a result, its performance is /// size-independent. @@ -97,7 +96,7 @@ class ByteBuffer final { ~ByteBuffer() { if (buffer_) { - g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); + grpc_byte_buffer_destroy(buffer_); } } @@ -110,7 +109,7 @@ class ByteBuffer final { } if (buf.buffer_) { // then copy - buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buf.buffer_); + buffer_ = grpc_byte_buffer_copy(buf.buffer_); } return *this; } @@ -128,7 +127,7 @@ class ByteBuffer final { /// Remove all data. void Clear() { if (buffer_) { - g_core_codegen_interface->grpc_byte_buffer_destroy(buffer_); + grpc_byte_buffer_destroy(buffer_); buffer_ = nullptr; } } @@ -138,9 +137,7 @@ class ByteBuffer final { /// bbuf.Duplicate(); is equivalent to bbuf=bbuf; but is actually readable. /// This is not a deep copy; it is a referencing and its performance /// is size-independent. - void Duplicate() { - buffer_ = g_core_codegen_interface->grpc_byte_buffer_copy(buffer_); - } + void Duplicate() { buffer_ = grpc_byte_buffer_copy(buffer_); } /// Forget underlying byte buffer without destroying /// Use this only for un-owned byte buffers @@ -148,9 +145,7 @@ class ByteBuffer final { /// Buffer size in bytes. size_t Length() const { - return buffer_ == nullptr - ? 0 - : g_core_codegen_interface->grpc_byte_buffer_length(buffer_); + return buffer_ == nullptr ? 0 : grpc_byte_buffer_length(buffer_); } /// Swap the state of *this and *other. @@ -203,14 +198,14 @@ class ByteBuffer final { class ByteBufferPointer { public: - /* NOLINTNEXTLINE(google-explicit-constructor) */ + // NOLINTNEXTLINE(google-explicit-constructor) ByteBufferPointer(const ByteBuffer* b) : bbuf_(const_cast<ByteBuffer*>(b)) {} - /* NOLINTNEXTLINE(google-explicit-constructor) */ + // NOLINTNEXTLINE(google-explicit-constructor) operator ByteBuffer*() { return bbuf_; } - /* NOLINTNEXTLINE(google-explicit-constructor) */ + // NOLINTNEXTLINE(google-explicit-constructor) operator grpc_byte_buffer*() { return bbuf_->buffer_; } - /* NOLINTNEXTLINE(google-explicit-constructor) */ + // NOLINTNEXTLINE(google-explicit-constructor) operator grpc_byte_buffer**() { return &bbuf_->buffer_; } private: @@ -230,7 +225,7 @@ class SerializationTraits<ByteBuffer, void> { bool* own_buffer) { *buffer = source; *own_buffer = true; - return g_core_codegen_interface->ok(); + return grpc::Status::OK; } }; diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/callback_common.h b/contrib/libs/grpc/include/grpcpp/support/callback_common.h index 9280289d5e..a99a47dbf4 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/callback_common.h +++ b/contrib/libs/grpc/include/grpcpp/support/callback_common.h @@ -1,39 +1,34 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#if defined(__GNUC__) -#pragma GCC system_header -#endif - -#ifndef GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H -#define GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H - -// IWYU pragma: private +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SUPPORT_CALLBACK_COMMON_H +#define GRPCPP_SUPPORT_CALLBACK_COMMON_H #include <functional> -#include <grpc/impl/codegen/grpc_types.h> +#include <grpc/grpc.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/support/log.h> #include <grpcpp/impl/call.h> #include <grpcpp/impl/codegen/channel_interface.h> -#include <grpcpp/impl/codegen/completion_queue_tag.h> -#include <grpcpp/impl/codegen/config.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/status.h> +#include <grpcpp/impl/completion_queue_tag.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> namespace grpc { namespace internal { @@ -76,7 +71,7 @@ class CallbackWithStatusTag : public grpc_completion_queue_functor { public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(CallbackWithStatusTag)); + GPR_ASSERT(size == sizeof(CallbackWithStatusTag)); } // This operator should never be called as the memory should be freed as part @@ -84,12 +79,12 @@ class CallbackWithStatusTag : public grpc_completion_queue_functor { // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } CallbackWithStatusTag(grpc_call* call, std::function<void(Status)> f, CompletionQueueTag* ops) : call_(call), func_(std::move(f)), ops_(ops) { - g_core_codegen_interface->grpc_call_ref(call); + grpc_call_ref(call); functor_run = &CallbackWithStatusTag::StaticRun; // A client-side callback should never be run inline since they will always // have work to do from the user application. So, set the parent's @@ -123,7 +118,7 @@ class CallbackWithStatusTag : public grpc_completion_queue_functor { // The tag was swallowed return; } - GPR_CODEGEN_ASSERT(ignored == ops_); + GPR_ASSERT(ignored == ops_); // Last use of func_ or status_, so ok to move them out auto func = std::move(func_); @@ -131,7 +126,7 @@ class CallbackWithStatusTag : public grpc_completion_queue_functor { func_ = nullptr; // reset to clear this out for sure status_ = Status(); // reset to clear this out for sure CatchingCallback(std::move(func), std::move(status)); - g_core_codegen_interface->grpc_call_unref(call_); + grpc_call_unref(call_); } }; @@ -142,7 +137,7 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { public: // always allocated against a call arena, no memory free required static void operator delete(void* /*ptr*/, std::size_t size) { - GPR_CODEGEN_ASSERT(size == sizeof(CallbackWithSuccessTag)); + GPR_ASSERT(size == sizeof(CallbackWithSuccessTag)); } // This operator should never be called as the memory should be freed as part @@ -150,7 +145,7 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { // delete to the operator new so that some compilers will not complain (see // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this // there are no tests catching the compiler warning. - static void operator delete(void*, void*) { GPR_CODEGEN_ASSERT(false); } + static void operator delete(void*, void*) { GPR_ASSERT(false); } CallbackWithSuccessTag() : call_(nullptr) {} @@ -167,8 +162,8 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { // callbacks. void Set(grpc_call* call, std::function<void(bool)> f, CompletionQueueTag* ops, bool can_inline) { - GPR_CODEGEN_ASSERT(call_ == nullptr); - g_core_codegen_interface->grpc_call_ref(call); + GPR_ASSERT(call_ == nullptr); + grpc_call_ref(call); call_ = call; func_ = std::move(f); ops_ = ops; @@ -181,7 +176,7 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { grpc_call* call = call_; call_ = nullptr; func_ = nullptr; - g_core_codegen_interface->grpc_call_unref(call); + grpc_call_unref(call); } } @@ -193,7 +188,7 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { void force_run(bool ok) { Run(ok); } /// check if this tag is currently set - /* NOLINTNEXTLINE(google-explicit-constructor) */ + // NOLINTNEXTLINE(google-explicit-constructor) operator bool() const { return call_ != nullptr; } private: @@ -212,7 +207,7 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { auto* ops = ops_; #endif bool do_callback = ops_->FinalizeResult(&ignored, &ok); - GPR_CODEGEN_DEBUG_ASSERT(ignored == ops); + GPR_DEBUG_ASSERT(ignored == ops); if (do_callback) { CatchingCallback(func_, ok); @@ -223,4 +218,4 @@ class CallbackWithSuccessTag : public grpc_completion_queue_functor { } // namespace internal } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_CALLBACK_COMMON_H +#endif // GRPCPP_SUPPORT_CALLBACK_COMMON_H diff --git a/contrib/libs/grpc/include/grpcpp/support/channel_arguments.h b/contrib/libs/grpc/include/grpcpp/support/channel_arguments.h index a09180de45..a3845467f1 100644 --- a/contrib/libs/grpc/include/grpcpp/support/channel_arguments.h +++ b/contrib/libs/grpc/include/grpcpp/support/channel_arguments.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H #define GRPCPP_SUPPORT_CHANNEL_ARGUMENTS_H diff --git a/contrib/libs/grpc/include/grpcpp/support/client_callback.h b/contrib/libs/grpc/include/grpcpp/support/client_callback.h index c15bca0dbe..f096de3440 100644 --- a/contrib/libs/grpc/include/grpcpp/support/client_callback.h +++ b/contrib/libs/grpc/include/grpcpp/support/client_callback.h @@ -1,24 +1,1227 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_CLIENT_CALLBACK_H #define GRPCPP_SUPPORT_CLIENT_CALLBACK_H -#include <grpcpp/impl/codegen/client_callback.h> // IWYU pragma: export +#include <atomic> +#include <functional> + +#include <grpc/grpc.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set.h> +#include <grpcpp/impl/sync.h> +#include <grpcpp/support/callback_common.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/status.h> + +namespace grpc { +class Channel; +class ClientContext; + +namespace internal { +class RpcMethod; + +/// Perform a callback-based unary call. May optionally specify the base +/// class of the Request and Response so that the internal calls and structures +/// below this may be based on those base classes and thus achieve code reuse +/// across different RPCs (e.g., for protobuf, MessageLite would be a base +/// class). +/// TODO(vjpai): Combine as much as possible with the blocking unary call code +template <class InputMessage, class OutputMessage, + class BaseInputMessage = InputMessage, + class BaseOutputMessage = OutputMessage> +void CallbackUnaryCall(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, + const InputMessage* request, OutputMessage* result, + std::function<void(grpc::Status)> on_completion) { + static_assert(std::is_base_of<BaseInputMessage, InputMessage>::value, + "Invalid input message specification"); + static_assert(std::is_base_of<BaseOutputMessage, OutputMessage>::value, + "Invalid output message specification"); + CallbackUnaryCallImpl<BaseInputMessage, BaseOutputMessage> x( + channel, method, context, request, result, on_completion); +} + +template <class InputMessage, class OutputMessage> +class CallbackUnaryCallImpl { + public: + CallbackUnaryCallImpl(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, + const InputMessage* request, OutputMessage* result, + std::function<void(grpc::Status)> on_completion) { + grpc::CompletionQueue* cq = channel->CallbackCQ(); + GPR_ASSERT(cq != nullptr); + grpc::internal::Call call(channel->CreateCall(method, context, cq)); + + using FullCallOpSet = grpc::internal::CallOpSet< + grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpRecvMessage<OutputMessage>, + grpc::internal::CallOpClientSendClose, + grpc::internal::CallOpClientRecvStatus>; + + struct OpSetAndTag { + FullCallOpSet opset; + grpc::internal::CallbackWithStatusTag tag; + }; + const size_t alloc_sz = sizeof(OpSetAndTag); + auto* const alloced = + static_cast<OpSetAndTag*>(grpc_call_arena_alloc(call.call(), alloc_sz)); + auto* ops = new (&alloced->opset) FullCallOpSet; + auto* tag = new (&alloced->tag) + grpc::internal::CallbackWithStatusTag(call.call(), on_completion, ops); + + // TODO(vjpai): Unify code with sync API as much as possible + grpc::Status s = ops->SendMessagePtr(request); + if (!s.ok()) { + tag->force_run(s); + return; + } + ops->SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + ops->RecvInitialMetadata(context); + ops->RecvMessage(result); + ops->AllowNoMessage(); + ops->ClientSendClose(); + ops->ClientRecvStatus(context, tag->status_ptr()); + ops->set_core_cq_tag(tag); + call.PerformOps(ops); + } +}; + +// Base class for public API classes. +class ClientReactor { + public: + virtual ~ClientReactor() = default; + + /// Called by the library when all operations associated with this RPC have + /// completed and all Holds have been removed. OnDone provides the RPC status + /// outcome for both successful and failed RPCs. If it is never called on an + /// RPC, it indicates an application-level problem (like failure to remove a + /// hold). + /// + /// \param[in] s The status outcome of this RPC + virtual void OnDone(const grpc::Status& /*s*/) = 0; + + /// InternalScheduleOnDone is not part of the API and is not meant to be + /// overridden. It is virtual to allow successful builds for certain bazel + /// build users that only want to depend on gRPC codegen headers and not the + /// full library (although this is not a generally-supported option). Although + /// the virtual call is slower than a direct call, this function is + /// heavyweight and the cost of the virtual call is not much in comparison. + /// This function may be removed or devirtualized in the future. + virtual void InternalScheduleOnDone(grpc::Status s); + + /// InternalTrailersOnly is not part of the API and is not meant to be + /// overridden. It is virtual to allow successful builds for certain bazel + /// build users that only want to depend on gRPC codegen headers and not the + /// full library (although this is not a generally-supported option). Although + /// the virtual call is slower than a direct call, this function is + /// heavyweight and the cost of the virtual call is not much in comparison. + /// This function may be removed or devirtualized in the future. + virtual bool InternalTrailersOnly(const grpc_call* call) const; +}; + +} // namespace internal + +// Forward declarations +template <class Request, class Response> +class ClientBidiReactor; +template <class Response> +class ClientReadReactor; +template <class Request> +class ClientWriteReactor; +class ClientUnaryReactor; + +// NOTE: The streaming objects are not actually implemented in the public API. +// These interfaces are provided for mocking only. Typical applications +// will interact exclusively with the reactors that they define. +template <class Request, class Response> +class ClientCallbackReaderWriter { + public: + virtual ~ClientCallbackReaderWriter() {} + virtual void StartCall() = 0; + virtual void Write(const Request* req, grpc::WriteOptions options) = 0; + virtual void WritesDone() = 0; + virtual void Read(Response* resp) = 0; + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientBidiReactor<Request, Response>* reactor) { + reactor->BindStream(this); + } +}; + +template <class Response> +class ClientCallbackReader { + public: + virtual ~ClientCallbackReader() {} + virtual void StartCall() = 0; + virtual void Read(Response* resp) = 0; + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientReadReactor<Response>* reactor) { + reactor->BindReader(this); + } +}; + +template <class Request> +class ClientCallbackWriter { + public: + virtual ~ClientCallbackWriter() {} + virtual void StartCall() = 0; + void Write(const Request* req) { Write(req, grpc::WriteOptions()); } + virtual void Write(const Request* req, grpc::WriteOptions options) = 0; + void WriteLast(const Request* req, grpc::WriteOptions options) { + Write(req, options.set_last_message()); + } + virtual void WritesDone() = 0; + + virtual void AddHold(int holds) = 0; + virtual void RemoveHold() = 0; + + protected: + void BindReactor(ClientWriteReactor<Request>* reactor) { + reactor->BindWriter(this); + } +}; + +class ClientCallbackUnary { + public: + virtual ~ClientCallbackUnary() {} + virtual void StartCall() = 0; + + protected: + void BindReactor(ClientUnaryReactor* reactor); +}; + +// The following classes are the reactor interfaces that are to be implemented +// by the user. They are passed in to the library as an argument to a call on a +// stub (either a codegen-ed call or a generic call). The streaming RPC is +// activated by calling StartCall, possibly after initiating StartRead, +// StartWrite, or AddHold operations on the streaming object. Note that none of +// the classes are pure; all reactions have a default empty reaction so that the +// user class only needs to override those reactions that it cares about. +// The reactor must be passed to the stub invocation before any of the below +// operations can be called and its reactions will be invoked by the library in +// response to the completion of various operations. Reactions must not include +// blocking operations (such as blocking I/O, starting synchronous RPCs, or +// waiting on condition variables). Reactions may be invoked concurrently, +// except that OnDone is called after all others (assuming proper API usage). +// The reactor may not be deleted until OnDone is called. + +/// \a ClientBidiReactor is the interface for a bidirectional streaming RPC. +template <class Request, class Response> +class ClientBidiReactor : public internal::ClientReactor { + public: + /// Activate the RPC and initiate any reads or writes that have been Start'ed + /// before this call. All streaming RPCs issued by the client MUST have + /// StartCall invoked on them (even if they are canceled) as this call is the + /// activation of their lifecycle. + void StartCall() { stream_->StartCall(); } + + /// Initiate a read operation (or post it for later initiation if StartCall + /// has not yet been invoked). + /// + /// \param[out] resp Where to eventually store the read message. Valid when + /// the library calls OnReadDone + void StartRead(Response* resp) { stream_->Read(resp); } + + /// Initiate a write operation (or post it for later initiation if StartCall + /// has not yet been invoked). + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + void StartWrite(const Request* req) { StartWrite(req, grpc::WriteOptions()); } + + /// Initiate/post a write operation with specified options. + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWrite(const Request* req, grpc::WriteOptions options) { + stream_->Write(req, options); + } + + /// Initiate/post a write operation with specified options and an indication + /// that this is the last write (like StartWrite and StartWritesDone, merged). + /// Note that calling this means that no more calls to StartWrite, + /// StartWriteLast, or StartWritesDone are allowed. + /// + /// \param[in] req The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWriteLast(const Request* req, grpc::WriteOptions options) { + StartWrite(req, options.set_last_message()); + } + + /// Indicate that the RPC will have no more write operations. This can only be + /// issued once for a given RPC. This is not required or allowed if + /// StartWriteLast is used since that already has the same implication. + /// Note that calling this means that no more calls to StartWrite, + /// StartWriteLast, or StartWritesDone are allowed. + void StartWritesDone() { stream_->WritesDone(); } + + /// Holds are needed if (and only if) this stream has operations that take + /// place on it after StartCall but from outside one of the reactions + /// (OnReadDone, etc). This is _not_ a common use of the streaming API. + /// + /// Holds must be added before calling StartCall. If a stream still has a hold + /// in place, its resources will not be destroyed even if the status has + /// already come in from the wire and there are currently no active callbacks + /// outstanding. Similarly, the stream will not call OnDone if there are still + /// holds on it. + /// + /// For example, if a StartRead or StartWrite operation is going to be + /// initiated from elsewhere in the application, the application should call + /// AddHold or AddMultipleHolds before StartCall. If there is going to be, + /// for example, a read-flow and a write-flow taking place outside the + /// reactions, then call AddMultipleHolds(2) before StartCall. When the + /// application knows that it won't issue any more read operations (such as + /// when a read comes back as not ok), it should issue a RemoveHold(). It + /// should also call RemoveHold() again after it does StartWriteLast or + /// StartWritesDone that indicates that there will be no more write ops. + /// The number of RemoveHold calls must match the total number of AddHold + /// calls plus the number of holds added by AddMultipleHolds. + /// The argument to AddMultipleHolds must be positive. + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_DEBUG_ASSERT(holds > 0); + stream_->AddHold(holds); + } + void RemoveHold() { stream_->RemoveHold(); } + + /// Notifies the application that all operations associated with this RPC + /// have completed and all Holds have been removed. OnDone provides the RPC + /// status outcome for both successful and failed RPCs and will be called in + /// all cases. If it is not called, it indicates an application-level problem + /// (like failure to remove a hold). + /// + /// \param[in] s The status outcome of this RPC + void OnDone(const grpc::Status& /*s*/) override {} + + /// Notifies the application that a read of initial metadata from the + /// server is done. If the application chooses not to implement this method, + /// it can assume that the initial metadata has been read before the first + /// call of OnReadDone or OnDone. + /// + /// \param[in] ok Was the initial metadata read successfully? If false, no + /// new read/write operation will succeed, and any further + /// Start* operations should not be called. + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + + /// Notifies the application that a StartRead operation completed. + /// + /// \param[in] ok Was it successful? If false, no new read/write operation + /// will succeed, and any further Start* should not be called. + virtual void OnReadDone(bool /*ok*/) {} + + /// Notifies the application that a StartWrite or StartWriteLast operation + /// completed. + /// + /// \param[in] ok Was it successful? If false, no new read/write operation + /// will succeed, and any further Start* should not be called. + virtual void OnWriteDone(bool /*ok*/) {} + + /// Notifies the application that a StartWritesDone operation completed. Note + /// that this is only used on explicit StartWritesDone operations and not for + /// those that are implicitly invoked as part of a StartWriteLast. + /// + /// \param[in] ok Was it successful? If false, the application will later see + /// the failure reflected as a bad status in OnDone and no + /// further Start* should be called. + virtual void OnWritesDoneDone(bool /*ok*/) {} + + private: + friend class ClientCallbackReaderWriter<Request, Response>; + void BindStream(ClientCallbackReaderWriter<Request, Response>* stream) { + stream_ = stream; + } + ClientCallbackReaderWriter<Request, Response>* stream_; +}; + +/// \a ClientReadReactor is the interface for a server-streaming RPC. +/// All public methods behave as in ClientBidiReactor. +template <class Response> +class ClientReadReactor : public internal::ClientReactor { + public: + void StartCall() { reader_->StartCall(); } + void StartRead(Response* resp) { reader_->Read(resp); } + + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_DEBUG_ASSERT(holds > 0); + reader_->AddHold(holds); + } + void RemoveHold() { reader_->RemoveHold(); } + + void OnDone(const grpc::Status& /*s*/) override {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + virtual void OnReadDone(bool /*ok*/) {} + + private: + friend class ClientCallbackReader<Response>; + void BindReader(ClientCallbackReader<Response>* reader) { reader_ = reader; } + ClientCallbackReader<Response>* reader_; +}; + +/// \a ClientWriteReactor is the interface for a client-streaming RPC. +/// All public methods behave as in ClientBidiReactor. +template <class Request> +class ClientWriteReactor : public internal::ClientReactor { + public: + void StartCall() { writer_->StartCall(); } + void StartWrite(const Request* req) { StartWrite(req, grpc::WriteOptions()); } + void StartWrite(const Request* req, grpc::WriteOptions options) { + writer_->Write(req, options); + } + void StartWriteLast(const Request* req, grpc::WriteOptions options) { + StartWrite(req, options.set_last_message()); + } + void StartWritesDone() { writer_->WritesDone(); } + + void AddHold() { AddMultipleHolds(1); } + void AddMultipleHolds(int holds) { + GPR_DEBUG_ASSERT(holds > 0); + writer_->AddHold(holds); + } + void RemoveHold() { writer_->RemoveHold(); } + + void OnDone(const grpc::Status& /*s*/) override {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + virtual void OnWriteDone(bool /*ok*/) {} + virtual void OnWritesDoneDone(bool /*ok*/) {} + + private: + friend class ClientCallbackWriter<Request>; + void BindWriter(ClientCallbackWriter<Request>* writer) { writer_ = writer; } + + ClientCallbackWriter<Request>* writer_; +}; + +/// \a ClientUnaryReactor is a reactor-style interface for a unary RPC. +/// This is _not_ a common way of invoking a unary RPC. In practice, this +/// option should be used only if the unary RPC wants to receive initial +/// metadata without waiting for the response to complete. Most deployments of +/// RPC systems do not use this option, but it is needed for generality. +/// All public methods behave as in ClientBidiReactor. +/// StartCall is included for consistency with the other reactor flavors: even +/// though there are no StartRead or StartWrite operations to queue before the +/// call (that is part of the unary call itself) and there is no reactor object +/// being created as a result of this call, we keep a consistent 2-phase +/// initiation API among all the reactor flavors. +class ClientUnaryReactor : public internal::ClientReactor { + public: + void StartCall() { call_->StartCall(); } + void OnDone(const grpc::Status& /*s*/) override {} + virtual void OnReadInitialMetadataDone(bool /*ok*/) {} + + private: + friend class ClientCallbackUnary; + void BindCall(ClientCallbackUnary* call) { call_ = call; } + ClientCallbackUnary* call_; +}; + +// Define function out-of-line from class to avoid forward declaration issue +inline void ClientCallbackUnary::BindReactor(ClientUnaryReactor* reactor) { + reactor->BindCall(this); +} + +namespace internal { + +// Forward declare factory classes for friendship +template <class Request, class Response> +class ClientCallbackReaderWriterFactory; +template <class Response> +class ClientCallbackReaderFactory; +template <class Request> +class ClientCallbackWriterFactory; + +template <class Request, class Response> +class ClientCallbackReaderWriterImpl + : public ClientCallbackReaderWriter<Request, Response> { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_ASSERT(size == sizeof(ClientCallbackReaderWriterImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_ASSERT(false); } + + void StartCall() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any read backlog + // 3. Any write backlog + // 4. Recv trailing metadata (unless corked) + if (!start_corked_) { + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + } + + call_.PerformOps(&start_ops_); + + { + grpc::internal::MutexLock lock(&start_mu_); + + if (backlog_.read_ops) { + call_.PerformOps(&read_ops_); + } + if (backlog_.write_ops) { + call_.PerformOps(&write_ops_); + } + if (backlog_.writes_done_ops) { + call_.PerformOps(&writes_done_ops_); + } + call_.PerformOps(&finish_ops_); + // The last thing in this critical section is to set started_ so that it + // can be used lock-free as well. + started_.store(true, std::memory_order_release); + } + // MaybeFinish outside the lock to make sure that destruction of this object + // doesn't take place while holding the lock (which would cause the lock to + // be released after destruction) + this->MaybeFinish(/*from_reaction=*/false); + } + + void Read(Response* msg) override { + read_ops_.RecvMessage(msg); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.read_ops = true; + return; + } + } + call_.PerformOps(&read_ops_); + } + + void Write(const Request* msg, grpc::WriteOptions options) + Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + if (options.is_last_message()) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(vjpai): don't assert + GPR_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (GPR_UNLIKELY(corked_write_needed_)) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + corked_write_needed_ = false; + } + + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.write_ops = true; + return; + } + } + call_.PerformOps(&write_ops_); + } + void WritesDone() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + writes_done_ops_.ClientSendClose(); + writes_done_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnWritesDoneDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &writes_done_ops_, /*can_inline=*/false); + writes_done_ops_.set_core_cq_tag(&writes_done_tag_); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (GPR_UNLIKELY(corked_write_needed_)) { + writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + corked_write_needed_ = false; + } + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.writes_done_ops = true; + return; + } + } + call_.PerformOps(&writes_done_ops_); + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } + + private: + friend class ClientCallbackReaderWriterFactory<Request, Response>; + + ClientCallbackReaderWriterImpl(grpc::internal::Call call, + grpc::ClientContext* context, + ClientBidiReactor<Request, Response>* reactor) + : context_(context), + call_(call), + reactor_(reactor), + start_corked_(context_->initial_metadata_corked_), + corked_write_needed_(start_corked_) { + this->BindReactor(reactor); + + // Set up the unchanging parts of the start, read, and write tags and ops. + start_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone( + ok && !reactor_->InternalTrailersOnly(call_.call())); + MaybeFinish(/*from_reaction=*/true); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + + write_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnWriteDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + + read_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + + // Also set up the Finish tag and op set. + finish_tag_.Set( + call_.call(), + [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, + &finish_ops_, + /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + } + + // MaybeFinish can be called from reactions or from user-initiated operations + // like StartCall or RemoveHold. If this is the last operation or hold on this + // object, it will invoke the OnDone reaction. If MaybeFinish was called from + // a reaction, it can call OnDone directly. If not, it would need to schedule + // OnDone onto an executor thread to avoid the possibility of deadlocking with + // any locks in the user code that invoked it. + void MaybeFinish(bool from_reaction) { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackReaderWriterImpl(); + grpc_call_unref(call); + if (GPR_LIKELY(from_reaction)) { + reactor->OnDone(s); + } else { + reactor->InternalScheduleOnDone(std::move(s)); + } + } + } + + grpc::ClientContext* const context_; + grpc::internal::Call call_; + ClientBidiReactor<Request, Response>* const reactor_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpRecvInitialMetadata> + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + const bool start_corked_; + bool corked_write_needed_; // no lock needed since only accessed in + // Write/WritesDone which cannot be concurrent + + grpc::internal::CallOpSet<grpc::internal::CallOpClientRecvStatus> finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + grpc::Status finish_status_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose> + write_ops_; + grpc::internal::CallbackWithSuccessTag write_tag_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpClientSendClose> + writes_done_ops_; + grpc::internal::CallbackWithSuccessTag writes_done_tag_; + + grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<Response>> + read_ops_; + grpc::internal::CallbackWithSuccessTag read_tag_; + + struct StartCallBacklog { + bool write_ops = false; + bool writes_done_ops = false; + bool read_ops = false; + }; + StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); + + // Minimum of 3 callbacks to pre-register for start ops, StartCall, and finish + std::atomic<intptr_t> callbacks_outstanding_{3}; + std::atomic_bool started_{false}; + grpc::internal::Mutex start_mu_; +}; + +template <class Request, class Response> +class ClientCallbackReaderWriterFactory { + public: + static void Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, + ClientBidiReactor<Request, Response>* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + grpc_call_ref(call.call()); + new (grpc_call_arena_alloc( + call.call(), sizeof(ClientCallbackReaderWriterImpl<Request, Response>))) + ClientCallbackReaderWriterImpl<Request, Response>(call, context, + reactor); + } +}; + +template <class Response> +class ClientCallbackReaderImpl : public ClientCallbackReader<Response> { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_ASSERT(size == sizeof(ClientCallbackReaderImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_ASSERT(false); } + + void StartCall() override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any backlog + // 3. Recv trailing metadata + + start_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone( + ok && !reactor_->InternalTrailersOnly(call_.call())); + MaybeFinish(/*from_reaction=*/true); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + // Also set up the read tag so it doesn't have to be set up each time + read_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &read_ops_, /*can_inline=*/false); + read_ops_.set_core_cq_tag(&read_tag_); + + { + grpc::internal::MutexLock lock(&start_mu_); + if (backlog_.read_ops) { + call_.PerformOps(&read_ops_); + } + started_.store(true, std::memory_order_release); + } + + finish_tag_.Set( + call_.call(), + [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, + &finish_ops_, /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + void Read(Response* msg) override { + read_ops_.RecvMessage(msg); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.read_ops = true; + return; + } + } + call_.PerformOps(&read_ops_); + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } + + private: + friend class ClientCallbackReaderFactory<Response>; + + template <class Request> + ClientCallbackReaderImpl(grpc::internal::Call call, + grpc::ClientContext* context, Request* request, + ClientReadReactor<Response>* reactor) + : context_(context), call_(call), reactor_(reactor) { + this->BindReactor(reactor); + // TODO(vjpai): don't assert + GPR_ASSERT(start_ops_.SendMessagePtr(request).ok()); + start_ops_.ClientSendClose(); + } + + // MaybeFinish behaves as in ClientCallbackReaderWriterImpl. + void MaybeFinish(bool from_reaction) { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackReaderImpl(); + grpc_call_unref(call); + if (GPR_LIKELY(from_reaction)) { + reactor->OnDone(s); + } else { + reactor->InternalScheduleOnDone(std::move(s)); + } + } + } + + grpc::ClientContext* const context_; + grpc::internal::Call call_; + ClientReadReactor<Response>* const reactor_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose, + grpc::internal::CallOpRecvInitialMetadata> + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + + grpc::internal::CallOpSet<grpc::internal::CallOpClientRecvStatus> finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + grpc::Status finish_status_; + + grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<Response>> + read_ops_; + grpc::internal::CallbackWithSuccessTag read_tag_; + + struct StartCallBacklog { + bool read_ops = false; + }; + StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); + + // Minimum of 2 callbacks to pre-register for start and finish + std::atomic<intptr_t> callbacks_outstanding_{2}; + std::atomic_bool started_{false}; + grpc::internal::Mutex start_mu_; +}; + +template <class Response> +class ClientCallbackReaderFactory { + public: + template <class Request> + static void Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, const Request* request, + ClientReadReactor<Response>* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + grpc_call_ref(call.call()); + new (grpc_call_arena_alloc(call.call(), + sizeof(ClientCallbackReaderImpl<Response>))) + ClientCallbackReaderImpl<Response>(call, context, request, reactor); + } +}; + +template <class Request> +class ClientCallbackWriterImpl : public ClientCallbackWriter<Request> { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_ASSERT(size == sizeof(ClientCallbackWriterImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_ASSERT(false); } + + void StartCall() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + // This call initiates two batches, plus any backlog, each with a callback + // 1. Send initial metadata (unless corked) + recv initial metadata + // 2. Any backlog + // 3. Recv trailing metadata + + if (!start_corked_) { + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + } + call_.PerformOps(&start_ops_); + + { + grpc::internal::MutexLock lock(&start_mu_); + + if (backlog_.write_ops) { + call_.PerformOps(&write_ops_); + } + if (backlog_.writes_done_ops) { + call_.PerformOps(&writes_done_ops_); + } + call_.PerformOps(&finish_ops_); + // The last thing in this critical section is to set started_ so that it + // can be used lock-free as well. + started_.store(true, std::memory_order_release); + } + // MaybeFinish outside the lock to make sure that destruction of this object + // doesn't take place while holding the lock (which would cause the lock to + // be released after destruction) + this->MaybeFinish(/*from_reaction=*/false); + } + + void Write(const Request* msg, grpc::WriteOptions options) + Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + if (GPR_UNLIKELY(options.is_last_message())) { + options.set_buffer_hint(); + write_ops_.ClientSendClose(); + } + // TODO(vjpai): don't assert + GPR_ASSERT(write_ops_.SendMessagePtr(msg, options).ok()); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + + if (GPR_UNLIKELY(corked_write_needed_)) { + write_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + corked_write_needed_ = false; + } + + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.write_ops = true; + return; + } + } + call_.PerformOps(&write_ops_); + } + + void WritesDone() Y_ABSL_LOCKS_EXCLUDED(start_mu_) override { + writes_done_ops_.ClientSendClose(); + writes_done_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnWritesDoneDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &writes_done_ops_, /*can_inline=*/false); + writes_done_ops_.set_core_cq_tag(&writes_done_tag_); + callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); + + if (GPR_UNLIKELY(corked_write_needed_)) { + writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + corked_write_needed_ = false; + } + + if (GPR_UNLIKELY(!started_.load(std::memory_order_acquire))) { + grpc::internal::MutexLock lock(&start_mu_); + if (GPR_LIKELY(!started_.load(std::memory_order_relaxed))) { + backlog_.writes_done_ops = true; + return; + } + } + call_.PerformOps(&writes_done_ops_); + } + + void AddHold(int holds) override { + callbacks_outstanding_.fetch_add(holds, std::memory_order_relaxed); + } + void RemoveHold() override { MaybeFinish(/*from_reaction=*/false); } + + private: + friend class ClientCallbackWriterFactory<Request>; + + template <class Response> + ClientCallbackWriterImpl(grpc::internal::Call call, + grpc::ClientContext* context, Response* response, + ClientWriteReactor<Request>* reactor) + : context_(context), + call_(call), + reactor_(reactor), + start_corked_(context_->initial_metadata_corked_), + corked_write_needed_(start_corked_) { + this->BindReactor(reactor); + + // Set up the unchanging parts of the start and write tags and ops. + start_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone( + ok && !reactor_->InternalTrailersOnly(call_.call())); + MaybeFinish(/*from_reaction=*/true); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + + write_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnWriteDone(ok); + MaybeFinish(/*from_reaction=*/true); + }, + &write_ops_, /*can_inline=*/false); + write_ops_.set_core_cq_tag(&write_tag_); + + // Also set up the Finish tag and op set. + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + finish_tag_.Set( + call_.call(), + [this](bool /*ok*/) { MaybeFinish(/*from_reaction=*/true); }, + &finish_ops_, + /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + } + + // MaybeFinish behaves as in ClientCallbackReaderWriterImpl. + void MaybeFinish(bool from_reaction) { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackWriterImpl(); + grpc_call_unref(call); + if (GPR_LIKELY(from_reaction)) { + reactor->OnDone(s); + } else { + reactor->InternalScheduleOnDone(std::move(s)); + } + } + } + + grpc::ClientContext* const context_; + grpc::internal::Call call_; + ClientWriteReactor<Request>* const reactor_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpRecvInitialMetadata> + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + const bool start_corked_; + bool corked_write_needed_; // no lock needed since only accessed in + // Write/WritesDone which cannot be concurrent + + grpc::internal::CallOpSet<grpc::internal::CallOpGenericRecvMessage, + grpc::internal::CallOpClientRecvStatus> + finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + grpc::Status finish_status_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose> + write_ops_; + grpc::internal::CallbackWithSuccessTag write_tag_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpClientSendClose> + writes_done_ops_; + grpc::internal::CallbackWithSuccessTag writes_done_tag_; + + struct StartCallBacklog { + bool write_ops = false; + bool writes_done_ops = false; + }; + StartCallBacklog backlog_ Y_ABSL_GUARDED_BY(start_mu_); + + // Minimum of 3 callbacks to pre-register for start ops, StartCall, and finish + std::atomic<intptr_t> callbacks_outstanding_{3}; + std::atomic_bool started_{false}; + grpc::internal::Mutex start_mu_; +}; + +template <class Request> +class ClientCallbackWriterFactory { + public: + template <class Response> + static void Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, Response* response, + ClientWriteReactor<Request>* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + grpc_call_ref(call.call()); + new (grpc_call_arena_alloc(call.call(), + sizeof(ClientCallbackWriterImpl<Request>))) + ClientCallbackWriterImpl<Request>(call, context, response, reactor); + } +}; + +class ClientCallbackUnaryImpl final : public ClientCallbackUnary { + public: + // always allocated against a call arena, no memory free required + static void operator delete(void* /*ptr*/, std::size_t size) { + GPR_ASSERT(size == sizeof(ClientCallbackUnaryImpl)); + } + + // This operator should never be called as the memory should be freed as part + // of the arena destruction. It only exists to provide a matching operator + // delete to the operator new so that some compilers will not complain (see + // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this + // there are no tests catching the compiler warning. + static void operator delete(void*, void*) { GPR_ASSERT(false); } + + void StartCall() override { + // This call initiates two batches, each with a callback + // 1. Send initial metadata + write + writes done + recv initial metadata + // 2. Read message, recv trailing metadata + + start_tag_.Set( + call_.call(), + [this](bool ok) { + reactor_->OnReadInitialMetadataDone( + ok && !reactor_->InternalTrailersOnly(call_.call())); + MaybeFinish(); + }, + &start_ops_, /*can_inline=*/false); + start_ops_.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + start_ops_.RecvInitialMetadata(context_); + start_ops_.set_core_cq_tag(&start_tag_); + call_.PerformOps(&start_ops_); + + finish_tag_.Set( + call_.call(), [this](bool /*ok*/) { MaybeFinish(); }, &finish_ops_, + /*can_inline=*/false); + finish_ops_.ClientRecvStatus(context_, &finish_status_); + finish_ops_.set_core_cq_tag(&finish_tag_); + call_.PerformOps(&finish_ops_); + } + + private: + friend class ClientCallbackUnaryFactory; + + template <class Request, class Response> + ClientCallbackUnaryImpl(grpc::internal::Call call, + grpc::ClientContext* context, Request* request, + Response* response, ClientUnaryReactor* reactor) + : context_(context), call_(call), reactor_(reactor) { + this->BindReactor(reactor); + // TODO(vjpai): don't assert + GPR_ASSERT(start_ops_.SendMessagePtr(request).ok()); + start_ops_.ClientSendClose(); + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + } + + // In the unary case, MaybeFinish is only ever invoked from a + // library-initiated reaction, so it will just directly call OnDone if this is + // the last reaction for this RPC. + void MaybeFinish() { + if (GPR_UNLIKELY(callbacks_outstanding_.fetch_sub( + 1, std::memory_order_acq_rel) == 1)) { + grpc::Status s = std::move(finish_status_); + auto* reactor = reactor_; + auto* call = call_.call(); + this->~ClientCallbackUnaryImpl(); + grpc_call_unref(call); + reactor->OnDone(s); + } + } + + grpc::ClientContext* const context_; + grpc::internal::Call call_; + ClientUnaryReactor* const reactor_; + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose, + grpc::internal::CallOpRecvInitialMetadata> + start_ops_; + grpc::internal::CallbackWithSuccessTag start_tag_; + + grpc::internal::CallOpSet<grpc::internal::CallOpGenericRecvMessage, + grpc::internal::CallOpClientRecvStatus> + finish_ops_; + grpc::internal::CallbackWithSuccessTag finish_tag_; + grpc::Status finish_status_; + + // This call will have 2 callbacks: start and finish + std::atomic<intptr_t> callbacks_outstanding_{2}; +}; + +class ClientCallbackUnaryFactory { + public: + template <class Request, class Response, class BaseRequest = Request, + class BaseResponse = Response> + static void Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, const Request* request, + Response* response, ClientUnaryReactor* reactor) { + grpc::internal::Call call = + channel->CreateCall(method, context, channel->CallbackCQ()); + + grpc_call_ref(call.call()); + + new (grpc_call_arena_alloc(call.call(), sizeof(ClientCallbackUnaryImpl))) + ClientCallbackUnaryImpl(call, context, + static_cast<const BaseRequest*>(request), + static_cast<BaseResponse*>(response), reactor); + } +}; + +} // namespace internal +} // namespace grpc #endif // GRPCPP_SUPPORT_CLIENT_CALLBACK_H diff --git a/contrib/libs/grpc/include/grpcpp/support/client_interceptor.h b/contrib/libs/grpc/include/grpcpp/support/client_interceptor.h index 8e5e1ce67b..ef84d18439 100644 --- a/contrib/libs/grpc/include/grpcpp/support/client_interceptor.h +++ b/contrib/libs/grpc/include/grpcpp/support/client_interceptor.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_CLIENT_INTERCEPTOR_H #define GRPCPP_SUPPORT_CLIENT_INTERCEPTOR_H @@ -22,6 +22,7 @@ #include <memory> #include <vector> +#include <grpc/support/log.h> #include <grpcpp/impl/rpc_method.h> #include <grpcpp/support/interceptor.h> #include <grpcpp/support/string_ref.h> @@ -135,7 +136,7 @@ class ClientRpcInfo { // Runs interceptor at pos \a pos. void RunInterceptor( experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { - GPR_CODEGEN_ASSERT(pos < interceptors_.size()); + GPR_ASSERT(pos < interceptors_.size()); interceptors_[pos]->Intercept(interceptor_methods); } diff --git a/contrib/libs/grpc/include/grpcpp/support/config.h b/contrib/libs/grpc/include/grpcpp/support/config.h index f2632f2640..6e28fe73c8 100644 --- a/contrib/libs/grpc/include/grpcpp/support/config.h +++ b/contrib/libs/grpc/include/grpcpp/support/config.h @@ -1,24 +1,44 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_CONFIG_H #define GRPCPP_SUPPORT_CONFIG_H -#include <grpcpp/impl/codegen/config.h> // IWYU pragma: export +#include <util/generic/string.h> +#include <util/string/cast.h> + +/// The following macros are deprecated and appear only for users +/// with PB files generated using gRPC 1.0.x plugins. They should +/// not be used in new code +#define GRPC_OVERRIDE override // deprecated +#define GRPC_FINAL final // deprecated + +#ifdef GRPC_CUSTOM_STRING +#warning GRPC_CUSTOM_STRING is no longer supported. Please use TString. +#endif + +namespace grpc { + +// Using grpc::string and grpc::to_string is discouraged in favor of +// TString and ::ToString. This is only for legacy code using +// them explictly. +typedef TString string; + +} // namespace grpc #endif // GRPCPP_SUPPORT_CONFIG_H diff --git a/contrib/libs/grpc/include/grpcpp/support/interceptor.h b/contrib/libs/grpc/include/grpcpp/support/interceptor.h index d4f2ea180e..7c5c95a664 100644 --- a/contrib/libs/grpc/include/grpcpp/support/interceptor.h +++ b/contrib/libs/grpc/include/grpcpp/support/interceptor.h @@ -1,24 +1,231 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_INTERCEPTOR_H #define GRPCPP_SUPPORT_INTERCEPTOR_H -#include <grpcpp/impl/codegen/interceptor.h> // IWYU pragma: export +#include <map> +#include <memory> +#include <util/generic/string.h> +#include <util/string/cast.h> + +#include <grpc/impl/grpc_types.h> +#include <grpcpp/impl/metadata_map.h> +#include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/string_ref.h> + +namespace grpc { + +class ChannelInterface; +class Status; + +namespace experimental { + +/// An enumeration of different possible points at which the \a Intercept +/// method of the \a Interceptor interface may be called. Any given call +/// to \a Intercept will include one or more of these hook points, and +/// each hook point makes certain types of information available to the +/// interceptor. +/// In these enumeration names, PRE_SEND means that an interception has taken +/// place between the time the application provided a certain type of data +/// (e.g., initial metadata, status) and the time that that data goes to the +/// other side. POST_SEND means that the data has been committed for going to +/// the other side (even if it has not yet been received at the other side). +/// PRE_RECV means an interception between the time that a certain +/// operation has been requested and it is available. POST_RECV means that a +/// result is available but has not yet been passed back to the application. +/// A batch of interception points will only contain either PRE or POST hooks +/// but not both types. For example, a batch with PRE_SEND hook points will not +/// contain POST_RECV or POST_SEND ops. Likewise, a batch with POST_* ops can +/// not contain PRE_* ops. +enum class InterceptionHookPoints { + /// The first three in this list are for clients and servers + PRE_SEND_INITIAL_METADATA, + PRE_SEND_MESSAGE, + POST_SEND_MESSAGE, + PRE_SEND_STATUS, // server only + PRE_SEND_CLOSE, // client only: WritesDone for stream; after write in unary + /// The following three are for hijacked clients only. A batch with PRE_RECV_* + /// hook points will never contain hook points of other types. + PRE_RECV_INITIAL_METADATA, + PRE_RECV_MESSAGE, + PRE_RECV_STATUS, + /// The following two are for all clients and servers + POST_RECV_INITIAL_METADATA, + POST_RECV_MESSAGE, + POST_RECV_STATUS, // client only + POST_RECV_CLOSE, // server only + /// This is a special hook point available to both clients and servers when + /// TryCancel() is performed. + /// - No other hook points will be present along with this. + /// - It is illegal for an interceptor to block/delay this operation. + /// - ALL interceptors see this hook point irrespective of whether the + /// RPC was hijacked or not. + PRE_SEND_CANCEL, + NUM_INTERCEPTION_HOOKS +}; + +/// Class that is passed as an argument to the \a Intercept method +/// of the application's \a Interceptor interface implementation. It has five +/// purposes: +/// 1. Indicate which hook points are present at a specific interception +/// 2. Allow an interceptor to inform the library that an RPC should +/// continue to the next stage of its processing (which may be another +/// interceptor or the main path of the library) +/// 3. Allow an interceptor to hijack the processing of the RPC (only for +/// client-side RPCs with PRE_SEND_INITIAL_METADATA) so that it does not +/// proceed with normal processing beyond that stage +/// 4. Access the relevant fields of an RPC at each interception point +/// 5. Set some fields of an RPC at each interception point, when possible +class InterceptorBatchMethods { + public: + virtual ~InterceptorBatchMethods() {} + /// Determine whether the current batch has an interception hook point + /// of type \a type + virtual bool QueryInterceptionHookPoint(InterceptionHookPoints type) = 0; + /// Signal that the interceptor is done intercepting the current batch of the + /// RPC. Every interceptor must either call Proceed or Hijack on each + /// interception. In most cases, only Proceed will be used. Explicit use of + /// Proceed is what enables interceptors to delay the processing of RPCs + /// while they perform other work. + /// Proceed is a no-op if the batch contains PRE_SEND_CANCEL. Simply returning + /// from the Intercept method does the job of continuing the RPC in this case. + /// This is because PRE_SEND_CANCEL is always in a separate batch and is not + /// allowed to be delayed. + virtual void Proceed() = 0; + /// Indicate that the interceptor has hijacked the RPC (only valid if the + /// batch contains send_initial_metadata on the client side). Later + /// interceptors in the interceptor list will not be called. Later batches + /// on the same RPC will go through interception, but only up to the point + /// of the hijacking interceptor. + virtual void Hijack() = 0; + + /// Send Message Methods + /// GetSerializedSendMessage and GetSendMessage/ModifySendMessage are the + /// available methods to view and modify the request payload. An interceptor + /// can access the payload in either serialized form or non-serialized form + /// but not both at the same time. + /// gRPC performs serialization in a lazy manner, which means + /// that a call to GetSerializedSendMessage will result in a serialization + /// operation if the payload stored is not in the serialized form already; the + /// non-serialized form will be lost and GetSendMessage will no longer return + /// a valid pointer, and this will remain true for later interceptors too. + /// This can change however if ModifySendMessage is used to replace the + /// current payload. Note that ModifySendMessage requires a new payload + /// message in the non-serialized form. This will overwrite the existing + /// payload irrespective of whether it had been serialized earlier. Also note + /// that gRPC Async API requires early serialization of the payload which + /// means that the payload would be available in the serialized form only + /// unless an interceptor replaces the payload with ModifySendMessage. + + /// Returns a modifable ByteBuffer holding the serialized form of the message + /// that is going to be sent. Valid for PRE_SEND_MESSAGE interceptions. + /// A return value of nullptr indicates that this ByteBuffer is not valid. + virtual ByteBuffer* GetSerializedSendMessage() = 0; + + /// Returns a non-modifiable pointer to the non-serialized form of the message + /// to be sent. Valid for PRE_SEND_MESSAGE interceptions. A return value of + /// nullptr indicates that this field is not valid. + virtual const void* GetSendMessage() = 0; + + /// Overwrites the message to be sent with \a message. \a message should be in + /// the non-serialized form expected by the method. Valid for PRE_SEND_MESSAGE + /// interceptions. Note that the interceptor is responsible for maintaining + /// the life of the message till it is serialized or it receives the + /// POST_SEND_MESSAGE interception point, whichever happens earlier. The + /// modifying interceptor may itself force early serialization by calling + /// GetSerializedSendMessage. + virtual void ModifySendMessage(const void* message) = 0; + + /// Checks whether the SEND MESSAGE op succeeded. Valid for POST_SEND_MESSAGE + /// interceptions. + virtual bool GetSendMessageStatus() = 0; + + /// Returns a modifiable multimap of the initial metadata to be sent. Valid + /// for PRE_SEND_INITIAL_METADATA interceptions. A value of nullptr indicates + /// that this field is not valid. + virtual std::multimap<TString, TString>* GetSendInitialMetadata() = 0; + + /// Returns the status to be sent. Valid for PRE_SEND_STATUS interceptions. + virtual Status GetSendStatus() = 0; + + /// Overwrites the status with \a status. Valid for PRE_SEND_STATUS + /// interceptions. + virtual void ModifySendStatus(const Status& status) = 0; + + /// Returns a modifiable multimap of the trailing metadata to be sent. Valid + /// for PRE_SEND_STATUS interceptions. A value of nullptr indicates + /// that this field is not valid. + virtual std::multimap<TString, TString>* + GetSendTrailingMetadata() = 0; + + /// Returns a pointer to the modifiable received message. Note that the + /// message is already deserialized but the type is not set; the interceptor + /// should static_cast to the appropriate type before using it. This is valid + /// for PRE_RECV_MESSAGE and POST_RECV_MESSAGE interceptions; nullptr for not + /// valid + virtual void* GetRecvMessage() = 0; + + /// Returns a modifiable multimap of the received initial metadata. + /// Valid for PRE_RECV_INITIAL_METADATA and POST_RECV_INITIAL_METADATA + /// interceptions; nullptr if not valid + virtual std::multimap<grpc::string_ref, grpc::string_ref>* + GetRecvInitialMetadata() = 0; + + /// Returns a modifiable view of the received status on PRE_RECV_STATUS and + /// POST_RECV_STATUS interceptions; nullptr if not valid. + virtual Status* GetRecvStatus() = 0; + + /// Returns a modifiable multimap of the received trailing metadata on + /// PRE_RECV_STATUS and POST_RECV_STATUS interceptions; nullptr if not valid + virtual std::multimap<grpc::string_ref, grpc::string_ref>* + GetRecvTrailingMetadata() = 0; + + /// Gets an intercepted channel. When a call is started on this interceptor, + /// only interceptors after the current interceptor are created from the + /// factory objects registered with the channel. This allows calls to be + /// started from interceptors without infinite regress through the interceptor + /// list. + virtual std::unique_ptr<ChannelInterface> GetInterceptedChannel() = 0; + + /// On a hijacked RPC, an interceptor can decide to fail a PRE_RECV_MESSAGE + /// op. This would be a signal to the reader that there will be no more + /// messages, or the stream has failed or been cancelled. + virtual void FailHijackedRecvMessage() = 0; + + /// On a hijacked RPC/ to-be hijacked RPC, this can be called to fail a SEND + /// MESSAGE op + virtual void FailHijackedSendMessage() = 0; +}; + +/// Interface for an interceptor. Interceptor authors must create a class +/// that derives from this parent class. +class Interceptor { + public: + virtual ~Interceptor() {} + + /// The one public method of an Interceptor interface. Override this to + /// trigger the desired actions at the hook points described above. + virtual void Intercept(InterceptorBatchMethods* methods) = 0; +}; + +} // namespace experimental +} // namespace grpc #endif // GRPCPP_SUPPORT_INTERCEPTOR_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/message_allocator.h b/contrib/libs/grpc/include/grpcpp/support/message_allocator.h index 440c7f1d23..8e627900e5 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/message_allocator.h +++ b/contrib/libs/grpc/include/grpcpp/support/message_allocator.h @@ -1,25 +1,23 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// -#ifndef GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H -#define GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H - -// IWYU pragma: private, include <grpcpp/support/message_allocator.h> +#ifndef GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H +#define GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H namespace grpc { @@ -70,4 +68,4 @@ class MessageAllocator { } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_MESSAGE_ALLOCATOR_H +#endif // GRPCPP_SUPPORT_MESSAGE_ALLOCATOR_H diff --git a/contrib/libs/grpc/include/grpcpp/support/method_handler.h b/contrib/libs/grpc/include/grpcpp/support/method_handler.h index 0b97a7af03..e4ec4a88d8 100644 --- a/contrib/libs/grpc/include/grpcpp/support/method_handler.h +++ b/contrib/libs/grpc/include/grpcpp/support/method_handler.h @@ -1,24 +1,405 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_METHOD_HANDLER_H #define GRPCPP_SUPPORT_METHOD_HANDLER_H -#include <grpcpp/impl/codegen/method_handler.h> // IWYU pragma: export +#include <grpc/byte_buffer.h> +#include <grpc/support/log.h> +#include <grpcpp/impl/rpc_service_method.h> +#include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/sync_stream.h> + +namespace grpc { + +namespace internal { + +// Invoke the method handler, fill in the status, and +// return whether or not we finished safely (without an exception). +// Note that exception handling is 0-cost in most compiler/library +// implementations (except when an exception is actually thrown), +// so this process doesn't require additional overhead in the common case. +// Additionally, we don't need to return if we caught an exception or not; +// the handling is the same in either case. +template <class Callable> +::grpc::Status CatchingFunctionHandler(Callable&& handler) { +#if GRPC_ALLOW_EXCEPTIONS + try { + return handler(); + } catch (...) { + return grpc::Status(grpc::StatusCode::UNKNOWN, + "Unexpected error in RPC handling"); + } +#else // GRPC_ALLOW_EXCEPTIONS + return handler(); +#endif // GRPC_ALLOW_EXCEPTIONS +} + +/// A helper function with reduced templating to do the common work needed to +/// actually send the server response. Uses non-const parameter for Status since +/// this should only ever be called from the end of the RunHandler method. + +template <class ResponseType> +void UnaryRunHandlerHelper(const MethodHandler::HandlerParameter& param, + ResponseType* rsp, grpc::Status& status) { + GPR_ASSERT(!param.server_context->sent_initial_metadata_); + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpServerSendStatus> + ops; + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + if (status.ok()) { + status = ops.SendMessagePtr(rsp); + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); +} + +/// A helper function with reduced templating to do deserializing. + +template <class RequestType> +void* UnaryDeserializeHelper(grpc_byte_buffer* req, grpc::Status* status, + RequestType* request) { + grpc::ByteBuffer buf; + buf.set_buffer(req); + *status = grpc::SerializationTraits<RequestType>::Deserialize( + &buf, static_cast<RequestType*>(request)); + buf.Release(); + if (status->ok()) { + return request; + } + request->~RequestType(); + return nullptr; +} + +/// A wrapper class of an application provided rpc method handler. +template <class ServiceType, class RequestType, class ResponseType, + class BaseRequestType = RequestType, + class BaseResponseType = ResponseType> +class RpcMethodHandler : public grpc::internal::MethodHandler { + public: + RpcMethodHandler( + std::function<grpc::Status(ServiceType*, grpc::ServerContext*, + const RequestType*, ResponseType*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + ResponseType rsp; + grpc::Status status = param.status; + if (status.ok()) { + status = CatchingFunctionHandler([this, ¶m, &rsp] { + return func_(service_, + static_cast<grpc::ServerContext*>(param.server_context), + static_cast<RequestType*>(param.request), &rsp); + }); + static_cast<RequestType*>(param.request)->~RequestType(); + } + UnaryRunHandlerHelper(param, static_cast<BaseResponseType*>(&rsp), status); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + grpc::Status* status, void** /*handler_data*/) final { + auto* request = + new (grpc_call_arena_alloc(call, sizeof(RequestType))) RequestType; + return UnaryDeserializeHelper(req, status, + static_cast<BaseRequestType*>(request)); + } + + private: + /// Application provided rpc handler function. + std::function<grpc::Status(ServiceType*, grpc::ServerContext*, + const RequestType*, ResponseType*)> + func_; + // The class the above handler function lives in. + ServiceType* service_; +}; + +/// A wrapper class of an application provided client streaming handler. +template <class ServiceType, class RequestType, class ResponseType> +class ClientStreamingHandler : public grpc::internal::MethodHandler { + public: + ClientStreamingHandler( + std::function<grpc::Status(ServiceType*, grpc::ServerContext*, + ServerReader<RequestType>*, ResponseType*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + ServerReader<RequestType> reader( + param.call, static_cast<grpc::ServerContext*>(param.server_context)); + ResponseType rsp; + grpc::Status status = + CatchingFunctionHandler([this, ¶m, &reader, &rsp] { + return func_(service_, + static_cast<grpc::ServerContext*>(param.server_context), + &reader, &rsp); + }); + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + } + if (status.ok()) { + status = ops.SendMessagePtr(&rsp); + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); + } + + private: + std::function<grpc::Status(ServiceType*, grpc::ServerContext*, + ServerReader<RequestType>*, ResponseType*)> + func_; + ServiceType* service_; +}; + +/// A wrapper class of an application provided server streaming handler. +template <class ServiceType, class RequestType, class ResponseType> +class ServerStreamingHandler : public grpc::internal::MethodHandler { + public: + ServerStreamingHandler(std::function<grpc::Status( + ServiceType*, grpc::ServerContext*, + const RequestType*, ServerWriter<ResponseType>*)> + func, + ServiceType* service) + : func_(func), service_(service) {} + + void RunHandler(const HandlerParameter& param) final { + grpc::Status status = param.status; + if (status.ok()) { + ServerWriter<ResponseType> writer( + param.call, static_cast<grpc::ServerContext*>(param.server_context)); + status = CatchingFunctionHandler([this, ¶m, &writer] { + return func_(service_, + static_cast<grpc::ServerContext*>(param.server_context), + static_cast<RequestType*>(param.request), &writer); + }); + static_cast<RequestType*>(param.request)->~RequestType(); + } + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + if (param.server_context->has_pending_ops_) { + param.call->cq()->Pluck(¶m.server_context->pending_ops_); + } + param.call->cq()->Pluck(&ops); + } + + void* Deserialize(grpc_call* call, grpc_byte_buffer* req, + grpc::Status* status, void** /*handler_data*/) final { + grpc::ByteBuffer buf; + buf.set_buffer(req); + auto* request = + new (grpc_call_arena_alloc(call, sizeof(RequestType))) RequestType(); + *status = + grpc::SerializationTraits<RequestType>::Deserialize(&buf, request); + buf.Release(); + if (status->ok()) { + return request; + } + request->~RequestType(); + return nullptr; + } + + private: + std::function<grpc::Status(ServiceType*, grpc::ServerContext*, + const RequestType*, ServerWriter<ResponseType>*)> + func_; + ServiceType* service_; +}; + +/// A wrapper class of an application provided bidi-streaming handler. +/// This also applies to server-streamed implementation of a unary method +/// with the additional requirement that such methods must have done a +/// write for status to be ok +/// Since this is used by more than 1 class, the service is not passed in. +/// Instead, it is expected to be an implicitly-captured argument of func +/// (through bind or something along those lines) +template <class Streamer, bool WriteNeeded> +class TemplatedBidiStreamingHandler : public grpc::internal::MethodHandler { + public: + explicit TemplatedBidiStreamingHandler( + std::function<grpc::Status(grpc::ServerContext*, Streamer*)> func) + : func_(func), write_needed_(WriteNeeded) {} + + void RunHandler(const HandlerParameter& param) final { + Streamer stream(param.call, + static_cast<grpc::ServerContext*>(param.server_context)); + grpc::Status status = CatchingFunctionHandler([this, ¶m, &stream] { + return func_(static_cast<grpc::ServerContext*>(param.server_context), + &stream); + }); + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpServerSendStatus> + ops; + if (!param.server_context->sent_initial_metadata_) { + ops.SendInitialMetadata(¶m.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); + if (param.server_context->compression_level_set()) { + ops.set_compression_level(param.server_context->compression_level()); + } + if (write_needed_ && status.ok()) { + // If we needed a write but never did one, we need to mark the + // status as a fail + status = grpc::Status(grpc::StatusCode::INTERNAL, + "Service did not provide response message"); + } + } + ops.ServerSendStatus(¶m.server_context->trailing_metadata_, status); + param.call->PerformOps(&ops); + if (param.server_context->has_pending_ops_) { + param.call->cq()->Pluck(¶m.server_context->pending_ops_); + } + param.call->cq()->Pluck(&ops); + } + + private: + std::function<grpc::Status(grpc::ServerContext*, Streamer*)> func_; + const bool write_needed_; +}; + +template <class ServiceType, class RequestType, class ResponseType> +class BidiStreamingHandler + : public TemplatedBidiStreamingHandler< + ServerReaderWriter<ResponseType, RequestType>, false> { + public: + BidiStreamingHandler(std::function<grpc::Status( + ServiceType*, grpc::ServerContext*, + ServerReaderWriter<ResponseType, RequestType>*)> + func, + ServiceType* service) + // TODO(vjpai): When gRPC supports C++14, move-capture func in the below + : TemplatedBidiStreamingHandler< + ServerReaderWriter<ResponseType, RequestType>, false>( + [func, service]( + grpc::ServerContext* ctx, + ServerReaderWriter<ResponseType, RequestType>* streamer) { + return func(service, ctx, streamer); + }) {} +}; + +template <class RequestType, class ResponseType> +class StreamedUnaryHandler + : public TemplatedBidiStreamingHandler< + ServerUnaryStreamer<RequestType, ResponseType>, true> { + public: + explicit StreamedUnaryHandler( + std::function< + grpc::Status(grpc::ServerContext*, + ServerUnaryStreamer<RequestType, ResponseType>*)> + func) + : TemplatedBidiStreamingHandler< + ServerUnaryStreamer<RequestType, ResponseType>, true>( + std::move(func)) {} +}; + +template <class RequestType, class ResponseType> +class SplitServerStreamingHandler + : public TemplatedBidiStreamingHandler< + ServerSplitStreamer<RequestType, ResponseType>, false> { + public: + explicit SplitServerStreamingHandler( + std::function< + grpc::Status(grpc::ServerContext*, + ServerSplitStreamer<RequestType, ResponseType>*)> + func) + : TemplatedBidiStreamingHandler< + ServerSplitStreamer<RequestType, ResponseType>, false>( + std::move(func)) {} +}; + +/// General method handler class for errors that prevent real method use +/// e.g., handle unknown method by returning UNIMPLEMENTED error. +template <grpc::StatusCode code> +class ErrorMethodHandler : public grpc::internal::MethodHandler { + public: + explicit ErrorMethodHandler(const TString& message) : message_(message) {} + + template <class T> + static void FillOps(grpc::ServerContextBase* context, + const TString& message, T* ops) { + grpc::Status status(code, message); + if (!context->sent_initial_metadata_) { + ops->SendInitialMetadata(&context->initial_metadata_, + context->initial_metadata_flags()); + if (context->compression_level_set()) { + ops->set_compression_level(context->compression_level()); + } + context->sent_initial_metadata_ = true; + } + ops->ServerSendStatus(&context->trailing_metadata_, status); + } + + void RunHandler(const HandlerParameter& param) final { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpServerSendStatus> + ops; + FillOps(param.server_context, message_, &ops); + param.call->PerformOps(&ops); + param.call->cq()->Pluck(&ops); + } + + void* Deserialize(grpc_call* /*call*/, grpc_byte_buffer* req, + grpc::Status* /*status*/, void** /*handler_data*/) final { + // We have to destroy any request payload + if (req != nullptr) { + grpc_byte_buffer_destroy(req); + } + return nullptr; + } + + private: + const TString message_; +}; + +typedef ErrorMethodHandler<grpc::StatusCode::UNIMPLEMENTED> + UnknownMethodHandler; +typedef ErrorMethodHandler<grpc::StatusCode::RESOURCE_EXHAUSTED> + ResourceExhaustedHandler; + +} // namespace internal +} // namespace grpc #endif // GRPCPP_SUPPORT_METHOD_HANDLER_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_buffer_reader.h b/contrib/libs/grpc/include/grpcpp/support/proto_buffer_reader.h index 38df095ca0..e89818a3d6 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_buffer_reader.h +++ b/contrib/libs/grpc/include/grpcpp/support/proto_buffer_reader.h @@ -1,44 +1,41 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H -#define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H - -// IWYU pragma: private, include <grpcpp/support/proto_buffer_reader.h> +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SUPPORT_PROTO_BUFFER_READER_H +#define GRPCPP_SUPPORT_PROTO_BUFFER_READER_H #include <type_traits> -#include <grpc/impl/codegen/byte_buffer_reader.h> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpc/impl/codegen/slice.h> +#include <grpc/byte_buffer.h> +#include <grpc/byte_buffer_reader.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/slice.h> +#include <grpc/support/log.h> #include <grpcpp/impl/codegen/config_protobuf.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/serialization_traits.h> -#include <grpcpp/impl/codegen/status.h> +#include <grpcpp/impl/serialization_traits.h> #include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/status.h> /// This header provides an object that reads bytes directly from a /// grpc::ByteBuffer, via the ZeroCopyInputStream interface namespace grpc { -extern CoreCodegenInterface* g_core_codegen_interface; - /// This is a specialization of the protobuf class ZeroCopyInputStream /// The principle is to get one chunk of data at a time from the proto layer, /// with options to backup (re-see some bytes) or skip (forward past some bytes) @@ -54,8 +51,7 @@ class ProtoBufferReader : public grpc::protobuf::io::ZeroCopyInputStream { /// Implemented through a grpc_byte_buffer_reader which iterates /// over the slices that make up a byte buffer if (!buffer->Valid() || - !g_core_codegen_interface->grpc_byte_buffer_reader_init( - &reader_, buffer->c_buffer())) { + !grpc_byte_buffer_reader_init(&reader_, buffer->c_buffer())) { status_ = Status(StatusCode::INTERNAL, "Couldn't initialize byte buffer reader"); } @@ -63,7 +59,7 @@ class ProtoBufferReader : public grpc::protobuf::io::ZeroCopyInputStream { ~ProtoBufferReader() override { if (status_.ok()) { - g_core_codegen_interface->grpc_byte_buffer_reader_destroy(&reader_); + grpc_byte_buffer_reader_destroy(&reader_); } } @@ -77,19 +73,18 @@ class ProtoBufferReader : public grpc::protobuf::io::ZeroCopyInputStream { if (backup_count_ > 0) { *data = GRPC_SLICE_START_PTR(*slice_) + GRPC_SLICE_LENGTH(*slice_) - backup_count_; - GPR_CODEGEN_ASSERT(backup_count_ <= INT_MAX); + GPR_ASSERT(backup_count_ <= INT_MAX); *size = static_cast<int>(backup_count_); backup_count_ = 0; return true; } /// Otherwise get the next slice from the byte buffer reader - if (!g_core_codegen_interface->grpc_byte_buffer_reader_peek(&reader_, - &slice_)) { + if (!grpc_byte_buffer_reader_peek(&reader_, &slice_)) { return false; } *data = GRPC_SLICE_START_PTR(*slice_); // On win x64, int is only 32bit - GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(*slice_) <= INT_MAX); + GPR_ASSERT(GRPC_SLICE_LENGTH(*slice_) <= INT_MAX); byte_count_ += * size = static_cast<int>(GRPC_SLICE_LENGTH(*slice_)); return true; } @@ -101,7 +96,7 @@ class ProtoBufferReader : public grpc::protobuf::io::ZeroCopyInputStream { /// bytes that have already been returned by the last call of Next. /// So do the backup and have that ready for a later Next. void BackUp(int count) override { - GPR_CODEGEN_ASSERT(count <= static_cast<int>(GRPC_SLICE_LENGTH(*slice_))); + GPR_ASSERT(count <= static_cast<int>(GRPC_SLICE_LENGTH(*slice_))); backup_count_ = count; } @@ -148,4 +143,4 @@ class ProtoBufferReader : public grpc::protobuf::io::ZeroCopyInputStream { } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_READER_H +#endif // GRPCPP_SUPPORT_PROTO_BUFFER_READER_H diff --git a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_buffer_writer.h b/contrib/libs/grpc/include/grpcpp/support/proto_buffer_writer.h index 34730bd205..eb7b2c40b9 100644 --- a/contrib/libs/grpc/include/grpcpp/impl/codegen/proto_buffer_writer.h +++ b/contrib/libs/grpc/include/grpcpp/support/proto_buffer_writer.h @@ -1,43 +1,41 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#ifndef GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H -#define GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H - -// IWYU pragma: private, include <grpcpp/support/proto_buffer_writer.h> +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H +#define GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H #include <type_traits> -#include <grpc/impl/codegen/grpc_types.h> -#include <grpc/impl/codegen/slice.h> +#include <grpc/byte_buffer.h> +#include <grpc/impl/grpc_types.h> +#include <grpc/slice.h> +#include <grpc/slice_buffer.h> +#include <grpc/support/log.h> #include <grpcpp/impl/codegen/config_protobuf.h> -#include <grpcpp/impl/codegen/core_codegen_interface.h> -#include <grpcpp/impl/codegen/serialization_traits.h> -#include <grpcpp/impl/codegen/status.h> +#include <grpcpp/impl/serialization_traits.h> #include <grpcpp/support/byte_buffer.h> +#include <grpcpp/support/status.h> /// This header provides an object that writes bytes directly into a /// grpc::ByteBuffer, via the ZeroCopyOutputStream interface namespace grpc { -extern CoreCodegenInterface* g_core_codegen_interface; - // Forward declaration for testing use only namespace internal { class ProtoBufferWriterPeer; @@ -64,17 +62,16 @@ class ProtoBufferWriter : public grpc::protobuf::io::ZeroCopyOutputStream { total_size_(total_size), byte_count_(0), have_backup_(false) { - GPR_CODEGEN_ASSERT(!byte_buffer->Valid()); + GPR_ASSERT(!byte_buffer->Valid()); /// Create an empty raw byte buffer and look at its underlying slice buffer - grpc_byte_buffer* bp = - g_core_codegen_interface->grpc_raw_byte_buffer_create(nullptr, 0); + grpc_byte_buffer* bp = grpc_raw_byte_buffer_create(nullptr, 0); byte_buffer->set_buffer(bp); slice_buffer_ = &bp->data.raw.slice_buffer; } ~ProtoBufferWriter() override { if (have_backup_) { - g_core_codegen_interface->grpc_slice_unref(backup_slice_); + grpc_slice_unref(backup_slice_); } } @@ -82,7 +79,7 @@ class ProtoBufferWriter : public grpc::protobuf::io::ZeroCopyOutputStream { /// safe for the caller to write from data[0, size - 1]. bool Next(void** data, int* size) override { // Protobuf should not ask for more memory than total_size_. - GPR_CODEGEN_ASSERT(byte_count_ < total_size_); + GPR_ASSERT(byte_count_ < total_size_); // 1. Use the remaining backup slice if we have one // 2. Otherwise allocate a slice, up to the remaining length needed // or our maximum allocation size @@ -101,21 +98,19 @@ class ProtoBufferWriter : public grpc::protobuf::io::ZeroCopyOutputStream { // But make sure the allocated slice is not inlined. size_t allocate_length = remain > static_cast<size_t>(block_size_) ? block_size_ : remain; - slice_ = g_core_codegen_interface->grpc_slice_malloc( - allocate_length > GRPC_SLICE_INLINED_SIZE - ? allocate_length - : GRPC_SLICE_INLINED_SIZE + 1); + slice_ = grpc_slice_malloc(allocate_length > GRPC_SLICE_INLINED_SIZE + ? allocate_length + : GRPC_SLICE_INLINED_SIZE + 1); } *data = GRPC_SLICE_START_PTR(slice_); // On win x64, int is only 32bit - GPR_CODEGEN_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX); + GPR_ASSERT(GRPC_SLICE_LENGTH(slice_) <= INT_MAX); byte_count_ += * size = static_cast<int>(GRPC_SLICE_LENGTH(slice_)); // Using grpc_slice_buffer_add could modify slice_ and merge it with the // previous slice. Therefore, use grpc_slice_buffer_add_indexed method to // ensure the slice gets added at a separate index. It can then be kept // around and popped later in the BackUp function. - g_core_codegen_interface->grpc_slice_buffer_add_indexed(slice_buffer_, - slice_); + grpc_slice_buffer_add_indexed(slice_buffer_, slice_); return true; } @@ -134,14 +129,14 @@ class ProtoBufferWriter : public grpc::protobuf::io::ZeroCopyOutputStream { /// 2. Split it into the needed (if any) and unneeded part /// 3. Add the needed part back to the slice buffer /// 4. Mark that we still have the remaining part (for later use/unref) - GPR_CODEGEN_ASSERT(count <= static_cast<int>(GRPC_SLICE_LENGTH(slice_))); - g_core_codegen_interface->grpc_slice_buffer_pop(slice_buffer_); + GPR_ASSERT(count <= static_cast<int>(GRPC_SLICE_LENGTH(slice_))); + grpc_slice_buffer_pop(slice_buffer_); if (static_cast<size_t>(count) == GRPC_SLICE_LENGTH(slice_)) { backup_slice_ = slice_; } else { - backup_slice_ = g_core_codegen_interface->grpc_slice_split_tail( - &slice_, GRPC_SLICE_LENGTH(slice_) - count); - g_core_codegen_interface->grpc_slice_buffer_add(slice_buffer_, slice_); + backup_slice_ = + grpc_slice_split_tail(&slice_, GRPC_SLICE_LENGTH(slice_) - count); + grpc_slice_buffer_add(slice_buffer_, slice_); } // It's dangerous to keep an inlined grpc_slice as the backup slice, since // on a following Next() call, a reference will be returned to this slice @@ -178,4 +173,4 @@ class ProtoBufferWriter : public grpc::protobuf::io::ZeroCopyOutputStream { } // namespace grpc -#endif // GRPCPP_IMPL_CODEGEN_PROTO_BUFFER_WRITER_H +#endif // GRPCPP_SUPPORT_PROTO_BUFFER_WRITER_H diff --git a/contrib/libs/grpc/include/grpcpp/support/server_callback.h b/contrib/libs/grpc/include/grpcpp/support/server_callback.h index 1ffdce53d9..5cd4df28a3 100644 --- a/contrib/libs/grpc/include/grpcpp/support/server_callback.h +++ b/contrib/libs/grpc/include/grpcpp/support/server_callback.h @@ -1,24 +1,797 @@ -/* - * - * Copyright 2018 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2018 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_SERVER_CALLBACK_H #define GRPCPP_SUPPORT_SERVER_CALLBACK_H -#include <grpcpp/impl/codegen/server_callback.h> // IWYU pragma: export +#include <atomic> +#include <functional> +#include <type_traits> + +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/call_op_set.h> +#include <grpcpp/impl/sync.h> +#include <grpcpp/support/callback_common.h> +#include <grpcpp/support/config.h> +#include <grpcpp/support/message_allocator.h> +#include <grpcpp/support/status.h> + +namespace grpc { + +// Declare base class of all reactors as internal +namespace internal { + +// Forward declarations +template <class Request, class Response> +class CallbackUnaryHandler; +template <class Request, class Response> +class CallbackClientStreamingHandler; +template <class Request, class Response> +class CallbackServerStreamingHandler; +template <class Request, class Response> +class CallbackBidiHandler; + +class ServerReactor { + public: + virtual ~ServerReactor() = default; + virtual void OnDone() = 0; + virtual void OnCancel() = 0; + + // The following is not API. It is for internal use only and specifies whether + // all reactions of this Reactor can be run without an extra executor + // scheduling. This should only be used for internally-defined reactors with + // trivial reactions. + virtual bool InternalInlineable() { return false; } + + private: + template <class Request, class Response> + friend class CallbackUnaryHandler; + template <class Request, class Response> + friend class CallbackClientStreamingHandler; + template <class Request, class Response> + friend class CallbackServerStreamingHandler; + template <class Request, class Response> + friend class CallbackBidiHandler; +}; + +/// The base class of ServerCallbackUnary etc. +class ServerCallbackCall { + public: + virtual ~ServerCallbackCall() {} + + // This object is responsible for tracking when it is safe to call OnDone and + // OnCancel. OnDone should not be called until the method handler is complete, + // Finish has been called, the ServerContext CompletionOp (which tracks + // cancellation or successful completion) has completed, and all outstanding + // Read/Write actions have seen their reactions. OnCancel should not be called + // until after the method handler is done and the RPC has completed with a + // cancellation. This is tracked by counting how many of these conditions have + // been met and calling OnCancel when none remain unmet. + + // Public versions of MaybeDone: one where we don't know the reactor in + // advance (used for the ServerContext CompletionOp), and one for where we + // know the inlineability of the OnDone reaction. You should set the inline + // flag to true if either the Reactor is InternalInlineable() or if this + // callback is already being forced to run dispatched to an executor + // (typically because it contains additional work than just the MaybeDone). + + void MaybeDone() { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(reactor()->InternalInlineable()); + } + } + + void MaybeDone(bool inline_ondone) { + if (GPR_UNLIKELY(Unref() == 1)) { + ScheduleOnDone(inline_ondone); + } + } + + // Fast version called with known reactor passed in, used from derived + // classes, typically in non-cancel case + void MaybeCallOnCancel(ServerReactor* reactor) { + if (GPR_UNLIKELY(UnblockCancellation())) { + CallOnCancel(reactor); + } + } + + // Slower version called from object that doesn't know the reactor a priori + // (such as the ServerContext CompletionOp which is formed before the + // reactor). This is used in cancel cases only, so it's ok to be slower and + // invoke a virtual function. + void MaybeCallOnCancel() { + if (GPR_UNLIKELY(UnblockCancellation())) { + CallOnCancel(reactor()); + } + } + + protected: + /// Increases the reference count + void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); } + + private: + virtual ServerReactor* reactor() = 0; + + // CallOnDone performs the work required at completion of the RPC: invoking + // the OnDone function and doing all necessary cleanup. This function is only + // ever invoked on a fully-Unref'fed ServerCallbackCall. + virtual void CallOnDone() = 0; + + // If the OnDone reaction is inlineable, execute it inline. Otherwise send it + // to an executor. + void ScheduleOnDone(bool inline_ondone); + + // If the OnCancel reaction is inlineable, execute it inline. Otherwise send + // it to an executor. + void CallOnCancel(ServerReactor* reactor); + + // Implement the cancellation constraint counter. Return true if OnCancel + // should be called, false otherwise. + bool UnblockCancellation() { + return on_cancel_conditions_remaining_.fetch_sub( + 1, std::memory_order_acq_rel) == 1; + } + + /// Decreases the reference count and returns the previous value + int Unref() { + return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel); + } + + std::atomic_int on_cancel_conditions_remaining_{2}; + std::atomic_int callbacks_outstanding_{ + 3}; // reserve for start, Finish, and CompletionOp +}; + +template <class Request, class Response> +class DefaultMessageHolder : public MessageHolder<Request, Response> { + public: + DefaultMessageHolder() { + this->set_request(&request_obj_); + this->set_response(&response_obj_); + } + void Release() override { + // the object is allocated in the call arena. + this->~DefaultMessageHolder<Request, Response>(); + } + + private: + Request request_obj_; + Response response_obj_; +}; + +} // namespace internal + +// Forward declarations +class ServerUnaryReactor; +template <class Request> +class ServerReadReactor; +template <class Response> +class ServerWriteReactor; +template <class Request, class Response> +class ServerBidiReactor; + +// NOTE: The actual call/stream object classes are provided as API only to +// support mocking. There are no implementations of these class interfaces in +// the API. +class ServerCallbackUnary : public internal::ServerCallbackCall { + public: + ~ServerCallbackUnary() override {} + virtual void Finish(grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + + protected: + // Use a template rather than explicitly specifying ServerUnaryReactor to + // delay binding and avoid a circular forward declaration issue + template <class Reactor> + void BindReactor(Reactor* reactor) { + reactor->InternalBindCall(this); + } +}; + +template <class Request> +class ServerCallbackReader : public internal::ServerCallbackCall { + public: + ~ServerCallbackReader() override {} + virtual void Finish(grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Read(Request* msg) = 0; + + protected: + void BindReactor(ServerReadReactor<Request>* reactor) { + reactor->InternalBindReader(this); + } +}; + +template <class Response> +class ServerCallbackWriter : public internal::ServerCallbackCall { + public: + ~ServerCallbackWriter() override {} + + virtual void Finish(grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Write(const Response* msg, grpc::WriteOptions options) = 0; + virtual void WriteAndFinish(const Response* msg, grpc::WriteOptions options, + grpc::Status s) = 0; + + protected: + void BindReactor(ServerWriteReactor<Response>* reactor) { + reactor->InternalBindWriter(this); + } +}; + +template <class Request, class Response> +class ServerCallbackReaderWriter : public internal::ServerCallbackCall { + public: + ~ServerCallbackReaderWriter() override {} + + virtual void Finish(grpc::Status s) = 0; + virtual void SendInitialMetadata() = 0; + virtual void Read(Request* msg) = 0; + virtual void Write(const Response* msg, grpc::WriteOptions options) = 0; + virtual void WriteAndFinish(const Response* msg, grpc::WriteOptions options, + grpc::Status s) = 0; + + protected: + void BindReactor(ServerBidiReactor<Request, Response>* reactor) { + reactor->InternalBindStream(this); + } +}; + +// The following classes are the reactor interfaces that are to be implemented +// by the user, returned as the output parameter of the method handler for a +// callback method. Note that none of the classes are pure; all reactions have a +// default empty reaction so that the user class only needs to override those +// reactions that it cares about. The reaction methods will be invoked by the +// library in response to the completion of various operations. Reactions must +// not include blocking operations (such as blocking I/O, starting synchronous +// RPCs, or waiting on condition variables). Reactions may be invoked +// concurrently, except that OnDone is called after all others (assuming proper +// API usage). The reactor may not be deleted until OnDone is called. + +/// \a ServerBidiReactor is the interface for a bidirectional streaming RPC. +template <class Request, class Response> +class ServerBidiReactor : public internal::ServerReactor { + public: + // NOTE: Initializing stream_ as a constructor initializer rather than a + // default initializer because gcc-4.x requires a copy constructor for + // default initializing a templated member, which isn't ok for atomic. + // TODO(vjpai): Switch to default constructor and default initializer when + // gcc-4.x is no longer supported + ServerBidiReactor() : stream_(nullptr) {} + ~ServerBidiReactor() override = default; + + /// Send any initial metadata stored in the RPC context. If not invoked, + /// any initial metadata will be passed along with the first Write or the + /// Finish (if there are no writes). + void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { + ServerCallbackReaderWriter<Request, Response>* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + stream->SendInitialMetadata(); + } + + /// Initiate a read operation. + /// + /// \param[out] req Where to eventually store the read message. Valid when + /// the library calls OnReadDone + void StartRead(Request* req) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { + ServerCallbackReaderWriter<Request, Response>* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.read_wanted = req; + return; + } + } + stream->Read(req); + } + + /// Initiate a write operation. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + void StartWrite(const Response* resp) { + StartWrite(resp, grpc::WriteOptions()); + } + + /// Initiate a write operation with specified options. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWrite(const Response* resp, grpc::WriteOptions options) + Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { + ServerCallbackReaderWriter<Request, Response>* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.write_wanted = resp; + backlog_.write_options_wanted = options; + return; + } + } + stream->Write(resp, options); + } + + /// Initiate a write operation with specified options and final RPC Status, + /// which also causes any trailing metadata for this RPC to be sent out. + /// StartWriteAndFinish is like merging StartWriteLast and Finish into a + /// single step. A key difference, though, is that this operation doesn't have + /// an OnWriteDone reaction - it is considered complete only when OnDone is + /// available. An RPC can either have StartWriteAndFinish or Finish, but not + /// both. + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnDone is called. + /// \param[in] options The WriteOptions to use for writing this message + /// \param[in] s The status outcome of this RPC + void StartWriteAndFinish(const Response* resp, grpc::WriteOptions options, + grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { + ServerCallbackReaderWriter<Request, Response>* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.write_and_finish_wanted = true; + backlog_.write_wanted = resp; + backlog_.write_options_wanted = options; + backlog_.status_wanted = std::move(s); + return; + } + } + stream->WriteAndFinish(resp, options, std::move(s)); + } + + /// Inform system of a planned write operation with specified options, but + /// allow the library to schedule the actual write coalesced with the writing + /// of trailing metadata (which takes place on a Finish call). + /// + /// \param[in] resp The message to be written. The library does not take + /// ownership but the caller must ensure that the message is + /// not deleted or modified until OnWriteDone is called. + /// \param[in] options The WriteOptions to use for writing this message + void StartWriteLast(const Response* resp, grpc::WriteOptions options) { + StartWrite(resp, options.set_last_message()); + } + + /// Indicate that the stream is to be finished and the trailing metadata and + /// RPC status are to be sent. Every RPC MUST be finished using either Finish + /// or StartWriteAndFinish (but not both), even if the RPC is already + /// cancelled. + /// + /// \param[in] s The status outcome of this RPC + void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(stream_mu_) { + ServerCallbackReaderWriter<Request, Response>* stream = + stream_.load(std::memory_order_acquire); + if (stream == nullptr) { + grpc::internal::MutexLock l(&stream_mu_); + stream = stream_.load(std::memory_order_relaxed); + if (stream == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + stream->Finish(std::move(s)); + } + + /// Notifies the application that an explicit StartSendInitialMetadata + /// operation completed. Not used when the sending of initial metadata + /// piggybacks onto the first write. + /// + /// \param[in] ok Was it successful? If false, no further write-side operation + /// will succeed. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + + /// Notifies the application that a StartRead operation completed. + /// + /// \param[in] ok Was it successful? If false, no further read-side operation + /// will succeed. + virtual void OnReadDone(bool /*ok*/) {} + + /// Notifies the application that a StartWrite (or StartWriteLast) operation + /// completed. + /// + /// \param[in] ok Was it successful? If false, no further write-side operation + /// will succeed. + virtual void OnWriteDone(bool /*ok*/) {} + + /// Notifies the application that all operations associated with this RPC + /// have completed. This is an override (from the internal base class) but + /// still abstract, so derived classes MUST override it to be instantiated. + void OnDone() override = 0; + + /// Notifies the application that this RPC has been cancelled. This is an + /// override (from the internal base class) but not final, so derived classes + /// should override it if they want to take action. + void OnCancel() override {} + + private: + friend class ServerCallbackReaderWriter<Request, Response>; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindStream( + ServerCallbackReaderWriter<Request, Response>* stream) { + grpc::internal::MutexLock l(&stream_mu_); + + if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { + stream->SendInitialMetadata(); + } + if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) { + stream->Read(backlog_.read_wanted); + } + if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) { + stream->WriteAndFinish(backlog_.write_wanted, + std::move(backlog_.write_options_wanted), + std::move(backlog_.status_wanted)); + } else { + if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) { + stream->Write(backlog_.write_wanted, + std::move(backlog_.write_options_wanted)); + } + if (GPR_UNLIKELY(backlog_.finish_wanted)) { + stream->Finish(std::move(backlog_.status_wanted)); + } + } + // Set stream_ last so that other functions can use it lock-free + stream_.store(stream, std::memory_order_release); + } + + grpc::internal::Mutex stream_mu_; + // TODO(vjpai): Make stream_or_backlog_ into a std::variant or y_absl::variant + // once C++17 or ABSL is supported since stream and backlog are + // mutually exclusive in this class. Do likewise with the + // remaining reactor classes and their backlogs as well. + std::atomic<ServerCallbackReaderWriter<Request, Response>*> stream_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool write_and_finish_wanted = false; + bool finish_wanted = false; + Request* read_wanted = nullptr; + const Response* write_wanted = nullptr; + grpc::WriteOptions write_options_wanted; + grpc::Status status_wanted; + }; + PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(stream_mu_); +}; + +/// \a ServerReadReactor is the interface for a client-streaming RPC. +template <class Request> +class ServerReadReactor : public internal::ServerReactor { + public: + ServerReadReactor() : reader_(nullptr) {} + ~ServerReadReactor() override = default; + + /// The following operation initiations are exactly like ServerBidiReactor. + void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { + ServerCallbackReader<Request>* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + reader->SendInitialMetadata(); + } + void StartRead(Request* req) Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { + ServerCallbackReader<Request>* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.read_wanted = req; + return; + } + } + reader->Read(req); + } + void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { + ServerCallbackReader<Request>* reader = + reader_.load(std::memory_order_acquire); + if (reader == nullptr) { + grpc::internal::MutexLock l(&reader_mu_); + reader = reader_.load(std::memory_order_relaxed); + if (reader == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + reader->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + virtual void OnReadDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackReader<Request>; + + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindReader(ServerCallbackReader<Request>* reader) + Y_ABSL_LOCKS_EXCLUDED(reader_mu_) { + grpc::internal::MutexLock l(&reader_mu_); + + if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { + reader->SendInitialMetadata(); + } + if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) { + reader->Read(backlog_.read_wanted); + } + if (GPR_UNLIKELY(backlog_.finish_wanted)) { + reader->Finish(std::move(backlog_.status_wanted)); + } + // Set reader_ last so that other functions can use it lock-free + reader_.store(reader, std::memory_order_release); + } + + grpc::internal::Mutex reader_mu_; + std::atomic<ServerCallbackReader<Request>*> reader_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool finish_wanted = false; + Request* read_wanted = nullptr; + grpc::Status status_wanted; + }; + PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(reader_mu_); +}; + +/// \a ServerWriteReactor is the interface for a server-streaming RPC. +template <class Response> +class ServerWriteReactor : public internal::ServerReactor { + public: + ServerWriteReactor() : writer_(nullptr) {} + ~ServerWriteReactor() override = default; + + /// The following operation initiations are exactly like ServerBidiReactor. + void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { + ServerCallbackWriter<Response>* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + writer->SendInitialMetadata(); + } + void StartWrite(const Response* resp) { + StartWrite(resp, grpc::WriteOptions()); + } + void StartWrite(const Response* resp, grpc::WriteOptions options) + Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { + ServerCallbackWriter<Response>* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.write_wanted = resp; + backlog_.write_options_wanted = options; + return; + } + } + writer->Write(resp, options); + } + void StartWriteAndFinish(const Response* resp, grpc::WriteOptions options, + grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { + ServerCallbackWriter<Response>* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.write_and_finish_wanted = true; + backlog_.write_wanted = resp; + backlog_.write_options_wanted = options; + backlog_.status_wanted = std::move(s); + return; + } + } + writer->WriteAndFinish(resp, options, std::move(s)); + } + void StartWriteLast(const Response* resp, grpc::WriteOptions options) { + StartWrite(resp, options.set_last_message()); + } + void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { + ServerCallbackWriter<Response>* writer = + writer_.load(std::memory_order_acquire); + if (writer == nullptr) { + grpc::internal::MutexLock l(&writer_mu_); + writer = writer_.load(std::memory_order_relaxed); + if (writer == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + writer->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + virtual void OnWriteDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackWriter<Response>; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindWriter(ServerCallbackWriter<Response>* writer) + Y_ABSL_LOCKS_EXCLUDED(writer_mu_) { + grpc::internal::MutexLock l(&writer_mu_); + + if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { + writer->SendInitialMetadata(); + } + if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) { + writer->WriteAndFinish(backlog_.write_wanted, + std::move(backlog_.write_options_wanted), + std::move(backlog_.status_wanted)); + } else { + if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) { + writer->Write(backlog_.write_wanted, + std::move(backlog_.write_options_wanted)); + } + if (GPR_UNLIKELY(backlog_.finish_wanted)) { + writer->Finish(std::move(backlog_.status_wanted)); + } + } + // Set writer_ last so that other functions can use it lock-free + writer_.store(writer, std::memory_order_release); + } + + grpc::internal::Mutex writer_mu_; + std::atomic<ServerCallbackWriter<Response>*> writer_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool write_and_finish_wanted = false; + bool finish_wanted = false; + const Response* write_wanted = nullptr; + grpc::WriteOptions write_options_wanted; + grpc::Status status_wanted; + }; + PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(writer_mu_); +}; + +class ServerUnaryReactor : public internal::ServerReactor { + public: + ServerUnaryReactor() : call_(nullptr) {} + ~ServerUnaryReactor() override = default; + + /// StartSendInitialMetadata is exactly like ServerBidiReactor. + void StartSendInitialMetadata() Y_ABSL_LOCKS_EXCLUDED(call_mu_) { + ServerCallbackUnary* call = call_.load(std::memory_order_acquire); + if (call == nullptr) { + grpc::internal::MutexLock l(&call_mu_); + call = call_.load(std::memory_order_relaxed); + if (call == nullptr) { + backlog_.send_initial_metadata_wanted = true; + return; + } + } + call->SendInitialMetadata(); + } + /// Finish is similar to ServerBidiReactor except for one detail. + /// If the status is non-OK, any message will not be sent. Instead, + /// the client will only receive the status and any trailing metadata. + void Finish(grpc::Status s) Y_ABSL_LOCKS_EXCLUDED(call_mu_) { + ServerCallbackUnary* call = call_.load(std::memory_order_acquire); + if (call == nullptr) { + grpc::internal::MutexLock l(&call_mu_); + call = call_.load(std::memory_order_relaxed); + if (call == nullptr) { + backlog_.finish_wanted = true; + backlog_.status_wanted = std::move(s); + return; + } + } + call->Finish(std::move(s)); + } + + /// The following notifications are exactly like ServerBidiReactor. + virtual void OnSendInitialMetadataDone(bool /*ok*/) {} + void OnDone() override = 0; + void OnCancel() override {} + + private: + friend class ServerCallbackUnary; + // May be overridden by internal implementation details. This is not a public + // customization point. + virtual void InternalBindCall(ServerCallbackUnary* call) + Y_ABSL_LOCKS_EXCLUDED(call_mu_) { + grpc::internal::MutexLock l(&call_mu_); + + if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) { + call->SendInitialMetadata(); + } + if (GPR_UNLIKELY(backlog_.finish_wanted)) { + call->Finish(std::move(backlog_.status_wanted)); + } + // Set call_ last so that other functions can use it lock-free + call_.store(call, std::memory_order_release); + } + + grpc::internal::Mutex call_mu_; + std::atomic<ServerCallbackUnary*> call_{nullptr}; + struct PreBindBacklog { + bool send_initial_metadata_wanted = false; + bool finish_wanted = false; + grpc::Status status_wanted; + }; + PreBindBacklog backlog_ Y_ABSL_GUARDED_BY(call_mu_); +}; + +namespace internal { + +template <class Base> +class FinishOnlyReactor : public Base { + public: + explicit FinishOnlyReactor(grpc::Status s) { this->Finish(std::move(s)); } + void OnDone() override { this->~FinishOnlyReactor(); } +}; + +using UnimplementedUnaryReactor = FinishOnlyReactor<ServerUnaryReactor>; +template <class Request> +using UnimplementedReadReactor = FinishOnlyReactor<ServerReadReactor<Request>>; +template <class Response> +using UnimplementedWriteReactor = + FinishOnlyReactor<ServerWriteReactor<Response>>; +template <class Request, class Response> +using UnimplementedBidiReactor = + FinishOnlyReactor<ServerBidiReactor<Request, Response>>; + +} // namespace internal + +// TODO(vjpai): Remove namespace experimental when last known users are migrated +// off. +namespace experimental { + +template <class Request, class Response> +using ServerBidiReactor = ::grpc::ServerBidiReactor<Request, Response>; + +} // namespace experimental + +} // namespace grpc #endif // GRPCPP_SUPPORT_SERVER_CALLBACK_H diff --git a/contrib/libs/grpc/include/grpcpp/support/server_interceptor.h b/contrib/libs/grpc/include/grpcpp/support/server_interceptor.h index ad9c7a1869..ecb4e34259 100644 --- a/contrib/libs/grpc/include/grpcpp/support/server_interceptor.h +++ b/contrib/libs/grpc/include/grpcpp/support/server_interceptor.h @@ -1,24 +1,140 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H #define GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H -#include <grpcpp/impl/codegen/server_interceptor.h> // IWYU pragma: export +#include <atomic> +#include <vector> + +#include <grpc/support/log.h> +#include <grpcpp/impl/rpc_method.h> +#include <grpcpp/support/interceptor.h> +#include <grpcpp/support/string_ref.h> + +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<Type>(internal::RpcMethod::NORMAL_RPC), + "violated expectation about Type enum"); + static_assert(Type::CLIENT_STREAMING == + static_cast<Type>(internal::RpcMethod::CLIENT_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::SERVER_STREAMING == + static_cast<Type>(internal::RpcMethod::SERVER_STREAMING), + "violated expectation about Type enum"); + static_assert(Type::BIDI_STREAMING == + static_cast<Type>(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>(type)) {} + + // Runs interceptor at pos \a pos. + void RunInterceptor( + experimental::InterceptorBatchMethods* interceptor_methods, size_t pos) { + GPR_ASSERT(pos < interceptors_.size()); + interceptors_[pos]->Intercept(interceptor_methods); + } + + void RegisterInterceptors( + const std::vector< + std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>& + creators) { + for (const auto& creator : creators) { + auto* interceptor = creator->CreateServerInterceptor(this); + if (interceptor != nullptr) { + interceptors_.push_back( + std::unique_ptr<experimental::Interceptor>(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<intptr_t> ref_{1}; + std::vector<std::unique_ptr<experimental::Interceptor>> interceptors_; + + friend class internal::InterceptorBatchMethodsImpl; + friend class grpc::ServerContextBase; +}; + +} // namespace experimental +} // namespace grpc #endif // GRPCPP_SUPPORT_SERVER_INTERCEPTOR_H diff --git a/contrib/libs/grpc/include/grpcpp/support/slice.h b/contrib/libs/grpc/include/grpcpp/support/slice.h index 2434983f59..bafdaba9cd 100644 --- a/contrib/libs/grpc/include/grpcpp/support/slice.h +++ b/contrib/libs/grpc/include/grpcpp/support/slice.h @@ -1,26 +1,142 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_SLICE_H #define GRPCPP_SUPPORT_SLICE_H #include <grpc/slice.h> -#include <grpcpp/impl/codegen/slice.h> // IWYU pragma: export #include <grpcpp/support/config.h> +#include <grpcpp/support/string_ref.h> + +namespace grpc { + +/// A wrapper around \a grpc_slice. +/// +/// A slice represents a contiguous reference counted array of bytes. +/// It is cheap to take references to a slice, and it is cheap to create a +/// slice pointing to a subset of another slice. +class Slice final { + public: + /// Construct an empty slice. + Slice() : slice_(grpc_empty_slice()) {} + /// Destructor - drops one reference. + ~Slice() { grpc_slice_unref(slice_); } + + enum AddRef { ADD_REF }; + /// Construct a slice from \a slice, adding a reference. + Slice(grpc_slice slice, AddRef) : slice_(grpc_slice_ref(slice)) {} + + enum StealRef { STEAL_REF }; + /// Construct a slice from \a slice, stealing a reference. + Slice(grpc_slice slice, StealRef) : slice_(slice) {} + + /// Allocate a slice of specified size + explicit Slice(size_t len) : slice_(grpc_slice_malloc(len)) {} + + /// Construct a slice from a copied buffer + Slice(const void* buf, size_t len) + : slice_(grpc_slice_from_copied_buffer(reinterpret_cast<const char*>(buf), + len)) {} + + /// Construct a slice from a copied string + // NOLINTNEXTLINE(google-explicit-constructor) + Slice(const TString& str) + : slice_(grpc_slice_from_copied_buffer(str.c_str(), str.length())) {} + + enum StaticSlice { STATIC_SLICE }; + + /// Construct a slice from a static buffer + Slice(const void* buf, size_t len, StaticSlice) + : slice_(grpc_slice_from_static_buffer(reinterpret_cast<const char*>(buf), + len)) {} + + /// Copy constructor, adds a reference. + Slice(const Slice& other) : slice_(grpc_slice_ref(other.slice_)) {} + + /// Move constructor, steals a reference. + Slice(Slice&& other) noexcept : slice_(other.slice_) { + other.slice_ = grpc_empty_slice(); + } + + /// Assignment, reference count is unchanged. + Slice& operator=(Slice other) { + std::swap(slice_, other.slice_); + return *this; + } + + /// Create a slice pointing at some data. Calls malloc to allocate a refcount + /// for the object, and arranges that destroy will be called with the + /// user data pointer passed in at destruction. Can be the same as buf or + /// different (e.g., if data is part of a larger structure that must be + /// destroyed when the data is no longer needed) + Slice(void* buf, size_t len, void (*destroy)(void*), void* user_data) + : slice_(grpc_slice_new_with_user_data(buf, len, destroy, user_data)) {} + + /// Specialization of above for common case where buf == user_data + Slice(void* buf, size_t len, void (*destroy)(void*)) + : Slice(buf, len, destroy, buf) {} + + /// Similar to the above but has a destroy that also takes slice length + Slice(void* buf, size_t len, void (*destroy)(void*, size_t)) + : slice_(grpc_slice_new_with_len(buf, len, destroy)) {} + + /// Byte size. + size_t size() const { return GRPC_SLICE_LENGTH(slice_); } + + /// Raw pointer to the beginning (first element) of the slice. + const uint8_t* begin() const { return GRPC_SLICE_START_PTR(slice_); } + + /// Raw pointer to the end (one byte \em past the last element) of the slice. + const uint8_t* end() const { return GRPC_SLICE_END_PTR(slice_); } + + /// Returns a substring of the `slice` as another slice. + Slice sub(size_t begin, size_t end) const { + return Slice(grpc_slice_sub(slice_, begin, end), STEAL_REF); + } + + /// Raw C slice. Caller needs to call grpc_slice_unref when done. + grpc_slice c_slice() const { return grpc_slice_ref(slice_); } + + private: + friend class ByteBuffer; + + grpc_slice slice_; +}; + +inline grpc::string_ref StringRefFromSlice(const grpc_slice* slice) { + return grpc::string_ref( + reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(*slice)), + GRPC_SLICE_LENGTH(*slice)); +} + +inline TString StringFromCopiedSlice(grpc_slice slice) { + return TString(reinterpret_cast<char*>(GRPC_SLICE_START_PTR(slice)), + GRPC_SLICE_LENGTH(slice)); +} + +inline grpc_slice SliceReferencingString(const TString& str) { + return grpc_slice_from_static_buffer(str.data(), str.length()); +} + +inline grpc_slice SliceFromCopiedString(const TString& str) { + return grpc_slice_from_copied_buffer(str.data(), str.length()); +} + +} // namespace grpc #endif // GRPCPP_SUPPORT_SLICE_H diff --git a/contrib/libs/grpc/include/grpcpp/support/status.h b/contrib/libs/grpc/include/grpcpp/support/status.h index e46b46d16f..0930e642b0 100644 --- a/contrib/libs/grpc/include/grpcpp/support/status.h +++ b/contrib/libs/grpc/include/grpcpp/support/status.h @@ -1,24 +1,24 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_STATUS_H #define GRPCPP_SUPPORT_STATUS_H -#include <grpcpp/impl/codegen/status.h> // IWYU pragma: export +#include <grpcpp/impl/status.h> // IWYU pragma: export #endif // GRPCPP_SUPPORT_STATUS_H diff --git a/contrib/libs/grpc/include/grpcpp/support/status_code_enum.h b/contrib/libs/grpc/include/grpcpp/support/status_code_enum.h new file mode 100644 index 0000000000..7110071478 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/support/status_code_enum.h @@ -0,0 +1,145 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SUPPORT_STATUS_CODE_ENUM_H +#define GRPCPP_SUPPORT_STATUS_CODE_ENUM_H + +// IWYU pragma: private, include <grpcpp/support/status.h> + +namespace grpc { + +enum StatusCode { + /// Not an error; returned on success. + OK = 0, + + /// The operation was cancelled (typically by the caller). + CANCELLED = 1, + + /// Unknown error. An example of where this error may be returned is if a + /// Status value received from another address space belongs to an error-space + /// that is not known in this address space. Also errors raised by APIs that + /// do not return enough error information may be converted to this error. + UNKNOWN = 2, + + /// Client specified an invalid argument. Note that this differs from + /// FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are + /// problematic regardless of the state of the system (e.g., a malformed file + /// name). + INVALID_ARGUMENT = 3, + + /// Deadline expired before operation could complete. For operations that + /// change the state of the system, this error may be returned even if the + /// operation has completed successfully. For example, a successful response + /// from a server could have been delayed long enough for the deadline to + /// expire. + DEADLINE_EXCEEDED = 4, + + /// Some requested entity (e.g., file or directory) was not found. + NOT_FOUND = 5, + + /// Some entity that we attempted to create (e.g., file or directory) already + /// exists. + ALREADY_EXISTS = 6, + + /// The caller does not have permission to execute the specified operation. + /// PERMISSION_DENIED must not be used for rejections caused by exhausting + /// some resource (use RESOURCE_EXHAUSTED instead for those errors). + /// PERMISSION_DENIED must not be used if the caller can not be identified + /// (use UNAUTHENTICATED instead for those errors). + PERMISSION_DENIED = 7, + + /// The request does not have valid authentication credentials for the + /// operation. + UNAUTHENTICATED = 16, + + /// Some resource has been exhausted, perhaps a per-user quota, or perhaps the + /// entire file system is out of space. + RESOURCE_EXHAUSTED = 8, + + /// Operation was rejected because the system is not in a state required for + /// the operation's execution. For example, directory to be deleted may be + /// non-empty, an rmdir operation is applied to a non-directory, etc. + /// + /// A litmus test that may help a service implementor in deciding + /// between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE: + /// (a) Use UNAVAILABLE if the client can retry just the failing call. + /// (b) Use ABORTED if the client should retry at a higher-level + /// (e.g., restarting a read-modify-write sequence). + /// (c) Use FAILED_PRECONDITION if the client should not retry until + /// the system state has been explicitly fixed. E.g., if an "rmdir" + /// fails because the directory is non-empty, FAILED_PRECONDITION + /// should be returned since the client should not retry unless + /// they have first fixed up the directory by deleting files from it. + /// (d) Use FAILED_PRECONDITION if the client performs conditional + /// REST Get/Update/Delete on a resource and the resource on the + /// server does not match the condition. E.g., conflicting + /// read-modify-write on the same resource. + FAILED_PRECONDITION = 9, + + /// The operation was aborted, typically due to a concurrency issue like + /// sequencer check failures, transaction aborts, etc. + /// + /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, + /// and UNAVAILABLE. + ABORTED = 10, + + /// Operation was attempted past the valid range. E.g., seeking or reading + /// past end of file. + /// + /// Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed + /// if the system state changes. For example, a 32-bit file system will + /// generate INVALID_ARGUMENT if asked to read at an offset that is not in the + /// range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from + /// an offset past the current file size. + /// + /// There is a fair bit of overlap between FAILED_PRECONDITION and + /// OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error) + /// when it applies so that callers who are iterating through a space can + /// easily look for an OUT_OF_RANGE error to detect when they are done. + OUT_OF_RANGE = 11, + + /// Operation is not implemented or not supported/enabled in this service. + UNIMPLEMENTED = 12, + + /// Internal errors. Means some invariants expected by underlying System has + /// been broken. If you see one of these errors, Something is very broken. + INTERNAL = 13, + + /// The service is currently unavailable. This is a most likely a transient + /// condition and may be corrected by retrying with a backoff. Note that it is + /// not always safe to retry non-idempotent operations. + /// + /// \warning Although data MIGHT not have been transmitted when this + /// status occurs, there is NOT A GUARANTEE that the server has not seen + /// anything. So in general it is unsafe to retry on this status code + /// if the call is non-idempotent. + /// + /// See litmus test above for deciding between FAILED_PRECONDITION, ABORTED, + /// and UNAVAILABLE. + UNAVAILABLE = 14, + + /// Unrecoverable data loss or corruption. + DATA_LOSS = 15, + + /// Force users to include a default branch: + DO_NOT_USE = -1 +}; + +} // namespace grpc + +#endif // GRPCPP_SUPPORT_STATUS_CODE_ENUM_H diff --git a/contrib/libs/grpc/include/grpcpp/support/string_ref.h b/contrib/libs/grpc/include/grpcpp/support/string_ref.h index 6cf82bedf6..9ecff4a6b3 100644 --- a/contrib/libs/grpc/include/grpcpp/support/string_ref.h +++ b/contrib/libs/grpc/include/grpcpp/support/string_ref.h @@ -1,24 +1,152 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_STRING_REF_H #define GRPCPP_SUPPORT_STRING_REF_H -#include <grpcpp/impl/codegen/string_ref.h> // IWYU pragma: export +#include <string.h> + +#include <algorithm> +#include <iosfwd> +#include <iostream> +#include <iterator> + +#include <grpcpp/support/config.h> + +#include <util/stream/output.h> + +namespace grpc { + +/// This class is a non owning reference to a string. +/// +/// It should be a strict subset of the upcoming std::string_ref. +/// +/// \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3442.html +/// +/// The constexpr is dropped or replaced with const for legacy compiler +/// compatibility. +class string_ref { + public: + /// types + typedef const char* const_iterator; + typedef std::reverse_iterator<const_iterator> const_reverse_iterator; + + /// constants + const static size_t npos; + + /// construct/copy. + string_ref() : data_(nullptr), length_(0) {} + string_ref(const string_ref& other) + : data_(other.data_), length_(other.length_) {} + // NOLINTNEXTLINE(bugprone-unhandled-self-assignment) + string_ref& operator=(const string_ref& rhs) { + data_ = rhs.data_; + length_ = rhs.length_; + return *this; + } + + // NOLINTNEXTLINE(google-explicit-constructor) + string_ref(const char* s) : data_(s), length_(strlen(s)) {} + string_ref(const char* s, size_t l) : data_(s), length_(l) {} + // NOLINTNEXTLINE(google-explicit-constructor) + string_ref(const TString& s) : data_(s.data()), length_(s.length()) {} + + /// iterators + const_iterator begin() const { return data_; } + const_iterator end() const { return data_ + length_; } + const_iterator cbegin() const { return data_; } + const_iterator cend() const { return data_ + length_; } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator crend() const { + return const_reverse_iterator(begin()); + } + + /// capacity + size_t size() const { return length_; } + size_t length() const { return length_; } + size_t max_size() const { return length_; } + bool empty() const { return length_ == 0; } + + /// element access + const char* data() const { return data_; } + + /// string operations + int compare(string_ref x) const { + size_t min_size = length_ < x.length_ ? length_ : x.length_; + int r = memcmp(data_, x.data_, min_size); + if (r < 0) return -1; + if (r > 0) return 1; + if (length_ < x.length_) return -1; + if (length_ > x.length_) return 1; + return 0; + } + + bool starts_with(string_ref x) const { + return length_ >= x.length_ && (memcmp(data_, x.data_, x.length_) == 0); + } + + bool ends_with(string_ref x) const { + return length_ >= x.length_ && + (memcmp(data_ + (length_ - x.length_), x.data_, x.length_) == 0); + } + + size_t find(string_ref s) const { + auto it = std::search(cbegin(), cend(), s.cbegin(), s.cend()); + return it == cend() ? npos : std::distance(cbegin(), it); + } + + size_t find(char c) const { + auto it = std::find(cbegin(), cend(), c); + return it == cend() ? npos : std::distance(cbegin(), it); + } + + string_ref substr(size_t pos, size_t n = npos) const { + if (pos > length_) pos = length_; + if (n > (length_ - pos)) n = length_ - pos; + return string_ref(data_ + pos, n); + } + + private: + const char* data_; + size_t length_; +}; + +/// Comparison operators +inline bool operator==(string_ref x, string_ref y) { return x.compare(y) == 0; } +inline bool operator!=(string_ref x, string_ref y) { return x.compare(y) != 0; } +inline bool operator<(string_ref x, string_ref y) { return x.compare(y) < 0; } +inline bool operator<=(string_ref x, string_ref y) { return x.compare(y) <= 0; } +inline bool operator>(string_ref x, string_ref y) { return x.compare(y) > 0; } +inline bool operator>=(string_ref x, string_ref y) { return x.compare(y) >= 0; } + +inline IOutputStream& operator<<(IOutputStream& out, const string_ref& string) { + TString t(string.begin(), string.end()); + return out << t; +} + +} // namespace grpc #endif // GRPCPP_SUPPORT_STRING_REF_H diff --git a/contrib/libs/grpc/include/grpcpp/support/stub_options.h b/contrib/libs/grpc/include/grpcpp/support/stub_options.h new file mode 100644 index 0000000000..4b62f6a9d8 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/support/stub_options.h @@ -0,0 +1,42 @@ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +#ifndef GRPCPP_SUPPORT_STUB_OPTIONS_H +#define GRPCPP_SUPPORT_STUB_OPTIONS_H + +namespace grpc { + +/// Useful interface for generated stubs +class StubOptions { + public: + StubOptions() = default; + explicit StubOptions(const char* suffix_for_stats) + : suffix_for_stats_(suffix_for_stats) {} + + void set_suffix_for_stats(const char* suffix_for_stats) { + suffix_for_stats_ = suffix_for_stats; + } + const char* suffix_for_stats() const { return suffix_for_stats_; } + + private: + const char* suffix_for_stats_ = nullptr; +}; + +} // namespace grpc + +#endif // GRPCPP_SUPPORT_STUB_OPTIONS_H diff --git a/contrib/libs/grpc/include/grpcpp/support/sync_stream.h b/contrib/libs/grpc/include/grpcpp/support/sync_stream.h index 78a348de75..ce583f6ed7 100644 --- a/contrib/libs/grpc/include/grpcpp/support/sync_stream.h +++ b/contrib/libs/grpc/include/grpcpp/support/sync_stream.h @@ -1,24 +1,949 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_SYNC_STREAM_H #define GRPCPP_SUPPORT_SYNC_STREAM_H -#include <grpcpp/impl/codegen/sync_stream.h> // IWYU pragma: export +#include <grpc/support/log.h> +#include <grpcpp/client_context.h> +#include <grpcpp/completion_queue.h> +#include <grpcpp/impl/call.h> +#include <grpcpp/impl/codegen/channel_interface.h> +#include <grpcpp/impl/service_type.h> +#include <grpcpp/server_context.h> +#include <grpcpp/support/status.h> + +namespace grpc { + +namespace internal { +/// Common interface for all synchronous client side streaming. +class ClientStreamingInterface { + public: + virtual ~ClientStreamingInterface() {} + + /// Block waiting until the stream finishes and a final status of the call is + /// available. + /// + /// It is appropriate to call this method exactly once when both: + /// * the calling code (client-side) has no more message to send + /// (this can be declared implicitly by calling this method, or + /// explicitly through an earlier call to <i>WritesDone</i> method of the + /// class in use, e.g. \a ClientWriterInterface::WritesDone or + /// \a ClientReaderWriterInterface::WritesDone). + /// * there are no more messages to be received from the server (which can + /// be known implicitly, or explicitly from an earlier call to \a + /// ReaderInterface::Read that returned "false"). + /// + /// This function will return either: + /// - when all incoming messages have been read and the server has + /// returned status. + /// - when the server has returned a non-OK status. + /// - OR when the call failed for some reason and the library generated a + /// status. + /// + /// Return values: + /// - \a Status contains the status code, message and details for the call + /// - the \a ClientContext associated with this call is updated with + /// possible trailing metadata sent from the server. + virtual grpc::Status Finish() = 0; +}; + +/// Common interface for all synchronous server side streaming. +class ServerStreamingInterface { + public: + virtual ~ServerStreamingInterface() {} + + /// Block to send initial metadata to client. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a Finish method. + /// + /// The initial metadata that will be sent to the client will be + /// taken from the \a ServerContext associated with the call. + virtual void SendInitialMetadata() = 0; +}; + +/// An interface that yields a sequence of messages of type \a R. +template <class R> +class ReaderInterface { + public: + virtual ~ReaderInterface() {} + + /// Get an upper bound on the next message size available for reading on this + /// stream. + virtual bool NextMessageSize(uint32_t* sz) = 0; + + /// Block to read a message and parse to \a msg. Returns \a true on success. + /// This is thread-safe with respect to \a Write or \WritesDone methods on + /// the same stream. It should not be called concurrently with another \a + /// Read on the same stream as the order of delivery will not be defined. + /// + /// \param[out] msg The read message. + /// + /// \return \a false when there will be no more incoming messages, either + /// because the other side has called \a WritesDone() or the stream has failed + /// (or been cancelled). + virtual bool Read(R* msg) = 0; +}; + +/// An interface that can be fed a sequence of messages of type \a W. +template <class W> +class WriterInterface { + public: + virtual ~WriterInterface() {} + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + virtual bool Write(const W& msg, grpc::WriteOptions options) = 0; + + /// Block to write \a msg to the stream with default write options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// + /// \return \a true on success, \a false when the stream has been closed. + inline bool Write(const W& msg) { return Write(msg, grpc::WriteOptions()); } + + /// Write \a msg and coalesce it with the writing of trailing metadata, using + /// WriteOptions \a options. + /// + /// For client, WriteLast is equivalent of performing Write and WritesDone in + /// a single step. \a msg and trailing metadata are coalesced and sent on wire + /// by calling this function. For server, WriteLast buffers the \a msg. + /// The writing of \a msg is held until the service handler returns, + /// where \a msg and trailing metadata are coalesced and sent on wire. + /// Note that WriteLast can only buffer \a msg up to the flow control window + /// size. If \a msg size is larger than the window size, it will be sent on + /// wire without buffering. + /// + /// \param[in] msg The message to be written to the stream. + /// \param[in] options The WriteOptions to be used to write this message. + void WriteLast(const W& msg, grpc::WriteOptions options) { + Write(msg, options.set_last_message()); + } +}; + +} // namespace internal + +/// Client-side interface for streaming reads of message of type \a R. +template <class R> +class ClientReaderInterface : public internal::ClientStreamingInterface, + public internal::ReaderInterface<R> { + public: + /// Block to wait for initial metadata from server. The received metadata + /// can only be accessed after this call returns. Should only be called before + /// the first read. Calling this method is optional, and if it is not called + /// the metadata will be available in ClientContext after the first read. + virtual void WaitForInitialMetadata() = 0; +}; + +namespace internal { +template <class R> +class ClientReaderFactory { + public: + template <class W> + static ClientReader<R>* Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, + const W& request) { + return new ClientReader<R>(channel, method, context, request); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for doing server-streaming RPCs, +/// where the stream of messages coming from the server has messages +/// of type \a R. +template <class R> +class ClientReader final : public ClientReaderInterface<R> { + public: + /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for + /// semantics. + /// + // Side effect: + /// Once complete, the initial metadata read from + /// the server will be accessible through the \a ClientContext used to + /// construct this object. + void WaitForInitialMetadata() override { + GPR_ASSERT(!context_->initial_metadata_received_); + + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); /// status ignored + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_.max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + /// See the \a ReaderInterface.Read method for semantics. + /// Side effect: + /// This also receives initial metadata from the server, if not + /// already received (if initial metadata is received, it can be then + /// accessed through the \a ClientContext associated with this call). + bool Read(R* msg) override { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpRecvMessage<R>> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + /// See the \a ClientStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// The \a ClientContext associated with this call is updated with + /// possible metadata received from the server. + grpc::Status Finish() override { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpClientRecvStatus> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + grpc::Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + friend class internal::ClientReaderFactory<R>; + grpc::ClientContext* context_; + grpc::CompletionQueue cq_; + grpc::internal::Call call_; + + /// Block to create a stream and write the initial metadata and \a request + /// out. Note that \a context will be used to fill in custom initial + /// metadata used to send to the server when starting the call. + template <class W> + ClientReader(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, const W& request) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose> + ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + // TODO(ctiller): don't assert + GPR_ASSERT(ops.SendMessagePtr(&request).ok()); + ops.ClientSendClose(); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } +}; + +/// Client-side interface for streaming writes of message type \a W. +template <class W> +class ClientWriterInterface : public internal::ClientStreamingInterface, + public internal::WriterInterface<W> { + public: + /// Half close writing from the client. (signal that the stream of messages + /// coming from the client is complete). + /// Blocks until currently-pending writes are completed. + /// Thread safe with respect to \a ReaderInterface::Read operations only + /// + /// \return Whether the writes were successful. + virtual bool WritesDone() = 0; +}; + +namespace internal { +template <class W> +class ClientWriterFactory { + public: + template <class R> + static ClientWriter<W>* Create(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, R* response) { + return new ClientWriter<W>(channel, method, context, response); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for doing client-streaming RPCs, +/// where the outgoing message stream coming from the client has messages of +/// type \a W. +template <class W> +class ClientWriter : public ClientWriterInterface<W> { + public: + /// See the \a ClientStreamingInterface.WaitForInitialMetadata method for + /// semantics. + /// + // Side effect: + /// Once complete, the initial metadata read from the server will be + /// accessible through the \a ClientContext used to construct this object. + void WaitForInitialMetadata() { + GPR_ASSERT(!context_->initial_metadata_received_); + + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + /// See the WriterInterface.Write(const W& msg, WriteOptions options) method + /// for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call). + using internal::WriterInterface<W>::Write; + bool Write(const W& msg, grpc::WriteOptions options) override { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose> + ops; + + if (options.is_last_message()) { + options.set_buffer_hint(); + ops.ClientSendClose(); + } + if (context_->initial_metadata_corked_) { + ops.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + context_->set_initial_metadata_corked(false); + } + if (!ops.SendMessagePtr(&msg, options).ok()) { + return false; + } + + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() override { + grpc::internal::CallOpSet<grpc::internal::CallOpClientSendClose> ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + /// See the ClientStreamingInterface.Finish method for semantics. + /// Side effects: + /// - Also receives initial metadata if not already received. + /// - Attempts to fill in the \a response parameter passed + /// to the constructor of this instance with the response + /// message from the server. + grpc::Status Finish() override { + grpc::Status status; + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } + finish_ops_.ClientRecvStatus(context_, &status); + call_.PerformOps(&finish_ops_); + GPR_ASSERT(cq_.Pluck(&finish_ops_)); + return status; + } + + private: + friend class internal::ClientWriterFactory<W>; + + /// Block to create a stream (i.e. send request headers and other initial + /// metadata to the server). Note that \a context will be used to fill + /// in custom initial metadata. \a response will be filled in with the + /// single expected response message from the server upon a successful + /// call to the \a Finish method of this instance. + template <class R> + ClientWriter(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context, R* response) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + finish_ops_.RecvMessage(response); + finish_ops_.AllowNoMessage(); + + if (!context_->initial_metadata_corked_) { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + } + + grpc::ClientContext* context_; + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpGenericRecvMessage, + grpc::internal::CallOpClientRecvStatus> + finish_ops_; + grpc::CompletionQueue cq_; + grpc::internal::Call call_; +}; + +/// Client-side interface for bi-directional streaming with +/// client-to-server stream messages of type \a W and +/// server-to-client stream messages of type \a R. +template <class W, class R> +class ClientReaderWriterInterface : public internal::ClientStreamingInterface, + public internal::WriterInterface<W>, + public internal::ReaderInterface<R> { + public: + /// Block to wait for initial metadata from server. The received metadata + /// can only be accessed after this call returns. Should only be called before + /// the first read. Calling this method is optional, and if it is not called + /// the metadata will be available in ClientContext after the first read. + virtual void WaitForInitialMetadata() = 0; + + /// Half close writing from the client. (signal that the stream of messages + /// coming from the client is complete). + /// Blocks until currently-pending writes are completed. + /// Thread-safe with respect to \a ReaderInterface::Read + /// + /// \return Whether the writes were successful. + virtual bool WritesDone() = 0; +}; + +namespace internal { +template <class W, class R> +class ClientReaderWriterFactory { + public: + static ClientReaderWriter<W, R>* Create( + grpc::ChannelInterface* channel, const grpc::internal::RpcMethod& method, + grpc::ClientContext* context) { + return new ClientReaderWriter<W, R>(channel, method, context); + } +}; +} // namespace internal + +/// Synchronous (blocking) client-side API for bi-directional streaming RPCs, +/// where the outgoing message stream coming from the client has messages of +/// type \a W, and the incoming messages stream coming from the server has +/// messages of type \a R. +template <class W, class R> +class ClientReaderWriter final : public ClientReaderWriterInterface<W, R> { + public: + /// Block waiting to read initial metadata from the server. + /// This call is optional, but if it is used, it cannot be used concurrently + /// with or after the \a Finish method. + /// + /// Once complete, the initial metadata read from the server will be + /// accessible through the \a ClientContext used to construct this object. + void WaitForInitialMetadata() override { + GPR_ASSERT(!context_->initial_metadata_received_); + + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata> ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_.max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + /// See the \a ReaderInterface.Read method for semantics. + /// Side effect: + /// Also receives initial metadata if not already received (updates the \a + /// ClientContext associated with this call in that case). + bool Read(R* msg) override { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpRecvMessage<R>> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + /// See the \a WriterInterface.Write method for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call to fill in values). + using internal::WriterInterface<W>::Write; + bool Write(const W& msg, grpc::WriteOptions options) override { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata, + grpc::internal::CallOpSendMessage, + grpc::internal::CallOpClientSendClose> + ops; + + if (options.is_last_message()) { + options.set_buffer_hint(); + ops.ClientSendClose(); + } + if (context_->initial_metadata_corked_) { + ops.SendInitialMetadata(&context_->send_initial_metadata_, + context_->initial_metadata_flags()); + context_->set_initial_metadata_corked(false); + } + if (!ops.SendMessagePtr(&msg, options).ok()) { + return false; + } + + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() override { + grpc::internal::CallOpSet<grpc::internal::CallOpClientSendClose> ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + /// See the ClientStreamingInterface.Finish method for semantics. + /// + /// Side effect: + /// - the \a ClientContext associated with this call is updated with + /// possible trailing metadata sent from the server. + grpc::Status Finish() override { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvInitialMetadata, + grpc::internal::CallOpClientRecvStatus> + ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + grpc::Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + friend class internal::ClientReaderWriterFactory<W, R>; + + grpc::ClientContext* context_; + grpc::CompletionQueue cq_; + grpc::internal::Call call_; + + /// Block to create a stream and write the initial metadata and \a request + /// out. Note that \a context will be used to fill in custom initial metadata + /// used to send to the server when starting the call. + ClientReaderWriter(grpc::ChannelInterface* channel, + const grpc::internal::RpcMethod& method, + grpc::ClientContext* context) + : context_(context), + cq_(grpc_completion_queue_attributes{ + GRPC_CQ_CURRENT_VERSION, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING, + nullptr}), // Pluckable cq + call_(channel->CreateCall(method, context, &cq_)) { + if (!context_->initial_metadata_corked_) { + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; + ops.SendInitialMetadata(&context->send_initial_metadata_, + context->initial_metadata_flags()); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + } +}; + +/// Server-side interface for streaming reads of message of type \a R. +template <class R> +class ServerReaderInterface : public internal::ServerStreamingInterface, + public internal::ReaderInterface<R> {}; + +/// Synchronous (blocking) server-side API for doing client-streaming RPCs, +/// where the incoming message stream coming from the client has messages of +/// type \a R. +template <class R> +class ServerReader final : public ServerReaderInterface<R> { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool NextMessageSize(uint32_t* sz) override { + int result = call_->max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + bool Read(R* msg) override { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<R>> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + bool ok = call_->cq()->Pluck(&ops) && ops.got_message; + if (!ok) { + ctx_->MaybeMarkCancelledOnRead(); + } + return ok; + } + + private: + grpc::internal::Call* const call_; + ServerContext* const ctx_; + + template <class ServiceType, class RequestType, class ResponseType> + friend class internal::ClientStreamingHandler; + + ServerReader(grpc::internal::Call* call, grpc::ServerContext* ctx) + : call_(call), ctx_(ctx) {} +}; + +/// Server-side interface for streaming writes of message of type \a W. +template <class W> +class ServerWriterInterface : public internal::ServerStreamingInterface, + public internal::WriterInterface<W> {}; + +/// Synchronous (blocking) server-side API for doing for doing a +/// server-streaming RPCs, where the outgoing message stream coming from the +/// server has messages of type \a W. +template <class W> +class ServerWriter final : public ServerWriterInterface<W> { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. + /// Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + /// See the \a WriterInterface.Write method for semantics. + /// + /// Side effect: + /// Also sends initial metadata if not already sent (using the + /// \a ClientContext associated with this call to fill in values). + using internal::WriterInterface<W>::Write; + bool Write(const W& msg, grpc::WriteOptions options) override { + if (options.is_last_message()) { + options.set_buffer_hint(); + } + + if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ctx_->pending_ops_); + // if this is the last message we defer the pluck until AFTER we start + // the trailing md op. This prevents hangs. See + // https://github.com/grpc/grpc/issues/11546 + if (options.is_last_message()) { + ctx_->has_pending_ops_ = true; + return true; + } + ctx_->has_pending_ops_ = false; + return call_->cq()->Pluck(&ctx_->pending_ops_); + } + + private: + grpc::internal::Call* const call_; + grpc::ServerContext* const ctx_; + + template <class ServiceType, class RequestType, class ResponseType> + friend class internal::ServerStreamingHandler; + + ServerWriter(grpc::internal::Call* call, grpc::ServerContext* ctx) + : call_(call), ctx_(ctx) {} +}; + +/// Server-side interface for bi-directional streaming. +template <class W, class R> +class ServerReaderWriterInterface : public internal::ServerStreamingInterface, + public internal::WriterInterface<W>, + public internal::ReaderInterface<R> {}; + +/// Actual implementation of bi-directional streaming +namespace internal { +template <class W, class R> +class ServerReaderWriterBody final { + public: + ServerReaderWriterBody(grpc::internal::Call* call, grpc::ServerContext* ctx) + : call_(call), ctx_(ctx) {} + + void SendInitialMetadata() { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + grpc::internal::CallOpSet<grpc::internal::CallOpSendInitialMetadata> ops; + ops.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ops.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool NextMessageSize(uint32_t* sz) { + int result = call_->max_receive_message_size(); + *sz = (result > 0) ? result : UINT32_MAX; + return true; + } + + bool Read(R* msg) { + grpc::internal::CallOpSet<grpc::internal::CallOpRecvMessage<R>> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + bool ok = call_->cq()->Pluck(&ops) && ops.got_message; + if (!ok) { + ctx_->MaybeMarkCancelledOnRead(); + } + return ok; + } + + bool Write(const W& msg, grpc::WriteOptions options) { + if (options.is_last_message()) { + options.set_buffer_hint(); + } + if (!ctx_->pending_ops_.SendMessagePtr(&msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ctx_->pending_ops_.SendInitialMetadata(&ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); + if (ctx_->compression_level_set()) { + ctx_->pending_ops_.set_compression_level(ctx_->compression_level()); + } + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ctx_->pending_ops_); + // if this is the last message we defer the pluck until AFTER we start + // the trailing md op. This prevents hangs. See + // https://github.com/grpc/grpc/issues/11546 + if (options.is_last_message()) { + ctx_->has_pending_ops_ = true; + return true; + } + ctx_->has_pending_ops_ = false; + return call_->cq()->Pluck(&ctx_->pending_ops_); + } + + private: + grpc::internal::Call* const call_; + grpc::ServerContext* const ctx_; +}; + +} // namespace internal + +/// Synchronous (blocking) server-side API for a bidirectional +/// streaming call, where the incoming message stream coming from the client has +/// messages of type \a R, and the outgoing message streaming coming from +/// the server has messages of type \a W. +template <class W, class R> +class ServerReaderWriter final : public ServerReaderWriterInterface<W, R> { + public: + /// See the \a ServerStreamingInterface.SendInitialMetadata method + /// for semantics. Note that initial metadata will be affected by the + /// \a ServerContext associated with this call. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + bool Read(R* msg) override { return body_.Read(msg); } + + /// See the \a WriterInterface.Write(const W& msg, WriteOptions options) + /// method for semantics. + /// Side effect: + /// Also sends initial metadata if not already sent (using the \a + /// ServerContext associated with this call). + using internal::WriterInterface<W>::Write; + bool Write(const W& msg, grpc::WriteOptions options) override { + return body_.Write(msg, options); + } + + private: + internal::ServerReaderWriterBody<W, R> body_; + + friend class internal::TemplatedBidiStreamingHandler<ServerReaderWriter<W, R>, + false>; + ServerReaderWriter(grpc::internal::Call* call, grpc::ServerContext* ctx) + : body_(call, ctx) {} +}; + +/// A class to represent a flow-controlled unary call. This is something +/// of a hybrid between conventional unary and streaming. This is invoked +/// through a unary call on the client side, but the server responds to it +/// as though it were a single-ping-pong streaming call. The server can use +/// the \a NextMessageSize method to determine an upper-bound on the size of +/// the message. A key difference relative to streaming: ServerUnaryStreamer +/// must have exactly 1 Read and exactly 1 Write, in that order, to function +/// correctly. Otherwise, the RPC is in error. +template <class RequestType, class ResponseType> +class ServerUnaryStreamer final + : public ServerReaderWriterInterface<ResponseType, RequestType> { + public: + /// Block to send initial metadata to client. + /// Implicit input parameter: + /// - the \a ServerContext associated with this call will be used for + /// sending initial metadata. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + /// Get an upper bound on the request message size from the client. + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + /// Read a message of type \a R into \a msg. Completion will be notified by \a + /// tag on the associated completion queue. + /// This is thread-safe with respect to \a Write or \a WritesDone methods. It + /// should not be called concurrently with other streaming APIs + /// on the same stream. It is not meaningful to call it concurrently + /// with another \a ReaderInterface::Read on the same stream since reads on + /// the same stream are delivered in order. + /// + /// \param[out] msg Where to eventually store the read message. + /// \param[in] tag The tag identifying the operation. + bool Read(RequestType* request) override { + if (read_done_) { + return false; + } + read_done_ = true; + return body_.Read(request); + } + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + using internal::WriterInterface<ResponseType>::Write; + bool Write(const ResponseType& response, + grpc::WriteOptions options) override { + if (write_done_ || !read_done_) { + return false; + } + write_done_ = true; + return body_.Write(response, options); + } + + private: + internal::ServerReaderWriterBody<ResponseType, RequestType> body_; + bool read_done_; + bool write_done_; + + friend class internal::TemplatedBidiStreamingHandler< + ServerUnaryStreamer<RequestType, ResponseType>, true>; + ServerUnaryStreamer(grpc::internal::Call* call, grpc::ServerContext* ctx) + : body_(call, ctx), read_done_(false), write_done_(false) {} +}; + +/// A class to represent a flow-controlled server-side streaming call. +/// This is something of a hybrid between server-side and bidi streaming. +/// This is invoked through a server-side streaming call on the client side, +/// but the server responds to it as though it were a bidi streaming call that +/// must first have exactly 1 Read and then any number of Writes. +template <class RequestType, class ResponseType> +class ServerSplitStreamer final + : public ServerReaderWriterInterface<ResponseType, RequestType> { + public: + /// Block to send initial metadata to client. + /// Implicit input parameter: + /// - the \a ServerContext associated with this call will be used for + /// sending initial metadata. + void SendInitialMetadata() override { body_.SendInitialMetadata(); } + + /// Get an upper bound on the request message size from the client. + bool NextMessageSize(uint32_t* sz) override { + return body_.NextMessageSize(sz); + } + + /// Read a message of type \a R into \a msg. Completion will be notified by \a + /// tag on the associated completion queue. + /// This is thread-safe with respect to \a Write or \a WritesDone methods. It + /// should not be called concurrently with other streaming APIs + /// on the same stream. It is not meaningful to call it concurrently + /// with another \a ReaderInterface::Read on the same stream since reads on + /// the same stream are delivered in order. + /// + /// \param[out] msg Where to eventually store the read message. + /// \param[in] tag The tag identifying the operation. + bool Read(RequestType* request) override { + if (read_done_) { + return false; + } + read_done_ = true; + return body_.Read(request); + } + + /// Block to write \a msg to the stream with WriteOptions \a options. + /// This is thread-safe with respect to \a ReaderInterface::Read + /// + /// \param msg The message to be written to the stream. + /// \param options The WriteOptions affecting the write operation. + /// + /// \return \a true on success, \a false when the stream has been closed. + using internal::WriterInterface<ResponseType>::Write; + bool Write(const ResponseType& response, + grpc::WriteOptions options) override { + return read_done_ && body_.Write(response, options); + } + + private: + internal::ServerReaderWriterBody<ResponseType, RequestType> body_; + bool read_done_; + + friend class internal::TemplatedBidiStreamingHandler< + ServerSplitStreamer<RequestType, ResponseType>, false>; + ServerSplitStreamer(grpc::internal::Call* call, grpc::ServerContext* ctx) + : body_(call, ctx), read_done_(false) {} +}; + +} // namespace grpc #endif // GRPCPP_SUPPORT_SYNC_STREAM_H diff --git a/contrib/libs/grpc/include/grpcpp/support/time.h b/contrib/libs/grpc/include/grpcpp/support/time.h index b5e07b68f2..5397eb6ba2 100644 --- a/contrib/libs/grpc/include/grpcpp/support/time.h +++ b/contrib/libs/grpc/include/grpcpp/support/time.h @@ -1,24 +1,89 @@ -/* - * - * Copyright 2015 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_TIME_H #define GRPCPP_SUPPORT_TIME_H -#include <grpcpp/impl/codegen/time.h> // IWYU pragma: export +#include <chrono> + +#include <grpc/impl/grpc_types.h> +#include <grpcpp/support/config.h> + +namespace grpc { + +/// If you are trying to use CompletionQueue::AsyncNext with a time class that +/// isn't either gpr_timespec or std::chrono::system_clock::time_point, you +/// will most likely be looking at this comment as your compiler will have +/// fired an error below. In order to fix this issue, you have two potential +/// solutions: + +/// 1. Use gpr_timespec or std::chrono::system_clock::time_point instead +/// 2. Specialize the TimePoint class with whichever time class that you +/// want to use here. See below for two examples of how to do this. +/// +template <typename T> +class TimePoint { + public: + // If you see the error with methods below, you may need either + // i) using the existing types having a conversion class such as + // gpr_timespec and std::chrono::system_clock::time_point or + // ii) writing a new TimePoint<YourType> to address your case. + TimePoint(const T& /*time*/) = delete; + gpr_timespec raw_time() = delete; +}; + +template <> +class TimePoint<gpr_timespec> { + public: + // NOLINTNEXTLINE(google-explicit-constructor) + TimePoint(const gpr_timespec& time) : time_(time) {} + gpr_timespec raw_time() { return time_; } + + private: + gpr_timespec time_; +}; + +} // namespace grpc + +namespace grpc { + +// from and to should be absolute time. +void Timepoint2Timespec(const std::chrono::system_clock::time_point& from, + gpr_timespec* to); +void TimepointHR2Timespec( + const std::chrono::high_resolution_clock::time_point& from, + gpr_timespec* to); + +std::chrono::system_clock::time_point Timespec2Timepoint(gpr_timespec t); + +template <> +class TimePoint<std::chrono::system_clock::time_point> { + public: + // NOLINTNEXTLINE(google-explicit-constructor) + TimePoint(const std::chrono::system_clock::time_point& time) { + Timepoint2Timespec(time, &time_); + } + gpr_timespec raw_time() const { return time_; } + + private: + gpr_timespec time_; +}; + +} // namespace grpc #endif // GRPCPP_SUPPORT_TIME_H diff --git a/contrib/libs/grpc/include/grpcpp/support/validate_service_config.h b/contrib/libs/grpc/include/grpcpp/support/validate_service_config.h index f1368623b5..12ecf1c9a4 100644 --- a/contrib/libs/grpc/include/grpcpp/support/validate_service_config.h +++ b/contrib/libs/grpc/include/grpcpp/support/validate_service_config.h @@ -1,20 +1,20 @@ -/* - * - * Copyright 2019 gRPC authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ +// +// +// Copyright 2019 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// #ifndef GRPCPP_SUPPORT_VALIDATE_SERVICE_CONFIG_H #define GRPCPP_SUPPORT_VALIDATE_SERVICE_CONFIG_H diff --git a/contrib/libs/grpc/include/grpcpp/version_info.h b/contrib/libs/grpc/include/grpcpp/version_info.h new file mode 100644 index 0000000000..13742e57c7 --- /dev/null +++ b/contrib/libs/grpc/include/grpcpp/version_info.h @@ -0,0 +1,27 @@ +// Copyright 2022 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This file is autogenerated from: +// templates/include/grpcpp/version_info.h.template + +#ifndef GRPCPP_VERSION_INFO_H +#define GRPCPP_VERSION_INFO_H + +#define GRPC_CPP_VERSION_MAJOR 1 +#define GRPC_CPP_VERSION_MINOR 53 +#define GRPC_CPP_VERSION_PATCH 1 +#define GRPC_CPP_VERSION_TAG "" +#define GRPC_CPP_VERSION_STRING "1.53.1" + +#endif // GRPCPP_VERSION_INFO_H |