diff --git a/BUILD b/BUILD index 2ff563e1048..791d2c29c76 100644 --- a/BUILD +++ b/BUILD @@ -251,7 +251,6 @@ GRPCXX_PUBLIC_HDRS = [ "include/grpcpp/security/server_credentials.h", "include/grpcpp/security/tls_credentials_options.h", "include/grpcpp/server.h", - "include/grpcpp/server_impl.h", "include/grpcpp/server_builder.h", "include/grpcpp/server_context.h", "include/grpcpp/server_posix.h", diff --git a/BUILD.gn b/BUILD.gn index 2f193cf4bc9..320027a9057 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -1202,7 +1202,6 @@ config("grpc_config") { "include/grpcpp/server.h", "include/grpcpp/server_builder.h", "include/grpcpp/server_context.h", - "include/grpcpp/server_impl.h", "include/grpcpp/server_posix.h", "include/grpcpp/support/async_stream.h", "include/grpcpp/support/async_stream_impl.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 86ff4857183..25a08ece555 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2857,7 +2857,6 @@ foreach(_hdr include/grpcpp/server.h include/grpcpp/server_builder.h include/grpcpp/server_context.h - include/grpcpp/server_impl.h include/grpcpp/server_posix.h include/grpcpp/support/async_stream.h include/grpcpp/support/async_stream_impl.h @@ -3542,7 +3541,6 @@ foreach(_hdr include/grpcpp/server.h include/grpcpp/server_builder.h include/grpcpp/server_context.h - include/grpcpp/server_impl.h include/grpcpp/server_posix.h include/grpcpp/support/async_stream.h include/grpcpp/support/async_stream_impl.h diff --git a/Makefile b/Makefile index 641762e7f06..bd60397d67e 100644 --- a/Makefile +++ b/Makefile @@ -3190,7 +3190,6 @@ PUBLIC_HEADERS_CXX += \ include/grpcpp/server.h \ include/grpcpp/server_builder.h \ include/grpcpp/server_context.h \ - include/grpcpp/server_impl.h \ include/grpcpp/server_posix.h \ include/grpcpp/support/async_stream.h \ include/grpcpp/support/async_stream_impl.h \ @@ -3720,7 +3719,6 @@ PUBLIC_HEADERS_CXX += \ include/grpcpp/server.h \ include/grpcpp/server_builder.h \ include/grpcpp/server_context.h \ - include/grpcpp/server_impl.h \ include/grpcpp/server_posix.h \ include/grpcpp/support/async_stream.h \ include/grpcpp/support/async_stream_impl.h \ diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 58f4c19e20d..887c25aa814 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -2195,7 +2195,6 @@ libs: - include/grpcpp/server.h - include/grpcpp/server_builder.h - include/grpcpp/server_context.h - - include/grpcpp/server_impl.h - include/grpcpp/server_posix.h - include/grpcpp/support/async_stream.h - include/grpcpp/support/async_stream_impl.h @@ -2572,7 +2571,6 @@ libs: - include/grpcpp/server.h - include/grpcpp/server_builder.h - include/grpcpp/server_context.h - - include/grpcpp/server_impl.h - include/grpcpp/server_posix.h - include/grpcpp/support/async_stream.h - include/grpcpp/support/async_stream_impl.h diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 308c56a7b50..fbfaeed8f6d 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -164,7 +164,6 @@ Pod::Spec.new do |s| 'include/grpcpp/server.h', 'include/grpcpp/server_builder.h', 'include/grpcpp/server_context.h', - 'include/grpcpp/server_impl.h', 'include/grpcpp/server_posix.h', 'include/grpcpp/support/async_stream.h', 'include/grpcpp/support/async_stream_impl.h', diff --git a/include/grpcpp/impl/codegen/async_generic_service.h b/include/grpcpp/impl/codegen/async_generic_service.h index 3cb20fbfc33..8415c2cb458 100644 --- a/include/grpcpp/impl/codegen/async_generic_service.h +++ b/include/grpcpp/impl/codegen/async_generic_service.h @@ -44,7 +44,7 @@ class GenericServerContext final : public ::grpc_impl::ServerContext { const std::string& host() const { return host_; } private: - friend class grpc_impl::Server; + friend class grpc::Server; friend class grpc::ServerInterface; void Clear() { @@ -84,8 +84,8 @@ class AsyncGenericService final { ::grpc::ServerCompletionQueue* notification_cq, void* tag); private: - friend class grpc_impl::Server; - grpc_impl::Server* server_; + friend class grpc::Server; + grpc::Server* server_; }; #ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL @@ -105,7 +105,7 @@ class GenericCallbackServerContext final const std::string& host() const { return host_; } private: - friend class ::grpc_impl::Server; + friend class ::grpc::Server; friend class ::grpc::ServerInterface; void Clear() { @@ -140,7 +140,7 @@ class CallbackGenericService { } private: - friend class ::grpc_impl::Server; + friend class grpc::Server; ::grpc_impl::internal::CallbackBidiHandler* Handler() { @@ -151,7 +151,7 @@ class CallbackGenericService { }); } - grpc_impl::Server* server_{nullptr}; + grpc::Server* server_{nullptr}; }; #ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL diff --git a/include/grpcpp/impl/codegen/async_stream_impl.h b/include/grpcpp/impl/codegen/async_stream_impl.h index 13952d2eb98..fc978dc5a08 100644 --- a/include/grpcpp/impl/codegen/async_stream_impl.h +++ b/include/grpcpp/impl/codegen/async_stream_impl.h @@ -1097,7 +1097,7 @@ class ServerAsyncReaderWriter final } private: - friend class ::grpc_impl::Server; + friend class ::grpc::Server; void BindCall(::grpc::internal::Call* call) override { call_ = *call; } diff --git a/include/grpcpp/impl/codegen/completion_queue.h b/include/grpcpp/impl/codegen/completion_queue.h index f2012460371..1dd9bc9e2e4 100644 --- a/include/grpcpp/impl/codegen/completion_queue.h +++ b/include/grpcpp/impl/codegen/completion_queue.h @@ -46,7 +46,6 @@ struct grpc_completion_queue; namespace grpc_impl { -class Server; template class ClientReader; template @@ -78,6 +77,7 @@ namespace grpc { class Channel; class ChannelInterface; +class Server; class ServerBuilder; class ServerInterface; @@ -252,7 +252,7 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen { // Friends for access to server registration lists that enable checking and // logging on shutdown friend class ::grpc::ServerBuilder; - friend class ::grpc_impl::Server; + friend class ::grpc::Server; // Friend synchronous wrappers so that they can access Pluck(), which is // a semi-private API geared towards the synchronous implementation. @@ -382,14 +382,14 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen { } } - void RegisterServer(const ::grpc_impl::Server* server) { + 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_impl::Server* server) { + void UnregisterServer(const ::grpc::Server* server) { (void)server; #ifndef NDEBUG grpc::internal::MutexLock l(&server_list_mutex_); @@ -412,7 +412,7 @@ class CompletionQueue : private ::grpc::GrpcLibraryCodegen { // NDEBUG, instantiate it in all cases since otherwise the size will be // inconsistent. mutable grpc::internal::Mutex server_list_mutex_; - std::list + std::list server_list_ /* GUARDED_BY(server_list_mutex_) */; }; @@ -443,7 +443,7 @@ class ServerCompletionQueue : public CompletionQueue { grpc_cq_polling_type polling_type_; friend class ::grpc::ServerBuilder; - friend class ::grpc_impl::Server; + friend class ::grpc::Server; }; } // namespace grpc diff --git a/include/grpcpp/impl/codegen/server_context_impl.h b/include/grpcpp/impl/codegen/server_context_impl.h index 75dbafa43a4..4312869925d 100644 --- a/include/grpcpp/impl/codegen/server_context_impl.h +++ b/include/grpcpp/impl/codegen/server_context_impl.h @@ -49,7 +49,6 @@ struct grpc_call; struct census_context; namespace grpc_impl { -class Server; template class ServerAsyncReader; template @@ -96,6 +95,7 @@ namespace grpc { class ClientContext; class CompletionQueue; class GenericServerContext; +class Server; class ServerInterface; #ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL @@ -338,7 +338,7 @@ class ServerContextBase { friend class ::grpc::testing::ServerContextTestSpouse; friend class ::grpc::testing::DefaultReactorTestPeer; friend class ::grpc::ServerInterface; - friend class ::grpc_impl::Server; + friend class ::grpc::Server; template friend class ::grpc_impl::ServerAsyncReader; template @@ -544,7 +544,7 @@ class ServerContext : public ServerContextBase { private: // Constructor for internal use by server only - friend class ::grpc_impl::Server; + friend class ::grpc::Server; ServerContext(gpr_timespec deadline, grpc_metadata_array* arr) : ServerContextBase(deadline, arr) {} diff --git a/include/grpcpp/impl/codegen/service_type.h b/include/grpcpp/impl/codegen/service_type.h index 84a9893a7e8..05b3b1b8c6d 100644 --- a/include/grpcpp/impl/codegen/service_type.h +++ b/include/grpcpp/impl/codegen/service_type.h @@ -268,7 +268,7 @@ class Service { return methods_[idx]->handler(); } - friend class grpc_impl::Server; + friend class Server; friend class ServerInterface; ServerInterface* server_; std::vector> methods_; diff --git a/include/grpcpp/security/server_credentials.h b/include/grpcpp/security/server_credentials.h index 189f491a37d..a86d0e35f07 100644 --- a/include/grpcpp/security/server_credentials.h +++ b/include/grpcpp/security/server_credentials.h @@ -29,12 +29,9 @@ struct grpc_server; -namespace grpc_impl { - -class Server; -} // namespace grpc_impl namespace grpc { +class Server; /// Options to create ServerCredentials with SSL struct SslServerCredentialsOptions { /// \warning Deprecated @@ -72,7 +69,7 @@ class ServerCredentials { const std::shared_ptr& processor) = 0; private: - friend class ::grpc_impl::Server; + friend class Server; /// Tries to bind \a server to the given \a addr (eg, localhost:1234, /// 192.168.1.1:31416, [::1]:27182, etc.) diff --git a/include/grpcpp/server.h b/include/grpcpp/server.h index 3de2aba0b59..7437f85c383 100644 --- a/include/grpcpp/server.h +++ b/include/grpcpp/server.h @@ -1,6 +1,6 @@ /* * - * Copyright 2019 gRPC authors. + * 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. @@ -19,11 +19,359 @@ #ifndef GRPCPP_SERVER_H #define GRPCPP_SERVER_H -#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct grpc_server; + +namespace grpc_impl { +class ServerContext; +class ServerInitializer; +} // namespace grpc_impl namespace grpc { +class AsyncGenericService; + +namespace internal { +class ExternalConnectionAcceptorImpl; +} // namespace internal + +/// Represents a gRPC server. +/// +/// Use a \a grpc::ServerBuilder to create, configure, and start +/// \a Server instances. +class Server : public ServerInterface, private GrpcLibraryCodegen { + public: + ~Server(); + + /// Block until the server shuts down. + /// + /// \warning The server must be either shutting down or some other thread must + /// call \a Shutdown for this function to ever return. + void Wait() override; + + /// Global callbacks are a set of hooks that are called when server + /// events occur. \a SetGlobalCallbacks method is used to register + /// the hooks with gRPC. Note that + /// the \a GlobalCallbacks instance will be shared among all + /// \a Server instances in an application and can be set exactly + /// once per application. + class GlobalCallbacks { + public: + virtual ~GlobalCallbacks() {} + /// Called before server is created. + virtual void UpdateArguments(ChannelArguments* /*args*/) {} + /// Called before application callback for each synchronous server request + virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0; + /// Called after application callback for each synchronous server request + virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0; + /// Called before server is started. + virtual void PreServerStart(Server* /*server*/) {} + /// Called after a server port is added. + virtual void AddPort(Server* /*server*/, const std::string& /*addr*/, + ServerCredentials* /*creds*/, int /*port*/) {} + }; + /// Set the global callback object. Can only be called once per application. + /// Does not take ownership of callbacks, and expects the pointed to object + /// to be alive until all server objects in the process have been destroyed. + /// The same \a GlobalCallbacks object will be used throughout the + /// application and is shared among all \a Server objects. + static void SetGlobalCallbacks(GlobalCallbacks* callbacks); + + /// Returns a \em raw pointer to the underlying \a grpc_server instance. + /// EXPERIMENTAL: for internal/test use only + grpc_server* c_server(); + + /// Returns the health check service. + HealthCheckServiceInterface* GetHealthCheckService() const { + return health_check_service_.get(); + } + + /// Establish a channel for in-process communication + std::shared_ptr InProcessChannel(const ChannelArguments& args); + + /// NOTE: class experimental_type is not part of the public API of this class. + /// TODO(yashykt): Integrate into public API when this is no longer + /// experimental. + class experimental_type { + public: + explicit experimental_type(Server* server) : server_(server) {} + + /// Establish a channel for in-process communication with client + /// interceptors + std::shared_ptr InProcessChannelWithInterceptors( + const ChannelArguments& args, + std::vector< + std::unique_ptr> + interceptor_creators); + + private: + Server* server_; + }; + + /// NOTE: The function experimental() is not stable public API. It is a view + /// to the experimental components of this class. It may be changed or removed + /// at any time. + experimental_type experimental() { return experimental_type(this); } + + protected: + /// Register a service. This call does not take ownership of the service. + /// The service must exist for the lifetime of the Server instance. + bool RegisterService(const std::string* host, Service* service) override; + + /// Try binding the server to the given \a addr endpoint + /// (port, and optionally including IP address to bind to). + /// + /// It can be invoked multiple times. Should be used before + /// starting the server. + /// + /// \param addr The address to try to bind to the server (eg, localhost:1234, + /// 192.168.1.1:31416, [::1]:27182, etc.). + /// \param creds The credentials associated with the server. + /// + /// \return bound port number on success, 0 on failure. + /// + /// \warning It is an error to call this method on an already started server. + int AddListeningPort(const std::string& addr, + ServerCredentials* creds) override; + + /// NOTE: This is *NOT* a public API. The server constructors are supposed to + /// be used by \a ServerBuilder class only. The constructor will be made + /// 'private' very soon. + /// + /// Server constructors. To be used by \a ServerBuilder only. + /// + /// \param args The channel args + /// + /// \param sync_server_cqs The completion queues to use if the server is a + /// synchronous server (or a hybrid server). The server polls for new RPCs on + /// these queues + /// + /// \param min_pollers The minimum number of polling threads per server + /// completion queue (in param sync_server_cqs) to use for listening to + /// incoming requests (used only in case of sync server) + /// + /// \param max_pollers The maximum number of polling threads per server + /// completion queue (in param sync_server_cqs) to use for listening to + /// incoming requests (used only in case of sync server) + /// + /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on + /// server completion queues passed via sync_server_cqs param. + Server(ChannelArguments* args, + std::shared_ptr>> + sync_server_cqs, + int min_pollers, int max_pollers, int sync_cq_timeout_msec, + std::vector> + acceptors, + grpc_resource_quota* server_rq = nullptr, + std::vector< + std::unique_ptr> + interceptor_creators = std::vector>()); + + /// Start the server. + /// + /// \param cqs Completion queues for handling asynchronous services. The + /// caller is required to keep all completion queues live until the server is + /// destroyed. + /// \param num_cqs How many completion queues does \a cqs hold. + void Start(ServerCompletionQueue** cqs, size_t num_cqs) override; + + 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 service) { + health_check_service_ = std::move(service); + } + + /// NOTE: This method is not part of the public API for this class. + bool health_check_service_disabled() const { + return health_check_service_disabled_; + } + + private: + std::vector>* + interceptor_creators() override { + return &interceptor_creators_; + } + + friend class AsyncGenericService; + friend class ServerBuilder; + friend class grpc_impl::ServerInitializer; + + class SyncRequest; + class CallbackRequestBase; + template + class CallbackRequest; + class UnimplementedAsyncRequest; + class UnimplementedAsyncResponse; + + /// SyncRequestThreadManager is an implementation of ThreadManager. This class + /// is responsible for polling for incoming RPCs and calling the RPC handlers. + /// This is only used in case of a Sync server (i.e a server exposing a sync + /// interface) + class SyncRequestThreadManager; + + /// Register a generic service. This call does not take ownership of the + /// service. The service must exist for the lifetime of the Server instance. + void RegisterAsyncGenericService(AsyncGenericService* service) override; + +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + /// Register a callback-based generic service. This call does not take + /// ownership of theservice. The service must exist for the lifetime of the + /// Server instance. + void RegisterCallbackGenericService(CallbackGenericService* service) override; +#else + /// NOTE: class experimental_registration_type is not part of the public API + /// of this class + /// TODO(vjpai): Move these contents to the public API of Server when + /// they are no longer experimental + class experimental_registration_type final + : public experimental_registration_interface { + public: + explicit experimental_registration_type(Server* server) : server_(server) {} + void RegisterCallbackGenericService( + experimental::CallbackGenericService* service) override { + server_->RegisterCallbackGenericService(service); + } + + private: + Server* server_; + }; + + /// TODO(vjpai): Mark this override when experimental type above is deleted + void RegisterCallbackGenericService( + experimental::CallbackGenericService* service); + + /// NOTE: The function experimental_registration() is not stable public API. + /// It is a view to the experimental components of this class. It may be + /// changed or removed at any time. + experimental_registration_interface* experimental_registration() override { + return &experimental_registration_; + } +#endif + + void PerformOpsOnCall(internal::CallOpSetInterface* ops, + internal::Call* call) override; + + void ShutdownInternal(gpr_timespec deadline) override; + + int max_receive_message_size() const override { + return max_receive_message_size_; + } + + CompletionQueue* CallbackCQ() override; + + grpc_impl::ServerInitializer* initializer(); + + // Functions to manage the server shutdown ref count. Things that increase + // the ref count are the running state of the server (take a ref at start and + // drop it at shutdown) and each running callback RPC. + void Ref(); + void UnrefWithPossibleNotify() /* LOCKS_EXCLUDED(mu_) */; + void UnrefAndWaitLocked() /* EXCLUSIVE_LOCKS_REQUIRED(mu_) */; + + std::vector> + acceptors_; + + // A vector of interceptor factory objects. + // This should be destroyed after health_check_service_ and this requirement + // is satisfied by declaring interceptor_creators_ before + // health_check_service_. (C++ mandates that member objects be destroyed in + // the reverse order of initialization.) + std::vector> + interceptor_creators_; + + int max_receive_message_size_; + + /// The following completion queues are ONLY used in case of Sync API + /// i.e. if the server has any services with sync methods. The server uses + /// these completion queues to poll for new RPCs + std::shared_ptr>> + sync_server_cqs_; + + /// List of \a ThreadManager instances (one for each cq in + /// the \a sync_server_cqs) + std::vector> sync_req_mgrs_; + +#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL + // For registering experimental callback generic service; remove when that + // method longer experimental + experimental_registration_type experimental_registration_{this}; +#endif + + // Server status + internal::Mutex mu_; + bool started_; + bool shutdown_; + bool shutdown_notified_; // Was notify called on the shutdown_cv_ + internal::CondVar shutdown_done_cv_; + bool shutdown_done_ = false; + std::atomic_int shutdown_refs_outstanding_{1}; + + internal::CondVar shutdown_cv_; + + std::shared_ptr global_callbacks_; + + std::vector services_; + bool has_async_generic_service_ = false; + bool has_callback_generic_service_ = false; + bool has_callback_methods_ = false; + + // Pointer to the wrapped grpc_server. + grpc_server* server_; + + std::unique_ptr server_initializer_; + + std::unique_ptr health_check_service_; + bool health_check_service_disabled_; + + // When appropriate, use a default callback generic service to handle + // unimplemented methods +#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL + std::unique_ptr unimplemented_service_; +#else + std::unique_ptr unimplemented_service_; +#endif + + // A special handler for resource exhausted in sync case + std::unique_ptr resource_exhausted_handler_; + + // Handler for callback generic service, if any + std::unique_ptr generic_handler_; + + // callback_cq_ references the callbackable completion queue associated + // with this server (if any). It is set on the first call to CallbackCQ(). + // It is _not owned_ by the server; ownership belongs with its internal + // shutdown callback tag (invoked when the CQ is fully shutdown). + CompletionQueue* callback_cq_ /* GUARDED_BY(mu_) */ = nullptr; -typedef ::grpc_impl::Server Server; + // List of CQs passed in by user that must be Shutdown only after Server is + // Shutdown. Even though this is only used with NDEBUG, instantiate it in all + // cases since otherwise the size will be inconsistent. + std::vector cq_list_; +}; } // namespace grpc diff --git a/include/grpcpp/server_impl.h b/include/grpcpp/server_impl.h deleted file mode 100644 index d121fc40993..00000000000 --- a/include/grpcpp/server_impl.h +++ /dev/null @@ -1,387 +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_SERVER_IMPL_H -#define GRPCPP_SERVER_IMPL_H - -#include -#include -#include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -struct grpc_server; - -namespace grpc { -class AsyncGenericService; - -namespace internal { -class ExternalConnectionAcceptorImpl; -} // namespace internal - -} // namespace grpc - -namespace grpc_impl { -class ServerContext; -class ServerInitializer; - -/// Represents a gRPC server. -/// -/// Use a \a grpc::ServerBuilder to create, configure, and start -/// \a Server instances. -class Server : public grpc::ServerInterface, private grpc::GrpcLibraryCodegen { - public: - ~Server(); - - /// Block until the server shuts down. - /// - /// \warning The server must be either shutting down or some other thread must - /// call \a Shutdown for this function to ever return. - void Wait() override; - - /// Global callbacks are a set of hooks that are called when server - /// events occur. \a SetGlobalCallbacks method is used to register - /// the hooks with gRPC. Note that - /// the \a GlobalCallbacks instance will be shared among all - /// \a Server instances in an application and can be set exactly - /// once per application. - class GlobalCallbacks { - public: - virtual ~GlobalCallbacks() {} - /// Called before server is created. - virtual void UpdateArguments(grpc::ChannelArguments* /*args*/) {} - /// Called before application callback for each synchronous server request - virtual void PreSynchronousRequest(grpc_impl::ServerContext* context) = 0; - /// Called after application callback for each synchronous server request - virtual void PostSynchronousRequest(grpc_impl::ServerContext* context) = 0; - /// Called before server is started. - virtual void PreServerStart(Server* /*server*/) {} - /// Called after a server port is added. - virtual void AddPort(Server* /*server*/, const std::string& /*addr*/, - grpc::ServerCredentials* /*creds*/, int /*port*/) {} - }; - /// Set the global callback object. Can only be called once per application. - /// Does not take ownership of callbacks, and expects the pointed to object - /// to be alive until all server objects in the process have been destroyed. - /// The same \a GlobalCallbacks object will be used throughout the - /// application and is shared among all \a Server objects. - static void SetGlobalCallbacks(GlobalCallbacks* callbacks); - - /// Returns a \em raw pointer to the underlying \a grpc_server instance. - /// EXPERIMENTAL: for internal/test use only - grpc_server* c_server(); - - /// Returns the health check service. - grpc::HealthCheckServiceInterface* GetHealthCheckService() const { - return health_check_service_.get(); - } - - /// Establish a channel for in-process communication - std::shared_ptr InProcessChannel( - const grpc::ChannelArguments& args); - - /// NOTE: class experimental_type is not part of the public API of this class. - /// TODO(yashykt): Integrate into public API when this is no longer - /// experimental. - class experimental_type { - public: - explicit experimental_type(Server* server) : server_(server) {} - - /// Establish a channel for in-process communication with client - /// interceptors - std::shared_ptr InProcessChannelWithInterceptors( - const grpc::ChannelArguments& args, - std::vector> - interceptor_creators); - - private: - Server* server_; - }; - - /// NOTE: The function experimental() is not stable public API. It is a view - /// to the experimental components of this class. It may be changed or removed - /// at any time. - experimental_type experimental() { return experimental_type(this); } - - protected: - /// Register a service. This call does not take ownership of the service. - /// The service must exist for the lifetime of the Server instance. - bool RegisterService(const std::string* host, - grpc::Service* service) override; - - /// Try binding the server to the given \a addr endpoint - /// (port, and optionally including IP address to bind to). - /// - /// It can be invoked multiple times. Should be used before - /// starting the server. - /// - /// \param addr The address to try to bind to the server (eg, localhost:1234, - /// 192.168.1.1:31416, [::1]:27182, etc.). - /// \param creds The credentials associated with the server. - /// - /// \return bound port number on success, 0 on failure. - /// - /// \warning It is an error to call this method on an already started server. - int AddListeningPort(const std::string& addr, - grpc::ServerCredentials* creds) override; - - /// NOTE: This is *NOT* a public API. The server constructors are supposed to - /// be used by \a ServerBuilder class only. The constructor will be made - /// 'private' very soon. - /// - /// Server constructors. To be used by \a ServerBuilder only. - /// - /// \param args The channel args - /// - /// \param sync_server_cqs The completion queues to use if the server is a - /// synchronous server (or a hybrid server). The server polls for new RPCs on - /// these queues - /// - /// \param min_pollers The minimum number of polling threads per server - /// completion queue (in param sync_server_cqs) to use for listening to - /// incoming requests (used only in case of sync server) - /// - /// \param max_pollers The maximum number of polling threads per server - /// completion queue (in param sync_server_cqs) to use for listening to - /// incoming requests (used only in case of sync server) - /// - /// \param sync_cq_timeout_msec The timeout to use when calling AsyncNext() on - /// server completion queues passed via sync_server_cqs param. - Server( - grpc::ChannelArguments* args, - std::shared_ptr>> - sync_server_cqs, - int min_pollers, int max_pollers, int sync_cq_timeout_msec, - std::vector< - std::shared_ptr> - acceptors, - grpc_resource_quota* server_rq = nullptr, - std::vector> - interceptor_creators = std::vector>()); - - /// Start the server. - /// - /// \param cqs Completion queues for handling asynchronous services. The - /// caller is required to keep all completion queues live until the server is - /// destroyed. - /// \param num_cqs How many completion queues does \a cqs hold. - void Start(grpc::ServerCompletionQueue** cqs, size_t num_cqs) override; - - 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 service) { - health_check_service_ = std::move(service); - } - - /// NOTE: This method is not part of the public API for this class. - bool health_check_service_disabled() const { - return health_check_service_disabled_; - } - - private: - std::vector< - std::unique_ptr>* - interceptor_creators() override { - return &interceptor_creators_; - } - - friend class grpc::AsyncGenericService; - friend class grpc::ServerBuilder; - friend class grpc_impl::ServerInitializer; - - class SyncRequest; - class CallbackRequestBase; - template - class CallbackRequest; - class UnimplementedAsyncRequest; - class UnimplementedAsyncResponse; - - /// SyncRequestThreadManager is an implementation of ThreadManager. This class - /// is responsible for polling for incoming RPCs and calling the RPC handlers. - /// This is only used in case of a Sync server (i.e a server exposing a sync - /// interface) - class SyncRequestThreadManager; - - /// Register a generic service. This call does not take ownership of the - /// service. The service must exist for the lifetime of the Server instance. - void RegisterAsyncGenericService(grpc::AsyncGenericService* service) override; - -#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL - /// Register a callback-based generic service. This call does not take - /// ownership of theservice. The service must exist for the lifetime of the - /// Server instance. - void RegisterCallbackGenericService( - grpc::CallbackGenericService* service) override; -#else - /// NOTE: class experimental_registration_type is not part of the public API - /// of this class - /// TODO(vjpai): Move these contents to the public API of Server when - /// they are no longer experimental - class experimental_registration_type final - : public experimental_registration_interface { - public: - explicit experimental_registration_type(Server* server) : server_(server) {} - void RegisterCallbackGenericService( - grpc::experimental::CallbackGenericService* service) override { - server_->RegisterCallbackGenericService(service); - } - - private: - Server* server_; - }; - - /// TODO(vjpai): Mark this override when experimental type above is deleted - void RegisterCallbackGenericService( - grpc::experimental::CallbackGenericService* service); - - /// NOTE: The function experimental_registration() is not stable public API. - /// It is a view to the experimental components of this class. It may be - /// changed or removed at any time. - experimental_registration_interface* experimental_registration() override { - return &experimental_registration_; - } -#endif - - void PerformOpsOnCall(grpc::internal::CallOpSetInterface* ops, - grpc::internal::Call* call) override; - - void ShutdownInternal(gpr_timespec deadline) override; - - int max_receive_message_size() const override { - return max_receive_message_size_; - } - - grpc::CompletionQueue* CallbackCQ() override; - - grpc_impl::ServerInitializer* initializer(); - - // Functions to manage the server shutdown ref count. Things that increase - // the ref count are the running state of the server (take a ref at start and - // drop it at shutdown) and each running callback RPC. - void Ref(); - void UnrefWithPossibleNotify() /* LOCKS_EXCLUDED(mu_) */; - void UnrefAndWaitLocked() /* EXCLUSIVE_LOCKS_REQUIRED(mu_) */; - - std::vector> - acceptors_; - - // A vector of interceptor factory objects. - // This should be destroyed after health_check_service_ and this requirement - // is satisfied by declaring interceptor_creators_ before - // health_check_service_. (C++ mandates that member objects be destroyed in - // the reverse order of initialization.) - std::vector< - std::unique_ptr> - interceptor_creators_; - - int max_receive_message_size_; - - /// The following completion queues are ONLY used in case of Sync API - /// i.e. if the server has any services with sync methods. The server uses - /// these completion queues to poll for new RPCs - std::shared_ptr>> - sync_server_cqs_; - - /// List of \a ThreadManager instances (one for each cq in - /// the \a sync_server_cqs) - std::vector> sync_req_mgrs_; - -#ifndef GRPC_CALLBACK_API_NONEXPERIMENTAL - // For registering experimental callback generic service; remove when that - // method longer experimental - experimental_registration_type experimental_registration_{this}; -#endif - - // Server status - grpc::internal::Mutex mu_; - bool started_; - bool shutdown_; - bool shutdown_notified_; // Was notify called on the shutdown_cv_ - grpc::internal::CondVar shutdown_done_cv_; - bool shutdown_done_ = false; - std::atomic_int shutdown_refs_outstanding_{1}; - - grpc::internal::CondVar shutdown_cv_; - - std::shared_ptr global_callbacks_; - - std::vector services_; - bool has_async_generic_service_ = false; - bool has_callback_generic_service_ = false; - bool has_callback_methods_ = false; - - // Pointer to the wrapped grpc_server. - grpc_server* server_; - - std::unique_ptr server_initializer_; - - std::unique_ptr health_check_service_; - bool health_check_service_disabled_; - - // When appropriate, use a default callback generic service to handle - // unimplemented methods -#ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL - std::unique_ptr unimplemented_service_; -#else - std::unique_ptr - unimplemented_service_; -#endif - - // A special handler for resource exhausted in sync case - std::unique_ptr resource_exhausted_handler_; - - // Handler for callback generic service, if any - std::unique_ptr generic_handler_; - - // callback_cq_ references the callbackable completion queue associated - // with this server (if any). It is set on the first call to CallbackCQ(). - // It is _not owned_ by the server; ownership belongs with its internal - // shutdown callback tag (invoked when the CQ is fully shutdown). - grpc::CompletionQueue* callback_cq_ /* GUARDED_BY(mu_) */ = nullptr; - - // List of CQs passed in by user that must be Shutdown only after Server is - // Shutdown. Even though this is only used with NDEBUG, instantiate it in all - // cases since otherwise the size will be inconsistent. - std::vector cq_list_; -}; - -} // namespace grpc_impl - -#endif // GRPCPP_SERVER_IMPL_H diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc index 69988329bd0..9e13f99b4d3 100644 --- a/src/cpp/server/server_cc.cc +++ b/src/cpp/server/server_cc.cc @@ -283,10 +283,6 @@ class ShutdownCallback : public grpc_experimental_completion_queue_functor { }; } // namespace -} // namespace grpc - -namespace grpc_impl { - /// Use private inheritance rather than composition only to establish order /// of construction, since the public base class should be constructed after the /// elements belonging to the private base class are constructed. This is not @@ -1358,4 +1354,4 @@ grpc::CompletionQueue* Server::CallbackCQ() { return callback_cq_; } -} // namespace grpc_impl +} // namespace grpc diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 425da810996..c230de92839 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -1024,7 +1024,6 @@ include/grpcpp/security/tls_credentials_options.h \ include/grpcpp/server.h \ include/grpcpp/server_builder.h \ include/grpcpp/server_context.h \ -include/grpcpp/server_impl.h \ include/grpcpp/server_posix.h \ include/grpcpp/support/async_stream.h \ include/grpcpp/support/async_stream_impl.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 9c3255c7e7d..38c9aad2d71 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1024,7 +1024,6 @@ include/grpcpp/security/tls_credentials_options.h \ include/grpcpp/server.h \ include/grpcpp/server_builder.h \ include/grpcpp/server_context.h \ -include/grpcpp/server_impl.h \ include/grpcpp/server_posix.h \ include/grpcpp/support/async_stream.h \ include/grpcpp/support/async_stream_impl.h \