GRPC C++  1.36.1
server_callback.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2019 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 #ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
19 #define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
20 
21 #include <atomic>
22 #include <functional>
23 #include <type_traits>
24 
32 
33 namespace grpc {
34 
35 // Declare base class of all reactors as internal
36 namespace internal {
37 
38 // Forward declarations
39 template <class Request, class Response>
40 class CallbackUnaryHandler;
41 template <class Request, class Response>
43 template <class Request, class Response>
45 template <class Request, class Response>
47 
49  public:
50  virtual ~ServerReactor() = default;
51  virtual void OnDone() = 0;
52  virtual void OnCancel() = 0;
53 
54  // The following is not API. It is for internal use only and specifies whether
55  // all reactions of this Reactor can be run without an extra executor
56  // scheduling. This should only be used for internally-defined reactors with
57  // trivial reactions.
58  virtual bool InternalInlineable() { return false; }
59 
60  private:
61  template <class Request, class Response>
62  friend class CallbackUnaryHandler;
63  template <class Request, class Response>
65  template <class Request, class Response>
67  template <class Request, class Response>
68  friend class CallbackBidiHandler;
69 };
70 
73  public:
74  virtual ~ServerCallbackCall() {}
75 
76  // This object is responsible for tracking when it is safe to call OnDone and
77  // OnCancel. OnDone should not be called until the method handler is complete,
78  // Finish has been called, the ServerContext CompletionOp (which tracks
79  // cancellation or successful completion) has completed, and all outstanding
80  // Read/Write actions have seen their reactions. OnCancel should not be called
81  // until after the method handler is done and the RPC has completed with a
82  // cancellation. This is tracked by counting how many of these conditions have
83  // been met and calling OnCancel when none remain unmet.
84 
85  // Public versions of MaybeDone: one where we don't know the reactor in
86  // advance (used for the ServerContext CompletionOp), and one for where we
87  // know the inlineability of the OnDone reaction. You should set the inline
88  // flag to true if either the Reactor is InternalInlineable() or if this
89  // callback is already being forced to run dispatched to an executor
90  // (typically because it contains additional work than just the MaybeDone).
91 
92  void MaybeDone() {
93  if (GPR_UNLIKELY(Unref() == 1)) {
94  ScheduleOnDone(reactor()->InternalInlineable());
95  }
96  }
97 
98  void MaybeDone(bool inline_ondone) {
99  if (GPR_UNLIKELY(Unref() == 1)) {
100  ScheduleOnDone(inline_ondone);
101  }
102  }
103 
104  // Fast version called with known reactor passed in, used from derived
105  // classes, typically in non-cancel case
107  if (GPR_UNLIKELY(UnblockCancellation())) {
108  CallOnCancel(reactor);
109  }
110  }
111 
112  // Slower version called from object that doesn't know the reactor a priori
113  // (such as the ServerContext CompletionOp which is formed before the
114  // reactor). This is used in cancel cases only, so it's ok to be slower and
115  // invoke a virtual function.
117  if (GPR_UNLIKELY(UnblockCancellation())) {
118  CallOnCancel(reactor());
119  }
120  }
121 
122  protected:
124  void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); }
125 
126  private:
127  virtual ServerReactor* reactor() = 0;
128 
129  // CallOnDone performs the work required at completion of the RPC: invoking
130  // the OnDone function and doing all necessary cleanup. This function is only
131  // ever invoked on a fully-Unref'fed ServerCallbackCall.
132  virtual void CallOnDone() = 0;
133 
134  // If the OnDone reaction is inlineable, execute it inline. Otherwise send it
135  // to an executor.
136  void ScheduleOnDone(bool inline_ondone);
137 
138  // If the OnCancel reaction is inlineable, execute it inline. Otherwise send
139  // it to an executor.
140  void CallOnCancel(ServerReactor* reactor);
141 
142  // Implement the cancellation constraint counter. Return true if OnCancel
143  // should be called, false otherwise.
144  bool UnblockCancellation() {
145  return on_cancel_conditions_remaining_.fetch_sub(
146  1, std::memory_order_acq_rel) == 1;
147  }
148 
150  int Unref() {
151  return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel);
152  }
153 
154  std::atomic_int on_cancel_conditions_remaining_{2};
155  std::atomic_int callbacks_outstanding_{
156  3}; // reserve for start, Finish, and CompletionOp
157 };
158 
159 template <class Request, class Response>
161  : public ::grpc::experimental::MessageHolder<Request, Response> {
162  public:
164  this->set_request(&request_obj_);
165  this->set_response(&response_obj_);
166  }
167  void Release() override {
168  // the object is allocated in the call arena.
170  }
171 
172  private:
173  Request request_obj_;
174  Response response_obj_;
175 };
176 
177 } // namespace internal
178 
179 // Forward declarations
180 class ServerUnaryReactor;
181 template <class Request>
183 template <class Response>
185 template <class Request, class Response>
187 
188 // NOTE: The actual call/stream object classes are provided as API only to
189 // support mocking. There are no implementations of these class interfaces in
190 // the API.
192  public:
193  ~ServerCallbackUnary() override {}
194  virtual void Finish(::grpc::Status s) = 0;
195  virtual void SendInitialMetadata() = 0;
196 
197  protected:
198  // Use a template rather than explicitly specifying ServerUnaryReactor to
199  // delay binding and avoid a circular forward declaration issue
200  template <class Reactor>
201  void BindReactor(Reactor* reactor) {
202  reactor->InternalBindCall(this);
203  }
204 };
205 
206 template <class Request>
208  public:
209  ~ServerCallbackReader() override {}
210  virtual void Finish(::grpc::Status s) = 0;
211  virtual void SendInitialMetadata() = 0;
212  virtual void Read(Request* msg) = 0;
213 
214  protected:
216  reactor->InternalBindReader(this);
217  }
218 };
219 
220 template <class Response>
222  public:
223  ~ServerCallbackWriter() override {}
224 
225  virtual void Finish(::grpc::Status s) = 0;
226  virtual void SendInitialMetadata() = 0;
227  virtual void Write(const Response* msg, ::grpc::WriteOptions options) = 0;
228  virtual void WriteAndFinish(const Response* msg, ::grpc::WriteOptions options,
229  ::grpc::Status s) = 0;
230 
231  protected:
233  reactor->InternalBindWriter(this);
234  }
235 };
236 
237 template <class Request, class Response>
239  public:
241 
242  virtual void Finish(::grpc::Status s) = 0;
243  virtual void SendInitialMetadata() = 0;
244  virtual void Read(Request* msg) = 0;
245  virtual void Write(const Response* msg, ::grpc::WriteOptions options) = 0;
246  virtual void WriteAndFinish(const Response* msg, ::grpc::WriteOptions options,
247  ::grpc::Status s) = 0;
248 
249  protected:
251  reactor->InternalBindStream(this);
252  }
253 };
254 
255 // The following classes are the reactor interfaces that are to be implemented
256 // by the user, returned as the output parameter of the method handler for a
257 // callback method. Note that none of the classes are pure; all reactions have a
258 // default empty reaction so that the user class only needs to override those
259 // classes that it cares about.
260 
262 template <class Request, class Response>
263 class ServerBidiReactor : public internal::ServerReactor {
264  public:
265  // NOTE: Initializing stream_ as a constructor initializer rather than a
266  // default initializer because gcc-4.x requires a copy constructor for
267  // default initializing a templated member, which isn't ok for atomic.
268  // TODO(vjpai): Switch to default constructor and default initializer when
269  // gcc-4.x is no longer supported
270  ServerBidiReactor() : stream_(nullptr) {}
271  ~ServerBidiReactor() override = default;
272 
278  stream_.load(std::memory_order_acquire);
279  if (stream == nullptr) {
280  grpc::internal::MutexLock l(&stream_mu_);
281  stream = stream_.load(std::memory_order_relaxed);
282  if (stream == nullptr) {
283  backlog_.send_initial_metadata_wanted = true;
284  return;
285  }
286  }
287  stream->SendInitialMetadata();
288  }
289 
294  void StartRead(Request* req) {
296  stream_.load(std::memory_order_acquire);
297  if (stream == nullptr) {
298  grpc::internal::MutexLock l(&stream_mu_);
299  stream = stream_.load(std::memory_order_relaxed);
300  if (stream == nullptr) {
301  backlog_.read_wanted = req;
302  return;
303  }
304  }
305  stream->Read(req);
306  }
307 
313  void StartWrite(const Response* resp) {
314  StartWrite(resp, ::grpc::WriteOptions());
315  }
316 
323  void StartWrite(const Response* resp, ::grpc::WriteOptions options) {
325  stream_.load(std::memory_order_acquire);
326  if (stream == nullptr) {
327  grpc::internal::MutexLock l(&stream_mu_);
328  stream = stream_.load(std::memory_order_relaxed);
329  if (stream == nullptr) {
330  backlog_.write_wanted = resp;
331  backlog_.write_options_wanted = options;
332  return;
333  }
334  }
335  stream->Write(resp, options);
336  }
337 
351  void StartWriteAndFinish(const Response* resp, ::grpc::WriteOptions options,
352  ::grpc::Status s) {
354  stream_.load(std::memory_order_acquire);
355  if (stream == nullptr) {
356  grpc::internal::MutexLock l(&stream_mu_);
357  stream = stream_.load(std::memory_order_relaxed);
358  if (stream == nullptr) {
359  backlog_.write_and_finish_wanted = true;
360  backlog_.write_wanted = resp;
361  backlog_.write_options_wanted = options;
362  backlog_.status_wanted = std::move(s);
363  return;
364  }
365  }
366  stream->WriteAndFinish(resp, options, std::move(s));
367  }
368 
377  void StartWriteLast(const Response* resp, ::grpc::WriteOptions options) {
378  StartWrite(resp, options.set_last_message());
379  }
380 
387  void Finish(::grpc::Status s) {
389  stream_.load(std::memory_order_acquire);
390  if (stream == nullptr) {
391  grpc::internal::MutexLock l(&stream_mu_);
392  stream = stream_.load(std::memory_order_relaxed);
393  if (stream == nullptr) {
394  backlog_.finish_wanted = true;
395  backlog_.status_wanted = std::move(s);
396  return;
397  }
398  }
399  stream->Finish(std::move(s));
400  }
401 
408  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
409 
414  virtual void OnReadDone(bool /*ok*/) {}
415 
421  virtual void OnWriteDone(bool /*ok*/) {}
422 
426  void OnDone() override = 0;
427 
431  void OnCancel() override {}
432 
433  private:
434  friend class ServerCallbackReaderWriter<Request, Response>;
435  // May be overridden by internal implementation details. This is not a public
436  // customization point.
437  virtual void InternalBindStream(
439  grpc::internal::MutexLock l(&stream_mu_);
440 
441  if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
442  stream->SendInitialMetadata();
443  }
444  if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) {
445  stream->Read(backlog_.read_wanted);
446  }
447  if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) {
448  stream->WriteAndFinish(backlog_.write_wanted,
449  std::move(backlog_.write_options_wanted),
450  std::move(backlog_.status_wanted));
451  } else {
452  if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) {
453  stream->Write(backlog_.write_wanted,
454  std::move(backlog_.write_options_wanted));
455  }
456  if (GPR_UNLIKELY(backlog_.finish_wanted)) {
457  stream->Finish(std::move(backlog_.status_wanted));
458  }
459  }
460  // Set stream_ last so that other functions can use it lock-free
461  stream_.store(stream, std::memory_order_release);
462  }
463 
464  grpc::internal::Mutex stream_mu_;
465  // TODO(vjpai): Make stream_or_backlog_ into a std::variant or absl::variant
466  // once C++17 or ABSL is supported since stream and backlog are
467  // mutually exclusive in this class. Do likewise with the
468  // remaining reactor classes and their backlogs as well.
469  std::atomic<ServerCallbackReaderWriter<Request, Response>*> stream_{nullptr};
470  struct PreBindBacklog {
471  bool send_initial_metadata_wanted = false;
472  bool write_and_finish_wanted = false;
473  bool finish_wanted = false;
474  Request* read_wanted = nullptr;
475  const Response* write_wanted = nullptr;
476  ::grpc::WriteOptions write_options_wanted;
477  ::grpc::Status status_wanted;
478  };
479  PreBindBacklog backlog_ /* GUARDED_BY(stream_mu_) */;
480 };
481 
483 template <class Request>
484 class ServerReadReactor : public internal::ServerReactor {
485  public:
486  ServerReadReactor() : reader_(nullptr) {}
487  ~ServerReadReactor() override = default;
488 
492  reader_.load(std::memory_order_acquire);
493  if (reader == nullptr) {
494  grpc::internal::MutexLock l(&reader_mu_);
495  reader = reader_.load(std::memory_order_relaxed);
496  if (reader == nullptr) {
497  backlog_.send_initial_metadata_wanted = true;
498  return;
499  }
500  }
501  reader->SendInitialMetadata();
502  }
503  void StartRead(Request* req) {
505  reader_.load(std::memory_order_acquire);
506  if (reader == nullptr) {
507  grpc::internal::MutexLock l(&reader_mu_);
508  reader = reader_.load(std::memory_order_relaxed);
509  if (reader == nullptr) {
510  backlog_.read_wanted = req;
511  return;
512  }
513  }
514  reader->Read(req);
515  }
516  void Finish(::grpc::Status s) {
518  reader_.load(std::memory_order_acquire);
519  if (reader == nullptr) {
520  grpc::internal::MutexLock l(&reader_mu_);
521  reader = reader_.load(std::memory_order_relaxed);
522  if (reader == nullptr) {
523  backlog_.finish_wanted = true;
524  backlog_.status_wanted = std::move(s);
525  return;
526  }
527  }
528  reader->Finish(std::move(s));
529  }
530 
532  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
533  virtual void OnReadDone(bool /*ok*/) {}
534  void OnDone() override = 0;
535  void OnCancel() override {}
536 
537  private:
538  friend class ServerCallbackReader<Request>;
539 
540  // May be overridden by internal implementation details. This is not a public
541  // customization point.
542  virtual void InternalBindReader(ServerCallbackReader<Request>* reader) {
543  grpc::internal::MutexLock l(&reader_mu_);
544 
545  if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
546  reader->SendInitialMetadata();
547  }
548  if (GPR_UNLIKELY(backlog_.read_wanted != nullptr)) {
549  reader->Read(backlog_.read_wanted);
550  }
551  if (GPR_UNLIKELY(backlog_.finish_wanted)) {
552  reader->Finish(std::move(backlog_.status_wanted));
553  }
554  // Set reader_ last so that other functions can use it lock-free
555  reader_.store(reader, std::memory_order_release);
556  }
557 
558  grpc::internal::Mutex reader_mu_;
559  std::atomic<ServerCallbackReader<Request>*> reader_{nullptr};
560  struct PreBindBacklog {
561  bool send_initial_metadata_wanted = false;
562  bool finish_wanted = false;
563  Request* read_wanted = nullptr;
564  ::grpc::Status status_wanted;
565  };
566  PreBindBacklog backlog_ /* GUARDED_BY(reader_mu_) */;
567 };
568 
570 template <class Response>
571 class ServerWriteReactor : public internal::ServerReactor {
572  public:
573  ServerWriteReactor() : writer_(nullptr) {}
574  ~ServerWriteReactor() override = default;
575 
579  writer_.load(std::memory_order_acquire);
580  if (writer == nullptr) {
581  grpc::internal::MutexLock l(&writer_mu_);
582  writer = writer_.load(std::memory_order_relaxed);
583  if (writer == nullptr) {
584  backlog_.send_initial_metadata_wanted = true;
585  return;
586  }
587  }
588  writer->SendInitialMetadata();
589  }
590  void StartWrite(const Response* resp) {
591  StartWrite(resp, ::grpc::WriteOptions());
592  }
593  void StartWrite(const Response* resp, ::grpc::WriteOptions options) {
595  writer_.load(std::memory_order_acquire);
596  if (writer == nullptr) {
597  grpc::internal::MutexLock l(&writer_mu_);
598  writer = writer_.load(std::memory_order_relaxed);
599  if (writer == nullptr) {
600  backlog_.write_wanted = resp;
601  backlog_.write_options_wanted = options;
602  return;
603  }
604  }
605  writer->Write(resp, options);
606  }
607  void StartWriteAndFinish(const Response* resp, ::grpc::WriteOptions options,
608  ::grpc::Status s) {
610  writer_.load(std::memory_order_acquire);
611  if (writer == nullptr) {
612  grpc::internal::MutexLock l(&writer_mu_);
613  writer = writer_.load(std::memory_order_relaxed);
614  if (writer == nullptr) {
615  backlog_.write_and_finish_wanted = true;
616  backlog_.write_wanted = resp;
617  backlog_.write_options_wanted = options;
618  backlog_.status_wanted = std::move(s);
619  return;
620  }
621  }
622  writer->WriteAndFinish(resp, options, std::move(s));
623  }
624  void StartWriteLast(const Response* resp, ::grpc::WriteOptions options) {
625  StartWrite(resp, options.set_last_message());
626  }
627  void Finish(::grpc::Status s) {
629  writer_.load(std::memory_order_acquire);
630  if (writer == nullptr) {
631  grpc::internal::MutexLock l(&writer_mu_);
632  writer = writer_.load(std::memory_order_relaxed);
633  if (writer == nullptr) {
634  backlog_.finish_wanted = true;
635  backlog_.status_wanted = std::move(s);
636  return;
637  }
638  }
639  writer->Finish(std::move(s));
640  }
641 
643  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
644  virtual void OnWriteDone(bool /*ok*/) {}
645  void OnDone() override = 0;
646  void OnCancel() override {}
647 
648  private:
649  friend class ServerCallbackWriter<Response>;
650  // May be overridden by internal implementation details. This is not a public
651  // customization point.
652  virtual void InternalBindWriter(ServerCallbackWriter<Response>* writer) {
653  grpc::internal::MutexLock l(&writer_mu_);
654 
655  if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
656  writer->SendInitialMetadata();
657  }
658  if (GPR_UNLIKELY(backlog_.write_and_finish_wanted)) {
659  writer->WriteAndFinish(backlog_.write_wanted,
660  std::move(backlog_.write_options_wanted),
661  std::move(backlog_.status_wanted));
662  } else {
663  if (GPR_UNLIKELY(backlog_.write_wanted != nullptr)) {
664  writer->Write(backlog_.write_wanted,
665  std::move(backlog_.write_options_wanted));
666  }
667  if (GPR_UNLIKELY(backlog_.finish_wanted)) {
668  writer->Finish(std::move(backlog_.status_wanted));
669  }
670  }
671  // Set writer_ last so that other functions can use it lock-free
672  writer_.store(writer, std::memory_order_release);
673  }
674 
675  grpc::internal::Mutex writer_mu_;
676  std::atomic<ServerCallbackWriter<Response>*> writer_{nullptr};
677  struct PreBindBacklog {
678  bool send_initial_metadata_wanted = false;
679  bool write_and_finish_wanted = false;
680  bool finish_wanted = false;
681  const Response* write_wanted = nullptr;
682  ::grpc::WriteOptions write_options_wanted;
683  ::grpc::Status status_wanted;
684  };
685  PreBindBacklog backlog_ /* GUARDED_BY(writer_mu_) */;
686 };
687 
689  public:
690  ServerUnaryReactor() : call_(nullptr) {}
691  ~ServerUnaryReactor() override = default;
692 
695  ServerCallbackUnary* call = call_.load(std::memory_order_acquire);
696  if (call == nullptr) {
697  grpc::internal::MutexLock l(&call_mu_);
698  call = call_.load(std::memory_order_relaxed);
699  if (call == nullptr) {
700  backlog_.send_initial_metadata_wanted = true;
701  return;
702  }
703  }
704  call->SendInitialMetadata();
705  }
709  void Finish(::grpc::Status s) {
710  ServerCallbackUnary* call = call_.load(std::memory_order_acquire);
711  if (call == nullptr) {
712  grpc::internal::MutexLock l(&call_mu_);
713  call = call_.load(std::memory_order_relaxed);
714  if (call == nullptr) {
715  backlog_.finish_wanted = true;
716  backlog_.status_wanted = std::move(s);
717  return;
718  }
719  }
720  call->Finish(std::move(s));
721  }
722 
724  virtual void OnSendInitialMetadataDone(bool /*ok*/) {}
725  void OnDone() override = 0;
726  void OnCancel() override {}
727 
728  private:
729  friend class ServerCallbackUnary;
730  // May be overridden by internal implementation details. This is not a public
731  // customization point.
732  virtual void InternalBindCall(ServerCallbackUnary* call) {
733  grpc::internal::MutexLock l(&call_mu_);
734 
735  if (GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
736  call->SendInitialMetadata();
737  }
738  if (GPR_UNLIKELY(backlog_.finish_wanted)) {
739  call->Finish(std::move(backlog_.status_wanted));
740  }
741  // Set call_ last so that other functions can use it lock-free
742  call_.store(call, std::memory_order_release);
743  }
744 
745  grpc::internal::Mutex call_mu_;
746  std::atomic<ServerCallbackUnary*> call_{nullptr};
747  struct PreBindBacklog {
748  bool send_initial_metadata_wanted = false;
749  bool finish_wanted = false;
750  ::grpc::Status status_wanted;
751  };
752  PreBindBacklog backlog_ /* GUARDED_BY(call_mu_) */;
753 };
754 
755 namespace internal {
756 
757 template <class Base>
758 class FinishOnlyReactor : public Base {
759  public:
760  explicit FinishOnlyReactor(::grpc::Status s) { this->Finish(std::move(s)); }
761  void OnDone() override { this->~FinishOnlyReactor(); }
762 };
763 
765 template <class Request>
767 template <class Response>
770 template <class Request, class Response>
773 
774 } // namespace internal
775 
776 // TODO(vjpai): Remove namespace experimental when de-experimentalized fully.
777 namespace experimental {
778 
779 template <class Request>
781 
782 template <class Response>
784 
785 template <class Request, class Response>
787 
789 
790 } // namespace experimental
791 
792 } // namespace grpc
793 
794 #endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
grpc::ServerReadReactor
ServerReadReactor is the interface for a client-streaming RPC.
Definition: server_callback.h:182
grpc::ServerReadReactor::Finish
void Finish(::grpc::Status s)
Definition: server_callback.h:516
grpc::ServerCallbackReaderWriter::SendInitialMetadata
virtual void SendInitialMetadata()=0
grpc::ServerCallbackReader::~ServerCallbackReader
~ServerCallbackReader() override
Definition: server_callback.h:209
grpc::ServerWriteReactor::StartWriteAndFinish
void StartWriteAndFinish(const Response *resp, ::grpc::WriteOptions options, ::grpc::Status s)
Definition: server_callback.h:607
grpc::ServerReadReactor::OnCancel
void OnCancel() override
Definition: server_callback.h:535
grpc::ServerReadReactor::ServerReadReactor
ServerReadReactor()
Definition: server_callback.h:486
grpc::ServerReadReactor::OnDone
void OnDone() override=0
grpc::ServerWriteReactor::StartWrite
void StartWrite(const Response *resp)
Definition: server_callback.h:590
grpc::experimental::MessageHolder< Request, Response >::set_request
void set_request(Request *request)
Definition: message_allocator.h:52
grpc
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm.h:33
grpc::ServerUnaryReactor::OnDone
void OnDone() override=0
status.h
grpc::ServerCallbackUnary::Finish
virtual void Finish(::grpc::Status s)=0
grpc::WriteOptions::set_last_message
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:156
grpc::ServerReadReactor::StartRead
void StartRead(Request *req)
Definition: server_callback.h:503
grpc::internal::ServerReactor::~ServerReactor
virtual ~ServerReactor()=default
grpc::internal::ServerCallbackCall::MaybeCallOnCancel
void MaybeCallOnCancel()
Definition: server_callback.h:116
grpc::ServerCallbackWriter::Finish
virtual void Finish(::grpc::Status s)=0
config.h
grpc::ServerWriteReactor::OnWriteDone
virtual void OnWriteDone(bool)
Definition: server_callback.h:644
grpc::ServerBidiReactor::ServerBidiReactor
ServerBidiReactor()
Definition: server_callback.h:270
grpc::ServerWriteReactor::OnSendInitialMetadataDone
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:643
grpc::ServerBidiReactor::StartRead
void StartRead(Request *req)
Initiate a read operation.
Definition: server_callback.h:294
grpc::internal::DefaultMessageHolder::DefaultMessageHolder
DefaultMessageHolder()
Definition: server_callback.h:163
grpc::ServerCallbackReaderWriter::~ServerCallbackReaderWriter
~ServerCallbackReaderWriter() override
Definition: server_callback.h:240
core_codegen_interface.h
grpc::ServerBidiReactor::StartWriteAndFinish
void StartWriteAndFinish(const Response *resp, ::grpc::WriteOptions options, ::grpc::Status s)
Initiate a write operation with specified options and final RPC Status, which also causes any trailin...
Definition: server_callback.h:351
grpc::ServerCallbackUnary::BindReactor
void BindReactor(Reactor *reactor)
Definition: server_callback.h:201
grpc::internal::ServerCallbackCall::MaybeCallOnCancel
void MaybeCallOnCancel(ServerReactor *reactor)
Definition: server_callback.h:106
grpc::experimental::ServerReadReactor
::grpc::ServerReadReactor< Request > ServerReadReactor
Definition: server_callback.h:780
grpc::ServerReadReactor::~ServerReadReactor
~ServerReadReactor() override=default
grpc::ServerCallbackReaderWriter
Definition: server_callback.h:238
grpc::ServerBidiReactor::StartWrite
void StartWrite(const Response *resp)
Initiate a write operation.
Definition: server_callback.h:313
grpc::ServerBidiReactor::OnCancel
void OnCancel() override
Notifies the application that this RPC has been cancelled.
Definition: server_callback.h:431
grpc::Status
Did it work? If it didn't, why?
Definition: status.h:31
grpc::ServerCallbackReaderWriter::WriteAndFinish
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)=0
grpc::ServerWriteReactor::OnDone
void OnDone() override=0
grpc::ServerCallbackUnary::~ServerCallbackUnary
~ServerCallbackUnary() override
Definition: server_callback.h:193
grpc::ServerUnaryReactor::OnSendInitialMetadataDone
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:724
grpc::ServerBidiReactor::StartWrite
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Initiate a write operation with specified options.
Definition: server_callback.h:323
grpc::internal::ServerCallbackCall
The base class of ServerCallbackUnary etc.
Definition: server_callback.h:72
grpc::ServerWriteReactor::StartWrite
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback.h:593
grpc::ServerBidiReactor::OnWriteDone
virtual void OnWriteDone(bool)
Notifies the application that a StartWrite (or StartWriteLast) operation completed.
Definition: server_callback.h:421
grpc::experimental::MessageHolder< Request, Response >::set_response
void set_response(Response *response)
Definition: message_allocator.h:53
GPR_UNLIKELY
#define GPR_UNLIKELY(x)
Definition: port_platform.h:653
grpc::ServerBidiReactor::OnDone
void OnDone() override=0
Notifies the application that all operations associated with this RPC have completed.
grpc::ServerBidiReactor
ServerBidiReactor is the interface for a bidirectional streaming RPC.
Definition: server_callback.h:186
grpc::internal::CallbackUnaryHandler
Definition: byte_buffer.h:40
grpc::ServerCallbackWriter::SendInitialMetadata
virtual void SendInitialMetadata()=0
grpc::ServerBidiReactor::~ServerBidiReactor
~ServerBidiReactor() override=default
grpc::ServerBidiReactor::Finish
void Finish(::grpc::Status s)
Indicate that the stream is to be finished and the trailing metadata and RPC status are to be sent.
Definition: server_callback.h:387
grpc::internal::DefaultMessageHolder
Definition: server_callback.h:160
grpc::ServerBidiReactor::OnReadDone
virtual void OnReadDone(bool)
Notifies the application that a StartRead operation completed.
Definition: server_callback.h:414
grpc::internal::ServerReactor::OnDone
virtual void OnDone()=0
grpc::internal::CallbackServerStreamingHandler
Definition: byte_buffer.h:42
grpc::ServerReadReactor::StartSendInitialMetadata
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:490
grpc::experimental::ServerWriteReactor
::grpc::ServerWriteReactor< Response > ServerWriteReactor
Definition: server_callback.h:783
grpc::ServerCallbackReaderWriter::Read
virtual void Read(Request *msg)=0
grpc::ServerCallbackReader::BindReactor
void BindReactor(ServerReadReactor< Request > *reactor)
Definition: server_callback.h:215
grpc::ServerCallbackWriter::BindReactor
void BindReactor(ServerWriteReactor< Response > *reactor)
Definition: server_callback.h:232
grpc::ServerCallbackWriter::Write
virtual void Write(const Response *msg, ::grpc::WriteOptions options)=0
grpc::internal::FinishOnlyReactor
Definition: server_callback.h:758
grpc::ServerCallbackWriter::~ServerCallbackWriter
~ServerCallbackWriter() override
Definition: server_callback.h:223
grpc::ServerCallbackReaderWriter::Finish
virtual void Finish(::grpc::Status s)=0
grpc::ServerCallbackReaderWriter::Write
virtual void Write(const Response *msg, ::grpc::WriteOptions options)=0
grpc::ServerBidiReactor::StartSendInitialMetadata
void StartSendInitialMetadata()
Send any initial metadata stored in the RPC context.
Definition: server_callback.h:276
grpc::internal::ServerCallbackCall::~ServerCallbackCall
virtual ~ServerCallbackCall()
Definition: server_callback.h:74
grpc::WriteOptions
Per-message write options.
Definition: call_op_set.h:79
grpc::ServerWriteReactor::StartSendInitialMetadata
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:577
grpc::internal::ServerCallbackCall::MaybeDone
void MaybeDone(bool inline_ondone)
Definition: server_callback.h:98
grpc::ServerWriteReactor
ServerWriteReactor is the interface for a server-streaming RPC.
Definition: server_callback.h:184
grpc::ServerReadReactor::OnReadDone
virtual void OnReadDone(bool)
Definition: server_callback.h:533
callback_common.h
grpc::ServerCallbackReader::Read
virtual void Read(Request *msg)=0
grpc::internal::CallbackBidiHandler
Definition: server_callback.h:46
grpc::internal::MutexLock
Definition: sync.h:69
grpc::ServerWriteReactor::OnCancel
void OnCancel() override
Definition: server_callback.h:646
grpc::ServerWriteReactor::~ServerWriteReactor
~ServerWriteReactor() override=default
grpc::ServerWriteReactor::Finish
void Finish(::grpc::Status s)
Definition: server_callback.h:627
grpc::ServerCallbackReaderWriter::BindReactor
void BindReactor(ServerBidiReactor< Request, Response > *reactor)
Definition: server_callback.h:250
grpc::ServerCallbackWriter
Definition: server_callback.h:221
call.h
call_op_set.h
grpc::internal::ServerReactor::InternalInlineable
virtual bool InternalInlineable()
Definition: server_callback.h:58
grpc::ServerCallbackUnary::SendInitialMetadata
virtual void SendInitialMetadata()=0
grpc::ServerReadReactor::OnSendInitialMetadataDone
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:532
grpc::internal::FinishOnlyReactor::OnDone
void OnDone() override
Definition: server_callback.h:761
grpc::experimental::ServerUnaryReactor
::grpc::ServerUnaryReactor ServerUnaryReactor
Definition: server_callback.h:788
grpc::internal::ServerReactor
Definition: server_callback.h:48
grpc::internal::CallbackClientStreamingHandler
Definition: server_callback.h:42
grpc::ServerUnaryReactor::OnCancel
void OnCancel() override
Definition: server_callback.h:726
grpc::internal::ServerCallbackCall::Ref
void Ref()
Increases the reference count.
Definition: server_callback.h:124
grpc::internal::ServerReactor::OnCancel
virtual void OnCancel()=0
grpc::ServerCallbackReader
Definition: server_callback.h:207
grpc::ServerUnaryReactor::StartSendInitialMetadata
void StartSendInitialMetadata()
StartSendInitialMetadata is exactly like ServerBidiReactor.
Definition: server_callback.h:694
grpc::ServerCallbackReader::Finish
virtual void Finish(::grpc::Status s)=0
grpc::ServerWriteReactor::StartWriteLast
void StartWriteLast(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback.h:624
grpc::internal::Mutex
Definition: sync.h:47
grpc::ServerUnaryReactor::Finish
void Finish(::grpc::Status s)
Finish is similar to ServerBidiReactor except for one detail.
Definition: server_callback.h:709
grpc::ServerBidiReactor::OnSendInitialMetadataDone
virtual void OnSendInitialMetadataDone(bool)
Notifies the application that an explicit StartSendInitialMetadata operation completed.
Definition: server_callback.h:408
grpc::ServerUnaryReactor::~ServerUnaryReactor
~ServerUnaryReactor() override=default
grpc::internal::FinishOnlyReactor::FinishOnlyReactor
FinishOnlyReactor(::grpc::Status s)
Definition: server_callback.h:760
grpc::ServerCallbackUnary
Definition: server_callback.h:191
grpc::ServerUnaryReactor::ServerUnaryReactor
ServerUnaryReactor()
Definition: server_callback.h:690
grpc::ServerWriteReactor::ServerWriteReactor
ServerWriteReactor()
Definition: server_callback.h:573
grpc::ServerUnaryReactor
Definition: server_callback.h:688
message_allocator.h
grpc::experimental::MessageHolder
Definition: message_allocator.h:42
grpc::ServerBidiReactor::StartWriteLast
void StartWriteLast(const Response *resp, ::grpc::WriteOptions options)
Inform system of a planned write operation with specified options, but allow the library to schedule ...
Definition: server_callback.h:377
grpc::ServerCallbackWriter::WriteAndFinish
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)=0
grpc::ServerCallbackReader::SendInitialMetadata
virtual void SendInitialMetadata()=0
grpc::internal::ServerCallbackCall::MaybeDone
void MaybeDone()
Definition: server_callback.h:92
grpc::internal::DefaultMessageHolder::Release
void Release() override
Definition: server_callback.h:167
grpc::experimental::ServerBidiReactor
::grpc::ServerBidiReactor< Request, Response > ServerBidiReactor
Definition: server_callback.h:786