Go to the documentation of this file.
18 #ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
19 #define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
23 #include <type_traits>
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>
61 template <
class Request,
class Response>
63 template <
class Request,
class Response>
65 template <
class Request,
class Response>
67 template <
class Request,
class Response>
94 ScheduleOnDone(reactor()->InternalInlineable());
100 ScheduleOnDone(inline_ondone);
108 CallOnCancel(reactor);
118 CallOnCancel(reactor());
124 void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); }
132 virtual void CallOnDone() = 0;
136 void ScheduleOnDone(
bool inline_ondone);
144 bool UnblockCancellation() {
145 return on_cancel_conditions_remaining_.fetch_sub(
146 1, std::memory_order_acq_rel) == 1;
151 return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel);
154 std::atomic_int on_cancel_conditions_remaining_{2};
155 std::atomic_int callbacks_outstanding_{
159 template <
class Request,
class Response>
173 Request request_obj_;
174 Response response_obj_;
181 template <
class Request>
183 template <
class Response>
185 template <
class Request,
class Response>
200 template <
class Reactor>
202 reactor->InternalBindCall(
this);
206 template <
class Request>
212 virtual void Read(Request* msg) = 0;
216 reactor->InternalBindReader(
this);
220 template <
class Response>
233 reactor->InternalBindWriter(
this);
237 template <
class Request,
class Response>
244 virtual void Read(Request* msg) = 0;
251 reactor->InternalBindStream(
this);
262 template <
class Request,
class Response>
278 stream_.load(std::memory_order_acquire);
279 if (stream ==
nullptr) {
281 stream = stream_.load(std::memory_order_relaxed);
282 if (stream ==
nullptr) {
283 backlog_.send_initial_metadata_wanted =
true;
296 stream_.load(std::memory_order_acquire);
297 if (stream ==
nullptr) {
299 stream = stream_.load(std::memory_order_relaxed);
300 if (stream ==
nullptr) {
301 backlog_.read_wanted = req;
325 stream_.load(std::memory_order_acquire);
326 if (stream ==
nullptr) {
328 stream = stream_.load(std::memory_order_relaxed);
329 if (stream ==
nullptr) {
330 backlog_.write_wanted = resp;
331 backlog_.write_options_wanted = options;
335 stream->
Write(resp, options);
354 stream_.load(std::memory_order_acquire);
355 if (stream ==
nullptr) {
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);
389 stream_.load(std::memory_order_acquire);
390 if (stream ==
nullptr) {
392 stream = stream_.load(std::memory_order_relaxed);
393 if (stream ==
nullptr) {
394 backlog_.finish_wanted =
true;
395 backlog_.status_wanted = std::move(s);
399 stream->
Finish(std::move(s));
426 void OnDone()
override = 0;
437 virtual void InternalBindStream(
441 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
445 stream->
Read(backlog_.read_wanted);
449 std::move(backlog_.write_options_wanted),
450 std::move(backlog_.status_wanted));
453 stream->
Write(backlog_.write_wanted,
454 std::move(backlog_.write_options_wanted));
457 stream->
Finish(std::move(backlog_.status_wanted));
461 stream_.store(stream, std::memory_order_release);
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;
479 PreBindBacklog backlog_ ;
483 template <
class Request>
492 reader_.load(std::memory_order_acquire);
493 if (reader ==
nullptr) {
495 reader = reader_.load(std::memory_order_relaxed);
496 if (reader ==
nullptr) {
497 backlog_.send_initial_metadata_wanted =
true;
505 reader_.load(std::memory_order_acquire);
506 if (reader ==
nullptr) {
508 reader = reader_.load(std::memory_order_relaxed);
509 if (reader ==
nullptr) {
510 backlog_.read_wanted = req;
518 reader_.load(std::memory_order_acquire);
519 if (reader ==
nullptr) {
521 reader = reader_.load(std::memory_order_relaxed);
522 if (reader ==
nullptr) {
523 backlog_.finish_wanted =
true;
524 backlog_.status_wanted = std::move(s);
528 reader->
Finish(std::move(s));
534 void OnDone()
override = 0;
545 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
549 reader->
Read(backlog_.read_wanted);
552 reader->
Finish(std::move(backlog_.status_wanted));
555 reader_.store(reader, std::memory_order_release);
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;
566 PreBindBacklog backlog_ ;
570 template <
class Response>
579 writer_.load(std::memory_order_acquire);
580 if (writer ==
nullptr) {
582 writer = writer_.load(std::memory_order_relaxed);
583 if (writer ==
nullptr) {
584 backlog_.send_initial_metadata_wanted =
true;
595 writer_.load(std::memory_order_acquire);
596 if (writer ==
nullptr) {
598 writer = writer_.load(std::memory_order_relaxed);
599 if (writer ==
nullptr) {
600 backlog_.write_wanted = resp;
601 backlog_.write_options_wanted = options;
605 writer->
Write(resp, options);
610 writer_.load(std::memory_order_acquire);
611 if (writer ==
nullptr) {
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);
629 writer_.load(std::memory_order_acquire);
630 if (writer ==
nullptr) {
632 writer = writer_.load(std::memory_order_relaxed);
633 if (writer ==
nullptr) {
634 backlog_.finish_wanted =
true;
635 backlog_.status_wanted = std::move(s);
639 writer->
Finish(std::move(s));
645 void OnDone()
override = 0;
655 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
660 std::move(backlog_.write_options_wanted),
661 std::move(backlog_.status_wanted));
664 writer->
Write(backlog_.write_wanted,
665 std::move(backlog_.write_options_wanted));
668 writer->
Finish(std::move(backlog_.status_wanted));
672 writer_.store(writer, std::memory_order_release);
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;
685 PreBindBacklog backlog_ ;
696 if (call ==
nullptr) {
698 call = call_.load(std::memory_order_relaxed);
699 if (call ==
nullptr) {
700 backlog_.send_initial_metadata_wanted =
true;
711 if (call ==
nullptr) {
713 call = call_.load(std::memory_order_relaxed);
714 if (call ==
nullptr) {
715 backlog_.finish_wanted =
true;
716 backlog_.status_wanted = std::move(s);
720 call->
Finish(std::move(s));
725 void OnDone()
override = 0;
735 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
739 call->
Finish(std::move(backlog_.status_wanted));
742 call_.store(call, std::memory_order_release);
746 std::atomic<ServerCallbackUnary*> call_{
nullptr};
747 struct PreBindBacklog {
748 bool send_initial_metadata_wanted =
false;
749 bool finish_wanted =
false;
752 PreBindBacklog backlog_ ;
757 template <
class Base>
765 template <
class Request>
767 template <
class Response>
770 template <
class Request,
class Response>
777 namespace experimental {
779 template <
class Request>
782 template <
class Response>
785 template <
class Request,
class Response>
794 #endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
ServerReadReactor is the interface for a client-streaming RPC.
Definition: server_callback.h:182
void Finish(::grpc::Status s)
Definition: server_callback.h:516
virtual void SendInitialMetadata()=0
~ServerCallbackReader() override
Definition: server_callback.h:209
void StartWriteAndFinish(const Response *resp, ::grpc::WriteOptions options, ::grpc::Status s)
Definition: server_callback.h:607
void OnCancel() override
Definition: server_callback.h:535
ServerReadReactor()
Definition: server_callback.h:486
void StartWrite(const Response *resp)
Definition: server_callback.h:590
void set_request(Request *request)
Definition: message_allocator.h:52
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm.h:33
virtual void Finish(::grpc::Status s)=0
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
void StartRead(Request *req)
Definition: server_callback.h:503
virtual ~ServerReactor()=default
void MaybeCallOnCancel()
Definition: server_callback.h:116
virtual void Finish(::grpc::Status s)=0
virtual void OnWriteDone(bool)
Definition: server_callback.h:644
ServerBidiReactor()
Definition: server_callback.h:270
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:643
void StartRead(Request *req)
Initiate a read operation.
Definition: server_callback.h:294
DefaultMessageHolder()
Definition: server_callback.h:163
~ServerCallbackReaderWriter() override
Definition: server_callback.h:240
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
void BindReactor(Reactor *reactor)
Definition: server_callback.h:201
void MaybeCallOnCancel(ServerReactor *reactor)
Definition: server_callback.h:106
::grpc::ServerReadReactor< Request > ServerReadReactor
Definition: server_callback.h:780
~ServerReadReactor() override=default
Definition: server_callback.h:238
void StartWrite(const Response *resp)
Initiate a write operation.
Definition: server_callback.h:313
void OnCancel() override
Notifies the application that this RPC has been cancelled.
Definition: server_callback.h:431
Did it work? If it didn't, why?
Definition: status.h:31
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)=0
~ServerCallbackUnary() override
Definition: server_callback.h:193
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:724
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Initiate a write operation with specified options.
Definition: server_callback.h:323
The base class of ServerCallbackUnary etc.
Definition: server_callback.h:72
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback.h:593
virtual void OnWriteDone(bool)
Notifies the application that a StartWrite (or StartWriteLast) operation completed.
Definition: server_callback.h:421
void set_response(Response *response)
Definition: message_allocator.h:53
void OnDone() override=0
Notifies the application that all operations associated with this RPC have completed.
ServerBidiReactor is the interface for a bidirectional streaming RPC.
Definition: server_callback.h:186
Definition: byte_buffer.h:40
virtual void SendInitialMetadata()=0
~ServerBidiReactor() override=default
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
Definition: server_callback.h:160
virtual void OnReadDone(bool)
Notifies the application that a StartRead operation completed.
Definition: server_callback.h:414
Definition: byte_buffer.h:42
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:490
::grpc::ServerWriteReactor< Response > ServerWriteReactor
Definition: server_callback.h:783
virtual void Read(Request *msg)=0
void BindReactor(ServerReadReactor< Request > *reactor)
Definition: server_callback.h:215
void BindReactor(ServerWriteReactor< Response > *reactor)
Definition: server_callback.h:232
virtual void Write(const Response *msg, ::grpc::WriteOptions options)=0
Definition: server_callback.h:758
~ServerCallbackWriter() override
Definition: server_callback.h:223
virtual void Finish(::grpc::Status s)=0
virtual void Write(const Response *msg, ::grpc::WriteOptions options)=0
void StartSendInitialMetadata()
Send any initial metadata stored in the RPC context.
Definition: server_callback.h:276
virtual ~ServerCallbackCall()
Definition: server_callback.h:74
Per-message write options.
Definition: call_op_set.h:79
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:577
void MaybeDone(bool inline_ondone)
Definition: server_callback.h:98
ServerWriteReactor is the interface for a server-streaming RPC.
Definition: server_callback.h:184
virtual void OnReadDone(bool)
Definition: server_callback.h:533
virtual void Read(Request *msg)=0
Definition: server_callback.h:46
void OnCancel() override
Definition: server_callback.h:646
~ServerWriteReactor() override=default
void Finish(::grpc::Status s)
Definition: server_callback.h:627
void BindReactor(ServerBidiReactor< Request, Response > *reactor)
Definition: server_callback.h:250
Definition: server_callback.h:221
virtual bool InternalInlineable()
Definition: server_callback.h:58
virtual void SendInitialMetadata()=0
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:532
void OnDone() override
Definition: server_callback.h:761
::grpc::ServerUnaryReactor ServerUnaryReactor
Definition: server_callback.h:788
Definition: server_callback.h:48
Definition: server_callback.h:42
void OnCancel() override
Definition: server_callback.h:726
void Ref()
Increases the reference count.
Definition: server_callback.h:124
virtual void OnCancel()=0
Definition: server_callback.h:207
void StartSendInitialMetadata()
StartSendInitialMetadata is exactly like ServerBidiReactor.
Definition: server_callback.h:694
virtual void Finish(::grpc::Status s)=0
void StartWriteLast(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback.h:624
void Finish(::grpc::Status s)
Finish is similar to ServerBidiReactor except for one detail.
Definition: server_callback.h:709
virtual void OnSendInitialMetadataDone(bool)
Notifies the application that an explicit StartSendInitialMetadata operation completed.
Definition: server_callback.h:408
~ServerUnaryReactor() override=default
FinishOnlyReactor(::grpc::Status s)
Definition: server_callback.h:760
Definition: server_callback.h:191
ServerUnaryReactor()
Definition: server_callback.h:690
ServerWriteReactor()
Definition: server_callback.h:573
Definition: server_callback.h:688
Definition: message_allocator.h:42
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
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)=0
virtual void SendInitialMetadata()=0
void MaybeDone()
Definition: server_callback.h:92
void Release() override
Definition: server_callback.h:167
::grpc::ServerBidiReactor< Request, Response > ServerBidiReactor
Definition: server_callback.h:786