Go to the documentation of this file.
19 #ifndef GRPCPP_SUPPORT_SERVER_CALLBACK_H
20 #define GRPCPP_SUPPORT_SERVER_CALLBACK_H
33 #include <type_traits>
35 #include "absl/functional/any_invocable.h"
36 #include "absl/status/status.h"
48 namespace experimental {
51 grpc_core::Transport** out_transport,
52 grpc_endpoint** out_endpoint);
54 grpc_core::Transport* transport, grpc_endpoint* endpoint,
62 template <
class Request,
class Response>
63 class CallbackUnaryHandler;
64 template <
class Request,
class Response>
65 class CallbackClientStreamingHandler;
66 template <
class Request,
class Response>
67 class CallbackServerStreamingHandler;
68 template <
class Request,
class Response>
69 class CallbackBidiHandler;
84 template <
class Request,
class Response>
86 template <
class Request,
class Response>
88 template <
class Request,
class Response>
90 template <
class Request,
class Response>
117 ScheduleOnDone(reactor()->InternalInlineable());
123 ScheduleOnDone(inline_ondone);
131 CallOnCancel(reactor);
141 CallOnCancel(reactor());
147 void Ref() { callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed); }
154 virtual void RunAsync(absl::AnyInvocable<
void()> cb) {
161 virtual void CallOnDone() = 0;
165 void ScheduleOnDone(
bool inline_ondone);
169 void CallOnCancel(ServerReactor* reactor);
173 bool UnblockCancellation() {
174 return on_cancel_conditions_remaining_.fetch_sub(
175 1, std::memory_order_acq_rel) == 1;
180 return callbacks_outstanding_.fetch_sub(1, std::memory_order_acq_rel);
183 std::atomic_int on_cancel_conditions_remaining_{2};
184 std::atomic_int callbacks_outstanding_{
188 template <
class Request,
class Response>
201 Request request_obj_;
202 Response response_obj_;
208 class ServerUnaryReactor;
209 template <
class Request>
211 template <
class Response>
213 template <
class Request,
class Response>
216 namespace experimental {
217 class ServerSessionReactor;
218 class ServerCallbackSession;
233 template <
class Reactor>
235 reactor->InternalBindCall(
this);
239 namespace experimental {
248 absl::AnyInvocable<
void(
absl::Status)> on_shutdown) = 0;
251 template <
class Reactor>
253 reactor->InternalBindSession(
this);
258 template <
class Request>
264 virtual void Read(Request* msg) = 0;
268 reactor->InternalBindReader(
this);
272 template <
class Response>
285 reactor->InternalBindWriter(
this);
289 template <
class Request,
class Response>
296 virtual void Read(Request* msg) = 0;
303 reactor->InternalBindStream(
this);
319 template <
class Request,
class Response>
335 stream_.load(std::memory_order_acquire);
336 if (stream ==
nullptr) {
338 stream = stream_.load(std::memory_order_relaxed);
339 if (stream ==
nullptr) {
340 backlog_.send_initial_metadata_wanted =
true;
351 void StartRead(Request* req) ABSL_LOCKS_EXCLUDED(stream_mu_) {
353 stream_.load(std::memory_order_acquire);
354 if (stream ==
nullptr) {
356 stream = stream_.load(std::memory_order_relaxed);
357 if (stream ==
nullptr) {
358 backlog_.read_wanted = req;
381 ABSL_LOCKS_EXCLUDED(stream_mu_) {
383 stream_.load(std::memory_order_acquire);
384 if (stream ==
nullptr) {
386 stream = stream_.load(std::memory_order_relaxed);
387 if (stream ==
nullptr) {
388 backlog_.write_wanted = resp;
389 backlog_.write_options_wanted = options;
393 stream->
Write(resp, options);
412 stream_.load(std::memory_order_acquire);
413 if (stream ==
nullptr) {
415 stream = stream_.load(std::memory_order_relaxed);
416 if (stream ==
nullptr) {
417 backlog_.write_and_finish_wanted =
true;
418 backlog_.write_wanted = resp;
419 backlog_.write_options_wanted = options;
420 backlog_.status_wanted = std::move(s);
447 stream_.load(std::memory_order_acquire);
448 if (stream ==
nullptr) {
450 stream = stream_.load(std::memory_order_relaxed);
451 if (stream ==
nullptr) {
452 backlog_.finish_wanted =
true;
453 backlog_.status_wanted = std::move(s);
457 stream->
Finish(std::move(s));
484 void OnDone()
override = 0;
495 virtual void InternalBindStream(
499 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
503 stream->
Read(backlog_.read_wanted);
507 std::move(backlog_.write_options_wanted),
508 std::move(backlog_.status_wanted));
511 stream->
Write(backlog_.write_wanted,
512 std::move(backlog_.write_options_wanted));
515 stream->
Finish(std::move(backlog_.status_wanted));
519 stream_.store(stream, std::memory_order_release);
527 std::atomic<ServerCallbackReaderWriter<Request, Response>*> stream_{
nullptr};
528 struct PreBindBacklog {
529 bool send_initial_metadata_wanted =
false;
530 bool write_and_finish_wanted =
false;
531 bool finish_wanted =
false;
532 Request* read_wanted =
nullptr;
533 const Response* write_wanted =
nullptr;
537 PreBindBacklog backlog_ ABSL_GUARDED_BY(stream_mu_);
541 template <
class Request>
542 class ServerReadReactor :
public internal::ServerReactor {
550 reader_.load(std::memory_order_acquire);
551 if (reader ==
nullptr) {
553 reader = reader_.load(std::memory_order_relaxed);
554 if (reader ==
nullptr) {
555 backlog_.send_initial_metadata_wanted =
true;
561 void StartRead(Request* req) ABSL_LOCKS_EXCLUDED(reader_mu_) {
563 reader_.load(std::memory_order_acquire);
564 if (reader ==
nullptr) {
566 reader = reader_.load(std::memory_order_relaxed);
567 if (reader ==
nullptr) {
568 backlog_.read_wanted = req;
576 reader_.load(std::memory_order_acquire);
577 if (reader ==
nullptr) {
579 reader = reader_.load(std::memory_order_relaxed);
580 if (reader ==
nullptr) {
581 backlog_.finish_wanted =
true;
582 backlog_.status_wanted = std::move(s);
586 reader->
Finish(std::move(s));
592 void OnDone()
override = 0;
601 ABSL_LOCKS_EXCLUDED(reader_mu_) {
604 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
605 reader->SendInitialMetadata();
608 reader->Read(backlog_.read_wanted);
611 reader->Finish(std::move(backlog_.status_wanted));
614 reader_.store(reader, std::memory_order_release);
618 std::atomic<ServerCallbackReader<Request>*> reader_{
nullptr};
619 struct PreBindBacklog {
620 bool send_initial_metadata_wanted =
false;
621 bool finish_wanted =
false;
622 Request* read_wanted =
nullptr;
625 PreBindBacklog backlog_ ABSL_GUARDED_BY(reader_mu_);
629 template <
class Response>
630 class ServerWriteReactor :
public internal::ServerReactor {
638 writer_.load(std::memory_order_acquire);
639 if (writer ==
nullptr) {
641 writer = writer_.load(std::memory_order_relaxed);
642 if (writer ==
nullptr) {
643 backlog_.send_initial_metadata_wanted =
true;
653 ABSL_LOCKS_EXCLUDED(writer_mu_) {
655 writer_.load(std::memory_order_acquire);
656 if (writer ==
nullptr) {
658 writer = writer_.load(std::memory_order_relaxed);
659 if (writer ==
nullptr) {
660 backlog_.write_wanted = resp;
661 backlog_.write_options_wanted = options;
665 writer->
Write(resp, options);
670 writer_.load(std::memory_order_acquire);
671 if (writer ==
nullptr) {
673 writer = writer_.load(std::memory_order_relaxed);
674 if (writer ==
nullptr) {
675 backlog_.write_and_finish_wanted =
true;
676 backlog_.write_wanted = resp;
677 backlog_.write_options_wanted = options;
678 backlog_.status_wanted = std::move(s);
689 writer_.load(std::memory_order_acquire);
690 if (writer ==
nullptr) {
692 writer = writer_.load(std::memory_order_relaxed);
693 if (writer ==
nullptr) {
694 backlog_.finish_wanted =
true;
695 backlog_.status_wanted = std::move(s);
699 writer->
Finish(std::move(s));
705 void OnDone()
override = 0;
713 ABSL_LOCKS_EXCLUDED(writer_mu_) {
716 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
717 writer->SendInitialMetadata();
720 writer->WriteAndFinish(backlog_.write_wanted,
721 std::move(backlog_.write_options_wanted),
722 std::move(backlog_.status_wanted));
725 writer->Write(backlog_.write_wanted,
726 std::move(backlog_.write_options_wanted));
729 writer->Finish(std::move(backlog_.status_wanted));
733 writer_.store(writer, std::memory_order_release);
737 std::atomic<ServerCallbackWriter<Response>*> writer_{
nullptr};
738 struct PreBindBacklog {
739 bool send_initial_metadata_wanted =
false;
740 bool write_and_finish_wanted =
false;
741 bool finish_wanted =
false;
742 const Response* write_wanted =
nullptr;
746 PreBindBacklog backlog_ ABSL_GUARDED_BY(writer_mu_);
757 if (call ==
nullptr) {
759 call = call_.load(std::memory_order_relaxed);
760 if (call ==
nullptr) {
761 backlog_.send_initial_metadata_wanted =
true;
772 if (call ==
nullptr) {
774 call = call_.load(std::memory_order_relaxed);
775 if (call ==
nullptr) {
776 backlog_.finish_wanted =
true;
777 backlog_.status_wanted = std::move(s);
781 call->
Finish(std::move(s));
786 void OnDone()
override = 0;
794 ABSL_LOCKS_EXCLUDED(call_mu_) {
797 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
798 call->SendInitialMetadata();
801 call->Finish(std::move(backlog_.status_wanted));
804 call_.store(call, std::memory_order_release);
808 std::atomic<ServerCallbackUnary*> call_{
nullptr};
809 struct PreBindBacklog {
810 bool send_initial_metadata_wanted =
false;
811 bool finish_wanted =
false;
814 PreBindBacklog backlog_ ABSL_GUARDED_BY(call_mu_);
817 namespace experimental {
827 if (session ==
nullptr) {
829 session = session_.load(std::memory_order_relaxed);
830 if (session ==
nullptr) {
831 backlog_.send_initial_metadata_wanted =
true;
843 if (session ==
nullptr) {
845 session = session_.load(std::memory_order_relaxed);
846 if (session ==
nullptr) {
847 backlog_.finish_wanted =
true;
848 backlog_.status_wanted = std::move(s);
852 session->
Finish(std::move(s));
863 ABSL_LOCKS_EXCLUDED(session_mu_) {
865 if (session ==
nullptr) {
867 session = session_.load(std::memory_order_relaxed);
868 if (session ==
nullptr) {
869 backlog_.graceful_shutdown_wanted_callback = std::move(on_shutdown);
878 void OnDone()
override = 0;
886 ABSL_LOCKS_EXCLUDED(session_mu_) {
889 if (
GPR_UNLIKELY(backlog_.send_initial_metadata_wanted)) {
890 session->SendInitialMetadata();
892 if (
GPR_UNLIKELY(backlog_.graceful_shutdown_wanted_callback !=
nullptr)) {
893 session->InitiateGracefulShutdown(
894 std::move(backlog_.graceful_shutdown_wanted_callback));
897 session->Finish(std::move(backlog_.status_wanted));
900 session_.store(session, std::memory_order_release);
904 std::atomic<ServerCallbackSession*> session_{
nullptr};
905 struct PreBindBacklog {
906 bool send_initial_metadata_wanted =
false;
907 bool finish_wanted =
false;
908 absl::AnyInvocable<void(
absl::Status)> graceful_shutdown_wanted_callback;
916 PreBindBacklog backlog_ ABSL_GUARDED_BY(session_mu_);
922 template <
class Base>
923 class FinishOnlyReactor :
public Base {
930 template <
class Request>
932 template <
class Response>
935 template <
class Request,
class Response>
941 namespace experimental {
950 namespace experimental {
952 template <
class Request,
class Response>
959 #endif // GRPCPP_SUPPORT_SERVER_CALLBACK_H
ServerReadReactor is the interface for a client-streaming RPC.
Definition: server_callback.h:210
virtual void SendInitialMetadata()=0
~ServerCallbackReader() override
Definition: server_callback.h:261
void set_response(Response *response)
Definition: message_allocator.h:50
void OnCancel() override
Definition: server_callback.h:593
void StartSendInitialMetadata() ABSL_LOCKS_EXCLUDED(stream_mu_)
Send any initial metadata stored in the RPC context.
Definition: server_callback.h:333
void StartVirtualRPCs() ABSL_LOCKS_EXCLUDED(session_mu_)
StartVirtualRPCs is exactly like ServerBidiReactor's StartSendInitialMetadata.
Definition: server_callback.h:825
void set_request(Request *request)
Definition: message_allocator.h:49
ServerReadReactor()
Definition: server_callback.h:544
virtual void Finish(grpc::Status s)=0
void StartWrite(const Response *resp)
Definition: server_callback.h:649
Represents a gRPC server.
Definition: server.h:58
virtual void Finish(grpc::Status s)=0
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm.h:33
void StartWriteAndFinish(const Response *resp, grpc::WriteOptions options, grpc::Status s) ABSL_LOCKS_EXCLUDED(stream_mu_)
Initiate a write operation with specified options and final RPC Status, which also causes any trailin...
Definition: server_callback.h:409
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
Definition: context_types.h:20
virtual ~ServerReactor()=default
void MaybeCallOnCancel()
Definition: server_callback.h:139
void StartWrite(const Response *resp, grpc::WriteOptions options) ABSL_LOCKS_EXCLUDED(writer_mu_)
Definition: server_callback.h:652
virtual void OnWriteDone(bool)
Definition: server_callback.h:704
ServerBidiReactor()
Definition: server_callback.h:327
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:703
virtual void Finish(grpc::Status s)=0
void StartRead(Request *req) ABSL_LOCKS_EXCLUDED(reader_mu_)
Definition: server_callback.h:561
DefaultMessageHolder()
Definition: server_callback.h:191
~ServerSessionReactor() override=default
~ServerCallbackReaderWriter() override
Definition: server_callback.h:292
void BindReactor(Reactor *reactor)
Definition: server_callback.h:234
void MaybeCallOnCancel(ServerReactor *reactor)
Definition: server_callback.h:129
void StartWriteLast(const Response *resp, grpc::WriteOptions options)
Definition: server_callback.h:684
~ServerReadReactor() override=default
virtual void InitiateGracefulShutdown(absl::AnyInvocable< void(absl::Status)> on_shutdown)=0
Definition: server_callback.h:290
void StartWrite(const Response *resp)
Initiate a write operation.
Definition: server_callback.h:370
virtual void BindInnerServer(grpc::Server *inner_server)=0
void OnCancel() override
Notifies the application that this RPC has been cancelled.
Definition: server_callback.h:489
virtual void Write(const Response *msg, grpc::WriteOptions options)=0
~ServerCallbackSession() override
Definition: server_callback.h:242
void StartRead(Request *req) ABSL_LOCKS_EXCLUDED(stream_mu_)
Initiate a read operation.
Definition: server_callback.h:351
Did it work? If it didn't, why?
Definition: status.h:34
~ServerCallbackUnary() override
Definition: server_callback.h:226
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:785
ServerSessionReactor()
Definition: server_callback.h:820
Definition: server_callback.h:818
The base class of ServerCallbackUnary etc.
Definition: server_callback.h:95
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:877
virtual void OnWriteDone(bool)
Notifies the application that a StartWrite (or StartWriteLast) operation completed.
Definition: server_callback.h:479
void StartWrite(const Response *resp, grpc::WriteOptions options) ABSL_LOCKS_EXCLUDED(stream_mu_)
Initiate a write operation with specified options.
Definition: server_callback.h:380
void Finish(grpc::Status s) ABSL_LOCKS_EXCLUDED(session_mu_)
Finish is similar to ServerBidiReactor except for one detail.
Definition: server_callback.h:841
virtual void WriteAndFinish(const Response *msg, grpc::WriteOptions options, grpc::Status s)=0
void OnDone() override=0
Notifies the application that all operations associated with this RPC have completed.
struct grpc_call grpc_call
A Call represents an RPC.
Definition: grpc_types.h:68
ServerBidiReactor is the interface for a bidirectional streaming RPC.
Definition: server_callback.h:214
Definition: server_callback_handlers.h:38
virtual void SendInitialMetadata()=0
~ServerBidiReactor() override=default
Definition: server_callback.h:189
FinishOnlyReactor(grpc::Status s)
Definition: server_callback.h:925
virtual void OnReadDone(bool)
Notifies the application that a StartRead operation completed.
Definition: server_callback.h:472
void StartWriteAndFinish(const Response *resp, grpc::WriteOptions options, grpc::Status s) ABSL_LOCKS_EXCLUDED(writer_mu_)
Definition: server_callback.h:667
Definition: server_callback_handlers.h:452
Definition: server_callback.h:240
void InitiateSessionGracefulShutdown(grpc_core::Transport *transport, grpc_endpoint *endpoint, absl::AnyInvocable< void(absl::Status)> on_shutdown)
virtual void Read(Request *msg)=0
void Finish(grpc::Status s) ABSL_LOCKS_EXCLUDED(stream_mu_)
Indicate that the stream is to be finished and the trailing metadata and RPC status are to be sent.
Definition: server_callback.h:445
void BindReactor(ServerReadReactor< Request > *reactor)
Definition: server_callback.h:267
void BindReactor(ServerWriteReactor< Response > *reactor)
Definition: server_callback.h:284
Definition: server_context.h:90
~ServerCallbackWriter() override
Definition: server_callback.h:275
void grpc_call_run_in_event_engine(const grpc_call *call, absl::AnyInvocable< void()> cb)
void StartSendInitialMetadata() ABSL_LOCKS_EXCLUDED(reader_mu_)
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:548
virtual ~ServerCallbackCall()
Definition: server_callback.h:97
Per-message write options.
Definition: call_op_set.h:79
void BindReactor(Reactor *reactor)
Definition: server_callback.h:252
void MaybeDone(bool inline_ondone)
Definition: server_callback.h:121
ServerWriteReactor is the interface for a server-streaming RPC.
Definition: server_callback.h:212
virtual void OnReadDone(bool)
Definition: server_callback.h:591
virtual void Read(Request *msg)=0
Definition: server_callback_handlers.h:683
void OnCancel() override
Definition: server_callback.h:706
~ServerWriteReactor() override=default
void BindReactor(ServerBidiReactor< Request, Response > *reactor)
Definition: server_callback.h:302
Definition: server_callback.h:273
void StartSendInitialMetadata() ABSL_LOCKS_EXCLUDED(writer_mu_)
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:636
grpc::internal::FinishOnlyReactor< ServerSessionReactor > UnimplementedSessionReactor
Definition: server_callback.h:944
virtual bool InternalInlineable()
Definition: server_callback.h:81
virtual void SendInitialMetadata()=0
virtual void OnSendInitialMetadataDone(bool)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:590
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:435
void OnDone() override
Definition: server_callback.h:926
Definition: server_callback.h:71
virtual void SendInitialMetadata()=0
Definition: server_callback_handlers.h:258
void OnCancel() override
Definition: server_callback.h:787
void Ref()
Increases the reference count.
Definition: server_callback.h:147
virtual void OnCancel()=0
Definition: server_callback.h:259
void Finish(grpc::Status s) ABSL_LOCKS_EXCLUDED(reader_mu_)
Definition: server_callback.h:574
virtual void Write(const Response *msg, grpc::WriteOptions options)=0
Definition: message_allocator.h:39
void StartSendInitialMetadata() ABSL_LOCKS_EXCLUDED(call_mu_)
StartSendInitialMetadata is exactly like ServerBidiReactor.
Definition: server_callback.h:755
void Finish(grpc::Status s) ABSL_LOCKS_EXCLUDED(writer_mu_)
Definition: server_callback.h:687
void BindSessionToInnerServer(grpc_call *call, grpc::Server *inner_server, grpc_core::Transport **out_transport, grpc_endpoint **out_endpoint)
void InitiateGracefulShutdown(absl::AnyInvocable< void(absl::Status)> on_shutdown) ABSL_LOCKS_EXCLUDED(session_mu_)
Initiate a graceful shutdown of a SESSION_RPC.
Definition: server_callback.h:861
void Finish(grpc::Status s) ABSL_LOCKS_EXCLUDED(call_mu_)
Finish is similar to ServerBidiReactor except for one detail.
Definition: server_callback.h:770
virtual void OnSendInitialMetadataDone(bool)
Notifies the application that an explicit StartSendInitialMetadata operation completed.
Definition: server_callback.h:466
~ServerUnaryReactor() override=default
Definition: server_callback.h:224
ServerUnaryReactor()
Definition: server_callback.h:751
virtual void Finish(grpc::Status s)=0
ServerWriteReactor()
Definition: server_callback.h:632
Definition: server_callback.h:749
::absl::Status Status
Definition: config_protobuf.h:107
virtual void WriteAndFinish(const Response *msg, grpc::WriteOptions options, grpc::Status s)=0
virtual void Finish(grpc::Status s)=0
virtual void SendInitialMetadata()=0
void MaybeDone()
Definition: server_callback.h:115
void OnCancel() override
Definition: server_callback.h:879
void Release() override
Definition: server_callback.h:195
::grpc::ServerBidiReactor< Request, Response > ServerBidiReactor
Definition: server_callback.h:953