GRPC C++  1.19.0-dev
server.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #ifndef GRPCPP_SERVER_H
20 #define GRPCPP_SERVER_H
21 
22 #include <condition_variable>
23 #include <list>
24 #include <memory>
25 #include <mutex>
26 #include <vector>
27 
28 #include <grpc/compression.h>
30 #include <grpcpp/impl/call.h>
37 #include <grpcpp/support/config.h>
38 #include <grpcpp/support/status.h>
39 
40 struct grpc_server;
41 
42 namespace grpc {
43 
44 class AsyncGenericService;
45 class HealthCheckServiceInterface;
46 class ServerContext;
47 class ServerInitializer;
48 
53 class Server : public ServerInterface, private GrpcLibraryCodegen {
54  public:
55  ~Server();
56 
61  void Wait() override;
62 
70  public:
71  virtual ~GlobalCallbacks() {}
73  virtual void UpdateArguments(ChannelArguments* args) {}
75  virtual void PreSynchronousRequest(ServerContext* context) = 0;
77  virtual void PostSynchronousRequest(ServerContext* context) = 0;
79  virtual void PreServerStart(Server* server) {}
81  virtual void AddPort(Server* server, const grpc::string& addr,
82  ServerCredentials* creds, int port) {}
83  };
89  static void SetGlobalCallbacks(GlobalCallbacks* callbacks);
90 
94 
97  return health_check_service_.get();
98  }
99 
101  std::shared_ptr<Channel> InProcessChannel(const ChannelArguments& args);
102 
107  public:
108  explicit experimental_type(Server* server) : server_(server) {}
109 
112  std::shared_ptr<Channel> InProcessChannelWithInterceptors(
113  const ChannelArguments& args,
114  std::vector<
115  std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
116  interceptor_creators);
117 
118  private:
119  Server* server_;
120  };
121 
126 
127  protected:
130  bool RegisterService(const grpc::string* host, Service* service) override;
131 
145  int AddListeningPort(const grpc::string& addr,
146  ServerCredentials* creds) override;
147 
173  Server(int max_message_size, ChannelArguments* args,
174  std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
175  sync_server_cqs,
176  int min_pollers, int max_pollers, int sync_cq_timeout_msec,
177  grpc_resource_quota* server_rq = nullptr,
178  std::vector<
179  std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
180  interceptor_creators = std::vector<std::unique_ptr<
182 
189  void Start(ServerCompletionQueue** cqs, size_t num_cqs) override;
190 
191  grpc_server* server() override { return server_; };
192 
193  private:
194  std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>*
195  interceptor_creators() override {
196  return &interceptor_creators_;
197  }
198 
199  friend class AsyncGenericService;
200  friend class ServerBuilder;
201  friend class ServerInitializer;
202 
203  class SyncRequest;
204  class CallbackRequest;
205  class UnimplementedAsyncRequest;
206  class UnimplementedAsyncResponse;
207 
212  class SyncRequestThreadManager;
213 
216  void RegisterAsyncGenericService(AsyncGenericService* service) override;
217 
218  void PerformOpsOnCall(internal::CallOpSetInterface* ops,
219  internal::Call* call) override;
220 
221  void ShutdownInternal(gpr_timespec deadline) override;
222 
223  int max_receive_message_size() const override {
224  return max_receive_message_size_;
225  };
226 
227  CompletionQueue* CallbackCQ() override;
228 
229  ServerInitializer* initializer();
230 
231  // A vector of interceptor factory objects.
232  // This should be destroyed after health_check_service_ and this requirement
233  // is satisfied by declaring interceptor_creators_ before
234  // health_check_service_. (C++ mandates that member objects be destroyed in
235  // the reverse order of initialization.)
236  std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
237  interceptor_creators_;
238 
239  const int max_receive_message_size_;
240 
244  std::shared_ptr<std::vector<std::unique_ptr<ServerCompletionQueue>>>
245  sync_server_cqs_;
246 
249  std::vector<std::unique_ptr<SyncRequestThreadManager>> sync_req_mgrs_;
250 
252  std::vector<std::unique_ptr<CallbackRequest>> callback_reqs_;
253 
254  // Server status
255  std::mutex mu_;
256  bool started_;
257  bool shutdown_;
258  bool shutdown_notified_; // Was notify called on the shutdown_cv_
259 
260  std::condition_variable shutdown_cv_;
261 
262  std::shared_ptr<GlobalCallbacks> global_callbacks_;
263 
264  std::vector<grpc::string> services_;
265  bool has_generic_service_;
266 
267  // Pointer to the wrapped grpc_server.
268  grpc_server* server_;
269 
270  std::unique_ptr<ServerInitializer> server_initializer_;
271 
272  std::unique_ptr<HealthCheckServiceInterface> health_check_service_;
273  bool health_check_service_disabled_;
274 
275  // A special handler for resource exhausted in sync case
276  std::unique_ptr<internal::MethodHandler> resource_exhausted_handler_;
277 
278  // callback_cq_ references the callbackable completion queue associated
279  // with this server (if any). It is set on the first call to CallbackCQ().
280  // It is _not owned_ by the server; ownership belongs with its internal
281  // shutdown callback tag (invoked when the CQ is fully shutdown).
282  // It is protected by mu_
283  CompletionQueue* callback_cq_ = nullptr;
284 };
285 
286 } // namespace grpc
287 
288 #endif // GRPCPP_SERVER_H
bool RegisterService(const grpc::string *host, Service *service) override
Register a service.
std::string string
Definition: config.h:35
void Start(ServerCompletionQueue **cqs, size_t num_cqs) override
Start the server.
void Wait() override
Block until the server shuts down.
virtual void AddPort(Server *server, const grpc::string &addr, ServerCredentials *creds, int port)
Called after a server port is added.
Definition: server.h:81
Options for channel creation.
Definition: channel_arguments.h:39
Desriptor of an RPC service and its various RPC methods.
Definition: service_type.h:58
Definition: server_initializer.h:32
struct grpc_server grpc_server
A server listens to some port and responds to request calls.
Definition: grpc_types.h:65
virtual ~GlobalCallbacks()
Definition: server.h:71
Definition: async_generic_service.h:65
static void SetGlobalCallbacks(GlobalCallbacks *callbacks)
Set the global callback object.
Classes that require gRPC to be initialized should inherit from this class.
Definition: grpc_library.h:38
grpc_server * server() override
Definition: server.h:191
The gRPC server uses this interface to expose the health checking service without depending on protob...
Definition: health_check_service_interface.h:31
virtual void PreSynchronousRequest(ServerContext *context)=0
Called before application callback for each synchronous server request.
virtual void PreServerStart(Server *server)
Called before server is started.
Definition: server.h:79
int AddListeningPort(const grpc::string &addr, ServerCredentials *creds) override
Try binding the server to the given addr endpoint (port, and optionally including IP address to bind ...
Wrapper around grpc_server_credentials, a way to authenticate a server.
Definition: server_credentials.h:35
Represents a gRPC server.
Definition: server.h:53
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
NOTE: class experimental_type is not part of the public API of this class.
Definition: server.h:106
A ServerContext allows the person implementing a service handler to:
Definition: server_context.h:109
Definition: server_interface.h:50
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue.h:95
experimental_type(Server *server)
Definition: server.h:108
An abstract collection of call ops, used to generate the grpc_call_op structure to pass down to the l...
Definition: call_op_set_interface.h:34
experimental_type experimental()
NOTE: The function experimental() is not stable public API.
Definition: server.h:125
Global callbacks are a set of hooks that are called when server events occur.
Definition: server.h:69
struct grpc_resource_quota grpc_resource_quota
Definition: grpc_types.h:640
Analogous to struct timespec.
Definition: gpr_types.h:47
grpc_server * c_server()
Returns a raw pointer to the underlying grpc_server instance.
virtual void UpdateArguments(ChannelArguments *args)
Called before server is created.
Definition: server.h:73
A specific type of completion queue used by the processing of notifications by servers.
Definition: completion_queue.h:373
virtual void PostSynchronousRequest(ServerContext *context)=0
Called after application callback for each synchronous server request.
A builder class for the creation and startup of grpc::Server instances.
Definition: server_builder.h:53
std::shared_ptr< Channel > InProcessChannel(const ChannelArguments &args)
Establish a channel for in-process communication.
Server(int max_message_size, ChannelArguments *args, std::shared_ptr< std::vector< std::unique_ptr< ServerCompletionQueue >>> sync_server_cqs, int min_pollers, int max_pollers, int sync_cq_timeout_msec, grpc_resource_quota *server_rq=nullptr, std::vector< std::unique_ptr< experimental::ServerInterceptorFactoryInterface >> interceptor_creators=std::vector< std::unique_ptr< experimental::ServerInterceptorFactoryInterface >>())
NOTE: This is NOT a public API.
Straightforward wrapping of the C call object.
Definition: call.h:36
HealthCheckServiceInterface * GetHealthCheckService() const
Returns the health check service.
Definition: server.h:96