GRPC C++  1.14.0-dev
server_interface.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_IMPL_CODEGEN_SERVER_INTERFACE_H
20 #define GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H
21 
28 
29 namespace grpc {
30 
31 class AsyncGenericService;
32 class Channel;
33 class GenericServerContext;
34 class ServerCompletionQueue;
35 class ServerContext;
36 class ServerCredentials;
37 class Service;
38 
39 extern CoreCodegenInterface* g_core_codegen_interface;
40 
44 namespace internal {
45 class ServerAsyncStreamingInterface;
46 } // namespace internal
47 
49  public:
50  virtual ~ServerInterface() {}
51 
84  template <class T>
85  void Shutdown(const T& deadline) {
86  ShutdownInternal(TimePoint<T>(deadline).raw_time());
87  }
88 
94  void Shutdown() {
95  ShutdownInternal(
96  g_core_codegen_interface->gpr_inf_future(GPR_CLOCK_MONOTONIC));
97  }
98 
103  virtual void Wait() = 0;
104 
105  protected:
106  friend class ::grpc::Service;
107 
110  virtual bool RegisterService(const grpc::string* host, Service* service) = 0;
111 
114  virtual void RegisterAsyncGenericService(AsyncGenericService* service) = 0;
115 
127  virtual int AddListeningPort(const grpc::string& addr,
128  ServerCredentials* creds) = 0;
129 
136  virtual void Start(ServerCompletionQueue** cqs, size_t num_cqs) = 0;
137 
138  virtual void ShutdownInternal(gpr_timespec deadline) = 0;
139 
140  virtual int max_receive_message_size() const = 0;
141 
142  virtual grpc_server* server() = 0;
143 
144  virtual void PerformOpsOnCall(internal::CallOpSetInterface* ops,
145  internal::Call* call) = 0;
146 
148  public:
151  CompletionQueue* call_cq, void* tag,
152  bool delete_on_finalize);
153  virtual ~BaseAsyncRequest();
154 
155  bool FinalizeResult(void** tag, bool* status) override;
156 
157  protected:
162  void* const tag_;
165  };
166 
168  public:
171  CompletionQueue* call_cq, void* tag);
172 
173  // uses BaseAsyncRequest::FinalizeResult
174 
175  protected:
176  void IssueRequest(void* registered_method, grpc_byte_buffer** payload,
177  ServerCompletionQueue* notification_cq);
178  };
179 
181  public:
182  NoPayloadAsyncRequest(void* registered_method, ServerInterface* server,
183  ServerContext* context,
185  CompletionQueue* call_cq,
186  ServerCompletionQueue* notification_cq, void* tag)
187  : RegisteredAsyncRequest(server, context, stream, call_cq, tag) {
188  IssueRequest(registered_method, nullptr, notification_cq);
189  }
190 
191  // uses RegisteredAsyncRequest::FinalizeResult
192  };
193 
194  template <class Message>
196  public:
197  PayloadAsyncRequest(void* registered_method, ServerInterface* server,
198  ServerContext* context,
200  CompletionQueue* call_cq,
201  ServerCompletionQueue* notification_cq, void* tag,
202  Message* request)
203  : RegisteredAsyncRequest(server, context, stream, call_cq, tag),
204  registered_method_(registered_method),
205  server_(server),
206  context_(context),
207  stream_(stream),
208  call_cq_(call_cq),
209  notification_cq_(notification_cq),
210  tag_(tag),
211  request_(request) {
212  IssueRequest(registered_method, payload_.bbuf_ptr(), notification_cq);
213  }
214 
216  payload_.Release(); // We do not own the payload_
217  }
218 
219  bool FinalizeResult(void** tag, bool* status) override {
220  if (*status) {
221  if (!payload_.Valid() || !SerializationTraits<Message>::Deserialize(
222  payload_.bbuf_ptr(), request_)
223  .ok()) {
224  // If deserialization fails, we cancel the call and instantiate
225  // a new instance of ourselves to request another call. We then
226  // return false, which prevents the call from being returned to
227  // the application.
228  g_core_codegen_interface->grpc_call_cancel_with_status(
229  call_, GRPC_STATUS_INTERNAL, "Unable to parse request", nullptr);
230  g_core_codegen_interface->grpc_call_unref(call_);
231  new PayloadAsyncRequest(registered_method_, server_, context_,
232  stream_, call_cq_, notification_cq_, tag_,
233  request_);
234  delete this;
235  return false;
236  }
237  }
238  return RegisteredAsyncRequest::FinalizeResult(tag, status);
239  }
240 
241  private:
242  void* const registered_method_;
243  ServerInterface* const server_;
244  ServerContext* const context_;
246  CompletionQueue* const call_cq_;
247  ServerCompletionQueue* const notification_cq_;
248  void* const tag_;
249  Message* const request_;
250  ByteBuffer payload_;
251  };
252 
254  public:
257  CompletionQueue* call_cq,
258  ServerCompletionQueue* notification_cq, void* tag,
259  bool delete_on_finalize);
260 
261  bool FinalizeResult(void** tag, bool* status) override;
262 
263  private:
264  grpc_call_details call_details_;
265  };
266 
267  template <class Message>
269  ServerContext* context,
271  CompletionQueue* call_cq,
272  ServerCompletionQueue* notification_cq, void* tag,
273  Message* message) {
274  GPR_CODEGEN_ASSERT(method);
275  new PayloadAsyncRequest<Message>(method->server_tag(), this, context,
276  stream, call_cq, notification_cq, tag,
277  message);
278  }
279 
281  ServerContext* context,
283  CompletionQueue* call_cq,
284  ServerCompletionQueue* notification_cq, void* tag) {
285  GPR_CODEGEN_ASSERT(method);
286  new NoPayloadAsyncRequest(method->server_tag(), this, context, stream,
287  call_cq, notification_cq, tag);
288  }
289 
292  CompletionQueue* call_cq,
293  ServerCompletionQueue* notification_cq,
294  void* tag) {
295  new GenericAsyncRequest(this, context, stream, call_cq, notification_cq,
296  tag, true);
297  }
298 };
299 
300 } // namespace grpc
301 
302 #endif // GRPCPP_IMPL_CODEGEN_SERVER_INTERFACE_H
struct grpc_call grpc_call
A Call represents an RPC.
Definition: grpc_types.h:70
virtual ~ServerInterface()
Definition: server_interface.h:50
Definition: server_interface.h:180
void RequestAsyncGenericCall(GenericServerContext *context, internal::ServerAsyncStreamingInterface *stream, CompletionQueue *call_cq, ServerCompletionQueue *notification_cq, void *tag)
Definition: server_interface.h:290
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:138
void Shutdown()
Shutdown the server without a deadline and forced cancellation.
Definition: server_interface.h:94
std::string string
Definition: config.h:35
An interface allowing implementors to process and filter event tags.
Definition: completion_queue_tag.h:26
void * server_tag() const
Definition: rpc_service_method.h:64
Definition: server_interface.h:195
ServerInterface *const server_
Definition: server_interface.h:158
Desriptor of an RPC service and its various RPC methods.
Definition: service_type.h:58
Definition: server_interface.h:167
void RequestAsyncCall(internal::RpcServiceMethod *method, ServerContext *context, internal::ServerAsyncStreamingInterface *stream, CompletionQueue *call_cq, ServerCompletionQueue *notification_cq, void *tag, Message *message)
Definition: server_interface.h:268
Monotonic clock.
Definition: gpr_types.h:33
struct grpc_server grpc_server
A server listens to some port and responds to request calls.
Definition: grpc_types.h:65
Definition: grpc_types.h:478
Definition: grpc_types.h:40
Definition: async_generic_service.h:62
If you are trying to use CompletionQueue::AsyncNext with a time class that isn&#39;t either gpr_timespec ...
Definition: time.h:40
PayloadAsyncRequest(void *registered_method, ServerInterface *server, ServerContext *context, internal::ServerAsyncStreamingInterface *stream, CompletionQueue *call_cq, ServerCompletionQueue *notification_cq, void *tag, Message *request)
Definition: server_interface.h:197
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:58
Wrapper around grpc_server_credentials, a way to authenticate a server.
Definition: server_credentials.h:35
internal::ServerAsyncStreamingInterface *const stream_
Definition: server_interface.h:160
An Alarm posts the user provided tag to its associated completion queue upon expiry or cancellation...
Definition: alarm.h:31
const bool delete_on_finalize_
Definition: server_interface.h:163
Server side rpc method class.
Definition: rpc_service_method.h:56
CoreCodegenInterface * g_core_codegen_interface
Definition: call.h:46
void RequestAsyncCall(internal::RpcServiceMethod *method, ServerContext *context, internal::ServerAsyncStreamingInterface *stream, CompletionQueue *call_cq, ServerCompletionQueue *notification_cq, void *tag)
Definition: server_interface.h:280
A ServerContext allows the person implementing a service handler to:
Definition: server_context.h:96
Definition: server_interface.h:48
grpc_call * call_
Definition: server_interface.h:164
CompletionQueue *const call_cq_
Definition: server_interface.h:161
Definition: async_generic_service.h:32
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue.h:94
bool FinalizeResult(void **tag, bool *status) override
Called prior to returning from Next(), return value is the status of the operation (return status is ...
Definition: server_interface.h:219
void Shutdown(const T &deadline)
Shutdown does the following things:
Definition: server_interface.h:85
An abstract collection of call ops, used to generate the grpc_call_op structure to pass down to the l...
Definition: call.h:606
~PayloadAsyncRequest()
Definition: server_interface.h:215
ServerContext *const context_
Definition: server_interface.h:159
Internal errors.
Definition: status.h:127
Analogous to struct timespec.
Definition: gpr_types.h:47
Definition: server_interface.h:253
void *const tag_
Definition: server_interface.h:162
NoPayloadAsyncRequest(void *registered_method, ServerInterface *server, ServerContext *context, internal::ServerAsyncStreamingInterface *stream, CompletionQueue *call_cq, ServerCompletionQueue *notification_cq, void *tag)
Definition: server_interface.h:182
A specific type of completion queue used by the processing of notifications by servers.
Definition: completion_queue.h:364
This is an interface that Channel and Server implement to allow them to hook performing ops...
Definition: call_hook.h:30
A sequence of bytes.
Definition: byte_buffer.h:53
Definition: server_interface.h:147
Straightforward wrapping of the C call object.
Definition: call.h:663
::google::protobuf::Message Message
Definition: config_protobuf.h:72