Index: third_party/grpc/src/cpp/client/channel.cc |
diff --git a/third_party/grpc/src/cpp/client/channel.cc b/third_party/grpc/src/cpp/client/channel.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ae20392d1160c7f72b14975753b13f93ab6267e9 |
--- /dev/null |
+++ b/third_party/grpc/src/cpp/client/channel.cc |
@@ -0,0 +1,144 @@ |
+/* |
+ * |
+ * Copyright 2015-2016, Google Inc. |
+ * All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * Redistributions in binary form must reproduce the above |
+ * copyright notice, this list of conditions and the following disclaimer |
+ * in the documentation and/or other materials provided with the |
+ * distribution. |
+ * * Neither the name of Google Inc. nor the names of its |
+ * contributors may be used to endorse or promote products derived from |
+ * this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ * |
+ */ |
+ |
+#include <grpc++/channel.h> |
+ |
+#include <memory> |
+ |
+#include <grpc++/client_context.h> |
+#include <grpc++/completion_queue.h> |
+#include <grpc++/impl/call.h> |
+#include <grpc++/impl/codegen/completion_queue_tag.h> |
+#include <grpc++/impl/grpc_library.h> |
+#include <grpc++/impl/rpc_method.h> |
+#include <grpc++/security/credentials.h> |
+#include <grpc++/support/channel_arguments.h> |
+#include <grpc++/support/config.h> |
+#include <grpc++/support/status.h> |
+#include <grpc++/support/time.h> |
+#include <grpc/grpc.h> |
+#include <grpc/support/log.h> |
+#include <grpc/support/slice.h> |
+#include "src/core/profiling/timers.h" |
+ |
+namespace grpc { |
+ |
+static internal::GrpcLibraryInitializer g_gli_initializer; |
+Channel::Channel(const grpc::string& host, grpc_channel* channel) |
+ : host_(host), c_channel_(channel) { |
+ g_gli_initializer.summon(); |
+} |
+ |
+Channel::~Channel() { grpc_channel_destroy(c_channel_); } |
+ |
+Call Channel::CreateCall(const RpcMethod& method, ClientContext* context, |
+ CompletionQueue* cq) { |
+ const bool kRegistered = method.channel_tag() && context->authority().empty(); |
+ grpc_call* c_call = NULL; |
+ if (kRegistered) { |
+ c_call = grpc_channel_create_registered_call( |
+ c_channel_, context->propagate_from_call_, |
+ context->propagation_options_.c_bitmask(), cq->cq(), |
+ method.channel_tag(), context->raw_deadline(), nullptr); |
+ } else { |
+ const char* host_str = NULL; |
+ if (!context->authority().empty()) { |
+ host_str = context->authority_.c_str(); |
+ } else if (!host_.empty()) { |
+ host_str = host_.c_str(); |
+ } |
+ c_call = grpc_channel_create_call(c_channel_, context->propagate_from_call_, |
+ context->propagation_options_.c_bitmask(), |
+ cq->cq(), method.name(), host_str, |
+ context->raw_deadline(), nullptr); |
+ } |
+ grpc_census_call_set_context(c_call, context->census_context()); |
+ context->set_call(c_call, shared_from_this()); |
+ return Call(c_call, this, cq); |
+} |
+ |
+void Channel::PerformOpsOnCall(CallOpSetInterface* ops, Call* call) { |
+ static const size_t MAX_OPS = 8; |
+ size_t nops = 0; |
+ grpc_op cops[MAX_OPS]; |
+ ops->FillOps(cops, &nops); |
+ GPR_ASSERT(GRPC_CALL_OK == |
+ grpc_call_start_batch(call->call(), cops, nops, ops, nullptr)); |
+} |
+ |
+void* Channel::RegisterMethod(const char* method) { |
+ return grpc_channel_register_call( |
+ c_channel_, method, host_.empty() ? NULL : host_.c_str(), nullptr); |
+} |
+ |
+grpc_connectivity_state Channel::GetState(bool try_to_connect) { |
+ return grpc_channel_check_connectivity_state(c_channel_, try_to_connect); |
+} |
+ |
+namespace { |
+class TagSaver GRPC_FINAL : public CompletionQueueTag { |
+ public: |
+ explicit TagSaver(void* tag) : tag_(tag) {} |
+ ~TagSaver() GRPC_OVERRIDE {} |
+ bool FinalizeResult(void** tag, bool* status) GRPC_OVERRIDE { |
+ *tag = tag_; |
+ delete this; |
+ return true; |
+ } |
+ |
+ private: |
+ void* tag_; |
+}; |
+ |
+} // namespace |
+ |
+void Channel::NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, |
+ gpr_timespec deadline, |
+ CompletionQueue* cq, void* tag) { |
+ TagSaver* tag_saver = new TagSaver(tag); |
+ grpc_channel_watch_connectivity_state(c_channel_, last_observed, deadline, |
+ cq->cq(), tag_saver); |
+} |
+ |
+bool Channel::WaitForStateChangeImpl(grpc_connectivity_state last_observed, |
+ gpr_timespec deadline) { |
+ CompletionQueue cq; |
+ bool ok = false; |
+ void* tag = NULL; |
+ NotifyOnStateChangeImpl(last_observed, deadline, &cq, NULL); |
+ cq.Next(&tag, &ok); |
+ GPR_ASSERT(tag == NULL); |
+ return ok; |
+} |
+ |
+} // namespace grpc |