GRPC C++  1.20.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  virtual void AddHold(int holds) = 0;
116  virtual void RemoveHold() = 0;
117 
118  protected:
120  reactor->BindStream(this);
121  }
122 };
123 
124 template <class Response>
126  public:
128  virtual void StartCall() = 0;
129  virtual void Read(Response* resp) = 0;
130  virtual void AddHold(int holds) = 0;
131  virtual void RemoveHold() = 0;
132 
133  protected:
135  reactor->BindReader(this);
136  }
137 };
138 
139 template <class Request>
141  public:
143  virtual void StartCall() = 0;
144  void Write(const Request* req) { Write(req, WriteOptions()); }
145  virtual void Write(const Request* req, WriteOptions options) = 0;
146  void WriteLast(const Request* req, WriteOptions options) {
147  Write(req, options.set_last_message());
148  }
149  virtual void WritesDone() = 0;
150 
151  virtual void AddHold(int holds) = 0;
152  virtual void RemoveHold() = 0;
153 
154  protected:
156  reactor->BindWriter(this);
157  }
158 };
159 
160 // The following classes are the reactor interfaces that are to be implemented
161 // by the user. They are passed in to the library as an argument to a call on a
162 // stub (either a codegen-ed call or a generic call). The streaming RPC is
163 // activated by calling StartCall, possibly after initiating StartRead,
164 // StartWrite, or AddHold operations on the streaming object. Note that none of
165 // the classes are pure; all reactions have a default empty reaction so that the
166 // user class only needs to override those classes that it cares about.
167 
169 template <class Request, class Response>
170 class ClientBidiReactor {
171  public:
172  virtual ~ClientBidiReactor() {}
173 
178  void StartCall() { stream_->StartCall(); }
179 
185  void StartRead(Response* resp) { stream_->Read(resp); }
186 
193  void StartWrite(const Request* req) { StartWrite(req, WriteOptions()); }
194 
201  void StartWrite(const Request* req, WriteOptions options) {
202  stream_->Write(req, std::move(options));
203  }
204 
214  void StartWriteLast(const Request* req, WriteOptions options) {
215  StartWrite(req, std::move(options.set_last_message()));
216  }
217 
223  void StartWritesDone() { stream_->WritesDone(); }
224 
246  void AddHold() { AddMultipleHolds(1); }
247  void AddMultipleHolds(int holds) { stream_->AddHold(holds); }
248  void RemoveHold() { stream_->RemoveHold(); }
249 
254  virtual void OnDone(const Status& s) {}
255 
263  virtual void OnReadInitialMetadataDone(bool ok) {}
264 
269  virtual void OnReadDone(bool ok) {}
270 
275  virtual void OnWriteDone(bool ok) {}
276 
283  virtual void OnWritesDoneDone(bool ok) {}
284 
285  private:
286  friend class ClientCallbackReaderWriter<Request, Response>;
287  void BindStream(ClientCallbackReaderWriter<Request, Response>* stream) {
288  stream_ = stream;
289  }
291 };
292 
295 template <class Response>
296 class ClientReadReactor {
297  public:
298  virtual ~ClientReadReactor() {}
299 
300  void StartCall() { reader_->StartCall(); }
301  void StartRead(Response* resp) { reader_->Read(resp); }
302 
303  void AddHold() { AddMultipleHolds(1); }
304  void AddMultipleHolds(int holds) { reader_->AddHold(holds); }
305  void RemoveHold() { reader_->RemoveHold(); }
306 
307  virtual void OnDone(const Status& s) {}
308  virtual void OnReadInitialMetadataDone(bool ok) {}
309  virtual void OnReadDone(bool ok) {}
310 
311  private:
312  friend class ClientCallbackReader<Response>;
313  void BindReader(ClientCallbackReader<Response>* reader) { reader_ = reader; }
315 };
316 
319 template <class Request>
320 class ClientWriteReactor {
321  public:
322  virtual ~ClientWriteReactor() {}
323 
324  void StartCall() { writer_->StartCall(); }
325  void StartWrite(const Request* req) { StartWrite(req, WriteOptions()); }
326  void StartWrite(const Request* req, WriteOptions options) {
327  writer_->Write(req, std::move(options));
328  }
329  void StartWriteLast(const Request* req, WriteOptions options) {
330  StartWrite(req, std::move(options.set_last_message()));
331  }
332  void StartWritesDone() { writer_->WritesDone(); }
333 
334  void AddHold() { AddMultipleHolds(1); }
335  void AddMultipleHolds(int holds) { writer_->AddHold(holds); }
336  void RemoveHold() { writer_->RemoveHold(); }
337 
338  virtual void OnDone(const Status& s) {}
339  virtual void OnReadInitialMetadataDone(bool ok) {}
340  virtual void OnWriteDone(bool ok) {}
341  virtual void OnWritesDoneDone(bool ok) {}
342 
343  private:
344  friend class ClientCallbackWriter<Request>;
345  void BindWriter(ClientCallbackWriter<Request>* writer) { writer_ = writer; }
347 };
348 
349 } // namespace experimental
350 
351 namespace internal {
352 
353 // Forward declare factory classes for friendship
354 template <class Request, class Response>
355 class ClientCallbackReaderWriterFactory;
356 template <class Response>
357 class ClientCallbackReaderFactory;
358 template <class Request>
359 class ClientCallbackWriterFactory;
360 
361 template <class Request, class Response>
364  Response> {
365  public:
366  // always allocated against a call arena, no memory free required
367  static void operator delete(void* ptr, std::size_t size) {
368  assert(size == sizeof(ClientCallbackReaderWriterImpl));
369  }
370 
371  // This operator should never be called as the memory should be freed as part
372  // of the arena destruction. It only exists to provide a matching operator
373  // delete to the operator new so that some compilers will not complain (see
374  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
375  // there are no tests catching the compiler warning.
376  static void operator delete(void*, void*) { assert(0); }
377 
378  void MaybeFinish() {
379  if (--callbacks_outstanding_ == 0) {
380  Status s = std::move(finish_status_);
381  auto* reactor = reactor_;
382  auto* call = call_.call();
385  reactor->OnDone(s);
386  }
387  }
388 
389  void StartCall() override {
390  // This call initiates two batches, plus any backlog, each with a callback
391  // 1. Send initial metadata (unless corked) + recv initial metadata
392  // 2. Any read backlog
393  // 3. Any write backlog
394  // 4. Recv trailing metadata, on_completion callback
395  started_ = true;
396 
397  start_tag_.Set(call_.call(),
398  [this](bool ok) {
399  reactor_->OnReadInitialMetadataDone(ok);
400  MaybeFinish();
401  },
402  &start_ops_);
403  if (!start_corked_) {
404  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
405  context_->initial_metadata_flags());
406  }
407  start_ops_.RecvInitialMetadata(context_);
408  start_ops_.set_core_cq_tag(&start_tag_);
409  call_.PerformOps(&start_ops_);
410 
411  // Also set up the read and write tags so that they don't have to be set up
412  // each time
413  write_tag_.Set(call_.call(),
414  [this](bool ok) {
415  reactor_->OnWriteDone(ok);
416  MaybeFinish();
417  },
418  &write_ops_);
419  write_ops_.set_core_cq_tag(&write_tag_);
420 
421  read_tag_.Set(call_.call(),
422  [this](bool ok) {
423  reactor_->OnReadDone(ok);
424  MaybeFinish();
425  },
426  &read_ops_);
427  read_ops_.set_core_cq_tag(&read_tag_);
428  if (read_ops_at_start_) {
429  call_.PerformOps(&read_ops_);
430  }
431 
432  if (write_ops_at_start_) {
433  call_.PerformOps(&write_ops_);
434  }
435 
436  if (writes_done_ops_at_start_) {
437  call_.PerformOps(&writes_done_ops_);
438  }
439 
440  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
441  &finish_ops_);
442  finish_ops_.ClientRecvStatus(context_, &finish_status_);
443  finish_ops_.set_core_cq_tag(&finish_tag_);
444  call_.PerformOps(&finish_ops_);
445  }
446 
447  void Read(Response* msg) override {
448  read_ops_.RecvMessage(msg);
449  callbacks_outstanding_++;
450  if (started_) {
451  call_.PerformOps(&read_ops_);
452  } else {
453  read_ops_at_start_ = true;
454  }
455  }
456 
457  void Write(const Request* msg, WriteOptions options) override {
458  if (start_corked_) {
459  write_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
460  context_->initial_metadata_flags());
461  start_corked_ = false;
462  }
463 
464  if (options.is_last_message()) {
465  options.set_buffer_hint();
466  write_ops_.ClientSendClose();
467  }
468  // TODO(vjpai): don't assert
469  GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
470  callbacks_outstanding_++;
471  if (started_) {
472  call_.PerformOps(&write_ops_);
473  } else {
474  write_ops_at_start_ = true;
475  }
476  }
477  void WritesDone() override {
478  if (start_corked_) {
479  writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
480  context_->initial_metadata_flags());
481  start_corked_ = false;
482  }
483  writes_done_ops_.ClientSendClose();
484  writes_done_tag_.Set(call_.call(),
485  [this](bool ok) {
486  reactor_->OnWritesDoneDone(ok);
487  MaybeFinish();
488  },
489  &writes_done_ops_);
490  writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
491  callbacks_outstanding_++;
492  if (started_) {
493  call_.PerformOps(&writes_done_ops_);
494  } else {
495  writes_done_ops_at_start_ = true;
496  }
497  }
498 
499  virtual void AddHold(int holds) override { callbacks_outstanding_ += holds; }
500  virtual void RemoveHold() override { MaybeFinish(); }
501 
502  private:
503  friend class ClientCallbackReaderWriterFactory<Request, Response>;
504 
506  Call call, ClientContext* context,
508  : context_(context),
509  call_(call),
510  reactor_(reactor),
511  start_corked_(context_->initial_metadata_corked_) {
512  this->BindReactor(reactor);
513  }
514 
515  ClientContext* context_;
516  Call call_;
518 
520  CallbackWithSuccessTag start_tag_;
521  bool start_corked_;
522 
524  CallbackWithSuccessTag finish_tag_;
525  Status finish_status_;
526 
528  write_ops_;
529  CallbackWithSuccessTag write_tag_;
530  bool write_ops_at_start_{false};
531 
533  CallbackWithSuccessTag writes_done_tag_;
534  bool writes_done_ops_at_start_{false};
535 
537  CallbackWithSuccessTag read_tag_;
538  bool read_ops_at_start_{false};
539 
540  // Minimum of 2 callbacks to pre-register for start and finish
541  std::atomic_int callbacks_outstanding_{2};
542  bool started_{false};
543 };
544 
545 template <class Request, class Response>
547  public:
548  static void Create(
549  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
550  ClientContext* context,
552  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
553 
558  reactor);
559  }
560 };
561 
562 template <class Response>
564  : public ::grpc::experimental::ClientCallbackReader<Response> {
565  public:
566  // always allocated against a call arena, no memory free required
567  static void operator delete(void* ptr, std::size_t size) {
568  assert(size == sizeof(ClientCallbackReaderImpl));
569  }
570 
571  // This operator should never be called as the memory should be freed as part
572  // of the arena destruction. It only exists to provide a matching operator
573  // delete to the operator new so that some compilers will not complain (see
574  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
575  // there are no tests catching the compiler warning.
576  static void operator delete(void*, void*) { assert(0); }
577 
578  void MaybeFinish() {
579  if (--callbacks_outstanding_ == 0) {
580  Status s = std::move(finish_status_);
581  auto* reactor = reactor_;
582  auto* call = call_.call();
583  this->~ClientCallbackReaderImpl();
585  reactor->OnDone(s);
586  }
587  }
588 
589  void StartCall() override {
590  // This call initiates two batches, plus any backlog, each with a callback
591  // 1. Send initial metadata (unless corked) + recv initial metadata
592  // 2. Any backlog
593  // 3. Recv trailing metadata, on_completion callback
594  started_ = true;
595 
596  start_tag_.Set(call_.call(),
597  [this](bool ok) {
598  reactor_->OnReadInitialMetadataDone(ok);
599  MaybeFinish();
600  },
601  &start_ops_);
602  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
603  context_->initial_metadata_flags());
604  start_ops_.RecvInitialMetadata(context_);
605  start_ops_.set_core_cq_tag(&start_tag_);
606  call_.PerformOps(&start_ops_);
607 
608  // Also set up the read tag so it doesn't have to be set up each time
609  read_tag_.Set(call_.call(),
610  [this](bool ok) {
611  reactor_->OnReadDone(ok);
612  MaybeFinish();
613  },
614  &read_ops_);
615  read_ops_.set_core_cq_tag(&read_tag_);
616  if (read_ops_at_start_) {
617  call_.PerformOps(&read_ops_);
618  }
619 
620  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
621  &finish_ops_);
622  finish_ops_.ClientRecvStatus(context_, &finish_status_);
623  finish_ops_.set_core_cq_tag(&finish_tag_);
624  call_.PerformOps(&finish_ops_);
625  }
626 
627  void Read(Response* msg) override {
628  read_ops_.RecvMessage(msg);
629  callbacks_outstanding_++;
630  if (started_) {
631  call_.PerformOps(&read_ops_);
632  } else {
633  read_ops_at_start_ = true;
634  }
635  }
636 
637  virtual void AddHold(int holds) override { callbacks_outstanding_ += holds; }
638  virtual void RemoveHold() override { MaybeFinish(); }
639 
640  private:
641  friend class ClientCallbackReaderFactory<Response>;
642 
643  template <class Request>
645  Call call, ClientContext* context, Request* request,
647  : context_(context), call_(call), reactor_(reactor) {
648  this->BindReactor(reactor);
649  // TODO(vjpai): don't assert
650  GPR_CODEGEN_ASSERT(start_ops_.SendMessagePtr(request).ok());
651  start_ops_.ClientSendClose();
652  }
653 
654  ClientContext* context_;
655  Call call_;
657 
660  start_ops_;
661  CallbackWithSuccessTag start_tag_;
662 
664  CallbackWithSuccessTag finish_tag_;
665  Status finish_status_;
666 
668  CallbackWithSuccessTag read_tag_;
669  bool read_ops_at_start_{false};
670 
671  // Minimum of 2 callbacks to pre-register for start and finish
672  std::atomic_int callbacks_outstanding_{2};
673  bool started_{false};
674 };
675 
676 template <class Response>
678  public:
679  template <class Request>
680  static void Create(
681  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
682  ClientContext* context, const Request* request,
684  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
685 
688  call.call(), sizeof(ClientCallbackReaderImpl<Response>)))
689  ClientCallbackReaderImpl<Response>(call, context, request, reactor);
690  }
691 };
692 
693 template <class Request>
696  public:
697  // always allocated against a call arena, no memory free required
698  static void operator delete(void* ptr, std::size_t size) {
699  assert(size == sizeof(ClientCallbackWriterImpl));
700  }
701 
702  // This operator should never be called as the memory should be freed as part
703  // of the arena destruction. It only exists to provide a matching operator
704  // delete to the operator new so that some compilers will not complain (see
705  // https://github.com/grpc/grpc/issues/11301) Note at the time of adding this
706  // there are no tests catching the compiler warning.
707  static void operator delete(void*, void*) { assert(0); }
708 
709  void MaybeFinish() {
710  if (--callbacks_outstanding_ == 0) {
711  Status s = std::move(finish_status_);
712  auto* reactor = reactor_;
713  auto* call = call_.call();
714  this->~ClientCallbackWriterImpl();
716  reactor->OnDone(s);
717  }
718  }
719 
720  void StartCall() override {
721  // This call initiates two batches, plus any backlog, each with a callback
722  // 1. Send initial metadata (unless corked) + recv initial metadata
723  // 2. Any backlog
724  // 3. Recv trailing metadata, on_completion callback
725  started_ = true;
726 
727  start_tag_.Set(call_.call(),
728  [this](bool ok) {
729  reactor_->OnReadInitialMetadataDone(ok);
730  MaybeFinish();
731  },
732  &start_ops_);
733  if (!start_corked_) {
734  start_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
735  context_->initial_metadata_flags());
736  }
737  start_ops_.RecvInitialMetadata(context_);
738  start_ops_.set_core_cq_tag(&start_tag_);
739  call_.PerformOps(&start_ops_);
740 
741  // Also set up the read and write tags so that they don't have to be set up
742  // each time
743  write_tag_.Set(call_.call(),
744  [this](bool ok) {
745  reactor_->OnWriteDone(ok);
746  MaybeFinish();
747  },
748  &write_ops_);
749  write_ops_.set_core_cq_tag(&write_tag_);
750 
751  if (write_ops_at_start_) {
752  call_.PerformOps(&write_ops_);
753  }
754 
755  if (writes_done_ops_at_start_) {
756  call_.PerformOps(&writes_done_ops_);
757  }
758 
759  finish_tag_.Set(call_.call(), [this](bool ok) { MaybeFinish(); },
760  &finish_ops_);
761  finish_ops_.ClientRecvStatus(context_, &finish_status_);
762  finish_ops_.set_core_cq_tag(&finish_tag_);
763  call_.PerformOps(&finish_ops_);
764  }
765 
766  void Write(const Request* msg, WriteOptions options) override {
767  if (start_corked_) {
768  write_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
769  context_->initial_metadata_flags());
770  start_corked_ = false;
771  }
772 
773  if (options.is_last_message()) {
774  options.set_buffer_hint();
775  write_ops_.ClientSendClose();
776  }
777  // TODO(vjpai): don't assert
778  GPR_CODEGEN_ASSERT(write_ops_.SendMessagePtr(msg, options).ok());
779  callbacks_outstanding_++;
780  if (started_) {
781  call_.PerformOps(&write_ops_);
782  } else {
783  write_ops_at_start_ = true;
784  }
785  }
786  void WritesDone() override {
787  if (start_corked_) {
788  writes_done_ops_.SendInitialMetadata(&context_->send_initial_metadata_,
789  context_->initial_metadata_flags());
790  start_corked_ = false;
791  }
792  writes_done_ops_.ClientSendClose();
793  writes_done_tag_.Set(call_.call(),
794  [this](bool ok) {
795  reactor_->OnWritesDoneDone(ok);
796  MaybeFinish();
797  },
798  &writes_done_ops_);
799  writes_done_ops_.set_core_cq_tag(&writes_done_tag_);
800  callbacks_outstanding_++;
801  if (started_) {
802  call_.PerformOps(&writes_done_ops_);
803  } else {
804  writes_done_ops_at_start_ = true;
805  }
806  }
807 
808  virtual void AddHold(int holds) override { callbacks_outstanding_ += holds; }
809  virtual void RemoveHold() override { MaybeFinish(); }
810 
811  private:
812  friend class ClientCallbackWriterFactory<Request>;
813 
814  template <class Response>
816  Call call, ClientContext* context, Response* response,
818  : context_(context),
819  call_(call),
820  reactor_(reactor),
821  start_corked_(context_->initial_metadata_corked_) {
822  this->BindReactor(reactor);
823  finish_ops_.RecvMessage(response);
824  finish_ops_.AllowNoMessage();
825  }
826 
827  ClientContext* context_;
828  Call call_;
830 
832  CallbackWithSuccessTag start_tag_;
833  bool start_corked_;
834 
836  CallbackWithSuccessTag finish_tag_;
837  Status finish_status_;
838 
840  write_ops_;
841  CallbackWithSuccessTag write_tag_;
842  bool write_ops_at_start_{false};
843 
845  CallbackWithSuccessTag writes_done_tag_;
846  bool writes_done_ops_at_start_{false};
847 
848  // Minimum of 2 callbacks to pre-register for start and finish
849  std::atomic_int callbacks_outstanding_{2};
850  bool started_{false};
851 };
852 
853 template <class Request>
855  public:
856  template <class Response>
857  static void Create(
858  ChannelInterface* channel, const ::grpc::internal::RpcMethod& method,
859  ClientContext* context, Response* response,
861  Call call = channel->CreateCall(method, context, channel->CallbackCQ());
862 
865  call.call(), sizeof(ClientCallbackWriterImpl<Request>)))
866  ClientCallbackWriterImpl<Request>(call, context, response, reactor);
867  }
868 };
869 
870 } // namespace internal
871 } // namespace grpc
872 
873 #endif // GRPCPP_IMPL_CODEGEN_CLIENT_CALLBACK_H
virtual void AddHold(int holds) override
Definition: client_callback.h:637
virtual ~ClientCallbackReaderWriter()
Definition: client_callback.h:110
void StartCall() override
Definition: client_callback.h:589
virtual ~ClientWriteReactor()
Definition: client_callback.h:322
virtual void OnReadInitialMetadataDone(bool ok)
Definition: client_callback.h:339
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:144
virtual void grpc_call_ref(grpc_call *call)=0
virtual ~ClientCallbackReader()
Definition: client_callback.h:127
void AddHold()
Holds are needed if (and only if) this stream has operations that take place on it after StartCall bu...
Definition: client_callback.h:246
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
virtual void RemoveHold() override
Definition: client_callback.h:500
ClientReadReactor is the interface for a server-streaming RPC.
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:857
Primary implementation of CallOpSetInterface.
Definition: call_op_set.h:828
virtual ~ClientReadReactor()
Definition: client_callback.h:298
virtual void grpc_call_unref(grpc_call *call)=0
void WritesDone() override
Definition: client_callback.h:786
void StartRead(Response *resp)
Definition: client_callback.h:301
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:144
void StartCall() override
Definition: client_callback.h:389
void Read(Response *msg) override
Definition: client_callback.h:447
Definition: channel_interface.h:46
void RemoveHold()
Definition: client_callback.h:248
static void Create(ChannelInterface *channel, const ::grpc::internal::RpcMethod &method, ClientContext *context, ::grpc::experimental::ClientBidiReactor< Request, Response > *reactor)
Definition: client_callback.h:548
grpc_call * call() const
Definition: call.h:70
void WriteLast(const Request *req, WriteOptions options)
Definition: client_callback.h:146
void StartWritesDone()
Indicate that the RPC will have no more write operations.
Definition: client_callback.h:223
virtual void OnWriteDone(bool ok)
Definition: client_callback.h:340
virtual void OnDone(const Status &s)
Definition: client_callback.h:338
A ClientContext allows the person implementing a service client to:
Definition: client_context.h:174
void Read(Response *msg) override
Definition: client_callback.h:627
static void Create(ChannelInterface *channel, const ::grpc::internal::RpcMethod &method, ClientContext *context, const Request *request, ::grpc::experimental::ClientReadReactor< Response > *reactor)
Definition: client_callback.h:680
virtual ~ClientCallbackWriter()
Definition: client_callback.h:142
virtual void RemoveHold() override
Definition: client_callback.h:809
virtual void OnDone(const Status &s)
Definition: client_callback.h:307
Descriptor of an RPC method.
Definition: rpc_method.h:29
void StartWrite(const Request *req, WriteOptions options)
Initiate/post a write operation with specified options.
Definition: client_callback.h:201
void AddMultipleHolds(int holds)
Definition: client_callback.h:247
virtual void AddHold(int holds) override
Definition: client_callback.h:808
Definition: client_callback.h:125
Definition: call_op_set.h:224
void StartWrite(const Request *req)
Initiate a write operation (or post it for later initiation if StartCall has not yet been invoked)...
Definition: client_callback.h:193
void Write(const Request *msg, WriteOptions options) override
Definition: client_callback.h:766
Definition: call_op_set.h:703
virtual void OnReadDone(bool ok)
Definition: client_callback.h:309
void StartWriteLast(const Request *req, WriteOptions options)
Definition: client_callback.h:329
Definition: call_op_set.h:294
virtual ~ClientBidiReactor()
Definition: client_callback.h:172
void StartWrite(const Request *req, WriteOptions options)
Definition: client_callback.h:326
void WritesDone() override
Definition: client_callback.h:477
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
void StartRead(Response *resp)
Initiate a read operation (or post it for later initiation if StartCall has not yet been invoked)...
Definition: client_callback.h:185
ClientWriteReactor is the interface for a client-streaming RPC.
Definition: client_callback.h:102
virtual void OnWritesDoneDone(bool ok)
Notifies the application that a StartWritesDone operation completed.
Definition: client_callback.h:283
void StartCall()
Activate the RPC and initiate any reads or writes that have been Start&#39;ed before this call...
Definition: client_callback.h:178
Codegen interface for grpc::Channel.
Definition: channel_interface.h:65
Definition: client_callback.h:362
virtual void AddHold(int holds) override
Definition: client_callback.h:499
CoreCodegenInterface * g_core_codegen_interface
Definition: call_op_set.h:51
virtual void RemoveHold() override
Definition: client_callback.h:638
void MaybeFinish()
Definition: client_callback.h:378
ClientBidiReactor is the interface for a bidirectional streaming RPC.
Definition: client_callback.h:98
void AddMultipleHolds(int holds)
Definition: client_callback.h:335
virtual void OnWritesDoneDone(bool ok)
Definition: client_callback.h:341
Definition: byte_buffer.h:41
Per-message write options.
Definition: call_op_set.h:86
Definition: client_callback.h:694
void MaybeFinish()
Definition: client_callback.h:709
Definition: channel_interface.h:58
void StartWritesDone()
Definition: client_callback.h:332
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:457
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:720
Definition: client_callback.h:140
void StartCall()
Definition: client_callback.h:300
virtual void OnDone(const Status &s)
Notifies the application that all operations associated with this RPC have completed and provides the...
Definition: client_callback.h:254
void AddMultipleHolds(int holds)
Definition: client_callback.h:304
Did it work? If it didn&#39;t, why?
Definition: status.h:31
virtual void OnReadDone(bool ok)
Notifies the application that a StartRead operation completed.
Definition: client_callback.h:269
void BindReactor(ClientBidiReactor< Request, Response > *reactor)
Definition: client_callback.h:119
Definition: callback_common.h:68
virtual void OnWriteDone(bool ok)
Notifies the application that a StartWrite operation completed.
Definition: client_callback.h:275
void AddHold()
Definition: client_callback.h:334
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:563
void RemoveHold()
Definition: client_callback.h:336
Definition: call_op_set.h:751
void BindReactor(ClientReadReactor< Response > *reactor)
Definition: client_callback.h:134
void AddHold()
Definition: client_callback.h:303
void StartWriteLast(const Request *req, WriteOptions options)
Initiate/post a write operation with specified options and an indication that this is the last write ...
Definition: client_callback.h:214
void MaybeFinish()
Definition: client_callback.h:578
virtual void OnReadInitialMetadataDone(bool ok)
Notifies the application that a read of initial metadata from the server is done. ...
Definition: client_callback.h:263
void BindReactor(ClientWriteReactor< Request > *reactor)
Definition: client_callback.h:155
void RemoveHold()
Definition: client_callback.h:305
virtual void OnReadInitialMetadataDone(bool ok)
Definition: client_callback.h:308
void StartWrite(const Request *req)
Definition: client_callback.h:325
Straightforward wrapping of the C call object.
Definition: call.h:36
void StartCall()
Definition: client_callback.h:324
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