18 #ifndef GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H 19 #define GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H 23 #include <type_traits> 41 template <
class Request,
class Response>
43 template <
class Request,
class Response>
45 template <
class Request,
class Response>
56 template <
class Request,
class Response>
58 template <
class Request,
class Response>
60 template <
class Request,
class Response>
69 void MaybeCallOnCancel() {
70 if (
GPR_UNLIKELY(on_cancel_conditions_remaining_.fetch_sub(
71 1, std::memory_order_acq_rel) == 1)) {
76 std::atomic<intptr_t> on_cancel_conditions_remaining_{2};
79 template <
class Request,
class Response>
84 this->set_request(&request_obj_);
85 this->set_response(&response_obj_);
94 Response response_obj_;
99 namespace experimental {
102 template <
class Request,
class Response>
104 template <
class Request,
class Response>
106 template <
class Request,
class Response>
121 virtual void SendInitialMetadata(std::function<
void(
bool)>) = 0;
154 virtual void SetCancelCallback(std::function<
void()> callback) = 0;
155 virtual void ClearCancelCallback() = 0;
165 template <
class Request>
170 virtual void SendInitialMetadata() = 0;
171 virtual void Read(Request* msg) = 0;
174 template <
class Response>
176 reactor->InternalBindReader(
this);
180 template <
class Response>
186 virtual void SendInitialMetadata() = 0;
191 Write(msg, std::move(options));
192 Finish(std::move(s));
196 template <
class Request>
198 reactor->InternalBindWriter(
this);
202 template <
class Request,
class Response>
208 virtual void SendInitialMetadata() = 0;
209 virtual void Read(Request* msg) = 0;
214 Write(msg, std::move(options));
215 Finish(std::move(s));
220 reactor->InternalBindStream(
this);
235 template <
class Request,
class Response>
270 stream_->Write(resp, std::move(options));
288 stream_->WriteAndFinish(resp, std::move(options), std::move(s));
354 virtual void InternalBindStream(
363 template <
class Request,
class Response>
399 template <
class Request,
class Response>
410 writer_->Write(resp, std::move(options));
414 writer_->WriteAndFinish(resp, std::move(options), std::move(s));
427 const Request* req) {}
450 template <
class Request,
class Response>
460 template <
class Request,
class Response>
470 template <
class Request,
class Response>
480 template <
class RequestType,
class ResponseType>
493 allocator_ = allocator;
499 auto* allocator_state =
static_cast< 501 param.internal_data);
504 param.call->call(),
sizeof(ServerCallbackRpcControllerImpl)))
505 ServerCallbackRpcControllerImpl(param.server_context, param.call,
507 std::move(param.call_requester));
513 controller->
response(), controller);
516 controller->Finish(status);
524 RequestType* request =
nullptr;
526 allocator_state =
nullptr;
527 if (allocator_ !=
nullptr) {
528 allocator_state = allocator_->AllocateMessages();
535 *handler_data = allocator_state;
536 request = allocator_state->
request();
558 class ServerCallbackRpcControllerImpl
562 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
564 if (!ctx_->sent_initial_metadata_) {
566 ctx_->initial_metadata_flags());
567 if (ctx_->compression_level_set()) {
568 finish_ops_.set_compression_level(ctx_->compression_level());
570 ctx_->sent_initial_metadata_ =
true;
574 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
575 finish_ops_.SendMessagePtr(response()));
577 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
579 finish_ops_.set_core_cq_tag(&finish_tag_);
580 call_.PerformOps(&finish_ops_);
583 void SendInitialMetadata(std::function<
void(
bool)> f)
override {
585 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
588 meta_tag_.Set(call_.call(),
594 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
595 ctx_->initial_metadata_flags());
596 if (ctx_->compression_level_set()) {
597 meta_ops_.set_compression_level(ctx_->compression_level());
599 ctx_->sent_initial_metadata_ =
true;
600 meta_ops_.set_core_cq_tag(&meta_tag_);
601 call_.PerformOps(&meta_ops_);
607 void SetCancelCallback(std::function<
void()> callback)
override {
608 ctx_->SetCancelCallback(std::move(callback));
611 void ClearCancelCallback()
override { ctx_->ClearCancelCallback(); }
614 return allocator_state_;
620 ServerCallbackRpcControllerImpl(
624 std::function<
void()> call_requester)
627 allocator_state_(allocator_state),
628 call_requester_(std::move(call_requester)) {
629 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); },
nullptr);
632 const RequestType* request() {
return allocator_state_->request(); }
633 ResponseType* response() {
return allocator_state_->response(); }
637 1, std::memory_order_acq_rel) == 1)) {
639 auto call_requester = std::move(call_requester_);
640 allocator_state_->Release();
641 this->~ServerCallbackRpcControllerImpl();
660 std::function<void()> call_requester_;
661 std::atomic<intptr_t> callbacks_outstanding_{
666 template <
class RequestType,
class ResponseType>
673 : func_(
std::move(func)) {}
685 if (reactor ==
nullptr) {
691 param.call->call(),
sizeof(ServerCallbackReaderImpl)))
692 ServerCallbackReaderImpl(param.server_context, param.call,
693 std::move(param.call_requester), reactor);
695 reader->BindReactor(reactor);
696 reactor->
OnStarted(param.server_context, reader->response());
698 reactor->MaybeCallOnCancel();
703 std::function<experimental::ServerReadReactor<RequestType, ResponseType>*()>
706 class ServerCallbackReaderImpl
710 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
712 if (!ctx_->sent_initial_metadata_) {
714 ctx_->initial_metadata_flags());
715 if (ctx_->compression_level_set()) {
716 finish_ops_.set_compression_level(ctx_->compression_level());
718 ctx_->sent_initial_metadata_ =
true;
722 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_,
723 finish_ops_.SendMessagePtr(&resp_));
725 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
727 finish_ops_.set_core_cq_tag(&finish_tag_);
728 call_.PerformOps(&finish_ops_);
731 void SendInitialMetadata()
override {
733 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
734 meta_tag_.Set(call_.call(),
736 reactor_->OnSendInitialMetadataDone(ok);
740 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
741 ctx_->initial_metadata_flags());
742 if (ctx_->compression_level_set()) {
743 meta_ops_.set_compression_level(ctx_->compression_level());
745 ctx_->sent_initial_metadata_ =
true;
746 meta_ops_.set_core_cq_tag(&meta_tag_);
747 call_.PerformOps(&meta_ops_);
750 void Read(RequestType* req)
override {
751 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
752 read_ops_.RecvMessage(req);
753 call_.PerformOps(&read_ops_);
759 ServerCallbackReaderImpl(
761 std::function<
void()> call_requester,
765 call_requester_(std::move(call_requester)),
767 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
768 read_tag_.Set(call_.call(),
770 reactor_->OnReadDone(ok);
774 read_ops_.set_core_cq_tag(&read_tag_);
777 ~ServerCallbackReaderImpl() {}
779 ResponseType* response() {
return &resp_; }
783 1, std::memory_order_acq_rel) == 1)) {
786 auto call_requester = std::move(call_requester_);
787 this->~ServerCallbackReaderImpl();
808 std::function<void()> call_requester_;
810 std::atomic<intptr_t> callbacks_outstanding_{
815 template <
class RequestType,
class ResponseType>
822 : func_(
std::move(func)) {}
834 if (reactor ==
nullptr) {
840 param.call->call(),
sizeof(ServerCallbackWriterImpl)))
841 ServerCallbackWriterImpl(param.server_context, param.call,
842 static_cast<RequestType*>(param.request),
843 std::move(param.call_requester), reactor);
844 writer->BindReactor(reactor);
845 reactor->
OnStarted(param.server_context, writer->request());
847 reactor->MaybeCallOnCancel();
857 call,
sizeof(RequestType))) RequestType();
864 request->~RequestType();
869 std::function<experimental::ServerWriteReactor<RequestType, ResponseType>*()>
872 class ServerCallbackWriterImpl
876 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
878 finish_ops_.set_core_cq_tag(&finish_tag_);
880 if (!ctx_->sent_initial_metadata_) {
882 ctx_->initial_metadata_flags());
883 if (ctx_->compression_level_set()) {
884 finish_ops_.set_compression_level(ctx_->compression_level());
886 ctx_->sent_initial_metadata_ =
true;
888 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
889 call_.PerformOps(&finish_ops_);
892 void SendInitialMetadata()
override {
894 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
895 meta_tag_.Set(call_.call(),
897 reactor_->OnSendInitialMetadataDone(ok);
901 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
902 ctx_->initial_metadata_flags());
903 if (ctx_->compression_level_set()) {
904 meta_ops_.set_compression_level(ctx_->compression_level());
906 ctx_->sent_initial_metadata_ =
true;
907 meta_ops_.set_core_cq_tag(&meta_tag_);
908 call_.PerformOps(&meta_ops_);
911 void Write(
const ResponseType* resp,
913 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
917 if (!ctx_->sent_initial_metadata_) {
918 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
919 ctx_->initial_metadata_flags());
920 if (ctx_->compression_level_set()) {
921 write_ops_.set_compression_level(ctx_->compression_level());
923 ctx_->sent_initial_metadata_ =
true;
927 call_.PerformOps(&write_ops_);
938 Finish(std::move(s));
944 ServerCallbackWriterImpl(
946 const RequestType* req, std::function<
void()> call_requester,
951 call_requester_(std::move(call_requester)),
953 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
954 write_tag_.Set(call_.call(),
956 reactor_->OnWriteDone(ok);
960 write_ops_.set_core_cq_tag(&write_tag_);
962 ~ServerCallbackWriterImpl() { req_->~RequestType(); }
964 const RequestType* request() {
return req_; }
968 1, std::memory_order_acq_rel) == 1)) {
971 auto call_requester = std::move(call_requester_);
972 this->~ServerCallbackWriterImpl();
987 grpc::internal::CallOpSendMessage>
993 const RequestType* req_;
994 std::function<void()> call_requester_;
996 std::atomic<intptr_t> callbacks_outstanding_{
1001 template <
class RequestType,
class ResponseType>
1008 : func_(
std::move(func)) {}
1019 if (reactor ==
nullptr) {
1025 param.call->call(),
sizeof(ServerCallbackReaderWriterImpl)))
1026 ServerCallbackReaderWriterImpl(param.server_context, param.call,
1027 std::move(param.call_requester),
1030 stream->BindReactor(reactor);
1031 reactor->
OnStarted(param.server_context);
1033 reactor->MaybeCallOnCancel();
1034 stream->MaybeDone();
1038 std::function<experimental::ServerBidiReactor<RequestType, ResponseType>*()>
1041 class ServerCallbackReaderWriterImpl
1046 finish_tag_.Set(call_.call(), [
this](bool) { MaybeDone(); },
1048 finish_ops_.set_core_cq_tag(&finish_tag_);
1050 if (!ctx_->sent_initial_metadata_) {
1052 ctx_->initial_metadata_flags());
1053 if (ctx_->compression_level_set()) {
1054 finish_ops_.set_compression_level(ctx_->compression_level());
1056 ctx_->sent_initial_metadata_ =
true;
1058 finish_ops_.ServerSendStatus(&ctx_->trailing_metadata_, s);
1059 call_.PerformOps(&finish_ops_);
1062 void SendInitialMetadata()
override {
1064 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
1065 meta_tag_.Set(call_.call(),
1067 reactor_->OnSendInitialMetadataDone(ok);
1071 meta_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1072 ctx_->initial_metadata_flags());
1073 if (ctx_->compression_level_set()) {
1074 meta_ops_.set_compression_level(ctx_->compression_level());
1076 ctx_->sent_initial_metadata_ =
true;
1077 meta_ops_.set_core_cq_tag(&meta_tag_);
1078 call_.PerformOps(&meta_ops_);
1081 void Write(
const ResponseType* resp,
1083 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
1087 if (!ctx_->sent_initial_metadata_) {
1088 write_ops_.SendInitialMetadata(&ctx_->initial_metadata_,
1089 ctx_->initial_metadata_flags());
1090 if (ctx_->compression_level_set()) {
1091 write_ops_.set_compression_level(ctx_->compression_level());
1093 ctx_->sent_initial_metadata_ =
true;
1097 call_.PerformOps(&write_ops_);
1107 Finish(std::move(s));
1110 void Read(RequestType* req)
override {
1111 callbacks_outstanding_.fetch_add(1, std::memory_order_relaxed);
1112 read_ops_.RecvMessage(req);
1113 call_.PerformOps(&read_ops_);
1119 ServerCallbackReaderWriterImpl(
1121 std::function<
void()> call_requester,
1125 call_requester_(std::move(call_requester)),
1127 ctx_->BeginCompletionOp(call, [
this](
bool) { MaybeDone(); }, reactor);
1128 write_tag_.Set(call_.call(),
1130 reactor_->OnWriteDone(ok);
1134 write_ops_.set_core_cq_tag(&write_tag_);
1135 read_tag_.Set(call_.call(),
1137 reactor_->OnReadDone(ok);
1141 read_ops_.set_core_cq_tag(&read_tag_);
1143 ~ServerCallbackReaderWriterImpl() {}
1147 1, std::memory_order_acq_rel) == 1)) {
1150 auto call_requester = std::move(call_requester_);
1151 this->~ServerCallbackReaderWriterImpl();
1166 grpc::internal::CallOpSendMessage>
1175 std::function<void()> call_requester_;
1177 std::atomic<intptr_t> callbacks_outstanding_{
1186 #endif // GRPCPP_IMPL_CODEGEN_SERVER_CALLBACK_IMPL_H ServerReadReactor is the interface for a client-streaming RPC.
Definition: server_callback_impl.h:103
struct grpc_call grpc_call
A Call represents an RPC.
Definition: grpc_types.h:70
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback_impl.h:496
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_impl.h:475
void OnStarted(::grpc_impl::ServerContext *, Response *) override
Similar to ServerBidiReactor::OnStarted, except that this also provides the response object that the ...
Definition: server_callback_impl.h:455
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Initiate a write operation with specified options.
Definition: server_callback_impl.h:269
void StartRead(Request *req)
Initiate a read operation.
Definition: server_callback_impl.h:252
Definition: byte_buffer.h:38
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)
Definition: server_callback_impl.h:188
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_impl.h:379
virtual ~ServerCallbackWriter()
Definition: server_callback_impl.h:183
void BindReactor(ServerReadReactor< Request, Response > *reactor)
Definition: server_callback_impl.h:175
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
virtual ~ServerCallbackReaderWriter()
Definition: server_callback_impl.h:205
ServerWriteReactor is the interface for a server-streaming RPC.
Definition: server_callback_impl.h:105
Definition: server_callback_impl.h:80
Definition: server_callback_impl.h:471
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
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback_impl.h:674
void * Deserialize(grpc_call *call, grpc_byte_buffer *req, ::grpc::Status *status, void **handler_data) final
Definition: server_callback_impl.h:851
void OnCancel() override
Notifies the application that this RPC has been cancelled.
Definition: server_callback_impl.h:348
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_impl.h:426
void SetMessageAllocator(::grpc::experimental::MessageAllocator< RequestType, ResponseType > *allocator)
Definition: server_callback_impl.h:490
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback_impl.h:405
virtual void grpc_call_unref(grpc_call *call)=0
Definition: server_callback_impl.h:181
Definition: server_callback_impl.h:203
Definition: async_unary_call_impl.h:302
void StartWrite(const Response *resp)
Initiate a write operation.
Definition: server_callback_impl.h:259
void Finish(::grpc::Status s)
Definition: server_callback_impl.h:419
virtual void OnReadDone(bool ok)
Definition: server_callback_impl.h:383
void OnCancel() override
Definition: server_callback_impl.h:433
Definition: grpc_types.h:40
virtual void SendInitialMetadata()=0
void StartSendInitialMetadata()
The following operation initiations are exactly like ServerBidiReactor.
Definition: server_callback_impl.h:369
virtual void WriteAndFinish(const Response *msg, ::grpc::WriteOptions options, ::grpc::Status s)
Definition: server_callback_impl.h:211
grpc_call * call() const
Definition: call.h:72
void Finish(::grpc::Status s)
Definition: server_callback_impl.h:371
::grpc_impl::ServerContext ServerContext
Definition: server_context.h:25
A ServerContext allows the person implementing a service handler to:
Definition: server_context_impl.h:118
void OnDone() override
Definition: server_callback_impl.h:454
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_impl.h:286
Definition: server_callback_impl.h:461
void BindReactor(ServerWriteReactor< Request, Response > *reactor)
Definition: server_callback_impl.h:197
void OnDone() override
Notifies the application that all operations associated with this RPC have completed.
Definition: server_callback_impl.h:474
void StartWrite(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback_impl.h:409
Defines how to serialize and deserialize some type.
Definition: serialization_traits.h:58
virtual ~ServerCallbackReader()
Definition: server_callback_impl.h:168
CallbackServerStreamingHandler(std::function< experimental::ServerWriteReactor< RequestType, ResponseType > *()> func)
Definition: server_callback_impl.h:818
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_impl.h:299
ResponseT * response()
Definition: message_allocator.h:47
Definition: call_op_set.h:629
RequestT * request()
Definition: message_allocator.h:46
CallbackBidiHandler(std::function< experimental::ServerBidiReactor< RequestType, ResponseType > *()> func)
Definition: server_callback_impl.h:1004
void StartRead(Request *req)
Definition: server_callback_impl.h:370
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback_impl.h:823
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_impl.h:317
void OnCancel() override
Definition: server_callback_impl.h:385
void StartSendInitialMetadata()
Do NOT call any operation initiation method (names that start with Start) until after the library has...
Definition: server_callback_impl.h:246
void Release()
Forget underlying byte buffer without destroying Use this only for un-owned byte buffers.
Definition: byte_buffer.h:151
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback_impl.h:382
Definition: call_op_set.h:288
Definition: server_callback_impl.h:111
void OnDone() override
Definition: server_callback_impl.h:384
void BindReactor(ServerBidiReactor< Request, Response > *reactor)
Definition: server_callback_impl.h:219
Definition: server_callback_impl.h:166
virtual void OnSendInitialMetadataDone(bool ok)
Notifies the application that an explicit StartSendInitialMetadata operation completed.
Definition: server_callback_impl.h:325
Definition: byte_buffer.h:36
CoreCodegenInterface * g_core_codegen_interface
Definition: completion_queue_impl.h:91
virtual void SendInitialMetadata()=0
Definition: message_allocator.h:40
virtual void OnSendInitialMetadataDone(bool ok)
The following notifications are exactly like ServerBidiReactor.
Definition: server_callback_impl.h:430
void StartWriteLast(const Response *resp, ::grpc::WriteOptions options)
Definition: server_callback_impl.h:416
ReturnType * CatchingReactorCreator(Func &&func, Args &&... args)
Definition: callback_common.h:51
Definition: rpc_service_method.h:44
virtual void OnReadDone(bool ok)
Notifies the application that a StartRead operation completed.
Definition: server_callback_impl.h:331
DefaultMessageHolder()
Definition: server_callback_impl.h:83
Per-message write options.
Definition: call_op_set.h:85
void OnDone() override
Notifies the application that all operations associated with this RPC have completed.
Definition: server_callback_impl.h:343
void OnDone() override
Definition: server_callback_impl.h:432
CallbackUnaryHandler(std::function< void(::grpc_impl::ServerContext *, const RequestType *, ResponseType *, experimental::ServerCallbackRpcController *)> func)
Definition: server_callback_impl.h:483
An Alarm posts the user-provided tag to its associated completion queue or invokes the user-provided ...
Definition: alarm_impl.h:33
Definition: server_callback_impl.h:46
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_impl.h:309
virtual ~ServerReactor()=default
virtual void * grpc_call_arena_alloc(grpc_call *call, size_t length)=0
void Release() override
Definition: server_callback_impl.h:87
CallbackWithSuccessTag can be reused multiple times, and will be used in this fashion for streaming o...
Definition: callback_common.h:132
bool ok() const
Is the status OK?
Definition: status.h:118
virtual void OnWriteDone(bool ok)
Definition: server_callback_impl.h:431
Base class for running an RPC handler.
Definition: rpc_service_method.h:41
void StartWrite(const Response *resp)
Definition: server_callback_impl.h:406
void * Deserialize(grpc_call *call, grpc_byte_buffer *req, ::grpc::Status *status, void **handler_data) final
Definition: server_callback_impl.h:520
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
void OnDone() override
Definition: server_callback_impl.h:464
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 void SendInitialMetadata(std::function< void(bool)>)=0
Definition: server_callback_impl.h:42
virtual void OnWriteDone(bool ok)
Notifies the application that a StartWrite (or StartWriteLast) operation completed.
Definition: server_callback_impl.h:338
void RunHandler(const HandlerParameter ¶m) final
Definition: server_callback_impl.h:1009
CallbackClientStreamingHandler(std::function< experimental::ServerReadReactor< RequestType, ResponseType > *()> func)
Definition: server_callback_impl.h:669
Definition: server_callback_impl.h:48
void StartWriteAndFinish(const Response *resp, ::grpc::WriteOptions options, ::grpc::Status s)
Definition: server_callback_impl.h:412
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_impl.h:465
A sequence of bytes.
Definition: byte_buffer.h:72
ServerBidiReactor is the interface for a bidirectional streaming RPC.
Definition: server_callback_impl.h:107
virtual void OnCancel()=0
Definition: server_callback_impl.h:451
Straightforward wrapping of the C call object.
Definition: call.h:38
virtual void SendInitialMetadata()=0