34 #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
35 #define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
46 class CompletionQueue;
110 virtual void Read(R* msg,
void* tag) = 0;
128 virtual void Write(
const W& msg,
void* tag) = 0;
184 Call call = channel->CreateCall(method, context, cq);
191 static void operator delete(
void* ptr, std::size_t size) {
206 meta_ops_.set_output_tag(tag);
207 meta_ops_.RecvInitialMetadata(context_);
211 void Read(R* msg,
void* tag)
override {
212 read_ops_.set_output_tag(tag);
213 if (!context_->initial_metadata_received_) {
214 read_ops_.RecvInitialMetadata(context_);
216 read_ops_.RecvMessage(msg);
226 finish_ops_.set_output_tag(tag);
227 if (!context_->initial_metadata_received_) {
228 finish_ops_.RecvInitialMetadata(context_);
230 finish_ops_.ClientRecvStatus(context_, status);
238 : context_(context), call_(call) {
239 init_ops_.set_output_tag(tag);
240 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
241 context->initial_metadata_flags());
244 init_ops_.ClientSendClose();
248 ClientContext* context_;
250 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
252 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
253 CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
254 CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
288 Call call = channel->CreateCall(method, context, cq);
295 static void operator delete(
void* ptr, std::size_t size) {
309 meta_ops_.set_output_tag(tag);
310 meta_ops_.RecvInitialMetadata(context_);
314 void Write(
const W& msg,
void* tag)
override {
315 write_ops_.set_output_tag(tag);
322 write_ops_.set_output_tag(tag);
325 write_ops_.ClientSendClose();
333 write_ops_.set_output_tag(tag);
334 write_ops_.ClientSendClose();
346 finish_ops_.set_output_tag(tag);
347 if (!context_->initial_metadata_received_) {
348 finish_ops_.RecvInitialMetadata(context_);
350 finish_ops_.ClientRecvStatus(context_, status);
357 : context_(context), call_(call) {
358 finish_ops_.RecvMessage(response);
359 finish_ops_.AllowNoMessage();
362 if (context_->initial_metadata_corked_) {
363 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
364 context->initial_metadata_flags());
366 write_ops_.set_output_tag(tag);
367 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
368 context->initial_metadata_flags());
373 ClientContext* context_;
375 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
376 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
378 CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage,
379 CallOpClientRecvStatus>
386 template <
class W,
class R>
402 template <
class W,
class R>
415 Call call = channel->CreateCall(method, context, cq);
423 static void operator delete(
void* ptr, std::size_t size) {
437 meta_ops_.set_output_tag(tag);
438 meta_ops_.RecvInitialMetadata(context_);
442 void Read(R* msg,
void* tag)
override {
443 read_ops_.set_output_tag(tag);
444 if (!context_->initial_metadata_received_) {
445 read_ops_.RecvInitialMetadata(context_);
447 read_ops_.RecvMessage(msg);
451 void Write(
const W& msg,
void* tag)
override {
452 write_ops_.set_output_tag(tag);
459 write_ops_.set_output_tag(tag);
462 write_ops_.ClientSendClose();
470 write_ops_.set_output_tag(tag);
471 write_ops_.ClientSendClose();
480 finish_ops_.set_output_tag(tag);
481 if (!context_->initial_metadata_received_) {
482 finish_ops_.RecvInitialMetadata(context_);
484 finish_ops_.ClientRecvStatus(context_, status);
490 : context_(context), call_(call) {
491 if (context_->initial_metadata_corked_) {
494 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
495 context->initial_metadata_flags());
497 write_ops_.set_output_tag(tag);
498 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
499 context->initial_metadata_flags());
504 ClientContext* context_;
506 CallOpSet<CallOpRecvInitialMetadata> meta_ops_;
507 CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>> read_ops_;
508 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose>
510 CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> finish_ops_;
513 template <
class W,
class R>
536 virtual void Finish(
const W& msg,
const Status& status,
void* tag) = 0;
562 template <
class W,
class R>
566 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
576 meta_ops_.set_output_tag(tag);
577 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
578 ctx_->initial_metadata_flags());
582 ctx_->sent_initial_metadata_ =
true;
586 void Read(R* msg,
void* tag)
override {
587 read_ops_.set_output_tag(tag);
588 read_ops_.RecvMessage(msg);
601 finish_ops_.set_output_tag(tag);
602 if (!ctx_->sent_initial_metadata_) {
603 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
604 ctx_->initial_metadata_flags());
608 ctx_->sent_initial_metadata_ =
true;
612 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
613 finish_ops_.SendMessage(msg));
615 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
628 finish_ops_.set_output_tag(tag);
629 if (!ctx_->sent_initial_metadata_) {
630 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
631 ctx_->initial_metadata_flags());
635 ctx_->sent_initial_metadata_ =
true;
637 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
642 void BindCall(
Call* call)
override { call_ = *call; }
646 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
647 CallOpSet<CallOpRecvMessage<R>> read_ops_;
648 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
649 CallOpServerSendStatus>
675 virtual void Finish(
const Status& status,
void* tag) = 0;
689 const Status& status,
void* tag) = 0;
698 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
710 meta_ops_.set_output_tag(tag);
711 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
712 ctx_->initial_metadata_flags());
716 ctx_->sent_initial_metadata_ =
true;
720 void Write(
const W& msg,
void* tag)
override {
721 write_ops_.set_output_tag(tag);
722 EnsureInitialMetadataSent(&write_ops_);
729 write_ops_.set_output_tag(tag);
734 EnsureInitialMetadataSent(&write_ops_);
748 void* tag)
override {
749 write_ops_.set_output_tag(tag);
750 EnsureInitialMetadataSent(&write_ops_);
753 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
766 finish_ops_.set_output_tag(tag);
767 EnsureInitialMetadataSent(&finish_ops_);
768 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
773 void BindCall(
Call* call)
override { call_ = *call; }
776 void EnsureInitialMetadataSent(T* ops) {
777 if (!ctx_->sent_initial_metadata_) {
778 ops->SendInitialMetadata(ctx_->initial_metadata_,
779 ctx_->initial_metadata_flags());
783 ctx_->sent_initial_metadata_ =
true;
789 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
790 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
791 CallOpServerSendStatus>
793 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
797 template <
class W,
class R>
821 virtual void Finish(
const Status& status,
void* tag) = 0;
835 const Status& status,
void* tag) = 0;
842 template <
class W,
class R>
847 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
859 meta_ops_.set_output_tag(tag);
860 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
861 ctx_->initial_metadata_flags());
865 ctx_->sent_initial_metadata_ =
true;
869 void Read(R* msg,
void* tag)
override {
870 read_ops_.set_output_tag(tag);
871 read_ops_.RecvMessage(msg);
875 void Write(
const W& msg,
void* tag)
override {
876 write_ops_.set_output_tag(tag);
877 EnsureInitialMetadataSent(&write_ops_);
884 write_ops_.set_output_tag(tag);
888 EnsureInitialMetadataSent(&write_ops_);
902 void* tag)
override {
903 write_ops_.set_output_tag(tag);
904 EnsureInitialMetadataSent(&write_ops_);
907 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
920 finish_ops_.set_output_tag(tag);
921 EnsureInitialMetadataSent(&finish_ops_);
923 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
928 friend class ::grpc::Server;
930 void BindCall(
Call* call)
override { call_ = *call; }
933 void EnsureInitialMetadataSent(T* ops) {
934 if (!ctx_->sent_initial_metadata_) {
935 ops->SendInitialMetadata(ctx_->initial_metadata_,
936 ctx_->initial_metadata_flags());
940 ctx_->sent_initial_metadata_ =
true;
946 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
947 CallOpSet<CallOpRecvMessage<R>> read_ops_;
948 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
949 CallOpServerSendStatus>
951 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
956 #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
Common interface for all client side asynchronous streaming.
Definition: async_stream.h:49
Async client-side interface for bi-directional streaming, where the outgoing message stream going to ...
Definition: async_stream.h:403
grpc_compression_level compression_level() const
Return the compression algorithm to be used by the server call.
Definition: server_context.h:184
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:586
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:411
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:136
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:211
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:175
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:137
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:843
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:180
void FinishWithError(const Status &status, void *tag) override
See the ServerAsyncReaderInterface.Read method for semantics.
Definition: async_stream.h:626
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:883
Definition: service_type.h:53
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:479
Definition: async_stream.h:514
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:159
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:225
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:168
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:720
Async server-side API for doing server streaming RPCs, where the outgoing message stream from the ser...
Definition: async_stream.h:695
void Finish(const W &msg, const Status &status, void *tag) override
See the ServerAsyncReaderInterface.Read method for semantics.
Definition: async_stream.h:600
void Finish(const Status &status, void *tag) override
See the ServerAsyncReaderWriterInterface.Finish method for semantics.
Definition: async_stream.h:919
virtual ~AsyncReaderInterface()
Definition: async_stream.h:95
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:458
ServerAsyncReaderWriter(ServerContext *ctx)
Definition: async_stream.h:846
Definition: async_stream.h:165
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:856
Straightforward wrapping of the C call object.
Definition: call.h:638
Async client-side interface for bi-directional streaming, where the client-to-server message stream h...
Definition: async_stream.h:387
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:64
ServerAsyncWriter(ServerContext *ctx)
Definition: async_stream.h:697
CoreCodegenInterface * g_core_codegen_interface
Definition: call.h:64
An interface that can be fed a sequence of messages of type W.
Definition: async_stream.h:115
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:707
Async API on the client side for doing client-streaming RPCs, where the outgoing message stream going...
Definition: async_stream.h:273
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:798
void WritesDone(void *tag) override
Signal the client is done with the writes (half-close the client stream).
Definition: async_stream.h:469
A ServerContext allows the person implementing a service handler to:
Definition: server_context.h:109
void SendInitialMetadata(void *tag) override
See ServerAsyncStreamingInterface::SendInitialMetadata for semantics.
Definition: async_stream.h:573
Per-message write options.
Definition: call.h:96
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:728
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:314
void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag) override
See the ServerAsyncReaderWriterInterface.WriteAndFinish method for semantics.
Definition: async_stream.h:901
A thin wrapper around grpc_completion_queue (see src/core/lib/surface/completion_queue.h).
Definition: completion_queue.h:101
virtual ~ClientAsyncStreamingInterface()
Definition: async_stream.h:51
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:44
void ReadInitialMetadata(void *tag) override
See the ClientAsyncStreamingInterface.ReadInitialMetadata method for semantics.
Definition: async_stream.h:203
void PerformOps(CallOpSetInterface *ops)
Definition: call.h:654
bool ok() const
Is the status OK?
Definition: status.h:76
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:321
Did it work? If it didn't, why?
Definition: status.h:45
void Finish(const Status &status, void *tag) override
See the ServerAsyncWriterInterface.Finish method for semantics.
Definition: async_stream.h:765
void ReadInitialMetadata(void *tag) override
See the ClientAsyncStreamingInterface.ReadInitialMetadata method for semantics of this method...
Definition: async_stream.h:434
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:654
void Finish(Status *status, void *tag) override
See the ClientAsyncStreamingInterface.Finish method for semantics.
Definition: async_stream.h:345
void WritesDone(void *tag) override
Signal the client is done with the writes (half-close the client stream).
Definition: async_stream.h:332
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:451
grpc_call * call() const
Definition: call.h:658
Async client-side API for doing server-streaming RPCs, where the incoming message stream coming from ...
Definition: async_stream.h:172
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:869
virtual ~AsyncWriterInterface()
Definition: async_stream.h:117
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:199
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:875
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:442
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:747
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:284
Async server-side API for doing client-streaming RPCs, where the incoming message stream from the cli...
Definition: async_stream.h:563
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:306
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:191
ServerAsyncReader(ServerContext *ctx)
Definition: async_stream.h:565
An interface that yields a sequence of messages of type R.
Definition: async_stream.h:93
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:259