aboutsummaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2017-07-05 08:37:09 -0700
committerGravatar Craig Tiller <ctiller@google.com>2017-07-05 08:37:09 -0700
commita1a3f363ee0309bdfbcdf919ab57468e3522731a (patch)
treea4d755c6b8512f47771a23ae8255ccb567391359 /include
parentf95873e67632c2b7c323c6613b5e23cae60ecf17 (diff)
parent7405347cd848f27067b9ce3c029325799ebaa888 (diff)
Merge github.com:grpc/grpc into optimize_for
Diffstat (limited to 'include')
-rw-r--r--include/grpc++/alarm.h21
-rw-r--r--include/grpc++/impl/codegen/async_unary_call.h90
-rw-r--r--include/grpc++/impl/codegen/call.h22
3 files changed, 110 insertions, 23 deletions
diff --git a/include/grpc++/alarm.h b/include/grpc++/alarm.h
index bd000cf4f7..ed8dacbc94 100644
--- a/include/grpc++/alarm.h
+++ b/include/grpc++/alarm.h
@@ -52,8 +52,25 @@ class Alarm : private GrpcLibraryCodegen {
alarm_(grpc_alarm_create(cq->cq(), TimePoint<T>(deadline).raw_time(),
static_cast<void*>(&tag_))) {}
+ /// Alarms aren't copyable.
+ Alarm(const Alarm&) = delete;
+ Alarm& operator=(const Alarm&) = delete;
+
+ /// Alarms are movable.
+ Alarm(Alarm&& rhs) : tag_(rhs.tag_), alarm_(rhs.alarm_) {
+ rhs.alarm_ = nullptr;
+ }
+ Alarm& operator=(Alarm&& rhs) {
+ tag_ = rhs.tag_;
+ alarm_ = rhs.alarm_;
+ rhs.alarm_ = nullptr;
+ return *this;
+ }
+
/// Destroy the given completion queue alarm, cancelling it in the process.
- ~Alarm() { grpc_alarm_destroy(alarm_); }
+ ~Alarm() {
+ if (alarm_ != nullptr) grpc_alarm_destroy(alarm_);
+ }
/// Cancel a completion queue alarm. Calling this function over an alarm that
/// has already fired has no effect.
@@ -73,7 +90,7 @@ class Alarm : private GrpcLibraryCodegen {
};
AlarmEntry tag_;
- grpc_alarm* const alarm_; // owned
+ grpc_alarm* alarm_; // owned
};
} // namespace grpc
diff --git a/include/grpc++/impl/codegen/async_unary_call.h b/include/grpc++/impl/codegen/async_unary_call.h
index 4aa4e25a9e..a5a698c640 100644
--- a/include/grpc++/impl/codegen/async_unary_call.h
+++ b/include/grpc++/impl/codegen/async_unary_call.h
@@ -87,6 +87,28 @@ 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));
@@ -101,9 +123,18 @@ class ClientAsyncResponseReader final
void ReadInitialMetadata(void* tag) {
GPR_CODEGEN_ASSERT(!context_->initial_metadata_received_);
- meta_buf_.set_output_tag(tag);
- meta_buf_.RecvInitialMetadata(context_);
- call_.PerformOps(&meta_buf_);
+ Ops& o = ops_;
+
+ // TODO(vjpai): Remove the collection_ specialization as soon
+ // as the public constructor is deleted
+ if (collection_) {
+ o = *collection_;
+ collection_->meta_buf.SetCollection(collection_);
+ }
+
+ o.meta_buf.set_output_tag(tag);
+ o.meta_buf.RecvInitialMetadata(context_);
+ call_.PerformOps(&o.meta_buf);
}
/// See \a ClientAysncResponseReaderInterface::Finish for semantics.
@@ -112,14 +143,23 @@ 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) {
- finish_buf_.set_output_tag(tag);
+ Ops& o = ops_;
+
+ // TODO(vjpai): Remove the collection_ specialization as soon
+ // as the public constructor is deleted
+ if (collection_) {
+ o = *collection_;
+ collection_->finish_buf.SetCollection(collection_);
+ }
+
+ o.finish_buf.set_output_tag(tag);
if (!context_->initial_metadata_received_) {
- finish_buf_.RecvInitialMetadata(context_);
+ o.finish_buf.RecvInitialMetadata(context_);
}
- finish_buf_.RecvMessage(msg);
- finish_buf_.AllowNoMessage();
- finish_buf_.ClientRecvStatus(context_, status);
- call_.PerformOps(&finish_buf_);
+ o.finish_buf.RecvMessage(msg);
+ o.finish_buf.AllowNoMessage();
+ o.finish_buf.ClientRecvStatus(context_, status);
+ call_.PerformOps(&o.finish_buf);
}
private:
@@ -129,25 +169,33 @@ class ClientAsyncResponseReader final
template <class W>
ClientAsyncResponseReader(Call call, ClientContext* context, const W& request)
: context_(context), call_(call) {
- init_buf_.SendInitialMetadata(context->send_initial_metadata_,
- context->initial_metadata_flags());
+ ops_.init_buf.SendInitialMetadata(context->send_initial_metadata_,
+ context->initial_metadata_flags());
// TODO(ctiller): don't assert
- GPR_CODEGEN_ASSERT(init_buf_.SendMessage(request).ok());
- init_buf_.ClientSendClose();
- call_.PerformOps(&init_buf_);
+ GPR_CODEGEN_ASSERT(ops_.init_buf.SendMessage(request).ok());
+ ops_.init_buf.ClientSendClose();
+ call_.PerformOps(&ops_.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; }
- SneakyCallOpSet<CallOpSendInitialMetadata, CallOpSendMessage,
- CallOpClientSendClose>
- init_buf_;
- CallOpSet<CallOpRecvInitialMetadata> meta_buf_;
- CallOpSet<CallOpRecvInitialMetadata, CallOpRecvMessage<R>,
- CallOpClientRecvStatus>
- finish_buf_;
+ // 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_;
};
/// Async server-side API for handling unary calls, where the single
diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h
index 2ded2d9776..342ea46203 100644
--- a/include/grpc++/impl/codegen/call.h
+++ b/include/grpc++/impl/codegen/call.h
@@ -544,6 +544,11 @@ class CallOpClientRecvStatus {
grpc_slice error_message_;
};
+/// TODO(vjpai): Remove the existence of CallOpSetCollectionInterface
+/// and references to it. This code is deprecated-on-arrival and is
+/// only added for users that bypassed the code-generator.
+class CallOpSetCollectionInterface {};
+
/// An abstract collection of call ops, used to generate the
/// grpc_call_op structure to pass down to the lower layers,
/// and as it is-a CompletionQueueTag, also massages the final
@@ -554,6 +559,18 @@ class CallOpSetInterface : public CompletionQueueTag {
/// Fills in grpc_op, starting from ops[*nops] and moving
/// upwards.
virtual void FillOps(grpc_call* call, grpc_op* ops, size_t* nops) = 0;
+
+ /// TODO(vjpai): Remove the SetCollection method and comment. This is only
+ /// a short-term workaround for users that bypassed the code generator
+ /// Mark this as belonging to a collection if needed
+ void SetCollection(std::shared_ptr<CallOpSetCollectionInterface> collection) {
+ collection_ = collection;
+ }
+
+ protected:
+ /// TODO(vjpai): Remove the collection_ field once the idea of bypassing the
+ /// code generator is forbidden. This is already deprecated
+ std::shared_ptr<CallOpSetCollectionInterface> collection_;
};
/// Primary implementaiton of CallOpSetInterface.
@@ -593,6 +610,11 @@ class CallOpSet : public CallOpSetInterface,
this->Op5::FinishOp(status);
this->Op6::FinishOp(status);
*tag = return_tag_;
+
+ // TODO(vjpai): Remove the reference to collection_ once the idea of
+ // bypassing the code generator is forbidden. It is already deprecated
+ collection_.reset();
+
g_core_codegen_interface->grpc_call_unref(call_);
return true;
}