GRPC C++  1.19.0
client_callback.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2018 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_CLIENT_CALLBACK_H
20 #define GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H
21 
22 #include <functional>
23 
31 
32 namespace grpc {
33 
34 class Channel;
35 class ClientContext;
36 class CompletionQueue;
37 
38 namespace internal {
39 class RpcMethod;
40 
43 template <class InputMessage, class OutputMessage>
44 void CallbackUnaryCall(ChannelInterface* channel, const RpcMethod& method,
45  ClientContext* context, const InputMessage* request,
46  OutputMessage* result,
47  std::function<void(Status)> on_completion) {
49  channel, method, context, request, result, on_completion);
50 }
51 
52 template <class InputMessage, class OutputMessage>
54  public:
56  ClientContext* context, const InputMessage* request,
57  OutputMessage* result,
58  std::function<void(Status)> on_completion) {
59  CompletionQueue* cq = channel->CallbackCQ();
60  GPR_CODEGEN_ASSERT(cq != nullptr);
61  Call call(channel->CreateCall(method, context, cq));
62 
63  using FullCallOpSet =
67 
69  call.call(), sizeof(FullCallOpSet))) FullCallOpSet;
70 
72  call.call(), sizeof(CallbackWithStatusTag)))
73  CallbackWithStatusTag(call.call(), on_completion, ops);
74 
75  // TODO(vjpai): Unify code with sync API as much as possible
76  Status s = ops->SendMessagePtr(request);
77  if (!s.ok()) {
78  tag->force_run(s);
79  return;
80  }
81  ops->SendInitialMetadata(&context->send_initial_metadata_,
82  context->initial_metadata_flags());
83  ops->RecvInitialMetadata(context);
84  ops->RecvMessage(result);
85  ops->AllowNoMessage();
86  ops->ClientSendClose();
87  ops->ClientRecvStatus(context, tag->status_ptr());
88  ops->set_core_cq_tag(tag);
89  call.PerformOps(ops);
90  }
91 };
92 } // namespace internal
93 
94 namespace experimental {
95 
96 // Forward declarations
97 template <class Request, class Response>
99 template <class Response>
101 template <class Request>
103 
104 // NOTE: The streaming objects are not actually implemented in the public API.
105 // These interfaces are provided for mocking only. Typical applications
106 // will interact exclusively with the reactors that they define.
107 template <class Request, class Response>
109  public:
111  virtual void StartCall() = 0;
112  virtual void Write(const Request* req, WriteOptions options) = 0;
113  virtual void WritesDone() = 0;
114  virtual void Read(Response* resp) = 0;
115 
116  protected:
118  reactor->BindStream(this);
119  }
120 };
121 
122 template <class Response>
124  public:
126  virtual void StartCall() = 0;
127  virtual void Read(Response* resp) = 0;
128 
129  protected:
131  reactor->BindReader(this);
132  }
133 };
134 
135 template <class Request>
137  public:
139  virtual void StartCall() = 0;
140  void Write(const Request* req) { Write(req, WriteOptions()); }
141  virtual void Write(const Request* req, WriteOptions options) = 0;
142  void WriteLast(const Request* req, WriteOptions options) {
143  Write(req, options.set_last_message());
144  }
145  virtual void WritesDone() = 0;
146 
147  protected:
149  reactor->BindWriter(this);
150  }
151 };
152 
153 // The user must implement this reactor interface with reactions to each event
154 // type that gets called by the library. An empty reaction is provided by
155 // default
156 template <class Request, class Response>
157 class ClientBidiReactor {
158  public:
159  virtual ~ClientBidiReactor() {}
160  virtual void OnDone(const Status& s) {}
161  virtual void OnReadInitialMetadataDone(bool ok) {}
162  virtual void OnReadDone(bool ok) {}
163  virtual void OnWriteDone(bool ok) {}
164  virtual void OnWritesDoneDone(bool ok) {}
165 
166  void StartCall() { stream_->StartCall(); }
167  void StartRead(Response* resp) { stream_->Read(resp); }
168  void StartWrite(const Request* req) { StartWrite(req, WriteOptions()); }
169  void StartWrite(const Request* req, WriteOptions options) {
170  stream_->Write(req, std::move(options));
171  }
172  void StartWriteLast(const Request* req, WriteOptions options) {
173  StartWrite(req, std::move(options.set_last_message()));
174  }
175  void StartWritesDone() { stream_->WritesDone(); }
176 
177  private:
178  friend class ClientCallbackReaderWriter<Request, Response>;
179  void BindStream(ClientCallbackReaderWriter<Request, Response>* stream) {
180  stream_ = stream;
181  }
183 };
184 
185 template <class Response>
186 class ClientReadReactor {
187  public:
188  virtual ~ClientReadReactor() {}
189  virtual void OnDone(const Status& s) {}
190  virtual void OnReadInitialMetadataDone(bool ok) {}
191  virtual void OnReadDone(bool ok) {}
192 
193  void StartCall() { reader_->StartCall(); }
194  void StartRead(Response* resp) { reader_->Read(resp); }
195 
196  private:
197  friend class ClientCallbackReader<Response>;
198  void BindReader(ClientCallbackReader<Response>* reader) { reader_ = reader; }
200 };
201 
202 template <class Request>
203 class ClientWriteReactor {
204  public:
205  virtual ~ClientWriteReactor() {}
206  virtual void OnDone(const Status& s) {}
207  virtual void OnReadInitialMetadataDone(bool ok) {}
208  virtual void OnWriteDone(bool ok) {}
209  virtual void OnWritesDoneDone(bool ok) {}
210 
211  void StartCall() { writer_->StartCall(); }
212  void StartWrite(const Request* req) { StartWrite(req, WriteOptions()); }
213  void StartWrite(const Request* req, WriteOptions options) {
214  writer_->Write(req, std::move(options));
215  }
216  void StartWriteLast(const Request* req, WriteOptions options) {
217  StartWrite(req, std::move(options.set_last_message()));
218  }
219  void StartWritesDone() { writer_->WritesDone(); }
220 
221  private:
222  friend class ClientCallbackWriter<Request>;
223  void BindWriter(ClientCallbackWriter<Request>* writer) { writer_ = writer; }
225 };
226 
227 } // namespace experimental
228 
229 namespace internal {
230 
231 // Forward declare factory classes for friendship
232 template <class Request, class Response>
233 class ClientCallbackReaderWriterFactory;
234 template <class Response>
235 class ClientCallbackReaderFactory;
236 template <class Request>
237 class ClientCallbackWriterFactory;
238 
239 template <class Request, class Response>
242  Response> {
243  public:
244  // always allocated against a call arena, no memory free required
245  static void operator delete(void* ptr, std::size_t size) {
246  assert(size == sizeof(ClientCallbackReaderWriterImpl));
247  }
248 
249  // This operator should never be called as the memory should be freed as part
250  // of the arena destruction. It only exists to provide a matching operator
251  // delete to the operator new so that some compilers will not complain (see
252  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
253  // there are no tests catching the compiler warning.
254  static void operator delete(void*, void*) { assert(0); }
255 
256  void MaybeFinish() {
257  if (--callbacks_outstanding_ == 0) {
258  Status s = std::move(finish_status_);
259  auto* reactor = reactor_;
260  auto* call = call_.call();
263  reactor->OnDone(s);
264  }
265  }
266 
267  void StartCall() override {
268  // This call initiates two batches, plus any backlog, each with a callback
269  // 1. Send initial metadata (unless corked) + recv initial metadata
270  // 2. Any read backlog
271  // 3. Recv trailing metadata, on_completion callback
272  // 4. Any write backlog
273  // 5. See if the call can finish (if other callbacks were triggered already)
274  started_ = true;
275 
276  start_tag_.Set(call_.call(),
277  [this](bool ok) {
278  reactor_->OnReadInitialMetadataDone(ok);
279  MaybeFinish();
280  },
281  &start_ops_);
282  if (!start_corked_) {
283  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
284  context_->initial_metadata_flags());
285  }
286  start_ops_.RecvInitialMetadata(context_);
287  start_ops_.set_core_cq_tag(&start_tag_);
288  call_.PerformOps(&start_ops_);
289 
290  // Also set up the read and write tags so that they don't have to be set up
291  // each time
292  write_tag_.Set(call_.call(),
293  [this](bool ok) {
294  reactor_->OnWriteDone(ok);
295  MaybeFinish();
296  },
297  &write_ops_);
298  write_ops_.set_core_cq_tag(&write_tag_);
299 
300  read_tag_.Set(call_.call(),
301  [this](bool ok) {
302  reactor_->OnReadDone(ok);
303  MaybeFinish();
304  },
305  &read_ops_);
306  read_ops_.set_core_cq_tag(&read_tag_);
307  if (read_ops_at_start_) {
308  call_.PerformOps(&read_ops_);
309  }
310 
311  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
312  &finish_ops_);
313  finish_ops_.ClientRecvStatus(context_, &finish_status_);
314  finish_ops_.set_core_cq_tag(&finish_tag_);
315  call_.PerformOps(&finish_ops_);
316 
317  if (write_ops_at_start_) {
318  call_.PerformOps(&write_ops_);
319  }
320 
321  if (writes_done_ops_at_start_) {
322  call_.PerformOps(&writes_done_ops_);
323  }
324  MaybeFinish();
325  }
326 
327  void Read(Response* msg) override {
328  read_ops_.RecvMessage(msg);
329  callbacks_outstanding_++;
330  if (started_) {
331  call_.PerformOps(&read_ops_);
332  } else {
333  read_ops_at_start_ = true;
334  }
335  }
336 
337  void Write(const Request* msg, WriteOptions options) override {
338  if (start_corked_) {
339  write_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
340  context_->initial_metadata_flags());
341  start_corked_ = false;
342  }
343 
344  if (options.is_last_message()) {
345  options.set_buffer_hint();
346  write_ops_.ClientSendClose();
347  }
348  // TODO(vjpai): don't assert
349  GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
350  callbacks_outstanding_++;
351  if (started_) {
352  call_.PerformOps(&write_ops_);
353  } else {
354  write_ops_at_start_ = true;
355  }
356  }
357  void WritesDone() override {
358  if (start_corked_) {
359  writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
360  context_->initial_metadata_flags());
361  start_corked_ = false;
362  }
363  writes_done_ops_.ClientSendClose();
364  writes_done_tag_.Set(call_.call(),
365  [this](bool ok) {
366  reactor_->OnWritesDoneDone(ok);
367  MaybeFinish();
368  },
369  &writes_done_ops_);
370  writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
371  callbacks_outstanding_++;
372  if (started_) {
373  call_.PerformOps(&writes_done_ops_);
374  } else {
375  writes_done_ops_at_start_ = true;
376  }
377  }
378 
379  private:
380  friend class ClientCallbackReaderWriterFactory<Request, Response>;
381 
383  Call call, ClientContext* context,
385  : context_(context),
386  call_(call),
387  reactor_(reactor),
388  start_corked_(context_->initial_metadata_corked_) {
389  this->BindReactor(reactor);
390  }
391 
392  ClientContext* context_;
393  Call call_;
395 
397  CallbackWithSuccessTag start_tag_;
398  bool start_corked_;
399 
401  CallbackWithSuccessTag finish_tag_;
402  Status finish_status_;
403 
405  write_ops_;
406  CallbackWithSuccessTag write_tag_;
407  bool write_ops_at_start_{false};
408 
410  CallbackWithSuccessTag writes_done_tag_;
411  bool writes_done_ops_at_start_{false};
412 
414  CallbackWithSuccessTag read_tag_;
415  bool read_ops_at_start_{false};
416 
417  // Minimum of 3 callbacks to pre-register for StartCall, start, and finish
418  std::atomic_int callbacks_outstanding_{3};
419  bool started_{false};
420 };
421 
422 template <class Request, class Response>
424  public:
425  static void Create(
426  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
427  ClientContext* context,
429  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
430 
435  reactor);
436  }
437 };
438 
439 template <class Response>
441  : public ::grpc::experimental::ClientCallbackReader<Response> {
442  public:
443  // always allocated against a call arena, no memory free required
444  static void operator delete(void* ptr, std::size_t size) {
445  assert(size == sizeof(ClientCallbackReaderImpl));
446  }
447 
448  // This operator should never be called as the memory should be freed as part
449  // of the arena destruction. It only exists to provide a matching operator
450  // delete to the operator new so that some compilers will not complain (see
451  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
452  // there are no tests catching the compiler warning.
453  static void operator delete(void*, void*) { assert(0); }
454 
455  void MaybeFinish() {
456  if (--callbacks_outstanding_ == 0) {
457  Status s = std::move(finish_status_);
458  auto* reactor = reactor_;
459  auto* call = call_.call();
460  this->~ClientCallbackReaderImpl();
462  reactor->OnDone(s);
463  }
464  }
465 
466  void StartCall() override {
467  // This call initiates two batches, plus any backlog, each with a callback
468  // 1. Send initial metadata (unless corked) + recv initial metadata
469  // 2. Any backlog
470  // 3. Recv trailing metadata, on_completion callback
471  // 4. See if the call can finish (if other callbacks were triggered already)
472  started_ = true;
473 
474  start_tag_.Set(call_.call(),
475  [this](bool ok) {
476  reactor_->OnReadInitialMetadataDone(ok);
477  MaybeFinish();
478  },
479  &start_ops_);
480  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
481  context_->initial_metadata_flags());
482  start_ops_.RecvInitialMetadata(context_);
483  start_ops_.set_core_cq_tag(&start_tag_);
484  call_.PerformOps(&start_ops_);
485 
486  // Also set up the read tag so it doesn't have to be set up each time
487  read_tag_.Set(call_.call(),
488  [this](bool ok) {
489  reactor_->OnReadDone(ok);
490  MaybeFinish();
491  },
492  &read_ops_);
493  read_ops_.set_core_cq_tag(&read_tag_);
494  if (read_ops_at_start_) {
495  call_.PerformOps(&read_ops_);
496  }
497 
498  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
499  &finish_ops_);
500  finish_ops_.ClientRecvStatus(context_, &finish_status_);
501  finish_ops_.set_core_cq_tag(&finish_tag_);
502  call_.PerformOps(&finish_ops_);
503 
504  MaybeFinish();
505  }
506 
507  void Read(Response* msg) override {
508  read_ops_.RecvMessage(msg);
509  callbacks_outstanding_++;
510  if (started_) {
511  call_.PerformOps(&read_ops_);
512  } else {
513  read_ops_at_start_ = true;
514  }
515  }
516 
517  private:
518  friend class ClientCallbackReaderFactory<Response>;
519 
520  template <class Request>
522  Call call, ClientContext* context, Request* request,
524  : context_(context), call_(call), reactor_(reactor) {
525  this->BindReactor(reactor);
526  // TODO(vjpai): don't assert
527  GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok());
528  start_ops_.ClientSendClose();
529  }
530 
531  ClientContext* context_;
532  Call call_;
534 
537  start_ops_;
538  CallbackWithSuccessTag start_tag_;
539 
541  CallbackWithSuccessTag finish_tag_;
542  Status finish_status_;
543 
545  CallbackWithSuccessTag read_tag_;
546  bool read_ops_at_start_{false};
547 
548  // Minimum of 3 callbacks to pre-register for StartCall, start, and finish
549  std::atomic_int callbacks_outstanding_{3};
550  bool started_{false};
551 };
552 
553 template <class Response>
555  public:
556  template <class Request>
557  static void Create(
558  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
559  ClientContext* context, const Request* request,
561  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
562 
565  call.call(), sizeof(ClientCallbackReaderImpl<Response>)))
566  ClientCallbackReaderImpl<Response>(call, context, request, reactor);
567  }
568 };
569 
570 template <class Request>
573  public:
574  // always allocated against a call arena, no memory free required
575  static void operator delete(void* ptr, std::size_t size) {
576  assert(size == sizeof(ClientCallbackWriterImpl));
577  }
578 
579  // This operator should never be called as the memory should be freed as part
580  // of the arena destruction. It only exists to provide a matching operator
581  // delete to the operator new so that some compilers will not complain (see
582  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
583  // there are no tests catching the compiler warning.
584  static void operator delete(void*, void*) { assert(0); }
585 
586  void MaybeFinish() {
587  if (--callbacks_outstanding_ == 0) {
588  Status s = std::move(finish_status_);
589  auto* reactor = reactor_;
590  auto* call = call_.call();
591  this->~ClientCallbackWriterImpl();
593  reactor->OnDone(s);
594  }
595  }
596 
597  void StartCall() override {
598  // This call initiates two batches, plus any backlog, each with a callback
599  // 1. Send initial metadata (unless corked) + recv initial metadata
600  // 2. Recv trailing metadata, on_completion callback
601  // 3. Any backlog
602  // 4. See if the call can finish (if other callbacks were triggered already)
603  started_ = true;
604 
605  start_tag_.Set(call_.call(),
606  [this](bool ok) {
607  reactor_->OnReadInitialMetadataDone(ok);
608  MaybeFinish();
609  },
610  &start_ops_);
611  if (!start_corked_) {
612  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
613  context_->initial_metadata_flags());
614  }
615  start_ops_.RecvInitialMetadata(context_);
616  start_ops_.set_core_cq_tag(&start_tag_);
617  call_.PerformOps(&start_ops_);
618 
619  // Also set up the read and write tags so that they don't have to be set up
620  // each time
621  write_tag_.Set(call_.call(),
622  [this](bool ok) {
623  reactor_->OnWriteDone(ok);
624  MaybeFinish();
625  },
626  &write_ops_);
627  write_ops_.set_core_cq_tag(&write_tag_);
628 
629  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
630  &finish_ops_);
631  finish_ops_.ClientRecvStatus(context_, &finish_status_);
632  finish_ops_.set_core_cq_tag(&finish_tag_);
633  call_.PerformOps(&finish_ops_);
634 
635  if (write_ops_at_start_) {
636  call_.PerformOps(&write_ops_);
637  }
638 
639  if (writes_done_ops_at_start_) {
640  call_.PerformOps(&writes_done_ops_);
641  }
642 
643  MaybeFinish();
644  }
645 
646  void Write(const Request* msg, WriteOptions options) override {
647  if (start_corked_) {
648  write_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
649  context_->initial_metadata_flags());
650  start_corked_ = false;
651  }
652 
653  if (options.is_last_message()) {
654  options.set_buffer_hint();
655  write_ops_.ClientSendClose();
656  }
657  // TODO(vjpai): don't assert
658  GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
659  callbacks_outstanding_++;
660  if (started_) {
661  call_.PerformOps(&write_ops_);
662  } else {
663  write_ops_at_start_ = true;
664  }
665  }
666  void WritesDone() override {
667  if (start_corked_) {
668  writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
669  context_->initial_metadata_flags());
670  start_corked_ = false;
671  }
672  writes_done_ops_.ClientSendClose();
673  writes_done_tag_.Set(call_.call(),
674  [this](bool ok) {
675  reactor_->OnWritesDoneDone(ok);
676  MaybeFinish();
677  },
678  &writes_done_ops_);
679  writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
680  callbacks_outstanding_++;
681  if (started_) {
682  call_.PerformOps(&writes_done_ops_);
683  } else {
684  writes_done_ops_at_start_ = true;
685  }
686  }
687 
688  private:
689  friend class ClientCallbackWriterFactory<Request>;
690 
691  template <class Response>
693  Call call, ClientContext* context, Response* response,
695  : context_(context),
696  call_(call),
697  reactor_(reactor),
698  start_corked_(context_->initial_metadata_corked_) {
699  this->BindReactor(reactor);
700  finish_ops_.RecvMessage(response);
701  finish_ops_.AllowNoMessage();
702  }
703 
704  ClientContext* context_;
705  Call call_;
707 
709  CallbackWithSuccessTag start_tag_;
710  bool start_corked_;
711 
713  CallbackWithSuccessTag finish_tag_;
714  Status finish_status_;
715 
717  write_ops_;
718  CallbackWithSuccessTag write_tag_;
719  bool write_ops_at_start_{false};
720 
722  CallbackWithSuccessTag writes_done_tag_;
723  bool writes_done_ops_at_start_{false};
724 
725  // Minimum of 3 callbacks to pre-register for StartCall, start, and finish
726  std::atomic_int callbacks_outstanding_{3};
727  bool started_{false};
728 };
729 
730 template <class Request>
732  public:
733  template <class Response>
734  static void Create(
735  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
736  ClientContext* context, Response* response,
738  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
739 
742  call.call(), sizeof(ClientCallbackWriterImpl<Request>)))
743  ClientCallbackWriterImpl<Request>(call, context, response, reactor);
744  }
745 };
746 
747 } // namespace internal
748 } // namespace grpc
749 
750 #endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H
virtual ~ClientCallbackReaderWriter()
Definition: client_callback.h:110
void StartCall() override
Definition: client_callback.h:466
virtual ~ClientWriteReactor()
Definition: client_callback.h:205
virtual void OnReadInitialMetadataDone(bool ok)
Definition: client_callback.h:207
Definition: channel_interface.h:56
WriteOptions & set_buffer_hint()
Sets flag indicating that the write may be buffered and need not go out on the wire immediately...
Definition: call_op_set.h:126
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:142
virtual void grpc_call_ref(grpc_call *call)=0
virtual ~ClientCallbackReader()
Definition: client_callback.h:125
WriteOptions & set_last_message()
last-message bit: indicates this is the last message in a stream client-side: makes Write the equival...
Definition: call_op_set.h:165
Definition: client_callback.h:100
static void Create(ChannelInterface *channel, const ::grpc::internal::RpcMethod &method, ClientContext *context, Response *response, ::grpc::experimental::ClientWriteReactor< Request > *reactor)
Definition: client_callback.h:734
Primary implementation of CallOpSetInterface.
Definition: call_op_set.h:828
virtual ~ClientReadReactor()
Definition: client_callback.h:188
virtual void grpc_call_unref(grpc_call *call)=0
void WritesDone() override
Definition: client_callback.h:666
void StartRead(Response *resp)
Definition: client_callback.h:194
CallbackUnaryCallImpl(ChannelInterface *channel, const RpcMethod &method, ClientContext *context, const InputMessage *request, OutputMessage *result, std::function< void(Status)> on_completion)
Definition: client_callback.h:55
Definition: client_callback.h:108
Definition: channel_interface.h:60
void Write(const Request *req)
Definition: client_callback.h:140
void StartCall() override
Definition: client_callback.h:267
void Read(Response *msg) override
Definition: client_callback.h:327
Definition: channel_interface.h:46
static void Create(ChannelInterface *channel, const ::grpc::internal::RpcMethod &method, ClientContext *context, ::grpc::experimental::ClientBidiReactor< Request, Response > *reactor)
Definition: client_callback.h:425
grpc_call * call() const
Definition: call.h:70
void WriteLast(const Request *req, WriteOptions options)
Definition: client_callback.h:142
void StartWritesDone()
Definition: client_callback.h:175
virtual void OnWriteDone(bool ok)
Definition: client_callback.h:208
virtual void OnDone(const Status &s)
Definition: client_callback.h:206
A ClientContext allows the person implementing a service client to:
Definition: client_context.h:174
void Read(Response *msg) override
Definition: client_callback.h:507
static void Create(ChannelInterface *channel, const ::grpc::internal::RpcMethod &method, ClientContext *context, const Request *request, ::grpc::experimental::ClientReadReactor< Response > *reactor)
Definition: client_callback.h:557
virtual ~ClientCallbackWriter()
Definition: client_callback.h:138
virtual void OnDone(const Status &s)
Definition: client_callback.h:189
Descriptor of an RPC method.
Definition: rpc_method.h:29
void StartWrite(const Request *req, WriteOptions options)
Definition: client_callback.h:169
Definition: client_callback.h:123
Definition: call_op_set.h:224
void StartWrite(const Request *req)
Definition: client_callback.h:168
void Write(const Request *msg, WriteOptions options) override
Definition: client_callback.h:646
Definition: call_op_set.h:703
virtual void OnReadDone(bool ok)
Definition: client_callback.h:191
void StartWriteLast(const Request *req, WriteOptions options)
Definition: client_callback.h:216
Definition: call_op_set.h:294
virtual ~ClientBidiReactor()
Definition: client_callback.h:159
void StartWrite(const Request *req, WriteOptions options)
Definition: client_callback.h:213
void WritesDone() override
Definition: client_callback.h:357
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
void StartRead(Response *resp)
Definition: client_callback.h:167
Definition: client_callback.h:102
virtual void OnWritesDoneDone(bool ok)
Definition: client_callback.h:164
void StartCall()
Definition: client_callback.h:166
Codegen interface for grpc::Channel.
Definition: channel_interface.h:65
Definition: client_callback.h:240
CoreCodegenInterface * g_core_codegen_interface
Definition: call_op_set.h:51
void MaybeFinish()
Definition: client_callback.h:256
Definition: client_callback.h:98
virtual void OnWritesDoneDone(bool ok)
Definition: client_callback.h:209
Definition: byte_buffer.h:41
Per-message write options.
Definition: call_op_set.h:86
Definition: client_callback.h:571
void MaybeFinish()
Definition: client_callback.h:586
Definition: channel_interface.h:58
void StartWritesDone()
Definition: client_callback.h:219
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue.h:97
Definition: call_op_set.h:601
virtual void * grpc_call_arena_alloc(grpc_call *call, size_t length)=0
void Write(const Request *msg, WriteOptions options) override
Definition: client_callback.h:337
CallbackWithSuccessTag can be reused multiple times, and will be used in this fashion for streaming o...
Definition: callback_common.h:132
bool ok() const
Is the status OK?
Definition: status.h:118
void StartCall() override
Definition: client_callback.h:597
Definition: client_callback.h:136
void StartCall()
Definition: client_callback.h:193
virtual void OnDone(const Status &s)
Definition: client_callback.h:160
Did it work? If it didn&#39;t, why?
Definition: status.h:31
virtual void OnReadDone(bool ok)
Definition: client_callback.h:162
void BindReactor(ClientBidiReactor< Request, Response > *reactor)
Definition: client_callback.h:117
Definition: callback_common.h:68
virtual void OnWriteDone(bool ok)
Definition: client_callback.h:163
bool is_last_message() const
Get value for the flag indicating that this is the last message, and should be coalesced with trailin...
Definition: call_op_set.h:190
Definition: client_callback.h:440
Definition: call_op_set.h:751
void BindReactor(ClientReadReactor< Response > *reactor)
Definition: client_callback.h:130
void StartWriteLast(const Request *req, WriteOptions options)
Definition: client_callback.h:172
void MaybeFinish()
Definition: client_callback.h:455
virtual void OnReadInitialMetadataDone(bool ok)
Definition: client_callback.h:161
void BindReactor(ClientWriteReactor< Request > *reactor)
Definition: client_callback.h:148
virtual void OnReadInitialMetadataDone(bool ok)
Definition: client_callback.h:190
void StartWrite(const Request *req)
Definition: client_callback.h:212
Straightforward wrapping of the C call object.
Definition: call.h:36
void StartCall()
Definition: client_callback.h:211
void CallbackUnaryCall(ChannelInterface *channel, const RpcMethod &method, ClientContext *context, const InputMessage *request, OutputMessage *result, std::function< void(Status)> on_completion)
Perform a callback-based unary call TODO(vjpai): Combine as much as possible with the blocking unary ...
Definition: client_callback.h:44