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;
117 const W& request,
void* tag)
118 : context_(context), call_(channel->CreateCall(method, context, cq)) {
119 init_ops_.set_output_tag(tag);
120 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
121 context->initial_metadata_flags());
124 init_ops_.ClientSendClose();
131 meta_ops_.set_output_tag(tag);
132 meta_ops_.RecvInitialMetadata(context_);
136 void Read(R* msg,
void* tag)
override {
137 read_ops_.set_output_tag(tag);
138 if (!context_->initial_metadata_received_) {
139 read_ops_.RecvInitialMetadata(context_);
141 read_ops_.RecvMessage(msg);
146 finish_ops_.set_output_tag(tag);
147 if (!context_->initial_metadata_received_) {
148 finish_ops_.RecvInitialMetadata(context_);
150 finish_ops_.ClientRecvStatus(context_, status);
182 R* response,
void* tag)
183 : context_(context), call_(channel->CreateCall(method, context, cq)) {
184 finish_ops_.RecvMessage(response);
185 finish_ops_.AllowNoMessage();
187 init_ops_.set_output_tag(tag);
188 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
189 context->initial_metadata_flags());
196 meta_ops_.set_output_tag(tag);
197 meta_ops_.RecvInitialMetadata(context_);
201 void Write(
const W& msg,
void* tag)
override {
202 write_ops_.set_output_tag(tag);
209 writes_done_ops_.set_output_tag(tag);
210 writes_done_ops_.ClientSendClose();
215 finish_ops_.set_output_tag(tag);
216 if (!context_->initial_metadata_received_) {
217 finish_ops_.RecvInitialMetadata(context_);
219 finish_ops_.ClientRecvStatus(context_, status);
236 template <
class W,
class R>
248 template <
class W,
class R>
255 : context_(context), call_(channel->CreateCall(method, context, cq)) {
256 init_ops_.set_output_tag(tag);
257 init_ops_.SendInitialMetadata(context->send_initial_metadata_,
258 context->initial_metadata_flags());
265 meta_ops_.set_output_tag(tag);
266 meta_ops_.RecvInitialMetadata(context_);
270 void Read(R* msg,
void* tag)
override {
271 read_ops_.set_output_tag(tag);
272 if (!context_->initial_metadata_received_) {
273 read_ops_.RecvInitialMetadata(context_);
275 read_ops_.RecvMessage(msg);
279 void Write(
const W& msg,
void* tag)
override {
280 write_ops_.set_output_tag(tag);
287 writes_done_ops_.set_output_tag(tag);
288 writes_done_ops_.ClientSendClose();
293 finish_ops_.set_output_tag(tag);
294 if (!context_->initial_metadata_received_) {
295 finish_ops_.RecvInitialMetadata(context_);
297 finish_ops_.ClientRecvStatus(context_, status);
312 template <
class W,
class R>
316 virtual void Finish(
const W& msg,
const Status& status,
void* tag) = 0;
321 template <
class W,
class R>
325 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
330 meta_ops_.set_output_tag(tag);
331 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
332 ctx_->initial_metadata_flags());
336 ctx_->sent_initial_metadata_ =
true;
340 void Read(R* msg,
void* tag)
override {
341 read_ops_.set_output_tag(tag);
342 read_ops_.RecvMessage(msg);
347 finish_ops_.set_output_tag(tag);
348 if (!ctx_->sent_initial_metadata_) {
349 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
350 ctx_->initial_metadata_flags());
354 ctx_->sent_initial_metadata_ =
true;
358 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_,
359 finish_ops_.SendMessage(msg));
361 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
368 finish_ops_.set_output_tag(tag);
369 if (!ctx_->sent_initial_metadata_) {
370 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
371 ctx_->initial_metadata_flags());
375 ctx_->sent_initial_metadata_ =
true;
377 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
382 void BindCall(
Call* call)
override { call_ = *call; }
386 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
387 CallOpSet<CallOpRecvMessage<R>> read_ops_;
388 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
389 CallOpServerSendStatus>
397 virtual void Finish(
const Status& status,
void* tag) = 0;
404 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
409 meta_ops_.set_output_tag(tag);
410 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
411 ctx_->initial_metadata_flags());
415 ctx_->sent_initial_metadata_ =
true;
419 void Write(
const W& msg,
void* tag)
override {
420 write_ops_.set_output_tag(tag);
421 if (!ctx_->sent_initial_metadata_) {
422 write_ops_.SendInitialMetadata(ctx_->initial_metadata_,
423 ctx_->initial_metadata_flags());
427 ctx_->sent_initial_metadata_ =
true;
435 finish_ops_.set_output_tag(tag);
436 if (!ctx_->sent_initial_metadata_) {
437 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
438 ctx_->initial_metadata_flags());
442 ctx_->sent_initial_metadata_ =
true;
444 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
449 void BindCall(
Call* call)
override { call_ = *call; }
453 CallOpSet<CallOpSendInitialMetadata> meta_ops_;
454 CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage> write_ops_;
455 CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> finish_ops_;
459 template <
class W,
class R>
464 virtual void Finish(
const Status& status,
void* tag) = 0;
467 template <
class W,
class R>
472 : call_(nullptr, nullptr, nullptr), ctx_(ctx) {}
477 meta_ops_.set_output_tag(tag);
478 meta_ops_.SendInitialMetadata(ctx_->initial_metadata_,
479 ctx_->initial_metadata_flags());
483 ctx_->sent_initial_metadata_ =
true;
487 void Read(R* msg,
void* tag)
override {
488 read_ops_.set_output_tag(tag);
489 read_ops_.RecvMessage(msg);
493 void Write(
const W& msg,
void* tag)
override {
494 write_ops_.set_output_tag(tag);
495 if (!ctx_->sent_initial_metadata_) {
496 write_ops_.SendInitialMetadata(ctx_->initial_metadata_,
497 ctx_->initial_metadata_flags());
501 ctx_->sent_initial_metadata_ =
true;
509 finish_ops_.set_output_tag(tag);
510 if (!ctx_->sent_initial_metadata_) {
511 finish_ops_.SendInitialMetadata(ctx_->initial_metadata_,
512 ctx_->initial_metadata_flags());
516 ctx_->sent_initial_metadata_ =
true;
518 finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status);
523 friend class ::grpc::Server;
525 void BindCall(
Call* call)
override { call_ = *call; }
537 #endif // GRPCXX_IMPL_CODEGEN_ASYNC_STREAM_H
Common interface for all client side asynchronous streaming.
Definition: async_stream.h:49
Definition: async_stream.h:249
grpc_compression_level compression_level() const
Definition: server_context.h:132
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:340
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:136
#define GPR_CODEGEN_ASSERT(x)
Codegen specific version of GPR_ASSERT.
Definition: core_codegen_interface.h:121
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:468
void FinishWithError(const Status &status, void *tag) override
Definition: async_stream.h:366
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:292
Definition: async_stream.h:313
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:145
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:419
Definition: async_stream.h:401
ClientAsyncWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, R *response, void *tag)
Definition: async_stream.h:180
void Finish(const W &msg, const Status &status, void *tag) override
Definition: async_stream.h:346
void Finish(const Status &status, void *tag) override
Definition: async_stream.h:508
virtual ~AsyncReaderInterface()
Definition: async_stream.h:73
ServerAsyncReaderWriter(ServerContext *ctx)
Definition: async_stream.h:471
ClientAsyncReaderWriter(ChannelInterface *channel, CompletionQueue *cq, const RpcMethod &method, ClientContext *context, void *tag)
Definition: async_stream.h:252
Definition: async_stream.h:107
void SendInitialMetadata(void *tag) override
Definition: async_stream.h:474
Client-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:237
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:403
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:406
Definition: async_stream.h:177
Primary implementaiton of CallOpSetInterface.
Definition: call.h:565
virtual void FinishWithError(const Status &status, void *tag)=0
Server-side interface for asynchronous bi-directional streaming.
Definition: async_stream.h:460
void WritesDone(void *tag) override
Signal the client is done with the writes.
Definition: async_stream.h:286
Definition: server_context.h:95
void SendInitialMetadata(void *tag) override
Definition: async_stream.h:327
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:201
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:128
void PerformOps(CallOpSetInterface *ops)
Definition: call.h:633
bool ok() const
Is the status OK?
Definition: status.h:67
Did it work? If it didn't, why?
Definition: status.h:45
void Finish(const Status &status, void *tag) override
Definition: async_stream.h:434
void ReadInitialMetadata(void *tag) override
Request notification of the reading of the initial metadata.
Definition: async_stream.h:262
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:394
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:214
void WritesDone(void *tag) override
Signal the client is done with the writes.
Definition: async_stream.h:208
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:279
Definition: async_stream.h:111
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:487
virtual ~AsyncWriterInterface()
Definition: async_stream.h:92
bool compression_level_set() const
Definition: server_context.h:141
void Write(const W &msg, void *tag) override
Request the writing of msg with identifying tag tag.
Definition: async_stream.h:493
void Read(R *msg, void *tag) override
Read a message of type R into msg.
Definition: async_stream.h:270
Definition: async_stream.h:322
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:115
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:193
ServerAsyncReader(ServerContext *ctx)
Definition: async_stream.h:324
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:166