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>
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));
351 virtual void BindStream(
360 template <
class Request,
class Response>
394 template <
class Request,
class Response>
403 writer_->Write(resp, std::move(options));
407 writer_->WriteAndFinish(resp, std::move(options), std::move(s));
420 const Request* req) {}
441 template <
class Request,
class Response>
451 template <
class Request,
class Response>
461 template <
class Request,
class Response>
471 template <
class RequestType,
class ResponseType>
483 allocator_ = allocator;
489 auto* allocator_state =
491 param.internal_data);
493 param.call->call(),
sizeof(ServerCallbackRpcControllerImpl)))
494 ServerCallbackRpcControllerImpl(param.server_context, param.call,
496 std::move(param.call_requester));
497 Status status = param.status;
501 controller->
response(), controller);
504 controller->Finish(status);
509 void** handler_data)
final {
512 RequestType* request =
nullptr;
515 if (allocator_ !=
nullptr) {
516 allocator_state = allocator_->AllocateMessages();
522 *handler_data = allocator_state;
523 request = allocator_state->
request();
544 class ServerCallbackRpcControllerImpl
547 void Finish(
Status s)
override {
548 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
550 if (!ctx_->sent_initial_metadata_) {
552 ctx_->initial_metadata_flags());
553 if (ctx_->compression_level_set()) {
554 finish_ops_.set_compression_level(ctx_->compression_level());
556 ctx_->sent_initial_metadata_ =
true;
560 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
561 finish_ops_.SendMessagePtr(response()));
563 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
565 finish_ops_.set_core_cq_tag(&finish_tag_);
566 call_.PerformOps(&finish_ops_);
569 void SendInitialMetadata(std::function<
void(
bool)> f)
override {
571 callbacks_outstanding_++;
574 meta_tag_.Set(call_.call(),
580 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
581 ctx_->initial_metadata_flags());
582 if (ctx_->compression_level_set()) {
583 meta_ops_.set_compression_level(ctx_->compression_level());
585 ctx_->sent_initial_metadata_ =
true;
586 meta_ops_.set_core_cq_tag(&meta_tag_);
587 call_.PerformOps(&meta_ops_);
593 void SetCancelCallback(std::function<
void()> callback)
override {
594 ctx_->SetCancelCallback(std::move(callback));
597 void ClearCancelCallback()
override { ctx_->ClearCancelCallback(); }
600 return allocator_state_;
606 ServerCallbackRpcControllerImpl(
609 std::function<
void()> call_requester)
612 allocator_state_(allocator_state),
613 call_requester_(std::move(call_requester)) {
614 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); },
nullptr);
617 const RequestType* request() {
return allocator_state_->request(); }
618 ResponseType* response() {
return allocator_state_->response(); }
621 if (--callbacks_outstanding_ == 0) {
623 auto call_requester = std::move(call_requester_);
624 allocator_state_->Release();
625 this->~ServerCallbackRpcControllerImpl();
642 std::function<void()> call_requester_;
643 std::atomic_int callbacks_outstanding_{
648 template <
class RequestType,
class ResponseType>
655 : func_(
std::move(func)) {}
667 if (reactor ==
nullptr) {
673 param.call->call(),
sizeof(ServerCallbackReaderImpl)))
674 ServerCallbackReaderImpl(param.server_context, param.call,
675 std::move(param.call_requester), reactor);
677 reader->BindReactor(reactor);
678 reactor->
OnStarted(param.server_context, reader->response());
680 reactor->MaybeCallOnCancel();
685 std::function<experimental::ServerReadReactor<RequestType, ResponseType>*()>
688 class ServerCallbackReaderImpl
691 void Finish(
Status s)
override {
692 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
694 if (!ctx_->sent_initial_metadata_) {
696 ctx_->initial_metadata_flags());
697 if (ctx_->compression_level_set()) {
698 finish_ops_.set_compression_level(ctx_->compression_level());
700 ctx_->sent_initial_metadata_ =
true;
704 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
705 finish_ops_.SendMessagePtr(&resp_));
707 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
709 finish_ops_.set_core_cq_tag(&finish_tag_);
710 call_.PerformOps(&finish_ops_);
713 void SendInitialMetadata()
override {
715 callbacks_outstanding_++;
716 meta_tag_.Set(call_.call(),
718 reactor_->OnSendInitialMetadataDone(ok);
722 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
723 ctx_->initial_metadata_flags());
724 if (ctx_->compression_level_set()) {
725 meta_ops_.set_compression_level(ctx_->compression_level());
727 ctx_->sent_initial_metadata_ =
true;
728 meta_ops_.set_core_cq_tag(&meta_tag_);
729 call_.PerformOps(&meta_ops_);
732 void Read(RequestType* req)
override {
733 callbacks_outstanding_++;
734 read_ops_.RecvMessage(req);
735 call_.PerformOps(&read_ops_);
741 ServerCallbackReaderImpl(
743 std::function<
void()> call_requester,
747 call_requester_(std::move(call_requester)),
749 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
750 read_tag_.Set(call_.call(),
752 reactor_->OnReadDone(ok);
756 read_ops_.set_core_cq_tag(&read_tag_);
759 ~ServerCallbackReaderImpl() {}
761 ResponseType* response() {
return &resp_; }
764 if (--callbacks_outstanding_ == 0) {
767 auto call_requester = std::move(call_requester_);
768 this->~ServerCallbackReaderImpl();
786 std::function<void()> call_requester_;
788 std::atomic_int callbacks_outstanding_{
793 template <
class RequestType,
class ResponseType>
800 : func_(
std::move(func)) {}
812 if (reactor ==
nullptr) {
818 param.call->call(),
sizeof(ServerCallbackWriterImpl)))
819 ServerCallbackWriterImpl(param.server_context, param.call,
820 static_cast<RequestType*>(param.request),
821 std::move(param.call_requester), reactor);
822 writer->BindReactor(reactor);
823 reactor->
OnStarted(param.server_context, writer->request());
825 reactor->MaybeCallOnCancel();
830 void** handler_data)
final {
834 call,
sizeof(RequestType))) RequestType();
840 request->~RequestType();
845 std::function<experimental::ServerWriteReactor<RequestType, ResponseType>*()>
848 class ServerCallbackWriterImpl
851 void Finish(
Status s)
override {
852 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
854 finish_ops_.set_core_cq_tag(&finish_tag_);
856 if (!ctx_->sent_initial_metadata_) {
858 ctx_->initial_metadata_flags());
859 if (ctx_->compression_level_set()) {
860 finish_ops_.set_compression_level(ctx_->compression_level());
862 ctx_->sent_initial_metadata_ =
true;
864 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
865 call_.PerformOps(&finish_ops_);
868 void SendInitialMetadata()
override {
870 callbacks_outstanding_++;
871 meta_tag_.Set(call_.call(),
873 reactor_->OnSendInitialMetadataDone(ok);
877 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
878 ctx_->initial_metadata_flags());
879 if (ctx_->compression_level_set()) {
880 meta_ops_.set_compression_level(ctx_->compression_level());
882 ctx_->sent_initial_metadata_ =
true;
883 meta_ops_.set_core_cq_tag(&meta_tag_);
884 call_.PerformOps(&meta_ops_);
887 void Write(
const ResponseType* resp,
WriteOptions options)
override {
888 callbacks_outstanding_++;
892 if (!ctx_->sent_initial_metadata_) {
893 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
894 ctx_->initial_metadata_flags());
895 if (ctx_->compression_level_set()) {
896 write_ops_.set_compression_level(ctx_->compression_level());
898 ctx_->sent_initial_metadata_ =
true;
902 call_.PerformOps(&write_ops_);
905 void WriteAndFinish(
const ResponseType* resp,
WriteOptions options,
913 Finish(std::move(s));
919 ServerCallbackWriterImpl(
921 std::function<
void()> call_requester,
926 call_requester_(std::move(call_requester)),
928 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
929 write_tag_.Set(call_.call(),
931 reactor_->OnWriteDone(ok);
935 write_ops_.set_core_cq_tag(&write_tag_);
937 ~ServerCallbackWriterImpl() { req_->~RequestType(); }
939 const RequestType* request() {
return req_; }
942 if (--callbacks_outstanding_ == 0) {
945 auto call_requester = std::move(call_requester_);
946 this->~ServerCallbackWriterImpl();
963 const RequestType* req_;
964 std::function<void()> call_requester_;
966 std::atomic_int callbacks_outstanding_{
971 template <
class RequestType,
class ResponseType>
978 : func_(
std::move(func)) {}
989 if (reactor ==
nullptr) {
995 param.call->call(),
sizeof(ServerCallbackReaderWriterImpl)))
996 ServerCallbackReaderWriterImpl(param.server_context, param.call,
997 std::move(param.call_requester),
1000 stream->BindReactor(reactor);
1001 reactor->
OnStarted(param.server_context);
1003 reactor->MaybeCallOnCancel();
1004 stream->MaybeDone();
1008 std::function<experimental::ServerBidiReactor<RequestType, ResponseType>*()>
1011 class ServerCallbackReaderWriterImpl
1015 void Finish(
Status s)
override {
1016 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
1018 finish_ops_.set_core_cq_tag(&finish_tag_);
1020 if (!ctx_->sent_initial_metadata_) {
1022 ctx_->initial_metadata_flags());
1023 if (ctx_->compression_level_set()) {
1024 finish_ops_.set_compression_level(ctx_->compression_level());
1026 ctx_->sent_initial_metadata_ =
true;
1028 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
1029 call_.PerformOps(&finish_ops_);
1032 void SendInitialMetadata()
override {
1034 callbacks_outstanding_++;
1035 meta_tag_.Set(call_.call(),
1037 reactor_->OnSendInitialMetadataDone(ok);
1041 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1042 ctx_->initial_metadata_flags());
1043 if (ctx_->compression_level_set()) {
1044 meta_ops_.set_compression_level(ctx_->compression_level());
1046 ctx_->sent_initial_metadata_ =
true;
1047 meta_ops_.set_core_cq_tag(&meta_tag_);
1048 call_.PerformOps(&meta_ops_);
1051 void Write(
const ResponseType* resp,
WriteOptions options)
override {
1052 callbacks_outstanding_++;
1056 if (!ctx_->sent_initial_metadata_) {
1057 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1058 ctx_->initial_metadata_flags());
1059 if (ctx_->compression_level_set()) {
1060 write_ops_.set_compression_level(ctx_->compression_level());
1062 ctx_->sent_initial_metadata_ =
true;
1066 call_.PerformOps(&write_ops_);
1069 void WriteAndFinish(
const ResponseType* resp,
WriteOptions options,
1076 Finish(std::move(s));
1079 void Read(RequestType* req)
override {
1080 callbacks_outstanding_++;
1081 read_ops_.RecvMessage(req);
1082 call_.PerformOps(&read_ops_);
1088 ServerCallbackReaderWriterImpl(
1090 std::function<
void()> call_requester,
1094 call_requester_(std::move(call_requester)),
1096 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
1097 write_tag_.Set(call_.call(),
1099 reactor_->OnWriteDone(ok);
1103 write_ops_.set_core_cq_tag(&write_tag_);
1104 read_tag_.Set(call_.call(),
1106 reactor_->OnReadDone(ok);
1110 read_ops_.set_core_cq_tag(&read_tag_);
1112 ~ServerCallbackReaderWriterImpl() {}
1115 if (--callbacks_outstanding_ == 0) {
1118 auto call_requester = std::move(call_requester_);
1119 this->~ServerCallbackReaderWriterImpl();
1138 std::function<void()> call_requester_;
1140 std::atomic_int callbacks_outstanding_{
1149 #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:455
void Release() override
Definition: server_callback.h:88
virtual void OnCancel()=0
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:462
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:442
void OnStarted(::grpc_impl::ServerContext *, const Request *) override
Similar to ServerBidiReactor::OnStarted, except that this also provides the request object sent by th...
Definition: server_callback.h:456
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:380
Primary implementation of CallOpSetInterface.
Definition: call_op_set.h:821
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:801
void StartRead(Request *req)
Definition: server_callback.h:367
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:423
virtual void grpc_call_unref(grpc_call *call)=0
CallbackUnaryHandler(std::function< void(::grpc_impl::ServerContext *, const RequestType *, ResponseType *, experimental::ServerCallbackRpcController *)> func)
Definition: server_callback.h:474
DefaultMessageHolder()
Definition: server_callback.h:84
virtual void SendInitialMetadata(std::function< void(bool)>)=0
Definition: async_unary_call.h:303
void OnStarted(::grpc_impl::ServerContext *, Response *) override
Similar to ServerBidiReactor::OnStarted, except that this also provides the response object that the ...
Definition: server_callback.h:446
void StartWriteAndFinish(const Response *resp, WriteOptions options, Status s)
Definition: server_callback.h:405
void OnDone() override
Definition: server_callback.h:425
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
::grpc_impl::ServerContext ServerContext
Definition: server_context.h:25
A ServerContext allows the person implementing a service handler to:
Definition: server_context_impl.h:114
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:974
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:979
void Finish(Status s)
Definition: server_callback.h:368
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:58
void StartWriteLast(const Response *resp, WriteOptions options)
Definition: server_callback.h:409
ResponseT * response()
Definition: message_allocator.h:47
Definition: call_op_set.h:629
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:829
CallbackServerStreamingHandler(std::function< experimental::ServerWriteReactor< RequestType, ResponseType > *()> func)
Definition: server_callback.h:796
void SetMessageAllocator(experimental::MessageAllocator< RequestType, ResponseType > *allocator)
Definition: server_callback.h:481
void StartWrite(const Response *resp, WriteOptions options)
Definition: server_callback.h:402
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:445
void StartRead(Request *req)
Initiate a read operation.
Definition: server_callback.h:253
Definition: call_op_set.h:288
virtual void OnStarted(::grpc_impl::ServerContext *context, Response *resp)
Similar to ServerBidiReactor::OnStarted, except that this also provides the response object that the ...
Definition: server_callback.h:376
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:382
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:44
CallbackClientStreamingHandler(std::function< experimental::ServerReadReactor< RequestType, ResponseType > *()> func)
Definition: server_callback.h:651
void OnStarted(::grpc_impl::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:466
Per-message write options.
Definition: call_op_set.h:85
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback.h:656
Definition: byte_buffer.h:49
Definition: server_callback.h:81
virtual void SendInitialMetadata()=0
void OnCancel() override
Definition: server_callback.h:426
virtual void * grpc_call_arena_alloc(grpc_call *call, size_t length)=0
virtual void OnWriteDone(bool ok)
Definition: server_callback.h:424
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
virtual void OnStarted(::grpc_impl::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
Base class for running an RPC handler.
Definition: rpc_service_method.h:41
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
virtual void OnStarted(::grpc_impl::ServerContext *context, const Request *req)
Similar to ServerBidiReactor::OnStarted, except that this also provides the request object sent by th...
Definition: server_callback.h:419
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:366
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback.h:379
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
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:401
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback.h:400
void Finish(Status s)
Definition: server_callback.h:412
void BindReactor(ServerReadReactor< Request, Response > *reactor)
Definition: server_callback.h:176
void OnDone() override
Definition: server_callback.h:381
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:465
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:486
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:508
virtual void WriteAndFinish(const Response *msg, WriteOptions options, Status s)
Definition: server_callback.h:212
virtual ~ServerReactor()=default
Definition: server_callback.h:452
virtual ~ServerCallbackReaderWriter()
Definition: server_callback.h:206