19 #ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H 20 #define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H 24 #include <type_traits> 42 template <
class Request,
class Response>
44 template <
class Request,
class Response>
46 template <
class Request,
class Response>
56 friend class ::grpc::ServerContext;
57 template <
class Request,
class Response>
59 template <
class Request,
class Response>
61 template <
class Request,
class Response>
70 void MaybeCallOnCancel() {
71 if (on_cancel_conditions_remaining_.fetch_sub(
72 1, std::memory_order_acq_rel) == 1) {
77 std::atomic_int on_cancel_conditions_remaining_{2};
80 template <
class Request,
class Response>
85 this->set_request(&request_obj_);
86 this->set_response(&response_obj_);
95 Response response_obj_;
100 namespace experimental {
103 template <
class Request,
class Response>
105 template <
class Request,
class Response>
107 template <
class Request,
class Response>
118 virtual void Finish(
Status s) = 0;
122 virtual void SendInitialMetadata(std::function<
void(
bool)>) = 0;
155 virtual void SetCancelCallback(std::function<
void()> callback) = 0;
156 virtual void ClearCancelCallback() = 0;
166 template <
class Request>
170 virtual void Finish(
Status s) = 0;
171 virtual void SendInitialMetadata() = 0;
172 virtual void Read(Request* msg) = 0;
175 template <
class Response>
177 reactor->BindReader(
this);
181 template <
class Response>
186 virtual void Finish(
Status s) = 0;
187 virtual void SendInitialMetadata() = 0;
188 virtual void Write(
const Response* msg,
WriteOptions options) = 0;
192 Write(msg, std::move(options));
193 Finish(std::move(s));
197 template <
class Request>
199 reactor->BindWriter(
this);
203 template <
class Request,
class Response>
208 virtual void Finish(
Status s) = 0;
209 virtual void SendInitialMetadata() = 0;
210 virtual void Read(Request* msg) = 0;
211 virtual void Write(
const Response* msg,
WriteOptions options) = 0;
215 Write(msg, std::move(options));
216 Finish(std::move(s));
221 reactor->BindStream(
this);
236 template <
class Request,
class Response>
269 stream_->Write(resp, std::move(options));
287 stream_->WriteAndFinish(resp, std::move(options), std::move(s));
359 template <
class Request,
class Response>
391 template <
class Request,
class Response>
400 writer_->Write(resp, std::move(options));
404 writer_->WriteAndFinish(resp, std::move(options), std::move(s));
435 template <
class Request,
class Response>
445 template <
class Request,
class Response>
455 template <
class Request,
class Response>
465 template <
class RequestType,
class ResponseType>
469 std::function<
void(
ServerContext*,
const RequestType*, ResponseType*,
476 allocator_ = allocator;
482 auto* allocator_state =
484 param.internal_data);
486 param.call->call(),
sizeof(ServerCallbackRpcControllerImpl)))
487 ServerCallbackRpcControllerImpl(param.server_context, param.call,
489 std::move(param.call_requester));
490 Status status = param.status;
494 controller->
response(), controller);
497 controller->Finish(status);
502 void** handler_data)
final {
505 RequestType* request =
nullptr;
508 if (allocator_ !=
nullptr) {
509 allocator_state = allocator_->AllocateMessages();
515 *handler_data = allocator_state;
516 request = allocator_state->
request();
528 std::function<void(
ServerContext*,
const RequestType*, ResponseType*,
537 class ServerCallbackRpcControllerImpl
540 void Finish(
Status s)
override {
541 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
543 if (!ctx_->sent_initial_metadata_) {
545 ctx_->initial_metadata_flags());
546 if (ctx_->compression_level_set()) {
547 finish_ops_.set_compression_level(ctx_->compression_level());
549 ctx_->sent_initial_metadata_ =
true;
553 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
554 finish_ops_.SendMessagePtr(response()));
556 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
558 finish_ops_.set_core_cq_tag(&finish_tag_);
559 call_.PerformOps(&finish_ops_);
562 void SendInitialMetadata(std::function<
void(
bool)> f)
override {
564 callbacks_outstanding_++;
567 meta_tag_.Set(call_.call(),
573 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
574 ctx_->initial_metadata_flags());
575 if (ctx_->compression_level_set()) {
576 meta_ops_.set_compression_level(ctx_->compression_level());
578 ctx_->sent_initial_metadata_ =
true;
579 meta_ops_.set_core_cq_tag(&meta_tag_);
580 call_.PerformOps(&meta_ops_);
586 void SetCancelCallback(std::function<
void()> callback)
override {
587 ctx_->SetCancelCallback(std::move(callback));
590 void ClearCancelCallback()
override { ctx_->ClearCancelCallback(); }
593 return allocator_state_;
599 ServerCallbackRpcControllerImpl(
602 std::function<
void()> call_requester)
605 allocator_state_(allocator_state),
606 call_requester_(std::move(call_requester)) {
607 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); },
nullptr);
610 const RequestType* request() {
return allocator_state_->request(); }
611 ResponseType* response() {
return allocator_state_->response(); }
614 if (--callbacks_outstanding_ == 0) {
616 auto call_requester = std::move(call_requester_);
617 allocator_state_->Release();
618 this->~ServerCallbackRpcControllerImpl();
635 std::function<void()> call_requester_;
636 std::atomic_int callbacks_outstanding_{
641 template <
class RequestType,
class ResponseType>
648 : func_(
std::move(func)) {}
660 if (reactor ==
nullptr) {
666 param.call->call(),
sizeof(ServerCallbackReaderImpl)))
667 ServerCallbackReaderImpl(param.server_context, param.call,
668 std::move(param.call_requester), reactor);
670 reader->BindReactor(reactor);
671 reactor->
OnStarted(param.server_context, reader->response());
673 reactor->MaybeCallOnCancel();
678 std::function<experimental::ServerReadReactor<RequestType, ResponseType>*()>
681 class ServerCallbackReaderImpl
684 void Finish(
Status s)
override {
685 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
687 if (!ctx_->sent_initial_metadata_) {
689 ctx_->initial_metadata_flags());
690 if (ctx_->compression_level_set()) {
691 finish_ops_.set_compression_level(ctx_->compression_level());
693 ctx_->sent_initial_metadata_ =
true;
697 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
698 finish_ops_.SendMessagePtr(&resp_));
700 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
702 finish_ops_.set_core_cq_tag(&finish_tag_);
703 call_.PerformOps(&finish_ops_);
706 void SendInitialMetadata()
override {
708 callbacks_outstanding_++;
709 meta_tag_.Set(call_.call(),
711 reactor_->OnSendInitialMetadataDone(ok);
715 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
716 ctx_->initial_metadata_flags());
717 if (ctx_->compression_level_set()) {
718 meta_ops_.set_compression_level(ctx_->compression_level());
720 ctx_->sent_initial_metadata_ =
true;
721 meta_ops_.set_core_cq_tag(&meta_tag_);
722 call_.PerformOps(&meta_ops_);
725 void Read(RequestType* req)
override {
726 callbacks_outstanding_++;
727 read_ops_.RecvMessage(req);
728 call_.PerformOps(&read_ops_);
734 ServerCallbackReaderImpl(
739 call_requester_(std::move(call_requester)),
741 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
742 read_tag_.Set(call_.call(),
744 reactor_->OnReadDone(ok);
748 read_ops_.set_core_cq_tag(&read_tag_);
751 ~ServerCallbackReaderImpl() {}
753 ResponseType* response() {
return &resp_; }
756 if (--callbacks_outstanding_ == 0) {
759 auto call_requester = std::move(call_requester_);
760 this->~ServerCallbackReaderImpl();
778 std::function<void()> call_requester_;
780 std::atomic_int callbacks_outstanding_{
785 template <
class RequestType,
class ResponseType>
792 : func_(
std::move(func)) {}
804 if (reactor ==
nullptr) {
810 param.call->call(),
sizeof(ServerCallbackWriterImpl)))
811 ServerCallbackWriterImpl(param.server_context, param.call,
812 static_cast<RequestType*>(param.request),
813 std::move(param.call_requester), reactor);
814 writer->BindReactor(reactor);
815 reactor->
OnStarted(param.server_context, writer->request());
817 reactor->MaybeCallOnCancel();
822 void** handler_data)
final {
826 call,
sizeof(RequestType))) RequestType();
832 request->~RequestType();
837 std::function<experimental::ServerWriteReactor<RequestType, ResponseType>*()>
840 class ServerCallbackWriterImpl
843 void Finish(
Status s)
override {
844 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
846 finish_ops_.set_core_cq_tag(&finish_tag_);
848 if (!ctx_->sent_initial_metadata_) {
850 ctx_->initial_metadata_flags());
851 if (ctx_->compression_level_set()) {
852 finish_ops_.set_compression_level(ctx_->compression_level());
854 ctx_->sent_initial_metadata_ =
true;
856 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
857 call_.PerformOps(&finish_ops_);
860 void SendInitialMetadata()
override {
862 callbacks_outstanding_++;
863 meta_tag_.Set(call_.call(),
865 reactor_->OnSendInitialMetadataDone(ok);
869 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
870 ctx_->initial_metadata_flags());
871 if (ctx_->compression_level_set()) {
872 meta_ops_.set_compression_level(ctx_->compression_level());
874 ctx_->sent_initial_metadata_ =
true;
875 meta_ops_.set_core_cq_tag(&meta_tag_);
876 call_.PerformOps(&meta_ops_);
879 void Write(
const ResponseType* resp,
WriteOptions options)
override {
880 callbacks_outstanding_++;
884 if (!ctx_->sent_initial_metadata_) {
885 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
886 ctx_->initial_metadata_flags());
887 if (ctx_->compression_level_set()) {
888 write_ops_.set_compression_level(ctx_->compression_level());
890 ctx_->sent_initial_metadata_ =
true;
894 call_.PerformOps(&write_ops_);
897 void WriteAndFinish(
const ResponseType* resp,
WriteOptions options,
905 Finish(std::move(s));
911 ServerCallbackWriterImpl(
913 std::function<
void()> call_requester,
918 call_requester_(std::move(call_requester)),
920 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
921 write_tag_.Set(call_.call(),
923 reactor_->OnWriteDone(ok);
927 write_ops_.set_core_cq_tag(&write_tag_);
929 ~ServerCallbackWriterImpl() { req_->~RequestType(); }
931 const RequestType* request() {
return req_; }
934 if (--callbacks_outstanding_ == 0) {
937 auto call_requester = std::move(call_requester_);
938 this->~ServerCallbackWriterImpl();
955 const RequestType* req_;
956 std::function<void()> call_requester_;
958 std::atomic_int callbacks_outstanding_{
963 template <
class RequestType,
class ResponseType>
970 : func_(
std::move(func)) {}
981 if (reactor ==
nullptr) {
987 param.call->call(),
sizeof(ServerCallbackReaderWriterImpl)))
988 ServerCallbackReaderWriterImpl(param.server_context, param.call,
989 std::move(param.call_requester),
992 stream->BindReactor(reactor);
993 reactor->
OnStarted(param.server_context);
995 reactor->MaybeCallOnCancel();
1000 std::function<experimental::ServerBidiReactor<RequestType, ResponseType>*()>
1003 class ServerCallbackReaderWriterImpl
1007 void Finish(
Status s)
override {
1008 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
1010 finish_ops_.set_core_cq_tag(&finish_tag_);
1012 if (!ctx_->sent_initial_metadata_) {
1014 ctx_->initial_metadata_flags());
1015 if (ctx_->compression_level_set()) {
1016 finish_ops_.set_compression_level(ctx_->compression_level());
1018 ctx_->sent_initial_metadata_ =
true;
1020 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
1021 call_.PerformOps(&finish_ops_);
1024 void SendInitialMetadata()
override {
1026 callbacks_outstanding_++;
1027 meta_tag_.Set(call_.call(),
1029 reactor_->OnSendInitialMetadataDone(ok);
1033 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1034 ctx_->initial_metadata_flags());
1035 if (ctx_->compression_level_set()) {
1036 meta_ops_.set_compression_level(ctx_->compression_level());
1038 ctx_->sent_initial_metadata_ =
true;
1039 meta_ops_.set_core_cq_tag(&meta_tag_);
1040 call_.PerformOps(&meta_ops_);
1043 void Write(
const ResponseType* resp,
WriteOptions options)
override {
1044 callbacks_outstanding_++;
1048 if (!ctx_->sent_initial_metadata_) {
1049 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1050 ctx_->initial_metadata_flags());
1051 if (ctx_->compression_level_set()) {
1052 write_ops_.set_compression_level(ctx_->compression_level());
1054 ctx_->sent_initial_metadata_ =
true;
1058 call_.PerformOps(&write_ops_);
1061 void WriteAndFinish(
const ResponseType* resp,
WriteOptions options,
1068 Finish(std::move(s));
1071 void Read(RequestType* req)
override {
1072 callbacks_outstanding_++;
1073 read_ops_.RecvMessage(req);
1074 call_.PerformOps(&read_ops_);
1080 ServerCallbackReaderWriterImpl(
1085 call_requester_(std::move(call_requester)),
1087 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
1088 write_tag_.Set(call_.call(),
1090 reactor_->OnWriteDone(ok);
1094 write_ops_.set_core_cq_tag(&write_tag_);
1095 read_tag_.Set(call_.call(),
1097 reactor_->OnReadDone(ok);
1101 read_ops_.set_core_cq_tag(&read_tag_);
1103 ~ServerCallbackReaderWriterImpl() {}
1106 if (--callbacks_outstanding_ == 0) {
1109 auto call_requester = std::move(call_requester_);
1110 this->~ServerCallbackReaderWriterImpl();
1129 std::function<void()> call_requester_;
1131 std::atomic_int callbacks_outstanding_{
1140 #endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_H
struct grpc_call grpc_call
A Call represents an RPC.
Definition: grpc_types.h:70
void OnDone() override
Definition: server_callback.h:449
void Release() override
Definition: server_callback.h:88
virtual void OnCancel()=0
virtual void OnStarted(ServerContext *context, Response *resp)
Similar to ServerBidiReactor::OnStarted, except that this also provides the response object that the ...
Definition: server_callback.h:375
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:125
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:145
virtual void grpc_call_ref(grpc_call *call)=0
Definition: server_callback.h:456
void StartWriteAndFinish(const Response *resp, WriteOptions options, Status s)
Initiate a write operation with specified options and final RPC Status, which also causes any trailin...
Definition: server_callback.h:285
void BindReactor(ServerBidiReactor< Request, Response > *reactor)
Definition: server_callback.h:220
virtual void OnSendInitialMetadataDone(bool ok)
Notifies the application that an explicit StartSendInitialMetadata operation completed.
Definition: server_callback.h:324
Definition: server_callback.h:47
void StartWrite(const Response *resp, WriteOptions options)
Initiate a write operation with specified options.
Definition: server_callback.h:268
virtual ~ServerCallbackWriter()
Definition: server_callback.h:184
Definition: server_callback.h:436
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:164
virtual void OnReadDone(bool ok)
Definition: server_callback.h:379
Primary implementation of CallOpSetInterface.
Definition: call_op_set.h:826
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:793
void StartRead(Request *req)
Definition: server_callback.h:366
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:419
virtual void grpc_call_unref(grpc_call *call)=0
DefaultMessageHolder()
Definition: server_callback.h:84
virtual void SendInitialMetadata(std::function< void(bool)>)=0
Definition: async_unary_call.h:303
void StartWriteAndFinish(const Response *resp, WriteOptions options, Status s)
Definition: server_callback.h:402
void OnDone() override
Definition: server_callback.h:421
Definition: grpc_types.h:40
virtual void OnWriteDone(bool ok)
Notifies the application that a StartWrite (or StartWriteLast) operation completed.
Definition: server_callback.h:337
grpc_call * call() const
Definition: call.h:72
Definition: server_callback.h:204
void StartWrite(const Response *resp)
Initiate a write operation.
Definition: server_callback.h:260
ServerReadReactor is the interface for a client-streaming RPC.
Definition: server_callback.h:104
void BindReactor(ServerWriteReactor< Request, Response > *reactor)
Definition: server_callback.h:198
void StartSendInitialMetadata()
Do NOT call any operation initiation method (names that start with Start) until after the library has...
Definition: server_callback.h:247
::google::protobuf::util::Status Status
Definition: config_protobuf.h:96
void OnCancel() override
Notifies the application that this RPC has been cancelled.
Definition: server_callback.h:347
CallbackBidiHandler(std::function< experimental::ServerBidiReactor< RequestType, ResponseType > *()> func)
Definition: server_callback.h:966
virtual void OnStarted(ServerContext *context, const Request *req)
Similar to ServerBidiReactor::OnStarted, except that this also provides the request object sent by th...
Definition: server_callback.h:416
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:971
void Finish(Status s)
Definition: server_callback.h:367
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:58
virtual void OnStarted(ServerContext *context)
Notify the application that a streaming RPC has started and that it is now ok to call any operation i...
Definition: server_callback.h:316
void StartWriteLast(const Response *resp, WriteOptions options)
Definition: server_callback.h:406
ResponseT * response()
Definition: message_allocator.h:47
Definition: call_op_set.h:634
RequestT * request()
Definition: message_allocator.h:46
void * Deserialize(grpc_call *call, grpc_byte_buffer *req, Status *status, void **handler_data) final
Definition: server_callback.h:821
CallbackServerStreamingHandler(std::function< experimental::ServerWriteReactor< RequestType, ResponseType > *()> func)
Definition: server_callback.h:788
void SetMessageAllocator(experimental::MessageAllocator< RequestType, ResponseType > *allocator)
Definition: server_callback.h:474
void StartWrite(const Response *resp, WriteOptions options)
Definition: server_callback.h:399
void Release()
Forget underlying byte buffer without destroying Use this only for un-owned byte buffers.
Definition: byte_buffer.h:144
void OnDone() override
Definition: server_callback.h:439
void StartRead(Request *req)
Initiate a read operation.
Definition: server_callback.h:253
Definition: call_op_set.h:293
Definition: server_callback.h:49
This header provides an object that reads bytes directly from a grpc::ByteBuffer, via the ZeroCopyInp...
Definition: alarm.h:24
void Finish(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:308
ServerBidiReactor is the interface for a bidirectional streaming RPC.
Definition: server_callback.h:108
void OnCancel() override
Definition: server_callback.h:381
CoreCodegenInterface * g_core_codegen_interface
Definition: call_op_set.h:51
Definition: message_allocator.h:40
Definition: server_callback.h:167
ReturnType * CatchingReactorCreator(Func &&func, Args &&... args)
Definition: callback_common.h:51
Definition: rpc_service_method.h:42
CallbackClientStreamingHandler(std::function< experimental::ServerReadReactor< RequestType, ResponseType > *()> func)
Definition: server_callback.h:644
A ServerContext allows the person implementing a service handler to:
Definition: server_context.h:114
Per-message write options.
Definition: call_op_set.h:85
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:649
Definition: byte_buffer.h:49
Definition: server_callback.h:81
virtual void SendInitialMetadata()=0
void OnCancel() override
Definition: server_callback.h:422
virtual void * grpc_call_arena_alloc(grpc_call *call, size_t length)=0
virtual void OnWriteDone(bool ok)
Definition: server_callback.h:420
CallbackWithSuccessTag can be reused multiple times, and will be used in this fashion for streaming o...
Definition: callback_common.h:132
Definition: server_callback.h:182
bool ok() const
Is the status OK?
Definition: status.h:118
Base class for running an RPC handler.
Definition: rpc_service_method.h:39
Definition: server_callback.h:43
void StartWriteLast(const Response *resp, WriteOptions options)
Inform system of a planned write operation with specified options, but allow the library to schedule ...
Definition: server_callback.h:298
void OnStarted(ServerContext *, Response *) override
Similar to ServerBidiReactor::OnStarted, except that this also provides the response object that the ...
Definition: server_callback.h:440
virtual void SendInitialMetadata()=0
Did it work? If it didn't, why?
Definition: status.h:31
Operation is not implemented or not supported/enabled in this service.
Definition: status_code_enum.h:115
void CatchingCallback(Func &&func, Args &&... args)
An exception-safe way of invoking a user-specified callback function.
Definition: callback_common.h:38
Definition: server_callback.h:112
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:365
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:378
ServerWriteReactor is the interface for a server-streaming RPC.
Definition: server_callback.h:106
Definition: message_allocator.h:27
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:189
void OnStarted(ServerContext *) override
Notify the application that a streaming RPC has started and that it is now ok to call any operation i...
Definition: server_callback.h:460
virtual ~ServerCallbackReader()
Definition: server_callback.h:169
Definition: byte_buffer.h:51
void OnDone() override
Notifies the application that all operations associated with this RPC have completed.
Definition: server_callback.h:342
void StartWrite(const Response *resp)
Definition: server_callback.h:398
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:397
void Finish(Status s)
Definition: server_callback.h:409
void BindReactor(ServerReadReactor< Request, Response > *reactor)
Definition: server_callback.h:176
void OnDone() override
Definition: server_callback.h:380
virtual void OnReadDone(bool ok)
Notifies the application that a StartRead operation completed.
Definition: server_callback.h:330
A sequence of bytes.
Definition: byte_buffer.h:65
void OnDone() override
Notifies the application that all operations associated with this RPC have completed.
Definition: server_callback.h:459
virtual void WriteAndFinish(const Response *msg, WriteOptions options, Status s)
Definition: server_callback.h:189
virtual void SendInitialMetadata()=0
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:479
Straightforward wrapping of the C call object.
Definition: call.h:38
void * Deserialize(grpc_call *call, grpc_byte_buffer *req, Status *status, void **handler_data) final
Definition: server_callback.h:501
virtual void WriteAndFinish(const Response *msg, WriteOptions options, Status s)
Definition: server_callback.h:212
virtual ~ServerReactor()=default
void OnStarted(ServerContext *, const Request *) override
Similar to ServerBidiReactor::OnStarted, except that this also provides the request object sent by th...
Definition: server_callback.h:450
Definition: server_callback.h:446
virtual ~ServerCallbackReaderWriter()
Definition: server_callback.h:206
CallbackUnaryHandler(std::function< void(ServerContext *, const RequestType *, ResponseType *, experimental::ServerCallbackRpcController *)> func)
Definition: server_callback.h:468