19 #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
20 #define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
31 class CompletionQueue;
95 virtual void Read(R* msg,
void* tag) = 0;
113 virtual void Write(
const W& msg,
void* tag) = 0;
169 Call call = channel->CreateCall(method, context, cq);
176 static void operator delete(
void* ptr, std::size_t size) {
191 meta_ops_.set_output_tag(tag);
192 meta_ops_.RecvInitialMetadata(context_);
196 void Read(R* msg,
void* tag)
override {
197 read_ops_.set_output_tag(tag);
198 if (!context_->initial_metadata_received_) {
199 read_ops_.RecvInitialMetadata(context_);
201 read_ops_.RecvMessage(msg);
211 finish_ops_.set_output_tag(tag);
212 if (!context_->initial_metadata_received_) {
213 finish_ops_.RecvInitialMetadata(context_);
215 finish_ops_.ClientRecvStatus(context_, status);
223 : context_(context), call_(call) {
224 init_ops_.set_output_tag(tag);
225 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
226 context->initial_metadata_flags());
229 init_ops_.ClientSendClose();
233 ClientContext* context_;
235 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
237 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
238 CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
239 CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
273 Call call = channel->CreateCall(method, context, cq);
280 static void operator delete(
void* ptr, std::size_t size) {
294 meta_ops_.set_output_tag(tag);
295 meta_ops_.RecvInitialMetadata(context_);
299 void Write(
const W& msg,
void* tag)
override {
300 write_ops_.set_output_tag(tag);
307 write_ops_.set_output_tag(tag);
310 write_ops_.ClientSendClose();
318 write_ops_.set_output_tag(tag);
319 write_ops_.ClientSendClose();
331 finish_ops_.set_output_tag(tag);
332 if (!context_->initial_metadata_received_) {
333 finish_ops_.RecvInitialMetadata(context_);
335 finish_ops_.ClientRecvStatus(context_, status);
342 : context_(context), call_(call) {
343 finish_ops_.RecvMessage(response);
344 finish_ops_.AllowNoMessage();
347 if (context_->initial_metadata_corked_) {
348 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
349 context->initial_metadata_flags());
351 write_ops_.set_output_tag(tag);
352 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
353 context->initial_metadata_flags());
358 ClientContext* context_;
360 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
361 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
363 CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage,
364 CallOpClientRecvStatus>
371 template <
class W,
class R>
387 template <
class W,
class R>
400 Call call = channel->CreateCall(method, context, cq);
408 static void operator delete(
void* ptr, std::size_t size) {
422 meta_ops_.set_output_tag(tag);
423 meta_ops_.RecvInitialMetadata(context_);
427 void Read(R* msg,
void* tag)
override {
428 read_ops_.set_output_tag(tag);
429 if (!context_->initial_metadata_received_) {
430 read_ops_.RecvInitialMetadata(context_);
432 read_ops_.RecvMessage(msg);
436 void Write(
const W& msg,
void* tag)
override {
437 write_ops_.set_output_tag(tag);
444 write_ops_.set_output_tag(tag);
447 write_ops_.ClientSendClose();
455 write_ops_.set_output_tag(tag);
456 write_ops_.ClientSendClose();
465 finish_ops_.set_output_tag(tag);
466 if (!context_->initial_metadata_received_) {
467 finish_ops_.RecvInitialMetadata(context_);
469 finish_ops_.ClientRecvStatus(context_, status);
475 : context_(context), call_(call) {
476 if (context_->initial_metadata_corked_) {
479 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
480 context->initial_metadata_flags());
482 write_ops_.set_output_tag(tag);
483 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
484 context->initial_metadata_flags());
489 ClientContext* context_;
491 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
492 CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
493 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
495 CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
498 template <
class W,
class R>
521 virtual void Finish(
const W& msg,
const Status& status,
void* tag) = 0;
547 template <
class W,
class R>
551 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
561 meta_ops_.set_output_tag(tag);
562 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
563 ctx_->initial_metadata_flags());
567 ctx_->sent_initial_metadata_ =
true;
571 void Read(R* msg,
void* tag)
override {
572 read_ops_.set_output_tag(tag);
573 read_ops_.RecvMessage(msg);
586 finish_ops_.set_output_tag(tag);
587 if (!ctx_->sent_initial_metadata_) {
588 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
589 ctx_->initial_metadata_flags());
593 ctx_->sent_initial_metadata_ =
true;
597 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
598 finish_ops_.SendMessage(msg));
600 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
613 finish_ops_.set_output_tag(tag);
614 if (!ctx_->sent_initial_metadata_) {
615 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
616 ctx_->initial_metadata_flags());
620 ctx_->sent_initial_metadata_ =
true;
622 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
627 void BindCall(
Call* call)
override { call_ = *call; }
631 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
632 CallOpSet<CallOpRecvMessage<R>> read_ops_;
633 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
634 CallOpServerSendStatus>
660 virtual void Finish(
const Status& status,
void* tag) = 0;
674 const Status& status,
void* tag) = 0;
683 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
695 meta_ops_.set_output_tag(tag);
696 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
697 ctx_->initial_metadata_flags());
701 ctx_->sent_initial_metadata_ =
true;
705 void Write(
const W& msg,
void* tag)
override {
706 write_ops_.set_output_tag(tag);
707 EnsureInitialMetadataSent(&write_ops_);
714 write_ops_.set_output_tag(tag);
719 EnsureInitialMetadataSent(&write_ops_);
733 void* tag)
override {
734 write_ops_.set_output_tag(tag);
735 EnsureInitialMetadataSent(&write_ops_);
738 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
751 finish_ops_.set_output_tag(tag);
752 EnsureInitialMetadataSent(&finish_ops_);
753 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
758 void BindCall(
Call* call)
override { call_ = *call; }
761 void EnsureInitialMetadataSent(T* ops) {
762 if (!ctx_->sent_initial_metadata_) {
763 ops->SendInitialMetadata(ctx_->initial_metadata_,
764 ctx_->initial_metadata_flags());
768 ctx_->sent_initial_metadata_ =
true;
774 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
775 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
776 CallOpServerSendStatus>
778 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
782 template <
class W,
class R>
806 virtual void Finish(
const Status& status,
void* tag) = 0;
820 const Status& status,
void* tag) = 0;
827 template <
class W,
class R>
832 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
844 meta_ops_.set_output_tag(tag);
845 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
846 ctx_->initial_metadata_flags());
850 ctx_->sent_initial_metadata_ =
true;
854 void Read(R* msg,
void* tag)
override {
855 read_ops_.set_output_tag(tag);
856 read_ops_.RecvMessage(msg);
860 void Write(
const W& msg,
void* tag)
override {
861 write_ops_.set_output_tag(tag);
862 EnsureInitialMetadataSent(&write_ops_);
869 write_ops_.set_output_tag(tag);
873 EnsureInitialMetadataSent(&write_ops_);
887 void* tag)
override {
888 write_ops_.set_output_tag(tag);
889 EnsureInitialMetadataSent(&write_ops_);
892 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
905 finish_ops_.set_output_tag(tag);
906 EnsureInitialMetadataSent(&finish_ops_);
908 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
913 friend class ::grpc::Server;
915 void BindCall(
Call* call)
override { call_ = *call; }
918 void EnsureInitialMetadataSent(T* ops) {
919 if (!ctx_->sent_initial_metadata_) {
920 ops->SendInitialMetadata(ctx_->initial_metadata_,
921 ctx_->initial_metadata_flags());
925 ctx_->sent_initial_metadata_ =
true;
931 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
932 CallOpSet<CallOpRecvMessage<R>> read_ops_;
933 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
934 CallOpServerSendStatus>
936 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
941 #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
Common interface for all client side asynchronous streaming.
Definition: async_stream.h:34
Async client-side interface for bi-directional streaming, where the outgoing message stream going to ...
Definition: async_stream.h:388
grpc_compression_level compression_level() const
Return the compression algorithm to be used by the server call.
Definition: server_context.h:170
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:571
static ClientAsyncReaderWriter * Create(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, void *tag)
Create a stream and write the first request out.
Definition: async_stream.h:396
WriteOptions & set_buffer_hint()
Sets flag indicating that the write may be buffered and need not go out on the wire immediately...
Definition: call.h:121
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:196
virtual void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag)=0
Request the writing of msg and coalesce it with trailing metadata which contains status, using WriteOptions options with identifying tag tag.
WriteOptions & set_last_message()
last-message bit: indicates this is the last message in a stream client-side: makes Write the equival...
Definition: call.h:160
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:126
virtual void WritesDone(void *tag)=0
Signal the client is done with the writes (half-close the client stream).
virtual void Write(const W &msg, void *tag)=0
Request the writing of msg with identifying tag tag.
Async server-side API for doing bidirectional streaming RPCs, where the incoming message stream comin...
Definition: async_stream.h:828
static ClientAsyncReader * Create(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, const W &request, void *tag)
Create a stream and write the first request out.
Definition: async_stream.h:165
void FinishWithError(const Status &status, void *tag) override
See the ServerAsyncReaderInterface.Read method for semantics.
Definition: async_stream.h:611
void Write(const W &msg, WriteOptions options, void *tag) override
Request the writing of msg using WriteOptions options with identifying tag tag.
Definition: async_stream.h:868
Definition: service_type.h:38
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:464
Definition: async_stream.h:499
void WriteLast(const W &msg, WriteOptions options, void *tag)
Request the writing of msg and coalesce it with the writing of trailing metadata, using WriteOptions ...
Definition: async_stream.h:144
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:210
virtual void WritesDone(void *tag)=0
Signal the client is done with the writes (half-close the client stream).
A ClientContext allows the person implementing a service client to:
Definition: client_context.h:153
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:705
Async server-side API for doing server streaming RPCs, where the outgoing message stream from the ser...
Definition: async_stream.h:680
void Finish(const W &msg, const Status &status, void *tag) override
See the ServerAsyncReaderInterface.Read method for semantics.
Definition: async_stream.h:585
void Finish(const Status &status, void *tag) override
See the ServerAsyncReaderWriterInterface.Finish method for semantics.
Definition: async_stream.h:904
virtual ~AsyncReaderInterface()
Definition: async_stream.h:80
void Write(const W &msg, WriteOptions options, void *tag) override
Request the writing of msg using WriteOptions options with identifying tag tag.
Definition: async_stream.h:443
ServerAsyncReaderWriter(ServerContext *ctx)
Definition: async_stream.h:831
Definition: async_stream.h:150
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:841
Straightforward wrapping of the C call object.
Definition: call.h:647
Async client-side interface for bi-directional streaming, where the client-to-server message stream h...
Definition: async_stream.h:372
virtual void Finish(const Status &status, void *tag)=0
Indicate that the stream is to be finished with a certain status code.
Codegen interface for grpc::Channel.
Definition: channel_interface.h:49
ServerAsyncWriter(ServerContext *ctx)
Definition: async_stream.h:682
CoreCodegenInterface * g_core_codegen_interface
Definition: call.h:49
An interface that can be fed a sequence of messages of type W.
Definition: async_stream.h:100
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:692
Async API on the client side for doing client-streaming RPCs, where the outgoing message stream going...
Definition: async_stream.h:258
virtual void FinishWithError(const Status &status, void *tag)=0
Indicate that the stream is to be finished with a certain non-OK status code.
Server-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:783
void WritesDone(void *tag) override
Signal the client is done with the writes (half-close the client stream).
Definition: async_stream.h:454
A ServerContext allows the person implementing a service handler to:
Definition: server_context.h:95
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:558
Per-message write options.
Definition: call.h:81
void Write(const W &msg, WriteOptions options, void *tag) override
Request the writing of msg using WriteOptions options with identifying tag tag.
Definition: async_stream.h:713
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:299
void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag) override
See the ServerAsyncReaderWriterInterface.WriteAndFinish method for semantics.
Definition: async_stream.h:886
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue.h:86
virtual ~ClientAsyncStreamingInterface()
Definition: async_stream.h:36
virtual void * grpc_call_arena_alloc(grpc_call *call, size_t length)=0
virtual void ReadInitialMetadata(void *tag)=0
Request notification of the reading of the initial metadata.
Descriptor of an RPC method.
Definition: rpc_method.h:29
void ReadInitialMetadata(void *tag) override
See the ClientAsyncStreamingInterface.ReadInitialMetadata method for semantics.
Definition: async_stream.h:188
void PerformOps(CallOpSetInterface *ops)
Definition: call.h:663
bool ok() const
Is the status OK?
Definition: status.h:64
void Write(const W &msg, WriteOptions options, void *tag) override
Request the writing of msg using WriteOptions options with identifying tag tag.
Definition: async_stream.h:306
Did it work? If it didn't, why?
Definition: status.h:30
void Finish(const Status &status, void *tag) override
See the ServerAsyncWriterInterface.Finish method for semantics.
Definition: async_stream.h:750
void ReadInitialMetadata(void *tag) override
See the ClientAsyncStreamingInterface.ReadInitialMetadata method for semantics of this method...
Definition: async_stream.h:419
virtual void Finish(Status *status, void *tag)=0
Indicate that the stream is to be finished and request notification for when the call has been ended...
Definition: async_stream.h:639
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:330
void WritesDone(void *tag) override
Signal the client is done with the writes (half-close the client stream).
Definition: async_stream.h:317
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:436
grpc_call * call() const
Definition: call.h:667
Async client-side API for doing server-streaming RPCs, where the incoming message stream coming from ...
Definition: async_stream.h:157
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:854
virtual ~AsyncWriterInterface()
Definition: async_stream.h:102
bool compression_level_set() const
Return a bool indicating whether the compression level for this call has been set (either implicitly ...
Definition: server_context.h:185
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:860
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:427
virtual void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag)=0
Request the writing of msg and coalesce it with trailing metadata which contains status, using WriteOptions options with identifying tag tag.
void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag) override
See the ServerAsyncWriterInterface.WriteAndFinish method for semantics.
Definition: async_stream.h:732
static ClientAsyncWriter * Create(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, R *response, void *tag)
Create a stream and write the first request out.
Definition: async_stream.h:269
Async server-side API for doing client-streaming RPCs, where the incoming message stream from the cli...
Definition: async_stream.h:548
virtual void Finish(const Status &status, void *tag)=0
Indicate that the stream is to be finished with a certain status code.
virtual void Read(R *msg, void *tag)=0
Read a message of type R into msg.
void ReadInitialMetadata(void *tag) override
See the ClientAsyncStreamingInterface.ReadInitialMetadata method for semantics.
Definition: async_stream.h:291
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.h:176
ServerAsyncReader(ServerContext *ctx)
Definition: async_stream.h:550
An interface that yields a sequence of messages of type R.
Definition: async_stream.h:78
virtual void Finish(const W &msg, const Status &status, void *tag)=0
Indicate that the stream is to be finished with a certain status code and also send out msg response ...
Common interface for client side asynchronous writing.
Definition: async_stream.h:244