34 #ifndef GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
35 #define GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
46 class CompletionQueue;
85 virtual void Read(R* msg,
void* tag) = 0;
103 virtual void Write(
const W& msg,
void* tag) = 0;
150 const W& request,
void* tag)
151 : context_(context), call_(channel->CreateCall(method, context, cq)) {
152 init_ops_.set_output_tag(tag);
153 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
154 context->initial_metadata_flags());
157 init_ops_.ClientSendClose();
164 meta_ops_.set_output_tag(tag);
165 meta_ops_.RecvInitialMetadata(context_);
169 void Read(R* msg,
void* tag)
override {
170 read_ops_.set_output_tag(tag);
171 if (!context_->initial_metadata_received_) {
172 read_ops_.RecvInitialMetadata(context_);
174 read_ops_.RecvMessage(msg);
179 finish_ops_.set_output_tag(tag);
180 if (!context_->initial_metadata_received_) {
181 finish_ops_.RecvInitialMetadata(context_);
183 finish_ops_.ClientRecvStatus(context_, status);
215 R* response,
void* tag)
216 : context_(context), call_(channel->CreateCall(method, context, cq)) {
217 finish_ops_.RecvMessage(response);
218 finish_ops_.AllowNoMessage();
221 if (context_->initial_metadata_corked_) {
222 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
223 context->initial_metadata_flags());
225 write_ops_.set_output_tag(tag);
226 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
227 context->initial_metadata_flags());
235 meta_ops_.set_output_tag(tag);
236 meta_ops_.RecvInitialMetadata(context_);
240 void Write(
const W& msg,
void* tag)
override {
241 write_ops_.set_output_tag(tag);
248 write_ops_.set_output_tag(tag);
251 write_ops_.ClientSendClose();
259 write_ops_.set_output_tag(tag);
260 write_ops_.ClientSendClose();
265 finish_ops_.set_output_tag(tag);
266 if (!context_->initial_metadata_received_) {
267 finish_ops_.RecvInitialMetadata(context_);
269 finish_ops_.ClientRecvStatus(context_, status);
285 template <
class W,
class R>
297 template <
class W,
class R>
304 : context_(context), call_(channel->CreateCall(method, context, cq)) {
305 if (context_->initial_metadata_corked_) {
308 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
309 context->initial_metadata_flags());
311 write_ops_.set_output_tag(tag);
312 write_ops_.SendInitialMetadata(context->send_initial_metadata_,
313 context->initial_metadata_flags());
321 meta_ops_.set_output_tag(tag);
322 meta_ops_.RecvInitialMetadata(context_);
326 void Read(R* msg,
void* tag)
override {
327 read_ops_.set_output_tag(tag);
328 if (!context_->initial_metadata_received_) {
329 read_ops_.RecvInitialMetadata(context_);
331 read_ops_.RecvMessage(msg);
335 void Write(
const W& msg,
void* tag)
override {
336 write_ops_.set_output_tag(tag);
343 write_ops_.set_output_tag(tag);
346 write_ops_.ClientSendClose();
354 write_ops_.set_output_tag(tag);
355 write_ops_.ClientSendClose();
360 finish_ops_.set_output_tag(tag);
361 if (!context_->initial_metadata_received_) {
362 finish_ops_.RecvInitialMetadata(context_);
364 finish_ops_.ClientRecvStatus(context_, status);
378 template <
class W,
class R>
382 virtual void Finish(
const W& msg,
const Status& status,
void* tag) = 0;
387 template <
class W,
class R>
391 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
396 meta_ops_.set_output_tag(tag);
397 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
398 ctx_->initial_metadata_flags());
402 ctx_->sent_initial_metadata_ =
true;
406 void Read(R* msg,
void* tag)
override {
407 read_ops_.set_output_tag(tag);
408 read_ops_.RecvMessage(msg);
413 finish_ops_.set_output_tag(tag);
414 if (!ctx_->sent_initial_metadata_) {
415 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
416 ctx_->initial_metadata_flags());
420 ctx_->sent_initial_metadata_ =
true;
424 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
425 finish_ops_.SendMessage(msg));
427 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
434 finish_ops_.set_output_tag(tag);
435 if (!ctx_->sent_initial_metadata_) {
436 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
437 ctx_->initial_metadata_flags());
441 ctx_->sent_initial_metadata_ =
true;
443 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
448 void BindCall(
Call* call)
override { call_ = *call; }
452 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
453 CallOpSet<CallOpRecvMessage<R>> read_ops_;
454 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
455 CallOpServerSendStatus>
463 virtual void Finish(
const Status& status,
void* tag) = 0;
477 const Status& status,
void* tag) = 0;
484 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
489 meta_ops_.set_output_tag(tag);
490 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
491 ctx_->initial_metadata_flags());
495 ctx_->sent_initial_metadata_ =
true;
499 void Write(
const W& msg,
void* tag)
override {
500 write_ops_.set_output_tag(tag);
501 EnsureInitialMetadataSent(&write_ops_);
508 write_ops_.set_output_tag(tag);
513 EnsureInitialMetadataSent(&write_ops_);
520 void* tag)
override {
521 write_ops_.set_output_tag(tag);
522 EnsureInitialMetadataSent(&write_ops_);
525 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
530 finish_ops_.set_output_tag(tag);
531 EnsureInitialMetadataSent(&finish_ops_);
532 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
537 void BindCall(
Call* call)
override { call_ = *call; }
540 void EnsureInitialMetadataSent(T* ops) {
541 if (!ctx_->sent_initial_metadata_) {
542 ops->SendInitialMetadata(ctx_->initial_metadata_,
543 ctx_->initial_metadata_flags());
547 ctx_->sent_initial_metadata_ =
true;
553 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
554 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
555 CallOpServerSendStatus>
557 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
561 template <
class W,
class R>
566 virtual void Finish(
const Status& status,
void* tag) = 0;
580 const Status& status,
void* tag) = 0;
583 template <
class W,
class R>
588 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
593 meta_ops_.set_output_tag(tag);
594 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
595 ctx_->initial_metadata_flags());
599 ctx_->sent_initial_metadata_ =
true;
603 void Read(R* msg,
void* tag)
override {
604 read_ops_.set_output_tag(tag);
605 read_ops_.RecvMessage(msg);
609 void Write(
const W& msg,
void* tag)
override {
610 write_ops_.set_output_tag(tag);
611 EnsureInitialMetadataSent(&write_ops_);
618 write_ops_.set_output_tag(tag);
622 EnsureInitialMetadataSent(&write_ops_);
628 void* tag)
override {
629 write_ops_.set_output_tag(tag);
630 EnsureInitialMetadataSent(&write_ops_);
633 write_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
638 finish_ops_.set_output_tag(tag);
639 EnsureInitialMetadataSent(&finish_ops_);
641 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
646 friend class ::grpc::Server;
648 void BindCall(
Call* call)
override { call_ = *call; }
651 void EnsureInitialMetadataSent(T* ops) {
652 if (!ctx_->sent_initial_metadata_) {
653 ops->SendInitialMetadata(ctx_->initial_metadata_,
654 ctx_->initial_metadata_flags());
658 ctx_->sent_initial_metadata_ =
true;
664 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
665 CallOpSet<CallOpRecvMessage<R>> read_ops_;
666 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
667 CallOpServerSendStatus>
669 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
674 #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
Common interface for all client side asynchronous streaming.
Definition: async_stream.h:49
Definition: async_stream.h:298
grpc_compression_level compression_level() const
Definition: server_context.h:131
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:406
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:135
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:169
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:174
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:122
virtual void WritesDone(void *tag)=0
Signal the client is done with the writes.
virtual void Write(const W &msg, void *tag)=0
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:584
void FinishWithError(const Status &status, void *tag) override
Definition: async_stream.h:432
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:617
Definition: service_type.h:53
void Finish(Status *status, void *tag) override
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:359
Definition: async_stream.h:379
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:134
void Finish(Status *status, void *tag) override
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:178
virtual void WritesDone(void *tag)=0
Signal the client is done with the writes.
Definition: client_context.h:154
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:499
Definition: async_stream.h:481
ClientAsyncWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, R *response, void *tag)
Definition: async_stream.h:213
void Finish(const W &msg, const Status &status, void *tag) override
Definition: async_stream.h:412
void Finish(const Status &status, void *tag) override
Definition: async_stream.h:637
virtual ~AsyncReaderInterface()
Definition: async_stream.h:73
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:342
ServerAsyncReaderWriter(ServerContext *ctx)
Definition: async_stream.h:587
ClientAsyncReaderWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, void *tag)
Definition: async_stream.h:301
Definition: async_stream.h:140
void SendInitialMetadata(void *tag) override
Definition: async_stream.h:590
Client-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:286
virtual void Finish(const Status &status, void *tag)=0
Codegen interface for grpc::Channel.
Definition: channel_interface.h:64
ServerAsyncWriter(ServerContext *ctx)
Definition: async_stream.h:483
An interface that can be fed a sequence of messages of type W.
Definition: async_stream.h:90
void SendInitialMetadata(void *tag) override
Definition: async_stream.h:486
Definition: async_stream.h:210
Primary implementaiton of CallOpSetInterface.
Definition: call.h:623
virtual void FinishWithError(const Status &status, void *tag)=0
Server-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:562
void WritesDone(void *tag) override
Signal the client is done with the writes.
Definition: async_stream.h:353
Definition: server_context.h:94
void SendInitialMetadata(void *tag) override
Definition: async_stream.h:393
Per-message write options.
Definition: call.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:507
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:240
void WriteAndFinish(const W &msg, WriteOptions options, const Status &status, void *tag) override
Request the writing of msg and coalesce it with trailing metadata which contains status, using WriteOptions options with identifying tag tag.
Definition: async_stream.h:627
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 ReadInitialMetadata(void *tag)=0
Request notification of the reading of the initial metadata.
Definition: rpc_method.h:43
void ReadInitialMetadata(void *tag) override
Request notification of the reading of the initial metadata.
Definition: async_stream.h:161
void PerformOps(CallOpSetInterface *ops)
Definition: call.h:691
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:247
Did it work? If it didn't, why?
Definition: status.h:45
void Finish(const Status &status, void *tag) override
Definition: async_stream.h:529
void ReadInitialMetadata(void *tag) override
Request notification of the reading of the initial metadata.
Definition: async_stream.h:318
virtual void Finish(Status *status, void *tag)=0
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:460
void Finish(Status *status, void *tag) override
Indicate that the stream is to be finished and request notification Should not be used concurrently w...
Definition: async_stream.h:264
void WritesDone(void *tag) override
Signal the client is done with the writes.
Definition: async_stream.h:258
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:335
Definition: async_stream.h:144
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:603
virtual ~AsyncWriterInterface()
Definition: async_stream.h:92
bool compression_level_set() const
Definition: server_context.h:140
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:609
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:326
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
Request the writing of msg and coalesce it with trailing metadata which contains status, using WriteOptions options with identifying tag tag.
Definition: async_stream.h:519
Definition: async_stream.h:388
ClientAsyncReader(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:148
virtual void Finish(const Status &status, void *tag)=0
virtual void Read(R *msg, void *tag)=0
Read a message of type R into msg.
void ReadInitialMetadata(void *tag) override
Request notification of the reading of the initial metadata.
Definition: async_stream.h:232
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:190
ServerAsyncReader(ServerContext *ctx)
Definition: async_stream.h:390
An interface that yields a sequence of messages of type R.
Definition: async_stream.h:71
virtual void Finish(const W &msg, const Status &status, void *tag)=0
Common interface for client side asynchronous writing.
Definition: async_stream.h:199