|
|
|
@ -87,28 +87,6 @@ class ClientAsyncResponseReader final |
|
|
|
|
ClientAsyncResponseReader(call, context, request); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// TODO(vjpai): Delete the below constructor
|
|
|
|
|
/// PLEASE DO NOT USE THIS CONSTRUCTOR IN NEW CODE
|
|
|
|
|
/// This code is only present as a short-term workaround
|
|
|
|
|
/// for users that bypassed the code-generator and directly
|
|
|
|
|
/// created this struct rather than properly using a stub.
|
|
|
|
|
/// This code will not remain a valid public constructor for long.
|
|
|
|
|
template <class W> |
|
|
|
|
ClientAsyncResponseReader(ChannelInterface* channel, CompletionQueue* cq, |
|
|
|
|
const RpcMethod& method, ClientContext* context, |
|
|
|
|
const W& request) |
|
|
|
|
: context_(context), |
|
|
|
|
call_(channel->CreateCall(method, context, cq)), |
|
|
|
|
collection_(std::make_shared<Ops>()) { |
|
|
|
|
collection_->init_buf.SetCollection(collection_); |
|
|
|
|
collection_->init_buf.SendInitialMetadata( |
|
|
|
|
context->send_initial_metadata_, context->initial_metadata_flags()); |
|
|
|
|
// TODO(ctiller): don't assert
|
|
|
|
|
GPR_CODEGEN_ASSERT(collection_->init_buf.SendMessage(request).ok()); |
|
|
|
|
collection_->init_buf.ClientSendClose(); |
|
|
|
|
call_.PerformOps(&collection_->init_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// always allocated against a call arena, no memory free required
|
|
|
|
|
static void operator delete(void* ptr, std::size_t size) { |
|
|
|
|
assert(size == sizeof(ClientAsyncResponseReader)); |
|
|
|
@ -119,22 +97,13 @@ class ClientAsyncResponseReader final |
|
|
|
|
///
|
|
|
|
|
/// Side effect:
|
|
|
|
|
/// - the \a ClientContext associated with this call is updated with
|
|
|
|
|
/// possible initial and trailing metadata sent from the serve.
|
|
|
|
|
/// possible initial and trailing metadata sent from the server.
|
|
|
|
|
void ReadInitialMetadata(void* tag) { |
|
|
|
|
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_); |
|
|
|
|
|
|
|
|
|
Ops* o = &ops_; |
|
|
|
|
|
|
|
|
|
// TODO(vjpai): Remove the collection_ specialization as soon
|
|
|
|
|
// as the public constructor is deleted
|
|
|
|
|
if (collection_) { |
|
|
|
|
o = collection_.get(); |
|
|
|
|
collection_->meta_buf.SetCollection(collection_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o->meta_buf.set_output_tag(tag); |
|
|
|
|
o->meta_buf.RecvInitialMetadata(context_); |
|
|
|
|
call_.PerformOps(&o->meta_buf); |
|
|
|
|
meta_buf.set_output_tag(tag); |
|
|
|
|
meta_buf.RecvInitialMetadata(context_); |
|
|
|
|
call_.PerformOps(&meta_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// See \a ClientAysncResponseReaderInterface::Finish for semantics.
|
|
|
|
@ -143,23 +112,14 @@ class ClientAsyncResponseReader final |
|
|
|
|
/// - the \a ClientContext associated with this call is updated with
|
|
|
|
|
/// possible initial and trailing metadata sent from the server.
|
|
|
|
|
void Finish(R* msg, Status* status, void* tag) { |
|
|
|
|
Ops* o = &ops_; |
|
|
|
|
|
|
|
|
|
// TODO(vjpai): Remove the collection_ specialization as soon
|
|
|
|
|
// as the public constructor is deleted
|
|
|
|
|
if (collection_) { |
|
|
|
|
o = collection_.get(); |
|
|
|
|
collection_->finish_buf.SetCollection(collection_); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
o->finish_buf.set_output_tag(tag); |
|
|
|
|
finish_buf.set_output_tag(tag); |
|
|
|
|
if (!context_->initial_metadata_received_) { |
|
|
|
|
o->finish_buf.RecvInitialMetadata(context_); |
|
|
|
|
finish_buf.RecvInitialMetadata(context_); |
|
|
|
|
} |
|
|
|
|
o->finish_buf.RecvMessage(msg); |
|
|
|
|
o->finish_buf.AllowNoMessage(); |
|
|
|
|
o->finish_buf.ClientRecvStatus(context_, status); |
|
|
|
|
call_.PerformOps(&o->finish_buf); |
|
|
|
|
finish_buf.RecvMessage(msg); |
|
|
|
|
finish_buf.AllowNoMessage(); |
|
|
|
|
finish_buf.ClientRecvStatus(context_, status); |
|
|
|
|
call_.PerformOps(&finish_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
@ -169,33 +129,25 @@ class ClientAsyncResponseReader final |
|
|
|
|
template <class W> |
|
|
|
|
ClientAsyncResponseReader(Call call, ClientContext* context, const W& request) |
|
|
|
|
: context_(context), call_(call) { |
|
|
|
|
ops_.init_buf.SendInitialMetadata(context->send_initial_metadata_, |
|
|
|
|
context->initial_metadata_flags()); |
|
|
|
|
init_buf.SendInitialMetadata(context->send_initial_metadata_, |
|
|
|
|
context->initial_metadata_flags()); |
|
|
|
|
// TODO(ctiller): don't assert
|
|
|
|
|
GPR_CODEGEN_ASSERT(ops_.init_buf.SendMessage(request).ok()); |
|
|
|
|
ops_.init_buf.ClientSendClose(); |
|
|
|
|
call_.PerformOps(&ops_.init_buf); |
|
|
|
|
GPR_CODEGEN_ASSERT(init_buf.SendMessage(request).ok()); |
|
|
|
|
init_buf.ClientSendClose(); |
|
|
|
|
call_.PerformOps(&init_buf); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// disable operator new
|
|
|
|
|
static void* operator new(std::size_t size); |
|
|
|
|
static void* operator new(std::size_t size, void* p) { return p; } |
|
|
|
|
|
|
|
|
|
// TODO(vjpai): Remove the reference to CallOpSetCollectionInterface
|
|
|
|
|
// as soon as the related workaround (public constructor) is deleted
|
|
|
|
|
struct Ops : public CallOpSetCollectionInterface { |
|
|
|
|
SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, |
|
|
|
|
CallOpClientSendClose> |
|
|
|
|
init_buf; |
|
|
|
|
CallOpSet<CallOpRecvInitialMetadata> meta_buf; |
|
|
|
|
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>, |
|
|
|
|
CallOpClientRecvStatus> |
|
|
|
|
finish_buf; |
|
|
|
|
} ops_; |
|
|
|
|
|
|
|
|
|
// TODO(vjpai): Remove the collection_ as soon as the related workaround
|
|
|
|
|
// (public constructor) is deleted
|
|
|
|
|
std::shared_ptr<Ops> collection_; |
|
|
|
|
SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, |
|
|
|
|
CallOpClientSendClose> |
|
|
|
|
init_buf; |
|
|
|
|
CallOpSet<CallOpRecvInitialMetadata> meta_buf; |
|
|
|
|
CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>, |
|
|
|
|
CallOpClientRecvStatus> |
|
|
|
|
finish_buf; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/// Async server-side API for handling unary calls, where the single
|
|
|
|
|