From 69f90e6382b64ee96b5b1a223bf834194698632d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 6 Aug 2015 08:32:35 -0700 Subject: [PATCH 01/79] Working towards a non-blocking API test --- src/core/iomgr/pollset.h | 4 +- .../iomgr/pollset_multipoller_with_epoll.c | 2 +- .../pollset_multipoller_with_poll_posix.c | 2 +- src/core/iomgr/pollset_posix.c | 13 +- src/core/iomgr/pollset_posix.h | 6 + src/core/surface/completion_queue.c | 14 +- test/cpp/end2end/async_end2end_test.cc | 221 ++++++++++++------ 7 files changed, 172 insertions(+), 90 deletions(-) diff --git a/src/core/iomgr/pollset.h b/src/core/iomgr/pollset.h index c474e4dbf1c..3de0ca7ebd9 100644 --- a/src/core/iomgr/pollset.h +++ b/src/core/iomgr/pollset.h @@ -76,8 +76,8 @@ void grpc_pollset_destroy(grpc_pollset *pollset); Returns true if some work has been done, and false if the deadline expired. */ -int grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, - gpr_timespec deadline); +void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, + gpr_timespec now, gpr_timespec deadline); /* Break one polling thread out of polling work for this pollset. If specific_worker is GRPC_POLLSET_KICK_BROADCAST, kick ALL the workers. diff --git a/src/core/iomgr/pollset_multipoller_with_epoll.c b/src/core/iomgr/pollset_multipoller_with_epoll.c index 1320c645797..4d41db074d9 100644 --- a/src/core/iomgr/pollset_multipoller_with_epoll.c +++ b/src/core/iomgr/pollset_multipoller_with_epoll.c @@ -181,7 +181,7 @@ static void multipoll_with_epoll_pollset_maybe_work( pfds[1].events = POLLIN; pfds[1].revents = 0; - poll_rv = poll(pfds, 2, timeout_ms); + poll_rv = grpc_poll_function(pfds, 2, timeout_ms); if (poll_rv < 0) { if (errno != EINTR) { diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c index b5b2d7534d8..388b2d2a8aa 100644 --- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c +++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c @@ -144,7 +144,7 @@ static void multipoll_with_poll_pollset_maybe_work( POLLOUT, &watchers[i]); } - r = poll(pfds, pfd_count, timeout); + r = grpc_poll_function(pfds, pfd_count, timeout); for (i = 1; i < pfd_count; i++) { grpc_fd_end_poll(&watchers[i], pfds[i].revents & POLLIN, diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index d3a9193af16..1ba433cb61d 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -38,7 +38,6 @@ #include "src/core/iomgr/pollset_posix.h" #include -#include #include #include #include @@ -57,6 +56,8 @@ GPR_TLS_DECL(g_current_thread_poller); GPR_TLS_DECL(g_current_thread_worker); +grpc_poll_function_type grpc_poll_function = poll; + static void remove_worker(grpc_pollset *p, grpc_pollset_worker *worker) { worker->prev->next = worker->next; worker->next->prev = worker->prev; @@ -168,14 +169,11 @@ static void finish_shutdown(grpc_pollset *pollset) { pollset->shutdown_done_cb(pollset->shutdown_done_arg); } -int grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, - gpr_timespec deadline) { +void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, + gpr_timespec deadline) { /* pollset->mu already held */ gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC); int added_worker = 0; - if (gpr_time_cmp(now, deadline) > 0) { - return 0; - } /* this must happen before we (potentially) drop pollset->mu */ worker->next = worker->prev = NULL; /* TODO(ctiller): pool these */ @@ -217,7 +215,6 @@ done: gpr_mu_lock(&pollset->mu); } } - return 1; } void grpc_pollset_shutdown(grpc_pollset *pollset, @@ -456,7 +453,7 @@ static void basic_pollset_maybe_work(grpc_pollset *pollset, /* poll fd count (argument 2) is shortened by one if we have no events to poll on - such that it only includes the kicker */ - r = poll(pfd, nfds, timeout); + r = grpc_poll_function(pfd, nfds, timeout); GRPC_TIMER_MARK(GRPC_PTAG_POLL_FINISHED, r); if (fd) { diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index 1c1b736193c..ab38be7fefe 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -34,6 +34,8 @@ #ifndef GRPC_INTERNAL_CORE_IOMGR_POLLSET_POSIX_H #define GRPC_INTERNAL_CORE_IOMGR_POLLSET_POSIX_H +#include + #include #include "src/core/iomgr/wakeup_fd_posix.h" @@ -117,4 +119,8 @@ void grpc_poll_become_multipoller(grpc_pollset *pollset, struct grpc_fd **fds, * be locked) */ int grpc_pollset_has_workers(grpc_pollset *pollset); +/* override to allow tests to hook poll() usage */ +typedef int (*grpc_poll_function_type)(struct pollfd *, nfds_t, int); +extern grpc_poll_function_type grpc_poll_function; + #endif /* GRPC_INTERNAL_CORE_IOMGR_POLLSET_POSIX_H */ diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 00429fac19f..644b072cbb6 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -164,6 +164,8 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc, gpr_timespec deadline) { grpc_event ret; grpc_pollset_worker worker; + int first_loop = 1; + gpr_timespec now; deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC); @@ -189,12 +191,15 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc, ret.type = GRPC_QUEUE_SHUTDOWN; break; } - if (!grpc_pollset_work(&cc->pollset, &worker, deadline)) { + now = gpr_now(GPR_CLOCK_MONOTONIC); + if (!first_loop && gpr_time_cmp(now, deadline) >= 0) { gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); memset(&ret, 0, sizeof(ret)); ret.type = GRPC_QUEUE_TIMEOUT; break; } + first_loop = 0; + grpc_pollset_work(&cc->pollset, &worker, now, deadline); } GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); GRPC_CQ_INTERNAL_UNREF(cc, "next"); @@ -232,6 +237,7 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, grpc_cq_completion *c; grpc_cq_completion *prev; grpc_pollset_worker worker; + int first_loop = 1; deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC); @@ -272,14 +278,16 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, ret.type = GRPC_QUEUE_TIMEOUT; break; } - if (!grpc_pollset_work(&cc->pollset, &worker, deadline)) { + now = gpr_now(GPR_CLOCK_MONOTONIC); + if (!first_loop && gpr_time_cmp(now, deadline) >= 0) { del_plucker(cc, tag, &worker); gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset)); memset(&ret, 0, sizeof(ret)); ret.type = GRPC_QUEUE_TIMEOUT; break; } - del_plucker(cc, tag, &worker); + first_loop = 0; + grpc_pollset_work(&cc->pollset, &worker, now, deadline); } done: GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc index 9b53bdc9990..266c3622ea7 100644 --- a/test/cpp/end2end/async_end2end_test.cc +++ b/test/cpp/end2end/async_end2end_test.cc @@ -56,6 +56,10 @@ #include #include +#ifdef GPR_POSIX_SOCKET +#include "src/core/iomgr/pollset_posix.h" +#endif + using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; using std::chrono::system_clock; @@ -67,18 +71,64 @@ namespace { void* tag(int i) { return (void*)(gpr_intptr) i; } -class Verifier { +#ifdef GPR_POSIX_SOCKET +static int assert_non_blocking_poll( + struct pollfd *pfds, nfds_t nfds, int timeout) { + GPR_ASSERT(timeout == 0); + return poll(pfds, nfds, timeout); +} + +class PollOverride { public: + PollOverride(grpc_poll_function_type f) { + prev_ = grpc_poll_function; + grpc_poll_function = f; + } + + ~PollOverride() { + grpc_poll_function = prev_; + } + + private: + grpc_poll_function_type prev_; +}; + +class PollingCheckRegion : public PollOverride { + public: + explicit PollingCheckRegion(bool allow_blocking) + : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {} +}; +#else +class PollingCheckRegion { + public: + explicit PollingCheckRegion(bool allow_blocking) {} +}; +#endif + +class Verifier : public PollingCheckRegion { + public: + explicit Verifier(bool spin) : PollingCheckRegion(!spin), spin_(spin) {} Verifier& Expect(int i, bool expect_ok) { expectations_[tag(i)] = expect_ok; return *this; } void Verify(CompletionQueue *cq) { + if (spin_) gpr_log(GPR_DEBUG, "spin"); GPR_ASSERT(!expectations_.empty()); while (!expectations_.empty()) { bool ok; void* got_tag; - EXPECT_TRUE(cq->Next(&got_tag, &ok)); + if (spin_) { + for (;;) { + auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)); + if (r == CompletionQueue::TIMEOUT) continue; + if (r == CompletionQueue::GOT_EVENT) break; + gpr_log(GPR_ERROR, "unexpected result from AsyncNext"); + abort(); + } + } else { + EXPECT_TRUE(cq->Next(&got_tag, &ok)); + } auto it = expectations_.find(got_tag); EXPECT_TRUE(it != expectations_.end()); EXPECT_EQ(it->second, ok); @@ -86,15 +136,33 @@ class Verifier { } } void Verify(CompletionQueue *cq, std::chrono::system_clock::time_point deadline) { + if (spin_) gpr_log(GPR_DEBUG, "spin"); if (expectations_.empty()) { bool ok; void *got_tag; - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::TIMEOUT); + if (spin_) { + while (std::chrono::system_clock::now() < deadline) { + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)), CompletionQueue::TIMEOUT); + } + } else { + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::TIMEOUT); + } } else { while (!expectations_.empty()) { bool ok; void *got_tag; - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::GOT_EVENT); + if (spin_) { + for (;;) { + GPR_ASSERT(std::chrono::system_clock::now() < deadline); + auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)); + if (r == CompletionQueue::TIMEOUT) continue; + if (r == CompletionQueue::GOT_EVENT) break; + gpr_log(GPR_ERROR, "unexpected result from AsyncNext"); + abort(); + } + } else { + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::GOT_EVENT); + } auto it = expectations_.find(got_tag); EXPECT_TRUE(it != expectations_.end()); EXPECT_EQ(it->second, ok); @@ -105,9 +173,10 @@ class Verifier { private: std::map expectations_; + bool spin_; }; -class AsyncEnd2endTest : public ::testing::Test { +class AsyncEnd2endTest : public ::testing::TestWithParam { protected: AsyncEnd2endTest() {} @@ -156,15 +225,15 @@ class AsyncEnd2endTest : public ::testing::Test { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); @@ -178,18 +247,18 @@ class AsyncEnd2endTest : public ::testing::Test { std::ostringstream server_address_; }; -TEST_F(AsyncEnd2endTest, SimpleRpc) { +TEST_P(AsyncEnd2endTest, SimpleRpc) { ResetStub(); SendRpc(1); } -TEST_F(AsyncEnd2endTest, SequentialRpcs) { +TEST_P(AsyncEnd2endTest, SequentialRpcs) { ResetStub(); SendRpc(10); } // Test a simple RPC using the async version of Next -TEST_F(AsyncEnd2endTest, AsyncNextRpc) { +TEST_P(AsyncEnd2endTest, AsyncNextRpc) { ResetStub(); EchoRequest send_request; @@ -210,28 +279,28 @@ TEST_F(AsyncEnd2endTest, AsyncNextRpc) { std::chrono::system_clock::now()); std::chrono::system_clock::time_point time_limit( std::chrono::system_clock::now() + std::chrono::seconds(10)); - Verifier().Verify(cq_.get(), time_now); - Verifier().Verify(cq_.get(), time_now); + Verifier(GetParam()).Verify(cq_.get(), time_now); + Verifier(GetParam()).Verify(cq_.get(), time_now); service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get(), time_limit); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit); EXPECT_EQ(send_request.message(), recv_request.message()); send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); } // Two pings and a final pong. -TEST_F(AsyncEnd2endTest, SimpleClientStreaming) { +TEST_P(AsyncEnd2endTest, SimpleClientStreaming) { ResetStub(); EchoRequest send_request; @@ -250,41 +319,41 @@ TEST_F(AsyncEnd2endTest, SimpleClientStreaming) { service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Expect(1, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get()); cli_stream->Write(send_request, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); srv_stream.Read(&recv_request, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); cli_stream->Write(send_request, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); srv_stream.Read(&recv_request, tag(6)); - Verifier().Expect(6, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(6, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); cli_stream->WritesDone(tag(7)); - Verifier().Expect(7, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(7, true).Verify(cq_.get()); srv_stream.Read(&recv_request, tag(8)); - Verifier().Expect(8, false).Verify(cq_.get()); + Verifier(GetParam()).Expect(8, false).Verify(cq_.get()); send_response.set_message(recv_request.message()); srv_stream.Finish(send_response, Status::OK, tag(9)); - Verifier().Expect(9, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(9, true).Verify(cq_.get()); cli_stream->Finish(&recv_status, tag(10)); - Verifier().Expect(10, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(10, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); } // One ping, two pongs. -TEST_F(AsyncEnd2endTest, SimpleServerStreaming) { +TEST_P(AsyncEnd2endTest, SimpleServerStreaming) { ResetStub(); EchoRequest send_request; @@ -303,38 +372,38 @@ TEST_F(AsyncEnd2endTest, SimpleServerStreaming) { service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); send_response.set_message(recv_request.message()); srv_stream.Write(send_response, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); cli_stream->Read(&recv_response, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); srv_stream.Write(send_response, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); cli_stream->Read(&recv_response, tag(6)); - Verifier().Expect(6, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(6, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); srv_stream.Finish(Status::OK, tag(7)); - Verifier().Expect(7, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(7, true).Verify(cq_.get()); cli_stream->Read(&recv_response, tag(8)); - Verifier().Expect(8, false).Verify(cq_.get()); + Verifier(GetParam()).Expect(8, false).Verify(cq_.get()); cli_stream->Finish(&recv_status, tag(9)); - Verifier().Expect(9, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(9, true).Verify(cq_.get()); EXPECT_TRUE(recv_status.ok()); } // One ping, one pong. -TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) { +TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) { ResetStub(); EchoRequest send_request; @@ -353,40 +422,40 @@ TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) { service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get()); cli_stream->Write(send_request, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); srv_stream.Read(&recv_request, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); send_response.set_message(recv_request.message()); srv_stream.Write(send_response, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); cli_stream->Read(&recv_response, tag(6)); - Verifier().Expect(6, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(6, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); cli_stream->WritesDone(tag(7)); - Verifier().Expect(7, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(7, true).Verify(cq_.get()); srv_stream.Read(&recv_request, tag(8)); - Verifier().Expect(8, false).Verify(cq_.get()); + Verifier(GetParam()).Expect(8, false).Verify(cq_.get()); srv_stream.Finish(Status::OK, tag(9)); - Verifier().Expect(9, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(9, true).Verify(cq_.get()); cli_stream->Finish(&recv_status, tag(10)); - Verifier().Expect(10, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(10, true).Verify(cq_.get()); EXPECT_TRUE(recv_status.ok()); } // Metadata tests -TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) { +TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) { ResetStub(); EchoRequest send_request; @@ -410,7 +479,7 @@ TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); auto client_initial_metadata = srv_ctx.client_metadata(); EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second); @@ -420,16 +489,16 @@ TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) { send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); } -TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) { +TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) { ResetStub(); EchoRequest send_request; @@ -451,15 +520,15 @@ TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); srv_ctx.AddInitialMetadata(meta1.first, meta1.second); srv_ctx.AddInitialMetadata(meta2.first, meta2.second); response_writer.SendInitialMetadata(tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); response_reader->ReadInitialMetadata(tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); auto server_initial_metadata = cli_ctx.GetServerInitialMetadata(); EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second); EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second); @@ -467,16 +536,16 @@ TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) { send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); response_reader->Finish(&recv_response, &recv_status, tag(6)); - Verifier().Expect(6, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(6, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); } -TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) { +TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) { ResetStub(); EchoRequest send_request; @@ -498,20 +567,20 @@ TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); response_writer.SendInitialMetadata(tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); send_response.set_message(recv_request.message()); srv_ctx.AddTrailingMetadata(meta1.first, meta1.second); srv_ctx.AddTrailingMetadata(meta2.first, meta2.second); response_writer.Finish(send_response, Status::OK, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); response_reader->Finish(&recv_response, &recv_status, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata(); @@ -520,7 +589,7 @@ TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) { EXPECT_EQ(static_cast(2), server_trailing_metadata.size()); } -TEST_F(AsyncEnd2endTest, MetadataRpc) { +TEST_P(AsyncEnd2endTest, MetadataRpc) { ResetStub(); EchoRequest send_request; @@ -558,7 +627,7 @@ TEST_F(AsyncEnd2endTest, MetadataRpc) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); auto client_initial_metadata = srv_ctx.client_metadata(); EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second); @@ -568,9 +637,9 @@ TEST_F(AsyncEnd2endTest, MetadataRpc) { srv_ctx.AddInitialMetadata(meta3.first, meta3.second); srv_ctx.AddInitialMetadata(meta4.first, meta4.second); response_writer.SendInitialMetadata(tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); response_reader->ReadInitialMetadata(tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); auto server_initial_metadata = cli_ctx.GetServerInitialMetadata(); EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second); EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second); @@ -581,10 +650,10 @@ TEST_F(AsyncEnd2endTest, MetadataRpc) { srv_ctx.AddTrailingMetadata(meta6.first, meta6.second); response_writer.Finish(send_response, Status::OK, tag(5)); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); response_reader->Finish(&recv_response, &recv_status, tag(6)); - Verifier().Expect(6, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(6, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata(); @@ -594,7 +663,7 @@ TEST_F(AsyncEnd2endTest, MetadataRpc) { } // Server uses AsyncNotifyWhenDone API to check for cancellation -TEST_F(AsyncEnd2endTest, ServerCheckCancellation) { +TEST_P(AsyncEnd2endTest, ServerCheckCancellation) { ResetStub(); EchoRequest send_request; @@ -615,21 +684,21 @@ TEST_F(AsyncEnd2endTest, ServerCheckCancellation) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); cli_ctx.TryCancel(); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); EXPECT_TRUE(srv_ctx.IsCancelled()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier().Expect(4, false).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, false).Verify(cq_.get()); EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code()); } // Server uses AsyncNotifyWhenDone API to check for normal finish -TEST_F(AsyncEnd2endTest, ServerCheckDone) { +TEST_P(AsyncEnd2endTest, ServerCheckDone) { ResetStub(); EchoRequest send_request; @@ -650,22 +719,24 @@ TEST_F(AsyncEnd2endTest, ServerCheckDone) { service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), cq_.get(), tag(2)); - Verifier().Expect(2, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(3)); - Verifier().Expect(3, true).Verify(cq_.get()); - Verifier().Expect(5, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(3, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(5, true).Verify(cq_.get()); EXPECT_FALSE(srv_ctx.IsCancelled()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier().Expect(4, true).Verify(cq_.get()); + Verifier(GetParam()).Expect(4, true).Verify(cq_.get()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); } +INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest, ::testing::Values(false, true)); + } // namespace } // namespace testing } // namespace grpc From 4c06b820e0a6d402002970cb04458d3ec593a683 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 6 Aug 2015 08:41:31 -0700 Subject: [PATCH 02/79] Add a test of non-blocking API behavior ... also fix things that were broken :) --- src/core/iomgr/pollset_posix.c | 20 ++--- src/core/iomgr/pollset_posix.h | 5 +- .../security/google_default_credentials.c | 2 +- src/core/surface/completion_queue.c | 1 + test/core/httpcli/httpcli_test.c | 6 +- test/core/iomgr/endpoint_tests.c | 9 ++- test/core/iomgr/fd_posix_test.c | 12 ++- test/core/iomgr/tcp_client_posix_test.c | 9 ++- test/core/iomgr/tcp_posix_test.c | 15 ++-- test/core/iomgr/tcp_server_posix_test.c | 3 +- test/core/security/oauth2_utils.c | 2 +- test/core/util/reconnect_server.c | 3 +- test/cpp/end2end/async_end2end_test.cc | 73 ++++++++++--------- 13 files changed, 94 insertions(+), 66 deletions(-) diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 1ba433cb61d..6bd1b61f242 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -90,6 +90,7 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) { } void grpc_pollset_kick(grpc_pollset *p, grpc_pollset_worker *specific_worker) { + /* pollset->mu already held */ if (specific_worker != NULL) { if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { for (specific_worker = p->root_worker.next; @@ -141,10 +142,10 @@ void grpc_pollset_init(grpc_pollset *pollset) { void grpc_pollset_add_fd(grpc_pollset *pollset, grpc_fd *fd) { gpr_mu_lock(&pollset->mu); pollset->vtable->add_fd(pollset, fd, 1); - /* the following (enabled only in debug) will reacquire and then release - our lock - meaning that if the unlocking flag passed to del_fd above is - not respected, the code will deadlock (in a way that we have a chance of - debugging) */ +/* the following (enabled only in debug) will reacquire and then release + our lock - meaning that if the unlocking flag passed to del_fd above is + not respected, the code will deadlock (in a way that we have a chance of + debugging) */ #ifndef NDEBUG gpr_mu_lock(&pollset->mu); gpr_mu_unlock(&pollset->mu); @@ -154,10 +155,10 @@ void grpc_pollset_add_fd(grpc_pollset *pollset, grpc_fd *fd) { void grpc_pollset_del_fd(grpc_pollset *pollset, grpc_fd *fd) { gpr_mu_lock(&pollset->mu); pollset->vtable->del_fd(pollset, fd, 1); - /* the following (enabled only in debug) will reacquire and then release - our lock - meaning that if the unlocking flag passed to del_fd above is - not respected, the code will deadlock (in a way that we have a chance of - debugging) */ +/* the following (enabled only in debug) will reacquire and then release + our lock - meaning that if the unlocking flag passed to del_fd above is + not respected, the code will deadlock (in a way that we have a chance of + debugging) */ #ifndef NDEBUG gpr_mu_lock(&pollset->mu); gpr_mu_unlock(&pollset->mu); @@ -170,9 +171,8 @@ static void finish_shutdown(grpc_pollset *pollset) { } void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, - gpr_timespec deadline) { + gpr_timespec now, gpr_timespec deadline) { /* pollset->mu already held */ - gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC); int added_worker = 0; /* this must happen before we (potentially) drop pollset->mu */ worker->next = worker->prev = NULL; diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index ab38be7fefe..69bd9cca8ce 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -104,7 +104,8 @@ void grpc_kick_drain(grpc_pollset *p); - longer than a millisecond polls are rounded up to the next nearest millisecond to avoid spinning - infinite timeouts are converted to -1 */ -int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, gpr_timespec now); +int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, + gpr_timespec now); /* turn a pollset into a multipoller: platform specific */ typedef void (*grpc_platform_become_multipoller_type)(grpc_pollset *pollset, @@ -120,7 +121,7 @@ void grpc_poll_become_multipoller(grpc_pollset *pollset, struct grpc_fd **fds, int grpc_pollset_has_workers(grpc_pollset *pollset); /* override to allow tests to hook poll() usage */ -typedef int (*grpc_poll_function_type)(struct pollfd *, nfds_t, int); +typedef int (*grpc_poll_function_type)(struct pollfd *, nfds_t, int); extern grpc_poll_function_type grpc_poll_function; #endif /* GRPC_INTERNAL_CORE_IOMGR_POLLSET_POSIX_H */ diff --git a/src/core/security/google_default_credentials.c b/src/core/security/google_default_credentials.c index f368819597a..cf12a8e0fa0 100644 --- a/src/core/security/google_default_credentials.c +++ b/src/core/security/google_default_credentials.c @@ -113,7 +113,7 @@ static int is_stack_running_on_compute_engine(void) { gpr_mu_lock(GRPC_POLLSET_MU(&detector.pollset)); while (!detector.is_done) { grpc_pollset_worker worker; - grpc_pollset_work(&detector.pollset, &worker, + grpc_pollset_work(&detector.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), gpr_inf_future(GPR_CLOCK_REALTIME)); } gpr_mu_unlock(GRPC_POLLSET_MU(&detector.pollset)); diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index 644b072cbb6..e6ff04ec0ea 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -237,6 +237,7 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, grpc_cq_completion *c; grpc_cq_completion *prev; grpc_pollset_worker worker; + gpr_timespec now; int first_loop = 1; deadline = gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC); diff --git a/test/core/httpcli/httpcli_test.c b/test/core/httpcli/httpcli_test.c index 390afcdf637..2793feb1a75 100644 --- a/test/core/httpcli/httpcli_test.c +++ b/test/core/httpcli/httpcli_test.c @@ -88,7 +88,8 @@ static void test_get(int use_ssl, int port) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (!g_done) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, n_seconds_time(20)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + n_seconds_time(20)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); gpr_free(host); @@ -114,7 +115,8 @@ static void test_post(int use_ssl, int port) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (!g_done) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, n_seconds_time(20)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + n_seconds_time(20)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); gpr_free(host); diff --git a/test/core/iomgr/endpoint_tests.c b/test/core/iomgr/endpoint_tests.c index 8186c96da1b..6ef8e9ca3bc 100644 --- a/test/core/iomgr/endpoint_tests.c +++ b/test/core/iomgr/endpoint_tests.c @@ -256,7 +256,8 @@ static void read_and_write_test(grpc_endpoint_test_config config, while (!state.read_done || !state.write_done) { grpc_pollset_worker worker; GPR_ASSERT(gpr_time_cmp(gpr_now(GPR_CLOCK_MONOTONIC), deadline) < 0); - grpc_pollset_work(g_pollset, &worker, deadline); + grpc_pollset_work(g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_mu_unlock(GRPC_POLLSET_MU(g_pollset)); @@ -353,7 +354,8 @@ static void shutdown_during_write_test(grpc_endpoint_test_config config, while (!write_st.done) { grpc_pollset_worker worker; GPR_ASSERT(gpr_time_cmp(gpr_now(deadline.clock_type), deadline) < 0); - grpc_pollset_work(g_pollset, &worker, deadline); + grpc_pollset_work(g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_mu_unlock(GRPC_POLLSET_MU(g_pollset)); grpc_endpoint_destroy(write_st.ep); @@ -361,7 +363,8 @@ static void shutdown_during_write_test(grpc_endpoint_test_config config, while (!read_st.done) { grpc_pollset_worker worker; GPR_ASSERT(gpr_time_cmp(gpr_now(deadline.clock_type), deadline) < 0); - grpc_pollset_work(g_pollset, &worker, deadline); + grpc_pollset_work(g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_mu_unlock(GRPC_POLLSET_MU(g_pollset)); gpr_free(slices); diff --git a/test/core/iomgr/fd_posix_test.c b/test/core/iomgr/fd_posix_test.c index adcbcafdbba..8bba87d61fc 100644 --- a/test/core/iomgr/fd_posix_test.c +++ b/test/core/iomgr/fd_posix_test.c @@ -250,7 +250,8 @@ static void server_wait_and_shutdown(server *sv) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (!sv->done) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); } @@ -358,7 +359,8 @@ static void client_wait_and_shutdown(client *cl) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (!cl->done) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); } @@ -448,7 +450,8 @@ static void test_grpc_fd_change(void) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (a.cb_that_ran == NULL) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } GPR_ASSERT(a.cb_that_ran == first_read_callback); gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); @@ -467,7 +470,8 @@ static void test_grpc_fd_change(void) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (b.cb_that_ran == NULL) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } /* Except now we verify that second_read_callback ran instead */ GPR_ASSERT(b.cb_that_ran == second_read_callback); diff --git a/test/core/iomgr/tcp_client_posix_test.c b/test/core/iomgr/tcp_client_posix_test.c index 07bbe1f4025..dea0b33b8e9 100644 --- a/test/core/iomgr/tcp_client_posix_test.c +++ b/test/core/iomgr/tcp_client_posix_test.c @@ -112,7 +112,8 @@ void test_succeeds(void) { while (g_connections_complete == connections_complete_before) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + GRPC_TIMEOUT_SECONDS_TO_DEADLINE(5)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); @@ -142,7 +143,8 @@ void test_fails(void) { /* wait for the connection callback to finish */ while (g_connections_complete == connections_complete_before) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, test_deadline()); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + test_deadline()); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); @@ -211,7 +213,8 @@ void test_times_out(void) { GPR_ASSERT(g_connections_complete == connections_complete_before + is_after_deadline); } - grpc_pollset_work(&g_pollset, &worker, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10)); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); diff --git a/test/core/iomgr/tcp_posix_test.c b/test/core/iomgr/tcp_posix_test.c index 17a85ceaec7..6ad832231f5 100644 --- a/test/core/iomgr/tcp_posix_test.c +++ b/test/core/iomgr/tcp_posix_test.c @@ -187,7 +187,8 @@ static void read_test(ssize_t num_bytes, ssize_t slice_size) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (state.read_bytes < state.target_read_bytes) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, deadline); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } GPR_ASSERT(state.read_bytes == state.target_read_bytes); gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); @@ -224,7 +225,8 @@ static void large_read_test(ssize_t slice_size) { gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); while (state.read_bytes < state.target_read_bytes) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, deadline); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } GPR_ASSERT(state.read_bytes == state.target_read_bytes); gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); @@ -285,7 +287,8 @@ void drain_socket_blocking(int fd, size_t num_bytes, size_t read_size) { for (;;) { grpc_pollset_worker worker; gpr_mu_lock(GRPC_POLLSET_MU(&g_pollset)); - grpc_pollset_work(&g_pollset, &worker, GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10)); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + GRPC_TIMEOUT_MILLIS_TO_DEADLINE(10)); gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); do { bytes_read = @@ -365,7 +368,8 @@ static void write_test(ssize_t num_bytes, ssize_t slice_size) { if (state.write_done) { break; } - grpc_pollset_work(&g_pollset, &worker, deadline); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); } @@ -422,7 +426,8 @@ static void write_error_test(ssize_t num_bytes, ssize_t slice_size) { if (state.write_done) { break; } - grpc_pollset_work(&g_pollset, &worker, deadline); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_mu_unlock(GRPC_POLLSET_MU(&g_pollset)); break; diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c index b82d7c08b1d..29a20cba8e5 100644 --- a/test/core/iomgr/tcp_server_posix_test.c +++ b/test/core/iomgr/tcp_server_posix_test.c @@ -137,7 +137,8 @@ static void test_connect(int n) { while (g_nconnects == nconnects_before && gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0) { grpc_pollset_worker worker; - grpc_pollset_work(&g_pollset, &worker, deadline); + grpc_pollset_work(&g_pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); } gpr_log(GPR_DEBUG, "wait done"); diff --git a/test/core/security/oauth2_utils.c b/test/core/security/oauth2_utils.c index 990855ac6ae..7df6fade6b2 100644 --- a/test/core/security/oauth2_utils.c +++ b/test/core/security/oauth2_utils.c @@ -85,7 +85,7 @@ char *grpc_test_fetch_oauth2_token_with_credentials(grpc_credentials *creds) { gpr_mu_lock(GRPC_POLLSET_MU(&request.pollset)); while (!request.is_done) { grpc_pollset_worker worker; - grpc_pollset_work(&request.pollset, &worker, + grpc_pollset_work(&request.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), gpr_inf_future(GPR_CLOCK_MONOTONIC)); } gpr_mu_unlock(GRPC_POLLSET_MU(&request.pollset)); diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c index 2a2113338bd..a06cb50b3a3 100644 --- a/test/core/util/reconnect_server.c +++ b/test/core/util/reconnect_server.c @@ -134,7 +134,8 @@ void reconnect_server_poll(reconnect_server *server, int seconds) { gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), gpr_time_from_seconds(seconds, GPR_TIMESPAN)); gpr_mu_lock(GRPC_POLLSET_MU(&server->pollset)); - grpc_pollset_work(&server->pollset, &worker, deadline); + grpc_pollset_work(&server->pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + deadline); gpr_mu_unlock(GRPC_POLLSET_MU(&server->pollset)); } diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc index 266c3622ea7..ab262080702 100644 --- a/test/cpp/end2end/async_end2end_test.cc +++ b/test/cpp/end2end/async_end2end_test.cc @@ -69,11 +69,11 @@ namespace testing { namespace { -void* tag(int i) { return (void*)(gpr_intptr) i; } +void* tag(int i) { return (void*)(gpr_intptr)i; } #ifdef GPR_POSIX_SOCKET -static int assert_non_blocking_poll( - struct pollfd *pfds, nfds_t nfds, int timeout) { +static int assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds, + int timeout) { GPR_ASSERT(timeout == 0); return poll(pfds, nfds, timeout); } @@ -85,9 +85,7 @@ class PollOverride { grpc_poll_function = f; } - ~PollOverride() { - grpc_poll_function = prev_; - } + ~PollOverride() { grpc_poll_function = prev_; } private: grpc_poll_function_type prev_; @@ -95,7 +93,7 @@ class PollOverride { class PollingCheckRegion : public PollOverride { public: - explicit PollingCheckRegion(bool allow_blocking) + explicit PollingCheckRegion(bool allow_blocking) : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {} }; #else @@ -112,8 +110,7 @@ class Verifier : public PollingCheckRegion { expectations_[tag(i)] = expect_ok; return *this; } - void Verify(CompletionQueue *cq) { - if (spin_) gpr_log(GPR_DEBUG, "spin"); + void Verify(CompletionQueue* cq) { GPR_ASSERT(!expectations_.empty()); while (!expectations_.empty()) { bool ok; @@ -135,33 +132,38 @@ class Verifier : public PollingCheckRegion { expectations_.erase(it); } } - void Verify(CompletionQueue *cq, std::chrono::system_clock::time_point deadline) { - if (spin_) gpr_log(GPR_DEBUG, "spin"); + void Verify(CompletionQueue* cq, + std::chrono::system_clock::time_point deadline) { if (expectations_.empty()) { bool ok; - void *got_tag; + void* got_tag; if (spin_) { while (std::chrono::system_clock::now() < deadline) { - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)), CompletionQueue::TIMEOUT); + EXPECT_EQ( + cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)), + CompletionQueue::TIMEOUT); } } else { - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::TIMEOUT); + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), + CompletionQueue::TIMEOUT); } } else { while (!expectations_.empty()) { bool ok; - void *got_tag; + void* got_tag; if (spin_) { for (;;) { GPR_ASSERT(std::chrono::system_clock::now() < deadline); - auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)); + auto r = + cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)); if (r == CompletionQueue::TIMEOUT) continue; if (r == CompletionQueue::GOT_EVENT) break; gpr_log(GPR_ERROR, "unexpected result from AsyncNext"); abort(); - } + } } else { - EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::GOT_EVENT); + EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), + CompletionQueue::GOT_EVENT); } auto it = expectations_.find(got_tag); EXPECT_TRUE(it != expectations_.end()); @@ -185,7 +187,8 @@ class AsyncEnd2endTest : public ::testing::TestWithParam { server_address_ << "localhost:" << port; // Setup server ServerBuilder builder; - builder.AddListeningPort(server_address_.str(), grpc::InsecureServerCredentials()); + builder.AddListeningPort(server_address_.str(), + grpc::InsecureServerCredentials()); builder.RegisterAsyncService(&service_); cq_ = builder.AddCompletionQueue(); server_ = builder.BuildAndStart(); @@ -222,8 +225,8 @@ class AsyncEnd2endTest : public ::testing::TestWithParam { std::unique_ptr > response_reader( stub_->AsyncEcho(&cli_ctx, send_request, cq_.get())); - service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, - cq_.get(), cq_.get(), tag(2)); + service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(), + cq_.get(), tag(2)); Verifier(GetParam()).Expect(2, true).Verify(cq_.get()); EXPECT_EQ(send_request.message(), recv_request.message()); @@ -290,10 +293,14 @@ TEST_P(AsyncEnd2endTest, AsyncNextRpc) { send_response.set_message(recv_request.message()); response_writer.Finish(send_response, Status::OK, tag(3)); - Verifier(GetParam()).Expect(3, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); + Verifier(GetParam()) + .Expect(3, true) + .Verify(cq_.get(), std::chrono::system_clock::time_point::max()); response_reader->Finish(&recv_response, &recv_status, tag(4)); - Verifier(GetParam()).Expect(4, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max()); + Verifier(GetParam()) + .Expect(4, true) + .Verify(cq_.get(), std::chrono::system_clock::time_point::max()); EXPECT_EQ(send_response.message(), recv_response.message()); EXPECT_TRUE(recv_status.ok()); @@ -316,8 +323,8 @@ TEST_P(AsyncEnd2endTest, SimpleClientStreaming) { std::unique_ptr > cli_stream( stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1))); - service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), - cq_.get(), tag(2)); + service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(), + tag(2)); Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get()); @@ -419,8 +426,8 @@ TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) { std::unique_ptr > cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1))); - service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), - cq_.get(), tag(2)); + service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(), + tag(2)); Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get()); @@ -606,18 +613,17 @@ TEST_P(AsyncEnd2endTest, MetadataRpc) { std::pair meta1("key1", "val1"); std::pair meta2( "key2-bin", - grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", - 13)); + grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13)); std::pair meta3("key3", "val3"); std::pair meta6( "key4-bin", grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d", - 14)); + 14)); std::pair meta5("key5", "val5"); std::pair meta4( "key6-bin", - grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", - 15)); + grpc::string( + "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15)); cli_ctx.AddMetadata(meta1.first, meta1.second); cli_ctx.AddMetadata(meta2.first, meta2.second); @@ -735,7 +741,8 @@ TEST_P(AsyncEnd2endTest, ServerCheckDone) { EXPECT_TRUE(recv_status.ok()); } -INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest, ::testing::Values(false, true)); +INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest, + ::testing::Values(false, true)); } // namespace } // namespace testing From 57e9189fe91da3a359115d1bfa9be192e9e30a84 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 6 Aug 2015 08:47:48 -0700 Subject: [PATCH 03/79] Windows implementation of new pollset semantics --- src/core/iomgr/pollset.h | 3 +-- src/core/iomgr/pollset_windows.c | 9 ++------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/core/iomgr/pollset.h b/src/core/iomgr/pollset.h index 3de0ca7ebd9..337596cb741 100644 --- a/src/core/iomgr/pollset.h +++ b/src/core/iomgr/pollset.h @@ -74,8 +74,7 @@ void grpc_pollset_destroy(grpc_pollset *pollset); grpc_pollset_work, and it is guaranteed that GRPC_POLLSET_MU(pollset) will not be released by grpc_pollset_work AFTER worker has been destroyed. - Returns true if some work has been done, and false if the deadline - expired. */ + Tries not to block past deadline. */ void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, gpr_timespec now, gpr_timespec deadline); diff --git a/src/core/iomgr/pollset_windows.c b/src/core/iomgr/pollset_windows.c index 22dc5891c38..1078fa5384e 100644 --- a/src/core/iomgr/pollset_windows.c +++ b/src/core/iomgr/pollset_windows.c @@ -100,13 +100,9 @@ void grpc_pollset_destroy(grpc_pollset *pollset) { gpr_mu_destroy(&pollset->mu); } -int grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, gpr_timespec deadline) { - gpr_timespec now; +void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker, + gpr_timespec now, gpr_timespec deadline) { int added_worker = 0; - now = gpr_now(GPR_CLOCK_MONOTONIC); - if (gpr_time_cmp(now, deadline) > 0) { - return 0 /* GPR_FALSE */; - } worker->next = worker->prev = NULL; gpr_cv_init(&worker->cv); if (grpc_maybe_call_delayed_callbacks(&pollset->mu, 1 /* GPR_TRUE */)) { @@ -127,7 +123,6 @@ done: if (added_worker) { remove_worker(pollset, worker); } - return 1 /* GPR_TRUE */; } void grpc_pollset_kick(grpc_pollset *p, grpc_pollset_worker *specific_worker) { From 038d26acd80878366c9df40a36d91db7c684aa7f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 6 Aug 2015 08:57:54 -0700 Subject: [PATCH 04/79] Update tools --- test/core/security/print_google_default_creds_token.c | 4 ++-- test/core/security/verify_jwt.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/core/security/print_google_default_creds_token.c b/test/core/security/print_google_default_creds_token.c index 7238efbbfd2..129b19bbe1f 100644 --- a/test/core/security/print_google_default_creds_token.c +++ b/test/core/security/print_google_default_creds_token.c @@ -97,8 +97,8 @@ int main(int argc, char **argv) { gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset)); while (!sync.is_done) { grpc_pollset_worker worker; - grpc_pollset_work(&sync.pollset, &worker, - gpr_inf_future(GPR_CLOCK_REALTIME)); + grpc_pollset_work(&sync.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset)); diff --git a/test/core/security/verify_jwt.c b/test/core/security/verify_jwt.c index 9b334b3c3e8..8c401e4f1b7 100644 --- a/test/core/security/verify_jwt.c +++ b/test/core/security/verify_jwt.c @@ -111,8 +111,8 @@ int main(int argc, char **argv) { gpr_mu_lock(GRPC_POLLSET_MU(&sync.pollset)); while (!sync.is_done) { grpc_pollset_worker worker; - grpc_pollset_work(&sync.pollset, &worker, - gpr_inf_future(GPR_CLOCK_REALTIME)); + grpc_pollset_work(&sync.pollset, &worker, gpr_now(GPR_CLOCK_MONOTONIC), + gpr_inf_future(GPR_CLOCK_MONOTONIC)); } gpr_mu_unlock(GRPC_POLLSET_MU(&sync.pollset)); From d5689305612f5597716a4337ce934883a472a266 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 6 Aug 2015 13:27:22 -0700 Subject: [PATCH 05/79] Fix the plucking problem --- src/core/surface/completion_queue.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/surface/completion_queue.c b/src/core/surface/completion_queue.c index cb862ce94bb..4e9de16c5e1 100644 --- a/src/core/surface/completion_queue.c +++ b/src/core/surface/completion_queue.c @@ -294,6 +294,7 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag, } first_loop = 0; grpc_pollset_work(&cc->pollset, &worker, now, deadline); + del_plucker(cc, tag, &worker); } done: GRPC_SURFACE_TRACE_RETURNED_EVENT(cc, &ret); From f68e472f5c8c5e4e4b8e815550f85192c00f1f8e Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Fri, 7 Aug 2015 18:06:42 -0700 Subject: [PATCH 06/79] Re-install census filters. --- src/core/surface/channel_create.c | 4 ++-- src/core/surface/secure_channel_create.c | 4 ++-- src/core/surface/server.c | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/core/surface/channel_create.c b/src/core/surface/channel_create.c index 707d6156884..4379b3d0169 100644 --- a/src/core/surface/channel_create.c +++ b/src/core/surface/channel_create.c @@ -38,6 +38,7 @@ #include +#include "src/core/channel/census_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" @@ -163,10 +164,9 @@ grpc_channel *grpc_insecure_channel_create(const char *target, subchannel_factory *f; grpc_mdctx *mdctx = grpc_mdctx_create(); int n = 0; - /* TODO(census) if (grpc_channel_args_is_census_enabled(args)) { filters[n++] = &grpc_client_census_filter; - } */ + } filters[n++] = &grpc_compress_filter; filters[n++] = &grpc_client_channel_filter; GPR_ASSERT(n <= MAX_FILTERS); diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index 1f893530257..11c2bc82876 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -38,6 +38,7 @@ #include +#include "src/core/channel/census_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" @@ -213,10 +214,9 @@ grpc_channel *grpc_secure_channel_create(grpc_credentials *creds, args_copy = grpc_channel_args_copy_and_add( new_args_from_connector != NULL ? new_args_from_connector : args, &connector_arg, 1); - /* TODO(census) if (grpc_channel_args_is_census_enabled(args)) { filters[n++] = &grpc_client_census_filter; - } */ + } filters[n++] = &grpc_compress_filter; filters[n++] = &grpc_client_channel_filter; GPR_ASSERT(n <= MAX_FILTERS); diff --git a/src/core/surface/server.c b/src/core/surface/server.c index cd1dc589e11..27070836f35 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -818,10 +818,9 @@ grpc_server *grpc_server_create_from_filters( server->channel_filters = gpr_malloc(server->channel_filter_count * sizeof(grpc_channel_filter *)); server->channel_filters[0] = &server_surface_filter; - /* TODO(census): restore this once we rework census filter if (census_enabled) { server->channel_filters[1] = &grpc_server_census_filter; - } */ + } for (i = 0; i < filter_count; i++) { server->channel_filters[i + 1 + census_enabled] = filters[i]; } From 7adbb643072af7b6dc0f09298fa44b988118df01 Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Tue, 11 Aug 2015 16:00:32 -0700 Subject: [PATCH 07/79] Build file changes --- BUILD | 3 ++ Makefile | 2 + build.json | 1 + gRPC.podspec | 1 + src/core/channel/census_filter.c | 38 +++++++------------ tools/doxygen/Doxyfile.core.internal | 1 + tools/run_tests/sources_and_headers.json | 2 + vsprojects/grpc/grpc.vcxproj | 2 + vsprojects/grpc/grpc.vcxproj.filters | 3 ++ .../grpc_unsecure/grpc_unsecure.vcxproj | 2 + .../grpc_unsecure.vcxproj.filters | 3 ++ 11 files changed, 33 insertions(+), 25 deletions(-) diff --git a/BUILD b/BUILD index dcabd648e4c..2cf64dc9cf5 100644 --- a/BUILD +++ b/BUILD @@ -268,6 +268,7 @@ cc_library( "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", "src/core/census/grpc_context.c", + "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -511,6 +512,7 @@ cc_library( "src/core/census/rpc_stat_id.h", "src/core/surface/init_unsecure.c", "src/core/census/grpc_context.c", + "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -998,6 +1000,7 @@ objc_library( "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", "src/core/census/grpc_context.c", + "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", diff --git a/Makefile b/Makefile index 181194f78f0..06c16478a99 100644 --- a/Makefile +++ b/Makefile @@ -3977,6 +3977,7 @@ LIBGRPC_SRC = \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ src/core/census/grpc_context.c \ + src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ @@ -4249,6 +4250,7 @@ endif LIBGRPC_UNSECURE_SRC = \ src/core/surface/init_unsecure.c \ src/core/census/grpc_context.c \ + src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/build.json b/build.json index 515cecdc5a7..8636c84db36 100644 --- a/build.json +++ b/build.json @@ -217,6 +217,7 @@ ], "src": [ "src/core/census/grpc_context.c", + "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", diff --git a/gRPC.podspec b/gRPC.podspec index 12ce7c1e7b9..d1e95a1652f 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -277,6 +277,7 @@ Pod::Spec.new do |s| 'src/core/tsi/ssl_transport_security.c', 'src/core/tsi/transport_security.c', 'src/core/census/grpc_context.c', + 'src/core/channel/census_filter.c', 'src/core/channel/channel_args.c', 'src/core/channel/channel_stack.c', 'src/core/channel/client_channel.c', diff --git a/src/core/channel/census_filter.c b/src/core/channel/census_filter.c index d996c3475e4..86bde85d127 100644 --- a/src/core/channel/census_filter.c +++ b/src/core/channel/census_filter.c @@ -47,13 +47,12 @@ typedef struct call_data { census_op_id op_id; - census_rpc_stats stats; + /*census_rpc_stats stats;*/ gpr_timespec start_ts; /* recv callback */ grpc_stream_op_buffer* recv_ops; - void (*on_done_recv)(void* user_data, int success); - void* recv_user_data; + grpc_iomgr_closure* on_done_recv; } call_data; typedef struct channel_data { @@ -108,7 +107,7 @@ static void server_on_done_recv(void* ptr, int success) { if (success) { extract_and_annotate_method_tag(calld->recv_ops, calld, chand); } - calld->on_done_recv(calld->recv_user_data, success); + calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success); } static void server_mutate_op(grpc_call_element* elem, @@ -118,9 +117,7 @@ static void server_mutate_op(grpc_call_element* elem, /* substitute our callback for the op callback */ calld->recv_ops = op->recv_ops; calld->on_done_recv = op->on_done_recv; - calld->recv_user_data = op->recv_user_data; - op->on_done_recv = server_on_done_recv; - op->recv_user_data = elem; + op->on_done_recv = calld->on_done_recv; } } @@ -132,19 +129,6 @@ static void server_start_transport_op(grpc_call_element* elem, grpc_call_next_op(elem, op); } -static void channel_op(grpc_channel_element* elem, - grpc_channel_element* from_elem, grpc_channel_op* op) { - switch (op->type) { - case GRPC_TRANSPORT_CLOSED: - /* TODO(hongyu): Annotate trace information for all calls of the channel - */ - break; - default: - break; - } - grpc_channel_next_op(elem, op); -} - static void client_init_call_elem(grpc_call_element* elem, const void* server_transport_data, grpc_transport_stream_op* initial_op) { @@ -171,6 +155,7 @@ static void server_init_call_elem(grpc_call_element* elem, init_rpc_stats(&d->stats); d->start_ts = gpr_now(GPR_CLOCK_REALTIME); d->op_id = census_tracing_start_op(); + grpc_iomgr_closure_init(d->on_done_recv, server_on_done_recv, elem); if (initial_op) server_mutate_op(elem, initial_op); } @@ -179,18 +164,19 @@ static void server_destroy_call_elem(grpc_call_element* elem) { GPR_ASSERT(d != NULL); d->stats.elapsed_time_ms = gpr_timespec_to_micros( gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), d->start_ts)); - census_record_rpc_server_stats(d->op_id, &d->stats); + census_record_stats(d->ctxt, stats, nstats); + /*census_record_rpc_server_stats(d->op_id, &d->stats);*/ census_tracing_end_op(d->op_id); } -static void init_channel_elem(grpc_channel_element* elem, +static void init_channel_elem(grpc_channel_element* elem, grpc_channel* master, const grpc_channel_args* args, grpc_mdctx* mdctx, int is_first, int is_last) { channel_data* chand = elem->channel_data; GPR_ASSERT(chand != NULL); GPR_ASSERT(!is_first); GPR_ASSERT(!is_last); - chand->path_str = grpc_mdstr_from_string(mdctx, ":path"); + chand->path_str = grpc_mdstr_from_string(mdctx, ":path", 0); } static void destroy_channel_elem(grpc_channel_element* elem) { @@ -203,22 +189,24 @@ static void destroy_channel_elem(grpc_channel_element* elem) { const grpc_channel_filter grpc_client_census_filter = { client_start_transport_op, - channel_op, + grpc_channel_next_op, sizeof(call_data), client_init_call_elem, client_destroy_call_elem, sizeof(channel_data), init_channel_elem, destroy_channel_elem, + grpc_call_next_get_peer, "census-client"}; const grpc_channel_filter grpc_server_census_filter = { server_start_transport_op, - channel_op, + grpc_channel_next_op, sizeof(call_data), server_init_call_elem, server_destroy_call_elem, sizeof(channel_data), init_channel_elem, destroy_channel_elem, + grpc_call_next_get_peer, "census-server"}; diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index cbf5c50a653..46c01e5e33d 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -903,6 +903,7 @@ src/core/tsi/fake_transport_security.c \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ src/core/census/grpc_context.c \ +src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 5d23bf9e88f..4a71ef90c95 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -12353,6 +12353,7 @@ "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", + "src/core/channel/census_filter.c", "src/core/channel/census_filter.h", "src/core/channel/channel_args.c", "src/core/channel/channel_args.h", @@ -12810,6 +12811,7 @@ "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", + "src/core/channel/census_filter.c", "src/core/channel/census_filter.h", "src/core/channel/channel_args.c", "src/core/channel/channel_args.h", diff --git a/vsprojects/grpc/grpc.vcxproj b/vsprojects/grpc/grpc.vcxproj index 067f341b957..a87ad29d495 100644 --- a/vsprojects/grpc/grpc.vcxproj +++ b/vsprojects/grpc/grpc.vcxproj @@ -389,6 +389,8 @@ + + diff --git a/vsprojects/grpc/grpc.vcxproj.filters b/vsprojects/grpc/grpc.vcxproj.filters index fcc40c3a4ba..c8812faa85c 100644 --- a/vsprojects/grpc/grpc.vcxproj.filters +++ b/vsprojects/grpc/grpc.vcxproj.filters @@ -67,6 +67,9 @@ src\core\census + + src\core\channel + src\core\channel diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj index b95658b70ce..06da784323d 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj @@ -332,6 +332,8 @@ + + diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters index 05e9d139e07..2d10960a792 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -7,6 +7,9 @@ src\core\census + + src\core\channel + src\core\channel From 3c9b87396f17b48e714f07432b733b45ee612812 Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Thu, 13 Aug 2015 17:01:02 -0700 Subject: [PATCH 08/79] Make census filter mostly no-op --- src/core/channel/census_filter.c | 48 +++++++++++++++++--------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/src/core/channel/census_filter.c b/src/core/channel/census_filter.c index 86bde85d127..8713d606b4e 100644 --- a/src/core/channel/census_filter.c +++ b/src/core/channel/census_filter.c @@ -36,6 +36,8 @@ #include #include +#include "include/grpc/census.h" +#include "src/core/census/rpc_stat_id.h" #include "src/core/channel/channel_stack.h" #include "src/core/channel/noop_filter.h" #include "src/core/statistics/census_interface.h" @@ -47,8 +49,9 @@ typedef struct call_data { census_op_id op_id; - /*census_rpc_stats stats;*/ + census_context* ctxt; gpr_timespec start_ts; + int error; /* recv callback */ grpc_stream_op_buffer* recv_ops; @@ -59,11 +62,6 @@ typedef struct channel_data { grpc_mdstr* path_str; /* pointer to meta data str with key == ":path" */ } channel_data; -static void init_rpc_stats(census_rpc_stats* stats) { - memset(stats, 0, sizeof(census_rpc_stats)); - stats->cnt = 1; -} - static void extract_and_annotate_method_tag(grpc_stream_op_buffer* sopb, call_data* calld, channel_data* chand) { @@ -76,8 +74,7 @@ static void extract_and_annotate_method_tag(grpc_stream_op_buffer* sopb, if (m->md->key == chand->path_str) { gpr_log(GPR_DEBUG, "%s", (const char*)GPR_SLICE_START_PTR(m->md->value->slice)); - census_add_method_tag(calld->op_id, (const char*)GPR_SLICE_START_PTR( - m->md->value->slice)); + /* Add method tag here */ } } } @@ -94,8 +91,6 @@ static void client_mutate_op(grpc_call_element* elem, static void client_start_transport_op(grpc_call_element* elem, grpc_transport_stream_op* op) { - call_data* calld = elem->call_data; - GPR_ASSERT((calld->op_id.upper != 0) || (calld->op_id.lower != 0)); client_mutate_op(elem, op); grpc_call_next_op(elem, op); } @@ -134,17 +129,24 @@ static void client_init_call_elem(grpc_call_element* elem, grpc_transport_stream_op* initial_op) { call_data* d = elem->call_data; GPR_ASSERT(d != NULL); - init_rpc_stats(&d->stats); d->start_ts = gpr_now(GPR_CLOCK_REALTIME); - d->op_id = census_tracing_start_op(); if (initial_op) client_mutate_op(elem, initial_op); } static void client_destroy_call_elem(grpc_call_element* elem) { call_data* d = elem->call_data; + census_stat stats[3]; GPR_ASSERT(d != NULL); - census_record_rpc_client_stats(d->op_id, &d->stats); - census_tracing_end_op(d->op_id); + stats[0].id = CENSUS_RPC_CLIENT_REQUESTS; + stats[0].value = 1.0; + stats[1].id = CENSUS_RPC_CLIENT_ERRORS; + stats[1].value = 0.0; /* TODO(hongyu): add rpc error recording */ + stats[2].id = CENSUS_RPC_CLIENT_LATENCY; + /* Temporarily using census_filter invoke time as the start time of rpc. */ + stats[2].value = gpr_timespec_to_micros( + gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), d->start_ts)); + census_record_stat(d->ctxt, stats, 3); + /* TODO(hongyu): call census_rpc_end_op here */ } static void server_init_call_elem(grpc_call_element* elem, @@ -152,21 +154,25 @@ static void server_init_call_elem(grpc_call_element* elem, grpc_transport_stream_op* initial_op) { call_data* d = elem->call_data; GPR_ASSERT(d != NULL); - init_rpc_stats(&d->stats); d->start_ts = gpr_now(GPR_CLOCK_REALTIME); - d->op_id = census_tracing_start_op(); + /* TODO(hongyu): call census_tracing_start_op here. */ grpc_iomgr_closure_init(d->on_done_recv, server_on_done_recv, elem); if (initial_op) server_mutate_op(elem, initial_op); } static void server_destroy_call_elem(grpc_call_element* elem) { call_data* d = elem->call_data; + census_stat stats[3]; GPR_ASSERT(d != NULL); - d->stats.elapsed_time_ms = gpr_timespec_to_micros( + stats[0].id = CENSUS_RPC_SERVER_REQUESTS; + stats[0].value = 1.0; + stats[1].id = CENSUS_RPC_SERVER_ERRORS; + stats[1].value = 0.0; + stats[2].id = CENSUS_RPC_SERVER_LATENCY; + stats[2].value = gpr_timespec_to_micros( gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), d->start_ts)); - census_record_stats(d->ctxt, stats, nstats); - /*census_record_rpc_server_stats(d->op_id, &d->stats);*/ - census_tracing_end_op(d->op_id); + census_record_stat(d->ctxt, stats, 3); + /* TODO(hongyu): call census_tracing_end_op here */ } static void init_channel_elem(grpc_channel_element* elem, grpc_channel* master, @@ -174,8 +180,6 @@ static void init_channel_elem(grpc_channel_element* elem, grpc_channel* master, int is_first, int is_last) { channel_data* chand = elem->channel_data; GPR_ASSERT(chand != NULL); - GPR_ASSERT(!is_first); - GPR_ASSERT(!is_last); chand->path_str = grpc_mdstr_from_string(mdctx, ":path", 0); } From 58c927cede72cfdda7bf4173b09e8313f954412d Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Fri, 14 Aug 2015 15:19:13 -0700 Subject: [PATCH 09/79] Make census_filter more of a noop. --- src/core/channel/census_filter.c | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/src/core/channel/census_filter.c b/src/core/channel/census_filter.c index 8713d606b4e..53d70be356a 100644 --- a/src/core/channel/census_filter.c +++ b/src/core/channel/census_filter.c @@ -135,18 +135,8 @@ static void client_init_call_elem(grpc_call_element* elem, static void client_destroy_call_elem(grpc_call_element* elem) { call_data* d = elem->call_data; - census_stat stats[3]; GPR_ASSERT(d != NULL); - stats[0].id = CENSUS_RPC_CLIENT_REQUESTS; - stats[0].value = 1.0; - stats[1].id = CENSUS_RPC_CLIENT_ERRORS; - stats[1].value = 0.0; /* TODO(hongyu): add rpc error recording */ - stats[2].id = CENSUS_RPC_CLIENT_LATENCY; - /* Temporarily using census_filter invoke time as the start time of rpc. */ - stats[2].value = gpr_timespec_to_micros( - gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), d->start_ts)); - census_record_stat(d->ctxt, stats, 3); - /* TODO(hongyu): call census_rpc_end_op here */ + /* TODO(hongyu): record rpc client stats and census_rpc_end_op here */ } static void server_init_call_elem(grpc_call_element* elem, @@ -162,17 +152,8 @@ static void server_init_call_elem(grpc_call_element* elem, static void server_destroy_call_elem(grpc_call_element* elem) { call_data* d = elem->call_data; - census_stat stats[3]; GPR_ASSERT(d != NULL); - stats[0].id = CENSUS_RPC_SERVER_REQUESTS; - stats[0].value = 1.0; - stats[1].id = CENSUS_RPC_SERVER_ERRORS; - stats[1].value = 0.0; - stats[2].id = CENSUS_RPC_SERVER_LATENCY; - stats[2].value = gpr_timespec_to_micros( - gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), d->start_ts)); - census_record_stat(d->ctxt, stats, 3); - /* TODO(hongyu): call census_tracing_end_op here */ + /* TODO(hongyu): record rpc server stats and census_tracing_end_op here */ } static void init_channel_elem(grpc_channel_element* elem, grpc_channel* master, From 629c6f534f292163986abce5dd3d97e9846171d3 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 17 Aug 2015 14:59:51 -0700 Subject: [PATCH 10/79] Re-add accidentally deleted code --- src/cpp/server/server.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index dbe60e50def..dfc2b303bca 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -333,6 +333,15 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) { new UnimplementedAsyncRequest(this, cqs[i]); } } + // Start processing rpcs. + if (!sync_methods_->empty()) { + for (auto m = sync_methods_->begin(); m != sync_methods_->end(); m++) { + m->SetupRequest(); + m->Request(server_, cq_.cq()); + } + + ScheduleCallback(); + } return true; } From 86d31776a8f37d719ded99986bed80b912c3a9af Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 19 Aug 2015 12:52:50 -0700 Subject: [PATCH 11/79] Fix syncronous unimplemented methods --- src/cpp/server/server.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index dfc2b303bca..29db0b41c3b 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -329,6 +329,15 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) { grpc_server_start(server_); if (!has_generic_service_) { + if (!sync_methods_->empty()) { + unknown_method_.reset(new RpcServiceMethod( + "unknown", RpcMethod::BIDI_STREAMING, new UnknownMethodHandler)); + // Use of emplace_back with just constructor arguments is not accepted + // here + // by gcc-4.4 because it can't match the anonymous nullptr with a proper + // constructor implicitly. Construct the object and use push_back. + sync_methods_->push_back(SyncRequest(unknown_method_.get(), nullptr)); + } for (size_t i = 0; i < num_cqs; i++) { new UnimplementedAsyncRequest(this, cqs[i]); } From 8c2be9f22807870585111d88f5168dd11da99ce1 Mon Sep 17 00:00:00 2001 From: yang-g Date: Wed, 19 Aug 2015 16:28:09 -0700 Subject: [PATCH 12/79] Remove ChannelInterface and replace it with Channel --- BUILD | 6 +- Makefile | 4 +- build.json | 3 +- examples/pubsub/main.cc | 4 +- examples/pubsub/publisher.cc | 2 +- examples/pubsub/publisher.h | 4 +- examples/pubsub/publisher_test.cc | 6 +- examples/pubsub/subscriber.cc | 2 +- examples/pubsub/subscriber.h | 4 +- examples/pubsub/subscriber_test.cc | 4 +- include/grpc++/async_unary_call.h | 4 +- .../grpc++/{channel_interface.h => channel.h} | 89 ++++++++++++++----- include/grpc++/client_context.h | 10 +-- include/grpc++/completion_queue.h | 5 +- include/grpc++/create_channel.h | 3 +- include/grpc++/credentials.h | 6 +- include/grpc++/generic_stub.h | 5 +- include/grpc++/impl/client_unary_call.h | 4 +- include/grpc++/impl/internal_stub.h | 9 +- include/grpc++/stream.h | 14 +-- src/compiler/cpp_generator.cc | 28 +++--- src/cpp/client/channel.cc | 2 +- src/cpp/client/channel.h | 80 ----------------- src/cpp/client/client_context.cc | 2 +- src/cpp/client/create_channel.cc | 7 +- src/cpp/client/insecure_credentials.cc | 6 +- src/cpp/client/secure_credentials.cc | 6 +- src/cpp/client/secure_credentials.h | 2 +- src/cpp/common/call.cc | 2 +- test/cpp/end2end/async_end2end_test.cc | 6 +- test/cpp/end2end/client_crash_test.cc | 2 +- test/cpp/end2end/end2end_test.cc | 8 +- test/cpp/end2end/generic_end2end_test.cc | 4 +- test/cpp/end2end/mock_test.cc | 4 +- test/cpp/end2end/server_crash_test.cc | 2 +- test/cpp/end2end/server_crash_test_client.cc | 2 +- test/cpp/end2end/thread_stress_test.cc | 4 +- test/cpp/end2end/zookeeper_test.cc | 4 +- test/cpp/interop/client.cc | 2 +- test/cpp/interop/client_helper.cc | 4 +- test/cpp/interop/client_helper.h | 4 +- test/cpp/interop/interop_client.cc | 4 +- test/cpp/interop/interop_client.h | 8 +- test/cpp/interop/reconnect_interop_client.cc | 6 +- test/cpp/qps/client.h | 4 +- test/cpp/qps/perf_db_client.h | 4 +- test/cpp/util/cli_call.cc | 4 +- test/cpp/util/cli_call.h | 4 +- test/cpp/util/cli_call_test.cc | 4 +- test/cpp/util/create_test_channel.cc | 8 +- test/cpp/util/create_test_channel.h | 10 +-- test/cpp/util/grpc_cli.cc | 4 +- tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 3 +- tools/run_tests/sources_and_headers.json | 12 +-- vsprojects/grpc++/grpc++.vcxproj | 3 +- vsprojects/grpc++/grpc++.vcxproj.filters | 7 +- .../grpc++_unsecure/grpc++_unsecure.vcxproj | 3 +- .../grpc++_unsecure.vcxproj.filters | 7 +- 59 files changed, 203 insertions(+), 263 deletions(-) rename include/grpc++/{channel_interface.h => channel.h} (52%) delete mode 100644 src/cpp/client/channel.h diff --git a/BUILD b/BUILD index 7eb59797d43..adcc4cb4135 100644 --- a/BUILD +++ b/BUILD @@ -675,7 +675,6 @@ cc_library( "src/cpp/client/secure_credentials.h", "src/cpp/common/secure_auth_context.h", "src/cpp/server/secure_server_credentials.h", - "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h", "src/cpp/client/secure_channel_arguments.cc", "src/cpp/client/secure_credentials.cc", @@ -714,8 +713,8 @@ cc_library( "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -767,7 +766,6 @@ cc_library( cc_library( name = "grpc++_unsecure", srcs = [ - "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h", "src/cpp/common/insecure_create_auth_context.cc", "src/cpp/client/channel.cc", @@ -801,8 +799,8 @@ cc_library( "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", diff --git a/Makefile b/Makefile index f3944eccbb9..dba1a0457eb 100644 --- a/Makefile +++ b/Makefile @@ -4630,8 +4630,8 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/async_unary_call.h \ include/grpc++/auth_context.h \ include/grpc++/byte_buffer.h \ + include/grpc++/channel.h \ include/grpc++/channel_arguments.h \ - include/grpc++/channel_interface.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ include/grpc++/config.h \ @@ -4873,8 +4873,8 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/async_unary_call.h \ include/grpc++/auth_context.h \ include/grpc++/byte_buffer.h \ + include/grpc++/channel.h \ include/grpc++/channel_arguments.h \ - include/grpc++/channel_interface.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ include/grpc++/config.h \ diff --git a/build.json b/build.json index 85457dde86d..553e98db4b3 100644 --- a/build.json +++ b/build.json @@ -34,8 +34,8 @@ "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -73,7 +73,6 @@ "include/grpc++/time.h" ], "headers": [ - "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h" ], "src": [ diff --git a/examples/pubsub/main.cc b/examples/pubsub/main.cc index b1898f18d9a..fcee3b316b3 100644 --- a/examples/pubsub/main.cc +++ b/examples/pubsub/main.cc @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -72,7 +72,7 @@ int main(int argc, char** argv) { ss << FLAGS_server_host << ":" << FLAGS_server_port; std::shared_ptr creds = grpc::GoogleDefaultCredentials(); - std::shared_ptr channel = + std::shared_ptr channel = grpc::CreateChannel(ss.str(), creds, grpc::ChannelArguments()); grpc::examples::pubsub::Publisher publisher(channel); diff --git a/examples/pubsub/publisher.cc b/examples/pubsub/publisher.cc index 458050af739..fd38ca92ed9 100644 --- a/examples/pubsub/publisher.cc +++ b/examples/pubsub/publisher.cc @@ -50,7 +50,7 @@ namespace grpc { namespace examples { namespace pubsub { -Publisher::Publisher(std::shared_ptr channel) +Publisher::Publisher(std::shared_ptr channel) : stub_(PublisherService::NewStub(channel)) {} void Publisher::Shutdown() { stub_.reset(); } diff --git a/examples/pubsub/publisher.h b/examples/pubsub/publisher.h index 33bcf98df48..b98e6973dce 100644 --- a/examples/pubsub/publisher.h +++ b/examples/pubsub/publisher.h @@ -34,7 +34,7 @@ #ifndef GRPC_EXAMPLES_PUBSUB_PUBLISHER_H #define GRPC_EXAMPLES_PUBSUB_PUBLISHER_H -#include +#include #include #include "examples/pubsub/pubsub.grpc.pb.h" @@ -45,7 +45,7 @@ namespace pubsub { class Publisher { public: - Publisher(std::shared_ptr channel); + Publisher(std::shared_ptr channel); void Shutdown(); Status CreateTopic(const grpc::string& topic); diff --git a/examples/pubsub/publisher_test.cc b/examples/pubsub/publisher_test.cc index 6b9dcacc499..972b426e641 100644 --- a/examples/pubsub/publisher_test.cc +++ b/examples/pubsub/publisher_test.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #include #include #include @@ -46,7 +46,7 @@ #include "test/core/util/port.h" #include "test/core/util/test_config.h" -using grpc::ChannelInterface; +using grpc::Channel; namespace grpc { namespace testing { @@ -124,7 +124,7 @@ class PublisherTest : public ::testing::Test { std::unique_ptr server_; PublisherServiceImpl service_; - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr publisher_; }; diff --git a/examples/pubsub/subscriber.cc b/examples/pubsub/subscriber.cc index d9e0292ba0f..0818f501db8 100644 --- a/examples/pubsub/subscriber.cc +++ b/examples/pubsub/subscriber.cc @@ -48,7 +48,7 @@ namespace grpc { namespace examples { namespace pubsub { -Subscriber::Subscriber(std::shared_ptr channel) +Subscriber::Subscriber(std::shared_ptr channel) : stub_(SubscriberService::NewStub(channel)) {} void Subscriber::Shutdown() { stub_.reset(); } diff --git a/examples/pubsub/subscriber.h b/examples/pubsub/subscriber.h index 40ab45471d5..87c833102c7 100644 --- a/examples/pubsub/subscriber.h +++ b/examples/pubsub/subscriber.h @@ -34,7 +34,7 @@ #ifndef GRPC_EXAMPLES_PUBSUB_SUBSCRIBER_H #define GRPC_EXAMPLES_PUBSUB_SUBSCRIBER_H -#include +#include #include #include "examples/pubsub/pubsub.grpc.pb.h" @@ -45,7 +45,7 @@ namespace pubsub { class Subscriber { public: - Subscriber(std::shared_ptr channel); + Subscriber(std::shared_ptr channel); void Shutdown(); Status CreateSubscription(const grpc::string& topic, diff --git a/examples/pubsub/subscriber_test.cc b/examples/pubsub/subscriber_test.cc index b0e7fc034b8..7974ca88c2d 100644 --- a/examples/pubsub/subscriber_test.cc +++ b/examples/pubsub/subscriber_test.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #include #include #include @@ -122,7 +122,7 @@ class SubscriberTest : public ::testing::Test { std::unique_ptr server_; SubscriberServiceImpl service_; - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr subscriber_; }; diff --git a/include/grpc++/async_unary_call.h b/include/grpc++/async_unary_call.h index 3d22df4b332..4e1dd15f32c 100644 --- a/include/grpc++/async_unary_call.h +++ b/include/grpc++/async_unary_call.h @@ -34,7 +34,7 @@ #ifndef GRPCXX_ASYNC_UNARY_CALL_H #define GRPCXX_ASYNC_UNARY_CALL_H -#include +#include #include #include #include @@ -58,7 +58,7 @@ class ClientAsyncResponseReader GRPC_FINAL : public ClientAsyncResponseReaderInterface { public: template - ClientAsyncResponseReader(ChannelInterface* channel, CompletionQueue* cq, + ClientAsyncResponseReader(Channel* channel, CompletionQueue* cq, const RpcMethod& method, ClientContext* context, const W& request) : context_(context), call_(channel->CreateCall(method, context, cq)) { diff --git a/include/grpc++/channel_interface.h b/include/grpc++/channel.h similarity index 52% rename from include/grpc++/channel_interface.h rename to include/grpc++/channel.h index 4176cded7b6..a4cef1b4d90 100644 --- a/include/grpc++/channel_interface.h +++ b/include/grpc++/channel.h @@ -31,36 +31,51 @@ * */ -#ifndef GRPCXX_CHANNEL_INTERFACE_H -#define GRPCXX_CHANNEL_INTERFACE_H +#ifndef GRPCXX_CHANNEL_H +#define GRPCXX_CHANNEL_H #include #include -#include +#include #include +#include -struct grpc_call; +struct grpc_channel; namespace grpc { -class Call; -class CallOpBuffer; -class ClientContext; +class CallOpSetInterface; +class ChannelArguments; class CompletionQueue; -class RpcMethod; +class Credentials; +class SecureCredentials; -class ChannelInterface : public CallHook, - public std::enable_shared_from_this { - public: - virtual ~ChannelInterface() {} +template +class ClientReader; +template +class ClientWriter; +template +class ClientReaderWriter; +template +class ClientAsyncReader; +template +class ClientAsyncWriter; +template +class ClientAsyncReaderWriter; +template +class ClientAsyncResponseReader; - virtual void* RegisterMethod(const char* method_name) = 0; - virtual Call CreateCall(const RpcMethod& method, ClientContext* context, - CompletionQueue* cq) = 0; +class Channel GRPC_FINAL : public GrpcLibrary, + public CallHook, + public std::enable_shared_from_this { + public: + explicit Channel(grpc_channel* c_channel); + Channel(const grpc::string& host, grpc_channel* c_channel); + ~Channel(); // Get the current channel state. If the channel is in IDLE and try_to_connect // is set to true, try to connect. - virtual grpc_connectivity_state GetState(bool try_to_connect) = 0; + grpc_connectivity_state GetState(bool try_to_connect); // Return the tag on cq when the channel state is changed or deadline expires. // GetState needs to called to get the current state. @@ -79,14 +94,44 @@ class ChannelInterface : public CallHook, return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); } + // Used by Stub only in generated code. + void* RegisterMethod(const char* method); + private: - virtual void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline, - CompletionQueue* cq, void* tag) = 0; - virtual bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline) = 0; + template + friend class ::grpc::ClientReader; + template + friend class ::grpc::ClientWriter; + template + friend class ::grpc::ClientReaderWriter; + template + friend class ::grpc::ClientAsyncReader; + template + friend class ::grpc::ClientAsyncWriter; + template + friend class ::grpc::ClientAsyncReaderWriter; + template + friend class ::grpc::ClientAsyncResponseReader; + template + friend Status BlockingUnaryCall(Channel* channel, const RpcMethod& method, + ClientContext* context, + const InputMessage& request, + OutputMessage* result); + + Call CreateCall(const RpcMethod& method, ClientContext* context, + CompletionQueue* cq); + void PerformOpsOnCall(CallOpSetInterface* ops, Call* call); + + void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline, CompletionQueue* cq, + void* tag); + bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, + gpr_timespec deadline); + + const grpc::string host_; + grpc_channel* const c_channel_; // owned }; } // namespace grpc -#endif // GRPCXX_CHANNEL_INTERFACE_H +#endif // GRPCXX_CHANNEL_H diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h index 8de2ba4877d..55ed17506a6 100644 --- a/include/grpc++/client_context.h +++ b/include/grpc++/client_context.h @@ -51,7 +51,7 @@ struct census_context; namespace grpc { -class ChannelInterface; +class Channel; class CompletionQueue; class Credentials; class RpcMethod; @@ -215,20 +215,18 @@ class ClientContext { template friend class ::grpc::ClientAsyncResponseReader; template - friend Status BlockingUnaryCall(ChannelInterface* channel, - const RpcMethod& method, + friend Status BlockingUnaryCall(Channel* channel, const RpcMethod& method, ClientContext* context, const InputMessage& request, OutputMessage* result); grpc_call* call() { return call_; } - void set_call(grpc_call* call, - const std::shared_ptr& channel); + void set_call(grpc_call* call, const std::shared_ptr& channel); grpc::string authority() { return authority_; } bool initial_metadata_received_; - std::shared_ptr channel_; + std::shared_ptr channel_; grpc_call* call_; gpr_timespec deadline_; grpc::string authority_; diff --git a/include/grpc++/completion_queue.h b/include/grpc++/completion_queue.h index 2f302111457..061f4874fab 100644 --- a/include/grpc++/completion_queue.h +++ b/include/grpc++/completion_queue.h @@ -65,7 +65,7 @@ template class BidiStreamingHandler; class UnknownMethodHandler; -class ChannelInterface; +class Channel; class ClientContext; class CompletionQueue; class RpcMethod; @@ -143,8 +143,7 @@ class CompletionQueue : public GrpcLibrary { friend class ::grpc::Server; friend class ::grpc::ServerContext; template - friend Status BlockingUnaryCall(ChannelInterface* channel, - const RpcMethod& method, + friend Status BlockingUnaryCall(Channel* channel, const RpcMethod& method, ClientContext* context, const InputMessage& request, OutputMessage* result); diff --git a/include/grpc++/create_channel.h b/include/grpc++/create_channel.h index 424a93a64c5..fe344521284 100644 --- a/include/grpc++/create_channel.h +++ b/include/grpc++/create_channel.h @@ -41,10 +41,9 @@ namespace grpc { class ChannelArguments; -class ChannelInterface; // If creds does not hold an object or is invalid, a lame channel is returned. -std::shared_ptr CreateChannel( +std::shared_ptr CreateChannel( const grpc::string& target, const std::shared_ptr& creds, const ChannelArguments& args); diff --git a/include/grpc++/credentials.h b/include/grpc++/credentials.h index a4f1e731185..306dc961c0e 100644 --- a/include/grpc++/credentials.h +++ b/include/grpc++/credentials.h @@ -41,7 +41,7 @@ namespace grpc { class ChannelArguments; -class ChannelInterface; +class Channel; class SecureCredentials; class Credentials : public GrpcLibrary { @@ -57,11 +57,11 @@ class Credentials : public GrpcLibrary { virtual SecureCredentials* AsSecureCredentials() = 0; private: - friend std::shared_ptr CreateChannel( + friend std::shared_ptr CreateChannel( const grpc::string& target, const std::shared_ptr& creds, const ChannelArguments& args); - virtual std::shared_ptr CreateChannel( + virtual std::shared_ptr CreateChannel( const grpc::string& target, const ChannelArguments& args) = 0; }; diff --git a/include/grpc++/generic_stub.h b/include/grpc++/generic_stub.h index 172f10e45a6..734440881e0 100644 --- a/include/grpc++/generic_stub.h +++ b/include/grpc++/generic_stub.h @@ -47,8 +47,7 @@ typedef ClientAsyncReaderWriter // by name. class GenericStub GRPC_FINAL { public: - explicit GenericStub(std::shared_ptr channel) - : channel_(channel) {} + explicit GenericStub(std::shared_ptr channel) : channel_(channel) {} // begin a call to a named method std::unique_ptr Call( @@ -56,7 +55,7 @@ class GenericStub GRPC_FINAL { void* tag); private: - std::shared_ptr channel_; + std::shared_ptr channel_; }; } // namespace grpc diff --git a/include/grpc++/impl/client_unary_call.h b/include/grpc++/impl/client_unary_call.h index b77ce7d02cd..4aae816cd73 100644 --- a/include/grpc++/impl/client_unary_call.h +++ b/include/grpc++/impl/client_unary_call.h @@ -41,14 +41,14 @@ namespace grpc { -class ChannelInterface; +class Channel; class ClientContext; class CompletionQueue; class RpcMethod; // Wrapper that performs a blocking unary call template -Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method, +Status BlockingUnaryCall(Channel* channel, const RpcMethod& method, ClientContext* context, const InputMessage& request, OutputMessage* result) { CompletionQueue cq; diff --git a/include/grpc++/impl/internal_stub.h b/include/grpc++/impl/internal_stub.h index 370a3b8ac5b..60eb3fdd069 100644 --- a/include/grpc++/impl/internal_stub.h +++ b/include/grpc++/impl/internal_stub.h @@ -36,20 +36,19 @@ #include -#include +#include namespace grpc { class InternalStub { public: - InternalStub(const std::shared_ptr& channel) - : channel_(channel) {} + InternalStub(const std::shared_ptr& channel) : channel_(channel) {} virtual ~InternalStub() {} - ChannelInterface* channel() { return channel_.get(); } + Channel* channel() { return channel_.get(); } private: - const std::shared_ptr channel_; + const std::shared_ptr channel_; }; } // namespace grpc diff --git a/include/grpc++/stream.h b/include/grpc++/stream.h index 45dafcd2822..577eb4e9257 100644 --- a/include/grpc++/stream.h +++ b/include/grpc++/stream.h @@ -34,7 +34,7 @@ #ifndef GRPCXX_STREAM_H #define GRPCXX_STREAM_H -#include +#include #include #include #include @@ -100,7 +100,7 @@ class ClientReader GRPC_FINAL : public ClientReaderInterface { public: // Blocking create a stream and write the first request out. template - ClientReader(ChannelInterface* channel, const RpcMethod& method, + ClientReader(Channel* channel, const RpcMethod& method, ClientContext* context, const W& request) : context_(context), call_(channel->CreateCall(method, context, &cq_)) { CallOpSet { public: // Blocking create a stream. template - ClientWriter(ChannelInterface* channel, const RpcMethod& method, + ClientWriter(Channel* channel, const RpcMethod& method, ClientContext* context, R* response) : context_(context), call_(channel->CreateCall(method, context, &cq_)) { finish_ops_.RecvMessage(response); @@ -221,7 +221,7 @@ template class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface { public: // Blocking create a stream. - ClientReaderWriter(ChannelInterface* channel, const RpcMethod& method, + ClientReaderWriter(Channel* channel, const RpcMethod& method, ClientContext* context) : context_(context), call_(channel->CreateCall(method, context, &cq_)) { CallOpSet ops; @@ -425,7 +425,7 @@ class ClientAsyncReader GRPC_FINAL : public ClientAsyncReaderInterface { public: // Create a stream and write the first request out. template - ClientAsyncReader(ChannelInterface* channel, CompletionQueue* cq, + ClientAsyncReader(Channel* channel, CompletionQueue* cq, const RpcMethod& method, ClientContext* context, const W& request, void* tag) : context_(context), call_(channel->CreateCall(method, context, cq)) { @@ -484,7 +484,7 @@ template class ClientAsyncWriter GRPC_FINAL : public ClientAsyncWriterInterface { public: template - ClientAsyncWriter(ChannelInterface* channel, CompletionQueue* cq, + ClientAsyncWriter(Channel* channel, CompletionQueue* cq, const RpcMethod& method, ClientContext* context, R* response, void* tag) : context_(context), call_(channel->CreateCall(method, context, cq)) { @@ -549,7 +549,7 @@ template class ClientAsyncReaderWriter GRPC_FINAL : public ClientAsyncReaderWriterInterface { public: - ClientAsyncReaderWriter(ChannelInterface* channel, CompletionQueue* cq, + ClientAsyncReaderWriter(Channel* channel, CompletionQueue* cq, const RpcMethod& method, ClientContext* context, void* tag) : context_(context), call_(channel->CreateCall(method, context, cq)) { diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index ea487bcd89a..731ba58fb1f 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -123,7 +123,7 @@ grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file, "\n" "namespace grpc {\n" "class CompletionQueue;\n" - "class ChannelInterface;\n" + "class Channel;\n" "class RpcService;\n" "class ServerCompletionQueue;\n" "class ServerContext;\n" @@ -557,8 +557,7 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer, "class Stub GRPC_FINAL : public StubInterface," " public ::grpc::InternalStub {\n public:\n"); printer->Indent(); - printer->Print( - "Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel);\n"); + printer->Print("Stub(const std::shared_ptr< ::grpc::Channel>& channel);\n"); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethod(printer, service->method(i), vars, true); } @@ -575,7 +574,7 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer, printer->Print("};\n"); printer->Print( "static std::unique_ptr NewStub(const std::shared_ptr< " - "::grpc::ChannelInterface>& channel, " + "::grpc::Channel>& channel, " "const ::grpc::StubOptions& options = ::grpc::StubOptions());\n"); printer->Print("\n"); @@ -703,7 +702,7 @@ grpc::string GetSourceIncludes(const grpc::protobuf::FileDescriptor *file, std::map vars; printer.Print(vars, "#include \n"); - printer.Print(vars, "#include \n"); + printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); @@ -964,18 +963,17 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer, } printer->Print(*vars, "};\n\n"); - printer->Print( - *vars, - "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub(" - "const std::shared_ptr< ::grpc::ChannelInterface>& channel, " - "const ::grpc::StubOptions& options) {\n" - " std::unique_ptr< $ns$$Service$::Stub> stub(new " - "$ns$$Service$::Stub(channel));\n" - " return stub;\n" - "}\n\n"); + printer->Print(*vars, + "std::unique_ptr< $ns$$Service$::Stub> $ns$$Service$::NewStub(" + "const std::shared_ptr< ::grpc::Channel>& channel, " + "const ::grpc::StubOptions& options) {\n" + " std::unique_ptr< $ns$$Service$::Stub> stub(new " + "$ns$$Service$::Stub(channel));\n" + " return stub;\n" + "}\n\n"); printer->Print(*vars, "$ns$$Service$::Stub::Stub(const std::shared_ptr< " - "::grpc::ChannelInterface>& channel)\n"); + "::grpc::Channel>& channel)\n"); printer->Indent(); printer->Print(": ::grpc::InternalStub(channel)"); for (int i = 0; i < service->method_count(); ++i) { diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc index 9695a0f14bc..d9ffdc30cd1 100644 --- a/src/cpp/client/channel.cc +++ b/src/cpp/client/channel.cc @@ -31,7 +31,7 @@ * */ -#include "src/cpp/client/channel.h" +#include #include diff --git a/src/cpp/client/channel.h b/src/cpp/client/channel.h deleted file mode 100644 index 7e406ad788a..00000000000 --- a/src/cpp/client/channel.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * - * Copyright 2015, 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. - * - */ - -#ifndef GRPC_INTERNAL_CPP_CLIENT_CHANNEL_H -#define GRPC_INTERNAL_CPP_CLIENT_CHANNEL_H - -#include - -#include -#include -#include - -struct grpc_channel; - -namespace grpc { -class Call; -class CallOpSetInterface; -class ChannelArguments; -class CompletionQueue; -class Credentials; -class StreamContextInterface; - -class Channel GRPC_FINAL : public GrpcLibrary, public ChannelInterface { - public: - explicit Channel(grpc_channel* c_channel); - Channel(const grpc::string& host, grpc_channel* c_channel); - ~Channel() GRPC_OVERRIDE; - - void* RegisterMethod(const char* method) GRPC_OVERRIDE; - Call CreateCall(const RpcMethod& method, ClientContext* context, - CompletionQueue* cq) GRPC_OVERRIDE; - void PerformOpsOnCall(CallOpSetInterface* ops, Call* call) GRPC_OVERRIDE; - - grpc_connectivity_state GetState(bool try_to_connect) GRPC_OVERRIDE; - - private: - void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline, CompletionQueue* cq, - void* tag) GRPC_OVERRIDE; - - bool WaitForStateChangeImpl(grpc_connectivity_state last_observed, - gpr_timespec deadline) GRPC_OVERRIDE; - - const grpc::string host_; - grpc_channel* const c_channel_; // owned -}; - -} // namespace grpc - -#endif // GRPC_INTERNAL_CPP_CLIENT_CHANNEL_H diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc index b8caa1eae4d..a3906fc781c 100644 --- a/src/cpp/client/client_context.cc +++ b/src/cpp/client/client_context.cc @@ -71,7 +71,7 @@ void ClientContext::AddMetadata(const grpc::string& meta_key, } void ClientContext::set_call(grpc_call* call, - const std::shared_ptr& channel) { + const std::shared_ptr& channel) { GPR_ASSERT(call_ == nullptr); call_ = call; channel_ = channel; diff --git a/src/cpp/client/create_channel.cc b/src/cpp/client/create_channel.cc index 5ae772f0963..704470693e6 100644 --- a/src/cpp/client/create_channel.cc +++ b/src/cpp/client/create_channel.cc @@ -34,15 +34,14 @@ #include #include -#include "src/cpp/client/channel.h" -#include +#include #include #include namespace grpc { class ChannelArguments; -std::shared_ptr CreateChannel( +std::shared_ptr CreateChannel( const grpc::string& target, const std::shared_ptr& creds, const ChannelArguments& args) { ChannelArguments cp_args = args; @@ -51,7 +50,7 @@ std::shared_ptr CreateChannel( cp_args.SetString(GRPC_ARG_PRIMARY_USER_AGENT_STRING, user_agent_prefix.str()); return creds ? creds->CreateChannel(target, cp_args) - : std::shared_ptr( + : std::shared_ptr( new Channel(grpc_lame_client_channel_create( NULL, GRPC_STATUS_INVALID_ARGUMENT, "Invalid credentials."))); diff --git a/src/cpp/client/insecure_credentials.cc b/src/cpp/client/insecure_credentials.cc index 2f9357b5686..70ce17dc6da 100644 --- a/src/cpp/client/insecure_credentials.cc +++ b/src/cpp/client/insecure_credentials.cc @@ -34,21 +34,21 @@ #include #include +#include #include #include #include -#include "src/cpp/client/channel.h" namespace grpc { namespace { class InsecureCredentialsImpl GRPC_FINAL : public Credentials { public: - std::shared_ptr CreateChannel( + std::shared_ptr CreateChannel( const string& target, const grpc::ChannelArguments& args) GRPC_OVERRIDE { grpc_channel_args channel_args; args.SetChannelArgs(&channel_args); - return std::shared_ptr(new Channel( + return std::shared_ptr(new Channel( grpc_insecure_channel_create(target.c_str(), &channel_args, nullptr))); } diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc index 6cd6b77fcf5..b32f783fa33 100644 --- a/src/cpp/client/secure_credentials.cc +++ b/src/cpp/client/secure_credentials.cc @@ -33,18 +33,18 @@ #include +#include #include #include -#include "src/cpp/client/channel.h" #include "src/cpp/client/secure_credentials.h" namespace grpc { -std::shared_ptr SecureCredentials::CreateChannel( +std::shared_ptr SecureCredentials::CreateChannel( const string& target, const grpc::ChannelArguments& args) { grpc_channel_args channel_args; args.SetChannelArgs(&channel_args); - return std::shared_ptr(new Channel( + return std::shared_ptr(new Channel( args.GetSslTargetNameOverride(), grpc_secure_channel_create(c_creds_, target.c_str(), &channel_args))); } diff --git a/src/cpp/client/secure_credentials.h b/src/cpp/client/secure_credentials.h index c2b8d43a154..974d83514de 100644 --- a/src/cpp/client/secure_credentials.h +++ b/src/cpp/client/secure_credentials.h @@ -48,7 +48,7 @@ class SecureCredentials GRPC_FINAL : public Credentials { grpc_credentials* GetRawCreds() { return c_creds_; } bool ApplyToCall(grpc_call* call) GRPC_OVERRIDE; - std::shared_ptr CreateChannel( + std::shared_ptr CreateChannel( const string& target, const grpc::ChannelArguments& args) GRPC_OVERRIDE; SecureCredentials* AsSecureCredentials() GRPC_OVERRIDE { return this; } diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 0a5c976e011..479f14d42bb 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include "src/core/profiling/timers.h" diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc index a30c8412167..7006ebb83aa 100644 --- a/test/cpp/end2end/async_end2end_test.cc +++ b/test/cpp/end2end/async_end2end_test.cc @@ -39,7 +39,7 @@ #include "test/cpp/util/echo.grpc.pb.h" #include #include -#include +#include #include #include #include @@ -136,7 +136,7 @@ class AsyncEnd2endTest : public ::testing::Test { } void ResetStub() { - std::shared_ptr channel = CreateChannel( + std::shared_ptr channel = CreateChannel( server_address_.str(), InsecureCredentials(), ChannelArguments()); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel)); } @@ -672,7 +672,7 @@ TEST_F(AsyncEnd2endTest, ServerCheckDone) { } TEST_F(AsyncEnd2endTest, UnimplementedRpc) { - std::shared_ptr channel = CreateChannel( + std::shared_ptr channel = CreateChannel( server_address_.str(), InsecureCredentials(), ChannelArguments()); std::unique_ptr stub; stub = diff --git a/test/cpp/end2end/client_crash_test.cc b/test/cpp/end2end/client_crash_test.cc index 1c2a5c3a362..89708a2ef66 100644 --- a/test/cpp/end2end/client_crash_test.cc +++ b/test/cpp/end2end/client_crash_test.cc @@ -36,7 +36,7 @@ #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index 350b10726f9..fc4e88c2a78 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -41,7 +41,7 @@ #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include @@ -106,7 +106,7 @@ bool CheckIsLocalhost(const grpc::string& addr) { class Proxy : public ::grpc::cpp::test::util::TestService::Service { public: - Proxy(std::shared_ptr channel) + Proxy(std::shared_ptr channel) : stub_(grpc::cpp::test::util::TestService::NewStub(channel)) {} Status Echo(ServerContext* server_context, const EchoRequest* request, @@ -319,7 +319,7 @@ class End2endTest : public ::testing::TestWithParam { stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel_)); } - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr stub_; std::unique_ptr server_; std::unique_ptr proxy_server_; @@ -571,7 +571,7 @@ TEST_F(End2endTest, DiffPackageServices) { TEST_F(End2endTest, BadCredentials) { std::shared_ptr bad_creds = ServiceAccountCredentials("", "", 1); EXPECT_EQ(static_cast(nullptr), bad_creds.get()); - std::shared_ptr channel = + std::shared_ptr channel = CreateChannel(server_address_.str(), bad_creds, ChannelArguments()); std::unique_ptr stub( grpc::cpp::test::util::TestService::NewStub(channel)); diff --git a/test/cpp/end2end/generic_end2end_test.cc b/test/cpp/end2end/generic_end2end_test.cc index 3120cec938f..b817198fa70 100644 --- a/test/cpp/end2end/generic_end2end_test.cc +++ b/test/cpp/end2end/generic_end2end_test.cc @@ -41,7 +41,7 @@ #include #include #include -#include +#include #include #include #include @@ -127,7 +127,7 @@ class GenericEnd2endTest : public ::testing::Test { } void ResetStub() { - std::shared_ptr channel = CreateChannel( + std::shared_ptr channel = CreateChannel( server_address_.str(), InsecureCredentials(), ChannelArguments()); generic_stub_.reset(new GenericStub(channel)); } diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc index 32130e24e94..96b6ecbd6e0 100644 --- a/test/cpp/end2end/mock_test.cc +++ b/test/cpp/end2end/mock_test.cc @@ -38,7 +38,7 @@ #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include @@ -251,7 +251,7 @@ class MockTest : public ::testing::Test { void TearDown() GRPC_OVERRIDE { server_->Shutdown(); } void ResetStub() { - std::shared_ptr channel = CreateChannel( + std::shared_ptr channel = CreateChannel( server_address_.str(), InsecureCredentials(), ChannelArguments()); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel)); } diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc index 5c7bb4e6531..2688f2c4eac 100644 --- a/test/cpp/end2end/server_crash_test.cc +++ b/test/cpp/end2end/server_crash_test.cc @@ -36,7 +36,7 @@ #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc index 1da4f05c8d1..52dce8f28ef 100644 --- a/test/cpp/end2end/server_crash_test_client.cc +++ b/test/cpp/end2end/server_crash_test_client.cc @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include #include diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc index ff9c945c7c3..e59a77dc9ed 100644 --- a/test/cpp/end2end/thread_stress_test.cc +++ b/test/cpp/end2end/thread_stress_test.cc @@ -39,7 +39,7 @@ #include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include @@ -197,7 +197,7 @@ class End2endTest : public ::testing::Test { void TearDown() GRPC_OVERRIDE { server_->Shutdown(); } void ResetStub() { - std::shared_ptr channel = CreateChannel( + std::shared_ptr channel = CreateChannel( server_address_.str(), InsecureCredentials(), ChannelArguments()); stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel)); } diff --git a/test/cpp/end2end/zookeeper_test.cc b/test/cpp/end2end/zookeeper_test.cc index f5eba66cb2c..d7fac3d07e3 100644 --- a/test/cpp/end2end/zookeeper_test.cc +++ b/test/cpp/end2end/zookeeper_test.cc @@ -36,7 +36,7 @@ #include "test/cpp/util/echo.grpc.pb.h" #include "src/core/support/env.h" #include -#include +#include #include #include #include @@ -170,7 +170,7 @@ class ZookeeperTest : public ::testing::Test { return strs.str(); } - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr stub_; std::unique_ptr server1_; std::unique_ptr server2_; diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index 48143b2e53a..d9e4f1ba6a6 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc index b8a222c54a0..91c8dbc0c3b 100644 --- a/test/cpp/interop/client_helper.cc +++ b/test/cpp/interop/client_helper.cc @@ -44,7 +44,7 @@ #include #include #include -#include +#include #include #include #include @@ -103,7 +103,7 @@ grpc::string GetOauth2AccessToken() { return access_token; } -std::shared_ptr CreateChannelForTestCase( +std::shared_ptr CreateChannelForTestCase( const grpc::string& test_case) { GPR_ASSERT(FLAGS_server_port); const int host_port_buf_size = 1024; diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h index 000374ae8e3..3b46d870160 100644 --- a/test/cpp/interop/client_helper.h +++ b/test/cpp/interop/client_helper.h @@ -37,7 +37,7 @@ #include #include -#include +#include namespace grpc { namespace testing { @@ -46,7 +46,7 @@ grpc::string GetServiceAccountJsonKey(); grpc::string GetOauth2AccessToken(); -std::shared_ptr CreateChannelForTestCase( +std::shared_ptr CreateChannelForTestCase( const grpc::string& test_case); class InteropClientContextInspector { diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index 5ed14d556a0..c73505c670e 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -42,7 +42,7 @@ #include #include #include -#include +#include #include #include #include @@ -84,7 +84,7 @@ CompressionType GetInteropCompressionTypeFromCompressionAlgorithm( } } // namespace -InteropClient::InteropClient(std::shared_ptr channel) +InteropClient::InteropClient(std::shared_ptr channel) : channel_(channel) {} void InteropClient::AssertOkOrPrintErrorStatus(const Status& s) { diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h index d6fb9bff397..354c2c61959 100644 --- a/test/cpp/interop/interop_client.h +++ b/test/cpp/interop/interop_client.h @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include "test/proto/messages.grpc.pb.h" @@ -45,10 +45,10 @@ namespace testing { class InteropClient { public: - explicit InteropClient(std::shared_ptr channel); + explicit InteropClient(std::shared_ptr channel); ~InteropClient() {} - void Reset(std::shared_ptr channel) { channel_ = channel; } + void Reset(std::shared_ptr channel) { channel_ = channel; } void DoEmpty(); void DoLargeUnary(); @@ -82,7 +82,7 @@ class InteropClient { void PerformLargeUnary(SimpleRequest* request, SimpleResponse* response); void AssertOkOrPrintErrorStatus(const Status& s); - std::shared_ptr channel_; + std::shared_ptr channel_; }; } // namespace testing diff --git a/test/cpp/interop/reconnect_interop_client.cc b/test/cpp/interop/reconnect_interop_client.cc index 65f098050e6..675c6ff0739 100644 --- a/test/cpp/interop/reconnect_interop_client.cc +++ b/test/cpp/interop/reconnect_interop_client.cc @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include "test/cpp/util/create_test_channel.h" @@ -50,7 +50,7 @@ DEFINE_int32(server_control_port, 0, "Server port for control rpcs."); DEFINE_int32(server_retry_port, 0, "Server port for testing reconnection."); DEFINE_string(server_host, "127.0.0.1", "Server host to connect to"); -using grpc::ChannelInterface; +using grpc::Channel; using grpc::ClientContext; using grpc::CreateTestChannel; using grpc::Status; @@ -78,7 +78,7 @@ int main(int argc, char** argv) { gpr_log(GPR_INFO, "Starting connections with retries."); server_address.str(""); server_address << FLAGS_server_host << ':' << FLAGS_server_retry_port; - std::shared_ptr retry_channel = + std::shared_ptr retry_channel = CreateTestChannel(server_address.str(), true); // About 13 retries. const int kDeadlineSeconds = 540; diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h index 1c4f46328f9..5395d02e32f 100644 --- a/test/cpp/qps/client.h +++ b/test/cpp/qps/client.h @@ -125,11 +125,11 @@ class Client { channel_ = CreateTestChannel(target, config.enable_ssl()); stub_ = TestService::NewStub(channel_); } - ChannelInterface* get_channel() { return channel_.get(); } + Channel* get_channel() { return channel_.get(); } TestService::Stub* get_stub() { return stub_.get(); } private: - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr stub_; }; std::vector channels_; diff --git a/test/cpp/qps/perf_db_client.h b/test/cpp/qps/perf_db_client.h index 7a9d86d3a69..3433cd88d12 100644 --- a/test/cpp/qps/perf_db_client.h +++ b/test/cpp/qps/perf_db_client.h @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include #include @@ -65,7 +65,7 @@ class PerfDbClient { client_user_time_ = DBL_MIN; } - void init(std::shared_ptr channel) { + void init(std::shared_ptr channel) { stub_ = PerfDbTransfer::NewStub(channel); } diff --git a/test/cpp/util/cli_call.cc b/test/cpp/util/cli_call.cc index ac88910a012..d0a300f5115 100644 --- a/test/cpp/util/cli_call.cc +++ b/test/cpp/util/cli_call.cc @@ -36,7 +36,7 @@ #include #include -#include +#include #include #include #include @@ -52,7 +52,7 @@ namespace { void* tag(int i) { return (void*)(gpr_intptr)i; } } // namespace -Status CliCall::Call(std::shared_ptr channel, +Status CliCall::Call(std::shared_ptr channel, const grpc::string& method, const grpc::string& request, grpc::string* response, const MetadataContainer& metadata, MetadataContainer* server_initial_metadata, diff --git a/test/cpp/util/cli_call.h b/test/cpp/util/cli_call.h index 8d114c9cb5e..46b5dd3e4f3 100644 --- a/test/cpp/util/cli_call.h +++ b/test/cpp/util/cli_call.h @@ -36,7 +36,7 @@ #include -#include +#include #include #include @@ -46,7 +46,7 @@ namespace testing { class CliCall GRPC_FINAL { public: typedef std::multimap MetadataContainer; - static Status Call(std::shared_ptr channel, + static Status Call(std::shared_ptr channel, const grpc::string& method, const grpc::string& request, grpc::string* response, const MetadataContainer& metadata, MetadataContainer* server_initial_metadata, diff --git a/test/cpp/util/cli_call_test.cc b/test/cpp/util/cli_call_test.cc index 848a3aee577..146e96720f3 100644 --- a/test/cpp/util/cli_call_test.cc +++ b/test/cpp/util/cli_call_test.cc @@ -35,7 +35,7 @@ #include "test/cpp/util/cli_call.h" #include "test/cpp/util/echo.grpc.pb.h" #include -#include +#include #include #include #include @@ -97,7 +97,7 @@ class CliCallTest : public ::testing::Test { stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel_)); } - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr stub_; std::unique_ptr server_; std::ostringstream server_address_; diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index dc48fa2d87f..43e719ef6b5 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -55,7 +55,7 @@ namespace grpc { // CreateTestChannel("test.google.com:443", "", true, true, creds); // same as above // CreateTestChannel("", "test.google.com:443", true, true, creds); -std::shared_ptr CreateTestChannel( +std::shared_ptr CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots, const std::shared_ptr& creds) { @@ -80,7 +80,7 @@ std::shared_ptr CreateTestChannel( } } -std::shared_ptr CreateTestChannel( +std::shared_ptr CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots) { return CreateTestChannel(server, override_hostname, enable_ssl, @@ -88,8 +88,8 @@ std::shared_ptr CreateTestChannel( } // Shortcut for end2end and interop tests. -std::shared_ptr CreateTestChannel(const grpc::string& server, - bool enable_ssl) { +std::shared_ptr CreateTestChannel(const grpc::string& server, + bool enable_ssl) { return CreateTestChannel(server, "foo.test.google.fr", enable_ssl, false); } diff --git a/test/cpp/util/create_test_channel.h b/test/cpp/util/create_test_channel.h index 5f2609ddd81..129cc746f9e 100644 --- a/test/cpp/util/create_test_channel.h +++ b/test/cpp/util/create_test_channel.h @@ -40,16 +40,16 @@ #include namespace grpc { -class ChannelInterface; +class Channel; -std::shared_ptr CreateTestChannel(const grpc::string& server, - bool enable_ssl); +std::shared_ptr CreateTestChannel(const grpc::string& server, + bool enable_ssl); -std::shared_ptr CreateTestChannel( +std::shared_ptr CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots); -std::shared_ptr CreateTestChannel( +std::shared_ptr CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots, const std::shared_ptr& creds); diff --git a/test/cpp/util/grpc_cli.cc b/test/cpp/util/grpc_cli.cc index 3c3baeb769d..15c56a352cb 100644 --- a/test/cpp/util/grpc_cli.cc +++ b/test/cpp/util/grpc_cli.cc @@ -67,7 +67,7 @@ #include "test/cpp/util/cli_call.h" #include "test/cpp/util/test_config.h" #include -#include +#include #include #include @@ -154,7 +154,7 @@ int main(int argc, char** argv) { creds = grpc::SslCredentials(grpc::SslCredentialsOptions()); } } - std::shared_ptr channel = + std::shared_ptr channel = grpc::CreateChannel(server_address, creds, grpc::ChannelArguments()); grpc::string response; diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 790e637b728..366fc9962c6 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -764,8 +764,8 @@ INPUT = include/grpc++/async_generic_service.h \ include/grpc++/async_unary_call.h \ include/grpc++/auth_context.h \ include/grpc++/byte_buffer.h \ +include/grpc++/channel.h \ include/grpc++/channel_arguments.h \ -include/grpc++/channel_interface.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ include/grpc++/config.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index cd1279e2a66..71370189105 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -764,8 +764,8 @@ INPUT = include/grpc++/async_generic_service.h \ include/grpc++/async_unary_call.h \ include/grpc++/auth_context.h \ include/grpc++/byte_buffer.h \ +include/grpc++/channel.h \ include/grpc++/channel_arguments.h \ -include/grpc++/channel_interface.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ include/grpc++/config.h \ @@ -804,7 +804,6 @@ include/grpc++/time.h \ src/cpp/client/secure_credentials.h \ src/cpp/common/secure_auth_context.h \ src/cpp/server/secure_server_credentials.h \ -src/cpp/client/channel.h \ src/cpp/common/create_auth_context.h \ src/cpp/client/secure_channel_arguments.cc \ src/cpp/client/secure_credentials.cc \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 72e6c41508f..20eeabd288b 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13105,8 +13105,8 @@ "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -13142,7 +13142,6 @@ "include/grpc++/stub_options.h", "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", - "src/cpp/client/channel.h", "src/cpp/client/secure_credentials.h", "src/cpp/common/create_auth_context.h", "src/cpp/common/secure_auth_context.h", @@ -13155,8 +13154,8 @@ "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -13193,7 +13192,6 @@ "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.cc", - "src/cpp/client/channel.h", "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", @@ -13279,8 +13277,8 @@ "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -13316,7 +13314,6 @@ "include/grpc++/stub_options.h", "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", - "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h" ], "language": "c++", @@ -13326,8 +13323,8 @@ "include/grpc++/async_unary_call.h", "include/grpc++/auth_context.h", "include/grpc++/byte_buffer.h", + "include/grpc++/channel.h", "include/grpc++/channel_arguments.h", - "include/grpc++/channel_interface.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", "include/grpc++/config.h", @@ -13364,7 +13361,6 @@ "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.cc", - "src/cpp/client/channel.h", "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index 929bc1500ea..8ce96cc0e22 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -217,8 +217,8 @@ + - @@ -259,7 +259,6 @@ - diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index 0408fb46a5c..924cbc4c730 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -108,10 +108,10 @@ include\grpc++ - + include\grpc++ - + include\grpc++ @@ -230,9 +230,6 @@ src\cpp\server - - src\cpp\client - src\cpp\common diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 2ff252e04e7..00667d38d73 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -217,8 +217,8 @@ + - @@ -256,7 +256,6 @@ - diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index b4fae7741ce..12d42f5e619 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -93,10 +93,10 @@ include\grpc++ - + include\grpc++ - + include\grpc++ @@ -206,9 +206,6 @@ - - src\cpp\client - src\cpp\common From fdc1dc744baa194f220a5d103ca73dde290c7d4b Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Wed, 19 Aug 2015 16:58:12 -0700 Subject: [PATCH 13/79] Move census_filters from .../channel to .../census --- BUILD | 12 ++++++------ Makefile | 4 ++-- build.json | 4 ++-- gRPC.podspec | 6 +++--- src/core/{channel => census}/census_filter.c | 2 +- src/core/{channel => census}/census_filter.h | 0 src/core/surface/channel_create.c | 2 +- src/core/surface/secure_channel_create.c | 2 +- src/core/surface/server.c | 2 +- tools/doxygen/Doxyfile.core.internal | 4 ++-- tools/run_tests/sources_and_headers.json | 12 ++++++------ vsprojects/grpc/grpc.vcxproj | 6 +++--- vsprojects/grpc/grpc.vcxproj.filters | 10 +++++----- vsprojects/grpc_unsecure/grpc_unsecure.vcxproj | 6 +++--- .../grpc_unsecure/grpc_unsecure.vcxproj.filters | 10 +++++----- 15 files changed, 41 insertions(+), 41 deletions(-) rename src/core/{channel => census}/census_filter.c (99%) rename src/core/{channel => census}/census_filter.h (100%) diff --git a/BUILD b/BUILD index d38b9cee104..b24ba311e29 100644 --- a/BUILD +++ b/BUILD @@ -145,7 +145,7 @@ cc_library( "src/core/tsi/ssl_transport_security.h", "src/core/tsi/transport_security.h", "src/core/tsi/transport_security_interface.h", - "src/core/channel/census_filter.h", + "src/core/census/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -267,8 +267,8 @@ cc_library( "src/core/tsi/fake_transport_security.c", "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", + "src/core/census/census_filter.c", "src/core/census/grpc_context.c", - "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -409,7 +409,7 @@ cc_library( cc_library( name = "grpc_unsecure", srcs = [ - "src/core/channel/census_filter.h", + "src/core/census/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -511,8 +511,8 @@ cc_library( "src/core/census/context.h", "src/core/census/rpc_stat_id.h", "src/core/surface/init_unsecure.c", + "src/core/census/census_filter.c", "src/core/census/grpc_context.c", - "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -997,8 +997,8 @@ objc_library( "src/core/tsi/fake_transport_security.c", "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", + "src/core/census/census_filter.c", "src/core/census/grpc_context.c", - "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -1137,7 +1137,7 @@ objc_library( "src/core/tsi/ssl_transport_security.h", "src/core/tsi/transport_security.h", "src/core/tsi/transport_security_interface.h", - "src/core/channel/census_filter.h", + "src/core/census/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", diff --git a/Makefile b/Makefile index aabf1bbd045..995a4954e45 100644 --- a/Makefile +++ b/Makefile @@ -3976,8 +3976,8 @@ LIBGRPC_SRC = \ src/core/tsi/fake_transport_security.c \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ + src/core/census/census_filter.c \ src/core/census/grpc_context.c \ - src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ @@ -4249,8 +4249,8 @@ endif LIBGRPC_UNSECURE_SRC = \ src/core/surface/init_unsecure.c \ + src/core/census/census_filter.c \ src/core/census/grpc_context.c \ - src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/build.json b/build.json index ab6a39a20ff..3e3e71a6849 100644 --- a/build.json +++ b/build.json @@ -114,7 +114,7 @@ "include/grpc/status.h" ], "headers": [ - "src/core/channel/census_filter.h", + "src/core/census/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -215,8 +215,8 @@ "src/core/transport/transport_impl.h" ], "src": [ + "src/core/census/census_filter.c", "src/core/census/grpc_context.c", - "src/core/channel/census_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", diff --git a/gRPC.podspec b/gRPC.podspec index d1e95a1652f..b57960a896f 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -147,7 +147,7 @@ Pod::Spec.new do |s| 'src/core/tsi/ssl_transport_security.h', 'src/core/tsi/transport_security.h', 'src/core/tsi/transport_security_interface.h', - 'src/core/channel/census_filter.h', + 'src/core/census/census_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/client_channel.h', @@ -276,8 +276,8 @@ Pod::Spec.new do |s| 'src/core/tsi/fake_transport_security.c', 'src/core/tsi/ssl_transport_security.c', 'src/core/tsi/transport_security.c', + 'src/core/census/census_filter.c', 'src/core/census/grpc_context.c', - 'src/core/channel/census_filter.c', 'src/core/channel/channel_args.c', 'src/core/channel/channel_stack.c', 'src/core/channel/client_channel.c', @@ -415,7 +415,7 @@ Pod::Spec.new do |s| 'src/core/tsi/ssl_transport_security.h', 'src/core/tsi/transport_security.h', 'src/core/tsi/transport_security_interface.h', - 'src/core/channel/census_filter.h', + 'src/core/census/census_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/client_channel.h', diff --git a/src/core/channel/census_filter.c b/src/core/census/census_filter.c similarity index 99% rename from src/core/channel/census_filter.c rename to src/core/census/census_filter.c index 53d70be356a..31db686cf37 100644 --- a/src/core/channel/census_filter.c +++ b/src/core/census/census_filter.c @@ -31,7 +31,7 @@ * */ -#include "src/core/channel/census_filter.h" +#include "src/core/census/census_filter.h" #include #include diff --git a/src/core/channel/census_filter.h b/src/core/census/census_filter.h similarity index 100% rename from src/core/channel/census_filter.h rename to src/core/census/census_filter.h diff --git a/src/core/surface/channel_create.c b/src/core/surface/channel_create.c index 4379b3d0169..4d01be3d7da 100644 --- a/src/core/surface/channel_create.c +++ b/src/core/surface/channel_create.c @@ -38,7 +38,7 @@ #include -#include "src/core/channel/census_filter.h" +#include "src/core/census/census_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index 93a372928fe..943bddfc0c3 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -38,7 +38,7 @@ #include -#include "src/core/channel/census_filter.h" +#include "src/core/census/census_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 27070836f35..22d399cf1f0 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -41,7 +41,7 @@ #include #include -#include "src/core/channel/census_filter.h" +#include "src/core/census/census_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/connected_channel.h" #include "src/core/iomgr/iomgr.h" diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 0619f76e277..f5d5dc0f80f 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -780,7 +780,7 @@ src/core/tsi/fake_transport_security.h \ src/core/tsi/ssl_transport_security.h \ src/core/tsi/transport_security.h \ src/core/tsi/transport_security_interface.h \ -src/core/channel/census_filter.h \ +src/core/census/census_filter.h \ src/core/channel/channel_args.h \ src/core/channel/channel_stack.h \ src/core/channel/client_channel.h \ @@ -902,8 +902,8 @@ src/core/surface/secure_channel_create.c \ src/core/tsi/fake_transport_security.c \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ +src/core/census/census_filter.c \ src/core/census/grpc_context.c \ -src/core/channel/census_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 38bf532f447..cc74397cea3 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -12222,9 +12222,9 @@ "include/grpc/grpc.h", "include/grpc/grpc_security.h", "include/grpc/status.h", + "src/core/census/census_filter.h", "src/core/census/context.h", "src/core/census/rpc_stat_id.h", - "src/core/channel/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -12347,14 +12347,14 @@ "include/grpc/grpc.h", "include/grpc/grpc_security.h", "include/grpc/status.h", + "src/core/census/census_filter.c", + "src/core/census/census_filter.h", "src/core/census/context.c", "src/core/census/context.h", "src/core/census/grpc_context.c", "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", - "src/core/channel/census_filter.c", - "src/core/channel/census_filter.h", "src/core/channel/channel_args.c", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.c", @@ -12694,9 +12694,9 @@ "include/grpc/compression.h", "include/grpc/grpc.h", "include/grpc/status.h", + "src/core/census/census_filter.h", "src/core/census/context.h", "src/core/census/rpc_stat_id.h", - "src/core/channel/census_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -12805,14 +12805,14 @@ "include/grpc/compression.h", "include/grpc/grpc.h", "include/grpc/status.h", + "src/core/census/census_filter.c", + "src/core/census/census_filter.h", "src/core/census/context.c", "src/core/census/context.h", "src/core/census/grpc_context.c", "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", - "src/core/channel/census_filter.c", - "src/core/channel/census_filter.h", "src/core/channel/channel_args.c", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.c", diff --git a/vsprojects/grpc/grpc.vcxproj b/vsprojects/grpc/grpc.vcxproj index a87ad29d495..950e385ee77 100644 --- a/vsprojects/grpc/grpc.vcxproj +++ b/vsprojects/grpc/grpc.vcxproj @@ -242,7 +242,7 @@ - + @@ -387,9 +387,9 @@ - + - + diff --git a/vsprojects/grpc/grpc.vcxproj.filters b/vsprojects/grpc/grpc.vcxproj.filters index c8812faa85c..d6ecdbba413 100644 --- a/vsprojects/grpc/grpc.vcxproj.filters +++ b/vsprojects/grpc/grpc.vcxproj.filters @@ -64,11 +64,11 @@ src\core\tsi - + src\core\census - - src\core\channel + + src\core\census src\core\channel @@ -482,8 +482,8 @@ src\core\tsi - - src\core\channel + + src\core\census src\core\channel diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj index 06da784323d..acd83c6080d 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj @@ -225,7 +225,7 @@ - + @@ -330,9 +330,9 @@ - + - + diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters index 2d10960a792..12da3fa1e33 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -4,11 +4,11 @@ src\core\surface - + src\core\census - - src\core\channel + + src\core\census src\core\channel @@ -380,8 +380,8 @@ - - src\core\channel + + src\core\census src\core\channel From ee3dbb00789b463119242ea74c6c7317b42bee48 Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Wed, 19 Aug 2015 22:17:03 -0700 Subject: [PATCH 14/79] Have a richer interface for auth metadata processors. --- include/grpc/grpc_security.h | 14 +++++++--- src/core/security/server_auth_filter.c | 28 +++++++++++++------ .../end2end/fixtures/chttp2_fake_security.c | 2 +- .../fixtures/chttp2_simple_ssl_fullstack.c | 2 +- .../chttp2_simple_ssl_fullstack_with_poll.c | 2 +- .../chttp2_simple_ssl_fullstack_with_proxy.c | 2 +- .../chttp2_simple_ssl_with_oauth2_fullstack.c | 4 +-- 7 files changed, 35 insertions(+), 19 deletions(-) diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h index 640c1fda986..7f8f4d4a053 100644 --- a/include/grpc/grpc_security.h +++ b/include/grpc/grpc_security.h @@ -275,12 +275,18 @@ int grpc_auth_context_set_peer_identity_property_name(grpc_auth_context *ctx, /* --- Auth Metadata Processing --- */ /* Callback function that is called when the metadata processing is done. - success is 1 if processing succeeded, 0 otherwise. - Consumed metadata will be removed from the set of metadata available on the - call. */ + - Consumed metadata will be removed from the set of metadata available on the + call. consumed_md may be NULL if no metadata has been consumed. + - Response metadata will be set on the response. response_md may be NULL. + - status is GRPC_STATUS_OK for success or a specific status for an error. + Common error status for auth metadata processing is either + GRPC_STATUS_UNAUTHENTICATED in case of an authentication failure or + GRPC_STATUS PERMISSION_DENIED in case of an authorization failure. + - error_details gives details about the error. May be NULL. */ typedef void (*grpc_process_auth_metadata_done_cb)( void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md, - int success); + const grpc_metadata *response_md, size_t num_response_md, + grpc_status_code status, const char *error_details); /* Pluggable server-side metadata processor object. */ typedef struct { diff --git a/src/core/security/server_auth_filter.c b/src/core/security/server_auth_filter.c index 2f42f01f53a..6e831431fa2 100644 --- a/src/core/security/server_auth_filter.c +++ b/src/core/security/server_auth_filter.c @@ -104,24 +104,34 @@ static grpc_mdelem *remove_consumed_md(void *user_data, grpc_mdelem *md) { return md; } -static void on_md_processing_done(void *user_data, - const grpc_metadata *consumed_md, - size_t num_consumed_md, int success) { +static void on_md_processing_done( + void *user_data, const grpc_metadata *consumed_md, size_t num_consumed_md, + const grpc_metadata *response_md, size_t num_response_md, + grpc_status_code status, const char *error_details) { grpc_call_element *elem = user_data; call_data *calld = elem->call_data; - if (success) { + /* TODO(jboeuf): Implement support for response_md. */ + if (response_md != NULL && num_response_md > 0) { + gpr_log(GPR_INFO, + "response_md in auth metadata processing not supported for now. " + "Ignoring..."); + } + + if (status == GRPC_STATUS_OK) { calld->consumed_md = consumed_md; calld->num_consumed_md = num_consumed_md; grpc_metadata_batch_filter(&calld->md_op->data.metadata, remove_consumed_md, elem); - calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success); + calld->on_done_recv->cb(calld->on_done_recv->cb_arg, 1); } else { - gpr_slice message = gpr_slice_from_copied_string( - "Authentication metadata processing failed."); + gpr_slice message; + error_details = error_details != NULL + ? error_details + : "Authentication metadata processing failed."; + message = gpr_slice_from_copied_string(error_details); grpc_sopb_reset(calld->recv_ops); - grpc_transport_stream_op_add_close(&calld->transport_op, - GRPC_STATUS_UNAUTHENTICATED, &message); + grpc_transport_stream_op_add_close(&calld->transport_op, status, &message); grpc_call_next_op(elem, &calld->transport_op); } } diff --git a/test/core/end2end/fixtures/chttp2_fake_security.c b/test/core/end2end/fixtures/chttp2_fake_security.c index 27531ecbc3b..a0a67939a21 100644 --- a/test/core/end2end/fixtures/chttp2_fake_security.c +++ b/test/core/end2end/fixtures/chttp2_fake_security.c @@ -70,7 +70,7 @@ static void process_auth_failure(void *state, grpc_auth_context *ctx, grpc_process_auth_metadata_done_cb cb, void *user_data) { GPR_ASSERT(state == NULL); - cb(user_data, NULL, 0, 0); + cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL); } static void chttp2_init_client_secure_fullstack(grpc_end2end_test_fixture *f, diff --git a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.c b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.c index 491a293764c..beae24136cd 100644 --- a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.c +++ b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack.c @@ -73,7 +73,7 @@ static void process_auth_failure(void *state, grpc_auth_context *ctx, grpc_process_auth_metadata_done_cb cb, void *user_data) { GPR_ASSERT(state == NULL); - cb(user_data, NULL, 0, 0); + cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL); } static void chttp2_init_client_secure_fullstack(grpc_end2end_test_fixture *f, diff --git a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_poll.c b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_poll.c index f2736cc92f9..c8971be5966 100644 --- a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_poll.c +++ b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_poll.c @@ -73,7 +73,7 @@ static void process_auth_failure(void *state, grpc_auth_context *ctx, grpc_process_auth_metadata_done_cb cb, void *user_data) { GPR_ASSERT(state == NULL); - cb(user_data, NULL, 0, 0); + cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL); } static void chttp2_init_client_secure_fullstack(grpc_end2end_test_fixture *f, diff --git a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_proxy.c b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_proxy.c index cc0b9dbbdd5..a518a7da15b 100644 --- a/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_proxy.c +++ b/test/core/end2end/fixtures/chttp2_simple_ssl_fullstack_with_proxy.c @@ -101,7 +101,7 @@ static void process_auth_failure(void *state, grpc_auth_context *ctx, grpc_process_auth_metadata_done_cb cb, void *user_data) { GPR_ASSERT(state == NULL); - cb(user_data, NULL, 0, 0); + cb(user_data, NULL, 0, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL); } static void chttp2_init_client_secure_fullstack(grpc_end2end_test_fixture *f, diff --git a/test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.c b/test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.c index d82e623f222..7f11028cb5a 100644 --- a/test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.c +++ b/test/core/end2end/fixtures/chttp2_simple_ssl_with_oauth2_fullstack.c @@ -79,7 +79,7 @@ static void process_oauth2_success(void *state, grpc_auth_context *ctx, client_identity); GPR_ASSERT(grpc_auth_context_set_peer_identity_property_name( ctx, client_identity_property_name) == 1); - cb(user_data, oauth2, 1, 1); + cb(user_data, oauth2, 1, NULL, 0, GRPC_STATUS_OK, NULL); } static void process_oauth2_failure(void *state, grpc_auth_context *ctx, @@ -90,7 +90,7 @@ static void process_oauth2_failure(void *state, grpc_auth_context *ctx, find_metadata(md, md_count, "Authorization", oauth2_md); GPR_ASSERT(state == NULL); GPR_ASSERT(oauth2 != NULL); - cb(user_data, oauth2, 1, 0); + cb(user_data, oauth2, 1, NULL, 0, GRPC_STATUS_UNAUTHENTICATED, NULL); } static grpc_end2end_test_fixture chttp2_create_fixture_secure_fullstack( From 2670086806aace424d954be11123f3a5f9ef2115 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Thu, 20 Aug 2015 10:27:39 -0700 Subject: [PATCH 15/79] Assert http2 header ordering --- src/core/transport/chttp2/stream_encoder.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index 0f04169741a..e9acf2b916d 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -66,6 +66,7 @@ typedef struct { size_t header_idx; /* was the last frame emitted a header? (if yes, we'll need a CONTINUATION */ gpr_uint8 last_was_header; + gpr_uint8 seen_regular_header; /* output stream id */ gpr_uint32 stream_id; gpr_slice_buffer *output; @@ -361,6 +362,16 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c, gpr_uint32 indices_key; int should_add_elem; + if (GPR_SLICE_LENGTH(elem->key->slice) > 0) { + if (GPR_SLICE_START_PTR(elem->key->slice)[0] != ':') { /* regular header */ + st->seen_regular_header = 1; + } else if (st->seen_regular_header != 0) { /* reserved header */ + gpr_log(GPR_ERROR, + "Reserved header (colon-prefixed) happening after regular ones."); + abort(); + } + } + inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum, c->filter_elems); /* is this elem currently in the decoders table? */ @@ -566,6 +577,7 @@ void grpc_chttp2_encode(grpc_stream_op *ops, size_t ops_count, int eof, st.cur_frame_type = NONE; st.last_was_header = 0; + st.seen_regular_header = 0; st.stream_id = stream_id; st.output = output; From 5bb30c764b91e54da27f4de0fcf258b320486c8c Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Thu, 20 Aug 2015 10:34:37 -0700 Subject: [PATCH 16/79] if to assert --- src/core/transport/chttp2/stream_encoder.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index e9acf2b916d..c6780e61566 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -362,14 +362,13 @@ static grpc_mdelem *hpack_enc(grpc_chttp2_hpack_compressor *c, gpr_uint32 indices_key; int should_add_elem; - if (GPR_SLICE_LENGTH(elem->key->slice) > 0) { - if (GPR_SLICE_START_PTR(elem->key->slice)[0] != ':') { /* regular header */ - st->seen_regular_header = 1; - } else if (st->seen_regular_header != 0) { /* reserved header */ - gpr_log(GPR_ERROR, - "Reserved header (colon-prefixed) happening after regular ones."); - abort(); - } + GPR_ASSERT (GPR_SLICE_LENGTH(elem->key->slice) > 0); + if (GPR_SLICE_START_PTR(elem->key->slice)[0] != ':') { /* regular header */ + st->seen_regular_header = 1; + } else if (st->seen_regular_header != 0) { /* reserved header */ + gpr_log(GPR_ERROR, + "Reserved header (colon-prefixed) happening after regular ones."); + abort(); } inc_filter(HASH_FRAGMENT_1(elem_hash), &c->filter_elems_sum, c->filter_elems); From a14ce859a6845dc787bb165f65fe9ebb6074b2ff Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Thu, 20 Aug 2015 10:36:24 -0700 Subject: [PATCH 17/79] comment --- src/core/transport/chttp2/stream_encoder.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c index c6780e61566..1ea697f71ed 100644 --- a/src/core/transport/chttp2/stream_encoder.c +++ b/src/core/transport/chttp2/stream_encoder.c @@ -66,6 +66,7 @@ typedef struct { size_t header_idx; /* was the last frame emitted a header? (if yes, we'll need a CONTINUATION */ gpr_uint8 last_was_header; + /* have we seen a regular (non-colon-prefixed) header yet? */ gpr_uint8 seen_regular_header; /* output stream id */ gpr_uint32 stream_id; From 431f8c2b5feecf202c484f6d0d1d7a0cf6f4be73 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 10:59:29 -0700 Subject: [PATCH 18/79] make registermethod private --- include/grpc++/channel.h | 5 ++--- include/grpc++/impl/rpc_method.h | 11 +++++++++-- src/compiler/cpp_generator.cc | 13 ++++++------- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/include/grpc++/channel.h b/include/grpc++/channel.h index a4cef1b4d90..ceb921eff8e 100644 --- a/include/grpc++/channel.h +++ b/include/grpc++/channel.h @@ -94,9 +94,6 @@ class Channel GRPC_FINAL : public GrpcLibrary, return WaitForStateChangeImpl(last_observed, deadline_tp.raw_time()); } - // Used by Stub only in generated code. - void* RegisterMethod(const char* method); - private: template friend class ::grpc::ClientReader; @@ -117,10 +114,12 @@ class Channel GRPC_FINAL : public GrpcLibrary, ClientContext* context, const InputMessage& request, OutputMessage* result); + friend class ::grpc::RpcMethod; Call CreateCall(const RpcMethod& method, ClientContext* context, CompletionQueue* cq); void PerformOpsOnCall(CallOpSetInterface* ops, Call* call); + void* RegisterMethod(const char* method); void NotifyOnStateChangeImpl(grpc_connectivity_state last_observed, gpr_timespec deadline, CompletionQueue* cq, diff --git a/include/grpc++/impl/rpc_method.h b/include/grpc++/impl/rpc_method.h index 50a160b08c7..912ffab21f5 100644 --- a/include/grpc++/impl/rpc_method.h +++ b/include/grpc++/impl/rpc_method.h @@ -34,6 +34,10 @@ #ifndef GRPCXX_IMPL_RPC_METHOD_H #define GRPCXX_IMPL_RPC_METHOD_H +#include + +#include + namespace grpc { class RpcMethod { @@ -45,8 +49,11 @@ class RpcMethod { BIDI_STREAMING }; - RpcMethod(const char* name, RpcType type, void* channel_tag) - : name_(name), method_type_(type), channel_tag_(channel_tag) {} + RpcMethod(const char* name, RpcType type, + const std::shared_ptr& channel) + : name_(name), + method_type_(type), + channel_tag_(channel->RegisterMethod(name)) {} const char* name() const { return name_; } RpcType method_type() const { return method_type_; } diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 731ba58fb1f..d0229d702d6 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -989,13 +989,12 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer, } else { (*vars)["StreamingType"] = "BIDI_STREAMING"; } - printer->Print( - *vars, - ", rpcmethod_$Method$_(" - "$prefix$$Service$_method_names[$Idx$], " - "::grpc::RpcMethod::$StreamingType$, " - "channel->RegisterMethod($prefix$$Service$_method_names[$Idx$])" - ")\n"); + printer->Print(*vars, + ", rpcmethod_$Method$_(" + "$prefix$$Service$_method_names[$Idx$], " + "::grpc::RpcMethod::$StreamingType$, " + "channel" + ")\n"); } printer->Print("{}\n\n"); printer->Outdent(); From c2bd8a6d1a957276875ebecc72498d36daa12833 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 11:40:12 -0700 Subject: [PATCH 19/79] Fix server side and generic stub --- include/grpc++/impl/rpc_method.h | 3 +++ include/grpc++/impl/rpc_service_method.h | 2 +- src/cpp/client/generic_stub.cc | 3 +-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/include/grpc++/impl/rpc_method.h b/include/grpc++/impl/rpc_method.h index 912ffab21f5..98002680626 100644 --- a/include/grpc++/impl/rpc_method.h +++ b/include/grpc++/impl/rpc_method.h @@ -49,6 +49,9 @@ class RpcMethod { BIDI_STREAMING }; + RpcMethod(const char* name, RpcType type) + : name_(name), method_type_(type), channel_tag_(NULL) {} + RpcMethod(const char* name, RpcType type, const std::shared_ptr& channel) : name_(name), diff --git a/include/grpc++/impl/rpc_service_method.h b/include/grpc++/impl/rpc_service_method.h index 925801e1cee..078c8c491a9 100644 --- a/include/grpc++/impl/rpc_service_method.h +++ b/include/grpc++/impl/rpc_service_method.h @@ -229,7 +229,7 @@ class RpcServiceMethod : public RpcMethod { // Takes ownership of the handler RpcServiceMethod(const char* name, RpcMethod::RpcType type, MethodHandler* handler) - : RpcMethod(name, type, nullptr), handler_(handler) {} + : RpcMethod(name, type), handler_(handler) {} MethodHandler* handler() { return handler_.get(); } diff --git a/src/cpp/client/generic_stub.cc b/src/cpp/client/generic_stub.cc index 0c90578ae52..ee89c029651 100644 --- a/src/cpp/client/generic_stub.cc +++ b/src/cpp/client/generic_stub.cc @@ -44,8 +44,7 @@ std::unique_ptr GenericStub::Call( return std::unique_ptr( new GenericClientAsyncReaderWriter( channel_.get(), cq, - RpcMethod(method.c_str(), RpcMethod::BIDI_STREAMING, nullptr), - context, tag)); + RpcMethod(method.c_str(), RpcMethod::BIDI_STREAMING), context, tag)); } } // namespace grpc From ef00308e391094212b5ba6aad0c6f7b90025f4e3 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 11:40:51 -0700 Subject: [PATCH 20/79] remove internal_stub --- BUILD | 4 -- Makefile | 4 -- build.json | 2 - include/grpc++/impl/internal_stub.h | 56 ------------------- src/compiler/cpp_generator.cc | 24 ++++---- src/cpp/client/internal_stub.cc | 36 ------------ tools/doxygen/Doxyfile.c++ | 1 - tools/doxygen/Doxyfile.c++.internal | 2 - tools/run_tests/sources_and_headers.json | 6 -- vsprojects/grpc++/grpc++.vcxproj | 3 - vsprojects/grpc++/grpc++.vcxproj.filters | 6 -- .../grpc++_unsecure/grpc++_unsecure.vcxproj | 3 - .../grpc++_unsecure.vcxproj.filters | 6 -- 13 files changed, 12 insertions(+), 141 deletions(-) delete mode 100644 include/grpc++/impl/internal_stub.h delete mode 100644 src/cpp/client/internal_stub.cc diff --git a/BUILD b/BUILD index adcc4cb4135..514b6621011 100644 --- a/BUILD +++ b/BUILD @@ -689,7 +689,6 @@ cc_library( "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", - "src/cpp/client/internal_stub.cc", "src/cpp/common/call.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/rpc_method.cc", @@ -727,7 +726,6 @@ cc_library( "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -775,7 +773,6 @@ cc_library( "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", - "src/cpp/client/internal_stub.cc", "src/cpp/common/call.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/rpc_method.cc", @@ -813,7 +810,6 @@ cc_library( "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", diff --git a/Makefile b/Makefile index dba1a0457eb..ce6406112ea 100644 --- a/Makefile +++ b/Makefile @@ -4606,7 +4606,6 @@ LIBGRPC++_SRC = \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ - src/cpp/client/internal_stub.cc \ src/cpp/common/call.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ @@ -4644,7 +4643,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ - include/grpc++/impl/internal_stub.h \ include/grpc++/impl/proto_utils.h \ include/grpc++/impl/rpc_method.h \ include/grpc++/impl/rpc_service_method.h \ @@ -4849,7 +4847,6 @@ LIBGRPC++_UNSECURE_SRC = \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ - src/cpp/client/internal_stub.cc \ src/cpp/common/call.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ @@ -4887,7 +4884,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ - include/grpc++/impl/internal_stub.h \ include/grpc++/impl/proto_utils.h \ include/grpc++/impl/rpc_method.h \ include/grpc++/impl/rpc_service_method.h \ diff --git a/build.json b/build.json index 553e98db4b3..d49b953d8aa 100644 --- a/build.json +++ b/build.json @@ -48,7 +48,6 @@ "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -83,7 +82,6 @@ "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", - "src/cpp/client/internal_stub.cc", "src/cpp/common/call.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/rpc_method.cc", diff --git a/include/grpc++/impl/internal_stub.h b/include/grpc++/impl/internal_stub.h deleted file mode 100644 index 60eb3fdd069..00000000000 --- a/include/grpc++/impl/internal_stub.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * - * Copyright 2015, 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. - * - */ - -#ifndef GRPCXX_IMPL_INTERNAL_STUB_H -#define GRPCXX_IMPL_INTERNAL_STUB_H - -#include - -#include - -namespace grpc { - -class InternalStub { - public: - InternalStub(const std::shared_ptr& channel) : channel_(channel) {} - virtual ~InternalStub() {} - - Channel* channel() { return channel_.get(); } - - private: - const std::shared_ptr channel_; -}; - -} // namespace grpc - -#endif // GRPCXX_IMPL_INTERNAL_STUB_H diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index d0229d702d6..b04ac038ad2 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -112,7 +112,6 @@ grpc::string GetHeaderPrologue(const grpc::protobuf::FileDescriptor *file, grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file, const Parameters ¶ms) { grpc::string temp = - "#include \n" "#include \n" "#include \n" "#include \n" @@ -554,8 +553,8 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer, printer->Outdent(); printer->Print("};\n"); printer->Print( - "class Stub GRPC_FINAL : public StubInterface," - " public ::grpc::InternalStub {\n public:\n"); + "class Stub GRPC_FINAL : public StubInterface" + " {\n public:\n"); printer->Indent(); printer->Print("Stub(const std::shared_ptr< ::grpc::Channel>& channel);\n"); for (int i = 0; i < service->method_count(); ++i) { @@ -564,6 +563,7 @@ void PrintHeaderService(grpc::protobuf::io::Printer *printer, printer->Outdent(); printer->Print("\n private:\n"); printer->Indent(); + printer->Print("std::shared_ptr< ::grpc::Channel> channel_;\n"); for (int i = 0; i < service->method_count(); ++i) { PrintHeaderClientMethod(printer, service->method(i), vars, false); } @@ -737,7 +737,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, "::grpc::ClientContext* context, " "const $Request$& request, $Response$* response) {\n"); printer->Print(*vars, - " return ::grpc::BlockingUnaryCall(channel(), " + " return ::grpc::BlockingUnaryCall(channel_.get(), " "rpcmethod_$Method$_, " "context, request, response);\n" "}\n\n"); @@ -750,7 +750,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, printer->Print(*vars, " return new " "::grpc::ClientAsyncResponseReader< $Response$>(" - "channel(), cq, " + "channel_.get(), cq, " "rpcmethod_$Method$_, " "context, request);\n" "}\n\n"); @@ -761,7 +761,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, "::grpc::ClientContext* context, $Response$* response) {\n"); printer->Print(*vars, " return new ::grpc::ClientWriter< $Request$>(" - "channel(), " + "channel_.get(), " "rpcmethod_$Method$_, " "context, response);\n" "}\n\n"); @@ -772,7 +772,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, "::grpc::CompletionQueue* cq, void* tag) {\n"); printer->Print(*vars, " return new ::grpc::ClientAsyncWriter< $Request$>(" - "channel(), cq, " + "channel_.get(), cq, " "rpcmethod_$Method$_, " "context, response, tag);\n" "}\n\n"); @@ -784,7 +784,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, "::grpc::ClientContext* context, const $Request$& request) {\n"); printer->Print(*vars, " return new ::grpc::ClientReader< $Response$>(" - "channel(), " + "channel_.get(), " "rpcmethod_$Method$_, " "context, request);\n" "}\n\n"); @@ -795,7 +795,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, "::grpc::CompletionQueue* cq, void* tag) {\n"); printer->Print(*vars, " return new ::grpc::ClientAsyncReader< $Response$>(" - "channel(), cq, " + "channel_.get(), cq, " "rpcmethod_$Method$_, " "context, request, tag);\n" "}\n\n"); @@ -807,7 +807,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, printer->Print(*vars, " return new ::grpc::ClientReaderWriter< " "$Request$, $Response$>(" - "channel(), " + "channel_.get(), " "rpcmethod_$Method$_, " "context);\n" "}\n\n"); @@ -819,7 +819,7 @@ void PrintSourceClientMethod(grpc::protobuf::io::Printer *printer, printer->Print(*vars, " return new " "::grpc::ClientAsyncReaderWriter< $Request$, $Response$>(" - "channel(), cq, " + "channel_.get(), cq, " "rpcmethod_$Method$_, " "context, tag);\n" "}\n\n"); @@ -975,7 +975,7 @@ void PrintSourceService(grpc::protobuf::io::Printer *printer, "$ns$$Service$::Stub::Stub(const std::shared_ptr< " "::grpc::Channel>& channel)\n"); printer->Indent(); - printer->Print(": ::grpc::InternalStub(channel)"); + printer->Print(": channel_(channel)"); for (int i = 0; i < service->method_count(); ++i) { const grpc::protobuf::MethodDescriptor *method = service->method(i); (*vars)["Method"] = method->name(); diff --git a/src/cpp/client/internal_stub.cc b/src/cpp/client/internal_stub.cc deleted file mode 100644 index 91724a4837a..00000000000 --- a/src/cpp/client/internal_stub.cc +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * Copyright 2015, 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 - -namespace grpc {} // namespace grpc diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 366fc9962c6..8daeb134f73 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -778,7 +778,6 @@ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ -include/grpc++/impl/internal_stub.h \ include/grpc++/impl/proto_utils.h \ include/grpc++/impl/rpc_method.h \ include/grpc++/impl/rpc_service_method.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 71370189105..b8f04cbcd38 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -778,7 +778,6 @@ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ -include/grpc++/impl/internal_stub.h \ include/grpc++/impl/proto_utils.h \ include/grpc++/impl/rpc_method.h \ include/grpc++/impl/rpc_service_method.h \ @@ -818,7 +817,6 @@ src/cpp/client/create_channel.cc \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ -src/cpp/client/internal_stub.cc \ src/cpp/common/call.cc \ src/cpp/common/completion_queue.cc \ src/cpp/common/rpc_method.cc \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 20eeabd288b..5c515d1ba47 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13119,7 +13119,6 @@ "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -13168,7 +13167,6 @@ "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -13198,7 +13196,6 @@ "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", - "src/cpp/client/internal_stub.cc", "src/cpp/client/secure_channel_arguments.cc", "src/cpp/client/secure_credentials.cc", "src/cpp/client/secure_credentials.h", @@ -13291,7 +13288,6 @@ "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -13337,7 +13333,6 @@ "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", - "include/grpc++/impl/internal_stub.h", "include/grpc++/impl/proto_utils.h", "include/grpc++/impl/rpc_method.h", "include/grpc++/impl/rpc_service_method.h", @@ -13367,7 +13362,6 @@ "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", - "src/cpp/client/internal_stub.cc", "src/cpp/common/call.cc", "src/cpp/common/completion_queue.cc", "src/cpp/common/create_auth_context.h", diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index 8ce96cc0e22..dbbb7c12cdd 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -231,7 +231,6 @@ - @@ -288,8 +287,6 @@ - - diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index 924cbc4c730..7c982e910ac 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -40,9 +40,6 @@ src\cpp\client - - src\cpp\client - src\cpp\common @@ -150,9 +147,6 @@ include\grpc++\impl - - include\grpc++\impl - include\grpc++\impl diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 00667d38d73..98d15cd98dc 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -231,7 +231,6 @@ - @@ -275,8 +274,6 @@ - - diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index 12d42f5e619..99734c8953f 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -25,9 +25,6 @@ src\cpp\client - - src\cpp\client - src\cpp\common @@ -135,9 +132,6 @@ include\grpc++\impl - - include\grpc++\impl - include\grpc++\impl From 2bfd275b2b50b6202840d51e87357c7c2f8854f2 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Thu, 20 Aug 2015 11:42:29 -0700 Subject: [PATCH 21/79] sockaddr_resolver now supports comma-separated list of IPs --- .../resolvers/sockaddr_resolver.c | 59 +++++++++++++++---- test/core/end2end/dualstack_socket_test.c | 36 +++++++++-- 2 files changed, 80 insertions(+), 15 deletions(-) diff --git a/src/core/client_config/resolvers/sockaddr_resolver.c b/src/core/client_config/resolvers/sockaddr_resolver.c index 74584e7e2c6..84198739081 100644 --- a/src/core/client_config/resolvers/sockaddr_resolver.c +++ b/src/core/client_config/resolvers/sockaddr_resolver.c @@ -60,9 +60,12 @@ typedef struct { grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels, size_t num_subchannels); - /** the address that we've 'resolved' */ - struct sockaddr_storage addr; - int addr_len; + /** the addresses that we've 'resolved' */ + struct sockaddr_storage *addrs; + /** the corresponding length of the addresses */ + int *addrs_len; + /** how many elements in \a addrs */ + size_t num_addrs; /** mutex guarding the rest of the state */ gpr_mu mu; @@ -119,17 +122,22 @@ static void sockaddr_next(grpc_resolver *resolver, static void sockaddr_maybe_finish_next_locked(sockaddr_resolver *r) { grpc_client_config *cfg; grpc_lb_policy *lb_policy; - grpc_subchannel *subchannel; + grpc_subchannel **subchannels; grpc_subchannel_args args; if (r->next_completion != NULL && !r->published) { + size_t i; cfg = grpc_client_config_create(); - memset(&args, 0, sizeof(args)); - args.addr = (struct sockaddr *)&r->addr; - args.addr_len = r->addr_len; - subchannel = - grpc_subchannel_factory_create_subchannel(r->subchannel_factory, &args); - lb_policy = r->lb_policy_factory(&subchannel, 1); + subchannels = gpr_malloc(sizeof(grpc_subchannel *) * r->num_addrs); + for (i = 0; i < r->num_addrs; i++) { + memset(&args, 0, sizeof(args)); + args.addr = (struct sockaddr *)&r->addrs[i]; + args.addr_len = r->addrs_len[i]; + subchannels[i] = grpc_subchannel_factory_create_subchannel( + r->subchannel_factory, &args); + } + lb_policy = r->lb_policy_factory(subchannels, r->num_addrs); + gpr_free(subchannels); grpc_client_config_set_lb_policy(cfg, lb_policy); GRPC_LB_POLICY_UNREF(lb_policy, "unix"); r->published = 1; @@ -143,6 +151,8 @@ static void sockaddr_destroy(grpc_resolver *gr) { sockaddr_resolver *r = (sockaddr_resolver *)gr; gpr_mu_destroy(&r->mu); grpc_subchannel_factory_unref(r->subchannel_factory); + gpr_free(r->addrs); + gpr_free(r->addrs_len); gpr_free(r); } @@ -238,13 +248,18 @@ done: return result; } +static void do_nothing(void *ignored) {} static grpc_resolver *sockaddr_create( grpc_uri *uri, grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels, size_t num_subchannels), grpc_subchannel_factory *subchannel_factory, int parse(grpc_uri *uri, struct sockaddr_storage *dst, int *len)) { + size_t i; + int errors_found = 0; /* GPR_FALSE */ sockaddr_resolver *r; + gpr_slice path_slice; + gpr_slice_buffer path_parts; if (0 != strcmp(uri->authority, "")) { gpr_log(GPR_ERROR, "authority based uri's not supported"); @@ -253,7 +268,29 @@ static grpc_resolver *sockaddr_create( r = gpr_malloc(sizeof(sockaddr_resolver)); memset(r, 0, sizeof(*r)); - if (!parse(uri, &r->addr, &r->addr_len)) { + + path_slice = gpr_slice_new(uri->path, strlen(uri->path), do_nothing); + gpr_slice_buffer_init(&path_parts); + + gpr_slice_split(path_slice, ",", &path_parts); + r->num_addrs = path_parts.count; + r->addrs = gpr_malloc(sizeof(struct sockaddr_storage) * r->num_addrs); + r->addrs_len = gpr_malloc(sizeof(int) * r->num_addrs); + + for(i = 0; i < r->num_addrs; i++) { + grpc_uri ith_uri = *uri; + char* part_str = gpr_dump_slice(path_parts.slices[i], GPR_DUMP_ASCII); + ith_uri.path = part_str; + if (!parse(&ith_uri, &r->addrs[i], &r->addrs_len[i])) { + errors_found = 1; /* GPR_TRUE */ + } + gpr_free(part_str); + if (errors_found) break; + } + + gpr_slice_buffer_destroy(&path_parts); + gpr_slice_unref(path_slice); + if (errors_found) { gpr_free(r); return NULL; } diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c index 1f64062bf7c..fcc12952bf9 100644 --- a/test/core/end2end/dualstack_socket_test.c +++ b/test/core/end2end/dualstack_socket_test.c @@ -32,12 +32,16 @@ */ #include -#include "src/core/iomgr/socket_utils_posix.h" + #include #include #include #include #include + +#include "src/core/support/string.h" +#include "src/core/iomgr/socket_utils_posix.h" + #include "test/core/end2end/cq_verifier.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" @@ -57,6 +61,7 @@ static void drain_cq(grpc_completion_queue *cq) { } while (ev.type != GRPC_QUEUE_SHUTDOWN); } +static void do_nothing(void *ignored) {} void test_connect(const char *server_host, const char *client_host, int port, int expect_ok) { char *client_hostport; @@ -109,8 +114,30 @@ void test_connect(const char *server_host, const char *client_host, int port, /* Create client. */ if (client_host[0] == 'i') { - /* for ipv4:/ipv6: addresses, just concatenate the port */ - gpr_asprintf(&client_hostport, "%s:%d", client_host, port); + /* for ipv4:/ipv6: addresses, concatenate the port to each of the parts */ + size_t i; + gpr_slice uri_slice; + gpr_slice_buffer uri_parts; + char **hosts_with_port; + + uri_slice = + gpr_slice_new((char *)client_host, strlen(client_host), do_nothing); + gpr_slice_buffer_init(&uri_parts); + gpr_slice_split(uri_slice, ",", &uri_parts); + hosts_with_port = gpr_malloc(sizeof(char*) * uri_parts.count); + for (i = 0; i < uri_parts.count; i++) { + char *uri_part_str = gpr_dump_slice(uri_parts.slices[i], GPR_DUMP_ASCII); + gpr_asprintf(&hosts_with_port[i], "%s:%d", uri_part_str, port); + gpr_free(uri_part_str); + } + client_hostport = gpr_strjoin_sep((const char **)hosts_with_port, + uri_parts.count, ",", NULL); + for (i = 0; i < uri_parts.count; i++) { + gpr_free(hosts_with_port[i]); + } + gpr_free(hosts_with_port); + gpr_slice_buffer_destroy(&uri_parts); + gpr_slice_unref(uri_slice); } else { gpr_join_host_port(&client_hostport, client_host, port); } @@ -260,7 +287,8 @@ int main(int argc, char **argv) { test_connect("0.0.0.0", "127.0.0.1", 0, 1); test_connect("0.0.0.0", "::ffff:127.0.0.1", 0, 1); test_connect("0.0.0.0", "ipv4:127.0.0.1", 0, 1); - test_connect("0.0.0.0", "ipv6:[::ffff:127.0.0.1]", 0, 1); + test_connect("0.0.0.0", "ipv4:127.0.0.1,127.0.0.2,127.0.0.3", 0, 1); + test_connect("0.0.0.0", "ipv6:[::ffff:127.0.0.1],[::ffff:127.0.0.2]", 0, 1); test_connect("0.0.0.0", "localhost", 0, 1); if (do_ipv6) { test_connect("::", "::1", 0, 1); From c317f07b5668d6e081a54ad9f6636555f35e0994 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 12:18:08 -0700 Subject: [PATCH 22/79] Make Channel ctor private --- BUILD | 4 ++ Makefile | 2 + build.json | 2 + include/grpc++/channel.h | 6 ++- src/cpp/client/channel.cc | 2 - src/cpp/client/create_channel.cc | 12 +++-- src/cpp/client/create_channel_internal.cc | 46 +++++++++++++++++ src/cpp/client/create_channel_internal.h | 51 +++++++++++++++++++ src/cpp/client/insecure_credentials.cc | 6 ++- src/cpp/client/secure_credentials.cc | 6 +-- tools/doxygen/Doxyfile.c++.internal | 2 + tools/run_tests/sources_and_headers.json | 6 +++ vsprojects/grpc++/grpc++.vcxproj | 3 ++ vsprojects/grpc++/grpc++.vcxproj.filters | 6 +++ .../grpc++_unsecure/grpc++_unsecure.vcxproj | 3 ++ .../grpc++_unsecure.vcxproj.filters | 6 +++ 16 files changed, 149 insertions(+), 14 deletions(-) create mode 100644 src/cpp/client/create_channel_internal.cc create mode 100644 src/cpp/client/create_channel_internal.h diff --git a/BUILD b/BUILD index 514b6621011..d712053a3d4 100644 --- a/BUILD +++ b/BUILD @@ -675,6 +675,7 @@ cc_library( "src/cpp/client/secure_credentials.h", "src/cpp/common/secure_auth_context.h", "src/cpp/server/secure_server_credentials.h", + "src/cpp/client/create_channel_internal.h", "src/cpp/common/create_auth_context.h", "src/cpp/client/secure_channel_arguments.cc", "src/cpp/client/secure_credentials.cc", @@ -686,6 +687,7 @@ cc_library( "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", @@ -764,12 +766,14 @@ cc_library( cc_library( name = "grpc++_unsecure", srcs = [ + "src/cpp/client/create_channel_internal.h", "src/cpp/common/create_auth_context.h", "src/cpp/common/insecure_create_auth_context.cc", "src/cpp/client/channel.cc", "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", diff --git a/Makefile b/Makefile index ce6406112ea..c74c720b7bf 100644 --- a/Makefile +++ b/Makefile @@ -4603,6 +4603,7 @@ LIBGRPC++_SRC = \ src/cpp/client/channel_arguments.cc \ src/cpp/client/client_context.cc \ src/cpp/client/create_channel.cc \ + src/cpp/client/create_channel_internal.cc \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ @@ -4844,6 +4845,7 @@ LIBGRPC++_UNSECURE_SRC = \ src/cpp/client/channel_arguments.cc \ src/cpp/client/client_context.cc \ src/cpp/client/create_channel.cc \ + src/cpp/client/create_channel_internal.cc \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ diff --git a/build.json b/build.json index d49b953d8aa..64558a60282 100644 --- a/build.json +++ b/build.json @@ -72,6 +72,7 @@ "include/grpc++/time.h" ], "headers": [ + "src/cpp/client/create_channel_internal.h", "src/cpp/common/create_auth_context.h" ], "src": [ @@ -79,6 +80,7 @@ "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", diff --git a/include/grpc++/channel.h b/include/grpc++/channel.h index ceb921eff8e..7d6216e9c49 100644 --- a/include/grpc++/channel.h +++ b/include/grpc++/channel.h @@ -69,8 +69,6 @@ class Channel GRPC_FINAL : public GrpcLibrary, public CallHook, public std::enable_shared_from_this { public: - explicit Channel(grpc_channel* c_channel); - Channel(const grpc::string& host, grpc_channel* c_channel); ~Channel(); // Get the current channel state. If the channel is in IDLE and try_to_connect @@ -115,6 +113,10 @@ class Channel GRPC_FINAL : public GrpcLibrary, const InputMessage& request, OutputMessage* result); friend class ::grpc::RpcMethod; + friend std::shared_ptr CreateChannelInternal( + const grpc::string& host, grpc_channel* c_channel); + + Channel(const grpc::string& host, grpc_channel* c_channel); Call CreateCall(const RpcMethod& method, ClientContext* context, CompletionQueue* cq); diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc index d9ffdc30cd1..90fc776d4a2 100644 --- a/src/cpp/client/channel.cc +++ b/src/cpp/client/channel.cc @@ -52,8 +52,6 @@ namespace grpc { -Channel::Channel(grpc_channel* channel) : c_channel_(channel) {} - Channel::Channel(const grpc::string& host, grpc_channel* channel) : host_(host), c_channel_(channel) {} diff --git a/src/cpp/client/create_channel.cc b/src/cpp/client/create_channel.cc index 704470693e6..70ea7e0e275 100644 --- a/src/cpp/client/create_channel.cc +++ b/src/cpp/client/create_channel.cc @@ -38,6 +38,8 @@ #include #include +#include "src/cpp/client/create_channel_internal.h" + namespace grpc { class ChannelArguments; @@ -49,10 +51,10 @@ std::shared_ptr CreateChannel( user_agent_prefix << "grpc-c++/" << grpc_version_string(); cp_args.SetString(GRPC_ARG_PRIMARY_USER_AGENT_STRING, user_agent_prefix.str()); - return creds ? creds->CreateChannel(target, cp_args) - : std::shared_ptr( - new Channel(grpc_lame_client_channel_create( - NULL, GRPC_STATUS_INVALID_ARGUMENT, - "Invalid credentials."))); + return creds + ? creds->CreateChannel(target, cp_args) + : CreateChannelInternal("", grpc_lame_client_channel_create( + NULL, GRPC_STATUS_INVALID_ARGUMENT, + "Invalid credentials.")); } } // namespace grpc diff --git a/src/cpp/client/create_channel_internal.cc b/src/cpp/client/create_channel_internal.cc new file mode 100644 index 00000000000..9c5ab038cf1 --- /dev/null +++ b/src/cpp/client/create_channel_internal.cc @@ -0,0 +1,46 @@ +/* + * + * Copyright 2015, 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 + +#include + +struct grpc_channel; + +namespace grpc { + +std::shared_ptr CreateChannelInternal(const grpc::string& host, + grpc_channel* c_channel) { + return std::shared_ptr(new Channel(host, c_channel)); +} +} // namespace grpc diff --git a/src/cpp/client/create_channel_internal.h b/src/cpp/client/create_channel_internal.h new file mode 100644 index 00000000000..16924719909 --- /dev/null +++ b/src/cpp/client/create_channel_internal.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2015, 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. + * + */ + +#ifndef GRPC_INTERNAL_CPP_CLIENT_CREATE_CHANNEL_INTERNAL_H +#define GRPC_INTERNAL_CPP_CLIENT_CREATE_CHANNEL_INTERNAL_H + +#include + +#include + +struct grpc_channel; + +namespace grpc { +class Channel; + +std::shared_ptr CreateChannelInternal(const grpc::string& host, + grpc_channel* c_channel); + +} // namespace grpc + +#endif // GRPC_INTERNAL_CPP_CLIENT_CREATE_CHANNEL_INTERNAL_H diff --git a/src/cpp/client/insecure_credentials.cc b/src/cpp/client/insecure_credentials.cc index 70ce17dc6da..97931406af3 100644 --- a/src/cpp/client/insecure_credentials.cc +++ b/src/cpp/client/insecure_credentials.cc @@ -38,6 +38,7 @@ #include #include #include +#include "src/cpp/client/create_channel_internal.h" namespace grpc { @@ -48,8 +49,9 @@ class InsecureCredentialsImpl GRPC_FINAL : public Credentials { const string& target, const grpc::ChannelArguments& args) GRPC_OVERRIDE { grpc_channel_args channel_args; args.SetChannelArgs(&channel_args); - return std::shared_ptr(new Channel( - grpc_insecure_channel_create(target.c_str(), &channel_args, nullptr))); + return CreateChannelInternal( + "", + grpc_insecure_channel_create(target.c_str(), &channel_args, nullptr)); } // InsecureCredentials should not be applied to a call. diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc index b32f783fa33..1e912c6beba 100644 --- a/src/cpp/client/secure_credentials.cc +++ b/src/cpp/client/secure_credentials.cc @@ -32,10 +32,10 @@ */ #include - #include #include #include +#include "src/cpp/client/create_channel_internal.h" #include "src/cpp/client/secure_credentials.h" namespace grpc { @@ -44,9 +44,9 @@ std::shared_ptr SecureCredentials::CreateChannel( const string& target, const grpc::ChannelArguments& args) { grpc_channel_args channel_args; args.SetChannelArgs(&channel_args); - return std::shared_ptr(new Channel( + return CreateChannelInternal( args.GetSslTargetNameOverride(), - grpc_secure_channel_create(c_creds_, target.c_str(), &channel_args))); + grpc_secure_channel_create(c_creds_, target.c_str(), &channel_args)); } bool SecureCredentials::ApplyToCall(grpc_call* call) { diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index b8f04cbcd38..23ff05fb862 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -803,6 +803,7 @@ include/grpc++/time.h \ src/cpp/client/secure_credentials.h \ src/cpp/common/secure_auth_context.h \ src/cpp/server/secure_server_credentials.h \ +src/cpp/client/create_channel_internal.h \ src/cpp/common/create_auth_context.h \ src/cpp/client/secure_channel_arguments.cc \ src/cpp/client/secure_credentials.cc \ @@ -814,6 +815,7 @@ src/cpp/client/channel.cc \ src/cpp/client/channel_arguments.cc \ src/cpp/client/client_context.cc \ src/cpp/client/create_channel.cc \ +src/cpp/client/create_channel_internal.cc \ src/cpp/client/credentials.cc \ src/cpp/client/generic_stub.cc \ src/cpp/client/insecure_credentials.cc \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 5c515d1ba47..863c9f802ec 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13141,6 +13141,7 @@ "include/grpc++/stub_options.h", "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", + "src/cpp/client/create_channel_internal.h", "src/cpp/client/secure_credentials.h", "src/cpp/common/create_auth_context.h", "src/cpp/common/secure_auth_context.h", @@ -13193,6 +13194,8 @@ "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", + "src/cpp/client/create_channel_internal.h", "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", @@ -13310,6 +13313,7 @@ "include/grpc++/stub_options.h", "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", + "src/cpp/client/create_channel_internal.h", "src/cpp/common/create_auth_context.h" ], "language": "c++", @@ -13359,6 +13363,8 @@ "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", "src/cpp/client/create_channel.cc", + "src/cpp/client/create_channel_internal.cc", + "src/cpp/client/create_channel_internal.h", "src/cpp/client/credentials.cc", "src/cpp/client/generic_stub.cc", "src/cpp/client/insecure_credentials.cc", diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index dbbb7c12cdd..e2e17d41770 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -258,6 +258,7 @@ + @@ -281,6 +282,8 @@ + + diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index 7c982e910ac..6f308d1d025 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -31,6 +31,9 @@ src\cpp\client + + src\cpp\client + src\cpp\client @@ -224,6 +227,9 @@ src\cpp\server + + src\cpp\client + src\cpp\common diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 98d15cd98dc..4be468cb62b 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -255,6 +255,7 @@ + @@ -268,6 +269,8 @@ + + diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index 99734c8953f..bd51d1fa0b1 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -16,6 +16,9 @@ src\cpp\client + + src\cpp\client + src\cpp\client @@ -200,6 +203,9 @@ + + src\cpp\client + src\cpp\common From 11e3028e65dbdcd3fb081e041654b06ac59445f6 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 12:40:49 -0700 Subject: [PATCH 23/79] regenerate projects --- tools/run_tests/tests.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 6c06d74834b..127b1dfc408 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -1538,6 +1538,7 @@ "posix", "windows" ], + "exclude_configs": [], "flaky": false, "language": "c++", "name": "status_test", From d392fa04c5866387c981f4cd83392d1a2e3da7a8 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 20 Aug 2015 13:55:29 -0700 Subject: [PATCH 24/79] fix shutdown_test --- test/cpp/end2end/shutdown_test.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc index fccbb130305..dc5fb5af9b3 100644 --- a/test/cpp/end2end/shutdown_test.cc +++ b/test/cpp/end2end/shutdown_test.cc @@ -39,7 +39,7 @@ #include "test/cpp/util/echo.grpc.pb.h" #include "src/core/support/env.h" #include -#include +#include #include #include #include @@ -118,7 +118,7 @@ class ShutdownTest : public ::testing::Test { } protected: - std::shared_ptr channel_; + std::shared_ptr channel_; std::unique_ptr stub_; std::unique_ptr server_; bool shutdown_; From 025632a138d20a03323f24b728869e77d6a966b3 Mon Sep 17 00:00:00 2001 From: "David G. Quintas" Date: Thu, 20 Aug 2015 14:16:42 -0700 Subject: [PATCH 25/79] Expanded grpc_server_request_call's docstring --- include/grpc/grpc.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 7869e9272e2..2f43199f5ad 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -589,9 +589,13 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *call, THREAD SAFETY: grpc_call_destroy is thread-compatible */ void grpc_call_destroy(grpc_call *call); -/** Request notification of a new call. 'cq_for_notification' must - have been registered to the server via - grpc_server_register_completion_queue. */ +/** Request notification of a new call. + Once a call with the given \a tag_new (or NULL for any tag) is received in + \a cq_bound_to_call, a notification is added to \a cq_for_notification and + \a call, \a details and \a request_metadata are updated with the appropriate + call information. + Note that \a cq_for_notification must have been registered to the server via + \a grpc_server_register_completion_queue. */ grpc_call_error grpc_server_request_call( grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, From b2a1c599a75cf326f3efe9c278f8977250844c82 Mon Sep 17 00:00:00 2001 From: "David G. Quintas" Date: Thu, 20 Aug 2015 14:44:27 -0700 Subject: [PATCH 26/79] Update grpc.h --- include/grpc/grpc.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 2f43199f5ad..860048711f0 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -589,13 +589,12 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *call, THREAD SAFETY: grpc_call_destroy is thread-compatible */ void grpc_call_destroy(grpc_call *call); -/** Request notification of a new call. - Once a call with the given \a tag_new (or NULL for any tag) is received in - \a cq_bound_to_call, a notification is added to \a cq_for_notification and - \a call, \a details and \a request_metadata are updated with the appropriate - call information. - Note that \a cq_for_notification must have been registered to the server via - \a grpc_server_register_completion_queue. */ +/** Request notification of a new call. + Once a call is received in \a cq_bound_to_call, a notification tagged with + \a tag_new is added to \a cq_for_notification. \a call, \a details and \a + request_metadata are updated with the appropriate call information. + Note that \a cq_for_notification must have been registered to the server via + \a grpc_server_register_completion_queue. */ grpc_call_error grpc_server_request_call( grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, From 41a166f97b7c686c9a859a7ce378f8fdf68d6245 Mon Sep 17 00:00:00 2001 From: Masood Malekghassemi Date: Mon, 17 Aug 2015 19:27:35 -0700 Subject: [PATCH 27/79] Add cancel_all_calls to Python server Also format _low_test.py to fit within the 80 character fill-limit and re-style test assertions. --- src/python/grpcio/grpc/_adapter/_c/types.h | 2 + .../grpcio/grpc/_adapter/_c/types/server.c | 16 ++ src/python/grpcio/grpc/_adapter/_low.py | 3 + .../grpc_test/_adapter/_low_test.py | 199 +++++++++++++----- 4 files changed, 169 insertions(+), 51 deletions(-) diff --git a/src/python/grpcio/grpc/_adapter/_c/types.h b/src/python/grpcio/grpc/_adapter/_c/types.h index f646465c633..f6ff957baa6 100644 --- a/src/python/grpcio/grpc/_adapter/_c/types.h +++ b/src/python/grpcio/grpc/_adapter/_c/types.h @@ -146,6 +146,7 @@ typedef struct Server { PyObject_HEAD grpc_server *c_serv; CompletionQueue *cq; + int shutdown_called; } Server; Server *pygrpc_Server_new(PyTypeObject *type, PyObject *args, PyObject *kwargs); void pygrpc_Server_dealloc(Server *self); @@ -156,6 +157,7 @@ PyObject *pygrpc_Server_add_http2_port( PyObject *pygrpc_Server_start(Server *self, PyObject *ignored); PyObject *pygrpc_Server_shutdown( Server *self, PyObject *args, PyObject *kwargs); +PyObject *pygrpc_Server_cancel_all_calls(Server *self, PyObject *unused); extern PyTypeObject pygrpc_Server_type; /*=========*/ diff --git a/src/python/grpcio/grpc/_adapter/_c/types/server.c b/src/python/grpcio/grpc/_adapter/_c/types/server.c index 15c98f28eb5..8feab8aab15 100644 --- a/src/python/grpcio/grpc/_adapter/_c/types/server.c +++ b/src/python/grpcio/grpc/_adapter/_c/types/server.c @@ -45,6 +45,8 @@ PyMethodDef pygrpc_Server_methods[] = { METH_KEYWORDS, ""}, {"start", (PyCFunction)pygrpc_Server_start, METH_NOARGS, ""}, {"shutdown", (PyCFunction)pygrpc_Server_shutdown, METH_KEYWORDS, ""}, + {"cancel_all_calls", (PyCFunction)pygrpc_Server_cancel_all_calls, + METH_NOARGS, ""}, {NULL} }; const char pygrpc_Server_doc[] = "See grpc._adapter._types.Server."; @@ -109,6 +111,7 @@ Server *pygrpc_Server_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) pygrpc_discard_channel_args(c_args); self->cq = cq; Py_INCREF(self->cq); + self->shutdown_called = 0; return self; } @@ -163,6 +166,7 @@ PyObject *pygrpc_Server_add_http2_port( PyObject *pygrpc_Server_start(Server *self, PyObject *ignored) { grpc_server_start(self->c_serv); + self->shutdown_called = 0; Py_RETURN_NONE; } @@ -176,5 +180,17 @@ PyObject *pygrpc_Server_shutdown( } tag = pygrpc_produce_server_shutdown_tag(user_tag); grpc_server_shutdown_and_notify(self->c_serv, self->cq->c_cq, tag); + self->shutdown_called = 1; + Py_RETURN_NONE; +} + +PyObject *pygrpc_Server_cancel_all_calls(Server *self, PyObject *unused) { + if (!self->shutdown_called) { + PyErr_SetString( + PyExc_RuntimeError, + "shutdown must have been called prior to calling cancel_all_calls!"); + return NULL; + } + grpc_server_cancel_all_calls(self->c_serv); Py_RETURN_NONE; } diff --git a/src/python/grpcio/grpc/_adapter/_low.py b/src/python/grpcio/grpc/_adapter/_low.py index 147086e7254..3859ebb0e24 100644 --- a/src/python/grpcio/grpc/_adapter/_low.py +++ b/src/python/grpcio/grpc/_adapter/_low.py @@ -124,3 +124,6 @@ class Server(_types.Server): def request_call(self, completion_queue, tag): return self.server.request_call(completion_queue.completion_queue, tag) + + def cancel_all_calls(self): + return self.server.cancel_all_calls() diff --git a/src/python/grpcio_test/grpc_test/_adapter/_low_test.py b/src/python/grpcio_test/grpc_test/_adapter/_low_test.py index 44fe760fbcf..70149127da3 100644 --- a/src/python/grpcio_test/grpc_test/_adapter/_low_test.py +++ b/src/python/grpcio_test/grpc_test/_adapter/_low_test.py @@ -52,7 +52,6 @@ def wait_for_events(completion_queues, deadline): def set_ith_result(i, completion_queue): result = completion_queue.next(deadline) with lock: - print i, completion_queue, result, time.time() - deadline results[i] = result for i, completion_queue in enumerate(completion_queues): thread = threading.Thread(target=set_ith_result, @@ -80,10 +79,12 @@ class InsecureServerInsecureClient(unittest.TestCase): del self.client_channel self.client_completion_queue.shutdown() - while self.client_completion_queue.next().type != _types.EventType.QUEUE_SHUTDOWN: + while (self.client_completion_queue.next().type != + _types.EventType.QUEUE_SHUTDOWN): pass self.server_completion_queue.shutdown() - while self.server_completion_queue.next().type != _types.EventType.QUEUE_SHUTDOWN: + while (self.server_completion_queue.next().type != + _types.EventType.QUEUE_SHUTDOWN): pass del self.client_completion_queue @@ -91,58 +92,68 @@ class InsecureServerInsecureClient(unittest.TestCase): del self.server def testEcho(self): - DEADLINE = time.time()+5 - DEADLINE_TOLERANCE = 0.25 - CLIENT_METADATA_ASCII_KEY = 'key' - CLIENT_METADATA_ASCII_VALUE = 'val' - CLIENT_METADATA_BIN_KEY = 'key-bin' - CLIENT_METADATA_BIN_VALUE = b'\0'*1000 - SERVER_INITIAL_METADATA_KEY = 'init_me_me_me' - SERVER_INITIAL_METADATA_VALUE = 'whodawha?' - SERVER_TRAILING_METADATA_KEY = 'california_is_in_a_drought' - SERVER_TRAILING_METADATA_VALUE = 'zomg it is' - SERVER_STATUS_CODE = _types.StatusCode.OK - SERVER_STATUS_DETAILS = 'our work is never over' - REQUEST = 'in death a member of project mayhem has a name' - RESPONSE = 'his name is robert paulson' - METHOD = 'twinkies' - HOST = 'hostess' + deadline = time.time() + 5 + event_time_tolerance = 2 + deadline_tolerance = 0.25 + client_metadata_ascii_key = 'key' + client_metadata_ascii_value = 'val' + client_metadata_bin_key = 'key-bin' + client_metadata_bin_value = b'\0'*1000 + server_initial_metadata_key = 'init_me_me_me' + server_initial_metadata_value = 'whodawha?' + server_trailing_metadata_key = 'california_is_in_a_drought' + server_trailing_metadata_value = 'zomg it is' + server_status_code = _types.StatusCode.OK + server_status_details = 'our work is never over' + request = 'blarghaflargh' + response = 'his name is robert paulson' + method = 'twinkies' + host = 'hostess' server_request_tag = object() - request_call_result = self.server.request_call(self.server_completion_queue, server_request_tag) + request_call_result = self.server.request_call(self.server_completion_queue, + server_request_tag) - self.assertEquals(_types.CallError.OK, request_call_result) + self.assertEqual(_types.CallError.OK, request_call_result) client_call_tag = object() - client_call = self.client_channel.create_call(self.client_completion_queue, METHOD, HOST, DEADLINE) - client_initial_metadata = [(CLIENT_METADATA_ASCII_KEY, CLIENT_METADATA_ASCII_VALUE), (CLIENT_METADATA_BIN_KEY, CLIENT_METADATA_BIN_VALUE)] + client_call = self.client_channel.create_call( + self.client_completion_queue, method, host, deadline) + client_initial_metadata = [ + (client_metadata_ascii_key, client_metadata_ascii_value), + (client_metadata_bin_key, client_metadata_bin_value) + ] client_start_batch_result = client_call.start_batch([ _types.OpArgs.send_initial_metadata(client_initial_metadata), - _types.OpArgs.send_message(REQUEST, 0), + _types.OpArgs.send_message(request, 0), _types.OpArgs.send_close_from_client(), _types.OpArgs.recv_initial_metadata(), _types.OpArgs.recv_message(), _types.OpArgs.recv_status_on_client() ], client_call_tag) - self.assertEquals(_types.CallError.OK, client_start_batch_result) + self.assertEqual(_types.CallError.OK, client_start_batch_result) - client_no_event, request_event, = wait_for_events([self.client_completion_queue, self.server_completion_queue], time.time() + 2) - self.assertEquals(client_no_event, None) - self.assertEquals(_types.EventType.OP_COMPLETE, request_event.type) + client_no_event, request_event, = wait_for_events( + [self.client_completion_queue, self.server_completion_queue], + time.time() + event_time_tolerance) + self.assertEqual(client_no_event, None) + self.assertEqual(_types.EventType.OP_COMPLETE, request_event.type) self.assertIsInstance(request_event.call, _low.Call) self.assertIs(server_request_tag, request_event.tag) - self.assertEquals(1, len(request_event.results)) + self.assertEqual(1, len(request_event.results)) received_initial_metadata = dict(request_event.results[0].initial_metadata) # Check that our metadata were transmitted - self.assertEquals( + self.assertEqual( dict(client_initial_metadata), - dict((x, received_initial_metadata[x]) for x in zip(*client_initial_metadata)[0])) + dict((x, received_initial_metadata[x]) + for x in zip(*client_initial_metadata)[0])) # Check that Python's user agent string is a part of the full user agent # string self.assertIn('Python-gRPC-{}'.format(_grpcio_metadata.__version__), received_initial_metadata['user-agent']) - self.assertEquals(METHOD, request_event.call_details.method) - self.assertEquals(HOST, request_event.call_details.host) - self.assertLess(abs(DEADLINE - request_event.call_details.deadline), DEADLINE_TOLERANCE) + self.assertEqual(method, request_event.call_details.method) + self.assertEqual(host, request_event.call_details.host) + self.assertLess(abs(deadline - request_event.call_details.deadline), + deadline_tolerance) # Check that the channel is connected, and that both it and the call have # the proper target and peer; do this after the first flurry of messages to @@ -155,33 +166,43 @@ class InsecureServerInsecureClient(unittest.TestCase): server_call_tag = object() server_call = request_event.call - server_initial_metadata = [(SERVER_INITIAL_METADATA_KEY, SERVER_INITIAL_METADATA_VALUE)] - server_trailing_metadata = [(SERVER_TRAILING_METADATA_KEY, SERVER_TRAILING_METADATA_VALUE)] + server_initial_metadata = [ + (server_initial_metadata_key, server_initial_metadata_value) + ] + server_trailing_metadata = [ + (server_trailing_metadata_key, server_trailing_metadata_value) + ] server_start_batch_result = server_call.start_batch([ _types.OpArgs.send_initial_metadata(server_initial_metadata), _types.OpArgs.recv_message(), - _types.OpArgs.send_message(RESPONSE, 0), + _types.OpArgs.send_message(response, 0), _types.OpArgs.recv_close_on_server(), - _types.OpArgs.send_status_from_server(server_trailing_metadata, SERVER_STATUS_CODE, SERVER_STATUS_DETAILS) + _types.OpArgs.send_status_from_server( + server_trailing_metadata, server_status_code, server_status_details) ], server_call_tag) - self.assertEquals(_types.CallError.OK, server_start_batch_result) + self.assertEqual(_types.CallError.OK, server_start_batch_result) - client_event, server_event, = wait_for_events([self.client_completion_queue, self.server_completion_queue], time.time() + 1) + client_event, server_event, = wait_for_events( + [self.client_completion_queue, self.server_completion_queue], + time.time() + event_time_tolerance) - self.assertEquals(6, len(client_event.results)) + self.assertEqual(6, len(client_event.results)) found_client_op_types = set() for client_result in client_event.results: - self.assertNotIn(client_result.type, found_client_op_types) # we expect each op type to be unique + # we expect each op type to be unique + self.assertNotIn(client_result.type, found_client_op_types) found_client_op_types.add(client_result.type) if client_result.type == _types.OpType.RECV_INITIAL_METADATA: - self.assertEquals(dict(server_initial_metadata), dict(client_result.initial_metadata)) + self.assertEqual(dict(server_initial_metadata), + dict(client_result.initial_metadata)) elif client_result.type == _types.OpType.RECV_MESSAGE: - self.assertEquals(RESPONSE, client_result.message) + self.assertEqual(response, client_result.message) elif client_result.type == _types.OpType.RECV_STATUS_ON_CLIENT: - self.assertEquals(dict(server_trailing_metadata), dict(client_result.trailing_metadata)) - self.assertEquals(SERVER_STATUS_DETAILS, client_result.status.details) - self.assertEquals(SERVER_STATUS_CODE, client_result.status.code) - self.assertEquals(set([ + self.assertEqual(dict(server_trailing_metadata), + dict(client_result.trailing_metadata)) + self.assertEqual(server_status_details, client_result.status.details) + self.assertEqual(server_status_code, client_result.status.code) + self.assertEqual(set([ _types.OpType.SEND_INITIAL_METADATA, _types.OpType.SEND_MESSAGE, _types.OpType.SEND_CLOSE_FROM_CLIENT, @@ -190,16 +211,16 @@ class InsecureServerInsecureClient(unittest.TestCase): _types.OpType.RECV_STATUS_ON_CLIENT ]), found_client_op_types) - self.assertEquals(5, len(server_event.results)) + self.assertEqual(5, len(server_event.results)) found_server_op_types = set() for server_result in server_event.results: self.assertNotIn(client_result.type, found_server_op_types) found_server_op_types.add(server_result.type) if server_result.type == _types.OpType.RECV_MESSAGE: - self.assertEquals(REQUEST, server_result.message) + self.assertEqual(request, server_result.message) elif server_result.type == _types.OpType.RECV_CLOSE_ON_SERVER: self.assertFalse(server_result.cancelled) - self.assertEquals(set([ + self.assertEqual(set([ _types.OpType.SEND_INITIAL_METADATA, _types.OpType.RECV_MESSAGE, _types.OpType.SEND_MESSAGE, @@ -211,5 +232,81 @@ class InsecureServerInsecureClient(unittest.TestCase): del server_call +class HangingServerShutdown(unittest.TestCase): + + def setUp(self): + self.server_completion_queue = _low.CompletionQueue() + self.server = _low.Server(self.server_completion_queue, []) + self.port = self.server.add_http2_port('[::]:0') + self.client_completion_queue = _low.CompletionQueue() + self.client_channel = _low.Channel('localhost:%d'%self.port, []) + + self.server.start() + + def tearDown(self): + self.server.shutdown() + del self.client_channel + + self.client_completion_queue.shutdown() + self.server_completion_queue.shutdown() + while True: + client_event, server_event = wait_for_events( + [self.client_completion_queue, self.server_completion_queue], + float("+inf")) + if (client_event.type == _types.EventType.QUEUE_SHUTDOWN and + server_event.type == _types.EventType.QUEUE_SHUTDOWN): + break + + del self.client_completion_queue + del self.server_completion_queue + del self.server + + def testHangingServerCall(self): + deadline = time.time() + 5 + deadline_tolerance = 0.25 + event_time_tolerance = 2 + cancel_all_calls_time_tolerance = 0.5 + request = 'blarghaflargh' + method = 'twinkies' + host = 'hostess' + server_request_tag = object() + request_call_result = self.server.request_call(self.server_completion_queue, + server_request_tag) + + client_call_tag = object() + client_call = self.client_channel.create_call(self.client_completion_queue, + method, host, deadline) + client_start_batch_result = client_call.start_batch([ + _types.OpArgs.send_initial_metadata([]), + _types.OpArgs.send_message(request, 0), + _types.OpArgs.send_close_from_client(), + _types.OpArgs.recv_initial_metadata(), + _types.OpArgs.recv_message(), + _types.OpArgs.recv_status_on_client() + ], client_call_tag) + + client_no_event, request_event, = wait_for_events( + [self.client_completion_queue, self.server_completion_queue], + time.time() + event_time_tolerance) + + # Now try to shutdown the server and expect that we see server shutdown + # almost immediately after calling cancel_all_calls. + with self.assertRaises(RuntimeError): + self.server.cancel_all_calls() + shutdown_tag = object() + self.server.shutdown(shutdown_tag) + pre_cancel_timestamp = time.time() + self.server.cancel_all_calls() + finish_shutdown_timestamp = None + client_call_event, server_shutdown_event = wait_for_events( + [self.client_completion_queue, self.server_completion_queue], + time.time() + event_time_tolerance) + self.assertIs(shutdown_tag, server_shutdown_event.tag) + self.assertGreater(pre_cancel_timestamp + cancel_all_calls_time_tolerance, + time.time()) + + del client_call + + if __name__ == '__main__': unittest.main(verbosity=2) From a4c4f02a63eb70fcd21a102cde9aa536dcd17f67 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Fri, 21 Aug 2015 00:05:42 -0700 Subject: [PATCH 28/79] Added C API functions for compression args handling (w/ tests) --- Makefile | 34 +++++- build.json | 14 +++ include/grpc/compression.h | 26 ++++- src/core/channel/channel_args.c | 62 +++++++++++ src/core/channel/channel_args.h | 17 +++ test/core/channel/channel_args_test.c | 136 +++++++++++++++++++++++ tools/run_tests/sources_and_headers.json | 14 +++ tools/run_tests/tests.json | 19 ++++ vsprojects/Grpc.mak | 10 +- 9 files changed, 327 insertions(+), 5 deletions(-) create mode 100644 test/core/channel/channel_args_test.c diff --git a/Makefile b/Makefile index 31628b44122..ab39c4bd561 100644 --- a/Makefile +++ b/Makefile @@ -811,6 +811,7 @@ gpr_useful_test: $(BINDIR)/$(CONFIG)/gpr_useful_test grpc_auth_context_test: $(BINDIR)/$(CONFIG)/grpc_auth_context_test grpc_base64_test: $(BINDIR)/$(CONFIG)/grpc_base64_test grpc_byte_buffer_reader_test: $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test +grpc_channel_args_test: $(BINDIR)/$(CONFIG)/grpc_channel_args_test grpc_channel_stack_test: $(BINDIR)/$(CONFIG)/grpc_channel_stack_test grpc_completion_queue_test: $(BINDIR)/$(CONFIG)/grpc_completion_queue_test grpc_create_jwt: $(BINDIR)/$(CONFIG)/grpc_create_jwt @@ -1731,7 +1732,7 @@ endif buildtests: buildtests_c buildtests_cxx buildtests_zookeeper -buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test +buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_args_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test @@ -1811,6 +1812,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/grpc_base64_test || ( echo test grpc_base64_test failed ; exit 1 ) $(E) "[RUN] Testing grpc_byte_buffer_reader_test" $(Q) $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test || ( echo test grpc_byte_buffer_reader_test failed ; exit 1 ) + $(E) "[RUN] Testing grpc_channel_args_test" + $(Q) $(BINDIR)/$(CONFIG)/grpc_channel_args_test || ( echo test grpc_channel_args_test failed ; exit 1 ) $(E) "[RUN] Testing grpc_channel_stack_test" $(Q) $(BINDIR)/$(CONFIG)/grpc_channel_stack_test || ( echo test grpc_channel_stack_test failed ; exit 1 ) $(E) "[RUN] Testing grpc_completion_queue_test" @@ -7644,6 +7647,35 @@ endif endif +GRPC_CHANNEL_ARGS_TEST_SRC = \ + test/core/channel/channel_args_test.c \ + +GRPC_CHANNEL_ARGS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_CHANNEL_ARGS_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/grpc_channel_args_test: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/grpc_channel_args_test: $(GRPC_CHANNEL_ARGS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(GRPC_CHANNEL_ARGS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_channel_args_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/channel/channel_args_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +deps_grpc_channel_args_test: $(GRPC_CHANNEL_ARGS_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GRPC_CHANNEL_ARGS_TEST_OBJS:.o=.dep) +endif +endif + + GRPC_CHANNEL_STACK_TEST_SRC = \ test/core/channel/channel_stack_test.c \ diff --git a/build.json b/build.json index bd707d2e34c..2377567c357 100644 --- a/build.json +++ b/build.json @@ -1365,6 +1365,20 @@ "gpr" ] }, + { + "name": "grpc_channel_args_test", + "build": "test", + "language": "c", + "src": [ + "test/core/channel/channel_args_test.c" + ], + "deps": [ + "grpc_test_util", + "grpc", + "gpr_test_util", + "gpr" + ] + }, { "name": "grpc_channel_stack_test", "build": "test", diff --git a/include/grpc/compression.h b/include/grpc/compression.h index 9924baeca1a..82e326fe0ec 100644 --- a/include/grpc/compression.h +++ b/include/grpc/compression.h @@ -36,12 +36,15 @@ #include +#include + #ifdef __cplusplus extern "C" { #endif /** To be used in channel arguments */ #define GRPC_COMPRESSION_ALGORITHM_ARG "grpc.compression_algorithm" +#define GRPC_COMPRESSION_ALGORITHM_STATE_ARG "grpc.compression_algorithm_state" /* The various compression algorithms supported by GRPC */ typedef enum { @@ -60,6 +63,11 @@ typedef enum { GRPC_COMPRESS_LEVEL_COUNT } grpc_compression_level; +typedef struct grpc_compression_options { + gpr_uint32 enabled_algorithms_bitset; /**< All algs are enabled by default */ + grpc_compression_algorithm default_compression_algorithm; /**< for channel */ +} grpc_compression_options; + /** Parses the first \a name_length bytes of \a name as a * grpc_compression_algorithm instance, updating \a algorithm. Returns 1 upon * success, 0 otherwise. */ @@ -67,9 +75,7 @@ int grpc_compression_algorithm_parse(const char *name, size_t name_length, grpc_compression_algorithm *algorithm); /** Updates \a name with the encoding name corresponding to a valid \a - * algorithm. Note that the string returned through \a name upon success is - * statically allocated and shouldn't be freed. Returns 1 upon success, 0 - * otherwise. */ + * algorithm. Returns 1 upon success, 0 otherwise. */ int grpc_compression_algorithm_name(grpc_compression_algorithm algorithm, char **name); @@ -85,6 +91,20 @@ grpc_compression_level grpc_compression_level_for_algorithm( grpc_compression_algorithm grpc_compression_algorithm_for_level( grpc_compression_level level); +void grpc_compression_options_init(grpc_compression_options *opts); + +/** Mark \a algorithm as enabled in \a opts. */ +void grpc_compression_options_enable_algorithm( + grpc_compression_options *opts, grpc_compression_algorithm algorithm); + +/** Mark \a algorithm as disabled in \a opts. */ +void grpc_compression_options_disable_algorithm( + grpc_compression_options *opts, grpc_compression_algorithm algorithm); + +/** Returns true if \a algorithm is marked as enabled in \a opts. */ +int grpc_compression_options_is_algorithm_enabled( + const grpc_compression_options *opts, grpc_compression_algorithm algorithm); + #ifdef __cplusplus } #endif diff --git a/src/core/channel/channel_args.c b/src/core/channel/channel_args.c index c430b56fa2d..dc66de7dd63 100644 --- a/src/core/channel/channel_args.c +++ b/src/core/channel/channel_args.c @@ -37,6 +37,7 @@ #include #include +#include #include @@ -146,3 +147,64 @@ grpc_channel_args *grpc_channel_args_set_compression_algorithm( tmp.value.integer = algorithm; return grpc_channel_args_copy_and_add(a, &tmp, 1); } + +/** Returns 1 if the argument for compression algorithm's enabled states bitset + * was found in \a a, returning the arg's value in \a states. Otherwise, returns + * 0. */ +static int find_compression_algorithm_states_bitset( + const grpc_channel_args *a, int **states_arg) { + if (a != NULL) { + size_t i; + for (i = 0; i < a->num_args; ++i) { + if (a->args[i].type == GRPC_ARG_INTEGER && + !strcmp(GRPC_COMPRESSION_ALGORITHM_STATE_ARG, a->args[i].key)) { + *states_arg = &a->args[i].value.integer; + return 1; /* GPR_TRUE */ + } + } + } + return 0; /* GPR_FALSE */ +} + +grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( + grpc_channel_args *a, + grpc_compression_algorithm algorithm, + int state) { + int *states_arg; + grpc_channel_args *result = a; + const int states_arg_found = + find_compression_algorithm_states_bitset(a, &states_arg); + + if (states_arg_found) { + if (state != 0) { + GPR_BITSET(states_arg, algorithm); + } else { + GPR_BITCLEAR(states_arg, algorithm); + } + } else { + /* create a new arg */ + grpc_arg tmp; + tmp.type = GRPC_ARG_INTEGER; + tmp.key = GRPC_COMPRESSION_ALGORITHM_STATE_ARG; + /* all enabled by default */ + tmp.value.integer = (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1; + if (state != 0) { + GPR_BITSET(&tmp.value.integer, algorithm); + } else { + GPR_BITCLEAR(&tmp.value.integer, algorithm); + } + result = grpc_channel_args_copy_and_add(a, &tmp, 1); + grpc_channel_args_destroy(a); + } + return result; +} + +int grpc_channel_args_compression_algorithm_get_states( + const grpc_channel_args *a) { + int *states_arg; + if (find_compression_algorithm_states_bitset(a, &states_arg)) { + return *states_arg; + } else { + return (1u << GRPC_COMPRESS_ALGORITHMS_COUNT) - 1; /* All algs. enabled */ + } +} diff --git a/src/core/channel/channel_args.h b/src/core/channel/channel_args.h index 7e6ddd3997a..e557f9a9d92 100644 --- a/src/core/channel/channel_args.h +++ b/src/core/channel/channel_args.h @@ -67,4 +67,21 @@ grpc_compression_algorithm grpc_channel_args_get_compression_algorithm( grpc_channel_args *grpc_channel_args_set_compression_algorithm( grpc_channel_args *a, grpc_compression_algorithm algorithm); +/** Sets the support for the given compression algorithm. By default, all + * compression algorithms are enabled. It's an error to disable an algorithm set + * by grpc_channel_args_set_compression_algorithm. + * */ +grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( + grpc_channel_args *a, + grpc_compression_algorithm algorithm, + int enabled); + +/** Returns the bitset representing the support state (true for enabled, false + * for disabled) for compression algorithms. + * + * The i-th bit of the returned bitset corresponds to the i-th entry in the + * grpc_compression_algorithm enum. */ +int grpc_channel_args_compression_algorithm_get_states( + const grpc_channel_args *a); + #endif /* GRPC_INTERNAL_CORE_CHANNEL_CHANNEL_ARGS_H */ diff --git a/test/core/channel/channel_args_test.c b/test/core/channel/channel_args_test.c new file mode 100644 index 00000000000..227cc1f4158 --- /dev/null +++ b/test/core/channel/channel_args_test.c @@ -0,0 +1,136 @@ +/* + * + * Copyright 2015, 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 + +#include +#include + +#include "src/core/channel/channel_args.h" + +#include "test/core/util/test_config.h" + +static void test_create(void) { + grpc_arg arg_int; + grpc_arg arg_string; + grpc_arg to_add[2]; + grpc_channel_args *ch_args; + + arg_int.key = "int_arg"; + arg_int.type = GRPC_ARG_INTEGER; + arg_int.value.integer = 123; + + arg_string.key = "str key"; + arg_string.type = GRPC_ARG_STRING; + arg_string.value.string = "str value"; + + to_add[0] = arg_int; + to_add[1] = arg_string; + ch_args = grpc_channel_args_copy_and_add(NULL, to_add, 2); + + GPR_ASSERT(ch_args->num_args == 2); + GPR_ASSERT(strcmp(ch_args->args[0].key, arg_int.key) == 0); + GPR_ASSERT(ch_args->args[0].type == arg_int.type); + GPR_ASSERT(ch_args->args[0].value.integer == arg_int.value.integer); + + GPR_ASSERT(strcmp(ch_args->args[1].key, arg_string.key) == 0); + GPR_ASSERT(ch_args->args[1].type == arg_string.type); + GPR_ASSERT(strcmp(ch_args->args[1].value.string, arg_string.value.string) == + 0); + + grpc_channel_args_destroy(ch_args); +} + +static void test_set_compression_algorithm(void) { + grpc_channel_args *ch_args; + + ch_args = + grpc_channel_args_set_compression_algorithm(NULL, GRPC_COMPRESS_GZIP); + GPR_ASSERT(ch_args->num_args == 1); + GPR_ASSERT(strcmp(ch_args->args[0].key, GRPC_COMPRESSION_ALGORITHM_ARG) == 0); + GPR_ASSERT(ch_args->args[0].type == GRPC_ARG_INTEGER); + + grpc_channel_args_destroy(ch_args); +} + +static void test_compression_algorithm_states(void) { + grpc_channel_args *ch_args; + int states_bitset; + size_t i; + + ch_args = grpc_channel_args_copy_and_add(NULL, NULL, 0); + /* by default, all enabled */ + states_bitset = grpc_channel_args_compression_algorithm_get_states(ch_args); + + for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) { + GPR_ASSERT(GPR_BITGET(states_bitset, i)); + } + + /* disable gzip and deflate */ + ch_args = grpc_channel_args_compression_algorithm_set_state( + ch_args, GRPC_COMPRESS_GZIP, 0); + ch_args = grpc_channel_args_compression_algorithm_set_state( + ch_args, GRPC_COMPRESS_DEFLATE, 0); + + states_bitset = grpc_channel_args_compression_algorithm_get_states(ch_args); + for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) { + if (i == GRPC_COMPRESS_GZIP || i == GRPC_COMPRESS_DEFLATE) { + GPR_ASSERT(GPR_BITGET(states_bitset, i) == 0); + } else { + GPR_ASSERT(GPR_BITGET(states_bitset, i) != 0); + } + } + + /* re-enabled gzip only */ + ch_args = grpc_channel_args_compression_algorithm_set_state( + ch_args, GRPC_COMPRESS_GZIP, 1); + + states_bitset = grpc_channel_args_compression_algorithm_get_states(ch_args); + for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) { + if (i == GRPC_COMPRESS_DEFLATE) { + GPR_ASSERT(GPR_BITGET(states_bitset, i) == 0); + } else { + GPR_ASSERT(GPR_BITGET(states_bitset, i) != 0); + } + } + + grpc_channel_args_destroy(ch_args); +} + +int main(int argc, char **argv) { + grpc_test_init(argc, argv); + test_create(); + test_set_compression_algorithm(); + test_compression_algorithm_states(); + return 0; +} diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 50f078586d1..a9b40897f22 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -459,6 +459,20 @@ "test/core/surface/byte_buffer_reader_test.c" ] }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc_test_util" + ], + "headers": [], + "language": "c", + "name": "grpc_channel_args_test", + "src": [ + "test/core/channel/channel_args_test.c" + ] + }, { "deps": [ "gpr", diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 6c06d74834b..c20e202d148 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -567,6 +567,24 @@ "windows" ] }, + { + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "grpc_channel_args_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, { "ci_platforms": [ "linux", @@ -1538,6 +1556,7 @@ "posix", "windows" ], + "exclude_configs": [], "flaky": false, "language": "c++", "name": "status_test", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 662de784f72..597d4d30542 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -80,7 +80,7 @@ $(OUT_DIR): build_libs: build_gpr build_gpr_test_util build_grpc build_grpc_test_util build_grpc_test_util_unsecure build_grpc_unsecure Debug\grpc_zookeeper.lib Debug\reconnect_server.lib build_grpc++ Debug\grpc++_test_config.lib Debug\grpc++_test_util.lib build_grpc++_unsecure Debug\interop_client_helper.lib Debug\interop_client_main.lib Debug\interop_server_helper.lib Debug\interop_server_main.lib Debug\qps.lib Debug\end2end_fixture_chttp2_fake_security.lib Debug\end2end_fixture_chttp2_fullstack.lib Debug\end2end_fixture_chttp2_fullstack_compression.lib Debug\end2end_fixture_chttp2_fullstack_with_proxy.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack.lib Debug\end2end_fixture_chttp2_simple_ssl_fullstack_with_proxy.lib Debug\end2end_fixture_chttp2_simple_ssl_with_oauth2_fullstack.lib Debug\end2end_fixture_chttp2_socket_pair.lib Debug\end2end_fixture_chttp2_socket_pair_one_byte_at_a_time.lib Debug\end2end_fixture_chttp2_socket_pair_with_grpc_trace.lib Debug\end2end_test_bad_hostname.lib Debug\end2end_test_cancel_after_accept.lib Debug\end2end_test_cancel_after_accept_and_writes_closed.lib Debug\end2end_test_cancel_after_invoke.lib Debug\end2end_test_cancel_before_invoke.lib Debug\end2end_test_cancel_in_a_vacuum.lib Debug\end2end_test_census_simple_request.lib Debug\end2end_test_channel_connectivity.lib Debug\end2end_test_default_host.lib Debug\end2end_test_disappearing_server.lib Debug\end2end_test_early_server_shutdown_finishes_inflight_calls.lib Debug\end2end_test_early_server_shutdown_finishes_tags.lib Debug\end2end_test_empty_batch.lib Debug\end2end_test_graceful_server_shutdown.lib Debug\end2end_test_invoke_large_request.lib Debug\end2end_test_max_concurrent_streams.lib Debug\end2end_test_max_message_length.lib Debug\end2end_test_no_op.lib Debug\end2end_test_ping_pong_streaming.lib Debug\end2end_test_registered_call.lib Debug\end2end_test_request_response_with_binary_metadata_and_payload.lib Debug\end2end_test_request_response_with_metadata_and_payload.lib Debug\end2end_test_request_response_with_payload.lib Debug\end2end_test_request_response_with_payload_and_call_creds.lib Debug\end2end_test_request_response_with_trailing_metadata_and_payload.lib Debug\end2end_test_request_with_compressed_payload.lib Debug\end2end_test_request_with_flags.lib Debug\end2end_test_request_with_large_metadata.lib Debug\end2end_test_request_with_payload.lib Debug\end2end_test_server_finishes_request.lib Debug\end2end_test_simple_delayed_request.lib Debug\end2end_test_simple_request.lib Debug\end2end_test_simple_request_with_high_initial_sequence_number.lib Debug\end2end_certs.lib Debug\bad_client_test.lib buildtests: buildtests_c buildtests_cxx -buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe compression_test.exe fling_client.exe fling_server.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_stack_lockfree_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_auth_context_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_jwt_verifier_test.exe grpc_security_connector_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe multiple_server_queues_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe uri_parser_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_channel_connectivity_test.exe chttp2_fake_security_default_host_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_compressed_payload_test.exe chttp2_fake_security_request_with_flags_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_server_finishes_request_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_channel_connectivity_test.exe chttp2_fullstack_default_host_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_compressed_payload_test.exe chttp2_fullstack_request_with_flags_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_server_finishes_request_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_compression_bad_hostname_test.exe chttp2_fullstack_compression_cancel_after_accept_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_compression_cancel_after_invoke_test.exe chttp2_fullstack_compression_cancel_before_invoke_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_test.exe chttp2_fullstack_compression_census_simple_request_test.exe chttp2_fullstack_compression_channel_connectivity_test.exe chttp2_fullstack_compression_default_host_test.exe chttp2_fullstack_compression_disappearing_server_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_compression_empty_batch_test.exe chttp2_fullstack_compression_graceful_server_shutdown_test.exe chttp2_fullstack_compression_invoke_large_request_test.exe chttp2_fullstack_compression_max_concurrent_streams_test.exe chttp2_fullstack_compression_max_message_length_test.exe chttp2_fullstack_compression_no_op_test.exe chttp2_fullstack_compression_ping_pong_streaming_test.exe chttp2_fullstack_compression_registered_call_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_compression_request_with_compressed_payload_test.exe chttp2_fullstack_compression_request_with_flags_test.exe chttp2_fullstack_compression_request_with_large_metadata_test.exe chttp2_fullstack_compression_request_with_payload_test.exe chttp2_fullstack_compression_server_finishes_request_test.exe chttp2_fullstack_compression_simple_delayed_request_test.exe chttp2_fullstack_compression_simple_request_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_with_proxy_bad_hostname_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_fullstack_with_proxy_census_simple_request_test.exe chttp2_fullstack_with_proxy_default_host_test.exe chttp2_fullstack_with_proxy_disappearing_server_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_with_proxy_empty_batch_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_fullstack_with_proxy_invoke_large_request_test.exe chttp2_fullstack_with_proxy_max_message_length_test.exe chttp2_fullstack_with_proxy_no_op_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_fullstack_with_proxy_registered_call_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_fullstack_with_proxy_request_with_payload_test.exe chttp2_fullstack_with_proxy_server_finishes_request_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_fullstack_with_proxy_simple_request_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_fullstack_default_host_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_fullstack_request_with_flags_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_default_host_test.exe chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test.exe chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test.exe chttp2_simple_ssl_fullstack_with_proxy_no_op_test.exe chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_with_proxy_registered_call_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_with_oauth2_fullstack_default_host_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_compressed_payload_test.exe chttp2_socket_pair_request_with_flags_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_server_finishes_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_channel_connectivity_unsecure_test.exe chttp2_fullstack_default_host_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_request_with_flags_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_server_finishes_request_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_compression_bad_hostname_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_compression_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_compression_census_simple_request_unsecure_test.exe chttp2_fullstack_compression_channel_connectivity_unsecure_test.exe chttp2_fullstack_compression_default_host_unsecure_test.exe chttp2_fullstack_compression_disappearing_server_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_compression_empty_batch_unsecure_test.exe chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_compression_invoke_large_request_unsecure_test.exe chttp2_fullstack_compression_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_compression_max_message_length_unsecure_test.exe chttp2_fullstack_compression_no_op_unsecure_test.exe chttp2_fullstack_compression_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_compression_registered_call_unsecure_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_flags_unsecure_test.exe chttp2_fullstack_compression_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_compression_request_with_payload_unsecure_test.exe chttp2_fullstack_compression_server_finishes_request_unsecure_test.exe chttp2_fullstack_compression_simple_delayed_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_with_proxy_bad_hostname_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_with_proxy_census_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_default_host_unsecure_test.exe chttp2_fullstack_with_proxy_disappearing_server_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_with_proxy_empty_batch_unsecure_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test.exe chttp2_fullstack_with_proxy_max_message_length_unsecure_test.exe chttp2_fullstack_with_proxy_no_op_unsecure_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_with_proxy_registered_call_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_request_with_flags_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_server_finishes_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe connection_prefix_bad_client_test.exe initial_settings_frame_bad_client_test.exe +buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe compression_test.exe fling_client.exe fling_server.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_stack_lockfree_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_auth_context_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_args_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_jwt_verifier_test.exe grpc_security_connector_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe multiple_server_queues_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe uri_parser_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_channel_connectivity_test.exe chttp2_fake_security_default_host_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_compressed_payload_test.exe chttp2_fake_security_request_with_flags_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_server_finishes_request_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_channel_connectivity_test.exe chttp2_fullstack_default_host_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_compressed_payload_test.exe chttp2_fullstack_request_with_flags_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_server_finishes_request_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_compression_bad_hostname_test.exe chttp2_fullstack_compression_cancel_after_accept_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_compression_cancel_after_invoke_test.exe chttp2_fullstack_compression_cancel_before_invoke_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_test.exe chttp2_fullstack_compression_census_simple_request_test.exe chttp2_fullstack_compression_channel_connectivity_test.exe chttp2_fullstack_compression_default_host_test.exe chttp2_fullstack_compression_disappearing_server_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_compression_empty_batch_test.exe chttp2_fullstack_compression_graceful_server_shutdown_test.exe chttp2_fullstack_compression_invoke_large_request_test.exe chttp2_fullstack_compression_max_concurrent_streams_test.exe chttp2_fullstack_compression_max_message_length_test.exe chttp2_fullstack_compression_no_op_test.exe chttp2_fullstack_compression_ping_pong_streaming_test.exe chttp2_fullstack_compression_registered_call_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_compression_request_with_compressed_payload_test.exe chttp2_fullstack_compression_request_with_flags_test.exe chttp2_fullstack_compression_request_with_large_metadata_test.exe chttp2_fullstack_compression_request_with_payload_test.exe chttp2_fullstack_compression_server_finishes_request_test.exe chttp2_fullstack_compression_simple_delayed_request_test.exe chttp2_fullstack_compression_simple_request_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_with_proxy_bad_hostname_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_fullstack_with_proxy_census_simple_request_test.exe chttp2_fullstack_with_proxy_default_host_test.exe chttp2_fullstack_with_proxy_disappearing_server_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_with_proxy_empty_batch_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_fullstack_with_proxy_invoke_large_request_test.exe chttp2_fullstack_with_proxy_max_message_length_test.exe chttp2_fullstack_with_proxy_no_op_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_fullstack_with_proxy_registered_call_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_fullstack_with_proxy_request_with_payload_test.exe chttp2_fullstack_with_proxy_server_finishes_request_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_fullstack_with_proxy_simple_request_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_fullstack_default_host_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_fullstack_request_with_flags_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_default_host_test.exe chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test.exe chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test.exe chttp2_simple_ssl_fullstack_with_proxy_no_op_test.exe chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_with_proxy_registered_call_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_with_oauth2_fullstack_default_host_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_compressed_payload_test.exe chttp2_socket_pair_request_with_flags_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_server_finishes_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_channel_connectivity_unsecure_test.exe chttp2_fullstack_default_host_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_request_with_flags_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_server_finishes_request_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_compression_bad_hostname_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_compression_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_compression_census_simple_request_unsecure_test.exe chttp2_fullstack_compression_channel_connectivity_unsecure_test.exe chttp2_fullstack_compression_default_host_unsecure_test.exe chttp2_fullstack_compression_disappearing_server_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_compression_empty_batch_unsecure_test.exe chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_compression_invoke_large_request_unsecure_test.exe chttp2_fullstack_compression_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_compression_max_message_length_unsecure_test.exe chttp2_fullstack_compression_no_op_unsecure_test.exe chttp2_fullstack_compression_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_compression_registered_call_unsecure_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_flags_unsecure_test.exe chttp2_fullstack_compression_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_compression_request_with_payload_unsecure_test.exe chttp2_fullstack_compression_server_finishes_request_unsecure_test.exe chttp2_fullstack_compression_simple_delayed_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_with_proxy_bad_hostname_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_with_proxy_census_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_default_host_unsecure_test.exe chttp2_fullstack_with_proxy_disappearing_server_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_with_proxy_empty_batch_unsecure_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test.exe chttp2_fullstack_with_proxy_max_message_length_unsecure_test.exe chttp2_fullstack_with_proxy_no_op_unsecure_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_with_proxy_registered_call_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_request_with_flags_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_server_finishes_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe connection_prefix_bad_client_test.exe initial_settings_frame_bad_client_test.exe echo All C tests built. buildtests_cxx: async_end2end_test.exe auth_property_iterator_test.exe channel_arguments_test.exe cli_call_test.exe client_crash_test_server.exe credentials_test.exe cxx_byte_buffer_test.exe cxx_slice_test.exe cxx_time_test.exe dynamic_thread_pool_test.exe end2end_test.exe fixed_size_thread_pool_test.exe generic_end2end_test.exe grpc_cli.exe mock_test.exe reconnect_interop_client.exe reconnect_interop_server.exe secure_auth_context_test.exe server_crash_test_client.exe shutdown_test.exe status_test.exe thread_stress_test.exe zookeeper_test.exe @@ -327,6 +327,14 @@ grpc_byte_buffer_reader_test: grpc_byte_buffer_reader_test.exe echo Running grpc_byte_buffer_reader_test $(OUT_DIR)\grpc_byte_buffer_reader_test.exe +grpc_channel_args_test.exe: build_grpc_test_util build_grpc build_gpr_test_util build_gpr $(OUT_DIR) + echo Building grpc_channel_args_test + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\channel\channel_args_test.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_channel_args_test.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\channel_args_test.obj +grpc_channel_args_test: grpc_channel_args_test.exe + echo Running grpc_channel_args_test + $(OUT_DIR)\grpc_channel_args_test.exe + grpc_channel_stack_test.exe: build_grpc_test_util build_grpc build_gpr_test_util build_gpr $(OUT_DIR) echo Building grpc_channel_stack_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\channel\channel_stack_test.c From 49772e00eb9606c3192b88f348d9cbcb22eb93c2 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 21 Aug 2015 08:08:37 -0700 Subject: [PATCH 29/79] Outlaw illegal metadata characters --- Makefile | 32 +++++++- build.json | 10 +++ src/core/channel/compress_filter.h | 2 +- src/core/surface/call.c | 5 +- src/core/transport/metadata.c | 26 ++++++- src/core/transport/metadata.h | 1 + .../core/gen_legal_metadata_characters.c | 73 +++++++++++++++++++ tools/run_tests/sources_and_headers.json | 12 +++ tools/run_tests/tests.json | 1 + vsprojects/Grpc.mak | 8 ++ 10 files changed, 163 insertions(+), 7 deletions(-) create mode 100644 tools/codegen/core/gen_legal_metadata_characters.c diff --git a/Makefile b/Makefile index 31628b44122..f7ace3186a8 100644 --- a/Makefile +++ b/Makefile @@ -793,6 +793,7 @@ fling_server: $(BINDIR)/$(CONFIG)/fling_server fling_stream_test: $(BINDIR)/$(CONFIG)/fling_stream_test fling_test: $(BINDIR)/$(CONFIG)/fling_test gen_hpack_tables: $(BINDIR)/$(CONFIG)/gen_hpack_tables +gen_legal_metadata_characters: $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters gpr_cmdline_test: $(BINDIR)/$(CONFIG)/gpr_cmdline_test gpr_env_test: $(BINDIR)/$(CONFIG)/gpr_env_test gpr_file_test: $(BINDIR)/$(CONFIG)/gpr_file_test @@ -3386,7 +3387,7 @@ test_python: static_c tools: tools_c tools_cxx -tools_c: privatelibs_c $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token $(BINDIR)/$(CONFIG)/grpc_verify_jwt +tools_c: privatelibs_c $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token $(BINDIR)/$(CONFIG)/grpc_verify_jwt tools_cxx: privatelibs_cxx @@ -7122,6 +7123,35 @@ endif endif +GEN_LEGAL_METADATA_CHARACTERS_SRC = \ + tools/codegen/core/gen_legal_metadata_characters.c \ + +GEN_LEGAL_METADATA_CHARACTERS_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GEN_LEGAL_METADATA_CHARACTERS_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: openssl_dep_error + +else + +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters + +endif + +$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_legal_metadata_characters.o: $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a +deps_gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(GEN_LEGAL_METADATA_CHARACTERS_OBJS:.o=.dep) +endif +endif + + GPR_CMDLINE_TEST_SRC = \ test/core/support/cmdline_test.c \ diff --git a/build.json b/build.json index bd707d2e34c..c6a670970ba 100644 --- a/build.json +++ b/build.json @@ -1143,6 +1143,16 @@ "grpc" ] }, + { + "name": "gen_legal_metadata_characters", + "build": "tool", + "language": "c", + "src": [ + "tools/codegen/core/gen_legal_metadata_characters.c" + ], + "deps": [ + ] + }, { "name": "gpr_cmdline_test", "build": "test", diff --git a/src/core/channel/compress_filter.h b/src/core/channel/compress_filter.h index 0917e81ca43..415459bca60 100644 --- a/src/core/channel/compress_filter.h +++ b/src/core/channel/compress_filter.h @@ -36,7 +36,7 @@ #include "src/core/channel/channel_stack.h" -#define GRPC_COMPRESS_REQUEST_ALGORITHM_KEY "internal:grpc-encoding-request" +#define GRPC_COMPRESS_REQUEST_ALGORITHM_KEY "grpc-internal-encoding-request" /** Compression filter for outgoing data. * diff --git a/src/core/surface/call.c b/src/core/surface/call.c index 33f277da46d..4426bbbce9f 100644 --- a/src/core/surface/call.c +++ b/src/core/surface/call.c @@ -1046,10 +1046,11 @@ static int prepare_application_metadata(grpc_call *call, size_t count, (const gpr_uint8 *)md->value, md->value_length, 1); if (!grpc_mdstr_is_legal_header(l->md->key)) { - gpr_log(GPR_ERROR, "attempt to send invalid metadata key"); + gpr_log(GPR_ERROR, "attempt to send invalid metadata key: %s", + grpc_mdstr_as_c_string(l->md->key)); return 0; } else if (!grpc_mdstr_is_bin_suffixed(l->md->key) && - !grpc_mdstr_is_legal_header(l->md->value)) { + !grpc_mdstr_is_legal_nonbin_header(l->md->value)) { gpr_log(GPR_ERROR, "attempt to send invalid metadata value"); return 0; } diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index f92e87e9ddd..d758351febc 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -681,16 +681,36 @@ void grpc_mdctx_locked_mdelem_unref(grpc_mdctx *ctx, void grpc_mdctx_unlock(grpc_mdctx *ctx) { unlock(ctx); } -int grpc_mdstr_is_legal_header(grpc_mdstr *s) { - /* TODO(ctiller): consider caching this, or computing it on construction */ +static int conforms_to(grpc_mdstr *s, const gpr_uint8 *legal_bits) { const gpr_uint8 *p = GPR_SLICE_START_PTR(s->slice); const gpr_uint8 *e = GPR_SLICE_END_PTR(s->slice); for (; p != e; p++) { - if (*p < 32 || *p > 126) return 0; + int idx = *p; + int byte = idx / 8; + int bit = idx % 8; + if ((legal_bits[byte] & (1 << bit)) == 0) return 0; } return 1; } +int grpc_mdstr_is_legal_header(grpc_mdstr *s) { + static const gpr_uint8 legal_header_bits[256 / 8] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0x03, 0xfe, 0xff, 0xff, + 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + /* TODO(ctiller): consider caching this, or computing it on construction */ + return conforms_to(s, legal_header_bits); +} + +int grpc_mdstr_is_legal_nonbin_header(grpc_mdstr *s) { + static const gpr_uint8 legal_header_bits[256 / 8] = { + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + return conforms_to(s, legal_header_bits); +} + int grpc_mdstr_is_bin_suffixed(grpc_mdstr *s) { /* TODO(ctiller): consider caching this */ return grpc_is_binary_header((const char *)GPR_SLICE_START_PTR(s->slice), diff --git a/src/core/transport/metadata.h b/src/core/transport/metadata.h index a7af49ba555..eb17747be74 100644 --- a/src/core/transport/metadata.h +++ b/src/core/transport/metadata.h @@ -154,6 +154,7 @@ void grpc_mdelem_unref(grpc_mdelem *md); const char *grpc_mdstr_as_c_string(grpc_mdstr *s); int grpc_mdstr_is_legal_header(grpc_mdstr *s); +int grpc_mdstr_is_legal_nonbin_header(grpc_mdstr *s); int grpc_mdstr_is_bin_suffixed(grpc_mdstr *s); /* Batch mode metadata functions. diff --git a/tools/codegen/core/gen_legal_metadata_characters.c b/tools/codegen/core/gen_legal_metadata_characters.c new file mode 100644 index 00000000000..5e32d91d50d --- /dev/null +++ b/tools/codegen/core/gen_legal_metadata_characters.c @@ -0,0 +1,73 @@ +/* + * + * Copyright 2015, 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. + * + */ + +/* generates constant table for metadata.c */ + +#include +#include + +static unsigned char legal_bits[256 / 8]; + +static void legal(int x) { + int byte = x / 8; + int bit = x % 8; + legal_bits[byte] |= 1 << bit; +} + +static void dump(void) { + int i; + + printf("static const gpr_uint8 legal_header_bits[256/8] = "); + for (i = 0; i < 256 / 8; i++) + printf("%c 0x%02x", i ? ',' : '{', legal_bits[i]); + printf(" };\n"); +} + +static void clear(void) { memset(legal_bits, 0, sizeof(legal_bits)); } + +int main(void) { + int i; + + clear(); + for (i = 'a'; i <= 'z'; i++) legal(i); + for (i = 'A'; i <= 'Z'; i++) legal(i); + for (i = '0'; i <= '9'; i++) legal(i); + legal('-'); + dump(); + + clear(); + for (i = 32; i <= 126; i++) legal(i); + dump(); + + return 0; +} diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 50f078586d1..142c84901da 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -237,6 +237,18 @@ "tools/codegen/core/gen_hpack_tables.c" ] }, + { + "deps": [ + "gpr", + "grpc" + ], + "headers": [], + "language": "c", + "name": "gen_legal_metadata_characters", + "src": [ + "tools/codegen/core/gen_legal_metadata_characters.c" + ] + }, { "deps": [ "gpr", diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 6c06d74834b..127b1dfc408 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -1538,6 +1538,7 @@ "posix", "windows" ], + "exclude_configs": [], "flaky": false, "language": "c++", "name": "status_test", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 662de784f72..3d853d9c760 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -183,6 +183,14 @@ gen_hpack_tables: gen_hpack_tables.exe echo Running gen_hpack_tables $(OUT_DIR)\gen_hpack_tables.exe +gen_legal_metadata_characters.exe: build_gpr build_grpc $(OUT_DIR) + echo Building gen_legal_metadata_characters + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\tools\codegen\core\gen_legal_metadata_characters.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_legal_metadata_characters.exe" Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_legal_metadata_characters.obj +gen_legal_metadata_characters: gen_legal_metadata_characters.exe + echo Running gen_legal_metadata_characters + $(OUT_DIR)\gen_legal_metadata_characters.exe + gpr_cmdline_test.exe: build_gpr_test_util build_gpr $(OUT_DIR) echo Building gpr_cmdline_test $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\core\support\cmdline_test.c From 80aa28013fb3290f69c0452116ab3dd0b95566cc Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 21 Aug 2015 08:50:51 -0700 Subject: [PATCH 30/79] Fix character classes to updated spec --- src/core/transport/metadata.c | 6 ++---- tools/codegen/core/gen_legal_metadata_characters.c | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c index d758351febc..3fd21a2f5dc 100644 --- a/src/core/transport/metadata.c +++ b/src/core/transport/metadata.c @@ -695,11 +695,9 @@ static int conforms_to(grpc_mdstr *s, const gpr_uint8 *legal_bits) { int grpc_mdstr_is_legal_header(grpc_mdstr *s) { static const gpr_uint8 legal_header_bits[256 / 8] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0x03, 0xfe, 0xff, 0xff, - 0x07, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0x03, 0x00, 0x00, 0x00, + 0x80, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - - /* TODO(ctiller): consider caching this, or computing it on construction */ return conforms_to(s, legal_header_bits); } diff --git a/tools/codegen/core/gen_legal_metadata_characters.c b/tools/codegen/core/gen_legal_metadata_characters.c index 5e32d91d50d..5c290f29232 100644 --- a/tools/codegen/core/gen_legal_metadata_characters.c +++ b/tools/codegen/core/gen_legal_metadata_characters.c @@ -60,9 +60,9 @@ int main(void) { clear(); for (i = 'a'; i <= 'z'; i++) legal(i); - for (i = 'A'; i <= 'Z'; i++) legal(i); for (i = '0'; i <= '9'; i++) legal(i); legal('-'); + legal('_'); dump(); clear(); From e09dc78e74f481dd06bf2f9ea643026f5e94bb5b Mon Sep 17 00:00:00 2001 From: Hongyu Chen Date: Fri, 21 Aug 2015 11:28:33 -0700 Subject: [PATCH 31/79] rename census_filter.{c,h} to grpc_filter.{c,h} --- BUILD | 12 ++++++------ Makefile | 4 ++-- build.json | 4 ++-- gRPC.podspec | 6 +++--- src/core/census/{census_filter.c => grpc_filter.c} | 2 +- src/core/census/{census_filter.h => grpc_filter.h} | 0 src/core/surface/channel_create.c | 2 +- src/core/surface/secure_channel_create.c | 2 +- src/core/surface/server.c | 2 +- tools/doxygen/Doxyfile.core.internal | 4 ++-- tools/run_tests/sources_and_headers.json | 12 ++++++------ vsprojects/grpc/grpc.vcxproj | 6 +++--- vsprojects/grpc/grpc.vcxproj.filters | 6 +++--- vsprojects/grpc_unsecure/grpc_unsecure.vcxproj | 6 +++--- .../grpc_unsecure/grpc_unsecure.vcxproj.filters | 6 +++--- 15 files changed, 37 insertions(+), 37 deletions(-) rename src/core/census/{census_filter.c => grpc_filter.c} (99%) rename src/core/census/{census_filter.h => grpc_filter.h} (100%) diff --git a/BUILD b/BUILD index ae98fe02ae0..043d38e1fcf 100644 --- a/BUILD +++ b/BUILD @@ -143,7 +143,7 @@ cc_library( "src/core/tsi/ssl_transport_security.h", "src/core/tsi/transport_security.h", "src/core/tsi/transport_security_interface.h", - "src/core/census/census_filter.h", + "src/core/census/grpc_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -266,8 +266,8 @@ cc_library( "src/core/tsi/fake_transport_security.c", "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", - "src/core/census/census_filter.c", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -410,7 +410,7 @@ cc_library( cc_library( name = "grpc_unsecure", srcs = [ - "src/core/census/census_filter.h", + "src/core/census/grpc_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -513,8 +513,8 @@ cc_library( "src/core/census/context.h", "src/core/census/rpc_stat_id.h", "src/core/surface/init_unsecure.c", - "src/core/census/census_filter.c", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -1018,8 +1018,8 @@ objc_library( "src/core/tsi/fake_transport_security.c", "src/core/tsi/ssl_transport_security.c", "src/core/tsi/transport_security.c", - "src/core/census/census_filter.c", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", @@ -1159,7 +1159,7 @@ objc_library( "src/core/tsi/ssl_transport_security.h", "src/core/tsi/transport_security.h", "src/core/tsi/transport_security_interface.h", - "src/core/census/census_filter.h", + "src/core/census/grpc_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", diff --git a/Makefile b/Makefile index 934c2c4863a..8bcdc79fde1 100644 --- a/Makefile +++ b/Makefile @@ -4080,8 +4080,8 @@ LIBGRPC_SRC = \ src/core/tsi/fake_transport_security.c \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ - src/core/census/census_filter.c \ src/core/census/grpc_context.c \ + src/core/census/grpc_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ @@ -4354,8 +4354,8 @@ endif LIBGRPC_UNSECURE_SRC = \ src/core/surface/init_unsecure.c \ - src/core/census/census_filter.c \ src/core/census/grpc_context.c \ + src/core/census/grpc_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/build.json b/build.json index a0c9c8dfd86..70dec998ec9 100644 --- a/build.json +++ b/build.json @@ -114,7 +114,7 @@ "include/grpc/status.h" ], "headers": [ - "src/core/census/census_filter.h", + "src/core/census/grpc_filter.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", "src/core/channel/client_channel.h", @@ -216,8 +216,8 @@ "src/core/transport/transport_impl.h" ], "src": [ - "src/core/census/census_filter.c", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", "src/core/channel/channel_args.c", "src/core/channel/channel_stack.c", "src/core/channel/client_channel.c", diff --git a/gRPC.podspec b/gRPC.podspec index 6878f5937b1..0e826b5ba24 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -145,7 +145,7 @@ Pod::Spec.new do |s| 'src/core/tsi/ssl_transport_security.h', 'src/core/tsi/transport_security.h', 'src/core/tsi/transport_security_interface.h', - 'src/core/census/census_filter.h', + 'src/core/census/grpc_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/client_channel.h', @@ -275,8 +275,8 @@ Pod::Spec.new do |s| 'src/core/tsi/fake_transport_security.c', 'src/core/tsi/ssl_transport_security.c', 'src/core/tsi/transport_security.c', - 'src/core/census/census_filter.c', 'src/core/census/grpc_context.c', + 'src/core/census/grpc_filter.c', 'src/core/channel/channel_args.c', 'src/core/channel/channel_stack.c', 'src/core/channel/client_channel.c', @@ -415,7 +415,7 @@ Pod::Spec.new do |s| 'src/core/tsi/ssl_transport_security.h', 'src/core/tsi/transport_security.h', 'src/core/tsi/transport_security_interface.h', - 'src/core/census/census_filter.h', + 'src/core/census/grpc_filter.h', 'src/core/channel/channel_args.h', 'src/core/channel/channel_stack.h', 'src/core/channel/client_channel.h', diff --git a/src/core/census/census_filter.c b/src/core/census/grpc_filter.c similarity index 99% rename from src/core/census/census_filter.c rename to src/core/census/grpc_filter.c index 31db686cf37..fbedb35661f 100644 --- a/src/core/census/census_filter.c +++ b/src/core/census/grpc_filter.c @@ -31,7 +31,7 @@ * */ -#include "src/core/census/census_filter.h" +#include "src/core/census/grpc_filter.h" #include #include diff --git a/src/core/census/census_filter.h b/src/core/census/grpc_filter.h similarity index 100% rename from src/core/census/census_filter.h rename to src/core/census/grpc_filter.h diff --git a/src/core/surface/channel_create.c b/src/core/surface/channel_create.c index 1b3707a091a..707251da895 100644 --- a/src/core/surface/channel_create.c +++ b/src/core/surface/channel_create.c @@ -38,7 +38,7 @@ #include -#include "src/core/census/census_filter.h" +#include "src/core/census/grpc_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" diff --git a/src/core/surface/secure_channel_create.c b/src/core/surface/secure_channel_create.c index cf204e112b8..eccee246980 100644 --- a/src/core/surface/secure_channel_create.c +++ b/src/core/surface/secure_channel_create.c @@ -38,7 +38,7 @@ #include -#include "src/core/census/census_filter.h" +#include "src/core/census/grpc_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/client_channel.h" #include "src/core/channel/compress_filter.h" diff --git a/src/core/surface/server.c b/src/core/surface/server.c index 145fa6ee1ac..292bf6fab82 100644 --- a/src/core/surface/server.c +++ b/src/core/surface/server.c @@ -41,7 +41,7 @@ #include #include -#include "src/core/census/census_filter.h" +#include "src/core/census/grpc_filter.h" #include "src/core/channel/channel_args.h" #include "src/core/channel/connected_channel.h" #include "src/core/iomgr/iomgr.h" diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 5b0abc571bf..d27c5d9246a 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -780,7 +780,7 @@ src/core/tsi/fake_transport_security.h \ src/core/tsi/ssl_transport_security.h \ src/core/tsi/transport_security.h \ src/core/tsi/transport_security_interface.h \ -src/core/census/census_filter.h \ +src/core/census/grpc_filter.h \ src/core/channel/channel_args.h \ src/core/channel/channel_stack.h \ src/core/channel/client_channel.h \ @@ -903,8 +903,8 @@ src/core/surface/secure_channel_create.c \ src/core/tsi/fake_transport_security.c \ src/core/tsi/ssl_transport_security.c \ src/core/tsi/transport_security.c \ -src/core/census/census_filter.c \ src/core/census/grpc_context.c \ +src/core/census/grpc_filter.c \ src/core/channel/channel_args.c \ src/core/channel/channel_stack.c \ src/core/channel/client_channel.c \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index c7e5af6e712..97659c11a6c 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -12269,8 +12269,8 @@ "include/grpc/grpc.h", "include/grpc/grpc_security.h", "include/grpc/status.h", - "src/core/census/census_filter.h", "src/core/census/context.h", + "src/core/census/grpc_filter.h", "src/core/census/rpc_stat_id.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", @@ -12395,11 +12395,11 @@ "include/grpc/grpc.h", "include/grpc/grpc_security.h", "include/grpc/status.h", - "src/core/census/census_filter.c", - "src/core/census/census_filter.h", "src/core/census/context.c", "src/core/census/context.h", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", + "src/core/census/grpc_filter.h", "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", @@ -12744,8 +12744,8 @@ "include/grpc/compression.h", "include/grpc/grpc.h", "include/grpc/status.h", - "src/core/census/census_filter.h", "src/core/census/context.h", + "src/core/census/grpc_filter.h", "src/core/census/rpc_stat_id.h", "src/core/channel/channel_args.h", "src/core/channel/channel_stack.h", @@ -12856,11 +12856,11 @@ "include/grpc/compression.h", "include/grpc/grpc.h", "include/grpc/status.h", - "src/core/census/census_filter.c", - "src/core/census/census_filter.h", "src/core/census/context.c", "src/core/census/context.h", "src/core/census/grpc_context.c", + "src/core/census/grpc_filter.c", + "src/core/census/grpc_filter.h", "src/core/census/initialize.c", "src/core/census/record_stat.c", "src/core/census/rpc_stat_id.h", diff --git a/vsprojects/grpc/grpc.vcxproj b/vsprojects/grpc/grpc.vcxproj index aacf42d3738..500cf9feb50 100644 --- a/vsprojects/grpc/grpc.vcxproj +++ b/vsprojects/grpc/grpc.vcxproj @@ -242,7 +242,7 @@ - + @@ -388,10 +388,10 @@ - - + + diff --git a/vsprojects/grpc/grpc.vcxproj.filters b/vsprojects/grpc/grpc.vcxproj.filters index 40551bf3e7f..02060b7830e 100644 --- a/vsprojects/grpc/grpc.vcxproj.filters +++ b/vsprojects/grpc/grpc.vcxproj.filters @@ -64,10 +64,10 @@ src\core\tsi - + src\core\census - + src\core\census @@ -485,7 +485,7 @@ src\core\tsi - + src\core\census diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj index 004565b6da1..13c018c020f 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj @@ -225,7 +225,7 @@ - + @@ -331,10 +331,10 @@ - - + + diff --git a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters index f2fa4338815..5adcdd60926 100644 --- a/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -4,10 +4,10 @@ src\core\surface - + src\core\census - + src\core\census @@ -383,7 +383,7 @@ - + src\core\census From f36e1b74b5b20f80439b6204389f8d2a9e8d761c Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Tue, 18 Aug 2015 01:30:29 +0000 Subject: [PATCH 32/79] The RPC Framework core package. This is the second generation of the old base package (framework.base) and implements the translation between the new links and base interfaces. --- .../grpcio/grpc/framework/core/__init__.py | 30 ++ .../grpcio/grpc/framework/core/_constants.py | 59 +++ .../grpcio/grpc/framework/core/_context.py | 92 ++++ .../grpcio/grpc/framework/core/_emission.py | 97 +++++ src/python/grpcio/grpc/framework/core/_end.py | 251 +++++++++++ .../grpcio/grpc/framework/core/_expiration.py | 152 +++++++ .../grpcio/grpc/framework/core/_ingestion.py | 410 ++++++++++++++++++ .../grpcio/grpc/framework/core/_interfaces.py | 308 +++++++++++++ .../grpcio/grpc/framework/core/_operation.py | 192 ++++++++ .../grpcio/grpc/framework/core/_reception.py | 137 ++++++ .../grpc/framework/core/_termination.py | 212 +++++++++ .../grpc/framework/core/_transmission.py | 294 +++++++++++++ .../grpcio/grpc/framework/core/_utilities.py | 46 ++ .../grpc/framework/core/implementations.py | 62 +++ .../grpc/framework/interfaces/base/base.py | 39 +- .../grpc/framework/interfaces/links/links.py | 2 +- .../_core_over_links_base_interface_test.py | 165 +++++++ .../grpc_test/framework/core/__init__.py | 30 ++ .../framework/core/_base_interface_test.py | 96 ++++ .../framework/interfaces/base/test_cases.py | 6 +- .../interfaces/links/test_utilities.py | 101 +++++ 21 files changed, 2767 insertions(+), 14 deletions(-) create mode 100644 src/python/grpcio/grpc/framework/core/__init__.py create mode 100644 src/python/grpcio/grpc/framework/core/_constants.py create mode 100644 src/python/grpcio/grpc/framework/core/_context.py create mode 100644 src/python/grpcio/grpc/framework/core/_emission.py create mode 100644 src/python/grpcio/grpc/framework/core/_end.py create mode 100644 src/python/grpcio/grpc/framework/core/_expiration.py create mode 100644 src/python/grpcio/grpc/framework/core/_ingestion.py create mode 100644 src/python/grpcio/grpc/framework/core/_interfaces.py create mode 100644 src/python/grpcio/grpc/framework/core/_operation.py create mode 100644 src/python/grpcio/grpc/framework/core/_reception.py create mode 100644 src/python/grpcio/grpc/framework/core/_termination.py create mode 100644 src/python/grpcio/grpc/framework/core/_transmission.py create mode 100644 src/python/grpcio/grpc/framework/core/_utilities.py create mode 100644 src/python/grpcio/grpc/framework/core/implementations.py create mode 100644 src/python/grpcio_test/grpc_test/_core_over_links_base_interface_test.py create mode 100644 src/python/grpcio_test/grpc_test/framework/core/__init__.py create mode 100644 src/python/grpcio_test/grpc_test/framework/core/_base_interface_test.py diff --git a/src/python/grpcio/grpc/framework/core/__init__.py b/src/python/grpcio/grpc/framework/core/__init__.py new file mode 100644 index 00000000000..70865191060 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2015, 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. + + diff --git a/src/python/grpcio/grpc/framework/core/_constants.py b/src/python/grpcio/grpc/framework/core/_constants.py new file mode 100644 index 00000000000..d3be3a4c4a5 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_constants.py @@ -0,0 +1,59 @@ +# Copyright 2015, 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. + +"""Private constants for the package.""" + +from grpc.framework.interfaces.base import base +from grpc.framework.interfaces.links import links + +TICKET_SUBSCRIPTION_FOR_BASE_SUBSCRIPTION_KIND = { + base.Subscription.Kind.NONE: links.Ticket.Subscription.NONE, + base.Subscription.Kind.TERMINATION_ONLY: + links.Ticket.Subscription.TERMINATION, + base.Subscription.Kind.FULL: links.Ticket.Subscription.FULL, + } + +# Mapping from abortive operation outcome to ticket termination to be +# sent to the other side of the operation, or None to indicate that no +# ticket should be sent to the other side in the event of such an +# outcome. +ABORTION_OUTCOME_TO_TICKET_TERMINATION = { + base.Outcome.CANCELLED: links.Ticket.Termination.CANCELLATION, + base.Outcome.EXPIRED: links.Ticket.Termination.EXPIRATION, + base.Outcome.LOCAL_SHUTDOWN: links.Ticket.Termination.SHUTDOWN, + base.Outcome.REMOTE_SHUTDOWN: None, + base.Outcome.RECEPTION_FAILURE: links.Ticket.Termination.RECEPTION_FAILURE, + base.Outcome.TRANSMISSION_FAILURE: None, + base.Outcome.LOCAL_FAILURE: links.Ticket.Termination.LOCAL_FAILURE, + base.Outcome.REMOTE_FAILURE: links.Ticket.Termination.REMOTE_FAILURE, +} + +INTERNAL_ERROR_LOG_MESSAGE = ':-( RPC Framework (Core) internal error! )-:' +TERMINATION_CALLBACK_EXCEPTION_LOG_MESSAGE = ( + 'Exception calling termination callback!') diff --git a/src/python/grpcio/grpc/framework/core/_context.py b/src/python/grpcio/grpc/framework/core/_context.py new file mode 100644 index 00000000000..24a12b612e5 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_context.py @@ -0,0 +1,92 @@ +# Copyright 2015, 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. + +"""State and behavior for operation context.""" + +import time + +# _interfaces is referenced from specification in this module. +from grpc.framework.core import _interfaces # pylint: disable=unused-import +from grpc.framework.interfaces.base import base + + +class OperationContext(base.OperationContext): + """An implementation of interfaces.OperationContext.""" + + def __init__( + self, lock, termination_manager, transmission_manager, + expiration_manager): + """Constructor. + + Args: + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + """ + self._lock = lock + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._expiration_manager = expiration_manager + + def _abort(self, outcome): + with self._lock: + if self._termination_manager.outcome is None: + self._termination_manager.abort(outcome) + self._transmission_manager.abort(outcome) + self._expiration_manager.terminate() + + def outcome(self): + """See base.OperationContext.outcome for specification.""" + with self._lock: + return self._termination_manager.outcome + + def add_termination_callback(self, callback): + """See base.OperationContext.add_termination_callback.""" + with self._lock: + if self._termination_manager.outcome is None: + self._termination_manager.add_callback(callback) + return None + else: + return self._termination_manager.outcome + + def time_remaining(self): + """See base.OperationContext.time_remaining for specification.""" + with self._lock: + deadline = self._expiration_manager.deadline() + return max(0.0, deadline - time.time()) + + def cancel(self): + """See base.OperationContext.cancel for specification.""" + self._abort(base.Outcome.CANCELLED) + + def fail(self, exception): + """See base.OperationContext.fail for specification.""" + self._abort(base.Outcome.LOCAL_FAILURE) diff --git a/src/python/grpcio/grpc/framework/core/_emission.py b/src/python/grpcio/grpc/framework/core/_emission.py new file mode 100644 index 00000000000..7c702ab2ce0 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_emission.py @@ -0,0 +1,97 @@ +# Copyright 2015, 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. + +"""State and behavior for handling emitted values.""" + +from grpc.framework.core import _interfaces +from grpc.framework.interfaces.base import base + + +class EmissionManager(_interfaces.EmissionManager): + """An EmissionManager implementation.""" + + def __init__( + self, lock, termination_manager, transmission_manager, + expiration_manager): + """Constructor. + + Args: + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + """ + self._lock = lock + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._expiration_manager = expiration_manager + self._ingestion_manager = None + + self._initial_metadata_seen = False + self._payload_seen = False + self._completion_seen = False + + def set_ingestion_manager(self, ingestion_manager): + """Sets the ingestion manager with which this manager will cooperate. + + Args: + ingestion_manager: The _interfaces.IngestionManager for the operation. + """ + self._ingestion_manager = ingestion_manager + + def advance( + self, initial_metadata=None, payload=None, completion=None, + allowance=None): + initial_metadata_present = initial_metadata is not None + payload_present = payload is not None + completion_present = completion is not None + allowance_present = allowance is not None + with self._lock: + if self._termination_manager.outcome is None: + if (initial_metadata_present and ( + self._initial_metadata_seen or self._payload_seen or + self._completion_seen) or + payload_present and self._completion_seen or + completion_present and self._completion_seen or + allowance_present and allowance <= 0): + self._termination_manager.abort(base.Outcome.LOCAL_FAILURE) + self._transmission_manager.abort(base.Outcome.LOCAL_FAILURE) + self._expiration_manager.terminate() + else: + self._initial_metadata_seen |= initial_metadata_present + self._payload_seen |= payload_present + self._completion_seen |= completion_present + if completion_present: + self._termination_manager.emission_complete() + self._ingestion_manager.local_emissions_done() + self._transmission_manager.advance( + initial_metadata, payload, completion, allowance) + if allowance_present: + self._ingestion_manager.add_local_allowance(allowance) diff --git a/src/python/grpcio/grpc/framework/core/_end.py b/src/python/grpcio/grpc/framework/core/_end.py new file mode 100644 index 00000000000..fb2c532df61 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_end.py @@ -0,0 +1,251 @@ +# Copyright 2015, 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. + +"""Implementation of base.End.""" + +import abc +import enum +import threading +import uuid + +from grpc.framework.core import _operation +from grpc.framework.core import _utilities +from grpc.framework.foundation import callable_util +from grpc.framework.foundation import later +from grpc.framework.foundation import logging_pool +from grpc.framework.interfaces.base import base +from grpc.framework.interfaces.links import links +from grpc.framework.interfaces.links import utilities + +_IDLE_ACTION_EXCEPTION_LOG_MESSAGE = 'Exception calling idle action!' + + +class End(base.End, links.Link): + """A bridge between base.End and links.Link. + + Implementations of this interface translate arriving tickets into + calls on application objects implementing base interfaces and + translate calls from application objects implementing base interfaces + into tickets sent to a joined link. + """ + __metaclass__ = abc.ABCMeta + + +class _Cycle(object): + """State for a single start-stop End lifecycle.""" + + def __init__(self, pool): + self.pool = pool + self.grace = False + self.futures = [] + self.operations = {} + self.idle_actions = [] + + +def _abort(operations): + for operation in operations: + operation.abort(base.Outcome.LOCAL_SHUTDOWN) + + +def _cancel_futures(futures): + for future in futures: + futures.cancel() + + +def _future_shutdown(lock, cycle, event): + def in_future(): + with lock: + _abort(cycle.operations.values()) + _cancel_futures(cycle.futures) + pool = cycle.pool + cycle.pool.shutdown(wait=True) + return in_future + + +def _termination_action(lock, stats, operation_id, cycle): + """Constructs the termination action for a single operation. + + Args: + lock: A lock to hold during the termination action. + states: A mapping from base.Outcome values to integers to increment with + the outcome given to the termination action. + operation_id: The operation ID for the termination action. + cycle: A _Cycle value to be updated during the termination action. + + Returns: + A callable that takes an operation outcome as its sole parameter and that + should be used as the termination action for the operation associated + with the given operation ID. + """ + def termination_action(outcome): + with lock: + stats[outcome] += 1 + cycle.operations.pop(operation_id, None) + if not cycle.operations: + for action in cycle.idle_actions: + cycle.pool.submit(action) + cycle.idle_actions = [] + if cycle.grace: + _cancel_futures(cycle.futures) + return termination_action + + +class _End(End): + """An End implementation.""" + + def __init__(self, servicer_package): + """Constructor. + + Args: + servicer_package: A _ServicerPackage for servicing operations or None if + this end will not be used to service operations. + """ + self._lock = threading.Condition() + self._servicer_package = servicer_package + + self._stats = {outcome: 0 for outcome in base.Outcome} + + self._mate = None + + self._cycle = None + + def start(self): + """See base.End.start for specification.""" + with self._lock: + if self._cycle is not None: + raise ValueError('Tried to start a not-stopped End!') + else: + self._cycle = _Cycle(logging_pool.pool(1)) + + def stop(self, grace): + """See base.End.stop for specification.""" + with self._lock: + if self._cycle is None: + event = threading.Event() + event.set() + return event + elif not self._cycle.operations: + event = threading.Event() + self._cycle.pool.submit(event.set) + self._cycle.pool.shutdown(wait=False) + self._cycle = None + return event + else: + self._cycle.grace = True + event = threading.Event() + self._cycle.idle_actions.append(event.set) + if 0 < grace: + future = later.later( + grace, _future_shutdown(self._lock, self._cycle, event)) + self._cycle.futures.append(future) + else: + _abort(self._cycle.operations.values()) + return event + + def operate( + self, group, method, subscription, timeout, initial_metadata=None, + payload=None, completion=None): + """See base.End.operate for specification.""" + operation_id = uuid.uuid4() + with self._lock: + if self._cycle is None or self._cycle.grace: + raise ValueError('Can\'t operate on stopped or stopping End!') + termination_action = _termination_action( + self._lock, self._stats, operation_id, self._cycle) + operation = _operation.invocation_operate( + operation_id, group, method, subscription, timeout, initial_metadata, + payload, completion, self._mate.accept_ticket, termination_action, + self._cycle.pool) + self._cycle.operations[operation_id] = operation + return operation.context, operation.operator + + def operation_stats(self): + """See base.End.operation_stats for specification.""" + with self._lock: + return dict(self._stats) + + def add_idle_action(self, action): + """See base.End.add_idle_action for specification.""" + with self._lock: + if self._cycle is None: + raise ValueError('Can\'t add idle action to stopped End!') + action_with_exceptions_logged = callable_util.with_exceptions_logged( + action, _IDLE_ACTION_EXCEPTION_LOG_MESSAGE) + if self._cycle.operations: + self._cycle.idle_actions.append(action_with_exceptions_logged) + else: + self._cycle.pool.submit(action_with_exceptions_logged) + + def accept_ticket(self, ticket): + """See links.Link.accept_ticket for specification.""" + with self._lock: + if self._cycle is not None and not self._cycle.grace: + operation = self._cycle.operations.get(ticket.operation_id) + if operation is not None: + operation.handle_ticket(ticket) + elif self._servicer_package is not None: + termination_action = _termination_action( + self._lock, self._stats, ticket.operation_id, self._cycle) + operation = _operation.service_operate( + self._servicer_package, ticket, self._mate.accept_ticket, + termination_action, self._cycle.pool) + if operation is not None: + self._cycle.operations[ticket.operation_id] = operation + + def join_link(self, link): + """See links.Link.join_link for specification.""" + with self._lock: + self._mate = utilities.NULL_LINK if link is None else link + + +def serviceless_end_link(): + """Constructs an End usable only for invoking operations. + + Returns: + An End usable for translating operations into ticket exchange. + """ + return _End(None) + + +def serviceful_end_link(servicer, default_timeout, maximum_timeout): + """Constructs an End capable of servicing operations. + + Args: + servicer: An interfaces.Servicer for servicing operations. + default_timeout: A length of time in seconds to be used as the default + time alloted for a single operation. + maximum_timeout: A length of time in seconds to be used as the maximum + time alloted for a single operation. + + Returns: + An End capable of servicing the operations requested of it through ticket + exchange. + """ + return _End( + _utilities.ServicerPackage(servicer, default_timeout, maximum_timeout)) diff --git a/src/python/grpcio/grpc/framework/core/_expiration.py b/src/python/grpcio/grpc/framework/core/_expiration.py new file mode 100644 index 00000000000..d94bdf2d2b7 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_expiration.py @@ -0,0 +1,152 @@ +# Copyright 2015, 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. + +"""State and behavior for operation expiration.""" + +import time + +from grpc.framework.core import _interfaces +from grpc.framework.foundation import later +from grpc.framework.interfaces.base import base + + +class _ExpirationManager(_interfaces.ExpirationManager): + """An implementation of _interfaces.ExpirationManager.""" + + def __init__( + self, commencement, timeout, maximum_timeout, lock, termination_manager, + transmission_manager): + """Constructor. + + Args: + commencement: The time in seconds since the epoch at which the operation + began. + timeout: A length of time in seconds to allow for the operation to run. + maximum_timeout: The maximum length of time in seconds to allow for the + operation to run despite what is requested via this object's + change_timout method. + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + """ + self._lock = lock + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._commencement = commencement + self._maximum_timeout = maximum_timeout + + self._timeout = timeout + self._deadline = commencement + timeout + self._index = None + self._future = None + + def _expire(self, index): + def expire(): + with self._lock: + if self._future is not None and index == self._index: + self._future = None + self._termination_manager.expire() + self._transmission_manager.abort(base.Outcome.EXPIRED) + return expire + + def start(self): + self._index = 0 + self._future = later.later(self._timeout, self._expire(0)) + + def change_timeout(self, timeout): + if self._future is not None and timeout != self._timeout: + self._future.cancel() + new_timeout = min(timeout, self._maximum_timeout) + new_index = self._index + 1 + self._timeout = new_timeout + self._deadline = self._commencement + new_timeout + self._index = new_index + delay = self._deadline - time.time() + self._future = later.later(delay, self._expire(new_index)) + if new_timeout != timeout: + self._transmission_manager.timeout(new_timeout) + + def deadline(self): + return self._deadline + + def terminate(self): + if self._future: + self._future.cancel() + self._future = None + self._deadline_index = None + + +def invocation_expiration_manager( + timeout, lock, termination_manager, transmission_manager): + """Creates an _interfaces.ExpirationManager appropriate for front-side use. + + Args: + timeout: A length of time in seconds to allow for the operation to run. + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + + Returns: + An _interfaces.ExpirationManager appropriate for invocation-side use. + """ + expiration_manager = _ExpirationManager( + time.time(), timeout, timeout, lock, termination_manager, + transmission_manager) + expiration_manager.start() + return expiration_manager + + +def service_expiration_manager( + timeout, default_timeout, maximum_timeout, lock, termination_manager, + transmission_manager): + """Creates an _interfaces.ExpirationManager appropriate for back-side use. + + Args: + timeout: A length of time in seconds to allow for the operation to run. May + be None in which case default_timeout will be used. + default_timeout: The default length of time in seconds to allow for the + operation to run if the front-side customer has not specified such a value + (or if the value they specified is not yet known). + maximum_timeout: The maximum length of time in seconds to allow for the + operation to run. + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + + Returns: + An _interfaces.ExpirationManager appropriate for service-side use. + """ + expiration_manager = _ExpirationManager( + time.time(), default_timeout if timeout is None else timeout, + maximum_timeout, lock, termination_manager, transmission_manager) + expiration_manager.start() + return expiration_manager diff --git a/src/python/grpcio/grpc/framework/core/_ingestion.py b/src/python/grpcio/grpc/framework/core/_ingestion.py new file mode 100644 index 00000000000..59f7f8adc86 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_ingestion.py @@ -0,0 +1,410 @@ +# Copyright 2015, 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. + +"""State and behavior for ingestion during an operation.""" + +import abc +import collections + +from grpc.framework.core import _constants +from grpc.framework.core import _interfaces +from grpc.framework.foundation import abandonment +from grpc.framework.foundation import callable_util +from grpc.framework.interfaces.base import base + +_CREATE_SUBSCRIPTION_EXCEPTION_LOG_MESSAGE = 'Exception initializing ingestion!' +_INGESTION_EXCEPTION_LOG_MESSAGE = 'Exception during ingestion!' + + +class _SubscriptionCreation(collections.namedtuple( + '_SubscriptionCreation', ('subscription', 'remote_error', 'abandoned'))): + """A sum type for the outcome of ingestion initialization. + + Either subscription will be non-None, remote_error will be True, or abandoned + will be True. + + Attributes: + subscription: A base.Subscription describing the customer's interest in + operation values from the other side. + remote_error: A boolean indicating that the subscription could not be + created due to an error on the remote side of the operation. + abandoned: A boolean indicating that subscription creation was abandoned. + """ + + +class _SubscriptionCreator(object): + """Common specification of subscription-creating behavior.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def create(self, group, method): + """Creates the base.Subscription of the local customer. + + Any exceptions raised by this method should be attributed to and treated as + defects in the customer code called by this method. + + Args: + group: The group identifier of the operation. + method: The method identifier of the operation. + + Returns: + A _SubscriptionCreation describing the result of subscription creation. + """ + raise NotImplementedError() + + +class _ServiceSubscriptionCreator(_SubscriptionCreator): + """A _SubscriptionCreator appropriate for service-side use.""" + + def __init__(self, servicer, operation_context, output_operator): + """Constructor. + + Args: + servicer: The base.Servicer that will service the operation. + operation_context: A base.OperationContext for the operation to be passed + to the customer. + output_operator: A base.Operator for the operation to be passed to the + customer and to be called by the customer to accept operation data + emitted by the customer. + """ + self._servicer = servicer + self._operation_context = operation_context + self._output_operator = output_operator + + def create(self, group, method): + try: + subscription = self._servicer.service( + group, method, self._operation_context, self._output_operator) + except base.NoSuchMethodError: + return _SubscriptionCreation(None, True, False) + except abandonment.Abandoned: + return _SubscriptionCreation(None, False, True) + else: + return _SubscriptionCreation(subscription, False, False) + + +def _wrap(behavior): + def wrapped(*args, **kwargs): + try: + behavior(*args, **kwargs) + except abandonment.Abandoned: + return False + else: + return True + return wrapped + + +class _IngestionManager(_interfaces.IngestionManager): + """An implementation of _interfaces.IngestionManager.""" + + def __init__( + self, lock, pool, subscription, subscription_creator, termination_manager, + transmission_manager, expiration_manager): + """Constructor. + + Args: + lock: The operation-wide lock. + pool: A thread pool in which to execute customer code. + subscription: A base.Subscription describing the customer's interest in + operation values from the other side. May be None if + subscription_creator is not None. + subscription_creator: A _SubscriptionCreator wrapping the portion of + customer code that when called returns the base.Subscription describing + the customer's interest in operation values from the other side. May be + None if subscription is not None. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + """ + self._lock = lock + self._pool = pool + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._expiration_manager = expiration_manager + + if subscription is None: + self._subscription_creator = subscription_creator + self._wrapped_operator = None + elif subscription.kind is base.Subscription.Kind.FULL: + self._subscription_creator = None + self._wrapped_operator = _wrap(subscription.operator.advance) + else: + # TODO(nathaniel): Support other subscriptions. + raise ValueError('Unsupported subscription "%s"!' % subscription.kind) + self._pending_initial_metadata = None + self._pending_payloads = [] + self._pending_completion = None + self._local_allowance = 1 + # A nonnegative integer or None, with None indicating that the local + # customer is done emitting anyway so there's no need to bother it by + # informing it that the remote customer has granted it further permission to + # emit. + self._remote_allowance = 0 + self._processing = False + + def _abort_internal_only(self): + self._subscription_creator = None + self._wrapped_operator = None + self._pending_initial_metadata = None + self._pending_payloads = None + self._pending_completion = None + + def _abort_and_notify(self, outcome): + self._abort_internal_only() + self._termination_manager.abort(outcome) + self._transmission_manager.abort(outcome) + self._expiration_manager.terminate() + + def _operator_next(self): + """Computes the next step for full-subscription ingestion. + + Returns: + An initial_metadata, payload, completion, allowance, continue quintet + indicating what operation values (if any) are available to pass into + customer code and whether or not there is anything immediately + actionable to call customer code to do. + """ + if self._wrapped_operator is None: + return None, None, None, None, False + else: + initial_metadata, payload, completion, allowance, action = [None] * 5 + if self._pending_initial_metadata is not None: + initial_metadata = self._pending_initial_metadata + self._pending_initial_metadata = None + action = True + if self._pending_payloads and 0 < self._local_allowance: + payload = self._pending_payloads.pop(0) + self._local_allowance -= 1 + action = True + if not self._pending_payloads and self._pending_completion is not None: + completion = self._pending_completion + self._pending_completion = None + action = True + if self._remote_allowance is not None and 0 < self._remote_allowance: + allowance = self._remote_allowance + self._remote_allowance = 0 + action = True + return initial_metadata, payload, completion, allowance, bool(action) + + def _operator_process( + self, wrapped_operator, initial_metadata, payload, + completion, allowance): + while True: + advance_outcome = callable_util.call_logging_exceptions( + wrapped_operator, _INGESTION_EXCEPTION_LOG_MESSAGE, + initial_metadata=initial_metadata, payload=payload, + completion=completion, allowance=allowance) + if advance_outcome.exception is None: + if advance_outcome.return_value: + with self._lock: + if self._termination_manager.outcome is not None: + return + if completion is not None: + self._termination_manager.ingestion_complete() + initial_metadata, payload, completion, allowance, moar = ( + self._operator_next()) + if not moar: + self._processing = False + return + else: + with self._lock: + if self._termination_manager.outcome is None: + self._abort_and_notify(base.Outcome.LOCAL_FAILURE) + return + else: + with self._lock: + if self._termination_manager.outcome is None: + self._abort_and_notify(base.Outcome.LOCAL_FAILURE) + return + + def _operator_post_create(self, subscription): + wrapped_operator = _wrap(subscription.operator.advance) + with self._lock: + if self._termination_manager.outcome is not None: + return + self._wrapped_operator = wrapped_operator + self._subscription_creator = None + metadata, payload, completion, allowance, moar = self._operator_next() + if not moar: + self._processing = False + return + self._operator_process( + wrapped_operator, metadata, payload, completion, allowance) + + def _create(self, subscription_creator, group, name): + outcome = callable_util.call_logging_exceptions( + subscription_creator.create, _CREATE_SUBSCRIPTION_EXCEPTION_LOG_MESSAGE, + group, name) + if outcome.return_value is None: + with self._lock: + if self._termination_manager.outcome is None: + self._abort_and_notify(base.Outcome.LOCAL_FAILURE) + elif outcome.return_value.abandoned: + with self._lock: + if self._termination_manager.outcome is None: + self._abort_and_notify(base.Outcome.LOCAL_FAILURE) + elif outcome.return_value.remote_error: + with self._lock: + if self._termination_manager.outcome is None: + self._abort_and_notify(base.Outcome.REMOTE_FAILURE) + elif outcome.return_value.subscription.kind is base.Subscription.Kind.FULL: + self._operator_post_create(outcome.return_value.subscription) + else: + # TODO(nathaniel): Support other subscriptions. + raise ValueError( + 'Unsupported "%s"!' % outcome.return_value.subscription.kind) + + def _store_advance(self, initial_metadata, payload, completion, allowance): + if initial_metadata is not None: + self._pending_initial_metadata = initial_metadata + if payload is not None: + self._pending_payloads.append(payload) + if completion is not None: + self._pending_completion = completion + if allowance is not None and self._remote_allowance is not None: + self._remote_allowance += allowance + + def _operator_advance(self, initial_metadata, payload, completion, allowance): + if self._processing: + self._store_advance(initial_metadata, payload, completion, allowance) + else: + action = False + if initial_metadata is not None: + action = True + if payload is not None: + if 0 < self._local_allowance: + self._local_allowance -= 1 + action = True + else: + self._pending_payloads.append(payload) + payload = False + if completion is not None: + if self._pending_payloads: + self._pending_completion = completion + else: + action = True + if allowance is not None and self._remote_allowance is not None: + allowance += self._remote_allowance + self._remote_allowance = 0 + action = True + if action: + self._pool.submit( + callable_util.with_exceptions_logged( + self._operator_process, _constants.INTERNAL_ERROR_LOG_MESSAGE), + self._wrapped_operator, initial_metadata, payload, completion, + allowance) + + def set_group_and_method(self, group, method): + """See _interfaces.IngestionManager.set_group_and_method for spec.""" + if self._subscription_creator is not None and not self._processing: + self._pool.submit( + callable_util.with_exceptions_logged( + self._create, _constants.INTERNAL_ERROR_LOG_MESSAGE), + self._subscription_creator, group, method) + self._processing = True + + def add_local_allowance(self, allowance): + """See _interfaces.IngestionManager.add_local_allowance for spec.""" + if any((self._subscription_creator, self._wrapped_operator,)): + self._local_allowance += allowance + if not self._processing: + initial_metadata, payload, completion, allowance, moar = ( + self._operator_next()) + if moar: + self._pool.submit( + callable_util.with_exceptions_logged( + self._operator_process, + _constants.INTERNAL_ERROR_LOG_MESSAGE), + initial_metadata, payload, completion, allowance) + + def local_emissions_done(self): + self._remote_allowance = None + + def advance(self, initial_metadata, payload, completion, allowance): + """See _interfaces.IngestionManager.advance for specification.""" + if self._subscription_creator is not None: + self._store_advance(initial_metadata, payload, completion, allowance) + elif self._wrapped_operator is not None: + self._operator_advance(initial_metadata, payload, completion, allowance) + + +def invocation_ingestion_manager( + subscription, lock, pool, termination_manager, transmission_manager, + expiration_manager): + """Creates an IngestionManager appropriate for invocation-side use. + + Args: + subscription: A base.Subscription indicating the customer's interest in the + data and results from the service-side of the operation. + lock: The operation-wide lock. + pool: A thread pool in which to execute customer code. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + + Returns: + An IngestionManager appropriate for invocation-side use. + """ + return _IngestionManager( + lock, pool, subscription, None, termination_manager, transmission_manager, + expiration_manager) + + +def service_ingestion_manager( + servicer, operation_context, output_operator, lock, pool, + termination_manager, transmission_manager, expiration_manager): + """Creates an IngestionManager appropriate for service-side use. + + The returned IngestionManager will require its set_group_and_name method to be + called before its advance method may be called. + + Args: + servicer: A base.Servicer for servicing the operation. + operation_context: A base.OperationContext for the operation to be passed to + the customer. + output_operator: A base.Operator for the operation to be passed to the + customer and to be called by the customer to accept operation data output + by the customer. + lock: The operation-wide lock. + pool: A thread pool in which to execute customer code. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + + Returns: + An IngestionManager appropriate for service-side use. + """ + subscription_creator = _ServiceSubscriptionCreator( + servicer, operation_context, output_operator) + return _IngestionManager( + lock, pool, None, subscription_creator, termination_manager, + transmission_manager, expiration_manager) diff --git a/src/python/grpcio/grpc/framework/core/_interfaces.py b/src/python/grpcio/grpc/framework/core/_interfaces.py new file mode 100644 index 00000000000..a626b9f7679 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_interfaces.py @@ -0,0 +1,308 @@ +# Copyright 2015, 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. + +"""Package-internal interfaces.""" + +import abc + +from grpc.framework.interfaces.base import base + + +class TerminationManager(object): + """An object responsible for handling the termination of an operation. + + Attributes: + outcome: None if the operation is active or a base.Outcome value if it has + terminated. + """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def add_callback(self, callback): + """Registers a callback to be called on operation termination. + + If the operation has already terminated the callback will not be called. + + Args: + callback: A callable that will be passed an interfaces.Outcome value. + + Returns: + None if the operation has not yet terminated and the passed callback will + be called when it does, or a base.Outcome value describing the operation + termination if the operation has terminated and the callback will not be + called as a result of this method call. + """ + raise NotImplementedError() + + @abc.abstractmethod + def emission_complete(self): + """Indicates that emissions from customer code have completed.""" + raise NotImplementedError() + + @abc.abstractmethod + def transmission_complete(self): + """Indicates that transmissions to the remote end are complete. + + Returns: + True if the operation has terminated or False if the operation remains + ongoing. + """ + raise NotImplementedError() + + @abc.abstractmethod + def reception_complete(self): + """Indicates that reception from the other side is complete.""" + raise NotImplementedError() + + @abc.abstractmethod + def ingestion_complete(self): + """Indicates that customer code ingestion of received values is complete.""" + raise NotImplementedError() + + @abc.abstractmethod + def expire(self): + """Indicates that the operation must abort because it has taken too long.""" + raise NotImplementedError() + + @abc.abstractmethod + def abort(self, outcome): + """Indicates that the operation must abort for the indicated reason. + + Args: + outcome: An interfaces.Outcome indicating operation abortion. + """ + raise NotImplementedError() + + +class TransmissionManager(object): + """A manager responsible for transmitting to the other end of an operation.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def kick_off( + self, group, method, timeout, initial_metadata, payload, completion, + allowance): + """Transmits the values associated with operation invocation.""" + raise NotImplementedError() + + @abc.abstractmethod + def advance(self, initial_metadata, payload, completion, allowance): + """Accepts values for transmission to the other end of the operation. + + Args: + initial_metadata: An initial metadata value to be transmitted to the other + side of the operation. May only ever be non-None once. + payload: A payload value. + completion: A base.Completion value. May only ever be non-None in the last + transmission to be made to the other side. + allowance: A positive integer communicating the number of additional + payloads allowed to be transmitted from the other side to this side of + the operation, or None if no additional allowance is being granted in + this call. + """ + raise NotImplementedError() + + @abc.abstractmethod + def timeout(self, timeout): + """Accepts for transmission to the other side a new timeout value. + + Args: + timeout: A positive float used as the new timeout value for the operation + to be transmitted to the other side. + """ + raise NotImplementedError() + + @abc.abstractmethod + def allowance(self, allowance): + """Indicates to this manager that the remote customer is allowing payloads. + + Args: + allowance: A positive integer indicating the number of additional payloads + the remote customer is allowing to be transmitted from this side of the + operation. + """ + raise NotImplementedError() + + @abc.abstractmethod + def remote_complete(self): + """Indicates to this manager that data from the remote side is complete.""" + raise NotImplementedError() + + @abc.abstractmethod + def abort(self, outcome): + """Indicates that the operation has aborted. + + Args: + outcome: An interfaces.Outcome for the operation. If None, indicates that + the operation abortion should not be communicated to the other side of + the operation. + """ + raise NotImplementedError() + + +class ExpirationManager(object): + """A manager responsible for aborting the operation if it runs out of time.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def change_timeout(self, timeout): + """Changes the timeout allotted for the operation. + + Operation duration is always measure from the beginning of the operation; + calling this method changes the operation's allotted time to timeout total + seconds, not timeout seconds from the time of this method call. + + Args: + timeout: A length of time in seconds to allow for the operation. + """ + raise NotImplementedError() + + @abc.abstractmethod + def deadline(self): + """Returns the time until which the operation is allowed to run. + + Returns: + The time (seconds since the epoch) at which the operation will expire. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminate(self): + """Indicates to this manager that the operation has terminated.""" + raise NotImplementedError() + + +class EmissionManager(base.Operator): + """A manager of values emitted by customer code.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def advance( + self, initial_metadata=None, payload=None, completion=None, + allowance=None): + """Accepts a value emitted by customer code. + + This method should only be called by customer code. + + Args: + initial_metadata: An initial metadata value emitted by the local customer + to be sent to the other side of the operation. + payload: A payload value emitted by the local customer to be sent to the + other side of the operation. + completion: A Completion value emitted by the local customer to be sent to + the other side of the operation. + allowance: A positive integer indicating an additional number of payloads + that the local customer is willing to accept from the other side of the + operation. + """ + raise NotImplementedError() + + +class IngestionManager(object): + """A manager responsible for executing customer code. + + This name of this manager comes from its responsibility to pass successive + values from the other side of the operation into the code of the local + customer. + """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def set_group_and_method(self, group, method): + """Communicates to this IngestionManager the operation group and method. + + Args: + group: The group identifier of the operation. + method: The method identifier of the operation. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_local_allowance(self, allowance): + """Communicates to this IngestionManager that more payloads may be ingested. + + Args: + allowance: A positive integer indicating an additional number of payloads + that the local customer is willing to ingest. + """ + raise NotImplementedError() + + @abc.abstractmethod + def local_emissions_done(self): + """Indicates to this manager that local emissions are done.""" + raise NotImplementedError() + + @abc.abstractmethod + def advance(self, initial_metadata, payload, completion, allowance): + """Advances the operation by passing values to the local customer.""" + raise NotImplementedError() + + +class ReceptionManager(object): + """A manager responsible for receiving tickets from the other end.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def receive_ticket(self, ticket): + """Handle a ticket from the other side of the operation. + + Args: + ticket: An interfaces.BackToFrontTicket or interfaces.FrontToBackTicket + appropriate to this end of the operation and this object. + """ + raise NotImplementedError() + + +class Operation(object): + """An ongoing operation. + + Attributes: + context: A base.OperationContext object for the operation. + operator: A base.Operator object for the operation for use by the customer + of the operation. + """ + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def handle_ticket(self, ticket): + """Handle a ticket from the other side of the operation. + + Args: + ticket: A links.Ticket from the other side of the operation. + """ + raise NotImplementedError() + + @abc.abstractmethod + def abort(self, outcome): + """Aborts the operation. + + Args: + outcome: A base.Outcome value indicating operation abortion. + """ + raise NotImplementedError() diff --git a/src/python/grpcio/grpc/framework/core/_operation.py b/src/python/grpcio/grpc/framework/core/_operation.py new file mode 100644 index 00000000000..d20e40a53da --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_operation.py @@ -0,0 +1,192 @@ +# Copyright 2015, 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. + +"""Implementation of operations.""" + +import threading + +# _utilities is referenced from specification in this module. +from grpc.framework.core import _context +from grpc.framework.core import _emission +from grpc.framework.core import _expiration +from grpc.framework.core import _ingestion +from grpc.framework.core import _interfaces +from grpc.framework.core import _reception +from grpc.framework.core import _termination +from grpc.framework.core import _transmission +from grpc.framework.core import _utilities # pylint: disable=unused-import + + +class _EasyOperation(_interfaces.Operation): + """A trivial implementation of interfaces.Operation.""" + + def __init__( + self, lock, termination_manager, transmission_manager, expiration_manager, + context, operator, reception_manager): + """Constructor. + + Args: + lock: The operation-wide lock. + termination_manager: The _interfaces.TerminationManager for the operation. + transmission_manager: The _interfaces.TransmissionManager for the + operation. + expiration_manager: The _interfaces.ExpirationManager for the operation. + context: A base.OperationContext for use by the customer during the + operation. + operator: A base.Operator for use by the customer during the operation. + reception_manager: The _interfaces.ReceptionManager for the operation. + """ + self._lock = lock + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._expiration_manager = expiration_manager + self._reception_manager = reception_manager + + self.context = context + self.operator = operator + + def handle_ticket(self, ticket): + with self._lock: + self._reception_manager.receive_ticket(ticket) + + def abort(self, outcome): + with self._lock: + if self._termination_manager.outcome is None: + self._termination_manager.abort(outcome) + self._transmission_manager.abort(outcome) + self._expiration_manager.terminate() + + +def invocation_operate( + operation_id, group, method, subscription, timeout, initial_metadata, + payload, completion, ticket_sink, termination_action, pool): + """Constructs objects necessary for front-side operation management. + + Args: + operation_id: An object identifying the operation. + group: The group identifier of the operation. + method: The method identifier of the operation. + subscription: A base.Subscription describing the customer's interest in the + results of the operation. + timeout: A length of time in seconds to allow for the operation. + initial_metadata: An initial metadata value to be sent to the other side of + the operation. May be None if the initial metadata will be passed later or + if there will be no initial metadata passed at all. + payload: The first payload value to be transmitted to the other side. May be + None if there is no such value or if the customer chose not to pass it at + operation invocation. + completion: A base.Completion value indicating the end of values passed to + the other side of the operation. + ticket_sink: A callable that accepts links.Tickets and delivers them to the + other side of the operation. + termination_action: A callable that accepts the outcome of the operation as + a base.Outcome value to be called on operation completion. + pool: A thread pool with which to do the work of the operation. + + Returns: + An _interfaces.Operation for the operation. + """ + lock = threading.Lock() + with lock: + termination_manager = _termination.invocation_termination_manager( + termination_action, pool) + transmission_manager = _transmission.TransmissionManager( + operation_id, ticket_sink, lock, pool, termination_manager) + expiration_manager = _expiration.invocation_expiration_manager( + timeout, lock, termination_manager, transmission_manager) + operation_context = _context.OperationContext( + lock, termination_manager, transmission_manager, expiration_manager) + emission_manager = _emission.EmissionManager( + lock, termination_manager, transmission_manager, expiration_manager) + ingestion_manager = _ingestion.invocation_ingestion_manager( + subscription, lock, pool, termination_manager, transmission_manager, + expiration_manager) + reception_manager = _reception.ReceptionManager( + termination_manager, transmission_manager, expiration_manager, + ingestion_manager) + + termination_manager.set_expiration_manager(expiration_manager) + transmission_manager.set_expiration_manager(expiration_manager) + emission_manager.set_ingestion_manager(ingestion_manager) + + transmission_manager.kick_off( + group, method, timeout, initial_metadata, payload, completion, None) + + return _EasyOperation( + lock, termination_manager, transmission_manager, expiration_manager, + operation_context, emission_manager, reception_manager) + + +def service_operate( + servicer_package, ticket, ticket_sink, termination_action, pool): + """Constructs an Operation for service of an operation. + + Args: + servicer_package: A _utilities.ServicerPackage to be used servicing the + operation. + ticket: The first links.Ticket received for the operation. + ticket_sink: A callable that accepts links.Tickets and delivers them to the + other side of the operation. + termination_action: A callable that accepts the outcome of the operation as + a base.Outcome value to be called on operation completion. + pool: A thread pool with which to do the work of the operation. + + Returns: + An _interfaces.Operation for the operation. + """ + lock = threading.Lock() + with lock: + termination_manager = _termination.service_termination_manager( + termination_action, pool) + transmission_manager = _transmission.TransmissionManager( + ticket.operation_id, ticket_sink, lock, pool, termination_manager) + expiration_manager = _expiration.service_expiration_manager( + ticket.timeout, servicer_package.default_timeout, + servicer_package.maximum_timeout, lock, termination_manager, + transmission_manager) + operation_context = _context.OperationContext( + lock, termination_manager, transmission_manager, expiration_manager) + emission_manager = _emission.EmissionManager( + lock, termination_manager, transmission_manager, expiration_manager) + ingestion_manager = _ingestion.service_ingestion_manager( + servicer_package.servicer, operation_context, emission_manager, lock, + pool, termination_manager, transmission_manager, expiration_manager) + reception_manager = _reception.ReceptionManager( + termination_manager, transmission_manager, expiration_manager, + ingestion_manager) + + termination_manager.set_expiration_manager(expiration_manager) + transmission_manager.set_expiration_manager(expiration_manager) + emission_manager.set_ingestion_manager(ingestion_manager) + + reception_manager.receive_ticket(ticket) + + return _EasyOperation( + lock, termination_manager, transmission_manager, expiration_manager, + operation_context, emission_manager, reception_manager) diff --git a/src/python/grpcio/grpc/framework/core/_reception.py b/src/python/grpcio/grpc/framework/core/_reception.py new file mode 100644 index 00000000000..b64faf81463 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_reception.py @@ -0,0 +1,137 @@ +# Copyright 2015, 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. + +"""State and behavior for ticket reception.""" + +from grpc.framework.core import _interfaces +from grpc.framework.interfaces.base import base +from grpc.framework.interfaces.base import utilities +from grpc.framework.interfaces.links import links + +_REMOTE_TICKET_TERMINATION_TO_LOCAL_OUTCOME = { + links.Ticket.Termination.CANCELLATION: base.Outcome.CANCELLED, + links.Ticket.Termination.EXPIRATION: base.Outcome.EXPIRED, + links.Ticket.Termination.SHUTDOWN: base.Outcome.REMOTE_SHUTDOWN, + links.Ticket.Termination.RECEPTION_FAILURE: base.Outcome.RECEPTION_FAILURE, + links.Ticket.Termination.TRANSMISSION_FAILURE: + base.Outcome.TRANSMISSION_FAILURE, + links.Ticket.Termination.LOCAL_FAILURE: base.Outcome.REMOTE_FAILURE, +} + + +class ReceptionManager(_interfaces.ReceptionManager): + """A ReceptionManager based around a _Receiver passed to it.""" + + def __init__( + self, termination_manager, transmission_manager, expiration_manager, + ingestion_manager): + """Constructor. + + Args: + termination_manager: The operation's _interfaces.TerminationManager. + transmission_manager: The operation's _interfaces.TransmissionManager. + expiration_manager: The operation's _interfaces.ExpirationManager. + ingestion_manager: The operation's _interfaces.IngestionManager. + """ + self._termination_manager = termination_manager + self._transmission_manager = transmission_manager + self._expiration_manager = expiration_manager + self._ingestion_manager = ingestion_manager + + self._lowest_unseen_sequence_number = 0 + self._out_of_sequence_tickets = {} + self._aborted = False + + def _abort(self, outcome): + self._aborted = True + self._termination_manager.abort(outcome) + self._transmission_manager.abort(outcome) + self._expiration_manager.terminate() + + def _sequence_failure(self, ticket): + """Determines a just-arrived ticket's sequential legitimacy. + + Args: + ticket: A just-arrived ticket. + + Returns: + True if the ticket is sequentially legitimate; False otherwise. + """ + if ticket.sequence_number < self._lowest_unseen_sequence_number: + return True + elif ticket.sequence_number in self._out_of_sequence_tickets: + return True + else: + return False + + def _process_one(self, ticket): + if ticket.sequence_number == 0: + self._ingestion_manager.set_group_and_method(ticket.group, ticket.method) + if ticket.timeout is not None: + self._expiration_manager.change_timeout(ticket.timeout) + if ticket.termination is None: + completion = None + else: + completion = utilities.completion( + ticket.terminal_metadata, ticket.code, ticket.message) + self._ingestion_manager.advance( + ticket.initial_metadata, ticket.payload, completion, ticket.allowance) + if ticket.allowance is not None: + self._transmission_manager.allowance(ticket.allowance) + + def _process(self, ticket): + """Process those tickets ready to be processed. + + Args: + ticket: A just-arrived ticket the sequence number of which matches this + _ReceptionManager's _lowest_unseen_sequence_number field. + """ + while True: + self._process_one(ticket) + next_ticket = self._out_of_sequence_tickets.pop( + ticket.sequence_number + 1, None) + if next_ticket is None: + self._lowest_unseen_sequence_number = ticket.sequence_number + 1 + return + else: + ticket = next_ticket + + def receive_ticket(self, ticket): + """See _interfaces.ReceptionManager.receive_ticket for specification.""" + if self._aborted: + return + elif self._sequence_failure(ticket): + self._abort(base.Outcome.RECEPTION_FAILURE) + elif ticket.termination not in (None, links.Ticket.Termination.COMPLETION): + outcome = _REMOTE_TICKET_TERMINATION_TO_LOCAL_OUTCOME[ticket.termination] + self._abort(outcome) + elif ticket.sequence_number == self._lowest_unseen_sequence_number: + self._process(ticket) + else: + self._out_of_sequence_tickets[ticket.sequence_number] = ticket diff --git a/src/python/grpcio/grpc/framework/core/_termination.py b/src/python/grpcio/grpc/framework/core/_termination.py new file mode 100644 index 00000000000..ad9f6123d8d --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_termination.py @@ -0,0 +1,212 @@ +# Copyright 2015, 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. + +"""State and behavior for operation termination.""" + +import abc + +from grpc.framework.core import _constants +from grpc.framework.core import _interfaces +from grpc.framework.foundation import callable_util +from grpc.framework.interfaces.base import base + + +def _invocation_completion_predicate( + unused_emission_complete, unused_transmission_complete, + unused_reception_complete, ingestion_complete): + return ingestion_complete + + +def _service_completion_predicate( + unused_emission_complete, transmission_complete, unused_reception_complete, + unused_ingestion_complete): + return transmission_complete + + +class TerminationManager(_interfaces.TerminationManager): + """A _interfaces.TransmissionManager on which another manager may be set.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def set_expiration_manager(self, expiration_manager): + """Sets the expiration manager with which this manager will interact. + + Args: + expiration_manager: The _interfaces.ExpirationManager associated with the + current operation. + """ + raise NotImplementedError() + + +class _TerminationManager(TerminationManager): + """An implementation of TerminationManager.""" + + def __init__(self, predicate, action, pool): + """Constructor. + + Args: + predicate: One of _invocation_completion_predicate or + _service_completion_predicate to be used to determine when the operation + has completed. + action: A behavior to pass the operation outcome on operation termination. + pool: A thread pool. + """ + self._predicate = predicate + self._action = action + self._pool = pool + self._expiration_manager = None + + self.outcome = None + self._callbacks = [] + + self._emission_complete = False + self._transmission_complete = False + self._reception_complete = False + self._ingestion_complete = False + + def set_expiration_manager(self, expiration_manager): + self._expiration_manager = expiration_manager + + def _terminate_internal_only(self, outcome): + """Terminates the operation. + + Args: + outcome: A base.Outcome describing the outcome of the operation. + """ + self.outcome = outcome + callbacks = list(self._callbacks) + self._callbacks = None + + act = callable_util.with_exceptions_logged( + self._action, _constants.INTERNAL_ERROR_LOG_MESSAGE) + + if outcome is base.Outcome.LOCAL_FAILURE: + self._pool.submit(act, outcome) + else: + def call_callbacks_and_act(callbacks, outcome): + for callback in callbacks: + callback_outcome = callable_util.call_logging_exceptions( + callback, _constants.TERMINATION_CALLBACK_EXCEPTION_LOG_MESSAGE, + outcome) + if callback_outcome.exception is not None: + outcome = base.Outcome.LOCAL_FAILURE + break + act(outcome) + + self._pool.submit( + callable_util.with_exceptions_logged( + call_callbacks_and_act, _constants.INTERNAL_ERROR_LOG_MESSAGE), + callbacks, outcome) + + def _terminate_and_notify(self, outcome): + self._terminate_internal_only(outcome) + self._expiration_manager.terminate() + + def _perhaps_complete(self): + if self._predicate( + self._emission_complete, self._transmission_complete, + self._reception_complete, self._ingestion_complete): + self._terminate_and_notify(base.Outcome.COMPLETED) + return True + else: + return False + + def is_active(self): + """See _interfaces.TerminationManager.is_active for specification.""" + return self.outcome is None + + def add_callback(self, callback): + """See _interfaces.TerminationManager.add_callback for specification.""" + if self.outcome is None: + self._callbacks.append(callback) + return None + else: + return self.outcome + + def emission_complete(self): + """See superclass method for specification.""" + if self.outcome is None: + self._emission_complete = True + self._perhaps_complete() + + def transmission_complete(self): + """See superclass method for specification.""" + if self.outcome is None: + self._transmission_complete = True + return self._perhaps_complete() + else: + return False + + def reception_complete(self): + """See superclass method for specification.""" + if self.outcome is None: + self._reception_complete = True + self._perhaps_complete() + + def ingestion_complete(self): + """See superclass method for specification.""" + if self.outcome is None: + self._ingestion_complete = True + self._perhaps_complete() + + def expire(self): + """See _interfaces.TerminationManager.expire for specification.""" + self._terminate_internal_only(base.Outcome.EXPIRED) + + def abort(self, outcome): + """See _interfaces.TerminationManager.abort for specification.""" + self._terminate_and_notify(outcome) + + +def invocation_termination_manager(action, pool): + """Creates a TerminationManager appropriate for invocation-side use. + + Args: + action: An action to call on operation termination. + pool: A thread pool in which to execute the passed action and any + termination callbacks that are registered during the operation. + + Returns: + A TerminationManager appropriate for invocation-side use. + """ + return _TerminationManager(_invocation_completion_predicate, action, pool) + + +def service_termination_manager(action, pool): + """Creates a TerminationManager appropriate for service-side use. + + Args: + action: An action to call on operation termination. + pool: A thread pool in which to execute the passed action and any + termination callbacks that are registered during the operation. + + Returns: + A TerminationManager appropriate for service-side use. + """ + return _TerminationManager(_service_completion_predicate, action, pool) diff --git a/src/python/grpcio/grpc/framework/core/_transmission.py b/src/python/grpcio/grpc/framework/core/_transmission.py new file mode 100644 index 00000000000..01894d398dc --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_transmission.py @@ -0,0 +1,294 @@ +# Copyright 2015, 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. + +"""State and behavior for ticket transmission during an operation.""" + +from grpc.framework.core import _constants +from grpc.framework.core import _interfaces +from grpc.framework.foundation import callable_util +from grpc.framework.interfaces.base import base +from grpc.framework.interfaces.links import links + +_TRANSMISSION_EXCEPTION_LOG_MESSAGE = 'Exception during transmission!' + + +def _explode_completion(completion): + if completion is None: + return None, None, None, None + else: + return ( + completion.terminal_metadata, completion.code, completion.message, + links.Ticket.Termination.COMPLETION) + + +class TransmissionManager(_interfaces.TransmissionManager): + """An _interfaces.TransmissionManager that sends links.Tickets.""" + + def __init__( + self, operation_id, ticket_sink, lock, pool, termination_manager): + """Constructor. + + Args: + operation_id: The operation's ID. + ticket_sink: A callable that accepts tickets and sends them to the other + side of the operation. + lock: The operation-servicing-wide lock object. + pool: A thread pool in which the work of transmitting tickets will be + performed. + termination_manager: The _interfaces.TerminationManager associated with + this operation. + """ + self._lock = lock + self._pool = pool + self._ticket_sink = ticket_sink + self._operation_id = operation_id + self._termination_manager = termination_manager + self._expiration_manager = None + + self._lowest_unused_sequence_number = 0 + self._remote_allowance = 1 + self._remote_complete = False + self._timeout = None + self._local_allowance = 0 + self._initial_metadata = None + self._payloads = [] + self._completion = None + self._aborted = False + self._abortion_outcome = None + self._transmitting = False + + def set_expiration_manager(self, expiration_manager): + """Sets the ExpirationManager with which this manager will cooperate.""" + self._expiration_manager = expiration_manager + + def _next_ticket(self): + """Creates the next ticket to be transmitted. + + Returns: + A links.Ticket to be sent to the other side of the operation or None if + there is nothing to be sent at this time. + """ + if self._aborted: + if self._abortion_outcome is None: + return None + else: + termination = _constants.ABORTION_OUTCOME_TO_TICKET_TERMINATION[ + self._abortion_outcome] + if termination is None: + return None + else: + self._abortion_outcome = None + return links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, + None, None, None, None, None, None, None, None, None, + termination) + + action = False + # TODO(nathaniel): Support other subscriptions. + local_subscription = links.Ticket.Subscription.FULL + timeout = self._timeout + if timeout is not None: + self._timeout = None + action = True + if self._local_allowance <= 0: + allowance = None + else: + allowance = self._local_allowance + self._local_allowance = 0 + action = True + initial_metadata = self._initial_metadata + if initial_metadata is not None: + self._initial_metadata = None + action = True + if not self._payloads or self._remote_allowance <= 0: + payload = None + else: + payload = self._payloads.pop(0) + self._remote_allowance -= 1 + action = True + if self._completion is None or self._payloads: + terminal_metadata, code, message, termination = None, None, None, None + else: + terminal_metadata, code, message, termination = _explode_completion( + self._completion) + self._completion = None + action = True + + if action: + ticket = links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, None, + local_subscription, timeout, allowance, initial_metadata, payload, + terminal_metadata, code, message, termination) + self._lowest_unused_sequence_number += 1 + return ticket + else: + return None + + def _transmit(self, ticket): + """Commences the transmission loop sending tickets. + + Args: + ticket: A links.Ticket to be sent to the other side of the operation. + """ + def transmit(ticket): + while True: + transmission_outcome = callable_util.call_logging_exceptions( + self._ticket_sink, _TRANSMISSION_EXCEPTION_LOG_MESSAGE, ticket) + if transmission_outcome.exception is None: + with self._lock: + if ticket.termination is links.Ticket.Termination.COMPLETION: + self._termination_manager.transmission_complete() + ticket = self._next_ticket() + if ticket is None: + self._transmitting = False + return + else: + with self._lock: + if self._termination_manager.outcome is None: + self._termination_manager.abort(base.Outcome.TRANSMISSION_FAILURE) + self._expiration_manager.terminate() + return + + self._pool.submit(callable_util.with_exceptions_logged( + transmit, _constants.INTERNAL_ERROR_LOG_MESSAGE), ticket) + self._transmitting = True + + def kick_off( + self, group, method, timeout, initial_metadata, payload, completion, + allowance): + """See _interfaces.TransmissionManager.kickoff for specification.""" + # TODO(nathaniel): Support other subscriptions. + subscription = links.Ticket.Subscription.FULL + terminal_metadata, code, message, termination = _explode_completion( + completion) + self._remote_allowance = 1 if payload is None else 0 + ticket = links.Ticket( + self._operation_id, 0, group, method, subscription, timeout, allowance, + initial_metadata, payload, terminal_metadata, code, message, + termination) + self._lowest_unused_sequence_number = 1 + self._transmit(ticket) + + def advance(self, initial_metadata, payload, completion, allowance): + """See _interfaces.TransmissionManager.advance for specification.""" + effective_initial_metadata = initial_metadata + effective_payload = payload + effective_completion = completion + if allowance is not None and not self._remote_complete: + effective_allowance = allowance + else: + effective_allowance = None + if self._transmitting: + if effective_initial_metadata is not None: + self._initial_metadata = effective_initial_metadata + if effective_payload is not None: + self._payloads.append(effective_payload) + if effective_completion is not None: + self._completion = effective_completion + if effective_allowance is not None: + self._local_allowance += effective_allowance + else: + if effective_payload is not None: + if 0 < self._remote_allowance: + ticket_payload = effective_payload + self._remote_allowance -= 1 + else: + self._payloads.append(effective_payload) + ticket_payload = None + else: + ticket_payload = None + if effective_completion is not None and not self._payloads: + ticket_completion = effective_completion + else: + self._completion = effective_completion + ticket_completion = None + if any( + (effective_initial_metadata, ticket_payload, ticket_completion, + effective_allowance)): + terminal_metadata, code, message, termination = _explode_completion( + completion) + ticket = links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, None, + None, None, allowance, effective_initial_metadata, ticket_payload, + terminal_metadata, code, message, termination) + self._lowest_unused_sequence_number += 1 + self._transmit(ticket) + + def timeout(self, timeout): + """See _interfaces.TransmissionManager.timeout for specification.""" + if self._transmitting: + self._timeout = timeout + else: + ticket = links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, None, + None, timeout, None, None, None, None, None, None, None) + self._lowest_unused_sequence_number += 1 + self._transmit(ticket) + + def allowance(self, allowance): + """See _interfaces.TransmissionManager.allowance for specification.""" + if self._transmitting or not self._payloads: + self._remote_allowance += allowance + else: + self._remote_allowance += allowance - 1 + payload = self._payloads.pop(0) + if self._payloads: + completion = None + else: + completion = self._completion + self._completion = None + terminal_metadata, code, message, termination = _explode_completion( + completion) + ticket = links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, None, + None, None, None, None, payload, terminal_metadata, code, message, + termination) + self._lowest_unused_sequence_number += 1 + self._transmit(ticket) + + def remote_complete(self): + """See _interfaces.TransmissionManager.remote_complete for specification.""" + self._remote_complete = True + self._local_allowance = 0 + + def abort(self, outcome): + """See _interfaces.TransmissionManager.abort for specification.""" + if self._transmitting: + self._aborted, self._abortion_outcome = True, outcome + else: + self._aborted = True + if outcome is not None: + termination = _constants.ABORTION_OUTCOME_TO_TICKET_TERMINATION[ + outcome] + if termination is not None: + ticket = links.Ticket( + self._operation_id, self._lowest_unused_sequence_number, None, + None, None, None, None, None, None, None, None, None, + termination) + self._transmit(ticket) diff --git a/src/python/grpcio/grpc/framework/core/_utilities.py b/src/python/grpcio/grpc/framework/core/_utilities.py new file mode 100644 index 00000000000..5b0d7987517 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/_utilities.py @@ -0,0 +1,46 @@ +# Copyright 2015, 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. + +"""Package-internal utilities.""" + +import collections + + +class ServicerPackage( + collections.namedtuple( + 'ServicerPackage', ('servicer', 'default_timeout', 'maximum_timeout'))): + """A trivial bundle class. + + Attributes: + servicer: A base.Servicer. + default_timeout: A float indicating the length of time in seconds to allow + for an operation invoked without a timeout. + maximum_timeout: A float indicating the maximum length of time in seconds to + allow for an operation. + """ diff --git a/src/python/grpcio/grpc/framework/core/implementations.py b/src/python/grpcio/grpc/framework/core/implementations.py new file mode 100644 index 00000000000..364a7faed40 --- /dev/null +++ b/src/python/grpcio/grpc/framework/core/implementations.py @@ -0,0 +1,62 @@ +# Copyright 2015, 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. + +"""Entry points into the ticket-exchange-based base layer implementation.""" + +# base and links are referenced from specification in this module. +from grpc.framework.core import _end +from grpc.framework.interfaces.base import base # pylint: disable=unused-import +from grpc.framework.interfaces.links import links # pylint: disable=unused-import + + +def invocation_end_link(): + """Creates a base.End-links.Link suitable for operation invocation. + + Returns: + An object that is both a base.End and a links.Link, that supports operation + invocation, and that translates operation invocation into ticket exchange. + """ + return _end.serviceless_end_link() + + +def service_end_link(servicer, default_timeout, maximum_timeout): + """Creates a base.End-links.Link suitable for operation service. + + Args: + servicer: A base.Servicer for servicing operations. + default_timeout: A length of time in seconds to be used as the default + time alloted for a single operation. + maximum_timeout: A length of time in seconds to be used as the maximum + time alloted for a single operation. + + Returns: + An object that is both a base.End and a links.Link and that services + operations that arrive at it through ticket exchange. + """ + return _end.serviceful_end_link(servicer, default_timeout, maximum_timeout) diff --git a/src/python/grpcio/grpc/framework/interfaces/base/base.py b/src/python/grpcio/grpc/framework/interfaces/base/base.py index 9d1651daace..76e0a5bdaea 100644 --- a/src/python/grpcio/grpc/framework/interfaces/base/base.py +++ b/src/python/grpcio/grpc/framework/interfaces/base/base.py @@ -27,10 +27,20 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -"""The base interface of RPC Framework.""" +"""The base interface of RPC Framework. +Implementations of this interface support the conduct of "operations": +exchanges between two distinct ends of an arbitrary number of data payloads +and metadata such as a name for the operation, initial and terminal metadata +in each direction, and flow control. These operations may be used for transfers +of data, remote procedure calls, status indication, or anything else +applications choose. +""" + +# threading is referenced from specification in this module. import abc import enum +import threading # abandonment is referenced from specification in this module. from grpc.framework.foundation import abandonment # pylint: disable=unused-import @@ -208,19 +218,26 @@ class End(object): raise NotImplementedError() @abc.abstractmethod - def stop_gracefully(self): - """Gracefully stops this object's service of operations. + def stop(self, grace): + """Stops this object's service of operations. - Operations in progress will be allowed to complete, and this method blocks - until all of them have. - """ - raise NotImplementedError() + This object will refuse service of new operations as soon as this method is + called but operations under way at the time of the call may be given a + grace period during which they are allowed to finish. - @abc.abstractmethod - def stop_immediately(self): - """Immediately stops this object's service of operations. + Args: + grace: A duration of time in seconds to allow ongoing operations to + terminate before being forcefully terminated by the stopping of this + End. May be zero to terminate all ongoing operations and immediately + stop. - Operations in progress will not be allowed to complete. + Returns: + A threading.Event that will be set to indicate all operations having + terminated and this End having completely stopped. The returned event + may not be set until after the full grace period (if some ongoing + operation continues for the full length of the period) or it may be set + much sooner (if for example this End had no operations in progress at + the time its stop method was called). """ raise NotImplementedError() diff --git a/src/python/grpcio/grpc/framework/interfaces/links/links.py b/src/python/grpcio/grpc/framework/interfaces/links/links.py index 5ebbac8a6f2..069ff024ddc 100644 --- a/src/python/grpcio/grpc/framework/interfaces/links/links.py +++ b/src/python/grpcio/grpc/framework/interfaces/links/links.py @@ -98,7 +98,7 @@ class Ticket( COMPLETION = 'completion' CANCELLATION = 'cancellation' EXPIRATION = 'expiration' - LOCAL_SHUTDOWN = 'local shutdown' + SHUTDOWN = 'shutdown' RECEPTION_FAILURE = 'reception failure' TRANSMISSION_FAILURE = 'transmission failure' LOCAL_FAILURE = 'local failure' diff --git a/src/python/grpcio_test/grpc_test/_core_over_links_base_interface_test.py b/src/python/grpcio_test/grpc_test/_core_over_links_base_interface_test.py new file mode 100644 index 00000000000..72b1ae56426 --- /dev/null +++ b/src/python/grpcio_test/grpc_test/_core_over_links_base_interface_test.py @@ -0,0 +1,165 @@ +# Copyright 2015, 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. + +"""Tests the RPC Framework Core's implementation of the Base interface.""" + +import collections +import logging +import random +import time +import unittest + +from grpc._adapter import _intermediary_low +from grpc._links import invocation +from grpc._links import service +from grpc.framework.core import implementations +from grpc.framework.interfaces.base import utilities +from grpc_test import test_common as grpc_test_common +from grpc_test.framework.common import test_constants +from grpc_test.framework.interfaces.base import test_cases +from grpc_test.framework.interfaces.base import test_interfaces + +_INVOCATION_INITIAL_METADATA = ((b'0', b'abc'), (b'1', b'def'), (b'2', b'ghi'),) +_SERVICE_INITIAL_METADATA = ((b'3', b'jkl'), (b'4', b'mno'), (b'5', b'pqr'),) +_SERVICE_TERMINAL_METADATA = ((b'6', b'stu'), (b'7', b'vwx'), (b'8', b'yza'),) +_CODE = _intermediary_low.Code.OK +_MESSAGE = b'test message' + + +class _SerializationBehaviors( + collections.namedtuple( + '_SerializationBehaviors', + ('request_serializers', 'request_deserializers', 'response_serializers', + 'response_deserializers',))): + pass + + +class _Links( + collections.namedtuple( + '_Links', + ('invocation_end_link', 'invocation_grpc_link', 'service_grpc_link', + 'service_end_link'))): + pass + + +def _serialization_behaviors_from_serializations(serializations): + request_serializers = {} + request_deserializers = {} + response_serializers = {} + response_deserializers = {} + for (group, method), serialization in serializations.iteritems(): + request_serializers[group, method] = serialization.serialize_request + request_deserializers[group, method] = serialization.deserialize_request + response_serializers[group, method] = serialization.serialize_response + response_deserializers[group, method] = serialization.deserialize_response + return _SerializationBehaviors( + request_serializers, request_deserializers, response_serializers, + response_deserializers) + + +class _Implementation(test_interfaces.Implementation): + + def instantiate(self, serializations, servicer): + serialization_behaviors = _serialization_behaviors_from_serializations( + serializations) + invocation_end_link = implementations.invocation_end_link() + service_end_link = implementations.service_end_link( + servicer, test_constants.DEFAULT_TIMEOUT, + test_constants.MAXIMUM_TIMEOUT) + service_grpc_link = service.service_link( + serialization_behaviors.request_deserializers, + serialization_behaviors.response_serializers) + port = service_grpc_link.add_port(0, None) + channel = _intermediary_low.Channel('localhost:%d' % port, None) + invocation_grpc_link = invocation.invocation_link( + channel, b'localhost', + serialization_behaviors.request_serializers, + serialization_behaviors.response_deserializers) + + invocation_end_link.join_link(invocation_grpc_link) + invocation_grpc_link.join_link(invocation_end_link) + service_end_link.join_link(service_grpc_link) + service_grpc_link.join_link(service_end_link) + invocation_grpc_link.start() + service_grpc_link.start() + return invocation_end_link, service_end_link, ( + invocation_grpc_link, service_grpc_link) + + def destantiate(self, memo): + invocation_grpc_link, service_grpc_link = memo + invocation_grpc_link.stop() + service_grpc_link.stop_gracefully() + + def invocation_initial_metadata(self): + return _INVOCATION_INITIAL_METADATA + + def service_initial_metadata(self): + return _SERVICE_INITIAL_METADATA + + def invocation_completion(self): + return utilities.completion(None, None, None) + + def service_completion(self): + return utilities.completion(_SERVICE_TERMINAL_METADATA, _CODE, _MESSAGE) + + def metadata_transmitted(self, original_metadata, transmitted_metadata): + return original_metadata is None or grpc_test_common.metadata_transmitted( + original_metadata, transmitted_metadata) + + def completion_transmitted(self, original_completion, transmitted_completion): + if (original_completion.terminal_metadata is not None and + not grpc_test_common.metadata_transmitted( + original_completion.terminal_metadata, + transmitted_completion.terminal_metadata)): + return False + elif original_completion.code is not transmitted_completion.code: + return False + elif original_completion.message != transmitted_completion.message: + return False + else: + return True + + +def setUpModule(): + logging.warn('setUpModule!') + + +def tearDownModule(): + logging.warn('tearDownModule!') + + +def load_tests(loader, tests, pattern): + return unittest.TestSuite( + tests=tuple( + loader.loadTestsFromTestCase(test_case_class) + for test_case_class in test_cases.test_cases(_Implementation()))) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/src/python/grpcio_test/grpc_test/framework/core/__init__.py b/src/python/grpcio_test/grpc_test/framework/core/__init__.py new file mode 100644 index 00000000000..70865191060 --- /dev/null +++ b/src/python/grpcio_test/grpc_test/framework/core/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2015, 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. + + diff --git a/src/python/grpcio_test/grpc_test/framework/core/_base_interface_test.py b/src/python/grpcio_test/grpc_test/framework/core/_base_interface_test.py new file mode 100644 index 00000000000..8d72f131d57 --- /dev/null +++ b/src/python/grpcio_test/grpc_test/framework/core/_base_interface_test.py @@ -0,0 +1,96 @@ +# Copyright 2015, 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. + +"""Tests the RPC Framework Core's implementation of the Base interface.""" + +import logging +import random +import time +import unittest + +from grpc.framework.core import implementations +from grpc.framework.interfaces.base import utilities +from grpc_test.framework.common import test_constants +from grpc_test.framework.interfaces.base import test_cases +from grpc_test.framework.interfaces.base import test_interfaces + + +class _Implementation(test_interfaces.Implementation): + + def __init__(self): + self._invocation_initial_metadata = object() + self._service_initial_metadata = object() + self._invocation_terminal_metadata = object() + self._service_terminal_metadata = object() + + def instantiate(self, serializations, servicer): + invocation = implementations.invocation_end_link() + service = implementations.service_end_link( + servicer, test_constants.DEFAULT_TIMEOUT, + test_constants.MAXIMUM_TIMEOUT) + invocation.join_link(service) + service.join_link(invocation) + return invocation, service, None + + def destantiate(self, memo): + pass + + def invocation_initial_metadata(self): + return self._invocation_initial_metadata + + def service_initial_metadata(self): + return self._service_initial_metadata + + def invocation_completion(self): + return utilities.completion(self._invocation_terminal_metadata, None, None) + + def service_completion(self): + return utilities.completion(self._service_terminal_metadata, None, None) + + def metadata_transmitted(self, original_metadata, transmitted_metadata): + return transmitted_metadata is original_metadata + + def completion_transmitted(self, original_completion, transmitted_completion): + return ( + (original_completion.terminal_metadata is + transmitted_completion.terminal_metadata) and + original_completion.code is transmitted_completion.code and + original_completion.message is transmitted_completion.message + ) + + +def load_tests(loader, tests, pattern): + return unittest.TestSuite( + tests=tuple( + loader.loadTestsFromTestCase(test_case_class) + for test_case_class in test_cases.test_cases(_Implementation()))) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff --git a/src/python/grpcio_test/grpc_test/framework/interfaces/base/test_cases.py b/src/python/grpcio_test/grpc_test/framework/interfaces/base/test_cases.py index dd332fe5ddf..5c8b176da4f 100644 --- a/src/python/grpcio_test/grpc_test/framework/interfaces/base/test_cases.py +++ b/src/python/grpcio_test/grpc_test/framework/interfaces/base/test_cases.py @@ -211,8 +211,10 @@ class _OperationTest(unittest.TestCase): elif instruction.kind is _control.Instruction.Kind.CONCLUDE: break - invocation_end.stop_gracefully() - service_end.stop_gracefully() + invocation_stop_event = invocation_end.stop(0) + service_stop_event = service_end.stop(0) + invocation_stop_event.wait() + service_stop_event.wait() invocation_stats = invocation_end.operation_stats() service_stats = service_end.operation_stats() diff --git a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py index 6c2e3346aaa..a2bd7107c17 100644 --- a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py +++ b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py @@ -29,9 +29,42 @@ """State and behavior appropriate for use in tests.""" +import logging import threading +import time from grpc.framework.interfaces.links import links +from grpc.framework.interfaces.links import utilities + +# A more-or-less arbitrary limit on the length of raw data values to be logged. +_UNCOMFORTABLY_LONG = 48 + + +def _safe_for_log_ticket(ticket): + """Creates a safe-for-printing-to-the-log ticket for a given ticket. + + Args: + ticket: Any links.Ticket. + + Returns: + A links.Ticket that is as much as can be equal to the given ticket but + possibly features values like the string "" in + place of the actual values of the given ticket. + """ + if isinstance(ticket.payload, (basestring,)): + payload_length = len(ticket.payload) + else: + payload_length = -1 + if payload_length < _UNCOMFORTABLY_LONG: + return ticket + else: + return links.Ticket( + ticket.operation_id, ticket.sequence_number, + ticket.group, ticket.method, ticket.subscription, ticket.timeout, + ticket.allowance, ticket.initial_metadata, + ''.format(payload_length), + ticket.terminal_metadata, ticket.code, ticket.message, + ticket.termination) class RecordingLink(links.Link): @@ -64,3 +97,71 @@ class RecordingLink(links.Link): """Returns a copy of the list of all tickets received by this Link.""" with self._condition: return tuple(self._tickets) + + +class _Pipe(object): + """A conduit that logs all tickets passed through it.""" + + def __init__(self, name): + self._lock = threading.Lock() + self._name = name + self._left_mate = utilities.NULL_LINK + self._right_mate = utilities.NULL_LINK + + def accept_left_to_right_ticket(self, ticket): + with self._lock: + logging.warning( + '%s: moving left to right through %s: %s', time.time(), self._name, + _safe_for_log_ticket(ticket)) + try: + self._right_mate.accept_ticket(ticket) + except Exception as e: # pylint: disable=broad-except + logging.exception(e) + + def accept_right_to_left_ticket(self, ticket): + with self._lock: + logging.warning( + '%s: moving right to left through %s: %s', time.time(), self._name, + _safe_for_log_ticket(ticket)) + try: + self._left_mate.accept_ticket(ticket) + except Exception as e: # pylint: disable=broad-except + logging.exception(e) + + def join_left_mate(self, left_mate): + with self._lock: + self._left_mate = utilities.NULL_LINK if left_mate is None else left_mate + + def join_right_mate(self, right_mate): + with self._lock: + self._right_mate = ( + utilities.NULL_LINK if right_mate is None else right_mate) + + +class _Facade(links.Link): + + def __init__(self, accept, join): + self._accept = accept + self._join = join + + def accept_ticket(self, ticket): + self._accept(ticket) + + def join_link(self, link): + self._join(link) + + +def logging_links(name): + """Creates a conduit that logs all tickets passed through it. + + Args: + name: A name to use for the conduit to identify itself in logging output. + + Returns: + Two links.Links, the first of which is the "left" side of the conduit + and the second of which is the "right" side of the conduit. + """ + pipe = _Pipe(name) + left_facade = _Facade(pipe.accept_left_to_right_ticket, pipe.join_left_mate) + right_facade = _Facade(pipe.accept_right_to_left_ticket, pipe.join_right_mate) + return left_facade, right_facade From 71e29ef459378f404ad4377e960792435864f878 Mon Sep 17 00:00:00 2001 From: Masood Malekghassemi Date: Fri, 21 Aug 2015 14:22:11 -0700 Subject: [PATCH 33/79] Add new core tests to run_tests/run_python.sh The tests don't currently get discovered by py.test due to their use of the Python 2.7+ load_tests protocol. --- tools/run_tests/run_python.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/run_tests/run_python.sh b/tools/run_tests/run_python.sh index 6f80219b0e7..6fdca93fd5f 100755 --- a/tools/run_tests/run_python.sh +++ b/tools/run_tests/run_python.sh @@ -39,4 +39,12 @@ export LD_LIBRARY_PATH=$ROOT/libs/$CONFIG export DYLD_LIBRARY_PATH=$ROOT/libs/$CONFIG export PATH=$ROOT/bins/$CONFIG:$ROOT/bins/$CONFIG/protobuf:$PATH source "python"$PYVER"_virtual_environment"/bin/activate + +# TODO(atash): These tests don't currently run under py.test and thus don't +# appear under the coverage report. Find a way to get these tests to work with +# py.test (or find another tool or *something*) that's acceptable to the rest of +# the team... +"python"$PYVER -m grpc_test._core_over_links_base_interface_test +"python"$PYVER -m grpc_test.framework.core._base_interface_test + "python"$PYVER $GRPCIO_TEST/setup.py test -a "-n8 --cov=grpc --junitxml=./report.xml" From 9e2f90cd068b4c2a8fdec69ca93ca614d35cba28 Mon Sep 17 00:00:00 2001 From: yang-g Date: Fri, 21 Aug 2015 15:35:03 -0700 Subject: [PATCH 34/79] headers reorg --- BUILD | 68 ++++----- Makefile | 68 ++++----- build.json | 34 ++--- examples/pubsub/main.cc | 6 +- examples/pubsub/publisher.h | 1 - examples/pubsub/publisher_test.cc | 2 - examples/pubsub/subscriber.h | 1 - examples/pubsub/subscriber_test.cc | 2 - include/grpc++/channel.h | 2 +- include/grpc++/client_context.h | 8 +- include/grpc++/completion_queue.h | 4 +- include/grpc++/create_channel.h | 4 +- include/grpc++/credentials.h | 2 +- .../{ => generic}/async_generic_service.h | 10 +- include/grpc++/{ => generic}/generic_stub.h | 10 +- include/grpc++/impl/call.h | 15 +- include/grpc++/impl/client_unary_call.h | 5 +- include/grpc++/impl/proto_utils.h | 4 +- include/grpc++/impl/rpc_service_method.h | 6 +- include/grpc++/impl/service_type.h | 4 +- include/grpc++/impl/sync.h | 2 +- include/grpc++/impl/thd.h | 2 +- include/grpc++/server.h | 4 +- include/grpc++/server_builder.h | 2 +- include/grpc++/server_context.h | 6 +- include/grpc++/server_credentials.h | 2 +- .../grpc++/{ => support}/async_unary_call.h | 10 +- include/grpc++/{ => support}/auth_context.h | 8 +- include/grpc++/{ => support}/byte_buffer.h | 12 +- .../grpc++/{ => support}/channel_arguments.h | 8 +- include/grpc++/{ => support}/config.h | 6 +- .../grpc++/{ => support}/config_protobuf.h | 6 +- .../{ => support}/dynamic_thread_pool.h | 17 ++- .../{ => support}/fixed_size_thread_pool.h | 15 +- include/grpc++/{ => support}/slice.h | 8 +- include/grpc++/{ => support}/status.h | 10 +- .../grpc++/{ => support}/status_code_enum.h | 6 +- include/grpc++/{ => support}/stream.h | 12 +- include/grpc++/{ => support}/stub_options.h | 6 +- .../{ => support}/thread_pool_interface.h | 6 +- include/grpc++/{ => support}/time.h | 8 +- src/compiler/config.h | 4 +- src/compiler/cpp_generator.cc | 12 +- src/compiler/python_generator.cc | 2 +- src/cpp/client/channel.cc | 11 +- src/cpp/client/channel_arguments.cc | 3 +- src/cpp/client/client_context.cc | 2 +- src/cpp/client/create_channel.cc | 2 +- src/cpp/client/create_channel_internal.h | 2 +- src/cpp/client/generic_stub.cc | 2 +- src/cpp/client/insecure_credentials.cc | 8 +- src/cpp/client/secure_channel_arguments.cc | 4 +- src/cpp/client/secure_credentials.cc | 2 +- src/cpp/client/secure_credentials.h | 2 +- src/cpp/common/auth_property_iterator.cc | 2 +- src/cpp/common/call.cc | 5 +- src/cpp/common/completion_queue.cc | 2 +- src/cpp/common/create_auth_context.h | 2 +- .../common/insecure_create_auth_context.cc | 2 +- src/cpp/common/secure_auth_context.h | 2 +- src/cpp/common/secure_create_auth_context.cc | 2 +- src/cpp/proto/proto_utils.cc | 2 +- src/cpp/server/async_generic_service.cc | 2 +- src/cpp/server/create_default_thread_pool.cc | 2 +- src/cpp/server/dynamic_thread_pool.cc | 2 +- src/cpp/server/fixed_size_thread_pool.cc | 2 +- src/cpp/server/secure_server_credentials.h | 4 +- src/cpp/server/server.cc | 7 +- src/cpp/server/server_builder.cc | 4 +- src/cpp/server/server_context.cc | 2 +- src/cpp/util/byte_buffer.cc | 2 +- src/cpp/util/slice.cc | 2 +- src/cpp/util/status.cc | 2 +- src/cpp/util/time.cc | 4 +- test/cpp/client/channel_arguments_test.cc | 2 +- .../cpp/common/auth_property_iterator_test.cc | 2 +- test/cpp/common/secure_auth_context_test.cc | 2 +- test/cpp/end2end/async_end2end_test.cc | 19 +-- test/cpp/end2end/client_crash_test.cc | 19 +-- test/cpp/end2end/client_crash_test_server.cc | 1 - test/cpp/end2end/end2end_test.cc | 24 ++-- test/cpp/end2end/generic_end2end_test.cc | 24 ++-- test/cpp/end2end/mock_test.cc | 20 ++- test/cpp/end2end/server_crash_test.cc | 19 +-- test/cpp/end2end/server_crash_test_client.cc | 2 - test/cpp/end2end/shutdown_test.cc | 16 +-- test/cpp/end2end/thread_stress_test.cc | 20 ++- test/cpp/end2end/zookeeper_test.cc | 11 +- test/cpp/interop/client.cc | 3 +- test/cpp/interop/client_helper.cc | 9 +- test/cpp/interop/client_helper.h | 1 - test/cpp/interop/interop_client.cc | 8 +- test/cpp/interop/interop_client.h | 2 +- test/cpp/interop/interop_test.cc | 11 +- test/cpp/interop/reconnect_interop_client.cc | 1 - test/cpp/interop/reconnect_interop_server.cc | 9 +- test/cpp/interop/server.cc | 14 +- test/cpp/interop/server_helper.cc | 1 - test/cpp/qps/client.h | 8 +- test/cpp/qps/client_async.cc | 6 +- test/cpp/qps/client_sync.cc | 9 +- test/cpp/qps/driver.cc | 22 +-- test/cpp/qps/interarrival.h | 2 +- test/cpp/qps/perf_db_client.h | 3 +- test/cpp/qps/qps_interarrival_test.cc | 4 +- test/cpp/qps/qps_openloop_test.cc | 4 +- test/cpp/qps/qps_test.cc | 4 +- test/cpp/qps/qps_test_with_poll.cc | 4 +- test/cpp/qps/qps_worker.cc | 5 +- test/cpp/qps/report.h | 3 +- test/cpp/qps/server_async.cc | 10 +- test/cpp/qps/server_sync.cc | 15 +- test/cpp/qps/stats.h | 3 +- test/cpp/qps/sync_streaming_ping_pong_test.cc | 4 +- test/cpp/qps/sync_unary_ping_pong_test.cc | 4 +- test/cpp/qps/timer.cc | 1 - test/cpp/qps/worker.cc | 2 +- test/cpp/server/dynamic_thread_pool_test.cc | 3 +- .../cpp/server/fixed_size_thread_pool_test.cc | 3 +- test/cpp/util/byte_buffer_test.cc | 4 +- test/cpp/util/cli_call.cc | 11 +- test/cpp/util/cli_call.h | 3 +- test/cpp/util/cli_call_test.cc | 13 +- test/cpp/util/create_test_channel.cc | 4 +- test/cpp/util/create_test_channel.h | 1 - test/cpp/util/grpc_cli.cc | 7 +- test/cpp/util/slice_test.cc | 2 +- test/cpp/util/status_test.cc | 3 +- test/cpp/util/time_test.cc | 2 +- tools/doxygen/Doxyfile.c++ | 36 ++--- tools/doxygen/Doxyfile.c++.internal | 36 ++--- tools/run_tests/sources_and_headers.json | 136 +++++++++--------- vsprojects/grpc++/grpc++.vcxproj | 34 ++--- vsprojects/grpc++/grpc++.vcxproj.filters | 90 ++++++------ .../grpc++_unsecure/grpc++_unsecure.vcxproj | 34 ++--- .../grpc++_unsecure.vcxproj.filters | 90 ++++++------ 136 files changed, 660 insertions(+), 727 deletions(-) rename include/grpc++/{ => generic}/async_generic_service.h (92%) rename include/grpc++/{ => generic}/generic_stub.h (91%) rename include/grpc++/{ => support}/async_unary_call.h (97%) rename include/grpc++/{ => support}/auth_context.h (95%) rename include/grpc++/{ => support}/byte_buffer.h (93%) rename include/grpc++/{ => support}/channel_arguments.h (94%) rename include/grpc++/{ => support}/config.h (96%) rename include/grpc++/{ => support}/config_protobuf.h (95%) rename include/grpc++/{ => support}/dynamic_thread_pool.h (91%) rename include/grpc++/{ => support}/fixed_size_thread_pool.h (90%) rename include/grpc++/{ => support}/slice.h (94%) rename include/grpc++/{ => support}/status.h (92%) rename include/grpc++/{ => support}/status_code_enum.h (98%) rename include/grpc++/{ => support}/stream.h (99%) rename include/grpc++/{ => support}/stub_options.h (93%) rename include/grpc++/{ => support}/thread_pool_interface.h (93%) rename include/grpc++/{ => support}/time.h (96%) diff --git a/BUILD b/BUILD index d712053a3d4..620a954a5af 100644 --- a/BUILD +++ b/BUILD @@ -710,21 +710,13 @@ cc_library( "src/cpp/util/time.cc", ], hdrs = [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -743,13 +735,21 @@ cc_library( "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", ], includes = [ "include", @@ -796,21 +796,13 @@ cc_library( "src/cpp/util/time.cc", ], hdrs = [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -829,13 +821,21 @@ cc_library( "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", ], includes = [ "include", diff --git a/Makefile b/Makefile index 5cce835c028..9dffab01c02 100644 --- a/Makefile +++ b/Makefile @@ -4629,21 +4629,13 @@ LIBGRPC++_SRC = \ src/cpp/util/time.cc \ PUBLIC_HEADERS_CXX += \ - include/grpc++/async_generic_service.h \ - include/grpc++/async_unary_call.h \ - include/grpc++/auth_context.h \ - include/grpc++/byte_buffer.h \ include/grpc++/channel.h \ - include/grpc++/channel_arguments.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ - include/grpc++/config.h \ - include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ - include/grpc++/dynamic_thread_pool.h \ - include/grpc++/fixed_size_thread_pool.h \ - include/grpc++/generic_stub.h \ + include/grpc++/generic/async_generic_service.h \ + include/grpc++/generic/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ @@ -4662,13 +4654,21 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ - include/grpc++/slice.h \ - include/grpc++/status.h \ - include/grpc++/status_code_enum.h \ - include/grpc++/stream.h \ - include/grpc++/stub_options.h \ - include/grpc++/thread_pool_interface.h \ - include/grpc++/time.h \ + include/grpc++/support/async_unary_call.h \ + include/grpc++/support/auth_context.h \ + include/grpc++/support/byte_buffer.h \ + include/grpc++/support/channel_arguments.h \ + include/grpc++/support/config.h \ + include/grpc++/support/config_protobuf.h \ + include/grpc++/support/dynamic_thread_pool.h \ + include/grpc++/support/fixed_size_thread_pool.h \ + include/grpc++/support/slice.h \ + include/grpc++/support/status.h \ + include/grpc++/support/status_code_enum.h \ + include/grpc++/support/stream.h \ + include/grpc++/support/stub_options.h \ + include/grpc++/support/thread_pool_interface.h \ + include/grpc++/support/time.h \ LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC)))) @@ -4871,21 +4871,13 @@ LIBGRPC++_UNSECURE_SRC = \ src/cpp/util/time.cc \ PUBLIC_HEADERS_CXX += \ - include/grpc++/async_generic_service.h \ - include/grpc++/async_unary_call.h \ - include/grpc++/auth_context.h \ - include/grpc++/byte_buffer.h \ include/grpc++/channel.h \ - include/grpc++/channel_arguments.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ - include/grpc++/config.h \ - include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ - include/grpc++/dynamic_thread_pool.h \ - include/grpc++/fixed_size_thread_pool.h \ - include/grpc++/generic_stub.h \ + include/grpc++/generic/async_generic_service.h \ + include/grpc++/generic/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ @@ -4904,13 +4896,21 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ - include/grpc++/slice.h \ - include/grpc++/status.h \ - include/grpc++/status_code_enum.h \ - include/grpc++/stream.h \ - include/grpc++/stub_options.h \ - include/grpc++/thread_pool_interface.h \ - include/grpc++/time.h \ + include/grpc++/support/async_unary_call.h \ + include/grpc++/support/auth_context.h \ + include/grpc++/support/byte_buffer.h \ + include/grpc++/support/channel_arguments.h \ + include/grpc++/support/config.h \ + include/grpc++/support/config_protobuf.h \ + include/grpc++/support/dynamic_thread_pool.h \ + include/grpc++/support/fixed_size_thread_pool.h \ + include/grpc++/support/slice.h \ + include/grpc++/support/status.h \ + include/grpc++/support/status_code_enum.h \ + include/grpc++/support/stream.h \ + include/grpc++/support/stub_options.h \ + include/grpc++/support/thread_pool_interface.h \ + include/grpc++/support/time.h \ LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC)))) diff --git a/build.json b/build.json index 484502bf346..8eb4f377037 100644 --- a/build.json +++ b/build.json @@ -30,21 +30,13 @@ { "name": "grpc++_base", "public_headers": [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -63,13 +55,21 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h" + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h" ], "headers": [ "src/cpp/client/create_channel_internal.h", diff --git a/examples/pubsub/main.cc b/examples/pubsub/main.cc index fcee3b316b3..32102dcb5cd 100644 --- a/examples/pubsub/main.cc +++ b/examples/pubsub/main.cc @@ -37,18 +37,16 @@ #include #include +#include #include #include -#include -#include #include #include #include -#include -#include "test/cpp/util/test_config.h" #include "examples/pubsub/publisher.h" #include "examples/pubsub/subscriber.h" +#include "test/cpp/util/test_config.h" DEFINE_int32(server_port, 443, "Server port."); DEFINE_string(server_host, "pubsub-staging.googleapis.com", diff --git a/examples/pubsub/publisher.h b/examples/pubsub/publisher.h index b98e6973dce..02e6194b0bd 100644 --- a/examples/pubsub/publisher.h +++ b/examples/pubsub/publisher.h @@ -35,7 +35,6 @@ #define GRPC_EXAMPLES_PUBSUB_PUBLISHER_H #include -#include #include "examples/pubsub/pubsub.grpc.pb.h" diff --git a/examples/pubsub/publisher_test.cc b/examples/pubsub/publisher_test.cc index 972b426e641..c2eb295ef27 100644 --- a/examples/pubsub/publisher_test.cc +++ b/examples/pubsub/publisher_test.cc @@ -31,7 +31,6 @@ * */ -#include #include #include #include @@ -39,7 +38,6 @@ #include #include #include -#include #include #include "examples/pubsub/publisher.h" diff --git a/examples/pubsub/subscriber.h b/examples/pubsub/subscriber.h index 87c833102c7..c5b1df0d3ec 100644 --- a/examples/pubsub/subscriber.h +++ b/examples/pubsub/subscriber.h @@ -35,7 +35,6 @@ #define GRPC_EXAMPLES_PUBSUB_SUBSCRIBER_H #include -#include #include "examples/pubsub/pubsub.grpc.pb.h" diff --git a/examples/pubsub/subscriber_test.cc b/examples/pubsub/subscriber_test.cc index 7974ca88c2d..c5a077f407c 100644 --- a/examples/pubsub/subscriber_test.cc +++ b/examples/pubsub/subscriber_test.cc @@ -31,7 +31,6 @@ * */ -#include #include #include #include @@ -39,7 +38,6 @@ #include #include #include -#include #include #include "examples/pubsub/subscriber.h" diff --git a/include/grpc++/channel.h b/include/grpc++/channel.h index 7d6216e9c49..a8af74175b4 100644 --- a/include/grpc++/channel.h +++ b/include/grpc++/channel.h @@ -37,9 +37,9 @@ #include #include -#include #include #include +#include struct grpc_channel; diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h index 55ed17506a6..ee28f360cbe 100644 --- a/include/grpc++/client_context.h +++ b/include/grpc++/client_context.h @@ -42,10 +42,10 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include struct census_context; diff --git a/include/grpc++/completion_queue.h b/include/grpc++/completion_queue.h index 061f4874fab..d81d2e735d2 100644 --- a/include/grpc++/completion_queue.h +++ b/include/grpc++/completion_queue.h @@ -36,8 +36,8 @@ #include #include -#include -#include +#include +#include struct grpc_completion_queue; diff --git a/include/grpc++/create_channel.h b/include/grpc++/create_channel.h index fe344521284..0e559ac53e4 100644 --- a/include/grpc++/create_channel.h +++ b/include/grpc++/create_channel.h @@ -36,11 +36,11 @@ #include -#include #include +#include +#include namespace grpc { -class ChannelArguments; // If creds does not hold an object or is invalid, a lame channel is returned. std::shared_ptr CreateChannel( diff --git a/include/grpc++/credentials.h b/include/grpc++/credentials.h index 306dc961c0e..71e1f00f15a 100644 --- a/include/grpc++/credentials.h +++ b/include/grpc++/credentials.h @@ -36,8 +36,8 @@ #include -#include #include +#include namespace grpc { class ChannelArguments; diff --git a/include/grpc++/async_generic_service.h b/include/grpc++/generic/async_generic_service.h similarity index 92% rename from include/grpc++/async_generic_service.h rename to include/grpc++/generic/async_generic_service.h index b435c6e73d2..35bc9458242 100644 --- a/include/grpc++/async_generic_service.h +++ b/include/grpc++/generic/async_generic_service.h @@ -31,11 +31,11 @@ * */ -#ifndef GRPCXX_ASYNC_GENERIC_SERVICE_H -#define GRPCXX_ASYNC_GENERIC_SERVICE_H +#ifndef GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H +#define GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H -#include -#include +#include +#include struct grpc_server; @@ -75,4 +75,4 @@ class AsyncGenericService GRPC_FINAL { } // namespace grpc -#endif // GRPCXX_ASYNC_GENERIC_SERVICE_H +#endif // GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H diff --git a/include/grpc++/generic_stub.h b/include/grpc++/generic/generic_stub.h similarity index 91% rename from include/grpc++/generic_stub.h rename to include/grpc++/generic/generic_stub.h index 734440881e0..08ed77aefb6 100644 --- a/include/grpc++/generic_stub.h +++ b/include/grpc++/generic/generic_stub.h @@ -31,11 +31,11 @@ * */ -#ifndef GRPCXX_GENERIC_STUB_H -#define GRPCXX_GENERIC_STUB_H +#ifndef GRPCXX_GENERIC_GENERIC_STUB_H +#define GRPCXX_GENERIC_GENERIC_STUB_H -#include -#include +#include +#include namespace grpc { @@ -60,4 +60,4 @@ class GenericStub GRPC_FINAL { } // namespace grpc -#endif // GRPCXX_GENERIC_STUB_H +#endif // GRPCXX_GENERIC_GENERIC_STUB_H diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h index bc1db4c12c0..ed3110fdb73 100644 --- a/include/grpc++/impl/call.h +++ b/include/grpc++/impl/call.h @@ -34,18 +34,17 @@ #ifndef GRPCXX_IMPL_CALL_H #define GRPCXX_IMPL_CALL_H -#include -#include -#include -#include -#include -#include - #include #include #include +#include -#include +#include +#include +#include +#include +#include +#include struct grpc_call; struct grpc_op; diff --git a/include/grpc++/impl/client_unary_call.h b/include/grpc++/impl/client_unary_call.h index 4aae816cd73..4cdc800267a 100644 --- a/include/grpc++/impl/client_unary_call.h +++ b/include/grpc++/impl/client_unary_call.h @@ -34,10 +34,9 @@ #ifndef GRPCXX_IMPL_CLIENT_UNARY_CALL_H #define GRPCXX_IMPL_CLIENT_UNARY_CALL_H -#include -#include - #include +#include +#include namespace grpc { diff --git a/include/grpc++/impl/proto_utils.h b/include/grpc++/impl/proto_utils.h index ebefa3e1bec..283e33486df 100644 --- a/include/grpc++/impl/proto_utils.h +++ b/include/grpc++/impl/proto_utils.h @@ -38,8 +38,8 @@ #include #include -#include -#include +#include +#include namespace grpc { diff --git a/include/grpc++/impl/rpc_service_method.h b/include/grpc++/impl/rpc_service_method.h index 078c8c491a9..0138eb2ac0f 100644 --- a/include/grpc++/impl/rpc_service_method.h +++ b/include/grpc++/impl/rpc_service_method.h @@ -39,10 +39,10 @@ #include #include -#include #include -#include -#include +#include +#include +#include namespace grpc { class ServerContext; diff --git a/include/grpc++/impl/service_type.h b/include/grpc++/impl/service_type.h index c33a278f5ba..3b6ac1de771 100644 --- a/include/grpc++/impl/service_type.h +++ b/include/grpc++/impl/service_type.h @@ -34,10 +34,10 @@ #ifndef GRPCXX_IMPL_SERVICE_TYPE_H #define GRPCXX_IMPL_SERVICE_TYPE_H -#include #include #include -#include +#include +#include namespace grpc { diff --git a/include/grpc++/impl/sync.h b/include/grpc++/impl/sync.h index 2f41d2bdebb..999c4303cbe 100644 --- a/include/grpc++/impl/sync.h +++ b/include/grpc++/impl/sync.h @@ -34,7 +34,7 @@ #ifndef GRPCXX_IMPL_SYNC_H #define GRPCXX_IMPL_SYNC_H -#include +#include #ifdef GRPC_CXX0X_NO_THREAD #include diff --git a/include/grpc++/impl/thd.h b/include/grpc++/impl/thd.h index 4c4578a92da..f8d4258ac61 100644 --- a/include/grpc++/impl/thd.h +++ b/include/grpc++/impl/thd.h @@ -34,7 +34,7 @@ #ifndef GRPCXX_IMPL_THD_H #define GRPCXX_IMPL_THD_H -#include +#include #ifdef GRPC_CXX0X_NO_THREAD #include diff --git a/include/grpc++/server.h b/include/grpc++/server.h index a2bc097c7f7..183cbc46929 100644 --- a/include/grpc++/server.h +++ b/include/grpc++/server.h @@ -38,11 +38,11 @@ #include #include -#include #include #include #include -#include +#include +#include struct grpc_server; diff --git a/include/grpc++/server_builder.h b/include/grpc++/server_builder.h index 906daf13709..95325915a19 100644 --- a/include/grpc++/server_builder.h +++ b/include/grpc++/server_builder.h @@ -37,7 +37,7 @@ #include #include -#include +#include namespace grpc { diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h index b87a1f03798..ce3cb47a237 100644 --- a/include/grpc++/server_context.h +++ b/include/grpc++/server_context.h @@ -39,9 +39,9 @@ #include #include -#include -#include -#include +#include +#include +#include struct gpr_timespec; struct grpc_metadata; diff --git a/include/grpc++/server_credentials.h b/include/grpc++/server_credentials.h index 11acd67e8ad..16b78c08afc 100644 --- a/include/grpc++/server_credentials.h +++ b/include/grpc++/server_credentials.h @@ -37,7 +37,7 @@ #include #include -#include +#include struct grpc_server; diff --git a/include/grpc++/async_unary_call.h b/include/grpc++/support/async_unary_call.h similarity index 97% rename from include/grpc++/async_unary_call.h rename to include/grpc++/support/async_unary_call.h index 4e1dd15f32c..0f4ad2656fc 100644 --- a/include/grpc++/async_unary_call.h +++ b/include/grpc++/support/async_unary_call.h @@ -31,17 +31,17 @@ * */ -#ifndef GRPCXX_ASYNC_UNARY_CALL_H -#define GRPCXX_ASYNC_UNARY_CALL_H +#ifndef GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H +#define GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H +#include #include #include #include #include #include #include -#include -#include +#include namespace grpc { @@ -152,4 +152,4 @@ class ServerAsyncResponseWriter GRPC_FINAL } // namespace grpc -#endif // GRPCXX_ASYNC_UNARY_CALL_H +#endif // GRPCXX_SUPPORT_ASYNC_UNARY_CALL_H diff --git a/include/grpc++/auth_context.h b/include/grpc++/support/auth_context.h similarity index 95% rename from include/grpc++/auth_context.h rename to include/grpc++/support/auth_context.h index 7dced90ce50..f4f2dcf5bbd 100644 --- a/include/grpc++/auth_context.h +++ b/include/grpc++/support/auth_context.h @@ -31,13 +31,13 @@ * */ -#ifndef GRPCXX_AUTH_CONTEXT_H -#define GRPCXX_AUTH_CONTEXT_H +#ifndef GRPCXX_SUPPORT_AUTH_CONTEXT_H +#define GRPCXX_SUPPORT_AUTH_CONTEXT_H #include #include -#include +#include struct grpc_auth_context; struct grpc_auth_property; @@ -92,4 +92,4 @@ class AuthContext { } // namespace grpc -#endif // GRPCXX_AUTH_CONTEXT_H +#endif // GRPCXX_SUPPORT_AUTH_CONTEXT_H diff --git a/include/grpc++/byte_buffer.h b/include/grpc++/support/byte_buffer.h similarity index 93% rename from include/grpc++/byte_buffer.h rename to include/grpc++/support/byte_buffer.h index 64677763985..3f8cc25f47a 100644 --- a/include/grpc++/byte_buffer.h +++ b/include/grpc++/support/byte_buffer.h @@ -31,16 +31,16 @@ * */ -#ifndef GRPCXX_BYTE_BUFFER_H -#define GRPCXX_BYTE_BUFFER_H +#ifndef GRPCXX_SUPPORT_BYTE_BUFFER_H +#define GRPCXX_SUPPORT_BYTE_BUFFER_H #include #include #include -#include -#include -#include #include +#include +#include +#include #include @@ -101,4 +101,4 @@ class SerializationTraits { } // namespace grpc -#endif // GRPCXX_BYTE_BUFFER_H +#endif // GRPCXX_SUPPORT_BYTE_BUFFER_H diff --git a/include/grpc++/channel_arguments.h b/include/grpc++/support/channel_arguments.h similarity index 94% rename from include/grpc++/channel_arguments.h rename to include/grpc++/support/channel_arguments.h index 4d926377ecd..cee68467c73 100644 --- a/include/grpc++/channel_arguments.h +++ b/include/grpc++/support/channel_arguments.h @@ -31,15 +31,15 @@ * */ -#ifndef GRPCXX_CHANNEL_ARGUMENTS_H -#define GRPCXX_CHANNEL_ARGUMENTS_H +#ifndef GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H +#define GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H #include #include -#include #include #include +#include namespace grpc { namespace testing { @@ -90,4 +90,4 @@ class ChannelArguments { } // namespace grpc -#endif // GRPCXX_CHANNEL_ARGUMENTS_H +#endif // GRPCXX_SUPPORT_CHANNEL_ARGUMENTS_H diff --git a/include/grpc++/config.h b/include/grpc++/support/config.h similarity index 96% rename from include/grpc++/config.h rename to include/grpc++/support/config.h index 889dc39eb7b..836bd47283a 100644 --- a/include/grpc++/config.h +++ b/include/grpc++/support/config.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_CONFIG_H -#define GRPCXX_CONFIG_H +#ifndef GRPCXX_SUPPORT_CONFIG_H +#define GRPCXX_SUPPORT_CONFIG_H #if !defined(GRPC_NO_AUTODETECT_PLATFORM) @@ -113,4 +113,4 @@ typedef GRPC_CUSTOM_STRING string; } // namespace grpc -#endif // GRPCXX_CONFIG_H +#endif // GRPCXX_SUPPORT_CONFIG_H diff --git a/include/grpc++/config_protobuf.h b/include/grpc++/support/config_protobuf.h similarity index 95% rename from include/grpc++/config_protobuf.h rename to include/grpc++/support/config_protobuf.h index 3afc7a58e2b..8235590d413 100644 --- a/include/grpc++/config_protobuf.h +++ b/include/grpc++/support/config_protobuf.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_CONFIG_PROTOBUF_H -#define GRPCXX_CONFIG_PROTOBUF_H +#ifndef GRPCXX_SUPPORT_CONFIG_PROTOBUF_H +#define GRPCXX_SUPPORT_CONFIG_PROTOBUF_H #ifndef GRPC_CUSTOM_PROTOBUF_INT64 #include @@ -69,4 +69,4 @@ typedef GRPC_CUSTOM_CODEDINPUTSTREAM CodedInputStream; } // namespace protobuf } // namespace grpc -#endif // GRPCXX_CONFIG_PROTOBUF_H +#endif // GRPCXX_SUPPORT_CONFIG_PROTOBUF_H diff --git a/include/grpc++/dynamic_thread_pool.h b/include/grpc++/support/dynamic_thread_pool.h similarity index 91% rename from include/grpc++/dynamic_thread_pool.h rename to include/grpc++/support/dynamic_thread_pool.h index a4d4885b512..6062705129d 100644 --- a/include/grpc++/dynamic_thread_pool.h +++ b/include/grpc++/support/dynamic_thread_pool.h @@ -31,19 +31,18 @@ * */ -#ifndef GRPCXX_DYNAMIC_THREAD_POOL_H -#define GRPCXX_DYNAMIC_THREAD_POOL_H - -#include - -#include -#include -#include +#ifndef GRPCXX_SUPPORT_DYNAMIC_THREAD_POOL_H +#define GRPCXX_SUPPORT_DYNAMIC_THREAD_POOL_H #include #include #include +#include +#include +#include +#include + namespace grpc { class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface { @@ -80,4 +79,4 @@ class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface { } // namespace grpc -#endif // GRPCXX_DYNAMIC_THREAD_POOL_H +#endif // GRPCXX_SUPPORT_DYNAMIC_THREAD_POOL_H diff --git a/include/grpc++/fixed_size_thread_pool.h b/include/grpc++/support/fixed_size_thread_pool.h similarity index 90% rename from include/grpc++/fixed_size_thread_pool.h rename to include/grpc++/support/fixed_size_thread_pool.h index 307e1661427..46ed745eff4 100644 --- a/include/grpc++/fixed_size_thread_pool.h +++ b/include/grpc++/support/fixed_size_thread_pool.h @@ -31,17 +31,16 @@ * */ -#ifndef GRPCXX_FIXED_SIZE_THREAD_POOL_H -#define GRPCXX_FIXED_SIZE_THREAD_POOL_H +#ifndef GRPCXX_SUPPORT_FIXED_SIZE_THREAD_POOL_H +#define GRPCXX_SUPPORT_FIXED_SIZE_THREAD_POOL_H -#include +#include +#include #include #include -#include - -#include -#include +#include +#include namespace grpc { @@ -64,4 +63,4 @@ class FixedSizeThreadPool GRPC_FINAL : public ThreadPoolInterface { } // namespace grpc -#endif // GRPCXX_FIXED_SIZE_THREAD_POOL_H +#endif // GRPCXX_SUPPORT_FIXED_SIZE_THREAD_POOL_H diff --git a/include/grpc++/slice.h b/include/grpc++/support/slice.h similarity index 94% rename from include/grpc++/slice.h rename to include/grpc++/support/slice.h index 3e01bcf0ad7..b2343a7f3df 100644 --- a/include/grpc++/slice.h +++ b/include/grpc++/support/slice.h @@ -31,11 +31,11 @@ * */ -#ifndef GRPCXX_SLICE_H -#define GRPCXX_SLICE_H +#ifndef GRPCXX_SUPPORT_SLICE_H +#define GRPCXX_SUPPORT_SLICE_H #include -#include +#include namespace grpc { @@ -71,4 +71,4 @@ class Slice GRPC_FINAL { } // namespace grpc -#endif // GRPCXX_SLICE_H +#endif // GRPCXX_SUPPORT_SLICE_H diff --git a/include/grpc++/status.h b/include/grpc++/support/status.h similarity index 92% rename from include/grpc++/status.h rename to include/grpc++/support/status.h index fb8526ddce0..05750ff600f 100644 --- a/include/grpc++/status.h +++ b/include/grpc++/support/status.h @@ -31,11 +31,11 @@ * */ -#ifndef GRPCXX_STATUS_H -#define GRPCXX_STATUS_H +#ifndef GRPCXX_SUPPORT_STATUS_H +#define GRPCXX_SUPPORT_STATUS_H -#include -#include +#include +#include namespace grpc { @@ -61,4 +61,4 @@ class Status { } // namespace grpc -#endif // GRPCXX_STATUS_H +#endif // GRPCXX_SUPPORT_STATUS_H diff --git a/include/grpc++/status_code_enum.h b/include/grpc++/support/status_code_enum.h similarity index 98% rename from include/grpc++/status_code_enum.h rename to include/grpc++/support/status_code_enum.h index 2211c964cda..7cb40452c84 100644 --- a/include/grpc++/status_code_enum.h +++ b/include/grpc++/support/status_code_enum.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_STATUS_CODE_ENUM_H -#define GRPCXX_STATUS_CODE_ENUM_H +#ifndef GRPCXX_SUPPORT_STATUS_CODE_ENUM_H +#define GRPCXX_SUPPORT_STATUS_CODE_ENUM_H namespace grpc { @@ -156,4 +156,4 @@ enum StatusCode { } // namespace grpc -#endif // GRPCXX_STATUS_CODE_ENUM_H +#endif // GRPCXX_SUPPORT_STATUS_CODE_ENUM_H diff --git a/include/grpc++/stream.h b/include/grpc++/support/stream.h similarity index 99% rename from include/grpc++/stream.h rename to include/grpc++/support/stream.h index 577eb4e9257..89a6dd693db 100644 --- a/include/grpc++/stream.h +++ b/include/grpc++/support/stream.h @@ -31,17 +31,17 @@ * */ -#ifndef GRPCXX_STREAM_H -#define GRPCXX_STREAM_H +#ifndef GRPCXX_SUPPORT_STREAM_H +#define GRPCXX_SUPPORT_STREAM_H +#include #include #include #include -#include #include #include -#include -#include +#include +#include namespace grpc { @@ -773,4 +773,4 @@ class ServerAsyncReaderWriter GRPC_FINAL : public ServerAsyncStreamingInterface, } // namespace grpc -#endif // GRPCXX_STREAM_H +#endif // GRPCXX_SUPPORT_STREAM_H diff --git a/include/grpc++/stub_options.h b/include/grpc++/support/stub_options.h similarity index 93% rename from include/grpc++/stub_options.h rename to include/grpc++/support/stub_options.h index c7c16dcd554..973aa9bc838 100644 --- a/include/grpc++/stub_options.h +++ b/include/grpc++/support/stub_options.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_STUB_OPTIONS_H -#define GRPCXX_STUB_OPTIONS_H +#ifndef GRPCXX_SUPPORT_STUB_OPTIONS_H +#define GRPCXX_SUPPORT_STUB_OPTIONS_H namespace grpc { @@ -40,4 +40,4 @@ class StubOptions {}; } // namespace grpc -#endif // GRPCXX_STUB_OPTIONS_H +#endif // GRPCXX_SUPPORT_STUB_OPTIONS_H diff --git a/include/grpc++/thread_pool_interface.h b/include/grpc++/support/thread_pool_interface.h similarity index 93% rename from include/grpc++/thread_pool_interface.h rename to include/grpc++/support/thread_pool_interface.h index d080b31dcc5..6528e7276f2 100644 --- a/include/grpc++/thread_pool_interface.h +++ b/include/grpc++/support/thread_pool_interface.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_THREAD_POOL_INTERFACE_H -#define GRPCXX_THREAD_POOL_INTERFACE_H +#ifndef GRPCXX_SUPPORT_THREAD_POOL_INTERFACE_H +#define GRPCXX_SUPPORT_THREAD_POOL_INTERFACE_H #include @@ -51,4 +51,4 @@ ThreadPoolInterface* CreateDefaultThreadPool(); } // namespace grpc -#endif // GRPCXX_THREAD_POOL_INTERFACE_H +#endif // GRPCXX_SUPPORT_THREAD_POOL_INTERFACE_H diff --git a/include/grpc++/time.h b/include/grpc++/support/time.h similarity index 96% rename from include/grpc++/time.h rename to include/grpc++/support/time.h index 8fb2f8505cd..2d4196b93b7 100644 --- a/include/grpc++/time.h +++ b/include/grpc++/support/time.h @@ -31,10 +31,10 @@ * */ -#ifndef GRPCXX_TIME_H -#define GRPCXX_TIME_H +#ifndef GRPCXX_SUPPORT_TIME_H +#define GRPCXX_SUPPORT_TIME_H -#include +#include namespace grpc { @@ -107,4 +107,4 @@ class TimePoint { #endif // !GRPC_CXX0X_NO_CHRONO -#endif // GRPCXX_TIME_H +#endif // GRPCXX_SUPPORT_TIME_H diff --git a/src/compiler/config.h b/src/compiler/config.h index cd52aca57d3..fea976c3181 100644 --- a/src/compiler/config.h +++ b/src/compiler/config.h @@ -34,8 +34,8 @@ #ifndef SRC_COMPILER_CONFIG_H #define SRC_COMPILER_CONFIG_H -#include -#include +#include +#include #ifndef GRPC_CUSTOM_DESCRIPTOR #include diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index b04ac038ad2..5d82b605fb3 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -115,10 +115,10 @@ grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file, "#include \n" "#include \n" "#include \n" - "#include \n" - "#include \n" - "#include \n" - "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" "\n" "namespace grpc {\n" "class CompletionQueue;\n" @@ -701,12 +701,12 @@ grpc::string GetSourceIncludes(const grpc::protobuf::FileDescriptor *file, grpc::protobuf::io::Printer printer(&output_stream, '$'); std::map vars; - printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); - printer.Print(vars, "#include \n"); + printer.Print(vars, "#include \n"); + printer.Print(vars, "#include \n"); if (!file->package().empty()) { std::vector parts = diff --git a/src/compiler/python_generator.cc b/src/compiler/python_generator.cc index 2982a89fad1..72c457ac6b1 100644 --- a/src/compiler/python_generator.cc +++ b/src/compiler/python_generator.cc @@ -42,7 +42,7 @@ #include #include -#include +#include #include "src/compiler/config.h" #include "src/compiler/generator_helpers.h" #include "src/compiler/python_generator.h" diff --git a/src/cpp/client/channel.cc b/src/cpp/client/channel.cc index bb4be07beb0..8bf2e4687e5 100644 --- a/src/cpp/client/channel.cc +++ b/src/cpp/client/channel.cc @@ -38,17 +38,16 @@ #include #include #include - -#include "src/core/profiling/timers.h" -#include #include #include -#include #include #include #include -#include -#include +#include +#include +#include +#include +#include "src/core/profiling/timers.h" namespace grpc { diff --git a/src/cpp/client/channel_arguments.cc b/src/cpp/client/channel_arguments.cc index da6602e7af3..50422d06c92 100644 --- a/src/cpp/client/channel_arguments.cc +++ b/src/cpp/client/channel_arguments.cc @@ -31,10 +31,9 @@ * */ -#include +#include #include - #include "src/core/channel/channel_args.h" namespace grpc { diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc index a3906fc781c..c4d7cf2e514 100644 --- a/src/cpp/client/client_context.cc +++ b/src/cpp/client/client_context.cc @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include "src/core/channel/compress_filter.h" #include "src/cpp/common/create_auth_context.h" diff --git a/src/cpp/client/create_channel.cc b/src/cpp/client/create_channel.cc index 70ea7e0e275..8c571cbbaad 100644 --- a/src/cpp/client/create_channel.cc +++ b/src/cpp/client/create_channel.cc @@ -35,8 +35,8 @@ #include #include -#include #include +#include #include "src/cpp/client/create_channel_internal.h" diff --git a/src/cpp/client/create_channel_internal.h b/src/cpp/client/create_channel_internal.h index 16924719909..4385ec701e2 100644 --- a/src/cpp/client/create_channel_internal.h +++ b/src/cpp/client/create_channel_internal.h @@ -36,7 +36,7 @@ #include -#include +#include struct grpc_channel; diff --git a/src/cpp/client/generic_stub.cc b/src/cpp/client/generic_stub.cc index ee89c029651..7a2fdf941ce 100644 --- a/src/cpp/client/generic_stub.cc +++ b/src/cpp/client/generic_stub.cc @@ -31,7 +31,7 @@ * */ -#include +#include #include diff --git a/src/cpp/client/insecure_credentials.cc b/src/cpp/client/insecure_credentials.cc index 97931406af3..4a4d2cb97d4 100644 --- a/src/cpp/client/insecure_credentials.cc +++ b/src/cpp/client/insecure_credentials.cc @@ -31,13 +31,13 @@ * */ +#include + #include #include - #include -#include -#include -#include +#include +#include #include "src/cpp/client/create_channel_internal.h" namespace grpc { diff --git a/src/cpp/client/secure_channel_arguments.cc b/src/cpp/client/secure_channel_arguments.cc index d89df999adc..e17d3b58b06 100644 --- a/src/cpp/client/secure_channel_arguments.cc +++ b/src/cpp/client/secure_channel_arguments.cc @@ -31,9 +31,9 @@ * */ -#include -#include +#include +#include #include "src/core/channel/channel_args.h" namespace grpc { diff --git a/src/cpp/client/secure_credentials.cc b/src/cpp/client/secure_credentials.cc index 1e912c6beba..f368f2590a4 100644 --- a/src/cpp/client/secure_credentials.cc +++ b/src/cpp/client/secure_credentials.cc @@ -33,8 +33,8 @@ #include #include -#include #include +#include #include "src/cpp/client/create_channel_internal.h" #include "src/cpp/client/secure_credentials.h" diff --git a/src/cpp/client/secure_credentials.h b/src/cpp/client/secure_credentials.h index 974d83514de..62d31854776 100644 --- a/src/cpp/client/secure_credentials.h +++ b/src/cpp/client/secure_credentials.h @@ -36,7 +36,7 @@ #include -#include +#include #include namespace grpc { diff --git a/src/cpp/common/auth_property_iterator.cc b/src/cpp/common/auth_property_iterator.cc index d3bfd5cb6b3..5ccf8cf72c1 100644 --- a/src/cpp/common/auth_property_iterator.cc +++ b/src/cpp/common/auth_property_iterator.cc @@ -31,7 +31,7 @@ * */ -#include +#include #include diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 479f14d42bb..16aa2c9fb9d 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -34,10 +34,9 @@ #include #include -#include -#include #include - +#include +#include #include "src/core/profiling/timers.h" namespace grpc { diff --git a/src/cpp/common/completion_queue.cc b/src/cpp/common/completion_queue.cc index fca33f8f542..a175beb452c 100644 --- a/src/cpp/common/completion_queue.cc +++ b/src/cpp/common/completion_queue.cc @@ -36,7 +36,7 @@ #include #include -#include +#include namespace grpc { diff --git a/src/cpp/common/create_auth_context.h b/src/cpp/common/create_auth_context.h index 9082a90c6d7..b4962bae4e3 100644 --- a/src/cpp/common/create_auth_context.h +++ b/src/cpp/common/create_auth_context.h @@ -33,7 +33,7 @@ #include #include -#include +#include namespace grpc { diff --git a/src/cpp/common/insecure_create_auth_context.cc b/src/cpp/common/insecure_create_auth_context.cc index 07fc0bd549c..fe80c1a80cd 100644 --- a/src/cpp/common/insecure_create_auth_context.cc +++ b/src/cpp/common/insecure_create_auth_context.cc @@ -33,7 +33,7 @@ #include #include -#include +#include namespace grpc { diff --git a/src/cpp/common/secure_auth_context.h b/src/cpp/common/secure_auth_context.h index 264ed620a30..01b71261898 100644 --- a/src/cpp/common/secure_auth_context.h +++ b/src/cpp/common/secure_auth_context.h @@ -34,7 +34,7 @@ #ifndef GRPC_INTERNAL_CPP_COMMON_SECURE_AUTH_CONTEXT_H #define GRPC_INTERNAL_CPP_COMMON_SECURE_AUTH_CONTEXT_H -#include +#include struct grpc_auth_context; diff --git a/src/cpp/common/secure_create_auth_context.cc b/src/cpp/common/secure_create_auth_context.cc index d81f4bbc4a7..f13d25a1dd6 100644 --- a/src/cpp/common/secure_create_auth_context.cc +++ b/src/cpp/common/secure_create_auth_context.cc @@ -34,7 +34,7 @@ #include #include -#include +#include #include "src/cpp/common/secure_auth_context.h" namespace grpc { diff --git a/src/cpp/proto/proto_utils.cc b/src/cpp/proto/proto_utils.cc index 05470ec627e..be84c222a0e 100644 --- a/src/cpp/proto/proto_utils.cc +++ b/src/cpp/proto/proto_utils.cc @@ -32,7 +32,6 @@ */ #include -#include #include #include @@ -40,6 +39,7 @@ #include #include #include +#include const int kMaxBufferLength = 8192; diff --git a/src/cpp/server/async_generic_service.cc b/src/cpp/server/async_generic_service.cc index 2e99afcb5f1..6b9ea532b6d 100644 --- a/src/cpp/server/async_generic_service.cc +++ b/src/cpp/server/async_generic_service.cc @@ -31,7 +31,7 @@ * */ -#include +#include #include diff --git a/src/cpp/server/create_default_thread_pool.cc b/src/cpp/server/create_default_thread_pool.cc index 9f59d254f1d..0eef7dfffed 100644 --- a/src/cpp/server/create_default_thread_pool.cc +++ b/src/cpp/server/create_default_thread_pool.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #ifndef GRPC_CUSTOM_DEFAULT_THREAD_POOL diff --git a/src/cpp/server/dynamic_thread_pool.cc b/src/cpp/server/dynamic_thread_pool.cc index b475f43b1da..d33852364d2 100644 --- a/src/cpp/server/dynamic_thread_pool.cc +++ b/src/cpp/server/dynamic_thread_pool.cc @@ -33,7 +33,7 @@ #include #include -#include +#include namespace grpc { DynamicThreadPool::DynamicThread::DynamicThread(DynamicThreadPool* pool) diff --git a/src/cpp/server/fixed_size_thread_pool.cc b/src/cpp/server/fixed_size_thread_pool.cc index bafbc5802a4..427e9044497 100644 --- a/src/cpp/server/fixed_size_thread_pool.cc +++ b/src/cpp/server/fixed_size_thread_pool.cc @@ -33,7 +33,7 @@ #include #include -#include +#include namespace grpc { diff --git a/src/cpp/server/secure_server_credentials.h b/src/cpp/server/secure_server_credentials.h index b9803f107e5..d3d37b188df 100644 --- a/src/cpp/server/secure_server_credentials.h +++ b/src/cpp/server/secure_server_credentials.h @@ -34,10 +34,10 @@ #ifndef GRPC_INTERNAL_CPP_SERVER_SECURE_SERVER_CREDENTIALS_H #define GRPC_INTERNAL_CPP_SERVER_SECURE_SERVER_CREDENTIALS_H -#include - #include +#include + namespace grpc { class SecureServerCredentials GRPC_FINAL : public ServerCredentials { diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index e039c07374d..568bb8ad5e3 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -32,19 +32,20 @@ */ #include + #include #include #include #include #include -#include +#include #include #include #include #include -#include -#include +#include +#include #include "src/core/profiling/timers.h" diff --git a/src/cpp/server/server_builder.cc b/src/cpp/server/server_builder.cc index 0b11d861736..4e8399405e6 100644 --- a/src/cpp/server/server_builder.cc +++ b/src/cpp/server/server_builder.cc @@ -37,8 +37,8 @@ #include #include #include -#include -#include +#include +#include namespace grpc { diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc index 03461ddda54..acc163d6b5d 100644 --- a/src/cpp/server/server_context.cc +++ b/src/cpp/server/server_context.cc @@ -38,7 +38,7 @@ #include #include #include -#include +#include #include "src/core/channel/compress_filter.h" #include "src/cpp/common/create_auth_context.h" diff --git a/src/cpp/util/byte_buffer.cc b/src/cpp/util/byte_buffer.cc index a66c92c3e15..e46e656beb0 100644 --- a/src/cpp/util/byte_buffer.cc +++ b/src/cpp/util/byte_buffer.cc @@ -32,7 +32,7 @@ */ #include -#include +#include namespace grpc { diff --git a/src/cpp/util/slice.cc b/src/cpp/util/slice.cc index 57370dabc68..7e88423b6c5 100644 --- a/src/cpp/util/slice.cc +++ b/src/cpp/util/slice.cc @@ -31,7 +31,7 @@ * */ -#include +#include namespace grpc { diff --git a/src/cpp/util/status.cc b/src/cpp/util/status.cc index 5bb9eda3d9c..ad9850cf074 100644 --- a/src/cpp/util/status.cc +++ b/src/cpp/util/status.cc @@ -31,7 +31,7 @@ * */ -#include +#include namespace grpc { diff --git a/src/cpp/util/time.cc b/src/cpp/util/time.cc index 799c597e0b9..b3401eb26b7 100644 --- a/src/cpp/util/time.cc +++ b/src/cpp/util/time.cc @@ -31,12 +31,12 @@ * */ -#include +#include #ifndef GRPC_CXX0X_NO_CHRONO #include -#include +#include using std::chrono::duration_cast; using std::chrono::nanoseconds; diff --git a/test/cpp/client/channel_arguments_test.cc b/test/cpp/client/channel_arguments_test.cc index 01c56cb795f..3d75e7b0e6a 100644 --- a/test/cpp/client/channel_arguments_test.cc +++ b/test/cpp/client/channel_arguments_test.cc @@ -31,7 +31,7 @@ * */ -#include +#include #include #include diff --git a/test/cpp/common/auth_property_iterator_test.cc b/test/cpp/common/auth_property_iterator_test.cc index bf17842a845..630c38c7f67 100644 --- a/test/cpp/common/auth_property_iterator_test.cc +++ b/test/cpp/common/auth_property_iterator_test.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #include #include "src/cpp/common/secure_auth_context.h" diff --git a/test/cpp/common/secure_auth_context_test.cc b/test/cpp/common/secure_auth_context_test.cc index e0376c9cc78..c71ef58023f 100644 --- a/test/cpp/common/secure_auth_context_test.cc +++ b/test/cpp/common/secure_auth_context_test.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #include #include "src/cpp/common/secure_auth_context.h" diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc index 7006ebb83aa..f81043d6104 100644 --- a/test/cpp/end2end/async_end2end_test.cc +++ b/test/cpp/end2end/async_end2end_test.cc @@ -33,12 +33,9 @@ #include -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include -#include +#include +#include +#include #include #include #include @@ -47,14 +44,12 @@ #include #include #include -#include -#include -#include #include -#include -#include -#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/client_crash_test.cc b/test/cpp/end2end/client_crash_test.cc index 89708a2ef66..3359080cec5 100644 --- a/test/cpp/end2end/client_crash_test.cc +++ b/test/cpp/end2end/client_crash_test.cc @@ -31,11 +31,9 @@ * */ -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include +#include +#include +#include #include #include #include @@ -44,15 +42,12 @@ #include #include #include -#include -#include -#include #include -#include -#include -#include - +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" #include "test/cpp/util/subprocess.h" using grpc::cpp::test::util::EchoRequest; diff --git a/test/cpp/end2end/client_crash_test_server.cc b/test/cpp/end2end/client_crash_test_server.cc index 3fd8c2c2f92..79a78328741 100644 --- a/test/cpp/end2end/client_crash_test_server.cc +++ b/test/cpp/end2end/client_crash_test_server.cc @@ -40,7 +40,6 @@ #include #include #include -#include #include "test/cpp/util/echo.grpc.pb.h" DEFINE_string(address, "", "Address to bind to"); diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index fc4e88c2a78..1b83eb4b3c8 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -34,30 +34,26 @@ #include #include -#include "src/core/security/credentials.h" -#include "test/core/end2end/data/ssl_test_data.h" -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include +#include +#include +#include #include #include #include #include -#include #include #include #include #include -#include -#include -#include +#include #include -#include -#include -#include +#include "src/core/security/credentials.h" +#include "test/core/end2end/data/ssl_test_data.h" +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/generic_end2end_test.cc b/test/cpp/end2end/generic_end2end_test.cc index b817198fa70..de7eab8dc29 100644 --- a/test/cpp/end2end/generic_end2end_test.cc +++ b/test/cpp/end2end/generic_end2end_test.cc @@ -33,32 +33,26 @@ #include -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo.grpc.pb.h" +#include +#include +#include #include -#include -#include -#include -#include #include #include #include #include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include +#include #include -#include -#include -#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc index 96b6ecbd6e0..a547cfc67ec 100644 --- a/test/cpp/end2end/mock_test.cc +++ b/test/cpp/end2end/mock_test.cc @@ -33,28 +33,24 @@ #include -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include +#include +#include +#include #include #include #include #include -#include #include #include #include #include -#include -#include -#include +#include #include -#include -#include -#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/server_crash_test.cc b/test/cpp/end2end/server_crash_test.cc index 2688f2c4eac..1a0f04e22b3 100644 --- a/test/cpp/end2end/server_crash_test.cc +++ b/test/cpp/end2end/server_crash_test.cc @@ -31,11 +31,9 @@ * */ -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include +#include +#include +#include #include #include #include @@ -44,15 +42,12 @@ #include #include #include -#include -#include -#include #include -#include -#include -#include - +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo.grpc.pb.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" #include "test/cpp/util/subprocess.h" using grpc::cpp::test::util::EchoRequest; diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc index 52dce8f28ef..7ca43a0c5b8 100644 --- a/test/cpp/end2end/server_crash_test_client.cc +++ b/test/cpp/end2end/server_crash_test_client.cc @@ -37,12 +37,10 @@ #include #include -#include #include #include #include #include -#include #include "test/cpp/util/echo.grpc.pb.h" DEFINE_string(address, "", "Address to connect to"); diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc index dc5fb5af9b3..e83f86f7ec5 100644 --- a/test/cpp/end2end/shutdown_test.cc +++ b/test/cpp/end2end/shutdown_test.cc @@ -31,14 +31,10 @@ * */ -#include "test/core/util/test_config.h" - #include -#include "test/core/util/port.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include "src/core/support/env.h" -#include +#include +#include #include #include #include @@ -47,10 +43,12 @@ #include #include #include -#include #include -#include -#include + +#include "src/core/support/env.h" +#include "test/core/util/test_config.h" +#include "test/core/util/port.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc index e59a77dc9ed..be436a2f6c6 100644 --- a/test/cpp/end2end/thread_stress_test.cc +++ b/test/cpp/end2end/thread_stress_test.cc @@ -34,28 +34,24 @@ #include #include -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/cpp/util/echo_duplicate.grpc.pb.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include +#include +#include +#include #include #include #include #include -#include +#include #include #include #include #include -#include -#include -#include #include -#include -#include -#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo_duplicate.grpc.pb.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/end2end/zookeeper_test.cc b/test/cpp/end2end/zookeeper_test.cc index d7fac3d07e3..e7d95b1c462 100644 --- a/test/cpp/end2end/zookeeper_test.cc +++ b/test/cpp/end2end/zookeeper_test.cc @@ -31,11 +31,6 @@ * */ -#include "test/core/util/test_config.h" -#include "test/core/util/port.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include "src/core/support/env.h" -#include #include #include #include @@ -44,12 +39,16 @@ #include #include #include -#include #include #include #include #include +#include "test/core/util/test_config.h" +#include "test/core/util/port.h" +#include "test/cpp/util/echo.grpc.pb.h" +#include "src/core/support/env.h" + using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index d9e4f1ba6a6..cb5232153bb 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -40,8 +40,7 @@ #include #include #include -#include -#include + #include "test/cpp/interop/client_helper.h" #include "test/cpp/interop/interop_client.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc index be652a4add4..abc14aeb983 100644 --- a/test/cpp/interop/client_helper.cc +++ b/test/cpp/interop/client_helper.cc @@ -33,27 +33,24 @@ #include "test/cpp/interop/client_helper.h" +#include + #include #include #include -#include - #include #include #include #include -#include #include #include #include -#include +#include "src/cpp/client/secure_credentials.h" #include "test/core/security/oauth2_utils.h" #include "test/cpp/util/create_test_channel.h" -#include "src/cpp/client/secure_credentials.h" - DECLARE_bool(enable_ssl); DECLARE_bool(use_prod_roots); DECLARE_int32(server_port); diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h index d4c14433a98..92d5078f48b 100644 --- a/test/cpp/interop/client_helper.h +++ b/test/cpp/interop/client_helper.h @@ -36,7 +36,6 @@ #include -#include #include #include "src/core/surface/call.h" diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index c73505c670e..fa358585d43 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -33,11 +33,11 @@ #include "test/cpp/interop/interop_client.h" +#include + #include #include -#include - #include #include #include @@ -45,14 +45,12 @@ #include #include #include -#include -#include +#include "src/core/transport/stream_op.h" #include "test/cpp/interop/client_helper.h" #include "test/proto/test.grpc.pb.h" #include "test/proto/empty.grpc.pb.h" #include "test/proto/messages.grpc.pb.h" -#include "src/core/transport/stream_op.h" namespace grpc { namespace testing { diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h index 354c2c61959..5e26cc82e66 100644 --- a/test/cpp/interop/interop_client.h +++ b/test/cpp/interop/interop_client.h @@ -33,11 +33,11 @@ #ifndef GRPC_TEST_CPP_INTEROP_INTEROP_CLIENT_H #define GRPC_TEST_CPP_INTEROP_INTEROP_CLIENT_H + #include #include #include -#include #include "test/proto/messages.grpc.pb.h" namespace grpc { diff --git a/test/cpp/interop/interop_test.cc b/test/cpp/interop/interop_test.cc index aac6e56b892..f01b032e95b 100644 --- a/test/cpp/interop/interop_test.cc +++ b/test/cpp/interop/interop_test.cc @@ -44,17 +44,18 @@ #include #include -extern "C" { -#include "src/core/iomgr/socket_utils_posix.h" -#include "src/core/support/string.h" -} - #include #include #include #include #include "test/core/util/port.h" +extern "C" { +#include "src/core/iomgr/socket_utils_posix.h" +#include "src/core/support/string.h" +} + + int test_client(const char* root, const char* host, int port) { int status; pid_t cli; diff --git a/test/cpp/interop/reconnect_interop_client.cc b/test/cpp/interop/reconnect_interop_client.cc index 675c6ff0739..d332dcad844 100644 --- a/test/cpp/interop/reconnect_interop_client.cc +++ b/test/cpp/interop/reconnect_interop_client.cc @@ -39,7 +39,6 @@ #include #include #include -#include #include "test/cpp/util/create_test_channel.h" #include "test/cpp/util/test_config.h" #include "test/proto/test.grpc.pb.h" diff --git a/test/cpp/interop/reconnect_interop_server.cc b/test/cpp/interop/reconnect_interop_server.cc index 8bc51aa52e4..d4f171b1d0a 100644 --- a/test/cpp/interop/reconnect_interop_server.cc +++ b/test/cpp/interop/reconnect_interop_server.cc @@ -31,23 +31,22 @@ * */ +#include +#include + #include #include #include #include -#include -#include - #include #include #include -#include #include #include #include #include -#include + #include "test/core/util/reconnect_server.h" #include "test/cpp/util/test_config.h" #include "test/proto/test.grpc.pb.h" diff --git a/test/cpp/interop/server.cc b/test/cpp/interop/server.cc index 760bb18f734..35ec890aa02 100644 --- a/test/cpp/interop/server.cc +++ b/test/cpp/interop/server.cc @@ -31,32 +31,28 @@ * */ +#include +#include + #include #include #include #include -#include -#include - #include #include #include #include - -#include #include #include #include #include -#include -#include +#include "test/cpp/interop/server_helper.h" +#include "test/cpp/util/test_config.h" #include "test/proto/test.grpc.pb.h" #include "test/proto/empty.grpc.pb.h" #include "test/proto/messages.grpc.pb.h" -#include "test/cpp/interop/server_helper.h" -#include "test/cpp/util/test_config.h" DEFINE_bool(enable_ssl, false, "Whether to use ssl/tls."); DEFINE_int32(port, 0, "Server port."); diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc index 3721d796359..e897f4ebf00 100644 --- a/test/cpp/interop/server_helper.cc +++ b/test/cpp/interop/server_helper.cc @@ -36,7 +36,6 @@ #include #include -#include #include #include "src/core/surface/call.h" diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h index 5395d02e32f..0f95cfea38d 100644 --- a/test/cpp/qps/client.h +++ b/test/cpp/qps/client.h @@ -34,14 +34,14 @@ #ifndef TEST_QPS_CLIENT_H #define TEST_QPS_CLIENT_H +#include +#include + #include "test/cpp/qps/histogram.h" #include "test/cpp/qps/interarrival.h" #include "test/cpp/qps/timer.h" #include "test/cpp/qps/qpstest.grpc.pb.h" - -#include -#include -#include +#include "test/cpp/util/create_test_channel.h" namespace grpc { diff --git a/test/cpp/qps/client_async.cc b/test/cpp/qps/client_async.cc index a337610cbf7..f779e4a5776 100644 --- a/test/cpp/qps/client_async.cc +++ b/test/cpp/qps/client_async.cc @@ -46,14 +46,12 @@ #include #include #include -#include #include -#include -#include -#include "test/cpp/util/create_test_channel.h" + #include "test/cpp/qps/qpstest.grpc.pb.h" #include "test/cpp/qps/timer.h" #include "test/cpp/qps/client.h" +#include "test/cpp/util/create_test_channel.h" namespace grpc { namespace testing { diff --git a/test/cpp/qps/client_sync.cc b/test/cpp/qps/client_sync.cc index db5416a707e..123dca66007 100644 --- a/test/cpp/qps/client_sync.cc +++ b/test/cpp/qps/client_sync.cc @@ -31,6 +31,8 @@ * */ +#include + #include #include #include @@ -40,21 +42,18 @@ #include #include -#include - +#include #include #include #include #include #include #include -#include #include #include #include -#include -#include #include + #include "test/cpp/util/create_test_channel.h" #include "test/cpp/qps/client.h" #include "test/cpp/qps/qpstest.grpc.pb.h" diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 78e37209382..3bd61ea4e8b 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -31,24 +31,24 @@ * */ -#include "test/cpp/qps/driver.h" -#include "src/core/support/env.h" +#include +#include +#include +#include +#include + #include #include #include -#include #include #include -#include -#include -#include -#include -#include -#include -#include "test/cpp/qps/histogram.h" -#include "test/cpp/qps/qps_worker.h" + +#include "src/core/support/env.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" +#include "test/cpp/qps/driver.h" +#include "test/cpp/qps/histogram.h" +#include "test/cpp/qps/qps_worker.h" using std::list; using std::thread; diff --git a/test/cpp/qps/interarrival.h b/test/cpp/qps/interarrival.h index 04d14f689fc..841619e3ff5 100644 --- a/test/cpp/qps/interarrival.h +++ b/test/cpp/qps/interarrival.h @@ -39,7 +39,7 @@ #include #include -#include +#include namespace grpc { namespace testing { diff --git a/test/cpp/qps/perf_db_client.h b/test/cpp/qps/perf_db_client.h index 3433cd88d12..ae5d17074b1 100644 --- a/test/cpp/qps/perf_db_client.h +++ b/test/cpp/qps/perf_db_client.h @@ -37,12 +37,11 @@ #include #include -#include +#include #include #include #include #include -#include #include "test/cpp/qps/perf_db.grpc.pb.h" namespace grpc { diff --git a/test/cpp/qps/qps_interarrival_test.cc b/test/cpp/qps/qps_interarrival_test.cc index 1eed956a1c4..a7979e61878 100644 --- a/test/cpp/qps/qps_interarrival_test.cc +++ b/test/cpp/qps/qps_interarrival_test.cc @@ -31,13 +31,13 @@ * */ -#include "test/cpp/qps/interarrival.h" #include #include // Use the C histogram rather than C++ to avoid depending on proto #include -#include + +#include "test/cpp/qps/interarrival.h" using grpc::testing::RandomDist; using grpc::testing::InterarrivalTimer; diff --git a/test/cpp/qps/qps_openloop_test.cc b/test/cpp/qps/qps_openloop_test.cc index 9a7313f6e85..5a6a9249a93 100644 --- a/test/cpp/qps/qps_openloop_test.cc +++ b/test/cpp/qps/qps_openloop_test.cc @@ -31,12 +31,12 @@ * */ +#include + #include #include -#include - #include "test/cpp/qps/driver.h" #include "test/cpp/qps/report.h" #include "test/cpp/util/benchmark_config.h" diff --git a/test/cpp/qps/qps_test.cc b/test/cpp/qps/qps_test.cc index ba980a66643..d0c4a79cd92 100644 --- a/test/cpp/qps/qps_test.cc +++ b/test/cpp/qps/qps_test.cc @@ -31,12 +31,12 @@ * */ +#include + #include #include -#include - #include "test/cpp/qps/driver.h" #include "test/cpp/qps/report.h" #include "test/cpp/util/benchmark_config.h" diff --git a/test/cpp/qps/qps_test_with_poll.cc b/test/cpp/qps/qps_test_with_poll.cc index 90a8da8d110..31d2c1bf7b4 100644 --- a/test/cpp/qps/qps_test_with_poll.cc +++ b/test/cpp/qps/qps_test_with_poll.cc @@ -31,12 +31,12 @@ * */ +#include + #include #include -#include - #include "test/cpp/qps/driver.h" #include "test/cpp/qps/report.h" #include "test/cpp/util/benchmark_config.h" diff --git a/test/cpp/qps/qps_worker.cc b/test/cpp/qps/qps_worker.cc index f1cea5ee665..51e955a80a4 100644 --- a/test/cpp/qps/qps_worker.cc +++ b/test/cpp/qps/qps_worker.cc @@ -47,16 +47,15 @@ #include #include #include -#include #include #include #include -#include + #include "test/core/util/grpc_profiler.h" -#include "test/cpp/util/create_test_channel.h" #include "test/cpp/qps/qpstest.pb.h" #include "test/cpp/qps/client.h" #include "test/cpp/qps/server.h" +#include "test/cpp/util/create_test_channel.h" namespace grpc { namespace testing { diff --git a/test/cpp/qps/report.h b/test/cpp/qps/report.h index aec3cbe80a3..620abade39b 100644 --- a/test/cpp/qps/report.h +++ b/test/cpp/qps/report.h @@ -37,7 +37,8 @@ #include #include #include -#include + +#include #include "test/cpp/qps/driver.h" #include "test/cpp/qps/qpstest.grpc.pb.h" diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc index b4fc49c31c3..77415f42ce7 100644 --- a/test/cpp/qps/server_async.cc +++ b/test/cpp/qps/server_async.cc @@ -41,22 +41,20 @@ #include #include +#include #include #include -#include -#include +#include +#include #include #include #include #include -#include -#include #include + #include "test/cpp/qps/qpstest.grpc.pb.h" #include "test/cpp/qps/server.h" -#include -#include namespace grpc { namespace testing { diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc index 4c3c9cb497f..c149fbc738f 100644 --- a/test/cpp/qps/server_sync.cc +++ b/test/cpp/qps/server_sync.cc @@ -32,28 +32,25 @@ */ #include -#include - #include +#include #include +#include #include #include -#include -#include -#include +#include +#include +#include #include #include #include #include -#include -#include + #include "test/cpp/qps/qpstest.grpc.pb.h" #include "test/cpp/qps/server.h" #include "test/cpp/qps/timer.h" -#include -#include namespace grpc { namespace testing { diff --git a/test/cpp/qps/stats.h b/test/cpp/qps/stats.h index 82dc03e3dad..93875017ca7 100644 --- a/test/cpp/qps/stats.h +++ b/test/cpp/qps/stats.h @@ -34,9 +34,10 @@ #ifndef TEST_QPS_STATS_UTILS_H #define TEST_QPS_STATS_UTILS_H -#include "test/cpp/qps/histogram.h" #include +#include "test/cpp/qps/histogram.h" + namespace grpc { namespace testing { diff --git a/test/cpp/qps/sync_streaming_ping_pong_test.cc b/test/cpp/qps/sync_streaming_ping_pong_test.cc index d53905a7790..52e43939a81 100644 --- a/test/cpp/qps/sync_streaming_ping_pong_test.cc +++ b/test/cpp/qps/sync_streaming_ping_pong_test.cc @@ -31,12 +31,12 @@ * */ +#include + #include #include -#include - #include "test/cpp/qps/driver.h" #include "test/cpp/qps/report.h" #include "test/cpp/util/benchmark_config.h" diff --git a/test/cpp/qps/sync_unary_ping_pong_test.cc b/test/cpp/qps/sync_unary_ping_pong_test.cc index d276d13a430..fbd21357aa5 100644 --- a/test/cpp/qps/sync_unary_ping_pong_test.cc +++ b/test/cpp/qps/sync_unary_ping_pong_test.cc @@ -31,12 +31,12 @@ * */ +#include + #include #include -#include - #include "test/cpp/qps/driver.h" #include "test/cpp/qps/report.h" #include "test/cpp/util/benchmark_config.h" diff --git a/test/cpp/qps/timer.cc b/test/cpp/qps/timer.cc index c1ba23decd9..8edb838da37 100644 --- a/test/cpp/qps/timer.cc +++ b/test/cpp/qps/timer.cc @@ -36,7 +36,6 @@ #include #include #include -#include Timer::Timer() : start_(Sample()) {} diff --git a/test/cpp/qps/worker.cc b/test/cpp/qps/worker.cc index 7cf4903148a..935e4853a62 100644 --- a/test/cpp/qps/worker.cc +++ b/test/cpp/qps/worker.cc @@ -36,9 +36,9 @@ #include #include +#include #include #include -#include #include "test/cpp/qps/qps_worker.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/server/dynamic_thread_pool_test.cc b/test/cpp/server/dynamic_thread_pool_test.cc index 63b603b8f7b..e978fd03f3d 100644 --- a/test/cpp/server/dynamic_thread_pool_test.cc +++ b/test/cpp/server/dynamic_thread_pool_test.cc @@ -31,11 +31,12 @@ * */ +#include + #include #include #include -#include #include namespace grpc { diff --git a/test/cpp/server/fixed_size_thread_pool_test.cc b/test/cpp/server/fixed_size_thread_pool_test.cc index 442e974fc15..97953af2249 100644 --- a/test/cpp/server/fixed_size_thread_pool_test.cc +++ b/test/cpp/server/fixed_size_thread_pool_test.cc @@ -31,11 +31,12 @@ * */ +#include + #include #include #include -#include #include namespace grpc { diff --git a/test/cpp/util/byte_buffer_test.cc b/test/cpp/util/byte_buffer_test.cc index 5195575f995..f36c32cac5b 100644 --- a/test/cpp/util/byte_buffer_test.cc +++ b/test/cpp/util/byte_buffer_test.cc @@ -31,13 +31,13 @@ * */ -#include +#include #include #include #include -#include +#include #include namespace grpc { diff --git a/test/cpp/util/cli_call.cc b/test/cpp/util/cli_call.cc index d0a300f5115..d60cee9c024 100644 --- a/test/cpp/util/cli_call.cc +++ b/test/cpp/util/cli_call.cc @@ -35,16 +35,13 @@ #include -#include -#include -#include -#include -#include -#include - #include #include #include +#include +#include +#include +#include namespace grpc { namespace testing { diff --git a/test/cpp/util/cli_call.h b/test/cpp/util/cli_call.h index 46b5dd3e4f3..7a3dcf2e9f6 100644 --- a/test/cpp/util/cli_call.h +++ b/test/cpp/util/cli_call.h @@ -37,8 +37,7 @@ #include #include -#include -#include +#include namespace grpc { namespace testing { diff --git a/test/cpp/util/cli_call_test.cc b/test/cpp/util/cli_call_test.cc index 146e96720f3..0d34009bd5a 100644 --- a/test/cpp/util/cli_call_test.cc +++ b/test/cpp/util/cli_call_test.cc @@ -31,24 +31,23 @@ * */ -#include "test/core/util/test_config.h" #include "test/cpp/util/cli_call.h" -#include "test/cpp/util/echo.grpc.pb.h" -#include + +#include #include #include #include #include -#include +#include #include #include #include #include -#include -#include "test/core/util/port.h" #include -#include +#include "test/core/util/port.h" +#include "test/core/util/test_config.h" +#include "test/cpp/util/echo.grpc.pb.h" using grpc::cpp::test::util::EchoRequest; using grpc::cpp::test::util::EchoResponse; diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index 43e719ef6b5..161b4bdc1d5 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -33,11 +33,11 @@ #include "test/cpp/util/create_test_channel.h" -#include "test/core/end2end/data/ssl_test_data.h" -#include #include #include +#include "test/core/end2end/data/ssl_test_data.h" + namespace grpc { // When ssl is enabled, if server is empty, override_hostname is used to diff --git a/test/cpp/util/create_test_channel.h b/test/cpp/util/create_test_channel.h index 129cc746f9e..1263d4ed686 100644 --- a/test/cpp/util/create_test_channel.h +++ b/test/cpp/util/create_test_channel.h @@ -36,7 +36,6 @@ #include -#include #include namespace grpc { diff --git a/test/cpp/util/grpc_cli.cc b/test/cpp/util/grpc_cli.cc index 15c56a352cb..746d67deeb9 100644 --- a/test/cpp/util/grpc_cli.cc +++ b/test/cpp/util/grpc_cli.cc @@ -64,14 +64,13 @@ #include #include -#include "test/cpp/util/cli_call.h" -#include "test/cpp/util/test_config.h" -#include +#include #include #include #include -#include +#include "test/cpp/util/cli_call.h" +#include "test/cpp/util/test_config.h" DEFINE_bool(enable_ssl, true, "Whether to use ssl/tls."); DEFINE_bool(use_auth, false, "Whether to create default google credentials."); diff --git a/test/cpp/util/slice_test.cc b/test/cpp/util/slice_test.cc index eb328490e13..de7ff031ab8 100644 --- a/test/cpp/util/slice_test.cc +++ b/test/cpp/util/slice_test.cc @@ -31,7 +31,7 @@ * */ -#include +#include #include #include diff --git a/test/cpp/util/status_test.cc b/test/cpp/util/status_test.cc index 17b92ab06a2..837a6bab02e 100644 --- a/test/cpp/util/status_test.cc +++ b/test/cpp/util/status_test.cc @@ -31,7 +31,8 @@ * */ -#include +#include + #include #include diff --git a/test/cpp/util/time_test.cc b/test/cpp/util/time_test.cc index 4cb6ec4b4e9..1e501dfd288 100644 --- a/test/cpp/util/time_test.cc +++ b/test/cpp/util/time_test.cc @@ -32,7 +32,7 @@ */ #include -#include +#include #include using std::chrono::duration_cast; diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 8daeb134f73..ccea4f68dea 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -760,21 +760,13 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = include/grpc++/async_generic_service.h \ -include/grpc++/async_unary_call.h \ -include/grpc++/auth_context.h \ -include/grpc++/byte_buffer.h \ -include/grpc++/channel.h \ -include/grpc++/channel_arguments.h \ +INPUT = include/grpc++/channel.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ -include/grpc++/config.h \ -include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ -include/grpc++/dynamic_thread_pool.h \ -include/grpc++/fixed_size_thread_pool.h \ -include/grpc++/generic_stub.h \ +include/grpc++/generic/async_generic_service.h \ +include/grpc++/generic/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ @@ -793,13 +785,21 @@ include/grpc++/server.h \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ -include/grpc++/slice.h \ -include/grpc++/status.h \ -include/grpc++/status_code_enum.h \ -include/grpc++/stream.h \ -include/grpc++/stub_options.h \ -include/grpc++/thread_pool_interface.h \ -include/grpc++/time.h +include/grpc++/support/async_unary_call.h \ +include/grpc++/support/auth_context.h \ +include/grpc++/support/byte_buffer.h \ +include/grpc++/support/channel_arguments.h \ +include/grpc++/support/config.h \ +include/grpc++/support/config_protobuf.h \ +include/grpc++/support/dynamic_thread_pool.h \ +include/grpc++/support/fixed_size_thread_pool.h \ +include/grpc++/support/slice.h \ +include/grpc++/support/status.h \ +include/grpc++/support/status_code_enum.h \ +include/grpc++/support/stream.h \ +include/grpc++/support/stub_options.h \ +include/grpc++/support/thread_pool_interface.h \ +include/grpc++/support/time.h # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 23ff05fb862..c4a7fb07571 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -760,21 +760,13 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = include/grpc++/async_generic_service.h \ -include/grpc++/async_unary_call.h \ -include/grpc++/auth_context.h \ -include/grpc++/byte_buffer.h \ -include/grpc++/channel.h \ -include/grpc++/channel_arguments.h \ +INPUT = include/grpc++/channel.h \ include/grpc++/client_context.h \ include/grpc++/completion_queue.h \ -include/grpc++/config.h \ -include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ -include/grpc++/dynamic_thread_pool.h \ -include/grpc++/fixed_size_thread_pool.h \ -include/grpc++/generic_stub.h \ +include/grpc++/generic/async_generic_service.h \ +include/grpc++/generic/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ include/grpc++/impl/grpc_library.h \ @@ -793,13 +785,21 @@ include/grpc++/server.h \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ -include/grpc++/slice.h \ -include/grpc++/status.h \ -include/grpc++/status_code_enum.h \ -include/grpc++/stream.h \ -include/grpc++/stub_options.h \ -include/grpc++/thread_pool_interface.h \ -include/grpc++/time.h \ +include/grpc++/support/async_unary_call.h \ +include/grpc++/support/auth_context.h \ +include/grpc++/support/byte_buffer.h \ +include/grpc++/support/channel_arguments.h \ +include/grpc++/support/config.h \ +include/grpc++/support/config_protobuf.h \ +include/grpc++/support/dynamic_thread_pool.h \ +include/grpc++/support/fixed_size_thread_pool.h \ +include/grpc++/support/slice.h \ +include/grpc++/support/status.h \ +include/grpc++/support/status_code_enum.h \ +include/grpc++/support/stream.h \ +include/grpc++/support/stub_options.h \ +include/grpc++/support/thread_pool_interface.h \ +include/grpc++/support/time.h \ src/cpp/client/secure_credentials.h \ src/cpp/common/secure_auth_context.h \ src/cpp/server/secure_server_credentials.h \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 9446368a8e6..8e6afe87d25 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13118,21 +13118,13 @@ "grpc" ], "headers": [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -13151,13 +13143,21 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", "src/cpp/client/create_channel_internal.h", "src/cpp/client/secure_credentials.h", "src/cpp/common/create_auth_context.h", @@ -13167,21 +13167,13 @@ "language": "c++", "name": "grpc++", "src": [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -13200,13 +13192,21 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", "src/cpp/client/channel.cc", "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", @@ -13290,21 +13290,13 @@ "grpc_unsecure" ], "headers": [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -13323,34 +13315,34 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", "src/cpp/client/create_channel_internal.h", "src/cpp/common/create_auth_context.h" ], "language": "c++", "name": "grpc++_unsecure", "src": [ - "include/grpc++/async_generic_service.h", - "include/grpc++/async_unary_call.h", - "include/grpc++/auth_context.h", - "include/grpc++/byte_buffer.h", "include/grpc++/channel.h", - "include/grpc++/channel_arguments.h", "include/grpc++/client_context.h", "include/grpc++/completion_queue.h", - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", - "include/grpc++/generic_stub.h", + "include/grpc++/generic/async_generic_service.h", + "include/grpc++/generic/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/grpc_library.h", @@ -13369,13 +13361,21 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", - "include/grpc++/slice.h", - "include/grpc++/status.h", - "include/grpc++/status_code_enum.h", - "include/grpc++/stream.h", - "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", - "include/grpc++/time.h", + "include/grpc++/support/async_unary_call.h", + "include/grpc++/support/auth_context.h", + "include/grpc++/support/byte_buffer.h", + "include/grpc++/support/channel_arguments.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", + "include/grpc++/support/dynamic_thread_pool.h", + "include/grpc++/support/fixed_size_thread_pool.h", + "include/grpc++/support/slice.h", + "include/grpc++/support/status.h", + "include/grpc++/support/status_code_enum.h", + "include/grpc++/support/stream.h", + "include/grpc++/support/stub_options.h", + "include/grpc++/support/thread_pool_interface.h", + "include/grpc++/support/time.h", "src/cpp/client/channel.cc", "src/cpp/client/channel_arguments.cc", "src/cpp/client/client_context.cc", diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index e2e17d41770..5181b3a2004 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -213,21 +213,13 @@ - - - - - - - - - - + + @@ -246,13 +238,21 @@ - - - - - - - + + + + + + + + + + + + + + + diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index 6f308d1d025..cbffd3c765a 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -96,50 +96,26 @@ - - include\grpc++ - - - include\grpc++ - - - include\grpc++ - - - include\grpc++ - include\grpc++ - - include\grpc++ - include\grpc++ include\grpc++ - - include\grpc++ - - - include\grpc++ - include\grpc++ include\grpc++ - - include\grpc++ - - - include\grpc++ + + include\grpc++\generic - - include\grpc++ + + include\grpc++\generic include\grpc++\impl @@ -195,26 +171,50 @@ include\grpc++ - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support @@ -242,9 +242,15 @@ {784a0281-f547-aeb0-9f55-b26b7de9c769} + + {51dae921-3aa2-1976-2ee4-c5615de1af54} + {0da8cd95-314f-da1b-5ce7-7791a5be1f1a} + + {a5c10dae-f715-2a30-1066-d22f8bc94cb2} + {328ff211-2886-406e-56f9-18ba1686f363} diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 4be468cb62b..77f83086c7e 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -213,21 +213,13 @@ - - - - - - - - - - + + @@ -246,13 +238,21 @@ - - - - - - - + + + + + + + + + + + + + + + diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index bd51d1fa0b1..d4288f8987d 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -81,50 +81,26 @@ - - include\grpc++ - - - include\grpc++ - - - include\grpc++ - - - include\grpc++ - include\grpc++ - - include\grpc++ - include\grpc++ include\grpc++ - - include\grpc++ - - - include\grpc++ - include\grpc++ include\grpc++ - - include\grpc++ - - - include\grpc++ + + include\grpc++\generic - - include\grpc++ + + include\grpc++\generic include\grpc++\impl @@ -180,26 +156,50 @@ include\grpc++ - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support - - include\grpc++ + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support + + + include\grpc++\support @@ -218,9 +218,15 @@ {eceb50c0-bb49-3812-b6bd-b0af6df81da7} + + {83717d3c-57d9-2bfa-ed9c-2b08f86da12b} + {dadc0002-f2ac-451b-a9b8-33b8de10b5fc} + + {0ebf8008-80b9-d6da-e1dc-854bf1ec2195} + {cce6a85d-1111-3834-6825-31e170d93cff} From 9fb35a53320a7b958739ce01ed50de087e6c5ee9 Mon Sep 17 00:00:00 2001 From: yang-g Date: Fri, 21 Aug 2015 15:49:35 -0700 Subject: [PATCH 35/79] split stream.h into sync_stream.h and async_stream.h --- BUILD | 6 +- Makefile | 6 +- build.json | 3 +- .../grpc++/generic/async_generic_service.h | 2 +- include/grpc++/generic/generic_stub.h | 2 +- include/grpc++/impl/rpc_service_method.h | 2 +- .../support/{stream.h => async_stream.h} | 348 +--------------- include/grpc++/support/sync_stream.h | 392 ++++++++++++++++++ src/compiler/cpp_generator.cc | 6 +- tools/doxygen/Doxyfile.c++ | 3 +- tools/doxygen/Doxyfile.c++.internal | 3 +- tools/run_tests/sources_and_headers.json | 12 +- vsprojects/grpc++/grpc++.vcxproj | 3 +- vsprojects/grpc++/grpc++.vcxproj.filters | 7 +- .../grpc++_unsecure/grpc++_unsecure.vcxproj | 3 +- .../grpc++_unsecure.vcxproj.filters | 7 +- 16 files changed, 438 insertions(+), 367 deletions(-) rename include/grpc++/support/{stream.h => async_stream.h} (57%) create mode 100644 include/grpc++/support/sync_stream.h diff --git a/BUILD b/BUILD index 620a954a5af..3847795f4db 100644 --- a/BUILD +++ b/BUILD @@ -735,6 +735,7 @@ cc_library( "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -746,8 +747,8 @@ cc_library( "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", ], @@ -821,6 +822,7 @@ cc_library( "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -832,8 +834,8 @@ cc_library( "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", ], diff --git a/Makefile b/Makefile index 9dffab01c02..626c155f64c 100644 --- a/Makefile +++ b/Makefile @@ -4654,6 +4654,7 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ + include/grpc++/support/async_stream.h \ include/grpc++/support/async_unary_call.h \ include/grpc++/support/auth_context.h \ include/grpc++/support/byte_buffer.h \ @@ -4665,8 +4666,8 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/support/slice.h \ include/grpc++/support/status.h \ include/grpc++/support/status_code_enum.h \ - include/grpc++/support/stream.h \ include/grpc++/support/stub_options.h \ + include/grpc++/support/sync_stream.h \ include/grpc++/support/thread_pool_interface.h \ include/grpc++/support/time.h \ @@ -4896,6 +4897,7 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ + include/grpc++/support/async_stream.h \ include/grpc++/support/async_unary_call.h \ include/grpc++/support/auth_context.h \ include/grpc++/support/byte_buffer.h \ @@ -4907,8 +4909,8 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/support/slice.h \ include/grpc++/support/status.h \ include/grpc++/support/status_code_enum.h \ - include/grpc++/support/stream.h \ include/grpc++/support/stub_options.h \ + include/grpc++/support/sync_stream.h \ include/grpc++/support/thread_pool_interface.h \ include/grpc++/support/time.h \ diff --git a/build.json b/build.json index 8eb4f377037..931f541cc84 100644 --- a/build.json +++ b/build.json @@ -55,6 +55,7 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -66,8 +67,8 @@ "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h" ], diff --git a/include/grpc++/generic/async_generic_service.h b/include/grpc++/generic/async_generic_service.h index 35bc9458242..8578d850ffd 100644 --- a/include/grpc++/generic/async_generic_service.h +++ b/include/grpc++/generic/async_generic_service.h @@ -35,7 +35,7 @@ #define GRPCXX_GENERIC_ASYNC_GENERIC_SERVICE_H #include -#include +#include struct grpc_server; diff --git a/include/grpc++/generic/generic_stub.h b/include/grpc++/generic/generic_stub.h index 08ed77aefb6..1bb7900b068 100644 --- a/include/grpc++/generic/generic_stub.h +++ b/include/grpc++/generic/generic_stub.h @@ -34,8 +34,8 @@ #ifndef GRPCXX_GENERIC_GENERIC_STUB_H #define GRPCXX_GENERIC_GENERIC_STUB_H +#include #include -#include namespace grpc { diff --git a/include/grpc++/impl/rpc_service_method.h b/include/grpc++/impl/rpc_service_method.h index 0138eb2ac0f..597798c2039 100644 --- a/include/grpc++/impl/rpc_service_method.h +++ b/include/grpc++/impl/rpc_service_method.h @@ -42,7 +42,7 @@ #include #include #include -#include +#include namespace grpc { class ServerContext; diff --git a/include/grpc++/support/stream.h b/include/grpc++/support/async_stream.h similarity index 57% rename from include/grpc++/support/stream.h rename to include/grpc++/support/async_stream.h index 89a6dd693db..83807315568 100644 --- a/include/grpc++/support/stream.h +++ b/include/grpc++/support/async_stream.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_SUPPORT_STREAM_H -#define GRPCXX_SUPPORT_STREAM_H +#ifndef GRPCXX_SUPPORT_ASYNC_STREAM_H +#define GRPCXX_SUPPORT_ASYNC_STREAM_H #include #include @@ -45,348 +45,6 @@ namespace grpc { -// Common interface for all client side streaming. -class ClientStreamingInterface { - public: - virtual ~ClientStreamingInterface() {} - - // Wait until the stream finishes, and return the final status. When the - // client side declares it has no more message to send, either implicitly or - // by calling WritesDone, it needs to make sure there is no more message to - // be received from the server, either implicitly or by getting a false from - // a Read(). - // This function will return either: - // - when all incoming messages have been read and the server has returned - // status - // - OR when the server has returned a non-OK status - virtual Status Finish() = 0; -}; - -// An interface that yields a sequence of R messages. -template -class ReaderInterface { - public: - virtual ~ReaderInterface() {} - - // Blocking read a message and parse to msg. Returns true on success. - // The method returns false when there will be no more incoming messages, - // either because the other side has called WritesDone or the stream has - // failed (or been cancelled). - virtual bool Read(R* msg) = 0; -}; - -// An interface that can be fed a sequence of W messages. -template -class WriterInterface { - public: - virtual ~WriterInterface() {} - - // Blocking write msg to the stream. Returns true on success. - // Returns false when the stream has been closed. - virtual bool Write(const W& msg, const WriteOptions& options) = 0; - - inline bool Write(const W& msg) { return Write(msg, WriteOptions()); } -}; - -template -class ClientReaderInterface : public ClientStreamingInterface, - public ReaderInterface { - public: - virtual void WaitForInitialMetadata() = 0; -}; - -template -class ClientReader GRPC_FINAL : public ClientReaderInterface { - public: - // Blocking create a stream and write the first request out. - template - ClientReader(Channel* channel, const RpcMethod& method, - ClientContext* context, const W& request) - : context_(context), call_(channel->CreateCall(method, context, &cq_)) { - CallOpSet ops; - ops.SendInitialMetadata(context->send_initial_metadata_); - // TODO(ctiller): don't assert - GPR_ASSERT(ops.SendMessage(request).ok()); - ops.ClientSendClose(); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } - - // Blocking wait for initial metadata from server. The received metadata - // can only be accessed after this call returns. Should only be called before - // the first read. Calling this method is optional, and if it is not called - // the metadata will be available in ClientContext after the first read. - void WaitForInitialMetadata() { - GPR_ASSERT(!context_->initial_metadata_received_); - - CallOpSet ops; - ops.RecvInitialMetadata(context_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); // status ignored - } - - bool Read(R* msg) GRPC_OVERRIDE { - CallOpSet> ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - ops.RecvMessage(msg); - call_.PerformOps(&ops); - return cq_.Pluck(&ops) && ops.got_message; - } - - Status Finish() GRPC_OVERRIDE { - CallOpSet ops; - Status status; - ops.ClientRecvStatus(context_, &status); - call_.PerformOps(&ops); - GPR_ASSERT(cq_.Pluck(&ops)); - return status; - } - - private: - ClientContext* context_; - CompletionQueue cq_; - Call call_; -}; - -template -class ClientWriterInterface : public ClientStreamingInterface, - public WriterInterface { - public: - virtual bool WritesDone() = 0; -}; - -template -class ClientWriter : public ClientWriterInterface { - public: - // Blocking create a stream. - template - ClientWriter(Channel* channel, const RpcMethod& method, - ClientContext* context, R* response) - : context_(context), call_(channel->CreateCall(method, context, &cq_)) { - finish_ops_.RecvMessage(response); - - CallOpSet ops; - ops.SendInitialMetadata(context->send_initial_metadata_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } - - using WriterInterface::Write; - bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { - CallOpSet ops; - if (!ops.SendMessage(msg, options).ok()) { - return false; - } - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - bool WritesDone() GRPC_OVERRIDE { - CallOpSet ops; - ops.ClientSendClose(); - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - // Read the final response and wait for the final status. - Status Finish() GRPC_OVERRIDE { - Status status; - finish_ops_.ClientRecvStatus(context_, &status); - call_.PerformOps(&finish_ops_); - GPR_ASSERT(cq_.Pluck(&finish_ops_)); - return status; - } - - private: - ClientContext* context_; - CallOpSet finish_ops_; - CompletionQueue cq_; - Call call_; -}; - -// Client-side interface for bi-directional streaming. -template -class ClientReaderWriterInterface : public ClientStreamingInterface, - public WriterInterface, - public ReaderInterface { - public: - virtual void WaitForInitialMetadata() = 0; - virtual bool WritesDone() = 0; -}; - -template -class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface { - public: - // Blocking create a stream. - ClientReaderWriter(Channel* channel, const RpcMethod& method, - ClientContext* context) - : context_(context), call_(channel->CreateCall(method, context, &cq_)) { - CallOpSet ops; - ops.SendInitialMetadata(context->send_initial_metadata_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); - } - - // Blocking wait for initial metadata from server. The received metadata - // can only be accessed after this call returns. Should only be called before - // the first read. Calling this method is optional, and if it is not called - // the metadata will be available in ClientContext after the first read. - void WaitForInitialMetadata() { - GPR_ASSERT(!context_->initial_metadata_received_); - - CallOpSet ops; - ops.RecvInitialMetadata(context_); - call_.PerformOps(&ops); - cq_.Pluck(&ops); // status ignored - } - - bool Read(R* msg) GRPC_OVERRIDE { - CallOpSet> ops; - if (!context_->initial_metadata_received_) { - ops.RecvInitialMetadata(context_); - } - ops.RecvMessage(msg); - call_.PerformOps(&ops); - return cq_.Pluck(&ops) && ops.got_message; - } - - using WriterInterface::Write; - bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { - CallOpSet ops; - if (!ops.SendMessage(msg, options).ok()) return false; - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - bool WritesDone() GRPC_OVERRIDE { - CallOpSet ops; - ops.ClientSendClose(); - call_.PerformOps(&ops); - return cq_.Pluck(&ops); - } - - Status Finish() GRPC_OVERRIDE { - CallOpSet ops; - Status status; - ops.ClientRecvStatus(context_, &status); - call_.PerformOps(&ops); - GPR_ASSERT(cq_.Pluck(&ops)); - return status; - } - - private: - ClientContext* context_; - CompletionQueue cq_; - Call call_; -}; - -template -class ServerReader GRPC_FINAL : public ReaderInterface { - public: - ServerReader(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} - - void SendInitialMetadata() { - GPR_ASSERT(!ctx_->sent_initial_metadata_); - - CallOpSet ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - bool Read(R* msg) GRPC_OVERRIDE { - CallOpSet> ops; - ops.RecvMessage(msg); - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops) && ops.got_message; - } - - private: - Call* const call_; - ServerContext* const ctx_; -}; - -template -class ServerWriter GRPC_FINAL : public WriterInterface { - public: - ServerWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} - - void SendInitialMetadata() { - GPR_ASSERT(!ctx_->sent_initial_metadata_); - - CallOpSet ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - using WriterInterface::Write; - bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { - CallOpSet ops; - if (!ops.SendMessage(msg, options).ok()) { - return false; - } - if (!ctx_->sent_initial_metadata_) { - ops.SendInitialMetadata(ctx_->initial_metadata_); - ctx_->sent_initial_metadata_ = true; - } - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops); - } - - private: - Call* const call_; - ServerContext* const ctx_; -}; - -// Server-side interface for bi-directional streaming. -template -class ServerReaderWriter GRPC_FINAL : public WriterInterface, - public ReaderInterface { - public: - ServerReaderWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} - - void SendInitialMetadata() { - GPR_ASSERT(!ctx_->sent_initial_metadata_); - - CallOpSet ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); - ctx_->sent_initial_metadata_ = true; - call_->PerformOps(&ops); - call_->cq()->Pluck(&ops); - } - - bool Read(R* msg) GRPC_OVERRIDE { - CallOpSet> ops; - ops.RecvMessage(msg); - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops) && ops.got_message; - } - - using WriterInterface::Write; - bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { - CallOpSet ops; - if (!ops.SendMessage(msg, options).ok()) { - return false; - } - if (!ctx_->sent_initial_metadata_) { - ops.SendInitialMetadata(ctx_->initial_metadata_); - ctx_->sent_initial_metadata_ = true; - } - call_->PerformOps(&ops); - return call_->cq()->Pluck(&ops); - } - - private: - Call* const call_; - ServerContext* const ctx_; -}; - // Async interfaces // Common interface for all client side streaming. class ClientAsyncStreamingInterface { @@ -773,4 +431,4 @@ class ServerAsyncReaderWriter GRPC_FINAL : public ServerAsyncStreamingInterface, } // namespace grpc -#endif // GRPCXX_SUPPORT_STREAM_H +#endif // GRPCXX_SUPPORT_ASYNC_STREAM_H diff --git a/include/grpc++/support/sync_stream.h b/include/grpc++/support/sync_stream.h new file mode 100644 index 00000000000..b4bb637ff23 --- /dev/null +++ b/include/grpc++/support/sync_stream.h @@ -0,0 +1,392 @@ +/* + * + * Copyright 2015, 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. + * + */ + +#ifndef GRPCXX_SUPPORT_SYNC_STREAM_H +#define GRPCXX_SUPPORT_SYNC_STREAM_H + +#include +#include +#include +#include +#include +#include +#include +#include + +namespace grpc { + +// Common interface for all client side streaming. +class ClientStreamingInterface { + public: + virtual ~ClientStreamingInterface() {} + + // Wait until the stream finishes, and return the final status. When the + // client side declares it has no more message to send, either implicitly or + // by calling WritesDone, it needs to make sure there is no more message to + // be received from the server, either implicitly or by getting a false from + // a Read(). + // This function will return either: + // - when all incoming messages have been read and the server has returned + // status + // - OR when the server has returned a non-OK status + virtual Status Finish() = 0; +}; + +// An interface that yields a sequence of R messages. +template +class ReaderInterface { + public: + virtual ~ReaderInterface() {} + + // Blocking read a message and parse to msg. Returns true on success. + // The method returns false when there will be no more incoming messages, + // either because the other side has called WritesDone or the stream has + // failed (or been cancelled). + virtual bool Read(R* msg) = 0; +}; + +// An interface that can be fed a sequence of W messages. +template +class WriterInterface { + public: + virtual ~WriterInterface() {} + + // Blocking write msg to the stream. Returns true on success. + // Returns false when the stream has been closed. + virtual bool Write(const W& msg, const WriteOptions& options) = 0; + + inline bool Write(const W& msg) { return Write(msg, WriteOptions()); } +}; + +template +class ClientReaderInterface : public ClientStreamingInterface, + public ReaderInterface { + public: + virtual void WaitForInitialMetadata() = 0; +}; + +template +class ClientReader GRPC_FINAL : public ClientReaderInterface { + public: + // Blocking create a stream and write the first request out. + template + ClientReader(Channel* channel, const RpcMethod& method, + ClientContext* context, const W& request) + : context_(context), call_(channel->CreateCall(method, context, &cq_)) { + CallOpSet ops; + ops.SendInitialMetadata(context->send_initial_metadata_); + // TODO(ctiller): don't assert + GPR_ASSERT(ops.SendMessage(request).ok()); + ops.ClientSendClose(); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + + // Blocking wait for initial metadata from server. The received metadata + // can only be accessed after this call returns. Should only be called before + // the first read. Calling this method is optional, and if it is not called + // the metadata will be available in ClientContext after the first read. + void WaitForInitialMetadata() { + GPR_ASSERT(!context_->initial_metadata_received_); + + CallOpSet ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + bool Read(R* msg) GRPC_OVERRIDE { + CallOpSet> ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + Status Finish() GRPC_OVERRIDE { + CallOpSet ops; + Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + ClientContext* context_; + CompletionQueue cq_; + Call call_; +}; + +template +class ClientWriterInterface : public ClientStreamingInterface, + public WriterInterface { + public: + virtual bool WritesDone() = 0; +}; + +template +class ClientWriter : public ClientWriterInterface { + public: + // Blocking create a stream. + template + ClientWriter(Channel* channel, const RpcMethod& method, + ClientContext* context, R* response) + : context_(context), call_(channel->CreateCall(method, context, &cq_)) { + finish_ops_.RecvMessage(response); + + CallOpSet ops; + ops.SendInitialMetadata(context->send_initial_metadata_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + + using WriterInterface::Write; + bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { + CallOpSet ops; + if (!ops.SendMessage(msg, options).ok()) { + return false; + } + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() GRPC_OVERRIDE { + CallOpSet ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + // Read the final response and wait for the final status. + Status Finish() GRPC_OVERRIDE { + Status status; + finish_ops_.ClientRecvStatus(context_, &status); + call_.PerformOps(&finish_ops_); + GPR_ASSERT(cq_.Pluck(&finish_ops_)); + return status; + } + + private: + ClientContext* context_; + CallOpSet finish_ops_; + CompletionQueue cq_; + Call call_; +}; + +// Client-side interface for bi-directional streaming. +template +class ClientReaderWriterInterface : public ClientStreamingInterface, + public WriterInterface, + public ReaderInterface { + public: + virtual void WaitForInitialMetadata() = 0; + virtual bool WritesDone() = 0; +}; + +template +class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface { + public: + // Blocking create a stream. + ClientReaderWriter(Channel* channel, const RpcMethod& method, + ClientContext* context) + : context_(context), call_(channel->CreateCall(method, context, &cq_)) { + CallOpSet ops; + ops.SendInitialMetadata(context->send_initial_metadata_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); + } + + // Blocking wait for initial metadata from server. The received metadata + // can only be accessed after this call returns. Should only be called before + // the first read. Calling this method is optional, and if it is not called + // the metadata will be available in ClientContext after the first read. + void WaitForInitialMetadata() { + GPR_ASSERT(!context_->initial_metadata_received_); + + CallOpSet ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + + bool Read(R* msg) GRPC_OVERRIDE { + CallOpSet> ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } + ops.RecvMessage(msg); + call_.PerformOps(&ops); + return cq_.Pluck(&ops) && ops.got_message; + } + + using WriterInterface::Write; + bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { + CallOpSet ops; + if (!ops.SendMessage(msg, options).ok()) return false; + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + bool WritesDone() GRPC_OVERRIDE { + CallOpSet ops; + ops.ClientSendClose(); + call_.PerformOps(&ops); + return cq_.Pluck(&ops); + } + + Status Finish() GRPC_OVERRIDE { + CallOpSet ops; + Status status; + ops.ClientRecvStatus(context_, &status); + call_.PerformOps(&ops); + GPR_ASSERT(cq_.Pluck(&ops)); + return status; + } + + private: + ClientContext* context_; + CompletionQueue cq_; + Call call_; +}; + +template +class ServerReader GRPC_FINAL : public ReaderInterface { + public: + ServerReader(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} + + void SendInitialMetadata() { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + CallOpSet ops; + ops.SendInitialMetadata(ctx_->initial_metadata_); + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool Read(R* msg) GRPC_OVERRIDE { + CallOpSet> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops) && ops.got_message; + } + + private: + Call* const call_; + ServerContext* const ctx_; +}; + +template +class ServerWriter GRPC_FINAL : public WriterInterface { + public: + ServerWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} + + void SendInitialMetadata() { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + CallOpSet ops; + ops.SendInitialMetadata(ctx_->initial_metadata_); + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + using WriterInterface::Write; + bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { + CallOpSet ops; + if (!ops.SendMessage(msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ops.SendInitialMetadata(ctx_->initial_metadata_); + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops); + } + + private: + Call* const call_; + ServerContext* const ctx_; +}; + +// Server-side interface for bi-directional streaming. +template +class ServerReaderWriter GRPC_FINAL : public WriterInterface, + public ReaderInterface { + public: + ServerReaderWriter(Call* call, ServerContext* ctx) : call_(call), ctx_(ctx) {} + + void SendInitialMetadata() { + GPR_ASSERT(!ctx_->sent_initial_metadata_); + + CallOpSet ops; + ops.SendInitialMetadata(ctx_->initial_metadata_); + ctx_->sent_initial_metadata_ = true; + call_->PerformOps(&ops); + call_->cq()->Pluck(&ops); + } + + bool Read(R* msg) GRPC_OVERRIDE { + CallOpSet> ops; + ops.RecvMessage(msg); + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops) && ops.got_message; + } + + using WriterInterface::Write; + bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { + CallOpSet ops; + if (!ops.SendMessage(msg, options).ok()) { + return false; + } + if (!ctx_->sent_initial_metadata_) { + ops.SendInitialMetadata(ctx_->initial_metadata_); + ctx_->sent_initial_metadata_ = true; + } + call_->PerformOps(&ops); + return call_->cq()->Pluck(&ops); + } + + private: + Call* const call_; + ServerContext* const ctx_; +}; + +} // namespace grpc + +#endif // GRPCXX_SUPPORT_SYNC_STREAM_H diff --git a/src/compiler/cpp_generator.cc b/src/compiler/cpp_generator.cc index 5d82b605fb3..1bf2b16ed6f 100644 --- a/src/compiler/cpp_generator.cc +++ b/src/compiler/cpp_generator.cc @@ -112,13 +112,14 @@ grpc::string GetHeaderPrologue(const grpc::protobuf::FileDescriptor *file, grpc::string GetHeaderIncludes(const grpc::protobuf::FileDescriptor *file, const Parameters ¶ms) { grpc::string temp = + "#include \n" "#include \n" "#include \n" "#include \n" "#include \n" "#include \n" - "#include \n" "#include \n" + "#include \n" "\n" "namespace grpc {\n" "class CompletionQueue;\n" @@ -706,7 +707,8 @@ grpc::string GetSourceIncludes(const grpc::protobuf::FileDescriptor *file, printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); printer.Print(vars, "#include \n"); - printer.Print(vars, "#include \n"); + printer.Print(vars, "#include \n"); + printer.Print(vars, "#include \n"); if (!file->package().empty()) { std::vector parts = diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index ccea4f68dea..d6337c20d79 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -785,6 +785,7 @@ include/grpc++/server.h \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ +include/grpc++/support/async_stream.h \ include/grpc++/support/async_unary_call.h \ include/grpc++/support/auth_context.h \ include/grpc++/support/byte_buffer.h \ @@ -796,8 +797,8 @@ include/grpc++/support/fixed_size_thread_pool.h \ include/grpc++/support/slice.h \ include/grpc++/support/status.h \ include/grpc++/support/status_code_enum.h \ -include/grpc++/support/stream.h \ include/grpc++/support/stub_options.h \ +include/grpc++/support/sync_stream.h \ include/grpc++/support/thread_pool_interface.h \ include/grpc++/support/time.h diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index c4a7fb07571..38999f99f04 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -785,6 +785,7 @@ include/grpc++/server.h \ include/grpc++/server_builder.h \ include/grpc++/server_context.h \ include/grpc++/server_credentials.h \ +include/grpc++/support/async_stream.h \ include/grpc++/support/async_unary_call.h \ include/grpc++/support/auth_context.h \ include/grpc++/support/byte_buffer.h \ @@ -796,8 +797,8 @@ include/grpc++/support/fixed_size_thread_pool.h \ include/grpc++/support/slice.h \ include/grpc++/support/status.h \ include/grpc++/support/status_code_enum.h \ -include/grpc++/support/stream.h \ include/grpc++/support/stub_options.h \ +include/grpc++/support/sync_stream.h \ include/grpc++/support/thread_pool_interface.h \ include/grpc++/support/time.h \ src/cpp/client/secure_credentials.h \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 8e6afe87d25..620fbddc9d2 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13143,6 +13143,7 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -13154,8 +13155,8 @@ "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", "src/cpp/client/create_channel_internal.h", @@ -13192,6 +13193,7 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -13203,8 +13205,8 @@ "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", "src/cpp/client/channel.cc", @@ -13315,6 +13317,7 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -13326,8 +13329,8 @@ "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", "src/cpp/client/create_channel_internal.h", @@ -13361,6 +13364,7 @@ "include/grpc++/server_builder.h", "include/grpc++/server_context.h", "include/grpc++/server_credentials.h", + "include/grpc++/support/async_stream.h", "include/grpc++/support/async_unary_call.h", "include/grpc++/support/auth_context.h", "include/grpc++/support/byte_buffer.h", @@ -13372,8 +13376,8 @@ "include/grpc++/support/slice.h", "include/grpc++/support/status.h", "include/grpc++/support/status_code_enum.h", - "include/grpc++/support/stream.h", "include/grpc++/support/stub_options.h", + "include/grpc++/support/sync_stream.h", "include/grpc++/support/thread_pool_interface.h", "include/grpc++/support/time.h", "src/cpp/client/channel.cc", diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index 5181b3a2004..4eb2dfdb7c9 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -238,6 +238,7 @@ + @@ -249,8 +250,8 @@ - + diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index cbffd3c765a..21fbe15a70b 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -171,6 +171,9 @@ include\grpc++ + + include\grpc++\support + include\grpc++\support @@ -204,10 +207,10 @@ include\grpc++\support - + include\grpc++\support - + include\grpc++\support diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 77f83086c7e..f7174350a69 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -238,6 +238,7 @@ + @@ -249,8 +250,8 @@ - + diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index d4288f8987d..b1df78c7e3e 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -156,6 +156,9 @@ include\grpc++ + + include\grpc++\support + include\grpc++\support @@ -189,10 +192,10 @@ include\grpc++\support - + include\grpc++\support - + include\grpc++\support From 849c7ca4b2bbda14dd9531ede3aa31cd86aa8d85 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 21 Aug 2015 16:06:05 -0700 Subject: [PATCH 36/79] prettify comment --- src/cpp/server/server.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 29db0b41c3b..05053ba5d57 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -333,9 +333,8 @@ bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) { unknown_method_.reset(new RpcServiceMethod( "unknown", RpcMethod::BIDI_STREAMING, new UnknownMethodHandler)); // Use of emplace_back with just constructor arguments is not accepted - // here - // by gcc-4.4 because it can't match the anonymous nullptr with a proper - // constructor implicitly. Construct the object and use push_back. + // here by gcc-4.4 because it can't match the anonymous nullptr with a + // proper constructor implicitly. Construct the object and use push_back. sync_methods_->push_back(SyncRequest(unknown_method_.get(), nullptr)); } for (size_t i = 0; i < num_cqs; i++) { From ea02eb619d3565a9e03f0cd25e439b01845b6536 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 19 Aug 2015 17:26:53 -0700 Subject: [PATCH 37/79] introduce INativeCall interface to simplify testing --- .../Grpc.Core.Tests/Grpc.Core.Tests.csproj | 1 + .../Grpc.Core.Tests/GrpcEnvironmentTest.cs | 7 +- .../Grpc.Core.Tests/Internal/AsyncCallTest.cs | 243 ++++++++++++++++++ src/csharp/Grpc.Core/Grpc.Core.csproj | 1 + src/csharp/Grpc.Core/GrpcEnvironment.cs | 8 + src/csharp/Grpc.Core/Internal/AsyncCall.cs | 63 +++-- .../Grpc.Core/Internal/AsyncCallBase.cs | 27 +- .../Grpc.Core/Internal/AsyncCallServer.cs | 8 +- .../Grpc.Core/Internal/CallSafeHandle.cs | 42 +-- src/csharp/Grpc.Core/Internal/INativeCall.cs | 79 ++++++ .../Grpc.Core/Properties/AssemblyInfo.cs | 7 + 11 files changed, 421 insertions(+), 65 deletions(-) create mode 100644 src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs create mode 100644 src/csharp/Grpc.Core/Internal/INativeCall.cs diff --git a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj index ad4e94a6959..b571fe90259 100644 --- a/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj +++ b/src/csharp/Grpc.Core.Tests/Grpc.Core.Tests.csproj @@ -65,6 +65,7 @@ + diff --git a/src/csharp/Grpc.Core.Tests/GrpcEnvironmentTest.cs b/src/csharp/Grpc.Core.Tests/GrpcEnvironmentTest.cs index 4fdfab5a994..78295cf6d41 100644 --- a/src/csharp/Grpc.Core.Tests/GrpcEnvironmentTest.cs +++ b/src/csharp/Grpc.Core.Tests/GrpcEnvironmentTest.cs @@ -53,7 +53,7 @@ namespace Grpc.Core.Tests { var env1 = GrpcEnvironment.AddRef(); var env2 = GrpcEnvironment.AddRef(); - Assert.IsTrue(object.ReferenceEquals(env1, env2)); + Assert.AreSame(env1, env2); GrpcEnvironment.Release(); GrpcEnvironment.Release(); } @@ -61,18 +61,21 @@ namespace Grpc.Core.Tests [Test] public void InitializeAfterShutdown() { + Assert.AreEqual(0, GrpcEnvironment.GetRefCount()); + var env1 = GrpcEnvironment.AddRef(); GrpcEnvironment.Release(); var env2 = GrpcEnvironment.AddRef(); GrpcEnvironment.Release(); - Assert.IsFalse(object.ReferenceEquals(env1, env2)); + Assert.AreNotSame(env1, env2); } [Test] public void ReleaseWithoutAddRef() { + Assert.AreEqual(0, GrpcEnvironment.GetRefCount()); Assert.Throws(typeof(InvalidOperationException), () => GrpcEnvironment.Release()); } diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs new file mode 100644 index 00000000000..141af7760c8 --- /dev/null +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs @@ -0,0 +1,243 @@ +#region Copyright notice and license + +// Copyright 2015, 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. + +#endregion + +using System; +using System.Runtime.InteropServices; +using Grpc.Core.Internal; +using NUnit.Framework; +using System.Threading.Tasks; + +namespace Grpc.Core.Internal.Tests +{ + public class AsyncCallTest + { + Channel channel; + FakeNativeCall fakeCall; + AsyncCall asyncCall; + + [SetUp] + public void Init() + { + channel = new Channel("localhost", Credentials.Insecure); + + fakeCall = new FakeNativeCall(); + + var callDetails = new CallInvocationDetails(channel, "someMethod", null, Marshallers.StringMarshaller, Marshallers.StringMarshaller, new CallOptions()); + asyncCall = new AsyncCall(callDetails, fakeCall); + } + + [TearDown] + public void Cleanup() + { + channel.ShutdownAsync().Wait(); + } + + [Test] + public void AsyncUnary_CompletionSuccess() + { + var resultTask = asyncCall.UnaryCallAsync("abc"); + fakeCall.UnaryResponseClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()), new byte[] { 1, 2, 3 }); + Assert.IsTrue(resultTask.IsCompleted); + Assert.IsTrue(fakeCall.IsDisposed); + Assert.AreEqual(Status.DefaultSuccess, asyncCall.GetStatus()); + } + + [Test] + public void AsyncUnary_CompletionFailure() + { + var resultTask = asyncCall.UnaryCallAsync("abc"); + fakeCall.UnaryResponseClientHandler(false, new ClientSideStatus(), null); + + Assert.IsTrue(resultTask.IsCompleted); + Assert.IsTrue(fakeCall.IsDisposed); + + Assert.AreEqual(StatusCode.Internal, asyncCall.GetStatus().StatusCode); + Assert.IsNull(asyncCall.GetTrailers()); + var ex = Assert.Throws(() => resultTask.GetAwaiter().GetResult()); + Assert.AreEqual(StatusCode.Internal, ex.Status.StatusCode); + } + + + //[Test] + //public void Duplex_ReceiveEarlyClose() + //{ + // asyncCall.StartDuplexStreamingCall(); + + // fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(new Status(StatusCode.DeadlineExceeded, ""), null)); + + // // TODO: start read... + // Assert.IsTrue(fakeCall.IsDisposed); + //} + + //[Test] + //public void Duplex_ReceiveEarlyCloseWithRead() + //{ + // asyncCall.StartDuplexStreamingCall(); + + // fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(new Status(StatusCode.DeadlineExceeded, ""), null)); + + // var taskSource = new AsyncCompletionTaskSource(); + // asyncCall.StartReadMessage(taskSource.CompletionDelegate); + + // fakeCall.ReceivedMessageHandler(true, new byte[] { 1 } ); + + // // TODO: start read... + // Assert.IsTrue(fakeCall.IsDisposed); + //} + + + internal class FakeNativeCall : INativeCall + { + + public UnaryResponseClientHandler UnaryResponseClientHandler + { + get; + set; + } + + public ReceivedStatusOnClientHandler ReceivedStatusOnClientHandler + { + get; + set; + } + + public ReceivedMessageHandler ReceivedMessageHandler + { + get; + set; + } + + public SendCompletionHandler SendCompletionHandler + { + get; + set; + } + + public ReceivedCloseOnServerHandler ReceivedCloseOnServerHandler + { + get; + set; + } + + public bool IsCancelled + { + get; + set; + } + + public bool IsDisposed + { + get; + set; + } + + public void Cancel() + { + IsCancelled = true; + } + + public void CancelWithStatus(Status status) + { + IsCancelled = true; + } + + public string GetPeer() + { + return "PEER"; + } + + public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) + { + UnaryResponseClientHandler = callback; + } + + public void StartUnary(BatchContextSafeHandle ctx, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) + { + throw new NotImplementedException(); + } + + public void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray) + { + UnaryResponseClientHandler = callback; + } + + public void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) + { + ReceivedStatusOnClientHandler = callback; + } + + public void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray) + { + ReceivedStatusOnClientHandler = callback; + } + + public void StartReceiveMessage(ReceivedMessageHandler callback) + { + ReceivedMessageHandler = callback; + } + + public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray) + { + SendCompletionHandler = callback; + } + + public void StartSendMessage(SendCompletionHandler callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata) + { + SendCompletionHandler = callback; + } + + public void StartSendCloseFromClient(SendCompletionHandler callback) + { + SendCompletionHandler = callback; + } + + public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata) + { + SendCompletionHandler = callback; + } + + public void StartServerSide(ReceivedCloseOnServerHandler callback) + { + ReceivedCloseOnServerHandler = callback; + } + + public void Dispose() + { + IsDisposed = true; + } + } + + } + + +} \ No newline at end of file diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj index 055aff14448..ad2af17bc75 100644 --- a/src/csharp/Grpc.Core/Grpc.Core.csproj +++ b/src/csharp/Grpc.Core/Grpc.Core.csproj @@ -49,6 +49,7 @@ + diff --git a/src/csharp/Grpc.Core/GrpcEnvironment.cs b/src/csharp/Grpc.Core/GrpcEnvironment.cs index 0a44eead74a..b64228558e1 100644 --- a/src/csharp/Grpc.Core/GrpcEnvironment.cs +++ b/src/csharp/Grpc.Core/GrpcEnvironment.cs @@ -102,6 +102,14 @@ namespace Grpc.Core } } + internal static int GetRefCount() + { + lock (staticLock) + { + return refCount; + } + } + /// /// Gets application-wide logger used by gRPC. /// diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs index bb9ba5b8dd7..30d60077f01 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs @@ -51,6 +51,7 @@ namespace Grpc.Core.Internal static readonly ILogger Logger = GrpcEnvironment.Logger.ForType>(); readonly CallInvocationDetails details; + readonly INativeCall injectedNativeCall; // for testing // Completion of a pending unary response if not null. TaskCompletionSource unaryResponseTcs; @@ -61,12 +62,21 @@ namespace Grpc.Core.Internal bool readObserverCompleted; // True if readObserver has already been completed. public AsyncCall(CallInvocationDetails callDetails) - : base(callDetails.RequestMarshaller.Serializer, callDetails.ResponseMarshaller.Deserializer) + : base(callDetails.RequestMarshaller.Serializer, callDetails.ResponseMarshaller.Deserializer, callDetails.Channel.Environment) { this.details = callDetails.WithOptions(callDetails.Options.Normalize()); this.initialMetadataSent = true; // we always send metadata at the very beginning of the call. } + /// + /// This constructor should only be used for testing. + /// + public AsyncCall(CallInvocationDetails callDetails, INativeCall injectedNativeCall) + : this(callDetails) + { + this.injectedNativeCall = injectedNativeCall; + } + // TODO: this method is not Async, so it shouldn't be in AsyncCall class, but // it is reusing fair amount of code in this class, so we are leaving it here. /// @@ -100,7 +110,7 @@ namespace Grpc.Core.Internal bool success = (ev.success != 0); try { - HandleUnaryResponse(success, ctx); + HandleUnaryResponse(success, ctx.GetReceivedStatusOnClient(), ctx.GetReceivedMessage()); } catch (Exception e) { @@ -125,7 +135,7 @@ namespace Grpc.Core.Internal Preconditions.CheckState(!started); started = true; - Initialize(details.Channel.Environment.CompletionQueue); + Initialize(environment.CompletionQueue); halfcloseRequested = true; readingDone = true; @@ -152,7 +162,7 @@ namespace Grpc.Core.Internal Preconditions.CheckState(!started); started = true; - Initialize(details.Channel.Environment.CompletionQueue); + Initialize(environment.CompletionQueue); readingDone = true; @@ -176,7 +186,7 @@ namespace Grpc.Core.Internal Preconditions.CheckState(!started); started = true; - Initialize(details.Channel.Environment.CompletionQueue); + Initialize(environment.CompletionQueue); halfcloseRequested = true; halfclosed = true; // halfclose not confirmed yet, but it will be once finishedHandler is called. @@ -201,7 +211,7 @@ namespace Grpc.Core.Internal Preconditions.CheckState(!started); started = true; - Initialize(details.Channel.Environment.CompletionQueue); + Initialize(environment.CompletionQueue); using (var metadataArray = MetadataArraySafeHandle.Create(details.Options.Headers)) { @@ -318,18 +328,27 @@ namespace Grpc.Core.Internal private void Initialize(CompletionQueueSafeHandle cq) { + var call = CreateNativeCall(cq); + details.Channel.AddCallReference(this); + InitializeInternal(call); + RegisterCancellationCallback(); + } + + private INativeCall CreateNativeCall(CompletionQueueSafeHandle cq) + { + if (injectedNativeCall != null) + { + return injectedNativeCall; // allows injecting a mock INativeCall in tests. + } + var parentCall = details.Options.PropagationToken != null ? details.Options.PropagationToken.ParentCall : CallSafeHandle.NullInstance; - var call = details.Channel.Handle.CreateCall(details.Channel.Environment.CompletionRegistry, + return details.Channel.Handle.CreateCall(environment.CompletionRegistry, parentCall, ContextPropagationToken.DefaultMask, cq, details.Method, details.Host, Timespec.FromDateTime(details.Options.Deadline.Value)); - - details.Channel.AddCallReference(this); - - InitializeInternal(call); - RegisterCancellationCallback(); } + // Make sure that once cancellationToken for this call is cancelled, Cancel() will be called. private void RegisterCancellationCallback() { @@ -352,14 +371,12 @@ namespace Grpc.Core.Internal /// /// Handler for unary response completion. /// - private void HandleUnaryResponse(bool success, BatchContextSafeHandle ctx) + private void HandleUnaryResponse(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage) { - var fullStatus = ctx.GetReceivedStatusOnClient(); - lock (myLock) { finished = true; - finishedStatus = fullStatus; + finishedStatus = receivedStatus; halfclosed = true; @@ -368,11 +385,13 @@ namespace Grpc.Core.Internal if (!success) { - unaryResponseTcs.SetException(new RpcException(new Status(StatusCode.Internal, "Internal error occured."))); + var internalError = new Status(StatusCode.Internal, "Internal error occured."); + finishedStatus = new ClientSideStatus(internalError, null); + unaryResponseTcs.SetException(new RpcException(internalError)); return; } - var status = fullStatus.Status; + var status = receivedStatus.Status; if (status.StatusCode != StatusCode.OK) { @@ -382,7 +401,7 @@ namespace Grpc.Core.Internal // TODO: handle deserialization error TResponse msg; - TryDeserialize(ctx.GetReceivedMessage(), out msg); + TryDeserialize(receivedMessage, out msg); unaryResponseTcs.SetResult(msg); } @@ -390,15 +409,13 @@ namespace Grpc.Core.Internal /// /// Handles receive status completion for calls with streaming response. /// - private void HandleFinished(bool success, BatchContextSafeHandle ctx) + private void HandleFinished(bool success, ClientSideStatus receivedStatus) { - var fullStatus = ctx.GetReceivedStatusOnClient(); - AsyncCompletionDelegate origReadCompletionDelegate = null; lock (myLock) { finished = true; - finishedStatus = fullStatus; + finishedStatus = receivedStatus; origReadCompletionDelegate = readCompletionDelegate; diff --git a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs index 1808294f43f..7744dbec002 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs @@ -54,9 +54,10 @@ namespace Grpc.Core.Internal readonly Func serializer; readonly Func deserializer; + protected readonly GrpcEnvironment environment; protected readonly object myLock = new object(); - protected CallSafeHandle call; + protected INativeCall call; protected bool disposed; protected bool started; @@ -74,10 +75,11 @@ namespace Grpc.Core.Internal protected bool initialMetadataSent; protected long streamingWritesCounter; - public AsyncCallBase(Func serializer, Func deserializer) + public AsyncCallBase(Func serializer, Func deserializer, GrpcEnvironment environment) { this.serializer = Preconditions.CheckNotNull(serializer); this.deserializer = Preconditions.CheckNotNull(deserializer); + this.environment = Preconditions.CheckNotNull(environment); } /// @@ -114,7 +116,7 @@ namespace Grpc.Core.Internal } } - protected void InitializeInternal(CallSafeHandle call) + protected void InitializeInternal(INativeCall call) { lock (myLock) { @@ -177,7 +179,7 @@ namespace Grpc.Core.Internal { if (!disposed && call != null) { - bool noMoreSendCompletions = halfclosed || (cancelRequested && sendCompletionDelegate == null); + bool noMoreSendCompletions = halfclosed || ((cancelRequested || finished) && sendCompletionDelegate == null); if (noMoreSendCompletions && readingDone && finished) { ReleaseResources(); @@ -209,14 +211,15 @@ namespace Grpc.Core.Internal Preconditions.CheckState(!disposed); Preconditions.CheckState(!halfcloseRequested, "Already halfclosed."); + Preconditions.CheckState(!finished, "Already finished."); Preconditions.CheckState(sendCompletionDelegate == null, "Only one write can be pending at a time"); } protected virtual void CheckReadingAllowed() { Preconditions.CheckState(started); - Preconditions.CheckState(!disposed); Preconditions.CheckState(!errorOccured); + Preconditions.CheckState(!disposed); Preconditions.CheckState(!readingDone, "Stream has already been closed."); Preconditions.CheckState(readCompletionDelegate == null, "Only one read can be pending at a time"); @@ -280,7 +283,7 @@ namespace Grpc.Core.Internal /// /// Handles send completion. /// - protected void HandleSendFinished(bool success, BatchContextSafeHandle ctx) + protected void HandleSendFinished(bool success) { AsyncCompletionDelegate origCompletionDelegate = null; lock (myLock) @@ -304,7 +307,7 @@ namespace Grpc.Core.Internal /// /// Handles halfclose completion. /// - protected void HandleHalfclosed(bool success, BatchContextSafeHandle ctx) + protected void HandleHalfclosed(bool success) { AsyncCompletionDelegate origCompletionDelegate = null; lock (myLock) @@ -329,15 +332,13 @@ namespace Grpc.Core.Internal /// /// Handles streaming read completion. /// - protected void HandleReadFinished(bool success, BatchContextSafeHandle ctx) + protected void HandleReadFinished(bool success, byte[] receivedMessage) { - var payload = ctx.GetReceivedMessage(); - AsyncCompletionDelegate origCompletionDelegate = null; lock (myLock) { origCompletionDelegate = readCompletionDelegate; - if (payload != null) + if (receivedMessage != null) { readCompletionDelegate = null; } @@ -354,11 +355,11 @@ namespace Grpc.Core.Internal // TODO: handle the case when error occured... - if (payload != null) + if (receivedMessage != null) { // TODO: handle deserialization error TRead msg; - TryDeserialize(payload, out msg); + TryDeserialize(receivedMessage, out msg); FireCompletion(origCompletionDelegate, msg, null); } diff --git a/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs b/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs index 6278c0191ec..5c47251030e 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCallServer.cs @@ -49,12 +49,10 @@ namespace Grpc.Core.Internal { readonly TaskCompletionSource finishedServersideTcs = new TaskCompletionSource(); readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); - readonly GrpcEnvironment environment; readonly Server server; - public AsyncCallServer(Func serializer, Func deserializer, GrpcEnvironment environment, Server server) : base(serializer, deserializer) + public AsyncCallServer(Func serializer, Func deserializer, GrpcEnvironment environment, Server server) : base(serializer, deserializer, environment) { - this.environment = Preconditions.CheckNotNull(environment); this.server = Preconditions.CheckNotNull(server); } @@ -185,10 +183,8 @@ namespace Grpc.Core.Internal /// /// Handles the server side close completion. /// - private void HandleFinishedServerside(bool success, BatchContextSafeHandle ctx) + private void HandleFinishedServerside(bool success, bool cancelled) { - bool cancelled = ctx.GetReceivedCloseOnServerCancelled(); - lock (myLock) { finished = true; diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs index 3cb01e29bd8..e1466da65b3 100644 --- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs @@ -40,7 +40,7 @@ namespace Grpc.Core.Internal /// /// grpc_call from /// - internal class CallSafeHandle : SafeHandleZeroIsInvalid + internal class CallSafeHandle : SafeHandleZeroIsInvalid, INativeCall { public static readonly CallSafeHandle NullInstance = new CallSafeHandle(); @@ -109,10 +109,10 @@ namespace Grpc.Core.Internal this.completionRegistry = completionRegistry; } - public void StartUnary(BatchCompletionDelegate callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) + public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage())); grpcsharp_call_start_unary(this, ctx, payload, new UIntPtr((ulong)payload.Length), metadataArray, writeFlags) .CheckOk(); } @@ -123,66 +123,66 @@ namespace Grpc.Core.Internal .CheckOk(); } - public void StartClientStreaming(BatchCompletionDelegate callback, MetadataArraySafeHandle metadataArray) + public void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage())); grpcsharp_call_start_client_streaming(this, ctx, metadataArray).CheckOk(); } - public void StartServerStreaming(BatchCompletionDelegate callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) + public void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient())); grpcsharp_call_start_server_streaming(this, ctx, payload, new UIntPtr((ulong)payload.Length), metadataArray, writeFlags).CheckOk(); } - public void StartDuplexStreaming(BatchCompletionDelegate callback, MetadataArraySafeHandle metadataArray) + public void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient())); grpcsharp_call_start_duplex_streaming(this, ctx, metadataArray).CheckOk(); } - public void StartSendMessage(BatchCompletionDelegate callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata) + public void StartSendMessage(SendCompletionHandler callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); grpcsharp_call_send_message(this, ctx, payload, new UIntPtr((ulong)payload.Length), writeFlags, sendEmptyInitialMetadata).CheckOk(); } - public void StartSendCloseFromClient(BatchCompletionDelegate callback) + public void StartSendCloseFromClient(SendCompletionHandler callback) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); grpcsharp_call_send_close_from_client(this, ctx).CheckOk(); } - public void StartSendStatusFromServer(BatchCompletionDelegate callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata) + public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, status.Detail, metadataArray, sendEmptyInitialMetadata).CheckOk(); } - public void StartReceiveMessage(BatchCompletionDelegate callback) + public void StartReceiveMessage(ReceivedMessageHandler callback) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedMessage())); grpcsharp_call_recv_message(this, ctx).CheckOk(); } - public void StartServerSide(BatchCompletionDelegate callback) + public void StartServerSide(ReceivedCloseOnServerHandler callback) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedCloseOnServerCancelled())); grpcsharp_call_start_serverside(this, ctx).CheckOk(); } - public void StartSendInitialMetadata(BatchCompletionDelegate callback, MetadataArraySafeHandle metadataArray) + public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, callback); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); grpcsharp_call_send_initial_metadata(this, ctx, metadataArray).CheckOk(); } diff --git a/src/csharp/Grpc.Core/Internal/INativeCall.cs b/src/csharp/Grpc.Core/Internal/INativeCall.cs new file mode 100644 index 00000000000..42028e458cf --- /dev/null +++ b/src/csharp/Grpc.Core/Internal/INativeCall.cs @@ -0,0 +1,79 @@ +#region Copyright notice and license +// Copyright 2015, 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. + +#endregion + +using System; +namespace Grpc.Core.Internal +{ + internal delegate void UnaryResponseClientHandler(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage); + + internal delegate void ReceivedStatusOnClientHandler(bool success, ClientSideStatus receivedStatus); + + internal delegate void ReceivedMessageHandler(bool success, byte[] receivedMessage); + + internal delegate void SendCompletionHandler(bool success); + + internal delegate void ReceivedCloseOnServerHandler(bool success, bool cancelled); + + /// + /// Abstraction of a native call object. + /// + internal interface INativeCall : IDisposable + { + void Cancel(); + + void CancelWithStatus(Grpc.Core.Status status); + + string GetPeer(); + + void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, Grpc.Core.WriteFlags writeFlags); + + void StartUnary(BatchContextSafeHandle ctx, byte[] payload, MetadataArraySafeHandle metadataArray, Grpc.Core.WriteFlags writeFlags); + + void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray); + + void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, Grpc.Core.WriteFlags writeFlags); + + void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray); + + void StartReceiveMessage(ReceivedMessageHandler callback); + + void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray); + + void StartSendMessage(SendCompletionHandler callback, byte[] payload, Grpc.Core.WriteFlags writeFlags, bool sendEmptyInitialMetadata); + + void StartSendCloseFromClient(SendCompletionHandler callback); + + void StartSendStatusFromServer(SendCompletionHandler callback, Grpc.Core.Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata); + + void StartServerSide(ReceivedCloseOnServerHandler callback); + } +} diff --git a/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs b/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs index 29db85d7aae..caca080b7f2 100644 --- a/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs +++ b/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs @@ -16,6 +16,13 @@ using System.Runtime.CompilerServices; "0442bb8e12768722de0b0cb1b15e955b32a11352740ee59f2c94c48edc8e177d1052536b8ac651bce11ce5da3a" + "27fc95aff3dc604a6971417453f9483c7b5e836756d5b271bf8f2403fe186e31956148c03d804487cf642f8cc0" + "71394ee9672dfe5b55ea0f95dfd5a7f77d22c962ccf51320d3")] + +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=" + + "0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6" + + "c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdc" + + "f9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff6" + + "2abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] #else [assembly: InternalsVisibleTo("Grpc.Core.Tests")] +[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] #endif \ No newline at end of file From fb34a99d9810cf4cac2c1d20813379d5ea976adf Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 21 Aug 2015 10:45:39 -0700 Subject: [PATCH 38/79] reading of response headers for unary response calls --- .../Grpc.Core.Tests/Internal/AsyncCallTest.cs | 4 +-- .../Grpc.Core.Tests/ResponseHeadersTest.cs | 19 ++++++++++++ .../Grpc.Core/AsyncClientStreamingCall.cs | 15 +++++++++- src/csharp/Grpc.Core/AsyncUnaryCall.cs | 15 +++++++++- src/csharp/Grpc.Core/Calls.cs | 4 +-- src/csharp/Grpc.Core/Internal/AsyncCall.cs | 29 ++++++++++++------- .../Grpc.Core/Internal/CallSafeHandle.cs | 4 +-- src/csharp/Grpc.Core/Internal/INativeCall.cs | 3 +- 8 files changed, 74 insertions(+), 19 deletions(-) diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs index 141af7760c8..1fa895ba711 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs @@ -66,7 +66,7 @@ namespace Grpc.Core.Internal.Tests public void AsyncUnary_CompletionSuccess() { var resultTask = asyncCall.UnaryCallAsync("abc"); - fakeCall.UnaryResponseClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()), new byte[] { 1, 2, 3 }); + fakeCall.UnaryResponseClientHandler(true, new ClientSideStatus(Status.DefaultSuccess, new Metadata()), new byte[] { 1, 2, 3 }, new Metadata()); Assert.IsTrue(resultTask.IsCompleted); Assert.IsTrue(fakeCall.IsDisposed); Assert.AreEqual(Status.DefaultSuccess, asyncCall.GetStatus()); @@ -76,7 +76,7 @@ namespace Grpc.Core.Internal.Tests public void AsyncUnary_CompletionFailure() { var resultTask = asyncCall.UnaryCallAsync("abc"); - fakeCall.UnaryResponseClientHandler(false, new ClientSideStatus(), null); + fakeCall.UnaryResponseClientHandler(false, new ClientSideStatus(new Status(StatusCode.Internal, ""), null), new byte[] { 1, 2, 3 }, new Metadata()); Assert.IsTrue(resultTask.IsCompleted); Assert.IsTrue(fakeCall.IsDisposed); diff --git a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs index 706006702e5..8ad41af1b81 100644 --- a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs +++ b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs @@ -73,6 +73,25 @@ namespace Grpc.Core.Tests server.ShutdownAsync().Wait(); } + [Test] + public async Task ResponseHeadersAsync_UnaryCall() + { + helper.UnaryHandler = new UnaryServerMethod(async (request, context) => + { + await context.WriteResponseHeadersAsync(headers); + return "PASS"; + }); + + var call = Calls.AsyncUnaryCall(helper.CreateUnaryCall(), ""); + var responseHeaders = await call.ResponseHeadersAsync; + + Assert.AreEqual(headers.Count, responseHeaders.Count); + Assert.AreEqual("ascii-header", responseHeaders[0].Key); + Assert.AreEqual("abcdefg", responseHeaders[0].Value); + + Assert.AreEqual("PASS", await call.ResponseAsync); + } + [Test] public void WriteResponseHeaders_NullNotAllowed() { diff --git a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs index fb9b562c77b..dbaa3085c54 100644 --- a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs @@ -44,14 +44,16 @@ namespace Grpc.Core { readonly IClientStreamWriter requestStream; readonly Task responseAsync; + readonly Task responseHeadersAsync; readonly Func getStatusFunc; readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncClientStreamingCall(IClientStreamWriter requestStream, Task responseAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + public AsyncClientStreamingCall(IClientStreamWriter requestStream, Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.requestStream = requestStream; this.responseAsync = responseAsync; + this.responseHeadersAsync = responseHeadersAsync; this.getStatusFunc = getStatusFunc; this.getTrailersFunc = getTrailersFunc; this.disposeAction = disposeAction; @@ -68,6 +70,17 @@ namespace Grpc.Core } } + /// + /// Asynchronous access to response headers. + /// + public Task ResponseHeadersAsync + { + get + { + return this.responseHeadersAsync; + } + } + /// /// Async stream to send streaming requests. /// diff --git a/src/csharp/Grpc.Core/AsyncUnaryCall.cs b/src/csharp/Grpc.Core/AsyncUnaryCall.cs index 224e3439160..154a17a33ef 100644 --- a/src/csharp/Grpc.Core/AsyncUnaryCall.cs +++ b/src/csharp/Grpc.Core/AsyncUnaryCall.cs @@ -43,13 +43,15 @@ namespace Grpc.Core public sealed class AsyncUnaryCall : IDisposable { readonly Task responseAsync; + readonly Task responseHeadersAsync; readonly Func getStatusFunc; readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncUnaryCall(Task responseAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + public AsyncUnaryCall(Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.responseAsync = responseAsync; + this.responseHeadersAsync = responseHeadersAsync; this.getStatusFunc = getStatusFunc; this.getTrailersFunc = getTrailersFunc; this.disposeAction = disposeAction; @@ -66,6 +68,17 @@ namespace Grpc.Core } } + /// + /// Asynchronous access to response headers. + /// + public Task ResponseHeadersAsync + { + get + { + return this.responseHeadersAsync; + } + } + /// /// Allows awaiting this object directly. /// diff --git a/src/csharp/Grpc.Core/Calls.cs b/src/csharp/Grpc.Core/Calls.cs index 7067456638a..ada3616aa4a 100644 --- a/src/csharp/Grpc.Core/Calls.cs +++ b/src/csharp/Grpc.Core/Calls.cs @@ -74,7 +74,7 @@ namespace Grpc.Core { var asyncCall = new AsyncCall(call); var asyncResult = asyncCall.UnaryCallAsync(req); - return new AsyncUnaryCall(asyncResult, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); + return new AsyncUnaryCall(asyncResult, asyncCall.ResponseHeadersAsync, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); } /// @@ -110,7 +110,7 @@ namespace Grpc.Core var asyncCall = new AsyncCall(call); var resultTask = asyncCall.ClientStreamingCallAsync(); var requestStream = new ClientRequestStream(asyncCall); - return new AsyncClientStreamingCall(requestStream, resultTask, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); + return new AsyncClientStreamingCall(requestStream, resultTask, asyncCall.ResponseHeadersAsync, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); } /// diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs index 30d60077f01..132b4264243 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs @@ -56,6 +56,9 @@ namespace Grpc.Core.Internal // Completion of a pending unary response if not null. TaskCompletionSource unaryResponseTcs; + // Response headers set here once received. + TaskCompletionSource responseHeadersTcs = new TaskCompletionSource(); + // Set after status is received. Used for both unary and streaming response calls. ClientSideStatus? finishedStatus; @@ -110,7 +113,7 @@ namespace Grpc.Core.Internal bool success = (ev.success != 0); try { - HandleUnaryResponse(success, ctx.GetReceivedStatusOnClient(), ctx.GetReceivedMessage()); + HandleUnaryResponse(success, ctx.GetReceivedStatusOnClient(), ctx.GetReceivedMessage(), ctx.GetReceivedInitialMetadata()); } catch (Exception e) { @@ -257,6 +260,17 @@ namespace Grpc.Core.Internal } } + /// + /// Get the task that completes once response headers are received. + /// + public Task ResponseHeadersAsync + { + get + { + return responseHeadersTcs.Task; + } + } + /// /// Gets the resulting status if the call has already finished. /// Throws InvalidOperationException otherwise. @@ -371,7 +385,7 @@ namespace Grpc.Core.Internal /// /// Handler for unary response completion. /// - private void HandleUnaryResponse(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage) + private void HandleUnaryResponse(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage, Metadata responseHeaders) { lock (myLock) { @@ -383,18 +397,13 @@ namespace Grpc.Core.Internal ReleaseResourcesIfPossible(); } - if (!success) - { - var internalError = new Status(StatusCode.Internal, "Internal error occured."); - finishedStatus = new ClientSideStatus(internalError, null); - unaryResponseTcs.SetException(new RpcException(internalError)); - return; - } + responseHeadersTcs.SetResult(responseHeaders); var status = receivedStatus.Status; - if (status.StatusCode != StatusCode.OK) + if (!success || status.StatusCode != StatusCode.OK) { + unaryResponseTcs.SetException(new RpcException(status)); return; } diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs index e1466da65b3..ed6747ea93a 100644 --- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs @@ -112,7 +112,7 @@ namespace Grpc.Core.Internal public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, MetadataArraySafeHandle metadataArray, WriteFlags writeFlags) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage())); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage(), context.GetReceivedInitialMetadata())); grpcsharp_call_start_unary(this, ctx, payload, new UIntPtr((ulong)payload.Length), metadataArray, writeFlags) .CheckOk(); } @@ -126,7 +126,7 @@ namespace Grpc.Core.Internal public void StartClientStreaming(UnaryResponseClientHandler callback, MetadataArraySafeHandle metadataArray) { var ctx = BatchContextSafeHandle.Create(); - completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage())); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage(), context.GetReceivedInitialMetadata())); grpcsharp_call_start_client_streaming(this, ctx, metadataArray).CheckOk(); } diff --git a/src/csharp/Grpc.Core/Internal/INativeCall.cs b/src/csharp/Grpc.Core/Internal/INativeCall.cs index 42028e458cf..ef2e230ff8d 100644 --- a/src/csharp/Grpc.Core/Internal/INativeCall.cs +++ b/src/csharp/Grpc.Core/Internal/INativeCall.cs @@ -33,8 +33,9 @@ using System; namespace Grpc.Core.Internal { - internal delegate void UnaryResponseClientHandler(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage); + internal delegate void UnaryResponseClientHandler(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage, Metadata responseHeaders); + // Received status for streaming response calls. internal delegate void ReceivedStatusOnClientHandler(bool success, ClientSideStatus receivedStatus); internal delegate void ReceivedMessageHandler(bool success, byte[] receivedMessage); From 3af838a2d719c65c360f28ee8551c6012f408401 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 21 Aug 2015 13:48:52 -0700 Subject: [PATCH 39/79] simplify stream reads on client side --- src/csharp/Grpc.Core/Internal/AsyncCall.cs | 66 +++++++------------ .../Grpc.Core/Internal/AsyncCallBase.cs | 37 +++-------- .../Internal/ClientResponseStream.cs | 8 ++- 3 files changed, 40 insertions(+), 71 deletions(-) diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs index 132b4264243..d687bb62832 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs @@ -56,14 +56,15 @@ namespace Grpc.Core.Internal // Completion of a pending unary response if not null. TaskCompletionSource unaryResponseTcs; + // Indicates that steaming call has finished. + TaskCompletionSource streamingCallFinishedTcs = new TaskCompletionSource(); + // Response headers set here once received. TaskCompletionSource responseHeadersTcs = new TaskCompletionSource(); // Set after status is received. Used for both unary and streaming response calls. ClientSideStatus? finishedStatus; - bool readObserverCompleted; // True if readObserver has already been completed. - public AsyncCall(CallInvocationDetails callDetails) : base(callDetails.RequestMarshaller.Serializer, callDetails.ResponseMarshaller.Deserializer, callDetails.Channel.Environment) { @@ -74,8 +75,7 @@ namespace Grpc.Core.Internal /// /// This constructor should only be used for testing. /// - public AsyncCall(CallInvocationDetails callDetails, INativeCall injectedNativeCall) - : this(callDetails) + public AsyncCall(CallInvocationDetails callDetails, INativeCall injectedNativeCall) : this(callDetails) { this.injectedNativeCall = injectedNativeCall; } @@ -192,7 +192,6 @@ namespace Grpc.Core.Internal Initialize(environment.CompletionQueue); halfcloseRequested = true; - halfclosed = true; // halfclose not confirmed yet, but it will be once finishedHandler is called. byte[] payload = UnsafeSerialize(msg); @@ -260,6 +259,17 @@ namespace Grpc.Core.Internal } } + /// + /// Get the task that completes once if streaming call finishes with ok status and throws RpcException with given status otherwise. + /// + public Task StreamingCallFinishedTask + { + get + { + return streamingCallFinishedTcs.Task; + } + } + /// /// Get the task that completes once response headers are received. /// @@ -305,36 +315,6 @@ namespace Grpc.Core.Internal } } - /// - /// On client-side, we only fire readCompletionDelegate once all messages have been read - /// and status has been received. - /// - protected override void ProcessLastRead(AsyncCompletionDelegate completionDelegate) - { - if (completionDelegate != null && readingDone && finishedStatus.HasValue) - { - bool shouldComplete; - lock (myLock) - { - shouldComplete = !readObserverCompleted; - readObserverCompleted = true; - } - - if (shouldComplete) - { - var status = finishedStatus.Value.Status; - if (status.StatusCode != StatusCode.OK) - { - FireCompletion(completionDelegate, default(TResponse), new RpcException(status)); - } - else - { - FireCompletion(completionDelegate, default(TResponse), null); - } - } - } - } - protected override void OnAfterReleaseResources() { details.Channel.RemoveCallReference(this); @@ -392,8 +372,6 @@ namespace Grpc.Core.Internal finished = true; finishedStatus = receivedStatus; - halfclosed = true; - ReleaseResourcesIfPossible(); } @@ -403,7 +381,6 @@ namespace Grpc.Core.Internal if (!success || status.StatusCode != StatusCode.OK) { - unaryResponseTcs.SetException(new RpcException(status)); return; } @@ -420,18 +397,23 @@ namespace Grpc.Core.Internal /// private void HandleFinished(bool success, ClientSideStatus receivedStatus) { - AsyncCompletionDelegate origReadCompletionDelegate = null; lock (myLock) { finished = true; finishedStatus = receivedStatus; - origReadCompletionDelegate = readCompletionDelegate; - ReleaseResourcesIfPossible(); } - ProcessLastRead(origReadCompletionDelegate); + var status = receivedStatus.Status; + + if (!success || status.StatusCode != StatusCode.OK) + { + streamingCallFinishedTcs.SetException(new RpcException(status)); + return; + } + + streamingCallFinishedTcs.SetResult(null); } } } \ No newline at end of file diff --git a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs index 7744dbec002..4d203946449 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCallBase.cs @@ -61,19 +61,17 @@ namespace Grpc.Core.Internal protected bool disposed; protected bool started; - protected bool errorOccured; protected bool cancelRequested; protected AsyncCompletionDelegate sendCompletionDelegate; // Completion of a pending send or sendclose if not null. protected AsyncCompletionDelegate readCompletionDelegate; // Completion of a pending send or sendclose if not null. - protected bool readingDone; - protected bool halfcloseRequested; - protected bool halfclosed; + protected bool readingDone; // True if last read (i.e. read with null payload) was already received. + protected bool halfcloseRequested; // True if send close have been initiated. protected bool finished; // True if close has been received from the peer. protected bool initialMetadataSent; - protected long streamingWritesCounter; + protected long streamingWritesCounter; // Number of streaming send operations started so far. public AsyncCallBase(Func serializer, Func deserializer, GrpcEnvironment environment) { @@ -161,16 +159,6 @@ namespace Grpc.Core.Internal } } - // TODO(jtattermusch): find more fitting name for this method. - /// - /// Default behavior just completes the read observer, but more sofisticated behavior might be required - /// by subclasses. - /// - protected virtual void ProcessLastRead(AsyncCompletionDelegate completionDelegate) - { - FireCompletion(completionDelegate, default(TRead), null); - } - /// /// If there are no more pending actions and no new actions can be started, releases /// the underlying native resources. @@ -179,7 +167,7 @@ namespace Grpc.Core.Internal { if (!disposed && call != null) { - bool noMoreSendCompletions = halfclosed || ((cancelRequested || finished) && sendCompletionDelegate == null); + bool noMoreSendCompletions = sendCompletionDelegate == null && (halfcloseRequested || cancelRequested || finished); if (noMoreSendCompletions && readingDone && finished) { ReleaseResources(); @@ -206,7 +194,6 @@ namespace Grpc.Core.Internal protected void CheckSendingAllowed() { Preconditions.CheckState(started); - Preconditions.CheckState(!errorOccured); CheckNotCancelled(); Preconditions.CheckState(!disposed); @@ -218,7 +205,6 @@ namespace Grpc.Core.Internal protected virtual void CheckReadingAllowed() { Preconditions.CheckState(started); - Preconditions.CheckState(!errorOccured); Preconditions.CheckState(!disposed); Preconditions.CheckState(!readingDone, "Stream has already been closed."); @@ -312,7 +298,6 @@ namespace Grpc.Core.Internal AsyncCompletionDelegate origCompletionDelegate = null; lock (myLock) { - halfclosed = true; origCompletionDelegate = sendCompletionDelegate; sendCompletionDelegate = null; @@ -338,15 +323,11 @@ namespace Grpc.Core.Internal lock (myLock) { origCompletionDelegate = readCompletionDelegate; - if (receivedMessage != null) - { - readCompletionDelegate = null; - } - else + readCompletionDelegate = null; + + if (receivedMessage == null) { - // This was the last read. Keeping the readCompletionDelegate - // to be either fired by this handler or by client-side finished - // handler. + // This was the last read. readingDone = true; } @@ -365,7 +346,7 @@ namespace Grpc.Core.Internal } else { - ProcessLastRead(origCompletionDelegate); + FireCompletion(origCompletionDelegate, default(TRead), null); } } } diff --git a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs index 6c445210381..b4a7335c7ce 100644 --- a/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs +++ b/src/csharp/Grpc.Core/Internal/ClientResponseStream.cs @@ -72,7 +72,13 @@ namespace Grpc.Core.Internal call.StartReadMessage(taskSource.CompletionDelegate); var result = await taskSource.Task; this.current = result; - return result != null; + + if (result == null) + { + await call.StreamingCallFinishedTask; + return false; + } + return true; } public void Dispose() From 4c25efa5195a81141ec1fc1dfa9dca42a74d377a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 21 Aug 2015 16:07:57 -0700 Subject: [PATCH 40/79] support for reading response headers on client side --- src/csharp/.gitignore | 1 + .../Grpc.Core.Tests/Internal/AsyncCallTest.cs | 11 ++++ .../Grpc.Core.Tests/ResponseHeadersTest.cs | 58 +++++++++++++++++++ .../Grpc.Core/AsyncDuplexStreamingCall.cs | 16 ++++- .../Grpc.Core/AsyncServerStreamingCall.cs | 16 ++++- src/csharp/Grpc.Core/Calls.cs | 4 +- src/csharp/Grpc.Core/Channel.cs | 1 - src/csharp/Grpc.Core/Internal/AsyncCall.cs | 10 ++++ .../Grpc.Core/Internal/CallSafeHandle.cs | 11 ++++ src/csharp/Grpc.Core/Internal/INativeCall.cs | 4 ++ src/csharp/ext/grpc_csharp_ext.c | 55 +++++++++--------- 11 files changed, 156 insertions(+), 31 deletions(-) diff --git a/src/csharp/.gitignore b/src/csharp/.gitignore index ae489565670..48365e32a59 100644 --- a/src/csharp/.gitignore +++ b/src/csharp/.gitignore @@ -5,4 +5,5 @@ test-results packages Grpc.v12.suo TestResult.xml +/TestResults *.nupkg diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs index 1fa895ba711..5747f3ba04c 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs @@ -137,6 +137,12 @@ namespace Grpc.Core.Internal.Tests set; } + public ReceivedResponseHeadersHandler ReceivedResponseHeadersHandler + { + get; + set; + } + public SendCompletionHandler SendCompletionHandler { get; @@ -206,6 +212,11 @@ namespace Grpc.Core.Internal.Tests ReceivedMessageHandler = callback; } + public void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback) + { + ReceivedResponseHeadersHandler = callback; + } + public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray) { SendCompletionHandler = callback; diff --git a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs index 8ad41af1b81..76e36626b17 100644 --- a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs +++ b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs @@ -32,13 +32,16 @@ #endregion using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using System.Threading.Tasks; + using Grpc.Core; using Grpc.Core.Internal; using Grpc.Core.Utils; + using NUnit.Framework; namespace Grpc.Core.Tests @@ -92,6 +95,61 @@ namespace Grpc.Core.Tests Assert.AreEqual("PASS", await call.ResponseAsync); } + [Test] + public async Task ResponseHeadersAsync_ClientStreamingCall() + { + helper.ClientStreamingHandler = new ClientStreamingServerMethod(async (requestStream, context) => + { + await context.WriteResponseHeadersAsync(headers); + return "PASS"; + }); + + var call = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall()); + await call.RequestStream.CompleteAsync(); + var responseHeaders = await call.ResponseHeadersAsync; + + Assert.AreEqual("ascii-header", responseHeaders[0].Key); + Assert.AreEqual("PASS", await call.ResponseAsync); + } + + [Test] + public async Task ResponseHeadersAsync_ServerStreamingCall() + { + helper.ServerStreamingHandler = new ServerStreamingServerMethod(async (request, responseStream, context) => + { + await context.WriteResponseHeadersAsync(headers); + await responseStream.WriteAsync("PASS"); + }); + + var call = Calls.AsyncServerStreamingCall(helper.CreateServerStreamingCall(), ""); + var responseHeaders = await call.ResponseHeadersAsync; + + Assert.AreEqual("ascii-header", responseHeaders[0].Key); + CollectionAssert.AreEqual(new [] { "PASS" }, await call.ResponseStream.ToListAsync()); + } + + [Test] + public async Task ResponseHeadersAsync_DuplexStreamingCall() + { + helper.DuplexStreamingHandler = new DuplexStreamingServerMethod(async (requestStream, responseStream, context) => + { + await context.WriteResponseHeadersAsync(headers); + while (await requestStream.MoveNext()) + { + await responseStream.WriteAsync(requestStream.Current); + } + }); + + var call = Calls.AsyncDuplexStreamingCall(helper.CreateDuplexStreamingCall()); + var responseHeaders = await call.ResponseHeadersAsync; + + var messages = new[] { "PASS" }; + await call.RequestStream.WriteAllAsync(messages); + + Assert.AreEqual("ascii-header", responseHeaders[0].Key); + CollectionAssert.AreEqual(messages, await call.ResponseStream.ToListAsync()); + } + [Test] public void WriteResponseHeaders_NullNotAllowed() { diff --git a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs index 183c84216a0..ee7ba29695b 100644 --- a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs @@ -32,6 +32,7 @@ #endregion using System; +using System.Threading.Tasks; namespace Grpc.Core { @@ -42,14 +43,16 @@ namespace Grpc.Core { readonly IClientStreamWriter requestStream; readonly IAsyncStreamReader responseStream; + readonly Task responseHeadersAsync; readonly Func getStatusFunc; readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncDuplexStreamingCall(IClientStreamWriter requestStream, IAsyncStreamReader responseStream, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + public AsyncDuplexStreamingCall(IClientStreamWriter requestStream, IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.requestStream = requestStream; this.responseStream = responseStream; + this.responseHeadersAsync = responseHeadersAsync; this.getStatusFunc = getStatusFunc; this.getTrailersFunc = getTrailersFunc; this.disposeAction = disposeAction; @@ -77,6 +80,17 @@ namespace Grpc.Core } } + /// + /// Asynchronous access to response headers. + /// + public Task ResponseHeadersAsync + { + get + { + return this.responseHeadersAsync; + } + } + /// /// Gets the call status if the call has already finished. /// Throws InvalidOperationException otherwise. diff --git a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs index ab2049f2695..2853a79ce68 100644 --- a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs @@ -32,6 +32,7 @@ #endregion using System; +using System.Threading.Tasks; namespace Grpc.Core { @@ -41,13 +42,15 @@ namespace Grpc.Core public sealed class AsyncServerStreamingCall : IDisposable { readonly IAsyncStreamReader responseStream; + readonly Task responseHeadersAsync; readonly Func getStatusFunc; readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncServerStreamingCall(IAsyncStreamReader responseStream, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + public AsyncServerStreamingCall(IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.responseStream = responseStream; + this.responseHeadersAsync = responseHeadersAsync; this.getStatusFunc = getStatusFunc; this.getTrailersFunc = getTrailersFunc; this.disposeAction = disposeAction; @@ -64,6 +67,17 @@ namespace Grpc.Core } } + /// + /// Asynchronous access to response headers. + /// + public Task ResponseHeadersAsync + { + get + { + return this.responseHeadersAsync; + } + } + /// /// Gets the call status if the call has already finished. /// Throws InvalidOperationException otherwise. diff --git a/src/csharp/Grpc.Core/Calls.cs b/src/csharp/Grpc.Core/Calls.cs index ada3616aa4a..e57ac89db37 100644 --- a/src/csharp/Grpc.Core/Calls.cs +++ b/src/csharp/Grpc.Core/Calls.cs @@ -93,7 +93,7 @@ namespace Grpc.Core var asyncCall = new AsyncCall(call); asyncCall.StartServerStreamingCall(req); var responseStream = new ClientResponseStream(asyncCall); - return new AsyncServerStreamingCall(responseStream, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); + return new AsyncServerStreamingCall(responseStream, asyncCall.ResponseHeadersAsync, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); } /// @@ -130,7 +130,7 @@ namespace Grpc.Core asyncCall.StartDuplexStreamingCall(); var requestStream = new ClientRequestStream(asyncCall); var responseStream = new ClientResponseStream(asyncCall); - return new AsyncDuplexStreamingCall(requestStream, responseStream, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); + return new AsyncDuplexStreamingCall(requestStream, responseStream, asyncCall.ResponseHeadersAsync, asyncCall.GetStatus, asyncCall.GetTrailers, asyncCall.Cancel); } } } diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs index 2f8519dfa30..c11b320a647 100644 --- a/src/csharp/Grpc.Core/Channel.cs +++ b/src/csharp/Grpc.Core/Channel.cs @@ -58,7 +58,6 @@ namespace Grpc.Core readonly List options; bool shutdownRequested; - bool disposed; /// /// Creates a channel that connects to a specific host. diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs index d687bb62832..1b00b95bc82 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs @@ -199,6 +199,7 @@ namespace Grpc.Core.Internal { call.StartServerStreaming(HandleFinished, payload, metadataArray, GetWriteFlagsForCall()); } + call.StartReceiveInitialMetadata(HandleReceivedResponseHeaders); } } @@ -219,6 +220,7 @@ namespace Grpc.Core.Internal { call.StartDuplexStreaming(HandleFinished, metadataArray); } + call.StartReceiveInitialMetadata(HandleReceivedResponseHeaders); } } @@ -362,6 +364,14 @@ namespace Grpc.Core.Internal return writeOptions != null ? writeOptions.Flags : default(WriteFlags); } + /// + /// Handles receive status completion for calls with streaming response. + /// + private void HandleReceivedResponseHeaders(bool success, Metadata responseHeaders) + { + responseHeadersTcs.SetResult(responseHeaders); + } + /// /// Handler for unary response completion. /// diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs index ed6747ea93a..0f187529e81 100644 --- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs @@ -86,6 +86,10 @@ namespace Grpc.Core.Internal static extern GRPCCallError grpcsharp_call_recv_message(CallSafeHandle call, BatchContextSafeHandle ctx); + [DllImport("grpc_csharp_ext.dll")] + static extern GRPCCallError grpcsharp_call_recv_initial_metadata(CallSafeHandle call, + BatchContextSafeHandle ctx); + [DllImport("grpc_csharp_ext.dll")] static extern GRPCCallError grpcsharp_call_start_serverside(CallSafeHandle call, BatchContextSafeHandle ctx); @@ -172,6 +176,13 @@ namespace Grpc.Core.Internal grpcsharp_call_recv_message(this, ctx).CheckOk(); } + public void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback) + { + var ctx = BatchContextSafeHandle.Create(); + completionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedInitialMetadata())); + grpcsharp_call_recv_initial_metadata(this, ctx).CheckOk(); + } + public void StartServerSide(ReceivedCloseOnServerHandler callback) { var ctx = BatchContextSafeHandle.Create(); diff --git a/src/csharp/Grpc.Core/Internal/INativeCall.cs b/src/csharp/Grpc.Core/Internal/INativeCall.cs index ef2e230ff8d..ed4257d1f41 100644 --- a/src/csharp/Grpc.Core/Internal/INativeCall.cs +++ b/src/csharp/Grpc.Core/Internal/INativeCall.cs @@ -40,6 +40,8 @@ namespace Grpc.Core.Internal internal delegate void ReceivedMessageHandler(bool success, byte[] receivedMessage); + internal delegate void ReceivedResponseHeadersHandler(bool success, Metadata responseHeaders); + internal delegate void SendCompletionHandler(bool success); internal delegate void ReceivedCloseOnServerHandler(bool success, bool cancelled); @@ -67,6 +69,8 @@ namespace Grpc.Core.Internal void StartReceiveMessage(ReceivedMessageHandler callback); + void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback); + void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray); void StartSendMessage(SendCompletionHandler callback, byte[] payload, Grpc.Core.WriteFlags writeFlags, bool sendEmptyInitialMetadata); diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c index fc9470f93f1..489e219c492 100644 --- a/src/csharp/ext/grpc_csharp_ext.c +++ b/src/csharp/ext/grpc_csharp_ext.c @@ -595,7 +595,7 @@ GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming( grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer, size_t send_buffer_len, grpc_metadata_array *initial_metadata, gpr_uint32 write_flags) { /* TODO: don't use magic number */ - grpc_op ops[5]; + grpc_op ops[4]; ops[0].op = GRPC_OP_SEND_INITIAL_METADATA; grpcsharp_metadata_array_move(&(ctx->send_initial_metadata), initial_metadata); @@ -615,23 +615,18 @@ GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming( ops[2].flags = 0; ops[2].reserved = NULL; - ops[3].op = GRPC_OP_RECV_INITIAL_METADATA; - ops[3].data.recv_initial_metadata = &(ctx->recv_initial_metadata); - ops[3].flags = 0; - ops[3].reserved = NULL; - - ops[4].op = GRPC_OP_RECV_STATUS_ON_CLIENT; - ops[4].data.recv_status_on_client.trailing_metadata = + ops[3].op = GRPC_OP_RECV_STATUS_ON_CLIENT; + ops[3].data.recv_status_on_client.trailing_metadata = &(ctx->recv_status_on_client.trailing_metadata); - ops[4].data.recv_status_on_client.status = + ops[3].data.recv_status_on_client.status = &(ctx->recv_status_on_client.status); /* not using preallocation for status_details */ - ops[4].data.recv_status_on_client.status_details = + ops[3].data.recv_status_on_client.status_details = &(ctx->recv_status_on_client.status_details); - ops[4].data.recv_status_on_client.status_details_capacity = + ops[3].data.recv_status_on_client.status_details_capacity = &(ctx->recv_status_on_client.status_details_capacity); - ops[4].flags = 0; - ops[4].reserved = NULL; + ops[3].flags = 0; + ops[3].reserved = NULL; return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx, NULL); @@ -642,7 +637,7 @@ grpcsharp_call_start_duplex_streaming(grpc_call *call, grpcsharp_batch_context *ctx, grpc_metadata_array *initial_metadata) { /* TODO: don't use magic number */ - grpc_op ops[3]; + grpc_op ops[2]; ops[0].op = GRPC_OP_SEND_INITIAL_METADATA; grpcsharp_metadata_array_move(&(ctx->send_initial_metadata), initial_metadata); @@ -652,28 +647,36 @@ grpcsharp_call_start_duplex_streaming(grpc_call *call, ops[0].flags = 0; ops[0].reserved = NULL; - ops[1].op = GRPC_OP_RECV_INITIAL_METADATA; - ops[1].data.recv_initial_metadata = &(ctx->recv_initial_metadata); - ops[1].flags = 0; - ops[1].reserved = NULL; - - ops[2].op = GRPC_OP_RECV_STATUS_ON_CLIENT; - ops[2].data.recv_status_on_client.trailing_metadata = + ops[1].op = GRPC_OP_RECV_STATUS_ON_CLIENT; + ops[1].data.recv_status_on_client.trailing_metadata = &(ctx->recv_status_on_client.trailing_metadata); - ops[2].data.recv_status_on_client.status = + ops[1].data.recv_status_on_client.status = &(ctx->recv_status_on_client.status); /* not using preallocation for status_details */ - ops[2].data.recv_status_on_client.status_details = + ops[1].data.recv_status_on_client.status_details = &(ctx->recv_status_on_client.status_details); - ops[2].data.recv_status_on_client.status_details_capacity = + ops[1].data.recv_status_on_client.status_details_capacity = &(ctx->recv_status_on_client.status_details_capacity); - ops[2].flags = 0; - ops[2].reserved = NULL; + ops[1].flags = 0; + ops[1].reserved = NULL; return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx, NULL); } +GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_recv_initial_metadata( + grpc_call *call, grpcsharp_batch_context *ctx) { + /* TODO: don't use magic number */ + grpc_op ops[1]; + ops[0].op = GRPC_OP_RECV_INITIAL_METADATA; + ops[0].data.recv_initial_metadata = &(ctx->recv_initial_metadata); + ops[0].flags = 0; + ops[0].reserved = NULL; + + return grpc_call_start_batch(call, ops, sizeof(ops) / sizeof(ops[0]), ctx, + NULL); +} + GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_message(grpc_call *call, grpcsharp_batch_context *ctx, const char *send_buffer, size_t send_buffer_len, From dca145bcfee28b5d5ff161b17719f8e53b7b5fd4 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 21 Aug 2015 16:12:35 -0700 Subject: [PATCH 41/79] fix stylecop issues --- .../Grpc.Core.Tests/Internal/AsyncCallTest.cs | 36 ++----------------- .../Grpc.Core.Tests/ResponseHeadersTest.cs | 2 +- src/csharp/Grpc.Core/GrpcEnvironment.cs | 1 - src/csharp/Grpc.Core/Internal/AsyncCall.cs | 1 - src/csharp/Grpc.Core/Internal/INativeCall.cs | 1 + 5 files changed, 4 insertions(+), 37 deletions(-) diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs index 5747f3ba04c..685c5f7d6cb 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallTest.cs @@ -33,9 +33,10 @@ using System; using System.Runtime.InteropServices; +using System.Threading.Tasks; + using Grpc.Core.Internal; using NUnit.Framework; -using System.Threading.Tasks; namespace Grpc.Core.Internal.Tests { @@ -87,38 +88,8 @@ namespace Grpc.Core.Internal.Tests Assert.AreEqual(StatusCode.Internal, ex.Status.StatusCode); } - - //[Test] - //public void Duplex_ReceiveEarlyClose() - //{ - // asyncCall.StartDuplexStreamingCall(); - - // fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(new Status(StatusCode.DeadlineExceeded, ""), null)); - - // // TODO: start read... - // Assert.IsTrue(fakeCall.IsDisposed); - //} - - //[Test] - //public void Duplex_ReceiveEarlyCloseWithRead() - //{ - // asyncCall.StartDuplexStreamingCall(); - - // fakeCall.ReceivedStatusOnClientHandler(true, new ClientSideStatus(new Status(StatusCode.DeadlineExceeded, ""), null)); - - // var taskSource = new AsyncCompletionTaskSource(); - // asyncCall.StartReadMessage(taskSource.CompletionDelegate); - - // fakeCall.ReceivedMessageHandler(true, new byte[] { 1 } ); - - // // TODO: start read... - // Assert.IsTrue(fakeCall.IsDisposed); - //} - - internal class FakeNativeCall : INativeCall { - public UnaryResponseClientHandler UnaryResponseClientHandler { get; @@ -247,8 +218,5 @@ namespace Grpc.Core.Internal.Tests IsDisposed = true; } } - } - - } \ No newline at end of file diff --git a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs index 76e36626b17..a1648f36712 100644 --- a/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs +++ b/src/csharp/Grpc.Core.Tests/ResponseHeadersTest.cs @@ -125,7 +125,7 @@ namespace Grpc.Core.Tests var responseHeaders = await call.ResponseHeadersAsync; Assert.AreEqual("ascii-header", responseHeaders[0].Key); - CollectionAssert.AreEqual(new [] { "PASS" }, await call.ResponseStream.ToListAsync()); + CollectionAssert.AreEqual(new[] { "PASS" }, await call.ResponseStream.ToListAsync()); } [Test] diff --git a/src/csharp/Grpc.Core/GrpcEnvironment.cs b/src/csharp/Grpc.Core/GrpcEnvironment.cs index b64228558e1..e7c04185c23 100644 --- a/src/csharp/Grpc.Core/GrpcEnvironment.cs +++ b/src/csharp/Grpc.Core/GrpcEnvironment.cs @@ -185,7 +185,6 @@ namespace Grpc.Core return Marshal.PtrToStringAnsi(ptr); } - internal static void GrpcNativeInit() { grpcsharp_init(); diff --git a/src/csharp/Grpc.Core/Internal/AsyncCall.cs b/src/csharp/Grpc.Core/Internal/AsyncCall.cs index 1b00b95bc82..be5d611a538 100644 --- a/src/csharp/Grpc.Core/Internal/AsyncCall.cs +++ b/src/csharp/Grpc.Core/Internal/AsyncCall.cs @@ -344,7 +344,6 @@ namespace Grpc.Core.Internal details.Method, details.Host, Timespec.FromDateTime(details.Options.Deadline.Value)); } - // Make sure that once cancellationToken for this call is cancelled, Cancel() will be called. private void RegisterCancellationCallback() { diff --git a/src/csharp/Grpc.Core/Internal/INativeCall.cs b/src/csharp/Grpc.Core/Internal/INativeCall.cs index ed4257d1f41..cbef5991396 100644 --- a/src/csharp/Grpc.Core/Internal/INativeCall.cs +++ b/src/csharp/Grpc.Core/Internal/INativeCall.cs @@ -31,6 +31,7 @@ #endregion using System; + namespace Grpc.Core.Internal { internal delegate void UnaryResponseClientHandler(bool success, ClientSideStatus receivedStatus, byte[] receivedMessage, Metadata responseHeaders); From 987263a039f0e707ae31d163fbdb94640efbd588 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 21 Aug 2015 16:14:43 -0700 Subject: [PATCH 42/79] Lower-case string --- src/python/grpcio_test/grpc_test/_cython/adapter_low_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_test/grpc_test/_cython/adapter_low_test.py b/src/python/grpcio_test/grpc_test/_cython/adapter_low_test.py index 9bab930e56e..f1bec238cf5 100644 --- a/src/python/grpcio_test/grpc_test/_cython/adapter_low_test.py +++ b/src/python/grpcio_test/grpc_test/_cython/adapter_low_test.py @@ -76,7 +76,7 @@ class InsecureServerInsecureClient(unittest.TestCase): CLIENT_METADATA_BIN_VALUE = b'\0'*1000 SERVER_INITIAL_METADATA_KEY = 'init_me_me_me' SERVER_INITIAL_METADATA_VALUE = 'whodawha?' - SERVER_TRAILING_METADATA_KEY = 'California_is_in_a_drought' + SERVER_TRAILING_METADATA_KEY = 'california_is_in_a_drought' SERVER_TRAILING_METADATA_VALUE = 'zomg it is' SERVER_STATUS_CODE = _types.StatusCode.OK SERVER_STATUS_DETAILS = 'our work is never over' From 578c7c5fe9d62095ce7e79da84160143d3b8ece0 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Fri, 21 Aug 2015 16:26:58 -0700 Subject: [PATCH 43/79] revert AssemblyInfo.cs --- src/csharp/Grpc.Core/Properties/AssemblyInfo.cs | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs b/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs index caca080b7f2..29db85d7aae 100644 --- a/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs +++ b/src/csharp/Grpc.Core/Properties/AssemblyInfo.cs @@ -16,13 +16,6 @@ using System.Runtime.CompilerServices; "0442bb8e12768722de0b0cb1b15e955b32a11352740ee59f2c94c48edc8e177d1052536b8ac651bce11ce5da3a" + "27fc95aff3dc604a6971417453f9483c7b5e836756d5b271bf8f2403fe186e31956148c03d804487cf642f8cc0" + "71394ee9672dfe5b55ea0f95dfd5a7f77d22c962ccf51320d3")] - -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2,PublicKey=" + - "0024000004800000940000000602000000240000525341310004000001000100c547cac37abd99c8db225ef2f6" + - "c8a3602f3b3606cc9891605d02baa56104f4cfc0734aa39b93bf7852f7d9266654753cc297e7d2edfe0bac1cdc" + - "f9f717241550e0a7b191195b7667bb4f64bcb8e2121380fd1d9d46ad2d92d2d15605093924cceaf74c4861eff6" + - "2abf69b9291ed0a340e113be11e6a7d3113e92484cf7045cc7")] #else [assembly: InternalsVisibleTo("Grpc.Core.Tests")] -[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")] #endif \ No newline at end of file From 11a28c7f1a31343f85f72f35bd42b34877cc9339 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 07:54:34 -0700 Subject: [PATCH 44/79] Update projects --- Makefile | 6 +++--- build.json | 3 +-- tools/run_tests/jobset.py | 1 + tools/run_tests/sources_and_headers.json | 5 +---- vsprojects/Grpc.mak | 4 ++-- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index f7ace3186a8..15e05a5d87a 100644 --- a/Makefile +++ b/Makefile @@ -7135,14 +7135,14 @@ $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: openssl_dep_error else -$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a +$(BINDIR)/$(CONFIG)/gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters + $(Q) $(LD) $(LDFLAGS) $(GEN_LEGAL_METADATA_CHARACTERS_OBJS) $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters endif -$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_legal_metadata_characters.o: $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a +$(OBJDIR)/$(CONFIG)/tools/codegen/core/gen_legal_metadata_characters.o: deps_gen_legal_metadata_characters: $(GEN_LEGAL_METADATA_CHARACTERS_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) diff --git a/build.json b/build.json index c6a670970ba..b784fe3303a 100644 --- a/build.json +++ b/build.json @@ -1150,8 +1150,7 @@ "src": [ "tools/codegen/core/gen_legal_metadata_characters.c" ], - "deps": [ - ] + "deps": [] }, { "name": "gpr_cmdline_test", diff --git a/tools/run_tests/jobset.py b/tools/run_tests/jobset.py index 538deac0e3e..d0e3fc4eb37 100755 --- a/tools/run_tests/jobset.py +++ b/tools/run_tests/jobset.py @@ -174,6 +174,7 @@ class Job(object): for k, v in add_env.iteritems(): env[k] = v self._start = time.time() + print spec.cmdline self._process = subprocess.Popen(args=spec.cmdline, stderr=subprocess.STDOUT, stdout=self._tempfile, diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 142c84901da..aa22f0f1594 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -238,10 +238,7 @@ ] }, { - "deps": [ - "gpr", - "grpc" - ], + "deps": [], "headers": [], "language": "c", "name": "gen_legal_metadata_characters", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 3d853d9c760..9eede74b088 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -183,10 +183,10 @@ gen_hpack_tables: gen_hpack_tables.exe echo Running gen_hpack_tables $(OUT_DIR)\gen_hpack_tables.exe -gen_legal_metadata_characters.exe: build_gpr build_grpc $(OUT_DIR) +gen_legal_metadata_characters.exe: $(OUT_DIR) echo Building gen_legal_metadata_characters $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\tools\codegen\core\gen_legal_metadata_characters.c - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_legal_metadata_characters.exe" Debug\gpr.lib Debug\grpc.lib $(LIBS) $(OUT_DIR)\gen_legal_metadata_characters.obj + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\gen_legal_metadata_characters.exe" $(LIBS) $(OUT_DIR)\gen_legal_metadata_characters.obj gen_legal_metadata_characters: gen_legal_metadata_characters.exe echo Running gen_legal_metadata_characters $(OUT_DIR)\gen_legal_metadata_characters.exe From 79c9b358d980cb4ff389e89beec1173f12d1829d Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Mon, 24 Aug 2015 16:59:09 +0000 Subject: [PATCH 45/79] The face interface of RPC Framework. This is the public API of the old face package of RPC Framework extracted into a first-class interface and adapted to metadata, status, and flow control. --- .../framework/interfaces/face/__init__.py | 30 + .../grpc/framework/interfaces/face/face.py | 933 ++++++++++++++++++ .../framework/interfaces/face/utilities.py | 178 ++++ 3 files changed, 1141 insertions(+) create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/__init__.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/face.py create mode 100644 src/python/grpcio/grpc/framework/interfaces/face/utilities.py diff --git a/src/python/grpcio/grpc/framework/interfaces/face/__init__.py b/src/python/grpcio/grpc/framework/interfaces/face/__init__.py new file mode 100644 index 00000000000..70865191060 --- /dev/null +++ b/src/python/grpcio/grpc/framework/interfaces/face/__init__.py @@ -0,0 +1,30 @@ +# Copyright 2015, 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. + + diff --git a/src/python/grpcio/grpc/framework/interfaces/face/face.py b/src/python/grpcio/grpc/framework/interfaces/face/face.py new file mode 100644 index 00000000000..948e7505b6d --- /dev/null +++ b/src/python/grpcio/grpc/framework/interfaces/face/face.py @@ -0,0 +1,933 @@ +# Copyright 2015, 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. + +"""Interfaces defining the Face layer of RPC Framework.""" + +import abc +import collections +import enum + +# cardinality, style, abandonment, future, and stream are +# referenced from specification in this module. +from grpc.framework.common import cardinality # pylint: disable=unused-import +from grpc.framework.common import style # pylint: disable=unused-import +from grpc.framework.foundation import abandonment # pylint: disable=unused-import +from grpc.framework.foundation import future # pylint: disable=unused-import +from grpc.framework.foundation import stream # pylint: disable=unused-import + + +class NoSuchMethodError(Exception): + """Raised by customer code to indicate an unrecognized method. + + Attributes: + group: The group of the unrecognized method. + name: The name of the unrecognized method. + """ + + def __init__(self, group, method): + """Constructor. + + Args: + group: The group identifier of the unrecognized RPC name. + method: The method identifier of the unrecognized RPC name. + """ + super(NoSuchMethodError, self).__init__() + self.group = group + self.method = method + + def __repr__(self): + return 'face.NoSuchMethodError(%s, %s)' % (self.group, self.method,) + + +class Abortion( + collections.namedtuple( + 'Abortion', + ('kind', 'initial_metadata', 'terminal_metadata', 'code', 'details',))): + """A value describing RPC abortion. + + Attributes: + kind: A Kind value identifying how the RPC failed. + initial_metadata: The initial metadata from the other side of the RPC or + None if no initial metadata value was received. + terminal_metadata: The terminal metadata from the other side of the RPC or + None if no terminal metadata value was received. + code: The code value from the other side of the RPC or None if no code value + was received. + details: The details value from the other side of the RPC or None if no + details value was received. + """ + + @enum.unique + class Kind(enum.Enum): + """Types of RPC abortion.""" + + CANCELLED = 'cancelled' + EXPIRED = 'expired' + LOCAL_SHUTDOWN = 'local shutdown' + REMOTE_SHUTDOWN = 'remote shutdown' + NETWORK_FAILURE = 'network failure' + LOCAL_FAILURE = 'local failure' + REMOTE_FAILURE = 'remote failure' + + +class AbortionError(Exception): + """Common super type for exceptions indicating RPC abortion. + + initial_metadata: The initial metadata from the other side of the RPC or + None if no initial metadata value was received. + terminal_metadata: The terminal metadata from the other side of the RPC or + None if no terminal metadata value was received. + code: The code value from the other side of the RPC or None if no code value + was received. + details: The details value from the other side of the RPC or None if no + details value was received. + """ + __metaclass__ = abc.ABCMeta + + def __init__(self, initial_metadata, terminal_metadata, code, details): + super(AbortionError, self).__init__() + self.initial_metadata = initial_metadata + self.terminal_metadata = terminal_metadata + self.code = code + self.details = details + + +class CancellationError(AbortionError): + """Indicates that an RPC has been cancelled.""" + + +class ExpirationError(AbortionError): + """Indicates that an RPC has expired ("timed out").""" + + +class LocalShutdownError(AbortionError): + """Indicates that an RPC has terminated due to local shutdown of RPCs.""" + + +class RemoteShutdownError(AbortionError): + """Indicates that an RPC has terminated due to remote shutdown of RPCs.""" + + +class NetworkError(AbortionError): + """Indicates that some error occurred on the network.""" + + +class LocalError(AbortionError): + """Indicates that an RPC has terminated due to a local defect.""" + + +class RemoteError(AbortionError): + """Indicates that an RPC has terminated due to a remote defect.""" + + +class RpcContext(object): + """Provides RPC-related information and action.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def is_active(self): + """Describes whether the RPC is active or has terminated.""" + raise NotImplementedError() + + @abc.abstractmethod + def time_remaining(self): + """Describes the length of allowed time remaining for the RPC. + + Returns: + A nonnegative float indicating the length of allowed time in seconds + remaining for the RPC to complete before it is considered to have timed + out. + """ + raise NotImplementedError() + + @abc.abstractmethod + def add_abortion_callback(self, abortion_callback): + """Registers a callback to be called if the RPC is aborted. + + Args: + abortion_callback: A callable to be called and passed an Abortion value + in the event of RPC abortion. + """ + raise NotImplementedError() + + @abc.abstractmethod + def cancel(self): + """Cancels the RPC. + + Idempotent and has no effect if the RPC has already terminated. + """ + raise NotImplementedError() + + +class Call(RpcContext): + """Invocation-side utility object for an RPC.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def initial_metadata(self): + """Accesses the initial metadata from the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The initial metadata object emitted by the service-side of the RPC, or + None if there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminal_metadata(self): + """Accesses the terminal metadata from the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The terminal metadata object emitted by the service-side of the RPC, or + None if there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def code(self): + """Accesses the code emitted by the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The code object emitted by the service-side of the RPC, or None if there + was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def details(self): + """Accesses the details value emitted by the service-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the service-side of the RPC. + + Returns: + The details value emitted by the service-side of the RPC, or None if there + was no such value. + """ + raise NotImplementedError() + + +class ServicerContext(RpcContext): + """A context object passed to method implementations.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def invocation_metadata(self): + """Accesses the metadata from the invocation-side of the RPC. + + This method blocks until the value is available or is known not to have been + emitted from the invocation-side of the RPC. + + Returns: + The metadata object emitted by the invocation-side of the RPC, or None if + there was no such value. + """ + raise NotImplementedError() + + @abc.abstractmethod + def initial_metadata(self, initial_metadata): + """Accepts the service-side initial metadata value of the RPC. + + This method need not be called by method implementations if they have no + service-side initial metadata to transmit. + + Args: + initial_metadata: The service-side initial metadata value of the RPC to + be transmitted to the invocation side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def terminal_metadata(self, terminal_metadata): + """Accepts the service-side terminal metadata value of the RPC. + + This method need not be called by method implementations if they have no + service-side terminal metadata to transmit. + + Args: + terminal_metadata: The service-side terminal metadata value of the RPC to + be transmitted to the invocation side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def code(self, code): + """Accepts the service-side code of the RPC. + + This method need not be called by method implementations if they have no + code to transmit. + + Args: + code: The code of the RPC to be transmitted to the invocation side of the + RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def details(self, details): + """Accepts the service-side details of the RPC. + + This method need not be called by method implementations if they have no + service-side details to transmit. + + Args: + details: The service-side details value of the RPC to be transmitted to + the invocation side of the RPC. + """ + raise NotImplementedError() + + +class ResponseReceiver(object): + """Invocation-side object used to accept the output of an RPC.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def initial_metadata(self, initial_metadata): + """Receives the initial metadata from the service-side of the RPC. + + Args: + initial_metadata: The initial metadata object emitted from the + service-side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def response(self, response): + """Receives a response from the service-side of the RPC. + + Args: + response: A response object emitted from the service-side of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def complete(self, terminal_metadata, code, details): + """Receives the completion values emitted from the service-side of the RPC. + + Args: + terminal_metadata: The terminal metadata object emitted from the + service-side of the RPC. + code: The code object emitted from the service-side of the RPC. + details: The details object emitted from the service-side of the RPC. + """ + raise NotImplementedError() + + +class UnaryUnaryMultiCallable(object): + """Affords invoking a unary-unary RPC in any call style.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def __call__( + self, request, timeout, metadata=None, with_call=False): + """Synchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the reponse. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future(self, request, timeout, metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, request, receiver, abortion_callback, timeout, + metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + +class UnaryStreamMultiCallable(object): + """Affords invoking a unary-stream RPC in any call style.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def __call__(self, request, timeout, metadata=None): + """Invokes the underlying RPC. + + Args: + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, request, receiver, abortion_callback, timeout, + metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + A Call object for the RPC. + """ + raise NotImplementedError() + + +class StreamUnaryMultiCallable(object): + """Affords invoking a stream-unary RPC in any call style.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def __call__( + self, request_iterator, timeout, metadata=None, + with_call=False): + """Synchronously invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the reponse. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future(self, request_iterator, timeout, metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, receiver, abortion_callback, timeout, metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + A single object that is both a Call object for the RPC and a + stream.Consumer to which the request values of the RPC should be passed. + """ + raise NotImplementedError() + + +class StreamStreamMultiCallable(object): + """Affords invoking a stream-stream RPC in any call style.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def __call__(self, request_iterator, timeout, metadata=None): + """Invokes the underlying RPC. + + Args: + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event( + self, receiver, abortion_callback, timeout, metadata=None): + """Asynchronously invokes the underlying RPC. + + Args: + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of + the RPC. + + Returns: + A single object that is both a Call object for the RPC and a + stream.Consumer to which the request values of the RPC should be passed. + """ + raise NotImplementedError() + + +class MethodImplementation(object): + """A sum type that describes a method implementation. + + Attributes: + cardinality: A cardinality.Cardinality value. + style: A style.Service value. + unary_unary_inline: The implementation of the method as a callable value + that takes a request value and a ServicerContext object and returns a + response value. Only non-None if cardinality is + cardinality.Cardinality.UNARY_UNARY and style is style.Service.INLINE. + unary_stream_inline: The implementation of the method as a callable value + that takes a request value and a ServicerContext object and returns an + iterator of response values. Only non-None if cardinality is + cardinality.Cardinality.UNARY_STREAM and style is style.Service.INLINE. + stream_unary_inline: The implementation of the method as a callable value + that takes an iterator of request values and a ServicerContext object and + returns a response value. Only non-None if cardinality is + cardinality.Cardinality.STREAM_UNARY and style is style.Service.INLINE. + stream_stream_inline: The implementation of the method as a callable value + that takes an iterator of request values and a ServicerContext object and + returns an iterator of response values. Only non-None if cardinality is + cardinality.Cardinality.STREAM_STREAM and style is style.Service.INLINE. + unary_unary_event: The implementation of the method as a callable value that + takes a request value, a response callback to which to pass the response + value of the RPC, and a ServicerContext. Only non-None if cardinality is + cardinality.Cardinality.UNARY_UNARY and style is style.Service.EVENT. + unary_stream_event: The implementation of the method as a callable value + that takes a request value, a stream.Consumer to which to pass the + response values of the RPC, and a ServicerContext. Only non-None if + cardinality is cardinality.Cardinality.UNARY_STREAM and style is + style.Service.EVENT. + stream_unary_event: The implementation of the method as a callable value + that takes a response callback to which to pass the response value of the + RPC and a ServicerContext and returns a stream.Consumer to which the + request values of the RPC should be passed. Only non-None if cardinality + is cardinality.Cardinality.STREAM_UNARY and style is style.Service.EVENT. + stream_stream_event: The implementation of the method as a callable value + that takes a stream.Consumer to which to pass the response values of the + RPC and a ServicerContext and returns a stream.Consumer to which the + request values of the RPC should be passed. Only non-None if cardinality + is cardinality.Cardinality.STREAM_STREAM and style is + style.Service.EVENT. + """ + __metaclass__ = abc.ABCMeta + + +class MultiMethodImplementation(object): + """A general type able to service many methods.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def service(self, group, method, response_consumer, context): + """Services an RPC. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + response_consumer: A stream.Consumer to be called to accept the response + values of the RPC. + context: a ServicerContext object. + + Returns: + A stream.Consumer with which to accept the request values of the RPC. The + consumer returned from this method may or may not be invoked to + completion: in the case of RPC abortion, RPC Framework will simply stop + passing values to this object. Implementations must not assume that this + object will be called to completion of the request stream or even called + at all. + + Raises: + abandonment.Abandoned: May or may not be raised when the RPC has been + aborted. + NoSuchMethodError: If this MultiMethod does not recognize the given group + and name for the RPC and is not able to service the RPC. + """ + raise NotImplementedError() + + +class GenericStub(object): + """Affords RPC invocation via generic methods.""" + __metaclass__ = abc.ABCMeta + + @abc.abstractmethod + def blocking_unary_unary( + self, group, method, request, timeout, metadata=None, + with_call=False): + """Invokes a unary-request-unary-response method. + + This method blocks until either returning the response value of the RPC + (in the event of RPC completion) or raising an exception (in the event of + RPC abortion). + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the reponse. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future_unary_unary( + self, group, method, request, timeout, metadata=None): + """Invokes a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def inline_unary_stream( + self, group, method, request, timeout, metadata=None): + """Invokes a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def blocking_stream_unary( + self, group, method, request_iterator, timeout, metadata=None, + with_call=False): + """Invokes a stream-request-unary-response method. + + This method blocks until either returning the response value of the RPC + (in the event of RPC completion) or raising an exception (in the event of + RPC abortion). + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + with_call: Whether or not to include return a Call for the RPC in addition + to the reponse. + + Returns: + The response value for the RPC, and a Call for the RPC if with_call was + set to True at invocation. + + Raises: + AbortionError: Indicating that the RPC was aborted. + """ + raise NotImplementedError() + + @abc.abstractmethod + def future_stream_unary( + self, group, method, request_iterator, timeout, metadata=None): + """Invokes a stream-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + An object that is both a Call for the RPC and a future.Future. In the + event of RPC completion, the return Future's result value will be the + response value of the RPC. In the event of RPC abortion, the returned + Future's exception value will be an AbortionError. + """ + raise NotImplementedError() + + @abc.abstractmethod + def inline_stream_stream( + self, group, method, request_iterator, timeout, metadata=None): + """Invokes a stream-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request_iterator: An iterator that yields request values for the RPC. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + An object that is both a Call for the RPC and an iterator of response + values. Drawing response values from the returned iterator may raise + AbortionError indicating abortion of the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_unary_unary( + self, group, method, request, receiver, abortion_callback, timeout, + metadata=None): + """Event-driven invocation of a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_unary_stream( + self, group, method, request, receiver, abortion_callback, timeout, + metadata=None): + """Event-driven invocation of a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + request: The request value for the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + A Call for the RPC. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_stream_unary( + self, group, method, receiver, abortion_callback, timeout, + metadata=None): + """Event-driven invocation of a unary-request-unary-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + A pair of a Call object for the RPC and a stream.Consumer to which the + request values of the RPC should be passed. + """ + raise NotImplementedError() + + @abc.abstractmethod + def event_stream_stream( + self, group, method, receiver, abortion_callback, timeout, + metadata=None): + """Event-driven invocation of a unary-request-stream-response method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + receiver: A ResponseReceiver to be passed the response data of the RPC. + abortion_callback: A callback to be called and passed an Abortion value + in the event of RPC abortion. + timeout: A duration of time in seconds to allow for the RPC. + metadata: A metadata value to be passed to the service-side of the RPC. + + Returns: + A pair of a Call object for the RPC and a stream.Consumer to which the + request values of the RPC should be passed. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_unary(self, group, method): + """Creates a UnaryUnaryMultiCallable for a unary-unary method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A UnaryUnaryMultiCallable value for the named unary-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def unary_stream(self, group, method): + """Creates a UnaryStreamMultiCallable for a unary-stream method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A UnaryStreamMultiCallable value for the name unary-stream method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_unary(self, group, method): + """Creates a StreamUnaryMultiCallable for a stream-unary method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A StreamUnaryMultiCallable value for the named stream-unary method. + """ + raise NotImplementedError() + + @abc.abstractmethod + def stream_stream(self, group, method): + """Creates a StreamStreamMultiCallable for a stream-stream method. + + Args: + group: The group identifier of the RPC. + method: The method identifier of the RPC. + + Returns: + A StreamStreamMultiCallable value for the named stream-stream method. + """ + raise NotImplementedError() + + +class DynamicStub(object): + """Affords RPC invocation via attributes corresponding to afforded methods. + + Instances of this type may be scoped to a single group so that attribute + access is unambiguous. + + Instances of this type respond to attribute access as follows: if the + requested attribute is the name of a unary-unary method, the value of the + attribute will be a UnaryUnaryMultiCallable with which to invoke an RPC; if + the requested attribute is the name of a unary-stream method, the value of the + attribute will be a UnaryStreamMultiCallable with which to invoke an RPC; if + the requested attribute is the name of a stream-unary method, the value of the + attribute will be a StreamUnaryMultiCallable with which to invoke an RPC; and + if the requested attribute is the name of a stream-stream method, the value of + the attribute will be a StreamStreamMultiCallable with which to invoke an RPC. + """ + __metaclass__ = abc.ABCMeta diff --git a/src/python/grpcio/grpc/framework/interfaces/face/utilities.py b/src/python/grpcio/grpc/framework/interfaces/face/utilities.py new file mode 100644 index 00000000000..db2ec6ed87f --- /dev/null +++ b/src/python/grpcio/grpc/framework/interfaces/face/utilities.py @@ -0,0 +1,178 @@ +# Copyright 2015, 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. + +"""Utilities for RPC Framework's Face interface.""" + +import collections + +# stream is referenced from specification in this module. +from grpc.framework.common import cardinality +from grpc.framework.common import style +from grpc.framework.foundation import stream # pylint: disable=unused-import +from grpc.framework.interfaces.face import face + + +class _MethodImplementation( + face.MethodImplementation, + collections.namedtuple( + '_MethodImplementation', + ['cardinality', 'style', 'unary_unary_inline', 'unary_stream_inline', + 'stream_unary_inline', 'stream_stream_inline', 'unary_unary_event', + 'unary_stream_event', 'stream_unary_event', 'stream_stream_event',])): + pass + + +def unary_unary_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-unary RPC method as a callable value + that takes a request value and an face.ServicerContext object and + returns a response value. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_UNARY, style.Service.INLINE, behavior, + None, None, None, None, None, None, None) + + +def unary_stream_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-stream RPC method as a callable + value that takes a request value and an face.ServicerContext object and + returns an iterator of response values. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_STREAM, style.Service.INLINE, None, + behavior, None, None, None, None, None, None) + + +def stream_unary_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-unary RPC method as a callable + value that takes an iterator of request values and an + face.ServicerContext object and returns a response value. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_UNARY, style.Service.INLINE, None, None, + behavior, None, None, None, None, None) + + +def stream_stream_inline(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-stream RPC method as a callable + value that takes an iterator of request values and an + face.ServicerContext object and returns an iterator of response values. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_STREAM, style.Service.INLINE, None, None, + None, behavior, None, None, None, None) + + +def unary_unary_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-unary RPC method as a callable + value that takes a request value, a response callback to which to pass + the response value of the RPC, and an face.ServicerContext. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_UNARY, style.Service.EVENT, None, None, + None, None, behavior, None, None, None) + + +def unary_stream_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a unary-stream RPC method as a callable + value that takes a request value, a stream.Consumer to which to pass the + the response values of the RPC, and an face.ServicerContext. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.UNARY_STREAM, style.Service.EVENT, None, None, + None, None, None, behavior, None, None) + + +def stream_unary_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-unary RPC method as a callable + value that takes a response callback to which to pass the response value + of the RPC and an face.ServicerContext and returns a stream.Consumer to + which the request values of the RPC should be passed. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_UNARY, style.Service.EVENT, None, None, + None, None, None, None, behavior, None) + + +def stream_stream_event(behavior): + """Creates an face.MethodImplementation for the given behavior. + + Args: + behavior: The implementation of a stream-stream RPC method as a callable + value that takes a stream.Consumer to which to pass the response values + of the RPC and an face.ServicerContext and returns a stream.Consumer to + which the request values of the RPC should be passed. + + Returns: + An face.MethodImplementation derived from the given behavior. + """ + return _MethodImplementation( + cardinality.Cardinality.STREAM_STREAM, style.Service.EVENT, None, None, + None, None, None, None, None, behavior) From 46f2d347629480b2dd69fda4546dc831de69518c Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 24 Aug 2015 10:43:51 -0700 Subject: [PATCH 46/79] Move the default roots check before allocation --- src/core/security/security_connector.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/core/security/security_connector.c b/src/core/security/security_connector.c index a354536dcd3..ba9ac68c5f1 100644 --- a/src/core/security/security_connector.c +++ b/src/core/security/security_connector.c @@ -575,6 +575,16 @@ grpc_security_status grpc_ssl_channel_security_connector_create( if (!check_request_metadata_creds(request_metadata_creds)) { goto error; } + if (config->pem_root_certs == NULL) { + pem_root_certs_size = grpc_get_default_ssl_roots(&pem_root_certs); + if (pem_root_certs == NULL || pem_root_certs_size == 0) { + gpr_log(GPR_ERROR, "Could not get default pem root certs."); + goto error; + } + } else { + pem_root_certs = config->pem_root_certs; + pem_root_certs_size = config->pem_root_certs_size; + } c = gpr_malloc(sizeof(grpc_ssl_channel_security_connector)); memset(c, 0, sizeof(grpc_ssl_channel_security_connector)); @@ -590,16 +600,6 @@ grpc_security_status grpc_ssl_channel_security_connector_create( if (overridden_target_name != NULL) { c->overridden_target_name = gpr_strdup(overridden_target_name); } - if (config->pem_root_certs == NULL) { - pem_root_certs_size = grpc_get_default_ssl_roots(&pem_root_certs); - if (pem_root_certs == NULL || pem_root_certs_size == 0) { - gpr_log(GPR_ERROR, "Could not get default pem root certs."); - goto error; - } - } else { - pem_root_certs = config->pem_root_certs; - pem_root_certs_size = config->pem_root_certs_size; - } result = tsi_create_ssl_client_handshaker_factory( config->pem_private_key, config->pem_private_key_size, config->pem_cert_chain, config->pem_cert_chain_size, pem_root_certs, From e8a7e30a751a9ba0aca79e4fa3b0fcd51d98c4e0 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Mon, 24 Aug 2015 10:52:33 -0700 Subject: [PATCH 47/79] Eliminate public thread-pool interface --- BUILD | 12 +-- Makefile | 94 +------------------ build.json | 38 +------- include/grpc++/server_builder.h | 4 - src/cpp/server/create_default_thread_pool.cc | 2 +- src/cpp/server/dynamic_thread_pool.cc | 2 +- .../cpp/server}/dynamic_thread_pool.h | 9 +- src/cpp/server/fixed_size_thread_pool.cc | 2 +- .../cpp/server}/fixed_size_thread_pool.h | 9 +- src/cpp/server/server.cc | 2 +- src/cpp/server/server_builder.cc | 8 +- .../cpp/server}/thread_pool_interface.h | 6 +- test/cpp/end2end/end2end_test.cc | 6 +- test/cpp/end2end/mock_test.cc | 5 +- test/cpp/end2end/thread_stress_test.cc | 5 +- test/cpp/qps/server_sync.cc | 12 +-- test/cpp/server/dynamic_thread_pool_test.cc | 77 --------------- .../cpp/server/fixed_size_thread_pool_test.cc | 77 --------------- test/cpp/util/cli_call_test.cc | 5 +- tools/doxygen/Doxyfile.c++ | 3 - tools/doxygen/Doxyfile.c++.internal | 6 +- tools/run_tests/sources_and_headers.json | 58 +++--------- tools/run_tests/tests.json | 36 ------- vsprojects/Grpc.mak | 18 +--- vsprojects/grpc++/grpc++.vcxproj | 6 +- vsprojects/grpc++/grpc++.vcxproj.filters | 18 ++-- .../grpc++_unsecure/grpc++_unsecure.vcxproj | 6 +- .../grpc++_unsecure.vcxproj.filters | 18 ++-- 28 files changed, 77 insertions(+), 467 deletions(-) rename {include/grpc++ => src/cpp/server}/dynamic_thread_pool.h (92%) rename {include/grpc++ => src/cpp/server}/fixed_size_thread_pool.h (91%) rename {include/grpc++ => src/cpp/server}/thread_pool_interface.h (92%) delete mode 100644 test/cpp/server/dynamic_thread_pool_test.cc delete mode 100644 test/cpp/server/fixed_size_thread_pool_test.cc diff --git a/BUILD b/BUILD index 7eb59797d43..54452463bae 100644 --- a/BUILD +++ b/BUILD @@ -677,6 +677,9 @@ cc_library( "src/cpp/server/secure_server_credentials.h", "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/fixed_size_thread_pool.h", + "src/cpp/server/thread_pool_interface.h", "src/cpp/client/secure_channel_arguments.cc", "src/cpp/client/secure_credentials.cc", "src/cpp/common/auth_property_iterator.cc", @@ -722,8 +725,6 @@ cc_library( "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -749,7 +750,6 @@ cc_library( "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", ], includes = [ @@ -769,6 +769,9 @@ cc_library( srcs = [ "src/cpp/client/channel.h", "src/cpp/common/create_auth_context.h", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/fixed_size_thread_pool.h", + "src/cpp/server/thread_pool_interface.h", "src/cpp/common/insecure_create_auth_context.cc", "src/cpp/client/channel.cc", "src/cpp/client/channel_arguments.cc", @@ -809,8 +812,6 @@ cc_library( "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -836,7 +837,6 @@ cc_library( "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", ], includes = [ diff --git a/Makefile b/Makefile index 31628b44122..19c0fd5d951 100644 --- a/Makefile +++ b/Makefile @@ -862,9 +862,7 @@ credentials_test: $(BINDIR)/$(CONFIG)/credentials_test cxx_byte_buffer_test: $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test cxx_slice_test: $(BINDIR)/$(CONFIG)/cxx_slice_test cxx_time_test: $(BINDIR)/$(CONFIG)/cxx_time_test -dynamic_thread_pool_test: $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test end2end_test: $(BINDIR)/$(CONFIG)/end2end_test -fixed_size_thread_pool_test: $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test generic_end2end_test: $(BINDIR)/$(CONFIG)/generic_end2end_test grpc_cli: $(BINDIR)/$(CONFIG)/grpc_cli grpc_cpp_plugin: $(BINDIR)/$(CONFIG)/grpc_cpp_plugin @@ -1733,7 +1731,7 @@ buildtests: buildtests_c buildtests_cxx buildtests_zookeeper buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test -buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test +buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test ifeq ($(HAS_ZOOKEEPER),true) buildtests_zookeeper: privatelibs_zookeeper $(BINDIR)/$(CONFIG)/shutdown_test $(BINDIR)/$(CONFIG)/zookeeper_test @@ -3329,12 +3327,8 @@ test_cxx: test_zookeeper buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/cxx_slice_test || ( echo test cxx_slice_test failed ; exit 1 ) $(E) "[RUN] Testing cxx_time_test" $(Q) $(BINDIR)/$(CONFIG)/cxx_time_test || ( echo test cxx_time_test failed ; exit 1 ) - $(E) "[RUN] Testing dynamic_thread_pool_test" - $(Q) $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test || ( echo test dynamic_thread_pool_test failed ; exit 1 ) $(E) "[RUN] Testing end2end_test" $(Q) $(BINDIR)/$(CONFIG)/end2end_test || ( echo test end2end_test failed ; exit 1 ) - $(E) "[RUN] Testing fixed_size_thread_pool_test" - $(Q) $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test || ( echo test fixed_size_thread_pool_test failed ; exit 1 ) $(E) "[RUN] Testing generic_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/generic_end2end_test || ( echo test generic_end2end_test failed ; exit 1 ) $(E) "[RUN] Testing interop_test" @@ -4641,8 +4635,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ - include/grpc++/dynamic_thread_pool.h \ - include/grpc++/fixed_size_thread_pool.h \ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ @@ -4668,7 +4660,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/status_code_enum.h \ include/grpc++/stream.h \ include/grpc++/stub_options.h \ - include/grpc++/thread_pool_interface.h \ include/grpc++/time.h \ LIBGRPC++_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_SRC)))) @@ -4884,8 +4875,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ - include/grpc++/dynamic_thread_pool.h \ - include/grpc++/fixed_size_thread_pool.h \ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ @@ -4911,7 +4900,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc++/status_code_enum.h \ include/grpc++/stream.h \ include/grpc++/stub_options.h \ - include/grpc++/thread_pool_interface.h \ include/grpc++/time.h \ LIBGRPC++_UNSECURE_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBGRPC++_UNSECURE_SRC)))) @@ -9255,46 +9243,6 @@ endif endif -DYNAMIC_THREAD_POOL_TEST_SRC = \ - test/cpp/server/dynamic_thread_pool_test.cc \ - -DYNAMIC_THREAD_POOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(DYNAMIC_THREAD_POOL_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/dynamic_thread_pool_test: openssl_dep_error - -else - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. - -$(BINDIR)/$(CONFIG)/dynamic_thread_pool_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/dynamic_thread_pool_test: $(PROTOBUF_DEP) $(DYNAMIC_THREAD_POOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(DYNAMIC_THREAD_POOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/cpp/server/dynamic_thread_pool_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -deps_dynamic_thread_pool_test: $(DYNAMIC_THREAD_POOL_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(DYNAMIC_THREAD_POOL_TEST_OBJS:.o=.dep) -endif -endif - - END2END_TEST_SRC = \ test/cpp/end2end/end2end_test.cc \ @@ -9335,46 +9283,6 @@ endif endif -FIXED_SIZE_THREAD_POOL_TEST_SRC = \ - test/cpp/server/fixed_size_thread_pool_test.cc \ - -FIXED_SIZE_THREAD_POOL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(FIXED_SIZE_THREAD_POOL_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test: openssl_dep_error - -else - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. - -$(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test: $(PROTOBUF_DEP) $(FIXED_SIZE_THREAD_POOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(FIXED_SIZE_THREAD_POOL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/cpp/server/fixed_size_thread_pool_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -deps_fixed_size_thread_pool_test: $(FIXED_SIZE_THREAD_POOL_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(FIXED_SIZE_THREAD_POOL_TEST_OBJS:.o=.dep) -endif -endif - - GENERIC_END2END_TEST_SRC = \ test/cpp/end2end/generic_end2end_test.cc \ diff --git a/build.json b/build.json index bd707d2e34c..3f80cdfe174 100644 --- a/build.json +++ b/build.json @@ -42,8 +42,6 @@ "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -69,12 +67,14 @@ "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h" ], "headers": [ "src/cpp/client/channel.h", - "src/cpp/common/create_auth_context.h" + "src/cpp/common/create_auth_context.h", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/fixed_size_thread_pool.h", + "src/cpp/server/thread_pool_interface.h" ], "src": [ "src/cpp/client/channel.cc", @@ -2129,21 +2129,6 @@ "gpr" ] }, - { - "name": "dynamic_thread_pool_test", - "build": "test", - "language": "c++", - "src": [ - "test/cpp/server/dynamic_thread_pool_test.cc" - ], - "deps": [ - "grpc_test_util", - "grpc++", - "grpc", - "gpr_test_util", - "gpr" - ] - }, { "name": "end2end_test", "build": "test", @@ -2160,21 +2145,6 @@ "gpr" ] }, - { - "name": "fixed_size_thread_pool_test", - "build": "test", - "language": "c++", - "src": [ - "test/cpp/server/fixed_size_thread_pool_test.cc" - ], - "deps": [ - "grpc_test_util", - "grpc++", - "grpc", - "gpr_test_util", - "gpr" - ] - }, { "name": "generic_end2end_test", "build": "test", diff --git a/include/grpc++/server_builder.h b/include/grpc++/server_builder.h index 906daf13709..de70aab340a 100644 --- a/include/grpc++/server_builder.h +++ b/include/grpc++/server_builder.h @@ -96,10 +96,6 @@ class ServerBuilder { std::shared_ptr creds, int* selected_port = nullptr); - // Set the thread pool used for running appliation rpc handlers. - // Does not take ownership. - void SetThreadPool(ThreadPoolInterface* thread_pool); - // Add a completion queue for handling asynchronous services // Caller is required to keep this completion queue live until calling // BuildAndStart() diff --git a/src/cpp/server/create_default_thread_pool.cc b/src/cpp/server/create_default_thread_pool.cc index 9f59d254f1d..f4ff4154b21 100644 --- a/src/cpp/server/create_default_thread_pool.cc +++ b/src/cpp/server/create_default_thread_pool.cc @@ -32,7 +32,7 @@ */ #include -#include +#include "src/cpp/server/dynamic_thread_pool.h" #ifndef GRPC_CUSTOM_DEFAULT_THREAD_POOL diff --git a/src/cpp/server/dynamic_thread_pool.cc b/src/cpp/server/dynamic_thread_pool.cc index b475f43b1da..34bf169396a 100644 --- a/src/cpp/server/dynamic_thread_pool.cc +++ b/src/cpp/server/dynamic_thread_pool.cc @@ -33,7 +33,7 @@ #include #include -#include +#include "src/cpp/server/dynamic_thread_pool.h" namespace grpc { DynamicThreadPool::DynamicThread::DynamicThread(DynamicThreadPool* pool) diff --git a/include/grpc++/dynamic_thread_pool.h b/src/cpp/server/dynamic_thread_pool.h similarity index 92% rename from include/grpc++/dynamic_thread_pool.h rename to src/cpp/server/dynamic_thread_pool.h index a4d4885b512..a4683eefc4c 100644 --- a/include/grpc++/dynamic_thread_pool.h +++ b/src/cpp/server/dynamic_thread_pool.h @@ -31,19 +31,20 @@ * */ -#ifndef GRPCXX_DYNAMIC_THREAD_POOL_H -#define GRPCXX_DYNAMIC_THREAD_POOL_H +#ifndef GRPC_INTERNAL_CPP_DYNAMIC_THREAD_POOL_H +#define GRPC_INTERNAL_CPP_DYNAMIC_THREAD_POOL_H #include #include #include -#include #include #include #include +#include "src/cpp/server/thread_pool_interface.h" + namespace grpc { class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface { @@ -80,4 +81,4 @@ class DynamicThreadPool GRPC_FINAL : public ThreadPoolInterface { } // namespace grpc -#endif // GRPCXX_DYNAMIC_THREAD_POOL_H +#endif // GRPC_INTERNAL_CPP_DYNAMIC_THREAD_POOL_H diff --git a/src/cpp/server/fixed_size_thread_pool.cc b/src/cpp/server/fixed_size_thread_pool.cc index bafbc5802a4..2bdc44be2ea 100644 --- a/src/cpp/server/fixed_size_thread_pool.cc +++ b/src/cpp/server/fixed_size_thread_pool.cc @@ -33,7 +33,7 @@ #include #include -#include +#include "src/cpp/server/fixed_size_thread_pool.h" namespace grpc { diff --git a/include/grpc++/fixed_size_thread_pool.h b/src/cpp/server/fixed_size_thread_pool.h similarity index 91% rename from include/grpc++/fixed_size_thread_pool.h rename to src/cpp/server/fixed_size_thread_pool.h index 307e1661427..65d3134ec48 100644 --- a/include/grpc++/fixed_size_thread_pool.h +++ b/src/cpp/server/fixed_size_thread_pool.h @@ -31,18 +31,19 @@ * */ -#ifndef GRPCXX_FIXED_SIZE_THREAD_POOL_H -#define GRPCXX_FIXED_SIZE_THREAD_POOL_H +#ifndef GRPC_INTERNAL_CPP_FIXED_SIZE_THREAD_POOL_H +#define GRPC_INTERNAL_CPP_FIXED_SIZE_THREAD_POOL_H #include #include #include -#include #include #include +#include "src/cpp/server/thread_pool_interface.h" + namespace grpc { class FixedSizeThreadPool GRPC_FINAL : public ThreadPoolInterface { @@ -64,4 +65,4 @@ class FixedSizeThreadPool GRPC_FINAL : public ThreadPoolInterface { } // namespace grpc -#endif // GRPCXX_FIXED_SIZE_THREAD_POOL_H +#endif // GRPC_INTERNAL_CPP_FIXED_SIZE_THREAD_POOL_H diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index e039c07374d..57707121f3d 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -43,10 +43,10 @@ #include #include #include -#include #include #include "src/core/profiling/timers.h" +#include "src/cpp/server/thread_pool_interface.h" namespace grpc { diff --git a/src/cpp/server/server_builder.cc b/src/cpp/server/server_builder.cc index 0b11d861736..db13c84a2b4 100644 --- a/src/cpp/server/server_builder.cc +++ b/src/cpp/server/server_builder.cc @@ -37,8 +37,8 @@ #include #include #include -#include -#include +#include "src/cpp/server/thread_pool_interface.h" +#include "src/cpp/server/fixed_size_thread_pool.h" namespace grpc { @@ -89,10 +89,6 @@ void ServerBuilder::AddListeningPort(const grpc::string& addr, ports_.push_back(port); } -void ServerBuilder::SetThreadPool(ThreadPoolInterface* thread_pool) { - thread_pool_ = thread_pool; -} - std::unique_ptr ServerBuilder::BuildAndStart() { bool thread_pool_owned = false; if (!async_services_.empty() && !services_.empty()) { diff --git a/include/grpc++/thread_pool_interface.h b/src/cpp/server/thread_pool_interface.h similarity index 92% rename from include/grpc++/thread_pool_interface.h rename to src/cpp/server/thread_pool_interface.h index d080b31dcc5..1ebe30fe2a5 100644 --- a/include/grpc++/thread_pool_interface.h +++ b/src/cpp/server/thread_pool_interface.h @@ -31,8 +31,8 @@ * */ -#ifndef GRPCXX_THREAD_POOL_INTERFACE_H -#define GRPCXX_THREAD_POOL_INTERFACE_H +#ifndef GRPC_INTERNAL_CPP_THREAD_POOL_INTERFACE_H +#define GRPC_INTERNAL_CPP_THREAD_POOL_INTERFACE_H #include @@ -51,4 +51,4 @@ ThreadPoolInterface* CreateDefaultThreadPool(); } // namespace grpc -#endif // GRPCXX_THREAD_POOL_INTERFACE_H +#endif // GRPC_INTERNAL_CPP_THREAD_POOL_INTERFACE_H diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index 350b10726f9..8ea63b1280c 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include @@ -262,7 +261,7 @@ class TestServiceImplDupPkg class End2endTest : public ::testing::TestWithParam { protected: End2endTest() - : kMaxMessageSize_(8192), special_service_("special"), thread_pool_(2) {} + : kMaxMessageSize_(8192), special_service_("special") {} void SetUp() GRPC_OVERRIDE { int port = grpc_pick_unused_port_or_die(); @@ -281,7 +280,6 @@ class End2endTest : public ::testing::TestWithParam { builder.SetMaxMessageSize( kMaxMessageSize_); // For testing max message size. builder.RegisterService(&dup_pkg_service_); - builder.SetThreadPool(&thread_pool_); server_ = builder.BuildAndStart(); } @@ -309,7 +307,6 @@ class End2endTest : public ::testing::TestWithParam { ServerBuilder builder; builder.AddListeningPort(proxyaddr.str(), InsecureServerCredentials()); builder.RegisterService(proxy_service_.get()); - builder.SetThreadPool(&thread_pool_); proxy_server_ = builder.BuildAndStart(); channel_ = CreateChannel(proxyaddr.str(), InsecureCredentials(), @@ -329,7 +326,6 @@ class End2endTest : public ::testing::TestWithParam { TestServiceImpl service_; TestServiceImpl special_service_; TestServiceImplDupPkg dup_pkg_service_; - DynamicThreadPool thread_pool_; }; static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub, diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc index 32130e24e94..d1d5c4447b5 100644 --- a/test/cpp/end2end/mock_test.cc +++ b/test/cpp/end2end/mock_test.cc @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include @@ -234,7 +233,7 @@ class TestServiceImpl : public TestService::Service { class MockTest : public ::testing::Test { protected: - MockTest() : thread_pool_(2) {} + MockTest() {} void SetUp() GRPC_OVERRIDE { int port = grpc_pick_unused_port_or_die(); @@ -244,7 +243,6 @@ class MockTest : public ::testing::Test { builder.AddListeningPort(server_address_.str(), InsecureServerCredentials()); builder.RegisterService(&service_); - builder.SetThreadPool(&thread_pool_); server_ = builder.BuildAndStart(); } @@ -260,7 +258,6 @@ class MockTest : public ::testing::Test { std::unique_ptr server_; std::ostringstream server_address_; TestServiceImpl service_; - DynamicThreadPool thread_pool_; }; // Do one real rpc and one mocked one diff --git a/test/cpp/end2end/thread_stress_test.cc b/test/cpp/end2end/thread_stress_test.cc index ff9c945c7c3..36042327490 100644 --- a/test/cpp/end2end/thread_stress_test.cc +++ b/test/cpp/end2end/thread_stress_test.cc @@ -43,7 +43,6 @@ #include #include #include -#include #include #include #include @@ -177,7 +176,7 @@ class TestServiceImplDupPkg class End2endTest : public ::testing::Test { protected: - End2endTest() : kMaxMessageSize_(8192), thread_pool_(2) {} + End2endTest() : kMaxMessageSize_(8192) {} void SetUp() GRPC_OVERRIDE { int port = grpc_pick_unused_port_or_die(); @@ -190,7 +189,6 @@ class End2endTest : public ::testing::Test { builder.SetMaxMessageSize( kMaxMessageSize_); // For testing max message size. builder.RegisterService(&dup_pkg_service_); - builder.SetThreadPool(&thread_pool_); server_ = builder.BuildAndStart(); } @@ -208,7 +206,6 @@ class End2endTest : public ::testing::Test { const int kMaxMessageSize_; TestServiceImpl service_; TestServiceImplDupPkg dup_pkg_service_; - DynamicThreadPool thread_pool_; }; static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub, diff --git a/test/cpp/qps/server_sync.cc b/test/cpp/qps/server_sync.cc index 4c3c9cb497f..93f747a8f33 100644 --- a/test/cpp/qps/server_sync.cc +++ b/test/cpp/qps/server_sync.cc @@ -40,8 +40,6 @@ #include #include #include -#include -#include #include #include #include @@ -93,12 +91,7 @@ class TestServiceImpl GRPC_FINAL : public TestService::Service { class SynchronousServer GRPC_FINAL : public grpc::testing::Server { public: SynchronousServer(const ServerConfig& config, int port) - : thread_pool_(), impl_(MakeImpl(port)) { - if (config.threads() > 0) { - thread_pool_.reset(new FixedSizeThreadPool(config.threads())); - } else { - thread_pool_.reset(new DynamicThreadPool(-config.threads())); - } + : impl_(MakeImpl(port)) { } private: @@ -112,13 +105,10 @@ class SynchronousServer GRPC_FINAL : public grpc::testing::Server { builder.RegisterService(&service_); - builder.SetThreadPool(thread_pool_.get()); - return builder.BuildAndStart(); } TestServiceImpl service_; - std::unique_ptr thread_pool_; std::unique_ptr impl_; }; diff --git a/test/cpp/server/dynamic_thread_pool_test.cc b/test/cpp/server/dynamic_thread_pool_test.cc deleted file mode 100644 index 63b603b8f7b..00000000000 --- a/test/cpp/server/dynamic_thread_pool_test.cc +++ /dev/null @@ -1,77 +0,0 @@ -/* - * - * Copyright 2015, 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 -#include -#include - -#include -#include - -namespace grpc { - -class DynamicThreadPoolTest : public ::testing::Test { - public: - DynamicThreadPoolTest() : thread_pool_(0) {} - - protected: - DynamicThreadPool thread_pool_; -}; - -void Callback(std::mutex* mu, std::condition_variable* cv, bool* done) { - std::unique_lock lock(*mu); - *done = true; - cv->notify_all(); -} - -TEST_F(DynamicThreadPoolTest, Add) { - std::mutex mu; - std::condition_variable cv; - bool done = false; - std::function callback = std::bind(Callback, &mu, &cv, &done); - thread_pool_.Add(callback); - - // Wait for the callback to finish. - std::unique_lock lock(mu); - while (!done) { - cv.wait(lock); - } -} - -} // namespace grpc - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - int result = RUN_ALL_TESTS(); - return result; -} diff --git a/test/cpp/server/fixed_size_thread_pool_test.cc b/test/cpp/server/fixed_size_thread_pool_test.cc deleted file mode 100644 index 442e974fc15..00000000000 --- a/test/cpp/server/fixed_size_thread_pool_test.cc +++ /dev/null @@ -1,77 +0,0 @@ -/* - * - * Copyright 2015, 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 -#include -#include - -#include -#include - -namespace grpc { - -class FixedSizeThreadPoolTest : public ::testing::Test { - public: - FixedSizeThreadPoolTest() : thread_pool_(4) {} - - protected: - FixedSizeThreadPool thread_pool_; -}; - -void Callback(std::mutex* mu, std::condition_variable* cv, bool* done) { - std::unique_lock lock(*mu); - *done = true; - cv->notify_all(); -} - -TEST_F(FixedSizeThreadPoolTest, Add) { - std::mutex mu; - std::condition_variable cv; - bool done = false; - std::function callback = std::bind(Callback, &mu, &cv, &done); - thread_pool_.Add(callback); - - // Wait for the callback to finish. - std::unique_lock lock(mu); - while (!done) { - cv.wait(lock); - } -} - -} // namespace grpc - -int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); - int result = RUN_ALL_TESTS(); - return result; -} diff --git a/test/cpp/util/cli_call_test.cc b/test/cpp/util/cli_call_test.cc index 848a3aee577..6a1f0559719 100644 --- a/test/cpp/util/cli_call_test.cc +++ b/test/cpp/util/cli_call_test.cc @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -75,7 +74,7 @@ class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { class CliCallTest : public ::testing::Test { protected: - CliCallTest() : thread_pool_(2) {} + CliCallTest() {} void SetUp() GRPC_OVERRIDE { int port = grpc_pick_unused_port_or_die(); @@ -85,7 +84,6 @@ class CliCallTest : public ::testing::Test { builder.AddListeningPort(server_address_.str(), InsecureServerCredentials()); builder.RegisterService(&service_); - builder.SetThreadPool(&thread_pool_); server_ = builder.BuildAndStart(); } @@ -102,7 +100,6 @@ class CliCallTest : public ::testing::Test { std::unique_ptr server_; std::ostringstream server_address_; TestServiceImpl service_; - DynamicThreadPool thread_pool_; }; // Send a rpc with a normal stub and then a CliCall. Verify they match. diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 790e637b728..4e7100c9489 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -772,8 +772,6 @@ include/grpc++/config.h \ include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ -include/grpc++/dynamic_thread_pool.h \ -include/grpc++/fixed_size_thread_pool.h \ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ @@ -799,7 +797,6 @@ include/grpc++/status.h \ include/grpc++/status_code_enum.h \ include/grpc++/stream.h \ include/grpc++/stub_options.h \ -include/grpc++/thread_pool_interface.h \ include/grpc++/time.h # This tag can be used to specify the character encoding of the source files diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index cd1279e2a66..b2750ae68a0 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -772,8 +772,6 @@ include/grpc++/config.h \ include/grpc++/config_protobuf.h \ include/grpc++/create_channel.h \ include/grpc++/credentials.h \ -include/grpc++/dynamic_thread_pool.h \ -include/grpc++/fixed_size_thread_pool.h \ include/grpc++/generic_stub.h \ include/grpc++/impl/call.h \ include/grpc++/impl/client_unary_call.h \ @@ -799,13 +797,15 @@ include/grpc++/status.h \ include/grpc++/status_code_enum.h \ include/grpc++/stream.h \ include/grpc++/stub_options.h \ -include/grpc++/thread_pool_interface.h \ include/grpc++/time.h \ src/cpp/client/secure_credentials.h \ src/cpp/common/secure_auth_context.h \ src/cpp/server/secure_server_credentials.h \ src/cpp/client/channel.h \ src/cpp/common/create_auth_context.h \ +src/cpp/server/dynamic_thread_pool.h \ +src/cpp/server/fixed_size_thread_pool.h \ +src/cpp/server/thread_pool_interface.h \ src/cpp/client/secure_channel_arguments.cc \ src/cpp/client/secure_credentials.cc \ src/cpp/common/auth_property_iterator.cc \ diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 50f078586d1..2d1887e1ea1 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -1183,21 +1183,6 @@ "test/cpp/util/time_test.cc" ] }, - { - "deps": [ - "gpr", - "gpr_test_util", - "grpc", - "grpc++", - "grpc_test_util" - ], - "headers": [], - "language": "c++", - "name": "dynamic_thread_pool_test", - "src": [ - "test/cpp/server/dynamic_thread_pool_test.cc" - ] - }, { "deps": [ "gpr", @@ -1214,21 +1199,6 @@ "test/cpp/end2end/end2end_test.cc" ] }, - { - "deps": [ - "gpr", - "gpr_test_util", - "grpc", - "grpc++", - "grpc_test_util" - ], - "headers": [], - "language": "c++", - "name": "fixed_size_thread_pool_test", - "src": [ - "test/cpp/server/fixed_size_thread_pool_test.cc" - ] - }, { "deps": [ "gpr", @@ -13130,8 +13100,6 @@ "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -13157,13 +13125,15 @@ "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.h", "src/cpp/client/secure_credentials.h", "src/cpp/common/create_auth_context.h", "src/cpp/common/secure_auth_context.h", - "src/cpp/server/secure_server_credentials.h" + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/fixed_size_thread_pool.h", + "src/cpp/server/secure_server_credentials.h", + "src/cpp/server/thread_pool_interface.h" ], "language": "c++", "name": "grpc++", @@ -13180,8 +13150,6 @@ "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -13207,7 +13175,6 @@ "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.cc", "src/cpp/client/channel.h", @@ -13233,7 +13200,9 @@ "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", "src/cpp/server/dynamic_thread_pool.cc", + "src/cpp/server/dynamic_thread_pool.h", "src/cpp/server/fixed_size_thread_pool.cc", + "src/cpp/server/fixed_size_thread_pool.h", "src/cpp/server/insecure_server_credentials.cc", "src/cpp/server/secure_server_credentials.cc", "src/cpp/server/secure_server_credentials.h", @@ -13241,6 +13210,7 @@ "src/cpp/server/server_builder.cc", "src/cpp/server/server_context.cc", "src/cpp/server/server_credentials.cc", + "src/cpp/server/thread_pool_interface.h", "src/cpp/util/byte_buffer.cc", "src/cpp/util/slice.cc", "src/cpp/util/status.cc", @@ -13304,8 +13274,6 @@ "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -13331,10 +13299,12 @@ "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.h", - "src/cpp/common/create_auth_context.h" + "src/cpp/common/create_auth_context.h", + "src/cpp/server/dynamic_thread_pool.h", + "src/cpp/server/fixed_size_thread_pool.h", + "src/cpp/server/thread_pool_interface.h" ], "language": "c++", "name": "grpc++_unsecure", @@ -13351,8 +13321,6 @@ "include/grpc++/config_protobuf.h", "include/grpc++/create_channel.h", "include/grpc++/credentials.h", - "include/grpc++/dynamic_thread_pool.h", - "include/grpc++/fixed_size_thread_pool.h", "include/grpc++/generic_stub.h", "include/grpc++/impl/call.h", "include/grpc++/impl/client_unary_call.h", @@ -13378,7 +13346,6 @@ "include/grpc++/status_code_enum.h", "include/grpc++/stream.h", "include/grpc++/stub_options.h", - "include/grpc++/thread_pool_interface.h", "include/grpc++/time.h", "src/cpp/client/channel.cc", "src/cpp/client/channel.h", @@ -13398,12 +13365,15 @@ "src/cpp/server/async_generic_service.cc", "src/cpp/server/create_default_thread_pool.cc", "src/cpp/server/dynamic_thread_pool.cc", + "src/cpp/server/dynamic_thread_pool.h", "src/cpp/server/fixed_size_thread_pool.cc", + "src/cpp/server/fixed_size_thread_pool.h", "src/cpp/server/insecure_server_credentials.cc", "src/cpp/server/server.cc", "src/cpp/server/server_builder.cc", "src/cpp/server/server_context.cc", "src/cpp/server/server_credentials.cc", + "src/cpp/server/thread_pool_interface.h", "src/cpp/util/byte_buffer.cc", "src/cpp/util/slice.cc", "src/cpp/util/status.cc", diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 127b1dfc408..c9812e2a042 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -1339,24 +1339,6 @@ "windows" ] }, - { - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "exclude_configs": [], - "flaky": false, - "language": "c++", - "name": "dynamic_thread_pool_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ] - }, { "ci_platforms": [ "linux", @@ -1375,24 +1357,6 @@ "windows" ] }, - { - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "exclude_configs": [], - "flaky": false, - "language": "c++", - "name": "fixed_size_thread_pool_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ] - }, { "ci_platforms": [ "linux", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 662de784f72..a12b63dfb27 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -83,7 +83,7 @@ buildtests: buildtests_c buildtests_cxx buildtests_c: alarm_heap_test.exe alarm_list_test.exe alarm_test.exe alpn_test.exe bin_encoder_test.exe chttp2_status_conversion_test.exe chttp2_stream_encoder_test.exe chttp2_stream_map_test.exe compression_test.exe fling_client.exe fling_server.exe gpr_cmdline_test.exe gpr_env_test.exe gpr_file_test.exe gpr_histogram_test.exe gpr_host_port_test.exe gpr_log_test.exe gpr_slice_buffer_test.exe gpr_slice_test.exe gpr_stack_lockfree_test.exe gpr_string_test.exe gpr_sync_test.exe gpr_thd_test.exe gpr_time_test.exe gpr_tls_test.exe gpr_useful_test.exe grpc_auth_context_test.exe grpc_base64_test.exe grpc_byte_buffer_reader_test.exe grpc_channel_stack_test.exe grpc_completion_queue_test.exe grpc_credentials_test.exe grpc_json_token_test.exe grpc_jwt_verifier_test.exe grpc_security_connector_test.exe grpc_stream_op_test.exe hpack_parser_test.exe hpack_table_test.exe httpcli_format_request_test.exe httpcli_parser_test.exe json_rewrite.exe json_rewrite_test.exe json_test.exe lame_client_test.exe message_compress_test.exe multi_init_test.exe multiple_server_queues_test.exe murmur_hash_test.exe no_server_test.exe resolve_address_test.exe secure_endpoint_test.exe sockaddr_utils_test.exe time_averaged_stats_test.exe timeout_encoding_test.exe timers_test.exe transport_metadata_test.exe transport_security_test.exe uri_parser_test.exe chttp2_fake_security_bad_hostname_test.exe chttp2_fake_security_cancel_after_accept_test.exe chttp2_fake_security_cancel_after_accept_and_writes_closed_test.exe chttp2_fake_security_cancel_after_invoke_test.exe chttp2_fake_security_cancel_before_invoke_test.exe chttp2_fake_security_cancel_in_a_vacuum_test.exe chttp2_fake_security_census_simple_request_test.exe chttp2_fake_security_channel_connectivity_test.exe chttp2_fake_security_default_host_test.exe chttp2_fake_security_disappearing_server_test.exe chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fake_security_early_server_shutdown_finishes_tags_test.exe chttp2_fake_security_empty_batch_test.exe chttp2_fake_security_graceful_server_shutdown_test.exe chttp2_fake_security_invoke_large_request_test.exe chttp2_fake_security_max_concurrent_streams_test.exe chttp2_fake_security_max_message_length_test.exe chttp2_fake_security_no_op_test.exe chttp2_fake_security_ping_pong_streaming_test.exe chttp2_fake_security_registered_call_test.exe chttp2_fake_security_request_response_with_binary_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_metadata_and_payload_test.exe chttp2_fake_security_request_response_with_payload_test.exe chttp2_fake_security_request_response_with_payload_and_call_creds_test.exe chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fake_security_request_with_compressed_payload_test.exe chttp2_fake_security_request_with_flags_test.exe chttp2_fake_security_request_with_large_metadata_test.exe chttp2_fake_security_request_with_payload_test.exe chttp2_fake_security_server_finishes_request_test.exe chttp2_fake_security_simple_delayed_request_test.exe chttp2_fake_security_simple_request_test.exe chttp2_fake_security_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_test.exe chttp2_fullstack_cancel_after_accept_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_cancel_after_invoke_test.exe chttp2_fullstack_cancel_before_invoke_test.exe chttp2_fullstack_cancel_in_a_vacuum_test.exe chttp2_fullstack_census_simple_request_test.exe chttp2_fullstack_channel_connectivity_test.exe chttp2_fullstack_default_host_test.exe chttp2_fullstack_disappearing_server_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_empty_batch_test.exe chttp2_fullstack_graceful_server_shutdown_test.exe chttp2_fullstack_invoke_large_request_test.exe chttp2_fullstack_max_concurrent_streams_test.exe chttp2_fullstack_max_message_length_test.exe chttp2_fullstack_no_op_test.exe chttp2_fullstack_ping_pong_streaming_test.exe chttp2_fullstack_registered_call_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_request_response_with_payload_test.exe chttp2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_request_with_compressed_payload_test.exe chttp2_fullstack_request_with_flags_test.exe chttp2_fullstack_request_with_large_metadata_test.exe chttp2_fullstack_request_with_payload_test.exe chttp2_fullstack_server_finishes_request_test.exe chttp2_fullstack_simple_delayed_request_test.exe chttp2_fullstack_simple_request_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_compression_bad_hostname_test.exe chttp2_fullstack_compression_cancel_after_accept_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_compression_cancel_after_invoke_test.exe chttp2_fullstack_compression_cancel_before_invoke_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_test.exe chttp2_fullstack_compression_census_simple_request_test.exe chttp2_fullstack_compression_channel_connectivity_test.exe chttp2_fullstack_compression_default_host_test.exe chttp2_fullstack_compression_disappearing_server_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_compression_empty_batch_test.exe chttp2_fullstack_compression_graceful_server_shutdown_test.exe chttp2_fullstack_compression_invoke_large_request_test.exe chttp2_fullstack_compression_max_concurrent_streams_test.exe chttp2_fullstack_compression_max_message_length_test.exe chttp2_fullstack_compression_no_op_test.exe chttp2_fullstack_compression_ping_pong_streaming_test.exe chttp2_fullstack_compression_registered_call_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_test.exe chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_compression_request_with_compressed_payload_test.exe chttp2_fullstack_compression_request_with_flags_test.exe chttp2_fullstack_compression_request_with_large_metadata_test.exe chttp2_fullstack_compression_request_with_payload_test.exe chttp2_fullstack_compression_server_finishes_request_test.exe chttp2_fullstack_compression_simple_delayed_request_test.exe chttp2_fullstack_compression_simple_request_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_with_proxy_bad_hostname_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_fullstack_with_proxy_census_simple_request_test.exe chttp2_fullstack_with_proxy_default_host_test.exe chttp2_fullstack_with_proxy_disappearing_server_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_fullstack_with_proxy_empty_batch_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_fullstack_with_proxy_invoke_large_request_test.exe chttp2_fullstack_with_proxy_max_message_length_test.exe chttp2_fullstack_with_proxy_no_op_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_fullstack_with_proxy_registered_call_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_fullstack_with_proxy_request_with_payload_test.exe chttp2_fullstack_with_proxy_server_finishes_request_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_fullstack_with_proxy_simple_request_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_bad_hostname_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_census_simple_request_test.exe chttp2_simple_ssl_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_fullstack_default_host_test.exe chttp2_simple_ssl_fullstack_disappearing_server_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_empty_batch_test.exe chttp2_simple_ssl_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_fullstack_max_message_length_test.exe chttp2_simple_ssl_fullstack_no_op_test.exe chttp2_simple_ssl_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_registered_call_test.exe chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_fullstack_request_with_flags_test.exe chttp2_simple_ssl_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_request_with_payload_test.exe chttp2_simple_ssl_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_simple_request_test.exe chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test.exe chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_default_host_test.exe chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test.exe chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test.exe chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test.exe chttp2_simple_ssl_fullstack_with_proxy_no_op_test.exe chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test.exe chttp2_simple_ssl_fullstack_with_proxy_registered_call_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test.exe chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test.exe chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_test.exe chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test.exe chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test.exe chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test.exe chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test.exe chttp2_simple_ssl_with_oauth2_fullstack_default_host_test.exe chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test.exe chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test.exe chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test.exe chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test.exe chttp2_simple_ssl_with_oauth2_fullstack_no_op_test.exe chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test.exe chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test.exe chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test.exe chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test.exe chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_bad_hostname_test.exe chttp2_socket_pair_cancel_after_accept_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_cancel_after_invoke_test.exe chttp2_socket_pair_cancel_before_invoke_test.exe chttp2_socket_pair_cancel_in_a_vacuum_test.exe chttp2_socket_pair_census_simple_request_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_empty_batch_test.exe chttp2_socket_pair_graceful_server_shutdown_test.exe chttp2_socket_pair_invoke_large_request_test.exe chttp2_socket_pair_max_concurrent_streams_test.exe chttp2_socket_pair_max_message_length_test.exe chttp2_socket_pair_no_op_test.exe chttp2_socket_pair_ping_pong_streaming_test.exe chttp2_socket_pair_registered_call_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_request_response_with_payload_test.exe chttp2_socket_pair_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_request_with_compressed_payload_test.exe chttp2_socket_pair_request_with_flags_test.exe chttp2_socket_pair_request_with_large_metadata_test.exe chttp2_socket_pair_request_with_payload_test.exe chttp2_socket_pair_server_finishes_request_test.exe chttp2_socket_pair_simple_request_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_test.exe chttp2_socket_pair_with_grpc_trace_no_op_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test.exe chttp2_fullstack_bad_hostname_unsecure_test.exe chttp2_fullstack_cancel_after_accept_unsecure_test.exe chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_census_simple_request_unsecure_test.exe chttp2_fullstack_channel_connectivity_unsecure_test.exe chttp2_fullstack_default_host_unsecure_test.exe chttp2_fullstack_disappearing_server_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_empty_batch_unsecure_test.exe chttp2_fullstack_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_invoke_large_request_unsecure_test.exe chttp2_fullstack_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_max_message_length_unsecure_test.exe chttp2_fullstack_no_op_unsecure_test.exe chttp2_fullstack_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_registered_call_unsecure_test.exe chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_response_with_payload_unsecure_test.exe chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_request_with_flags_unsecure_test.exe chttp2_fullstack_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_request_with_payload_unsecure_test.exe chttp2_fullstack_server_finishes_request_unsecure_test.exe chttp2_fullstack_simple_delayed_request_unsecure_test.exe chttp2_fullstack_simple_request_unsecure_test.exe chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_compression_bad_hostname_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_unsecure_test.exe chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_compression_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_compression_census_simple_request_unsecure_test.exe chttp2_fullstack_compression_channel_connectivity_unsecure_test.exe chttp2_fullstack_compression_default_host_unsecure_test.exe chttp2_fullstack_compression_disappearing_server_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_compression_empty_batch_unsecure_test.exe chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_compression_invoke_large_request_unsecure_test.exe chttp2_fullstack_compression_max_concurrent_streams_unsecure_test.exe chttp2_fullstack_compression_max_message_length_unsecure_test.exe chttp2_fullstack_compression_no_op_unsecure_test.exe chttp2_fullstack_compression_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_compression_registered_call_unsecure_test.exe chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_payload_unsecure_test.exe chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test.exe chttp2_fullstack_compression_request_with_flags_unsecure_test.exe chttp2_fullstack_compression_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_compression_request_with_payload_unsecure_test.exe chttp2_fullstack_compression_server_finishes_request_unsecure_test.exe chttp2_fullstack_compression_simple_delayed_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_unsecure_test.exe chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_fullstack_with_proxy_bad_hostname_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test.exe chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test.exe chttp2_fullstack_with_proxy_census_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_default_host_unsecure_test.exe chttp2_fullstack_with_proxy_disappearing_server_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_fullstack_with_proxy_empty_batch_unsecure_test.exe chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test.exe chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test.exe chttp2_fullstack_with_proxy_max_message_length_unsecure_test.exe chttp2_fullstack_with_proxy_no_op_unsecure_test.exe chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test.exe chttp2_fullstack_with_proxy_registered_call_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test.exe chttp2_fullstack_with_proxy_request_with_payload_unsecure_test.exe chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_unsecure_test.exe chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_bad_hostname_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_census_simple_request_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_empty_batch_unsecure_test.exe chttp2_socket_pair_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_invoke_large_request_unsecure_test.exe chttp2_socket_pair_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_max_message_length_unsecure_test.exe chttp2_socket_pair_no_op_unsecure_test.exe chttp2_socket_pair_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_registered_call_unsecure_test.exe chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_request_with_flags_unsecure_test.exe chttp2_socket_pair_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_request_with_payload_unsecure_test.exe chttp2_socket_pair_server_finishes_request_unsecure_test.exe chttp2_socket_pair_simple_request_unsecure_test.exe chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test.exe chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test.exe chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test.exe connection_prefix_bad_client_test.exe initial_settings_frame_bad_client_test.exe echo All C tests built. -buildtests_cxx: async_end2end_test.exe auth_property_iterator_test.exe channel_arguments_test.exe cli_call_test.exe client_crash_test_server.exe credentials_test.exe cxx_byte_buffer_test.exe cxx_slice_test.exe cxx_time_test.exe dynamic_thread_pool_test.exe end2end_test.exe fixed_size_thread_pool_test.exe generic_end2end_test.exe grpc_cli.exe mock_test.exe reconnect_interop_client.exe reconnect_interop_server.exe secure_auth_context_test.exe server_crash_test_client.exe shutdown_test.exe status_test.exe thread_stress_test.exe zookeeper_test.exe +buildtests_cxx: async_end2end_test.exe auth_property_iterator_test.exe channel_arguments_test.exe cli_call_test.exe client_crash_test_server.exe credentials_test.exe cxx_byte_buffer_test.exe cxx_slice_test.exe cxx_time_test.exe end2end_test.exe generic_end2end_test.exe grpc_cli.exe mock_test.exe reconnect_interop_client.exe reconnect_interop_server.exe secure_auth_context_test.exe server_crash_test_client.exe shutdown_test.exe status_test.exe thread_stress_test.exe zookeeper_test.exe echo All C++ tests built. @@ -671,14 +671,6 @@ cxx_time_test: cxx_time_test.exe echo Running cxx_time_test $(OUT_DIR)\cxx_time_test.exe -dynamic_thread_pool_test.exe: build_grpc_test_util build_grpc++ build_grpc build_gpr_test_util build_gpr $(OUT_DIR) - echo Building dynamic_thread_pool_test - $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\cpp\server\dynamic_thread_pool_test.cc - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\dynamic_thread_pool_test.exe" Debug\grpc_test_util.lib Debug\grpc++.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(CXX_LIBS) $(LIBS) $(OUT_DIR)\dynamic_thread_pool_test.obj -dynamic_thread_pool_test: dynamic_thread_pool_test.exe - echo Running dynamic_thread_pool_test - $(OUT_DIR)\dynamic_thread_pool_test.exe - end2end_test.exe: Debug\grpc++_test_util.lib build_grpc_test_util build_grpc++ build_grpc build_gpr_test_util build_gpr $(OUT_DIR) echo Building end2end_test $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\cpp\end2end\end2end_test.cc @@ -687,14 +679,6 @@ end2end_test: end2end_test.exe echo Running end2end_test $(OUT_DIR)\end2end_test.exe -fixed_size_thread_pool_test.exe: build_grpc_test_util build_grpc++ build_grpc build_gpr_test_util build_gpr $(OUT_DIR) - echo Building fixed_size_thread_pool_test - $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\cpp\server\fixed_size_thread_pool_test.cc - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\fixed_size_thread_pool_test.exe" Debug\grpc_test_util.lib Debug\grpc++.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(CXX_LIBS) $(LIBS) $(OUT_DIR)\fixed_size_thread_pool_test.obj -fixed_size_thread_pool_test: fixed_size_thread_pool_test.exe - echo Running fixed_size_thread_pool_test - $(OUT_DIR)\fixed_size_thread_pool_test.exe - generic_end2end_test.exe: Debug\grpc++_test_util.lib build_grpc_test_util build_grpc++ build_grpc build_gpr_test_util build_gpr $(OUT_DIR) echo Building generic_end2end_test $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\cpp\end2end\generic_end2end_test.cc diff --git a/vsprojects/grpc++/grpc++.vcxproj b/vsprojects/grpc++/grpc++.vcxproj index 929bc1500ea..cd85abd04af 100644 --- a/vsprojects/grpc++/grpc++.vcxproj +++ b/vsprojects/grpc++/grpc++.vcxproj @@ -225,8 +225,6 @@ - - @@ -252,7 +250,6 @@ - @@ -261,6 +258,9 @@ + + + diff --git a/vsprojects/grpc++/grpc++.vcxproj.filters b/vsprojects/grpc++/grpc++.vcxproj.filters index 0408fb46a5c..65720f35e21 100644 --- a/vsprojects/grpc++/grpc++.vcxproj.filters +++ b/vsprojects/grpc++/grpc++.vcxproj.filters @@ -132,12 +132,6 @@ include\grpc++ - - include\grpc++ - - - include\grpc++ - include\grpc++ @@ -213,9 +207,6 @@ include\grpc++ - - include\grpc++ - include\grpc++ @@ -236,6 +227,15 @@ src\cpp\common + + src\cpp\server + + + src\cpp\server + + + src\cpp\server + diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj index 2ff252e04e7..6f53272545d 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj @@ -225,8 +225,6 @@ - - @@ -252,12 +250,14 @@ - + + + diff --git a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters index b4fae7741ce..4d2e8a9c450 100644 --- a/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters +++ b/vsprojects/grpc++_unsecure/grpc++_unsecure.vcxproj.filters @@ -117,12 +117,6 @@ include\grpc++ - - include\grpc++ - - - include\grpc++ - include\grpc++ @@ -198,9 +192,6 @@ include\grpc++ - - include\grpc++ - include\grpc++ @@ -212,6 +203,15 @@ src\cpp\common + + src\cpp\server + + + src\cpp\server + + + src\cpp\server + From 81b4fcbe84ad644ddd2ff6c293610415859bec03 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 24 Aug 2015 10:56:44 -0700 Subject: [PATCH 48/79] Added test for responseHeaders KVO compliance --- src/objective-c/tests/GRPCClientTests.m | 62 +++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/objective-c/tests/GRPCClientTests.m b/src/objective-c/tests/GRPCClientTests.m index 06581e7599a..fa604211e2b 100644 --- a/src/objective-c/tests/GRPCClientTests.m +++ b/src/objective-c/tests/GRPCClientTests.m @@ -53,6 +53,37 @@ static ProtoMethod *kInexistentMethod; static ProtoMethod *kEmptyCallMethod; static ProtoMethod *kUnaryCallMethod; +// This is an observer class for testing that responseMetadata is KVO-compliant + +@interface PassthroughObserver : NSObject + +- (instancetype) initWithCallback:(void (^)(NSString*, id, NSDictionary*))callback; + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change + context:(void *)context; +@end + +@implementation PassthroughObserver { + void (^_callback)(NSString*, id, NSDictionary*); +} + +- (instancetype)initWithCallback:(void (^)(NSString *, id, NSDictionary *))callback { + self = [super init]; + if (self) { + _callback = callback; + } + return self; + +} + +- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + _callback(keyPath, object, change); + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; +} + +@end + @interface GRPCClientTests : XCTestCase @end @@ -183,4 +214,35 @@ static ProtoMethod *kUnaryCallMethod; [self waitForExpectationsWithTimeout:4 handler:nil]; } +- (void)testResponseMetadataKVO { + __weak XCTestExpectation *response = [self expectationWithDescription:@"Empty response received."]; + __weak XCTestExpectation *completion = [self expectationWithDescription:@"Empty RPC completed."]; + __weak XCTestExpectation *metadata = [self expectationWithDescription:@"Metadata changed."]; + + PassthroughObserver *observer = [[PassthroughObserver alloc] initWithCallback:^(NSString *keypath, id object, NSDictionary * change) { + if (keypath == @"responseHeaders") { + [expectation fulfill]; + } + }] + + GRPCCall *call = [[GRPCCall alloc] initWithHost:kHostAddress + path:kEmptyCallMethod.HTTPPath + requestsWriter:[GRXWriter writerWithValue:[NSData data]]]; + + [call addObserver:observer forKeyPath:@"responseHeaders" options:0 context:NULL]; + + id responsesWriteable = [[GRXWriteable alloc] initWithValueHandler:^(NSData *value) { + XCTAssertNotNil(value, @"nil value received as response."); + XCTAssertEqual([value length], 0, @"Non-empty response received: %@", value); + [response fulfill]; + } completionHandler:^(NSError *errorOrNil) { + XCTAssertNil(errorOrNil, @"Finished with unexpected error: %@", errorOrNil); + [completion fulfill]; + }]; + + [call startWithWriteable:responsesWriteable]; + + [self waitForExpectationsWithTimeout:8 handler:nil]; +} + @end From 333ced0b8a7216d3ee91363b6f323e1c9e4da4ad Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 10:57:32 -0700 Subject: [PATCH 49/79] Remove accidental dependency on zookeeper in shutdown_test --- Makefile | 14 +++++++------- build.json | 4 ---- tools/run_tests/sources_and_headers.json | 3 +-- vsprojects/Grpc.mak | 4 ++-- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 31628b44122..3a89fe2c196 100644 --- a/Makefile +++ b/Makefile @@ -1733,10 +1733,10 @@ buildtests: buildtests_c buildtests_cxx buildtests_zookeeper buildtests_c: privatelibs_c $(BINDIR)/$(CONFIG)/alarm_heap_test $(BINDIR)/$(CONFIG)/alarm_list_test $(BINDIR)/$(CONFIG)/alarm_test $(BINDIR)/$(CONFIG)/alpn_test $(BINDIR)/$(CONFIG)/bin_encoder_test $(BINDIR)/$(CONFIG)/chttp2_status_conversion_test $(BINDIR)/$(CONFIG)/chttp2_stream_encoder_test $(BINDIR)/$(CONFIG)/chttp2_stream_map_test $(BINDIR)/$(CONFIG)/compression_test $(BINDIR)/$(CONFIG)/dualstack_socket_test $(BINDIR)/$(CONFIG)/fd_conservation_posix_test $(BINDIR)/$(CONFIG)/fd_posix_test $(BINDIR)/$(CONFIG)/fling_client $(BINDIR)/$(CONFIG)/fling_server $(BINDIR)/$(CONFIG)/fling_stream_test $(BINDIR)/$(CONFIG)/fling_test $(BINDIR)/$(CONFIG)/gpr_cmdline_test $(BINDIR)/$(CONFIG)/gpr_env_test $(BINDIR)/$(CONFIG)/gpr_file_test $(BINDIR)/$(CONFIG)/gpr_histogram_test $(BINDIR)/$(CONFIG)/gpr_host_port_test $(BINDIR)/$(CONFIG)/gpr_log_test $(BINDIR)/$(CONFIG)/gpr_slice_buffer_test $(BINDIR)/$(CONFIG)/gpr_slice_test $(BINDIR)/$(CONFIG)/gpr_stack_lockfree_test $(BINDIR)/$(CONFIG)/gpr_string_test $(BINDIR)/$(CONFIG)/gpr_sync_test $(BINDIR)/$(CONFIG)/gpr_thd_test $(BINDIR)/$(CONFIG)/gpr_time_test $(BINDIR)/$(CONFIG)/gpr_tls_test $(BINDIR)/$(CONFIG)/gpr_useful_test $(BINDIR)/$(CONFIG)/grpc_auth_context_test $(BINDIR)/$(CONFIG)/grpc_base64_test $(BINDIR)/$(CONFIG)/grpc_byte_buffer_reader_test $(BINDIR)/$(CONFIG)/grpc_channel_stack_test $(BINDIR)/$(CONFIG)/grpc_completion_queue_test $(BINDIR)/$(CONFIG)/grpc_credentials_test $(BINDIR)/$(CONFIG)/grpc_json_token_test $(BINDIR)/$(CONFIG)/grpc_jwt_verifier_test $(BINDIR)/$(CONFIG)/grpc_security_connector_test $(BINDIR)/$(CONFIG)/grpc_stream_op_test $(BINDIR)/$(CONFIG)/hpack_parser_test $(BINDIR)/$(CONFIG)/hpack_table_test $(BINDIR)/$(CONFIG)/httpcli_format_request_test $(BINDIR)/$(CONFIG)/httpcli_parser_test $(BINDIR)/$(CONFIG)/httpcli_test $(BINDIR)/$(CONFIG)/json_rewrite $(BINDIR)/$(CONFIG)/json_rewrite_test $(BINDIR)/$(CONFIG)/json_test $(BINDIR)/$(CONFIG)/lame_client_test $(BINDIR)/$(CONFIG)/message_compress_test $(BINDIR)/$(CONFIG)/multi_init_test $(BINDIR)/$(CONFIG)/multiple_server_queues_test $(BINDIR)/$(CONFIG)/murmur_hash_test $(BINDIR)/$(CONFIG)/no_server_test $(BINDIR)/$(CONFIG)/resolve_address_test $(BINDIR)/$(CONFIG)/secure_endpoint_test $(BINDIR)/$(CONFIG)/sockaddr_utils_test $(BINDIR)/$(CONFIG)/tcp_client_posix_test $(BINDIR)/$(CONFIG)/tcp_posix_test $(BINDIR)/$(CONFIG)/tcp_server_posix_test $(BINDIR)/$(CONFIG)/time_averaged_stats_test $(BINDIR)/$(CONFIG)/timeout_encoding_test $(BINDIR)/$(CONFIG)/timers_test $(BINDIR)/$(CONFIG)/transport_metadata_test $(BINDIR)/$(CONFIG)/transport_security_test $(BINDIR)/$(CONFIG)/udp_server_test $(BINDIR)/$(CONFIG)/uri_parser_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fake_security_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_poll_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_channel_connectivity_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_default_host_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_disappearing_server_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_no_op_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_delayed_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_simple_ssl_with_oauth2_fullstack_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_and_call_creds_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_compression_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_uds_posix_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_channel_connectivity_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_poll_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_default_host_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_disappearing_server_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_delayed_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_fullstack_with_proxy_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_one_byte_at_a_time_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_bad_hostname_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_accept_and_writes_closed_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_after_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_before_invoke_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_cancel_in_a_vacuum_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_census_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_inflight_calls_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_early_server_shutdown_finishes_tags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_empty_batch_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_graceful_server_shutdown_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_invoke_large_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_concurrent_streams_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_max_message_length_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_no_op_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_ping_pong_streaming_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_registered_call_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_binary_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_response_with_trailing_metadata_and_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_compressed_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_flags_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_large_metadata_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_request_with_payload_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_server_finishes_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_unsecure_test $(BINDIR)/$(CONFIG)/chttp2_socket_pair_with_grpc_trace_simple_request_with_high_initial_sequence_number_unsecure_test $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test -buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test +buildtests_cxx: buildtests_zookeeper privatelibs_cxx $(BINDIR)/$(CONFIG)/async_end2end_test $(BINDIR)/$(CONFIG)/async_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/async_unary_ping_pong_test $(BINDIR)/$(CONFIG)/auth_property_iterator_test $(BINDIR)/$(CONFIG)/channel_arguments_test $(BINDIR)/$(CONFIG)/cli_call_test $(BINDIR)/$(CONFIG)/client_crash_test $(BINDIR)/$(CONFIG)/client_crash_test_server $(BINDIR)/$(CONFIG)/credentials_test $(BINDIR)/$(CONFIG)/cxx_byte_buffer_test $(BINDIR)/$(CONFIG)/cxx_slice_test $(BINDIR)/$(CONFIG)/cxx_time_test $(BINDIR)/$(CONFIG)/dynamic_thread_pool_test $(BINDIR)/$(CONFIG)/end2end_test $(BINDIR)/$(CONFIG)/fixed_size_thread_pool_test $(BINDIR)/$(CONFIG)/generic_end2end_test $(BINDIR)/$(CONFIG)/grpc_cli $(BINDIR)/$(CONFIG)/interop_client $(BINDIR)/$(CONFIG)/interop_server $(BINDIR)/$(CONFIG)/interop_test $(BINDIR)/$(CONFIG)/mock_test $(BINDIR)/$(CONFIG)/qps_interarrival_test $(BINDIR)/$(CONFIG)/qps_openloop_test $(BINDIR)/$(CONFIG)/qps_test $(BINDIR)/$(CONFIG)/reconnect_interop_client $(BINDIR)/$(CONFIG)/reconnect_interop_server $(BINDIR)/$(CONFIG)/secure_auth_context_test $(BINDIR)/$(CONFIG)/server_crash_test $(BINDIR)/$(CONFIG)/server_crash_test_client $(BINDIR)/$(CONFIG)/shutdown_test $(BINDIR)/$(CONFIG)/status_test $(BINDIR)/$(CONFIG)/sync_streaming_ping_pong_test $(BINDIR)/$(CONFIG)/sync_unary_ping_pong_test $(BINDIR)/$(CONFIG)/thread_stress_test ifeq ($(HAS_ZOOKEEPER),true) -buildtests_zookeeper: privatelibs_zookeeper $(BINDIR)/$(CONFIG)/shutdown_test $(BINDIR)/$(CONFIG)/zookeeper_test +buildtests_zookeeper: privatelibs_zookeeper $(BINDIR)/$(CONFIG)/zookeeper_test else buildtests_zookeeper: endif @@ -3349,6 +3349,8 @@ test_cxx: test_zookeeper buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/secure_auth_context_test || ( echo test secure_auth_context_test failed ; exit 1 ) $(E) "[RUN] Testing server_crash_test" $(Q) $(BINDIR)/$(CONFIG)/server_crash_test || ( echo test server_crash_test failed ; exit 1 ) + $(E) "[RUN] Testing shutdown_test" + $(Q) $(BINDIR)/$(CONFIG)/shutdown_test || ( echo test shutdown_test failed ; exit 1 ) $(E) "[RUN] Testing status_test" $(Q) $(BINDIR)/$(CONFIG)/status_test || ( echo test status_test failed ; exit 1 ) $(E) "[RUN] Testing sync_streaming_ping_pong_test" @@ -3364,8 +3366,6 @@ flaky_test_cxx: buildtests_cxx ifeq ($(HAS_ZOOKEEPER),true) test_zookeeper: buildtests_zookeeper - $(E) "[RUN] Testing shutdown_test" - $(Q) $(BINDIR)/$(CONFIG)/shutdown_test || ( echo test shutdown_test failed ; exit 1 ) $(E) "[RUN] Testing zookeeper_test" $(Q) $(BINDIR)/$(CONFIG)/zookeeper_test || ( echo test zookeeper_test failed ; exit 1 ) @@ -10286,16 +10286,16 @@ $(BINDIR)/$(CONFIG)/shutdown_test: protobuf_dep_error else -$(BINDIR)/$(CONFIG)/shutdown_test: $(PROTOBUF_DEP) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc_zookeeper.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/shutdown_test: $(PROTOBUF_DEP) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc_zookeeper.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -lzookeeper_mt $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/shutdown_test + $(Q) $(LDXX) $(LDFLAGS) $(SHUTDOWN_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/shutdown_test endif endif -$(OBJDIR)/$(CONFIG)/test/cpp/end2end/shutdown_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc_zookeeper.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/cpp/end2end/shutdown_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_shutdown_test: $(SHUTDOWN_TEST_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) diff --git a/build.json b/build.json index bd707d2e34c..3aeedca61ae 100644 --- a/build.json +++ b/build.json @@ -2624,13 +2624,9 @@ "grpc++_test_util", "grpc_test_util", "grpc++", - "grpc_zookeeper", "grpc", "gpr_test_util", "gpr" - ], - "external_deps": [ - "zookeeper" ] }, { diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 50f078586d1..cdd99a94470 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -1627,8 +1627,7 @@ "grpc", "grpc++", "grpc++_test_util", - "grpc_test_util", - "grpc_zookeeper" + "grpc_test_util" ], "headers": [], "language": "c++", diff --git a/vsprojects/Grpc.mak b/vsprojects/Grpc.mak index 662de784f72..18694427029 100644 --- a/vsprojects/Grpc.mak +++ b/vsprojects/Grpc.mak @@ -767,10 +767,10 @@ server_crash_test_client: server_crash_test_client.exe echo Running server_crash_test_client $(OUT_DIR)\server_crash_test_client.exe -shutdown_test.exe: Debug\grpc++_test_util.lib build_grpc_test_util build_grpc++ Debug\grpc_zookeeper.lib build_grpc build_gpr_test_util build_gpr $(OUT_DIR) +shutdown_test.exe: Debug\grpc++_test_util.lib build_grpc_test_util build_grpc++ build_grpc build_gpr_test_util build_gpr $(OUT_DIR) echo Building shutdown_test $(CC) $(CXXFLAGS) /Fo:$(OUT_DIR)\ $(REPO_ROOT)\test\cpp\end2end\shutdown_test.cc - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\shutdown_test.exe" Debug\grpc++_test_util.lib Debug\grpc_test_util.lib Debug\grpc++.lib Debug\grpc_zookeeper.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(CXX_LIBS) $(LIBS) $(OUT_DIR)\shutdown_test.obj + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\shutdown_test.exe" Debug\grpc++_test_util.lib Debug\grpc_test_util.lib Debug\grpc++.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(CXX_LIBS) $(LIBS) $(OUT_DIR)\shutdown_test.obj shutdown_test: shutdown_test.exe echo Running shutdown_test $(OUT_DIR)\shutdown_test.exe From 9faff0e2b16c814d25b6be2d2af768e533e843bd Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Mon, 24 Aug 2015 18:10:55 +0000 Subject: [PATCH 50/79] Four small bugfixes (1) In grpc._links.service._Kernel.add_ticket, premetadata() the call if it has not already been premetadataed for any non-None ticket termination, not just links.Ticket.Termination.COMPLETION. (2) In grpc.framework.core._reception, add an entry to _REMOTE_TICKET_TERMINATION_TO_LOCAL_OUTCOME for REMOTE_FAILURE. REMOTE_FAILURE on a received ticket indicates the remote side of the operation blaming the local side for operation abortion. (3) In grpc.framework.core._reception.ReceptionManager._abort, only abort the operation's other managers if the operation has not already terminated, as indicated by the "outcome" attribute of the TerminationManager. (4) In grpc.framework.core._reception.ReceptionManager._abort, don't transmit the outcome to the other side of the operation. Either it came from the other side in the first place and to send it back would be telling the other side something it already knows, or it arose from a network failure and there's no confidence that it would reach the other side. --- src/python/grpcio/grpc/_links/service.py | 2 +- src/python/grpcio/grpc/framework/core/_reception.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/_links/service.py b/src/python/grpcio/grpc/_links/service.py index 5c636d61abc..03be5af404f 100644 --- a/src/python/grpcio/grpc/_links/service.py +++ b/src/python/grpcio/grpc/_links/service.py @@ -239,7 +239,7 @@ class _Kernel(object): elif not rpc_state.premetadataed: if (ticket.terminal_metadata is not None or ticket.payload is not None or - ticket.termination is links.Ticket.Termination.COMPLETION or + ticket.termination is not None or ticket.code is not None or ticket.message is not None): call.premetadata() diff --git a/src/python/grpcio/grpc/framework/core/_reception.py b/src/python/grpcio/grpc/framework/core/_reception.py index b64faf81463..0858f64ff6b 100644 --- a/src/python/grpcio/grpc/framework/core/_reception.py +++ b/src/python/grpcio/grpc/framework/core/_reception.py @@ -42,6 +42,7 @@ _REMOTE_TICKET_TERMINATION_TO_LOCAL_OUTCOME = { links.Ticket.Termination.TRANSMISSION_FAILURE: base.Outcome.TRANSMISSION_FAILURE, links.Ticket.Termination.LOCAL_FAILURE: base.Outcome.REMOTE_FAILURE, + links.Ticket.Termination.REMOTE_FAILURE: base.Outcome.LOCAL_FAILURE, } @@ -70,9 +71,10 @@ class ReceptionManager(_interfaces.ReceptionManager): def _abort(self, outcome): self._aborted = True - self._termination_manager.abort(outcome) - self._transmission_manager.abort(outcome) - self._expiration_manager.terminate() + if self._termination_manager.outcome is None: + self._termination_manager.abort(outcome) + self._transmission_manager.abort(None) + self._expiration_manager.terminate() def _sequence_failure(self, ticket): """Determines a just-arrived ticket's sequential legitimacy. From 2432c224d9e18f9db3e6852b3f7154e5691de32b Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Mon, 24 Aug 2015 18:49:45 +0000 Subject: [PATCH 51/79] Add a "transport" field to links.Ticket This will be used for communication of transport-specific values and objects up to applications. --- src/python/grpcio/grpc/_links/invocation.py | 8 +++---- src/python/grpcio/grpc/_links/service.py | 10 ++++---- .../grpc/framework/core/_transmission.py | 14 +++++------ .../grpc/framework/interfaces/links/links.py | 24 +++++++++++++++++-- .../_links/_lonely_invocation_link_test.py | 2 +- .../grpc_test/_links/_transmission_test.py | 15 ++++++------ .../framework/interfaces/links/test_cases.py | 4 ++-- .../interfaces/links/test_utilities.py | 2 +- 8 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/python/grpcio/grpc/_links/invocation.py b/src/python/grpcio/grpc/_links/invocation.py index 0058ae91f87..a74c77ebcc2 100644 --- a/src/python/grpcio/grpc/_links/invocation.py +++ b/src/python/grpcio/grpc/_links/invocation.py @@ -101,7 +101,7 @@ class _Kernel(object): else: ticket = links.Ticket( operation_id, rpc_state.sequence_number, None, None, None, None, 1, - None, None, None, None, None, None) + None, None, None, None, None, None, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) rpc_state.low_write = _LowWrite.OPEN @@ -118,7 +118,7 @@ class _Kernel(object): ticket = links.Ticket( operation_id, rpc_state.sequence_number, None, None, None, None, None, None, rpc_state.response_deserializer(event.bytes), None, None, None, - None) + None, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) @@ -129,7 +129,7 @@ class _Kernel(object): ticket = links.Ticket( operation_id, rpc_state.sequence_number, None, None, links.Ticket.Subscription.FULL, None, None, event.metadata, None, None, - None, None, None) + None, None, None, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) @@ -146,7 +146,7 @@ class _Kernel(object): ticket = links.Ticket( operation_id, rpc_state.sequence_number, None, None, None, None, None, None, None, event.metadata, event.status.code, event.status.details, - termination) + termination, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) diff --git a/src/python/grpcio/grpc/_links/service.py b/src/python/grpcio/grpc/_links/service.py index 5c636d61abc..de78e82cd61 100644 --- a/src/python/grpcio/grpc/_links/service.py +++ b/src/python/grpcio/grpc/_links/service.py @@ -131,7 +131,7 @@ class _Kernel(object): ticket = links.Ticket( call, 0, group, method, links.Ticket.Subscription.FULL, service_acceptance.deadline - time.time(), None, event.metadata, None, - None, None, None, None) + None, None, None, None, 'TODO: Service Context Object!') self._relay.add_value(ticket) def _on_read_event(self, event): @@ -157,7 +157,7 @@ class _Kernel(object): # rpc_state.read = _Read.AWAITING_ALLOWANCE ticket = links.Ticket( call, rpc_state.sequence_number, None, None, None, None, None, None, - payload, None, None, None, termination) + payload, None, None, None, termination, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) @@ -176,7 +176,7 @@ class _Kernel(object): else: ticket = links.Ticket( call, rpc_state.sequence_number, None, None, None, None, 1, None, - None, None, None, None, None) + None, None, None, None, None, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) rpc_state.low_write = _LowWrite.OPEN @@ -198,7 +198,7 @@ class _Kernel(object): termination = links.Ticket.Termination.TRANSMISSION_FAILURE ticket = links.Ticket( call, rpc_state.sequence_number, None, None, None, None, None, None, - None, None, None, None, termination) + None, None, None, None, termination, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) @@ -259,7 +259,7 @@ class _Kernel(object): termination = links.Ticket.Termination.COMPLETION ticket = links.Ticket( call, rpc_state.sequence_number, None, None, None, None, None, - None, payload, None, None, None, termination) + None, payload, None, None, None, termination, None) rpc_state.sequence_number += 1 self._relay.add_value(ticket) diff --git a/src/python/grpcio/grpc/framework/core/_transmission.py b/src/python/grpcio/grpc/framework/core/_transmission.py index 01894d398dc..03644f4d491 100644 --- a/src/python/grpcio/grpc/framework/core/_transmission.py +++ b/src/python/grpcio/grpc/framework/core/_transmission.py @@ -107,7 +107,7 @@ class TransmissionManager(_interfaces.TransmissionManager): return links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, None, None, None, None, None, None, None, None, - termination) + termination, None) action = False # TODO(nathaniel): Support other subscriptions. @@ -144,7 +144,7 @@ class TransmissionManager(_interfaces.TransmissionManager): ticket = links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, local_subscription, timeout, allowance, initial_metadata, payload, - terminal_metadata, code, message, termination) + terminal_metadata, code, message, termination, None) self._lowest_unused_sequence_number += 1 return ticket else: @@ -191,7 +191,7 @@ class TransmissionManager(_interfaces.TransmissionManager): ticket = links.Ticket( self._operation_id, 0, group, method, subscription, timeout, allowance, initial_metadata, payload, terminal_metadata, code, message, - termination) + termination, None) self._lowest_unused_sequence_number = 1 self._transmit(ticket) @@ -236,7 +236,7 @@ class TransmissionManager(_interfaces.TransmissionManager): ticket = links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, None, None, allowance, effective_initial_metadata, ticket_payload, - terminal_metadata, code, message, termination) + terminal_metadata, code, message, termination, None) self._lowest_unused_sequence_number += 1 self._transmit(ticket) @@ -247,7 +247,7 @@ class TransmissionManager(_interfaces.TransmissionManager): else: ticket = links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, - None, timeout, None, None, None, None, None, None, None) + None, timeout, None, None, None, None, None, None, None, None) self._lowest_unused_sequence_number += 1 self._transmit(ticket) @@ -268,7 +268,7 @@ class TransmissionManager(_interfaces.TransmissionManager): ticket = links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, None, None, None, None, payload, terminal_metadata, code, message, - termination) + termination, None) self._lowest_unused_sequence_number += 1 self._transmit(ticket) @@ -290,5 +290,5 @@ class TransmissionManager(_interfaces.TransmissionManager): ticket = links.Ticket( self._operation_id, self._lowest_unused_sequence_number, None, None, None, None, None, None, None, None, None, None, - termination) + termination, None) self._transmit(ticket) diff --git a/src/python/grpcio/grpc/framework/interfaces/links/links.py b/src/python/grpcio/grpc/framework/interfaces/links/links.py index 069ff024ddc..b98a30a3990 100644 --- a/src/python/grpcio/grpc/framework/interfaces/links/links.py +++ b/src/python/grpcio/grpc/framework/interfaces/links/links.py @@ -34,12 +34,30 @@ import collections import enum +class Transport(collections.namedtuple('Transport', ('kind', 'value',))): + """A sum type for handles to an underlying transport system. + + Attributes: + kind: A Kind value identifying the kind of value being passed to or from + the underlying transport. + value: The value being passed through RPC Framework between the high-level + application and the underlying transport. + """ + + @enum.unique + class Kind(enum.Enum): + CALL_OPTION = 'call option' + SERVICER_CONTEXT = 'servicer context' + INVOCATION_CONTEXT = 'invocation context' + + class Ticket( collections.namedtuple( 'Ticket', - ['operation_id', 'sequence_number', 'group', 'method', 'subscription', + ('operation_id', 'sequence_number', 'group', 'method', 'subscription', 'timeout', 'allowance', 'initial_metadata', 'payload', - 'terminal_metadata', 'code', 'message', 'termination'])): + 'terminal_metadata', 'code', 'message', 'termination', + 'transport',))): """A sum type for all values sent from a front to a back. Attributes: @@ -81,6 +99,8 @@ class Ticket( termination: A Termination value describing the end of the operation, or None if the operation has not yet terminated. If set, no further tickets may be sent in the same direction. + transport: A Transport value or None, with further semantics being a matter + between high-level application and underlying transport. """ @enum.unique diff --git a/src/python/grpcio_test/grpc_test/_links/_lonely_invocation_link_test.py b/src/python/grpcio_test/grpc_test/_links/_lonely_invocation_link_test.py index abe240e07ab..373a2b2a1f7 100644 --- a/src/python/grpcio_test/grpc_test/_links/_lonely_invocation_link_test.py +++ b/src/python/grpcio_test/grpc_test/_links/_lonely_invocation_link_test.py @@ -66,7 +66,7 @@ class LonelyInvocationLinkTest(unittest.TestCase): ticket = links.Ticket( test_operation_id, 0, test_group, test_method, links.Ticket.Subscription.FULL, test_constants.SHORT_TIMEOUT, 1, None, - None, None, None, None, termination) + None, None, None, None, termination, None) invocation_link.accept_ticket(ticket) invocation_link_mate.block_until_tickets_satisfy(test_cases.terminated) diff --git a/src/python/grpcio_test/grpc_test/_links/_transmission_test.py b/src/python/grpcio_test/grpc_test/_links/_transmission_test.py index 9cdc9620f0a..02ddd512c22 100644 --- a/src/python/grpcio_test/grpc_test/_links/_transmission_test.py +++ b/src/python/grpcio_test/grpc_test/_links/_transmission_test.py @@ -128,14 +128,14 @@ class RoundTripTest(unittest.TestCase): invocation_ticket = links.Ticket( test_operation_id, 0, test_group, test_method, links.Ticket.Subscription.FULL, test_constants.LONG_TIMEOUT, None, None, - None, None, None, None, links.Ticket.Termination.COMPLETION) + None, None, None, None, links.Ticket.Termination.COMPLETION, None) invocation_link.accept_ticket(invocation_ticket) service_mate.block_until_tickets_satisfy(test_cases.terminated) service_ticket = links.Ticket( service_mate.tickets()[-1].operation_id, 0, None, None, None, None, None, None, None, None, test_code, test_message, - links.Ticket.Termination.COMPLETION) + links.Ticket.Termination.COMPLETION, None) service_link.accept_ticket(service_ticket) invocation_mate.block_until_tickets_satisfy(test_cases.terminated) @@ -174,33 +174,34 @@ class RoundTripTest(unittest.TestCase): invocation_ticket = links.Ticket( test_operation_id, 0, test_group, test_method, links.Ticket.Subscription.FULL, test_constants.LONG_TIMEOUT, None, None, - None, None, None, None, None) + None, None, None, None, None, None) invocation_link.accept_ticket(invocation_ticket) requests = scenario.requests() for request_index, request in enumerate(requests): request_ticket = links.Ticket( test_operation_id, 1 + request_index, None, None, None, None, 1, None, - request, None, None, None, None) + request, None, None, None, None, None) invocation_link.accept_ticket(request_ticket) service_mate.block_until_tickets_satisfy( test_cases.at_least_n_payloads_received_predicate(1 + request_index)) response_ticket = links.Ticket( service_mate.tickets()[0].operation_id, request_index, None, None, None, None, 1, None, scenario.response_for_request(request), None, - None, None, None) + None, None, None, None) service_link.accept_ticket(response_ticket) invocation_mate.block_until_tickets_satisfy( test_cases.at_least_n_payloads_received_predicate(1 + request_index)) request_count = len(requests) invocation_completion_ticket = links.Ticket( test_operation_id, request_count + 1, None, None, None, None, None, - None, None, None, None, None, links.Ticket.Termination.COMPLETION) + None, None, None, None, None, links.Ticket.Termination.COMPLETION, + None) invocation_link.accept_ticket(invocation_completion_ticket) service_mate.block_until_tickets_satisfy(test_cases.terminated) service_completion_ticket = links.Ticket( service_mate.tickets()[0].operation_id, request_count, None, None, None, None, None, None, None, None, test_code, test_message, - links.Ticket.Termination.COMPLETION) + links.Ticket.Termination.COMPLETION, None) service_link.accept_ticket(service_completion_ticket) invocation_mate.block_until_tickets_satisfy(test_cases.terminated) diff --git a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_cases.py b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_cases.py index 1e575d1a9ef..ecf49d9cdb5 100644 --- a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_cases.py +++ b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_cases.py @@ -300,7 +300,7 @@ class TransmissionTest(object): invocation_operation_id, 0, _TRANSMISSION_GROUP, _TRANSMISSION_METHOD, links.Ticket.Subscription.FULL, timeout, 0, invocation_initial_metadata, invocation_payload, invocation_terminal_metadata, invocation_code, - invocation_message, links.Ticket.Termination.COMPLETION) + invocation_message, links.Ticket.Termination.COMPLETION, None) self._invocation_link.accept_ticket(original_invocation_ticket) self._service_mate.block_until_tickets_satisfy( @@ -317,7 +317,7 @@ class TransmissionTest(object): service_operation_id, 0, None, None, links.Ticket.Subscription.FULL, timeout, 0, service_initial_metadata, service_payload, service_terminal_metadata, service_code, service_message, - links.Ticket.Termination.COMPLETION) + links.Ticket.Termination.COMPLETION, None) self._service_link.accept_ticket(original_service_ticket) self._invocation_mate.block_until_tickets_satisfy(terminated) self._assert_is_valid_service_sequence( diff --git a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py index a2bd7107c17..39c7f2fc635 100644 --- a/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py +++ b/src/python/grpcio_test/grpc_test/framework/interfaces/links/test_utilities.py @@ -64,7 +64,7 @@ def _safe_for_log_ticket(ticket): ticket.allowance, ticket.initial_metadata, ''.format(payload_length), ticket.terminal_metadata, ticket.code, ticket.message, - ticket.termination) + ticket.termination, None) class RecordingLink(links.Link): From fe5f25490d4e290ecf2fc52de64c1230429fd0a3 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Mon, 24 Aug 2015 12:33:05 -0700 Subject: [PATCH 52/79] Improvements to the grpc_channel_args_compression_algorithm_set_state api --- src/core/channel/channel_args.c | 11 +++++----- src/core/channel/channel_args.h | 7 +++++-- test/core/channel/channel_args_test.c | 29 ++++++++++++++++----------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/core/channel/channel_args.c b/src/core/channel/channel_args.c index dc66de7dd63..54ee75af289 100644 --- a/src/core/channel/channel_args.c +++ b/src/core/channel/channel_args.c @@ -167,13 +167,13 @@ static int find_compression_algorithm_states_bitset( } grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( - grpc_channel_args *a, + grpc_channel_args **a, grpc_compression_algorithm algorithm, int state) { int *states_arg; - grpc_channel_args *result = a; + grpc_channel_args *result = *a; const int states_arg_found = - find_compression_algorithm_states_bitset(a, &states_arg); + find_compression_algorithm_states_bitset(*a, &states_arg); if (states_arg_found) { if (state != 0) { @@ -193,8 +193,9 @@ grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( } else { GPR_BITCLEAR(&tmp.value.integer, algorithm); } - result = grpc_channel_args_copy_and_add(a, &tmp, 1); - grpc_channel_args_destroy(a); + result = grpc_channel_args_copy_and_add(*a, &tmp, 1); + grpc_channel_args_destroy(*a); + *a = result; } return result; } diff --git a/src/core/channel/channel_args.h b/src/core/channel/channel_args.h index e557f9a9d92..06a6012dee8 100644 --- a/src/core/channel/channel_args.h +++ b/src/core/channel/channel_args.h @@ -70,9 +70,12 @@ grpc_channel_args *grpc_channel_args_set_compression_algorithm( /** Sets the support for the given compression algorithm. By default, all * compression algorithms are enabled. It's an error to disable an algorithm set * by grpc_channel_args_set_compression_algorithm. - * */ + * + * Returns an instance will the updated algorithm states. The \a a pointer is + * modified to point to the returned instance (which may be different from the + * input value of \a a). */ grpc_channel_args *grpc_channel_args_compression_algorithm_set_state( - grpc_channel_args *a, + grpc_channel_args **a, grpc_compression_algorithm algorithm, int enabled); diff --git a/test/core/channel/channel_args_test.c b/test/core/channel/channel_args_test.c index 227cc1f4158..87f006acdee 100644 --- a/test/core/channel/channel_args_test.c +++ b/test/core/channel/channel_args_test.c @@ -45,7 +45,7 @@ static void test_create(void) { grpc_arg arg_string; grpc_arg to_add[2]; grpc_channel_args *ch_args; - + arg_int.key = "int_arg"; arg_int.type = GRPC_ARG_INTEGER; arg_int.value.integer = 123; @@ -57,7 +57,7 @@ static void test_create(void) { to_add[0] = arg_int; to_add[1] = arg_string; ch_args = grpc_channel_args_copy_and_add(NULL, to_add, 2); - + GPR_ASSERT(ch_args->num_args == 2); GPR_ASSERT(strcmp(ch_args->args[0].key, arg_int.key) == 0); GPR_ASSERT(ch_args->args[0].type == arg_int.type); @@ -84,7 +84,7 @@ static void test_set_compression_algorithm(void) { } static void test_compression_algorithm_states(void) { - grpc_channel_args *ch_args; + grpc_channel_args *ch_args, *ch_args_wo_gzip, *ch_args_wo_gzip_deflate; int states_bitset; size_t i; @@ -97,12 +97,15 @@ static void test_compression_algorithm_states(void) { } /* disable gzip and deflate */ - ch_args = grpc_channel_args_compression_algorithm_set_state( - ch_args, GRPC_COMPRESS_GZIP, 0); - ch_args = grpc_channel_args_compression_algorithm_set_state( - ch_args, GRPC_COMPRESS_DEFLATE, 0); - - states_bitset = grpc_channel_args_compression_algorithm_get_states(ch_args); + ch_args_wo_gzip = grpc_channel_args_compression_algorithm_set_state( + &ch_args, GRPC_COMPRESS_GZIP, 0); + GPR_ASSERT(ch_args == ch_args_wo_gzip); + ch_args_wo_gzip_deflate = grpc_channel_args_compression_algorithm_set_state( + &ch_args_wo_gzip, GRPC_COMPRESS_DEFLATE, 0); + GPR_ASSERT(ch_args_wo_gzip == ch_args_wo_gzip_deflate); + + states_bitset = grpc_channel_args_compression_algorithm_get_states( + ch_args_wo_gzip_deflate); for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) { if (i == GRPC_COMPRESS_GZIP || i == GRPC_COMPRESS_DEFLATE) { GPR_ASSERT(GPR_BITGET(states_bitset, i) == 0); @@ -112,10 +115,12 @@ static void test_compression_algorithm_states(void) { } /* re-enabled gzip only */ - ch_args = grpc_channel_args_compression_algorithm_set_state( - ch_args, GRPC_COMPRESS_GZIP, 1); + ch_args_wo_gzip = grpc_channel_args_compression_algorithm_set_state( + &ch_args_wo_gzip_deflate, GRPC_COMPRESS_GZIP, 1); + GPR_ASSERT(ch_args_wo_gzip == ch_args_wo_gzip_deflate); - states_bitset = grpc_channel_args_compression_algorithm_get_states(ch_args); + states_bitset = + grpc_channel_args_compression_algorithm_get_states(ch_args_wo_gzip); for (i = 0; i < GRPC_COMPRESS_ALGORITHMS_COUNT; i++) { if (i == GRPC_COMPRESS_DEFLATE) { GPR_ASSERT(GPR_BITGET(states_bitset, i) == 0); From 2e49a355b64e2fec5f00995b8ba2dba1afef9700 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 24 Aug 2015 14:40:45 -0700 Subject: [PATCH 53/79] Fixed KVO test --- src/objective-c/tests/GRPCClientTests.m | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/objective-c/tests/GRPCClientTests.m b/src/objective-c/tests/GRPCClientTests.m index fa604211e2b..09a55e07045 100644 --- a/src/objective-c/tests/GRPCClientTests.m +++ b/src/objective-c/tests/GRPCClientTests.m @@ -79,7 +79,7 @@ static ProtoMethod *kUnaryCallMethod; - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { _callback(keyPath, object, change); - [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + [object removeObserver:self forKeyPath:keyPath]; } @end @@ -219,16 +219,16 @@ static ProtoMethod *kUnaryCallMethod; __weak XCTestExpectation *completion = [self expectationWithDescription:@"Empty RPC completed."]; __weak XCTestExpectation *metadata = [self expectationWithDescription:@"Metadata changed."]; - PassthroughObserver *observer = [[PassthroughObserver alloc] initWithCallback:^(NSString *keypath, id object, NSDictionary * change) { - if (keypath == @"responseHeaders") { - [expectation fulfill]; - } - }] - GRPCCall *call = [[GRPCCall alloc] initWithHost:kHostAddress path:kEmptyCallMethod.HTTPPath requestsWriter:[GRXWriter writerWithValue:[NSData data]]]; + PassthroughObserver *observer = [[PassthroughObserver alloc] initWithCallback:^(NSString *keypath, id object, NSDictionary * change) { + if ([keypath isEqual: @"responseHeaders"]) { + [metadata fulfill]; + } + }]; + [call addObserver:observer forKeyPath:@"responseHeaders" options:0 context:NULL]; id responsesWriteable = [[GRXWriteable alloc] initWithValueHandler:^(NSData *value) { From 1359a126a7d91ad827ccc39baad8ebf30d06c0f6 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 14:43:32 -0700 Subject: [PATCH 54/79] Added some clarification --- include/grpc/grpc.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 860048711f0..101fc88d8f6 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -590,9 +590,11 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *call, void grpc_call_destroy(grpc_call *call); /** Request notification of a new call. - Once a call is received in \a cq_bound_to_call, a notification tagged with - \a tag_new is added to \a cq_for_notification. \a call, \a details and \a - request_metadata are updated with the appropriate call information. + Once a call is received, a notification tagged with \a tag_new is added to + \a cq_for_notification. \a call, \a details and \a request_metadata are + updated with the appropriate call information. \a cq_bound_to_call is bound + to \a call, and batch operation notifications for that call will be posted + to \a cq_bound_to_call. Note that \a cq_for_notification must have been registered to the server via \a grpc_server_register_completion_queue. */ grpc_call_error grpc_server_request_call( From c9dc74b2cd8f57c1b6b1770c43c9f0e861c566c0 Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Mon, 24 Aug 2015 21:59:03 +0000 Subject: [PATCH 55/79] Fix parameter reassignment defect This defect was introduced in 515b0a93526a. --- src/python/grpcio/grpc/_links/service.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio/grpc/_links/service.py b/src/python/grpcio/grpc/_links/service.py index 5c636d61abc..7aca36272d4 100644 --- a/src/python/grpcio/grpc/_links/service.py +++ b/src/python/grpcio/grpc/_links/service.py @@ -257,11 +257,11 @@ class _Kernel(object): termination = None else: termination = links.Ticket.Termination.COMPLETION - ticket = links.Ticket( + early_read_ticket = links.Ticket( call, rpc_state.sequence_number, None, None, None, None, None, None, payload, None, None, None, termination) rpc_state.sequence_number += 1 - self._relay.add_value(ticket) + self._relay.add_value(early_read_ticket) if ticket.payload is not None: call.write(rpc_state.response_serializer(ticket.payload), call) From f637573b95b73400e81e038176451fb4c466e523 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2015 15:12:39 -0700 Subject: [PATCH 56/79] make unneeded API internal-only, update docs --- src/csharp/Grpc.Core/AsyncClientStreamingCall.cs | 2 +- src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs | 2 +- src/csharp/Grpc.Core/AsyncServerStreamingCall.cs | 2 +- src/csharp/Grpc.Core/AsyncUnaryCall.cs | 2 +- src/csharp/Grpc.Core/Metadata.cs | 12 +++++------- 5 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs index dbaa3085c54..6036f4c7bb9 100644 --- a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs @@ -49,7 +49,7 @@ namespace Grpc.Core readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncClientStreamingCall(IClientStreamWriter requestStream, Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + internal AsyncClientStreamingCall(IClientStreamWriter requestStream, Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.requestStream = requestStream; this.responseAsync = responseAsync; diff --git a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs index ee7ba29695b..ea7cb4727b7 100644 --- a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs @@ -48,7 +48,7 @@ namespace Grpc.Core readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncDuplexStreamingCall(IClientStreamWriter requestStream, IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + internal AsyncDuplexStreamingCall(IClientStreamWriter requestStream, IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.requestStream = requestStream; this.responseStream = responseStream; diff --git a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs index 2853a79ce68..d00fa8defd7 100644 --- a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs @@ -47,7 +47,7 @@ namespace Grpc.Core readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncServerStreamingCall(IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + internal AsyncServerStreamingCall(IAsyncStreamReader responseStream, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.responseStream = responseStream; this.responseHeadersAsync = responseHeadersAsync; diff --git a/src/csharp/Grpc.Core/AsyncUnaryCall.cs b/src/csharp/Grpc.Core/AsyncUnaryCall.cs index 154a17a33ef..fb51bd65e7c 100644 --- a/src/csharp/Grpc.Core/AsyncUnaryCall.cs +++ b/src/csharp/Grpc.Core/AsyncUnaryCall.cs @@ -48,7 +48,7 @@ namespace Grpc.Core readonly Func getTrailersFunc; readonly Action disposeAction; - public AsyncUnaryCall(Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) + internal AsyncUnaryCall(Task responseAsync, Task responseHeadersAsync, Func getStatusFunc, Func getTrailersFunc, Action disposeAction) { this.responseAsync = responseAsync; this.responseHeadersAsync = responseHeadersAsync; diff --git a/src/csharp/Grpc.Core/Metadata.cs b/src/csharp/Grpc.Core/Metadata.cs index a589b50caad..79d25696a1d 100644 --- a/src/csharp/Grpc.Core/Metadata.cs +++ b/src/csharp/Grpc.Core/Metadata.cs @@ -41,7 +41,7 @@ using Grpc.Core.Utils; namespace Grpc.Core { /// - /// Provides access to read and write metadata values to be exchanged during a call. + /// A collection of metadata entries that can be exchanged during a call. /// public sealed class Metadata : IList { @@ -58,21 +58,19 @@ namespace Grpc.Core readonly List entries; bool readOnly; + /// + /// Initializes a new instance of Metadata. + /// public Metadata() { this.entries = new List(); } - public Metadata(ICollection entries) - { - this.entries = new List(entries); - } - /// /// Makes this object read-only. /// /// this object - public Metadata Freeze() + internal Metadata Freeze() { this.readOnly = true; return this; From 9d1f0c4a0c31e18e21770cfaf5a29ed1db94da89 Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 24 Aug 2015 16:08:36 -0700 Subject: [PATCH 57/79] Fix merge failures --- BUILD | 4 ++-- build.json | 4 ++-- src/cpp/server/dynamic_thread_pool.h | 9 ++++----- src/cpp/server/fixed_size_thread_pool.h | 7 +++---- tools/run_tests/sources_and_headers.json | 8 ++++---- .../grpc_plugin_support/grpc_plugin_support.vcxproj | 4 ++-- 6 files changed, 17 insertions(+), 19 deletions(-) diff --git a/BUILD b/BUILD index f72106177f4..257f12f1529 100644 --- a/BUILD +++ b/BUILD @@ -854,8 +854,8 @@ cc_library( cc_library( name = "grpc_plugin_support", srcs = [ - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", "src/compiler/config.h", "src/compiler/cpp_generator.h", "src/compiler/cpp_generator_helpers.h", diff --git a/build.json b/build.json index 17a99b6a1cf..414b95795db 100644 --- a/build.json +++ b/build.json @@ -697,8 +697,8 @@ "build": "protoc", "language": "c++", "headers": [ - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", "src/compiler/config.h", "src/compiler/cpp_generator.h", "src/compiler/cpp_generator_helpers.h", diff --git a/src/cpp/server/dynamic_thread_pool.h b/src/cpp/server/dynamic_thread_pool.h index a4683eefc4c..5ba7533c05f 100644 --- a/src/cpp/server/dynamic_thread_pool.h +++ b/src/cpp/server/dynamic_thread_pool.h @@ -34,15 +34,14 @@ #ifndef GRPC_INTERNAL_CPP_DYNAMIC_THREAD_POOL_H #define GRPC_INTERNAL_CPP_DYNAMIC_THREAD_POOL_H -#include - -#include -#include - #include #include #include +#include +#include +#include + #include "src/cpp/server/thread_pool_interface.h" namespace grpc { diff --git a/src/cpp/server/fixed_size_thread_pool.h b/src/cpp/server/fixed_size_thread_pool.h index 65d3134ec48..394ae5821ec 100644 --- a/src/cpp/server/fixed_size_thread_pool.h +++ b/src/cpp/server/fixed_size_thread_pool.h @@ -34,13 +34,12 @@ #ifndef GRPC_INTERNAL_CPP_FIXED_SIZE_THREAD_POOL_H #define GRPC_INTERNAL_CPP_FIXED_SIZE_THREAD_POOL_H -#include +#include +#include #include #include - -#include -#include +#include #include "src/cpp/server/thread_pool_interface.h" diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index f48e3158657..0fe5f68d6ac 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -13396,8 +13396,8 @@ { "deps": [], "headers": [ - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", "src/compiler/config.h", "src/compiler/cpp_generator.h", "src/compiler/cpp_generator_helpers.h", @@ -13415,8 +13415,8 @@ "language": "c++", "name": "grpc_plugin_support", "src": [ - "include/grpc++/config.h", - "include/grpc++/config_protobuf.h", + "include/grpc++/support/config.h", + "include/grpc++/support/config_protobuf.h", "src/compiler/config.h", "src/compiler/cpp_generator.cc", "src/compiler/cpp_generator.h", diff --git a/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj b/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj index 444d796137e..9f098d10a10 100644 --- a/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj +++ b/vsprojects/grpc_plugin_support/grpc_plugin_support.vcxproj @@ -122,8 +122,8 @@ - - + + From 049e1dfd76e1453a77cd6435b24988e6090a13e4 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Mon, 24 Aug 2015 16:27:21 -0700 Subject: [PATCH 58/79] Made udp_server.c compile for iOS --- src/core/iomgr/udp_server.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/iomgr/udp_server.c b/src/core/iomgr/udp_server.c index 16482c08f72..6429c38b289 100644 --- a/src/core/iomgr/udp_server.c +++ b/src/core/iomgr/udp_server.c @@ -235,8 +235,10 @@ static int prepare_socket(int fd, const struct sockaddr *addr, int addr_len) { rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip, sizeof(get_local_ip)); if (rc == 0 && addr->sa_family == AF_INET6) { +#if !TARGET_OS_IPHONE rc = setsockopt(fd, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip, sizeof(get_local_ip)); +#endif } if (bind(fd, addr, addr_len) < 0) { From 16f6dac8e81a818f399b180c673d966cd40603c1 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 17:00:04 -0700 Subject: [PATCH 59/79] Make googletest a submodule --- .gitmodules | 3 +++ Makefile | 8 +++----- templates/Makefile.template | 8 +++----- third_party/googletest | 1 + 4 files changed, 10 insertions(+), 10 deletions(-) create mode 160000 third_party/googletest diff --git a/.gitmodules b/.gitmodules index a5cf3aaaee0..434d01b3d5f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -12,3 +12,6 @@ [submodule "third_party/gflags"] path = third_party/gflags url = https://github.com/gflags/gflags.git +[submodule "third_party/googletest"] + path = third_party/googletest + url = git://github.com/google/googletest diff --git a/Makefile b/Makefile index e5a7a2c7bfa..1053c517fe4 100644 --- a/Makefile +++ b/Makefile @@ -299,11 +299,7 @@ LIBS = m z pthread LDFLAGS += -pthread endif -ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),) -GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest -else -GTEST_LIB = -lgtest -endif +GTEST_LIB = -Ithird_party/googletest/include -Ithird_party/googletest third_party/googletest/src/gtest-all.cc GTEST_LIB += -lgflags ifeq ($(V),1) E = @: @@ -612,6 +608,8 @@ PROTOBUF_PKG_CONFIG = false PC_REQUIRES_GRPCXX = PC_LIBS_GRPCXX = +CPPFLAGS := -Ithird_party/googletest/include $(CPPFLAGS) + ifeq ($(HAS_SYSTEM_PROTOBUF),true) ifeq ($(HAS_PKG_CONFIG),true) PROTOBUF_PKG_CONFIG = true diff --git a/templates/Makefile.template b/templates/Makefile.template index 1b898efbdda..00582a22f8d 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -313,11 +313,7 @@ LIBS = m z pthread LDFLAGS += -pthread endif -ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),) -GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest -else -GTEST_LIB = -lgtest -endif +GTEST_LIB = -Ithird_party/googletest/include -Ithird_party/googletest third_party/googletest/src/gtest-all.cc GTEST_LIB += -lgflags ifeq ($(V),1) E = @: @@ -637,6 +633,8 @@ PROTOBUF_PKG_CONFIG = false PC_REQUIRES_GRPCXX = PC_LIBS_GRPCXX = +CPPFLAGS := -Ithird_party/googletest/include $(CPPFLAGS) + ifeq ($(HAS_SYSTEM_PROTOBUF),true) ifeq ($(HAS_PKG_CONFIG),true) PROTOBUF_PKG_CONFIG = true diff --git a/third_party/googletest b/third_party/googletest new file mode 160000 index 00000000000..c80449247c0 --- /dev/null +++ b/third_party/googletest @@ -0,0 +1 @@ +Subproject commit c80449247c0e3032401297edf19a1be8078900cc From ef2e4d82082c3b41054c34641226cc138231eb33 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 17:12:38 -0700 Subject: [PATCH 60/79] Update sanity --- tools/run_tests/run_sanity.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh index 18d5ba026e6..8cd011b5335 100755 --- a/tools/run_tests/run_sanity.sh +++ b/tools/run_tests/run_sanity.sh @@ -44,6 +44,7 @@ git submodule > $submodules diff -u $submodules - << EOF 05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f) + c80449247c0e3032401297edf19a1be8078900cc third_party/googletest (heads/master) 33dd08320648ac71d7d9d732be774ed3818dccc5 third_party/openssl (OpenSSL_1_0_2d) 3e2c8a5dd79481e1d36572cdf65be93514ba6581 third_party/protobuf (v3.0.0-alpha-1-1048-g3e2c8a5) 50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8) From 8d8a52cd586e75f2b93ad6eb321bf7d5ac4953f6 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 24 Aug 2015 17:18:32 -0700 Subject: [PATCH 61/79] Update to v1.7 --- third_party/googletest | 2 +- tools/run_tests/run_sanity.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/third_party/googletest b/third_party/googletest index c80449247c0..c99458533a9 160000 --- a/third_party/googletest +++ b/third_party/googletest @@ -1 +1 @@ -Subproject commit c80449247c0e3032401297edf19a1be8078900cc +Subproject commit c99458533a9b4c743ed51537e25989ea55944908 diff --git a/tools/run_tests/run_sanity.sh b/tools/run_tests/run_sanity.sh index 8cd011b5335..ac331b54d32 100755 --- a/tools/run_tests/run_sanity.sh +++ b/tools/run_tests/run_sanity.sh @@ -44,7 +44,7 @@ git submodule > $submodules diff -u $submodules - << EOF 05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f) - c80449247c0e3032401297edf19a1be8078900cc third_party/googletest (heads/master) + c99458533a9b4c743ed51537e25989ea55944908 third_party/googletest (release-1.7.0) 33dd08320648ac71d7d9d732be774ed3818dccc5 third_party/openssl (OpenSSL_1_0_2d) 3e2c8a5dd79481e1d36572cdf65be93514ba6581 third_party/protobuf (v3.0.0-alpha-1-1048-g3e2c8a5) 50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8) From 12855fc68201962311ba1474243809e2d3953964 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2015 16:43:23 -0700 Subject: [PATCH 62/79] polishing public docs --- src/csharp/Grpc.Auth/AuthInterceptors.cs | 6 ++- .../Grpc.Core/AsyncClientStreamingCall.cs | 2 + .../Grpc.Core/AsyncDuplexStreamingCall.cs | 2 + .../Grpc.Core/AsyncServerStreamingCall.cs | 1 + src/csharp/Grpc.Core/AsyncUnaryCall.cs | 1 + src/csharp/Grpc.Core/CallInvocationDetails.cs | 10 ++-- src/csharp/Grpc.Core/CallOptions.cs | 3 ++ src/csharp/Grpc.Core/Calls.cs | 1 + src/csharp/Grpc.Core/Channel.cs | 5 +- src/csharp/Grpc.Core/ChannelOptions.cs | 24 ++++++++- src/csharp/Grpc.Core/ClientBase.cs | 9 ++++ .../Grpc.Core/ContextPropagationToken.cs | 8 +-- src/csharp/Grpc.Core/IAsyncStreamReader.cs | 2 +- src/csharp/Grpc.Core/IAsyncStreamWriter.cs | 4 +- src/csharp/Grpc.Core/IClientStreamWriter.cs | 2 +- .../Grpc.Core/Internal/CallSafeHandle.cs | 2 +- .../Internal/ChannelArgsSafeHandle.cs | 2 +- .../Grpc.Core/Internal/ChannelSafeHandle.cs | 2 +- .../Internal/CompletionQueueSafeHandle.cs | 2 +- .../Internal/CredentialsSafeHandle.cs | 2 +- .../Internal/MetadataArraySafeHandle.cs | 2 +- .../Internal/ServerCredentialsSafeHandle.cs | 2 +- src/csharp/Grpc.Core/Metadata.cs | 12 +++-- src/csharp/Grpc.Core/Method.cs | 2 + src/csharp/Grpc.Core/Server.cs | 8 ++- src/csharp/Grpc.Core/ServerCallContext.cs | 10 ++++ src/csharp/Grpc.Core/ServerMethods.cs | 8 +++ .../Grpc.Core/ServerServiceDefinition.cs | 50 +++++++++++++++++++ src/csharp/Grpc.Core/Utils/Preconditions.cs | 9 ++++ src/csharp/Grpc.Core/WriteOptions.cs | 7 +++ .../Grpc.HealthCheck/HealthServiceImpl.cs | 6 +++ src/csharp/doc/grpc_csharp_public.shfbproj | 12 ++++- 32 files changed, 191 insertions(+), 27 deletions(-) diff --git a/src/csharp/Grpc.Auth/AuthInterceptors.cs b/src/csharp/Grpc.Auth/AuthInterceptors.cs index 61338f7f0e2..c8ab4d9af6f 100644 --- a/src/csharp/Grpc.Auth/AuthInterceptors.cs +++ b/src/csharp/Grpc.Auth/AuthInterceptors.cs @@ -41,7 +41,8 @@ using Grpc.Core.Utils; namespace Grpc.Auth { /// - /// Factory methods to create authorization interceptors. + /// Factory methods to create authorization interceptors. Interceptors created can be registered with gRPC client classes (autogenerated client stubs that + /// inherit from ). /// public static class AuthInterceptors { @@ -52,6 +53,8 @@ namespace Grpc.Auth /// Creates interceptor that will obtain access token from any credential type that implements /// ITokenAccess. (e.g. GoogleCredential). /// + /// The credential to use to obtain access tokens. + /// The header interceptor. public static HeaderInterceptor FromCredential(ITokenAccess credential) { return new HeaderInterceptor((method, authUri, metadata) => @@ -67,6 +70,7 @@ namespace Grpc.Auth /// Creates OAuth2 interceptor that will use given access token as authorization. /// /// OAuth2 access token. + /// The header interceptor. public static HeaderInterceptor FromAccessToken(string accessToken) { Preconditions.CheckNotNull(accessToken); diff --git a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs index 6036f4c7bb9..5646fed3d96 100644 --- a/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncClientStreamingCall.cs @@ -40,6 +40,8 @@ namespace Grpc.Core /// /// Return type for client streaming calls. /// + /// Request message type for this call. + /// Response message type for this call. public sealed class AsyncClientStreamingCall : IDisposable { readonly IClientStreamWriter requestStream; diff --git a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs index ea7cb4727b7..e75108c7e57 100644 --- a/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncDuplexStreamingCall.cs @@ -39,6 +39,8 @@ namespace Grpc.Core /// /// Return type for bidirectional streaming calls. /// + /// Request message type for this call. + /// Response message type for this call. public sealed class AsyncDuplexStreamingCall : IDisposable { readonly IClientStreamWriter requestStream; diff --git a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs index d00fa8defd7..f9530919848 100644 --- a/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs +++ b/src/csharp/Grpc.Core/AsyncServerStreamingCall.cs @@ -39,6 +39,7 @@ namespace Grpc.Core /// /// Return type for server streaming calls. /// + /// Response message type for this call. public sealed class AsyncServerStreamingCall : IDisposable { readonly IAsyncStreamReader responseStream; diff --git a/src/csharp/Grpc.Core/AsyncUnaryCall.cs b/src/csharp/Grpc.Core/AsyncUnaryCall.cs index fb51bd65e7c..97df8f5e91b 100644 --- a/src/csharp/Grpc.Core/AsyncUnaryCall.cs +++ b/src/csharp/Grpc.Core/AsyncUnaryCall.cs @@ -40,6 +40,7 @@ namespace Grpc.Core /// /// Return type for single request - single response call. /// + /// Response message type for this call. public sealed class AsyncUnaryCall : IDisposable { readonly Task responseAsync; diff --git a/src/csharp/Grpc.Core/CallInvocationDetails.cs b/src/csharp/Grpc.Core/CallInvocationDetails.cs index 6565073fc5e..8228b8f317f 100644 --- a/src/csharp/Grpc.Core/CallInvocationDetails.cs +++ b/src/csharp/Grpc.Core/CallInvocationDetails.cs @@ -40,6 +40,8 @@ namespace Grpc.Core /// /// Details about a client-side call to be invoked. /// + /// Request message type for the call. + /// Response message type for the call. public struct CallInvocationDetails { readonly Channel channel; @@ -50,7 +52,7 @@ namespace Grpc.Core CallOptions options; /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// /// Channel to use for this call. /// Method to call. @@ -61,7 +63,7 @@ namespace Grpc.Core } /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// /// Channel to use for this call. /// Method to call. @@ -73,7 +75,7 @@ namespace Grpc.Core } /// - /// Initializes a new instance of the struct. + /// Initializes a new instance of the struct. /// /// Channel to use for this call. /// Qualified method name. @@ -158,7 +160,7 @@ namespace Grpc.Core } /// - /// Returns new instance of with + /// Returns new instance of with /// Options set to the value provided. Values of all other fields are preserved. /// public CallInvocationDetails WithOptions(CallOptions options) diff --git a/src/csharp/Grpc.Core/CallOptions.cs b/src/csharp/Grpc.Core/CallOptions.cs index 3dfe80b48ce..c3bc9c31564 100644 --- a/src/csharp/Grpc.Core/CallOptions.cs +++ b/src/csharp/Grpc.Core/CallOptions.cs @@ -118,6 +118,7 @@ namespace Grpc.Core /// Returns new instance of with /// Headers set to the value provided. Values of all other fields are preserved. /// + /// The headers. public CallOptions WithHeaders(Metadata headers) { var newOptions = this; @@ -129,6 +130,7 @@ namespace Grpc.Core /// Returns new instance of with /// Deadline set to the value provided. Values of all other fields are preserved. /// + /// The deadline. public CallOptions WithDeadline(DateTime deadline) { var newOptions = this; @@ -140,6 +142,7 @@ namespace Grpc.Core /// Returns new instance of with /// CancellationToken set to the value provided. Values of all other fields are preserved. /// + /// The cancellation token. public CallOptions WithCancellationToken(CancellationToken cancellationToken) { var newOptions = this; diff --git a/src/csharp/Grpc.Core/Calls.cs b/src/csharp/Grpc.Core/Calls.cs index e57ac89db37..94b3c2fe655 100644 --- a/src/csharp/Grpc.Core/Calls.cs +++ b/src/csharp/Grpc.Core/Calls.cs @@ -100,6 +100,7 @@ namespace Grpc.Core /// Invokes a client streaming call asynchronously. /// In client streaming scenario, client sends a stream of requests and server responds with a single response. /// + /// The call defintion. /// An awaitable call object providing access to the response. /// Type of request messages. /// The of response message. diff --git a/src/csharp/Grpc.Core/Channel.cs b/src/csharp/Grpc.Core/Channel.cs index c11b320a647..f1942727cde 100644 --- a/src/csharp/Grpc.Core/Channel.cs +++ b/src/csharp/Grpc.Core/Channel.cs @@ -43,7 +43,9 @@ using Grpc.Core.Utils; namespace Grpc.Core { /// - /// gRPC Channel + /// Represents a gRPC channel. Channels are an abstraction of long-lived connections to remote servers. + /// More client objects can reuse the same channel. Creating a channel is an expensive operation compared to invoking + /// a remote call so in general you should reuse a single channel for as many calls as possible. /// public class Channel { @@ -161,6 +163,7 @@ namespace Grpc.Core /// There is no need to call this explicitly unless your use case requires that. /// Starting an RPC on a new channel will request connection implicitly. /// + /// The deadline. null indicates no deadline. public async Task ConnectAsync(DateTime? deadline = null) { var currentState = handle.CheckConnectivityState(true); diff --git a/src/csharp/Grpc.Core/ChannelOptions.cs b/src/csharp/Grpc.Core/ChannelOptions.cs index ad54b46ad59..f5ef63af544 100644 --- a/src/csharp/Grpc.Core/ChannelOptions.cs +++ b/src/csharp/Grpc.Core/ChannelOptions.cs @@ -44,9 +44,19 @@ namespace Grpc.Core /// public sealed class ChannelOption { + /// + /// Type of ChannelOption. + /// public enum OptionType { + /// + /// Channel option with integer value. + /// Integer, + + /// + /// Channel option with string value. + /// String } @@ -79,6 +89,9 @@ namespace Grpc.Core this.intValue = intValue; } + /// + /// Gets the type of the ChannelOption. + /// public OptionType Type { get @@ -87,6 +100,9 @@ namespace Grpc.Core } } + /// + /// Gets the name of the ChannelOption. + /// public string Name { get @@ -95,6 +111,9 @@ namespace Grpc.Core } } + /// + /// Gets the integer value the ChannelOption. + /// public int IntValue { get @@ -104,6 +123,9 @@ namespace Grpc.Core } } + /// + /// Gets the string value the ChannelOption. + /// public string StringValue { get @@ -140,7 +162,7 @@ namespace Grpc.Core /// Primary user agent: goes at the start of the user-agent metadata public const string PrimaryUserAgentString = "grpc.primary_user_agent"; - /// Secondary user agent: goes at the end of the user-agent metadata + /// Secondary user agent: goes at the end of the user-agent metadata public const string SecondaryUserAgentString = "grpc.secondary_user_agent"; /// diff --git a/src/csharp/Grpc.Core/ClientBase.cs b/src/csharp/Grpc.Core/ClientBase.cs index 903449439b4..f4533e735cb 100644 --- a/src/csharp/Grpc.Core/ClientBase.cs +++ b/src/csharp/Grpc.Core/ClientBase.cs @@ -53,6 +53,10 @@ namespace Grpc.Core readonly Channel channel; readonly string authUriBase; + /// + /// Initializes a new instance of ClientBase class. + /// + /// The channel to use for remote call invocation. public ClientBase(Channel channel) { this.channel = channel; @@ -95,6 +99,11 @@ namespace Grpc.Core /// /// Creates a new call to given method. /// + /// The method to invoke. + /// The call options. + /// Request message type. + /// Response message type. + /// The call invocation details. protected CallInvocationDetails CreateCall(Method method, CallOptions options) where TRequest : class where TResponse : class diff --git a/src/csharp/Grpc.Core/ContextPropagationToken.cs b/src/csharp/Grpc.Core/ContextPropagationToken.cs index a5bf1b5a703..1d899b97fd5 100644 --- a/src/csharp/Grpc.Core/ContextPropagationToken.cs +++ b/src/csharp/Grpc.Core/ContextPropagationToken.cs @@ -44,8 +44,8 @@ namespace Grpc.Core /// In situations when a backend is making calls to another backend, /// it makes sense to propagate properties like deadline and cancellation /// token of the server call to the child call. - /// C core provides some other contexts (like tracing context) that - /// are not accessible to C# layer, but this token still allows propagating them. + /// The gRPC native layer provides some other contexts (like tracing context) that + /// are not accessible to explicitly C# layer, but this token still allows propagating them. /// public class ContextPropagationToken { @@ -143,13 +143,13 @@ namespace Grpc.Core this.propagateCancellation = propagateCancellation; } - /// true if parent call's deadline should be propagated to the child call. + /// true if parent call's deadline should be propagated to the child call. public bool IsPropagateDeadline { get { return this.propagateDeadline; } } - /// true if parent call's cancellation token should be propagated to the child call. + /// true if parent call's cancellation token should be propagated to the child call. public bool IsPropagateCancellation { get { return this.propagateCancellation; } diff --git a/src/csharp/Grpc.Core/IAsyncStreamReader.cs b/src/csharp/Grpc.Core/IAsyncStreamReader.cs index c0a0674e500..49e1ea78325 100644 --- a/src/csharp/Grpc.Core/IAsyncStreamReader.cs +++ b/src/csharp/Grpc.Core/IAsyncStreamReader.cs @@ -42,7 +42,7 @@ namespace Grpc.Core /// /// A stream of messages to be read. /// - /// + /// The message type. public interface IAsyncStreamReader : IAsyncEnumerator { // TODO(jtattermusch): consider just using IAsyncEnumerator instead of this interface. diff --git a/src/csharp/Grpc.Core/IAsyncStreamWriter.cs b/src/csharp/Grpc.Core/IAsyncStreamWriter.cs index 4e2acb9c712..9c0d2d312eb 100644 --- a/src/csharp/Grpc.Core/IAsyncStreamWriter.cs +++ b/src/csharp/Grpc.Core/IAsyncStreamWriter.cs @@ -42,7 +42,7 @@ namespace Grpc.Core /// /// A writable stream of messages. /// - /// + /// The message type. public interface IAsyncStreamWriter { /// @@ -56,7 +56,7 @@ namespace Grpc.Core /// If null, default options will be used. /// Once set, this property maintains its value across subsequent /// writes. - /// The write options. + /// WriteOptions WriteOptions { get; set; } } } diff --git a/src/csharp/Grpc.Core/IClientStreamWriter.cs b/src/csharp/Grpc.Core/IClientStreamWriter.cs index a3028bc3741..3fd0774db57 100644 --- a/src/csharp/Grpc.Core/IClientStreamWriter.cs +++ b/src/csharp/Grpc.Core/IClientStreamWriter.cs @@ -42,7 +42,7 @@ namespace Grpc.Core /// /// Client-side writable stream of messages with Close capability. /// - /// + /// The message type. public interface IClientStreamWriter : IAsyncStreamWriter { /// diff --git a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs index 0f187529e81..c3611a7761f 100644 --- a/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CallSafeHandle.cs @@ -38,7 +38,7 @@ using Grpc.Core.Utils; namespace Grpc.Core.Internal { /// - /// grpc_call from + /// grpc_call from grpc/grpc.h /// internal class CallSafeHandle : SafeHandleZeroIsInvalid, INativeCall { diff --git a/src/csharp/Grpc.Core/Internal/ChannelArgsSafeHandle.cs b/src/csharp/Grpc.Core/Internal/ChannelArgsSafeHandle.cs index c12aec5a3a4..ea5b52374e3 100644 --- a/src/csharp/Grpc.Core/Internal/ChannelArgsSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/ChannelArgsSafeHandle.cs @@ -35,7 +35,7 @@ using System.Threading.Tasks; namespace Grpc.Core.Internal { /// - /// grpc_channel_args from + /// grpc_channel_args from grpc/grpc.h /// internal class ChannelArgsSafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs b/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs index 8cef566c146..7a1c6e3dacd 100644 --- a/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/ChannelSafeHandle.cs @@ -36,7 +36,7 @@ using System.Threading.Tasks; namespace Grpc.Core.Internal { /// - /// grpc_channel from + /// grpc_channel from grpc/grpc.h /// internal class ChannelSafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs index f64f3d4175f..f7a3471bb4b 100644 --- a/src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CompletionQueueSafeHandle.cs @@ -35,7 +35,7 @@ using System.Threading.Tasks; namespace Grpc.Core.Internal { /// - /// grpc_completion_queue from + /// grpc_completion_queue from grpc/grpc.h /// internal class CompletionQueueSafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs b/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs index 8b4fa85e5db..feed3353624 100644 --- a/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/CredentialsSafeHandle.cs @@ -36,7 +36,7 @@ using System.Threading.Tasks; namespace Grpc.Core.Internal { /// - /// grpc_credentials from + /// grpc_credentials from grpc/grpc_security.h /// internal class CredentialsSafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs index 83994f67629..31b834c979a 100644 --- a/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/MetadataArraySafeHandle.cs @@ -35,7 +35,7 @@ using System.Threading.Tasks; namespace Grpc.Core.Internal { /// - /// grpc_metadata_array from + /// grpc_metadata_array from grpc/grpc.h /// internal class MetadataArraySafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Internal/ServerCredentialsSafeHandle.cs b/src/csharp/Grpc.Core/Internal/ServerCredentialsSafeHandle.cs index 37a4f5256bf..51e352a18ba 100644 --- a/src/csharp/Grpc.Core/Internal/ServerCredentialsSafeHandle.cs +++ b/src/csharp/Grpc.Core/Internal/ServerCredentialsSafeHandle.cs @@ -37,7 +37,7 @@ using Grpc.Core.Utils; namespace Grpc.Core.Internal { /// - /// grpc_server_credentials from + /// grpc_server_credentials from grpc/grpc_security.h /// internal class ServerCredentialsSafeHandle : SafeHandleZeroIsInvalid { diff --git a/src/csharp/Grpc.Core/Metadata.cs b/src/csharp/Grpc.Core/Metadata.cs index 79d25696a1d..99fe0b5478a 100644 --- a/src/csharp/Grpc.Core/Metadata.cs +++ b/src/csharp/Grpc.Core/Metadata.cs @@ -42,6 +42,12 @@ namespace Grpc.Core { /// /// A collection of metadata entries that can be exchanged during a call. + /// gRPC supports these types of metadata: + /// + /// Request headersare sent by the client at the beginning of a remote call before any request messages are sent. + /// Response headersare sent by the server at the beginning of a remote call handler before any response messages are sent. + /// Response trailersare sent by the server at the end of a remote call along with resulting call status. + /// /// public sealed class Metadata : IList { @@ -195,7 +201,7 @@ namespace Grpc.Core } /// - /// Initializes a new instance of the struct with a binary value. + /// Initializes a new instance of the struct with a binary value. /// /// Metadata key, needs to have suffix indicating a binary valued metadata entry. /// Value bytes. @@ -211,7 +217,7 @@ namespace Grpc.Core } /// - /// Initializes a new instance of the struct holding an ASCII value. + /// Initializes a new instance of the struct holding an ASCII value. /// /// Metadata key, must not use suffix indicating a binary valued metadata entry. /// Value string. Only ASCII characters are allowed. @@ -278,7 +284,7 @@ namespace Grpc.Core } /// - /// Returns a that represents the current . + /// Returns a that represents the current . /// public override string ToString() { diff --git a/src/csharp/Grpc.Core/Method.cs b/src/csharp/Grpc.Core/Method.cs index 4c53285893e..99162a7d5dd 100644 --- a/src/csharp/Grpc.Core/Method.cs +++ b/src/csharp/Grpc.Core/Method.cs @@ -84,6 +84,8 @@ namespace Grpc.Core /// /// A description of a remote method. /// + /// Request message type for this method. + /// Response message type for this method. public class Method : IMethod { readonly MethodType type; diff --git a/src/csharp/Grpc.Core/Server.cs b/src/csharp/Grpc.Core/Server.cs index 28f1686e20d..7c94d215618 100644 --- a/src/csharp/Grpc.Core/Server.cs +++ b/src/csharp/Grpc.Core/Server.cs @@ -44,7 +44,7 @@ using Grpc.Core.Utils; namespace Grpc.Core { /// - /// A gRPC server. + /// gRPC server. A single server can server arbitrary number of services and can listen on more than one ports. /// public class Server { @@ -324,6 +324,9 @@ namespace Grpc.Core server.AddServiceDefinitionInternal(serviceDefinition); } + /// + /// Gets enumerator for this collection. + /// public IEnumerator GetEnumerator() { return server.serviceDefinitionsList.GetEnumerator(); @@ -369,6 +372,9 @@ namespace Grpc.Core return Add(new ServerPort(host, port, credentials)); } + /// + /// Gets enumerator for this collection. + /// public IEnumerator GetEnumerator() { return server.serverPortList.GetEnumerator(); diff --git a/src/csharp/Grpc.Core/ServerCallContext.cs b/src/csharp/Grpc.Core/ServerCallContext.cs index 75d81c64f3a..09a6b882a62 100644 --- a/src/csharp/Grpc.Core/ServerCallContext.cs +++ b/src/csharp/Grpc.Core/ServerCallContext.cs @@ -72,6 +72,13 @@ namespace Grpc.Core this.writeOptionsHolder = writeOptionsHolder; } + /// + /// Asynchronously sends response headers for the current call to the client. This method may only be invoked once for each call and needs to be invoked + /// before any response messages are written. Writing the first response message implicitly sends empty response headers if WriteResponseHeadersAsync haven't + /// been called yet. + /// + /// The response headers to send. + /// The task that finished once response headers have been written. public Task WriteResponseHeadersAsync(Metadata responseHeaders) { return writeHeadersFunc(responseHeaders); @@ -186,6 +193,9 @@ namespace Grpc.Core /// public interface IHasWriteOptions { + /// + /// Gets or sets the write options. + /// WriteOptions WriteOptions { get; set; } } } diff --git a/src/csharp/Grpc.Core/ServerMethods.cs b/src/csharp/Grpc.Core/ServerMethods.cs index 1f119a80ffe..728f77cde57 100644 --- a/src/csharp/Grpc.Core/ServerMethods.cs +++ b/src/csharp/Grpc.Core/ServerMethods.cs @@ -38,6 +38,8 @@ namespace Grpc.Core /// /// Server-side handler for unary call. /// + /// Request message type for this method. + /// Response message type for this method. public delegate Task UnaryServerMethod(TRequest request, ServerCallContext context) where TRequest : class where TResponse : class; @@ -45,6 +47,8 @@ namespace Grpc.Core /// /// Server-side handler for client streaming call. /// + /// Request message type for this method. + /// Response message type for this method. public delegate Task ClientStreamingServerMethod(IAsyncStreamReader requestStream, ServerCallContext context) where TRequest : class where TResponse : class; @@ -52,6 +56,8 @@ namespace Grpc.Core /// /// Server-side handler for server streaming call. /// + /// Request message type for this method. + /// Response message type for this method. public delegate Task ServerStreamingServerMethod(TRequest request, IServerStreamWriter responseStream, ServerCallContext context) where TRequest : class where TResponse : class; @@ -59,6 +65,8 @@ namespace Grpc.Core /// /// Server-side handler for bidi streaming call. /// + /// Request message type for this method. + /// Response message type for this method. public delegate Task DuplexStreamingServerMethod(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) where TRequest : class where TResponse : class; diff --git a/src/csharp/Grpc.Core/ServerServiceDefinition.cs b/src/csharp/Grpc.Core/ServerServiceDefinition.cs index 94b0a320c30..deb1431ca36 100644 --- a/src/csharp/Grpc.Core/ServerServiceDefinition.cs +++ b/src/csharp/Grpc.Core/ServerServiceDefinition.cs @@ -40,6 +40,8 @@ namespace Grpc.Core { /// /// Mapping of method names to server call handlers. + /// Normally, the ServerServiceDefinition objects will be created by the BindService factory method + /// that is part of the autogenerated code for a protocol buffers service definition. /// public class ServerServiceDefinition { @@ -58,21 +60,41 @@ namespace Grpc.Core } } + /// + /// Creates a new builder object for ServerServiceDefinition. + /// + /// The service name. + /// The builder object. public static Builder CreateBuilder(string serviceName) { return new Builder(serviceName); } + /// + /// Builder class for . + /// public class Builder { readonly string serviceName; readonly Dictionary callHandlers = new Dictionary(); + /// + /// Creates a new instance of builder. + /// + /// The service name. public Builder(string serviceName) { this.serviceName = serviceName; } + /// + /// Adds a definitions for a single request - single response method. + /// + /// The request message class. + /// The response message class. + /// The method. + /// The method handler. + /// This builder instance. public Builder AddMethod( Method method, UnaryServerMethod handler) @@ -83,6 +105,14 @@ namespace Grpc.Core return this; } + /// + /// Adds a definitions for a client streaming method. + /// + /// The request message class. + /// The response message class. + /// The method. + /// The method handler. + /// This builder instance. public Builder AddMethod( Method method, ClientStreamingServerMethod handler) @@ -93,6 +123,14 @@ namespace Grpc.Core return this; } + /// + /// Adds a definitions for a server streaming method. + /// + /// The request message class. + /// The response message class. + /// The method. + /// The method handler. + /// This builder instance. public Builder AddMethod( Method method, ServerStreamingServerMethod handler) @@ -103,6 +141,14 @@ namespace Grpc.Core return this; } + /// + /// Adds a definitions for a bidirectional streaming method. + /// + /// The request message class. + /// The response message class. + /// The method. + /// The method handler. + /// This builder instance. public Builder AddMethod( Method method, DuplexStreamingServerMethod handler) @@ -113,6 +159,10 @@ namespace Grpc.Core return this; } + /// + /// Creates an immutable ServerServiceDefinition from this builder. + /// + /// The ServerServiceDefinition object. public ServerServiceDefinition Build() { return new ServerServiceDefinition(callHandlers); diff --git a/src/csharp/Grpc.Core/Utils/Preconditions.cs b/src/csharp/Grpc.Core/Utils/Preconditions.cs index 374262f87ad..a8ab603391f 100644 --- a/src/csharp/Grpc.Core/Utils/Preconditions.cs +++ b/src/csharp/Grpc.Core/Utils/Preconditions.cs @@ -43,6 +43,7 @@ namespace Grpc.Core.Utils /// /// Throws if condition is false. /// + /// The condition. public static void CheckArgument(bool condition) { if (!condition) @@ -54,6 +55,8 @@ namespace Grpc.Core.Utils /// /// Throws with given message if condition is false. /// + /// The condition. + /// The error message. public static void CheckArgument(bool condition, string errorMessage) { if (!condition) @@ -65,6 +68,7 @@ namespace Grpc.Core.Utils /// /// Throws if reference is null. /// + /// The reference. public static T CheckNotNull(T reference) { if (reference == null) @@ -77,6 +81,8 @@ namespace Grpc.Core.Utils /// /// Throws if reference is null. /// + /// The reference. + /// The parameter name. public static T CheckNotNull(T reference, string paramName) { if (reference == null) @@ -89,6 +95,7 @@ namespace Grpc.Core.Utils /// /// Throws if condition is false. /// + /// The condition. public static void CheckState(bool condition) { if (!condition) @@ -100,6 +107,8 @@ namespace Grpc.Core.Utils /// /// Throws with given message if condition is false. /// + /// The condition. + /// The error message. public static void CheckState(bool condition, string errorMessage) { if (!condition) diff --git a/src/csharp/Grpc.Core/WriteOptions.cs b/src/csharp/Grpc.Core/WriteOptions.cs index 7ef3189d762..7523ada84a8 100644 --- a/src/csharp/Grpc.Core/WriteOptions.cs +++ b/src/csharp/Grpc.Core/WriteOptions.cs @@ -66,11 +66,18 @@ namespace Grpc.Core private WriteFlags flags; + /// + /// Initializes a new instance of WriteOptions class. + /// + /// The write flags. public WriteOptions(WriteFlags flags = default(WriteFlags)) { this.flags = flags; } + /// + /// Gets the write flags. + /// public WriteFlags Flags { get diff --git a/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs b/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs index 3c3b9c35f13..8c04b43a86e 100644 --- a/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs +++ b/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs @@ -95,6 +95,12 @@ namespace Grpc.HealthCheck } } + /// + /// Performs a health status check. + /// + /// The check request. + /// The call context. + /// The asynchronous response. public Task Check(HealthCheckRequest request, ServerCallContext context) { lock (myLock) diff --git a/src/csharp/doc/grpc_csharp_public.shfbproj b/src/csharp/doc/grpc_csharp_public.shfbproj index 05c93f4a13f..d9b97498190 100644 --- a/src/csharp/doc/grpc_csharp_public.shfbproj +++ b/src/csharp/doc/grpc_csharp_public.shfbproj @@ -18,7 +18,8 @@ en-US - + + OnlyWarningsAndErrors Website False @@ -37,6 +38,15 @@ gRPC C# AboveNamespaces Documentation + + Provides OAuth2 based authentication for gRPC. <c>Grpc.Auth</c> currently consists of a set of very lightweight wrappers and uses C# <a href="https://www.nuget.org/packages/Google.Apis.Auth/">Google.Apis.Auth</a> library. +Main namespace for gRPC C# functionality. Contains concepts representing both client side and server side gRPC logic. + +<seealso cref="Grpc.Core.Channel"/> +<seealso cref="Grpc.Core.Server"/> +Provides functionality to redirect gRPC logs to application-specified destination. +Various utilities for gRPC C#. + Summary, Parameter, AutoDocumentCtors, Namespace, TypeParameter, AutoDocumentDispose From f209c587033d333705fe40ab349dc5ddda18df3a Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 24 Aug 2015 17:47:35 -0700 Subject: [PATCH 63/79] added generated docs --- doc/ref/csharp/.gitignore | 1 + doc/ref/csharp/html/SearchHelp.aspx | 233 ++++ doc/ref/csharp/html/SearchHelp.inc.php | 173 +++ doc/ref/csharp/html/SearchHelp.php | 58 + doc/ref/csharp/html/Web.Config | 31 + doc/ref/csharp/html/WebKI.xml | 1005 +++++++++++++++++ doc/ref/csharp/html/WebTOC.xml | 523 +++++++++ doc/ref/csharp/html/fti/FTI_100.json | 1 + doc/ref/csharp/html/fti/FTI_101.json | 1 + doc/ref/csharp/html/fti/FTI_102.json | 1 + doc/ref/csharp/html/fti/FTI_103.json | 1 + doc/ref/csharp/html/fti/FTI_104.json | 1 + doc/ref/csharp/html/fti/FTI_105.json | 1 + doc/ref/csharp/html/fti/FTI_107.json | 1 + doc/ref/csharp/html/fti/FTI_108.json | 1 + doc/ref/csharp/html/fti/FTI_109.json | 1 + doc/ref/csharp/html/fti/FTI_110.json | 1 + doc/ref/csharp/html/fti/FTI_111.json | 1 + doc/ref/csharp/html/fti/FTI_112.json | 1 + doc/ref/csharp/html/fti/FTI_113.json | 1 + doc/ref/csharp/html/fti/FTI_114.json | 1 + doc/ref/csharp/html/fti/FTI_115.json | 1 + doc/ref/csharp/html/fti/FTI_116.json | 1 + doc/ref/csharp/html/fti/FTI_117.json | 1 + doc/ref/csharp/html/fti/FTI_118.json | 1 + doc/ref/csharp/html/fti/FTI_119.json | 1 + doc/ref/csharp/html/fti/FTI_122.json | 1 + doc/ref/csharp/html/fti/FTI_97.json | 1 + doc/ref/csharp/html/fti/FTI_98.json | 1 + doc/ref/csharp/html/fti/FTI_99.json | 1 + doc/ref/csharp/html/fti/FTI_Files.json | 1 + .../html/Events_T_Grpc_Core_RpcException.htm | 3 + .../F_Grpc_Core_ChannelOptions_Census.htm | 2 + ...c_Core_ChannelOptions_DefaultAuthority.htm | 2 + ...nnelOptions_Http2InitialSequenceNumber.htm | 2 + ...re_ChannelOptions_MaxConcurrentStreams.htm | 2 + ...c_Core_ChannelOptions_MaxMessageLength.htm | 2 + ..._ChannelOptions_PrimaryUserAgentString.htm | 2 + ...hannelOptions_SecondaryUserAgentString.htm | 2 + ...e_ChannelOptions_SslTargetNameOverride.htm | 2 + ...Core_ContextPropagationOptions_Default.htm | 4 + ..._Grpc_Core_Metadata_BinaryHeaderSuffix.htm | 4 + .../html/html/F_Grpc_Core_Metadata_Empty.htm | 4 + .../F_Grpc_Core_ServerPort_PickUnused.htm | 5 + .../F_Grpc_Core_Status_DefaultCancelled.htm | 4 + .../F_Grpc_Core_Status_DefaultSuccess.htm | 4 + ...F_Grpc_Core_VersionInfo_CurrentVersion.htm | 4 + .../html/F_Grpc_Core_WriteOptions_Default.htm | 4 + .../Fields_T_Grpc_Core_ChannelOptions.htm | 3 + ..._T_Grpc_Core_ContextPropagationOptions.htm | 5 + .../html/html/Fields_T_Grpc_Core_Metadata.htm | 7 + .../html/Fields_T_Grpc_Core_ServerPort.htm | 6 + .../html/html/Fields_T_Grpc_Core_Status.htm | 7 + .../html/Fields_T_Grpc_Core_VersionInfo.htm | 5 + .../html/Fields_T_Grpc_Core_WriteOptions.htm | 5 + ..._Auth_AuthInterceptors_FromAccessToken.htm | 12 + ...c_Auth_AuthInterceptors_FromCredential.htm | 13 + ...ore_AsyncClientStreamingCall_2_Dispose.htm | 8 + ..._AsyncClientStreamingCall_2_GetAwaiter.htm | 5 + ...e_AsyncClientStreamingCall_2_GetStatus.htm | 6 + ...AsyncClientStreamingCall_2_GetTrailers.htm | 6 + ...ore_AsyncDuplexStreamingCall_2_Dispose.htm | 8 + ...e_AsyncDuplexStreamingCall_2_GetStatus.htm | 6 + ...AsyncDuplexStreamingCall_2_GetTrailers.htm | 6 + ...ore_AsyncServerStreamingCall_1_Dispose.htm | 8 + ...e_AsyncServerStreamingCall_1_GetStatus.htm | 6 + ...AsyncServerStreamingCall_1_GetTrailers.htm | 6 + .../M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm | 8 + ..._Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm | 5 + ...M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm | 6 + ...Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm | 6 + ...re_CallInvocationDetails_2_WithOptions.htm | 13 + ...rpc_Core_CallInvocationDetails_2__ctor.htm | 19 + ...c_Core_CallInvocationDetails_2__ctor_1.htm | 23 + ...c_Core_CallInvocationDetails_2__ctor_2.htm | 31 + ...Core_CallOptions_WithCancellationToken.htm | 13 + .../M_Grpc_Core_CallOptions_WithDeadline.htm | 13 + .../M_Grpc_Core_CallOptions_WithHeaders.htm | 13 + .../html/M_Grpc_Core_CallOptions__ctor.htm | 35 + ...Core_Calls_AsyncClientStreamingCall__2.htm | 19 + ...Core_Calls_AsyncDuplexStreamingCall__2.htm | 20 + ...Core_Calls_AsyncServerStreamingCall__2.htm | 23 + .../M_Grpc_Core_Calls_AsyncUnaryCall__2.htm | 22 + ...M_Grpc_Core_Calls_BlockingUnaryCall__2.htm | 22 + .../html/M_Grpc_Core_ChannelOption__ctor.htm | 15 + .../M_Grpc_Core_ChannelOption__ctor_1.htm | 15 + .../html/M_Grpc_Core_Channel_ConnectAsync.htm | 20 + .../M_Grpc_Core_Channel_ShutdownAsync.htm | 6 + ..._Core_Channel_WaitForStateChangedAsync.htm | 22 + .../html/html/M_Grpc_Core_Channel__ctor.htm | 24 + .../html/html/M_Grpc_Core_Channel__ctor_1.htm | 27 + .../M_Grpc_Core_ClientBase_CreateCall__2.htm | 22 + .../html/M_Grpc_Core_ClientBase__ctor.htm | 11 + ...c_Core_ContextPropagationOptions__ctor.htm | 20 + .../html/M_Grpc_Core_Credentials__ctor.htm | 2 + .../M_Grpc_Core_GrpcEnvironment_SetLogger.htm | 12 + ...c_Core_IAsyncStreamWriter_1_WriteAsync.htm | 11 + ...re_IClientStreamWriter_1_CompleteAsync.htm | 4 + .../M_Grpc_Core_KeyCertificatePair__ctor.htm | 15 + ..._Grpc_Core_Logging_ConsoleLogger_Debug.htm | 16 + ..._Grpc_Core_Logging_ConsoleLogger_Error.htm | 21 + ...rpc_Core_Logging_ConsoleLogger_Error_1.htm | 16 + ..._Core_Logging_ConsoleLogger_ForType__1.htm | 7 + ...M_Grpc_Core_Logging_ConsoleLogger_Info.htm | 16 + ...rpc_Core_Logging_ConsoleLogger_Warning.htm | 21 + ...c_Core_Logging_ConsoleLogger_Warning_1.htm | 16 + ..._Grpc_Core_Logging_ConsoleLogger__ctor.htm | 2 + .../M_Grpc_Core_Logging_ILogger_Debug.htm | 13 + .../M_Grpc_Core_Logging_ILogger_Error.htm | 17 + .../M_Grpc_Core_Logging_ILogger_Error_1.htm | 13 + ...M_Grpc_Core_Logging_ILogger_ForType__1.htm | 4 + .../html/M_Grpc_Core_Logging_ILogger_Info.htm | 13 + .../M_Grpc_Core_Logging_ILogger_Warning.htm | 17 + .../M_Grpc_Core_Logging_ILogger_Warning_1.htm | 13 + .../html/M_Grpc_Core_Marshaller_1__ctor.htm | 15 + .../M_Grpc_Core_Marshallers_Create__1.htm | 18 + .../html/html/M_Grpc_Core_Metadata_Add.htm | 11 + .../html/html/M_Grpc_Core_Metadata_Add_1.htm | 14 + .../html/html/M_Grpc_Core_Metadata_Add_2.htm | 14 + .../html/html/M_Grpc_Core_Metadata_Clear.htm | 3 + .../html/M_Grpc_Core_Metadata_Contains.htm | 11 + .../html/html/M_Grpc_Core_Metadata_CopyTo.htm | 16 + .../M_Grpc_Core_Metadata_Entry_ToString.htm | 5 + .../html/M_Grpc_Core_Metadata_Entry__ctor.htm | 15 + .../M_Grpc_Core_Metadata_Entry__ctor_1.htm | 15 + .../M_Grpc_Core_Metadata_GetEnumerator.htm | 3 + .../html/M_Grpc_Core_Metadata_IndexOf.htm | 11 + .../html/html/M_Grpc_Core_Metadata_Insert.htm | 16 + .../html/html/M_Grpc_Core_Metadata_Remove.htm | 11 + .../html/M_Grpc_Core_Metadata_RemoveAt.htm | 11 + .../html/html/M_Grpc_Core_Metadata__ctor.htm | 4 + .../html/html/M_Grpc_Core_Method_2__ctor.htm | 27 + .../html/M_Grpc_Core_RpcException__ctor.htm | 11 + .../html/M_Grpc_Core_RpcException__ctor_1.htm | 15 + ...rverCallContext_CreatePropagationToken.htm | 16 + ...rCallContext_WriteResponseHeadersAsync.htm | 14 + .../M_Grpc_Core_ServerCredentials__ctor.htm | 2 + .../html/M_Grpc_Core_ServerPort__ctor.htm | 19 + ...ServiceDefinition_Builder_AddMethod__2.htm | 22 + ...rviceDefinition_Builder_AddMethod__2_1.htm | 22 + ...rviceDefinition_Builder_AddMethod__2_2.htm | 22 + ...rviceDefinition_Builder_AddMethod__2_3.htm | 22 + ..._ServerServiceDefinition_Builder_Build.htm | 5 + ..._ServerServiceDefinition_Builder__ctor.htm | 11 + ..._ServerServiceDefinition_CreateBuilder.htm | 12 + .../html/M_Grpc_Core_Server_KillAsync.htm | 6 + ...c_Core_Server_ServerPortCollection_Add.htm | 13 + ...Core_Server_ServerPortCollection_Add_1.htm | 20 + ...ver_ServerPortCollection_GetEnumerator.htm | 5 + ...Server_ServiceDefinitionCollection_Add.htm | 13 + ...viceDefinitionCollection_GetEnumerator.htm | 5 + .../html/M_Grpc_Core_Server_ShutdownAsync.htm | 7 + .../html/html/M_Grpc_Core_Server_Start.htm | 5 + .../html/html/M_Grpc_Core_Server__ctor.htm | 15 + .../html/M_Grpc_Core_SslCredentials__ctor.htm | 6 + .../M_Grpc_Core_SslCredentials__ctor_1.htm | 12 + .../M_Grpc_Core_SslCredentials__ctor_2.htm | 15 + ...M_Grpc_Core_SslServerCredentials__ctor.htm | 13 + ...Grpc_Core_SslServerCredentials__ctor_1.htm | 19 + .../html/html/M_Grpc_Core_Status_ToString.htm | 5 + .../html/html/M_Grpc_Core_Status__ctor.htm | 15 + ..._AsyncStreamExtensions_ForEachAsync__1.htm | 23 + ...s_AsyncStreamExtensions_ToListAsync__1.htm | 19 + ...AsyncStreamExtensions_WriteAllAsync__1.htm | 32 + ...yncStreamExtensions_WriteAllAsync__1_1.htm | 23 + ..._Core_Utils_BenchmarkUtil_RunBenchmark.htm | 20 + ...Core_Utils_Preconditions_CheckArgument.htm | 12 + ...re_Utils_Preconditions_CheckArgument_1.htm | 16 + ...re_Utils_Preconditions_CheckNotNull__1.htm | 14 + ..._Utils_Preconditions_CheckNotNull__1_1.htm | 18 + ...pc_Core_Utils_Preconditions_CheckState.htm | 12 + ..._Core_Utils_Preconditions_CheckState_1.htm | 16 + .../html/M_Grpc_Core_WriteOptions__ctor.htm | 15 + .../Methods_T_Grpc_Auth_AuthInterceptors.htm | 8 + ...T_Grpc_Core_AsyncClientStreamingCall_2.htm | 16 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.htm | 14 + ...T_Grpc_Core_AsyncServerStreamingCall_1.htm | 14 + .../Methods_T_Grpc_Core_AsyncUnaryCall_1.htm | 16 + ...ds_T_Grpc_Core_CallInvocationDetails_2.htm | 6 + .../html/Methods_T_Grpc_Core_CallOptions.htm | 12 + .../html/html/Methods_T_Grpc_Core_Calls.htm | 17 + .../html/html/Methods_T_Grpc_Core_Channel.htm | 16 + .../Methods_T_Grpc_Core_ChannelOption.htm | 3 + .../html/Methods_T_Grpc_Core_ClientBase.htm | 5 + ..._T_Grpc_Core_ContextPropagationOptions.htm | 3 + ...ds_T_Grpc_Core_ContextPropagationToken.htm | 3 + .../html/Methods_T_Grpc_Core_Credentials.htm | 3 + .../Methods_T_Grpc_Core_GrpcEnvironment.htm | 5 + ...thods_T_Grpc_Core_IAsyncStreamReader_1.htm | 9 + ...thods_T_Grpc_Core_IAsyncStreamWriter_1.htm | 5 + ...hods_T_Grpc_Core_IClientStreamWriter_1.htm | 12 + ...hods_T_Grpc_Core_IServerStreamWriter_1.htm | 9 + ...Methods_T_Grpc_Core_KeyCertificatePair.htm | 3 + ...hods_T_Grpc_Core_Logging_ConsoleLogger.htm | 5 + .../Methods_T_Grpc_Core_Logging_ILogger.htm | 3 + .../html/Methods_T_Grpc_Core_Marshaller_1.htm | 3 + .../html/Methods_T_Grpc_Core_Marshallers.htm | 5 + .../html/Methods_T_Grpc_Core_Metadata.htm | 3 + .../Methods_T_Grpc_Core_Metadata_Entry.htm | 5 + .../html/Methods_T_Grpc_Core_Method_2.htm | 3 + .../html/Methods_T_Grpc_Core_RpcException.htm | 3 + .../html/html/Methods_T_Grpc_Core_Server.htm | 12 + .../Methods_T_Grpc_Core_ServerCallContext.htm | 9 + .../Methods_T_Grpc_Core_ServerCredentials.htm | 3 + .../html/Methods_T_Grpc_Core_ServerPort.htm | 3 + ...ds_T_Grpc_Core_ServerServiceDefinition.htm | 5 + ...c_Core_ServerServiceDefinition_Builder.htm | 13 + ..._Grpc_Core_Server_ServerPortCollection.htm | 10 + ...ore_Server_ServiceDefinitionCollection.htm | 8 + .../Methods_T_Grpc_Core_SslCredentials.htm | 3 + ...thods_T_Grpc_Core_SslServerCredentials.htm | 3 + .../html/html/Methods_T_Grpc_Core_Status.htm | 5 + ..._Grpc_Core_Utils_AsyncStreamExtensions.htm | 12 + ...ethods_T_Grpc_Core_Utils_BenchmarkUtil.htm | 5 + ...ethods_T_Grpc_Core_Utils_Preconditions.htm | 15 + .../html/Methods_T_Grpc_Core_WriteOptions.htm | 3 + doc/ref/csharp/html/html/N_Grpc_Auth.htm | 6 + doc/ref/csharp/html/html/N_Grpc_Core.htm | 133 +++ .../csharp/html/html/N_Grpc_Core_Logging.htm | 5 + .../csharp/html/html/N_Grpc_Core_Utils.htm | 9 + ...rpc_Core_CallInvocationDetails_2__ctor.htm | 9 + ...Overload_Grpc_Core_ChannelOption__ctor.htm | 7 + .../html/Overload_Grpc_Core_Channel__ctor.htm | 8 + ..._Grpc_Core_Logging_ConsoleLogger_Error.htm | 3 + ...rpc_Core_Logging_ConsoleLogger_Warning.htm | 3 + ...erload_Grpc_Core_Logging_ILogger_Error.htm | 3 + ...load_Grpc_Core_Logging_ILogger_Warning.htm | 3 + .../html/Overload_Grpc_Core_Metadata_Add.htm | 3 + ...verload_Grpc_Core_Metadata_Entry__ctor.htm | 7 + .../Overload_Grpc_Core_RpcException__ctor.htm | 7 + ...verServiceDefinition_Builder_AddMethod.htm | 11 + ...c_Core_Server_ServerPortCollection_Add.htm | 8 + ...verload_Grpc_Core_SslCredentials__ctor.htm | 12 + ...d_Grpc_Core_SslServerCredentials__ctor.htm | 9 + ...ls_AsyncStreamExtensions_WriteAllAsync.htm | 8 + ...Core_Utils_Preconditions_CheckArgument.htm | 7 + ..._Core_Utils_Preconditions_CheckNotNull.htm | 7 + ...pc_Core_Utils_Preconditions_CheckState.htm | 7 + ...yncClientStreamingCall_2_RequestStream.htm | 8 + ...yncClientStreamingCall_2_ResponseAsync.htm | 8 + ...ntStreamingCall_2_ResponseHeadersAsync.htm | 8 + ...yncDuplexStreamingCall_2_RequestStream.htm | 8 + ...exStreamingCall_2_ResponseHeadersAsync.htm | 8 + ...ncDuplexStreamingCall_2_ResponseStream.htm | 8 + ...erStreamingCall_1_ResponseHeadersAsync.htm | 8 + ...ncServerStreamingCall_1_ResponseStream.htm | 8 + ...pc_Core_AsyncUnaryCall_1_ResponseAsync.htm | 8 + ..._AsyncUnaryCall_1_ResponseHeadersAsync.htm | 8 + ...c_Core_CallInvocationDetails_2_Channel.htm | 8 + ...Grpc_Core_CallInvocationDetails_2_Host.htm | 8 + ...pc_Core_CallInvocationDetails_2_Method.htm | 8 + ...c_Core_CallInvocationDetails_2_Options.htm | 8 + ...lInvocationDetails_2_RequestMarshaller.htm | 8 + ...InvocationDetails_2_ResponseMarshaller.htm | 8 + ...rpc_Core_CallOptions_CancellationToken.htm | 8 + .../html/P_Grpc_Core_CallOptions_Deadline.htm | 8 + .../html/P_Grpc_Core_CallOptions_Headers.htm | 8 + ...Grpc_Core_CallOptions_PropagationToken.htm | 8 + .../P_Grpc_Core_CallOptions_WriteOptions.htm | 8 + .../P_Grpc_Core_ChannelOption_IntValue.htm | 8 + .../html/P_Grpc_Core_ChannelOption_Name.htm | 8 + .../P_Grpc_Core_ChannelOption_StringValue.htm | 8 + .../html/P_Grpc_Core_ChannelOption_Type.htm | 8 + .../P_Grpc_Core_Channel_ResolvedTarget.htm | 6 + .../html/html/P_Grpc_Core_Channel_State.htm | 8 + .../html/html/P_Grpc_Core_Channel_Target.htm | 6 + .../html/P_Grpc_Core_ClientBase_Channel.htm | 8 + ...Grpc_Core_ClientBase_HeaderInterceptor.htm | 11 + .../html/html/P_Grpc_Core_ClientBase_Host.htm | 13 + ...agationOptions_IsPropagateCancellation.htm | 6 + ...PropagationOptions_IsPropagateDeadline.htm | 6 + .../html/P_Grpc_Core_Credentials_Insecure.htm | 9 + .../P_Grpc_Core_GrpcEnvironment_Logger.htm | 8 + ...Core_IAsyncStreamWriter_1_WriteOptions.htm | 12 + ...rpc_Core_IHasWriteOptions_WriteOptions.htm | 9 + .../html/P_Grpc_Core_IMethod_FullName.htm | 8 + .../html/html/P_Grpc_Core_IMethod_Name.htm | 7 + .../html/P_Grpc_Core_IMethod_ServiceName.htm | 7 + .../html/html/P_Grpc_Core_IMethod_Type.htm | 7 + ...re_KeyCertificatePair_CertificateChain.htm | 8 + ...rpc_Core_KeyCertificatePair_PrivateKey.htm | 8 + .../P_Grpc_Core_Marshaller_1_Deserializer.htm | 8 + .../P_Grpc_Core_Marshaller_1_Serializer.htm | 8 + ...Grpc_Core_Marshallers_StringMarshaller.htm | 8 + .../html/html/P_Grpc_Core_Metadata_Count.htm | 6 + .../P_Grpc_Core_Metadata_Entry_IsBinary.htm | 8 + .../html/P_Grpc_Core_Metadata_Entry_Key.htm | 8 + .../html/P_Grpc_Core_Metadata_Entry_Value.htm | 8 + .../P_Grpc_Core_Metadata_Entry_ValueBytes.htm | 8 + .../html/P_Grpc_Core_Metadata_IsReadOnly.htm | 6 + .../html/html/P_Grpc_Core_Metadata_Item.htm | 12 + .../html/P_Grpc_Core_Method_2_FullName.htm | 9 + .../html/html/P_Grpc_Core_Method_2_Name.htm | 8 + ...P_Grpc_Core_Method_2_RequestMarshaller.htm | 8 + ..._Grpc_Core_Method_2_ResponseMarshaller.htm | 8 + .../html/P_Grpc_Core_Method_2_ServiceName.htm | 8 + .../html/html/P_Grpc_Core_Method_2_Type.htm | 8 + .../html/P_Grpc_Core_RpcException_Status.htm | 8 + ...re_ServerCallContext_CancellationToken.htm | 6 + ...P_Grpc_Core_ServerCallContext_Deadline.htm | 6 + .../P_Grpc_Core_ServerCallContext_Host.htm | 6 + .../P_Grpc_Core_ServerCallContext_Method.htm | 6 + .../P_Grpc_Core_ServerCallContext_Peer.htm | 6 + ..._Core_ServerCallContext_RequestHeaders.htm | 6 + ...ore_ServerCallContext_ResponseTrailers.htm | 6 + .../P_Grpc_Core_ServerCallContext_Status.htm | 8 + ...pc_Core_ServerCallContext_WriteOptions.htm | 12 + ...P_Grpc_Core_ServerCredentials_Insecure.htm | 9 + .../html/P_Grpc_Core_ServerPort_BoundPort.htm | 8 + .../P_Grpc_Core_ServerPort_Credentials.htm | 6 + .../html/html/P_Grpc_Core_ServerPort_Host.htm | 6 + .../html/html/P_Grpc_Core_ServerPort_Port.htm | 6 + .../html/html/P_Grpc_Core_Server_Ports.htm | 9 + .../html/html/P_Grpc_Core_Server_Services.htm | 9 + .../html/P_Grpc_Core_Server_ShutdownTask.htm | 8 + ...Core_SslCredentials_KeyCertificatePair.htm | 9 + ...c_Core_SslCredentials_RootCertificates.htm | 8 + ...rCredentials_ForceClientAuthentication.htm | 8 + ...lServerCredentials_KeyCertificatePairs.htm | 8 + ..._SslServerCredentials_RootCertificates.htm | 8 + .../html/html/P_Grpc_Core_Status_Detail.htm | 8 + .../html/P_Grpc_Core_Status_StatusCode.htm | 8 + .../html/P_Grpc_Core_WriteOptions_Flags.htm | 8 + ...T_Grpc_Core_AsyncClientStreamingCall_2.htm | 9 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.htm | 9 + ...T_Grpc_Core_AsyncServerStreamingCall_1.htm | 7 + ...roperties_T_Grpc_Core_AsyncUnaryCall_1.htm | 7 + ...es_T_Grpc_Core_CallInvocationDetails_2.htm | 15 + .../Properties_T_Grpc_Core_CallOptions.htm | 13 + .../html/Properties_T_Grpc_Core_Channel.htm | 5 + .../Properties_T_Grpc_Core_ChannelOption.htm | 11 + .../Properties_T_Grpc_Core_ClientBase.htm | 13 + ..._T_Grpc_Core_ContextPropagationOptions.htm | 3 + .../Properties_T_Grpc_Core_Credentials.htm | 6 + ...Properties_T_Grpc_Core_GrpcEnvironment.htm | 5 + ...rties_T_Grpc_Core_IAsyncStreamReader_1.htm | 3 + ...rties_T_Grpc_Core_IAsyncStreamWriter_1.htm | 8 + ...ties_T_Grpc_Core_IClientStreamWriter_1.htm | 8 + ...roperties_T_Grpc_Core_IHasWriteOptions.htm | 5 + .../html/Properties_T_Grpc_Core_IMethod.htm | 12 + ...ties_T_Grpc_Core_IServerStreamWriter_1.htm | 8 + ...perties_T_Grpc_Core_KeyCertificatePair.htm | 7 + .../Properties_T_Grpc_Core_Marshaller_1.htm | 7 + .../Properties_T_Grpc_Core_Marshallers.htm | 5 + .../html/Properties_T_Grpc_Core_Metadata.htm | 3 + .../Properties_T_Grpc_Core_Metadata_Entry.htm | 11 + .../html/Properties_T_Grpc_Core_Method_2.htm | 16 + .../Properties_T_Grpc_Core_RpcException.htm | 5 + .../html/Properties_T_Grpc_Core_Server.htm | 11 + ...operties_T_Grpc_Core_ServerCallContext.htm | 7 + ...operties_T_Grpc_Core_ServerCredentials.htm | 6 + .../Properties_T_Grpc_Core_ServerPort.htm | 3 + .../Properties_T_Grpc_Core_SslCredentials.htm | 8 + ...rties_T_Grpc_Core_SslServerCredentials.htm | 9 + .../html/Properties_T_Grpc_Core_Status.htm | 7 + .../Properties_T_Grpc_Core_WriteOptions.htm | 5 + .../html/html/R_Project_Documentation.htm | 11 + .../html/T_Grpc_Auth_AuthInterceptors.htm | 13 + ...T_Grpc_Core_AsyncClientStreamingCall_2.htm | 33 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.htm | 31 + ...T_Grpc_Core_AsyncServerStreamingCall_1.htm | 29 + .../html/T_Grpc_Core_AsyncUnaryCall_1.htm | 31 + .../T_Grpc_Core_CallInvocationDetails_2.htm | 33 + .../html/html/T_Grpc_Core_CallOptions.htm | 31 + .../csharp/html/html/T_Grpc_Core_Calls.htm | 24 + .../csharp/html/html/T_Grpc_Core_Channel.htm | 31 + .../html/html/T_Grpc_Core_ChannelOption.htm | 23 + .../T_Grpc_Core_ChannelOption_OptionType.htm | 9 + .../html/html/T_Grpc_Core_ChannelOptions.htm | 7 + .../html/html/T_Grpc_Core_ChannelState.htm | 16 + .../html/html/T_Grpc_Core_ClientBase.htm | 24 + ...rpc_Core_ClientStreamingServerMethod_2.htm | 21 + .../html/T_Grpc_Core_CompressionLevel.htm | 13 + .../T_Grpc_Core_ContextPropagationOptions.htm | 15 + .../T_Grpc_Core_ContextPropagationToken.htm | 10 + .../html/html/T_Grpc_Core_Credentials.htm | 13 + ...rpc_Core_DuplexStreamingServerMethod_2.htm | 25 + .../html/html/T_Grpc_Core_GrpcEnvironment.htm | 11 + .../html/T_Grpc_Core_HeaderInterceptor.htm | 19 + .../html/T_Grpc_Core_IAsyncStreamReader_1.htm | 22 + .../html/T_Grpc_Core_IAsyncStreamWriter_1.htm | 16 + .../T_Grpc_Core_IClientStreamWriter_1.htm | 27 + .../html/T_Grpc_Core_IHasWriteOptions.htm | 7 + .../csharp/html/html/T_Grpc_Core_IMethod.htm | 14 + .../T_Grpc_Core_IServerStreamWriter_1.htm | 24 + .../html/T_Grpc_Core_KeyCertificatePair.htm | 16 + .../T_Grpc_Core_Logging_ConsoleLogger.htm | 11 + .../html/html/T_Grpc_Core_Logging_ILogger.htm | 3 + .../html/html/T_Grpc_Core_Marshaller_1.htm | 18 + .../html/html/T_Grpc_Core_Marshallers.htm | 13 + .../csharp/html/html/T_Grpc_Core_Metadata.htm | 29 + .../html/html/T_Grpc_Core_Metadata_Entry.htm | 24 + .../html/html/T_Grpc_Core_MethodType.htm | 5 + .../csharp/html/html/T_Grpc_Core_Method_2.htm | 30 + .../html/html/T_Grpc_Core_RpcException.htm | 21 + .../csharp/html/html/T_Grpc_Core_Server.htm | 28 + .../html/T_Grpc_Core_ServerCallContext.htm | 17 + .../html/T_Grpc_Core_ServerCredentials.htm | 13 + .../html/html/T_Grpc_Core_ServerPort.htm | 16 + .../T_Grpc_Core_ServerServiceDefinition.htm | 9 + ...c_Core_ServerServiceDefinition_Builder.htm | 19 + ...rpc_Core_ServerStreamingServerMethod_2.htm | 25 + ..._Grpc_Core_Server_ServerPortCollection.htm | 19 + ...ore_Server_ServiceDefinitionCollection.htm | 17 + .../html/html/T_Grpc_Core_SslCredentials.htm | 28 + .../html/T_Grpc_Core_SslServerCredentials.htm | 25 + .../csharp/html/html/T_Grpc_Core_Status.htm | 24 + .../html/html/T_Grpc_Core_StatusCode.htm | 52 + .../html/T_Grpc_Core_UnaryServerMethod_2.htm | 21 + ..._Grpc_Core_Utils_AsyncStreamExtensions.htm | 19 + .../html/T_Grpc_Core_Utils_BenchmarkUtil.htm | 9 + .../html/T_Grpc_Core_Utils_Preconditions.htm | 19 + .../html/html/T_Grpc_Core_VersionInfo.htm | 9 + .../html/html/T_Grpc_Core_WriteFlags.htm | 15 + .../html/html/T_Grpc_Core_WriteOptions.htm | 17 + doc/ref/csharp/html/icons/AlertCaution.png | Bin 0 -> 618 bytes doc/ref/csharp/html/icons/AlertNote.png | Bin 0 -> 3236 bytes doc/ref/csharp/html/icons/AlertSecurity.png | Bin 0 -> 503 bytes doc/ref/csharp/html/icons/CFW.gif | Bin 0 -> 588 bytes doc/ref/csharp/html/icons/CodeExample.png | Bin 0 -> 196 bytes doc/ref/csharp/html/icons/Search.png | Bin 0 -> 343 bytes .../csharp/html/icons/SectionCollapsed.png | Bin 0 -> 229 bytes doc/ref/csharp/html/icons/SectionExpanded.png | Bin 0 -> 223 bytes doc/ref/csharp/html/icons/TocClose.gif | Bin 0 -> 893 bytes doc/ref/csharp/html/icons/TocCollapsed.gif | Bin 0 -> 838 bytes doc/ref/csharp/html/icons/TocExpanded.gif | Bin 0 -> 837 bytes doc/ref/csharp/html/icons/TocOpen.gif | Bin 0 -> 896 bytes doc/ref/csharp/html/icons/favicon.ico | Bin 0 -> 25094 bytes doc/ref/csharp/html/icons/privclass.gif | Bin 0 -> 621 bytes doc/ref/csharp/html/icons/privdelegate.gif | Bin 0 -> 1045 bytes doc/ref/csharp/html/icons/privenumeration.gif | Bin 0 -> 597 bytes doc/ref/csharp/html/icons/privevent.gif | Bin 0 -> 580 bytes doc/ref/csharp/html/icons/privextension.gif | Bin 0 -> 608 bytes doc/ref/csharp/html/icons/privfield.gif | Bin 0 -> 574 bytes doc/ref/csharp/html/icons/privinterface.gif | Bin 0 -> 585 bytes doc/ref/csharp/html/icons/privmethod.gif | Bin 0 -> 603 bytes doc/ref/csharp/html/icons/privproperty.gif | Bin 0 -> 1054 bytes doc/ref/csharp/html/icons/privstructure.gif | Bin 0 -> 630 bytes doc/ref/csharp/html/icons/protclass.gif | Bin 0 -> 600 bytes doc/ref/csharp/html/icons/protdelegate.gif | Bin 0 -> 1041 bytes doc/ref/csharp/html/icons/protenumeration.gif | Bin 0 -> 583 bytes doc/ref/csharp/html/icons/protevent.gif | Bin 0 -> 564 bytes doc/ref/csharp/html/icons/protextension.gif | Bin 0 -> 589 bytes doc/ref/csharp/html/icons/protfield.gif | Bin 0 -> 570 bytes doc/ref/csharp/html/icons/protinterface.gif | Bin 0 -> 562 bytes doc/ref/csharp/html/icons/protmethod.gif | Bin 0 -> 183 bytes doc/ref/csharp/html/icons/protoperator.gif | Bin 0 -> 547 bytes doc/ref/csharp/html/icons/protproperty.gif | Bin 0 -> 1039 bytes doc/ref/csharp/html/icons/protstructure.gif | Bin 0 -> 619 bytes doc/ref/csharp/html/icons/pubclass.gif | Bin 0 -> 368 bytes doc/ref/csharp/html/icons/pubdelegate.gif | Bin 0 -> 1041 bytes doc/ref/csharp/html/icons/pubenumeration.gif | Bin 0 -> 339 bytes doc/ref/csharp/html/icons/pubevent.gif | Bin 0 -> 314 bytes doc/ref/csharp/html/icons/pubextension.gif | Bin 0 -> 551 bytes doc/ref/csharp/html/icons/pubfield.gif | Bin 0 -> 311 bytes doc/ref/csharp/html/icons/pubinterface.gif | Bin 0 -> 314 bytes doc/ref/csharp/html/icons/pubmethod.gif | Bin 0 -> 329 bytes doc/ref/csharp/html/icons/puboperator.gif | Bin 0 -> 310 bytes doc/ref/csharp/html/icons/pubproperty.gif | Bin 0 -> 609 bytes doc/ref/csharp/html/icons/pubstructure.gif | Bin 0 -> 595 bytes doc/ref/csharp/html/icons/slMobile.gif | Bin 0 -> 909 bytes doc/ref/csharp/html/icons/static.gif | Bin 0 -> 879 bytes doc/ref/csharp/html/icons/xna.gif | Bin 0 -> 549 bytes doc/ref/csharp/html/index.html | 14 + .../csharp/html/scripts/branding-Website.js | 624 ++++++++++ doc/ref/csharp/html/scripts/branding.js | 528 +++++++++ .../csharp/html/scripts/jquery-1.11.0.min.js | 4 + doc/ref/csharp/html/search.html | 35 + doc/ref/csharp/html/styles/branding-Help1.css | 40 + .../html/styles/branding-HelpViewer.css | 48 + .../csharp/html/styles/branding-Website.css | 156 +++ doc/ref/csharp/html/styles/branding-cs-CZ.css | 3 + doc/ref/csharp/html/styles/branding-de-DE.css | 3 + doc/ref/csharp/html/styles/branding-en-US.css | 3 + doc/ref/csharp/html/styles/branding-es-ES.css | 3 + doc/ref/csharp/html/styles/branding-fr-FR.css | 3 + doc/ref/csharp/html/styles/branding-it-IT.css | 3 + doc/ref/csharp/html/styles/branding-ja-JP.css | 18 + doc/ref/csharp/html/styles/branding-ko-KR.css | 19 + doc/ref/csharp/html/styles/branding-pl-PL.css | 3 + doc/ref/csharp/html/styles/branding-pt-BR.css | 3 + doc/ref/csharp/html/styles/branding-ru-RU.css | 3 + doc/ref/csharp/html/styles/branding-tr-TR.css | 3 + doc/ref/csharp/html/styles/branding-zh-CN.css | 18 + doc/ref/csharp/html/styles/branding-zh-TW.css | 18 + doc/ref/csharp/html/styles/branding.css | 561 +++++++++ .../toc/Fields_T_Grpc_Core_ChannelOptions.xml | 1 + ..._T_Grpc_Core_ContextPropagationOptions.xml | 1 + .../html/toc/Fields_T_Grpc_Core_Metadata.xml | 1 + .../toc/Fields_T_Grpc_Core_ServerPort.xml | 1 + .../html/toc/Fields_T_Grpc_Core_Status.xml | 1 + .../toc/Fields_T_Grpc_Core_VersionInfo.xml | 1 + .../toc/Fields_T_Grpc_Core_WriteOptions.xml | 1 + .../Methods_T_Grpc_Auth_AuthInterceptors.xml | 1 + ...T_Grpc_Core_AsyncClientStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncServerStreamingCall_1.xml | 1 + .../Methods_T_Grpc_Core_AsyncUnaryCall_1.xml | 1 + ...ds_T_Grpc_Core_CallInvocationDetails_2.xml | 1 + .../toc/Methods_T_Grpc_Core_CallOptions.xml | 1 + .../html/toc/Methods_T_Grpc_Core_Calls.xml | 1 + .../html/toc/Methods_T_Grpc_Core_Channel.xml | 1 + .../toc/Methods_T_Grpc_Core_ClientBase.xml | 1 + .../Methods_T_Grpc_Core_GrpcEnvironment.xml | 1 + ...thods_T_Grpc_Core_IAsyncStreamWriter_1.xml | 1 + ...hods_T_Grpc_Core_IClientStreamWriter_1.xml | 1 + ...hods_T_Grpc_Core_Logging_ConsoleLogger.xml | 1 + .../Methods_T_Grpc_Core_Logging_ILogger.xml | 1 + .../toc/Methods_T_Grpc_Core_Marshallers.xml | 1 + .../html/toc/Methods_T_Grpc_Core_Metadata.xml | 1 + .../Methods_T_Grpc_Core_Metadata_Entry.xml | 1 + .../html/toc/Methods_T_Grpc_Core_Server.xml | 1 + .../Methods_T_Grpc_Core_ServerCallContext.xml | 1 + ...ds_T_Grpc_Core_ServerServiceDefinition.xml | 1 + ...c_Core_ServerServiceDefinition_Builder.xml | 1 + ..._Grpc_Core_Server_ServerPortCollection.xml | 1 + ...ore_Server_ServiceDefinitionCollection.xml | 1 + .../html/toc/Methods_T_Grpc_Core_Status.xml | 1 + ..._Grpc_Core_Utils_AsyncStreamExtensions.xml | 1 + ...ethods_T_Grpc_Core_Utils_BenchmarkUtil.xml | 1 + ...ethods_T_Grpc_Core_Utils_Preconditions.xml | 1 + doc/ref/csharp/html/toc/N_Grpc_Auth.xml | 1 + doc/ref/csharp/html/toc/N_Grpc_Core.xml | 1 + .../csharp/html/toc/N_Grpc_Core_Logging.xml | 1 + doc/ref/csharp/html/toc/N_Grpc_Core_Utils.xml | 1 + ...rpc_Core_CallInvocationDetails_2__ctor.xml | 1 + ...Overload_Grpc_Core_ChannelOption__ctor.xml | 1 + .../toc/Overload_Grpc_Core_Channel__ctor.xml | 1 + ..._Grpc_Core_Logging_ConsoleLogger_Error.xml | 1 + ...rpc_Core_Logging_ConsoleLogger_Warning.xml | 1 + ...erload_Grpc_Core_Logging_ILogger_Error.xml | 1 + ...load_Grpc_Core_Logging_ILogger_Warning.xml | 1 + .../toc/Overload_Grpc_Core_Metadata_Add.xml | 1 + ...verload_Grpc_Core_Metadata_Entry__ctor.xml | 1 + .../Overload_Grpc_Core_RpcException__ctor.xml | 1 + ...verServiceDefinition_Builder_AddMethod.xml | 1 + ...c_Core_Server_ServerPortCollection_Add.xml | 1 + ...verload_Grpc_Core_SslCredentials__ctor.xml | 1 + ...d_Grpc_Core_SslServerCredentials__ctor.xml | 1 + ...ls_AsyncStreamExtensions_WriteAllAsync.xml | 1 + ...Core_Utils_Preconditions_CheckArgument.xml | 1 + ..._Core_Utils_Preconditions_CheckNotNull.xml | 1 + ...pc_Core_Utils_Preconditions_CheckState.xml | 1 + ...T_Grpc_Core_AsyncClientStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncServerStreamingCall_1.xml | 1 + ...roperties_T_Grpc_Core_AsyncUnaryCall_1.xml | 1 + ...es_T_Grpc_Core_CallInvocationDetails_2.xml | 1 + .../Properties_T_Grpc_Core_CallOptions.xml | 1 + .../toc/Properties_T_Grpc_Core_Channel.xml | 1 + .../Properties_T_Grpc_Core_ChannelOption.xml | 1 + .../toc/Properties_T_Grpc_Core_ClientBase.xml | 1 + ..._T_Grpc_Core_ContextPropagationOptions.xml | 1 + .../Properties_T_Grpc_Core_Credentials.xml | 1 + ...Properties_T_Grpc_Core_GrpcEnvironment.xml | 1 + ...rties_T_Grpc_Core_IAsyncStreamWriter_1.xml | 1 + ...roperties_T_Grpc_Core_IHasWriteOptions.xml | 1 + .../toc/Properties_T_Grpc_Core_IMethod.xml | 1 + ...perties_T_Grpc_Core_KeyCertificatePair.xml | 1 + .../Properties_T_Grpc_Core_Marshaller_1.xml | 1 + .../Properties_T_Grpc_Core_Marshallers.xml | 1 + .../toc/Properties_T_Grpc_Core_Metadata.xml | 1 + .../Properties_T_Grpc_Core_Metadata_Entry.xml | 1 + .../toc/Properties_T_Grpc_Core_Method_2.xml | 1 + .../Properties_T_Grpc_Core_RpcException.xml | 1 + .../toc/Properties_T_Grpc_Core_Server.xml | 1 + ...operties_T_Grpc_Core_ServerCallContext.xml | 1 + ...operties_T_Grpc_Core_ServerCredentials.xml | 1 + .../toc/Properties_T_Grpc_Core_ServerPort.xml | 1 + .../Properties_T_Grpc_Core_SslCredentials.xml | 1 + ...rties_T_Grpc_Core_SslServerCredentials.xml | 1 + .../toc/Properties_T_Grpc_Core_Status.xml | 1 + .../Properties_T_Grpc_Core_WriteOptions.xml | 1 + .../html/toc/R_Project_Documentation.xml | 1 + .../html/toc/T_Grpc_Auth_AuthInterceptors.xml | 1 + ...T_Grpc_Core_AsyncClientStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncDuplexStreamingCall_2.xml | 1 + ...T_Grpc_Core_AsyncServerStreamingCall_1.xml | 1 + .../html/toc/T_Grpc_Core_AsyncUnaryCall_1.xml | 1 + .../T_Grpc_Core_CallInvocationDetails_2.xml | 1 + .../html/toc/T_Grpc_Core_CallOptions.xml | 1 + doc/ref/csharp/html/toc/T_Grpc_Core_Calls.xml | 1 + .../csharp/html/toc/T_Grpc_Core_Channel.xml | 1 + .../html/toc/T_Grpc_Core_ChannelOption.xml | 1 + .../html/toc/T_Grpc_Core_ChannelOptions.xml | 1 + .../html/toc/T_Grpc_Core_ClientBase.xml | 1 + .../T_Grpc_Core_ContextPropagationOptions.xml | 1 + .../T_Grpc_Core_ContextPropagationToken.xml | 1 + .../html/toc/T_Grpc_Core_Credentials.xml | 1 + .../html/toc/T_Grpc_Core_GrpcEnvironment.xml | 1 + .../toc/T_Grpc_Core_IAsyncStreamReader_1.xml | 1 + .../toc/T_Grpc_Core_IAsyncStreamWriter_1.xml | 1 + .../toc/T_Grpc_Core_IClientStreamWriter_1.xml | 1 + .../html/toc/T_Grpc_Core_IHasWriteOptions.xml | 1 + .../csharp/html/toc/T_Grpc_Core_IMethod.xml | 1 + .../toc/T_Grpc_Core_IServerStreamWriter_1.xml | 1 + .../toc/T_Grpc_Core_KeyCertificatePair.xml | 1 + .../toc/T_Grpc_Core_Logging_ConsoleLogger.xml | 1 + .../html/toc/T_Grpc_Core_Logging_ILogger.xml | 1 + .../html/toc/T_Grpc_Core_Marshaller_1.xml | 1 + .../html/toc/T_Grpc_Core_Marshallers.xml | 1 + .../csharp/html/toc/T_Grpc_Core_Metadata.xml | 1 + .../html/toc/T_Grpc_Core_Metadata_Entry.xml | 1 + .../csharp/html/toc/T_Grpc_Core_Method_2.xml | 1 + .../html/toc/T_Grpc_Core_RpcException.xml | 1 + .../csharp/html/toc/T_Grpc_Core_Server.xml | 1 + .../toc/T_Grpc_Core_ServerCallContext.xml | 1 + .../toc/T_Grpc_Core_ServerCredentials.xml | 1 + .../html/toc/T_Grpc_Core_ServerPort.xml | 1 + .../T_Grpc_Core_ServerServiceDefinition.xml | 1 + ...c_Core_ServerServiceDefinition_Builder.xml | 1 + ..._Grpc_Core_Server_ServerPortCollection.xml | 1 + ...ore_Server_ServiceDefinitionCollection.xml | 1 + .../html/toc/T_Grpc_Core_SslCredentials.xml | 1 + .../toc/T_Grpc_Core_SslServerCredentials.xml | 1 + .../csharp/html/toc/T_Grpc_Core_Status.xml | 1 + ..._Grpc_Core_Utils_AsyncStreamExtensions.xml | 1 + .../toc/T_Grpc_Core_Utils_BenchmarkUtil.xml | 1 + .../toc/T_Grpc_Core_Utils_Preconditions.xml | 1 + .../html/toc/T_Grpc_Core_VersionInfo.xml | 1 + .../html/toc/T_Grpc_Core_WriteOptions.xml | 1 + doc/ref/csharp/html/toc/roottoc.xml | 1 + 622 files changed, 8682 insertions(+) create mode 100644 doc/ref/csharp/.gitignore create mode 100644 doc/ref/csharp/html/SearchHelp.aspx create mode 100644 doc/ref/csharp/html/SearchHelp.inc.php create mode 100644 doc/ref/csharp/html/SearchHelp.php create mode 100644 doc/ref/csharp/html/Web.Config create mode 100644 doc/ref/csharp/html/WebKI.xml create mode 100644 doc/ref/csharp/html/WebTOC.xml create mode 100644 doc/ref/csharp/html/fti/FTI_100.json create mode 100644 doc/ref/csharp/html/fti/FTI_101.json create mode 100644 doc/ref/csharp/html/fti/FTI_102.json create mode 100644 doc/ref/csharp/html/fti/FTI_103.json create mode 100644 doc/ref/csharp/html/fti/FTI_104.json create mode 100644 doc/ref/csharp/html/fti/FTI_105.json create mode 100644 doc/ref/csharp/html/fti/FTI_107.json create mode 100644 doc/ref/csharp/html/fti/FTI_108.json create mode 100644 doc/ref/csharp/html/fti/FTI_109.json create mode 100644 doc/ref/csharp/html/fti/FTI_110.json create mode 100644 doc/ref/csharp/html/fti/FTI_111.json create mode 100644 doc/ref/csharp/html/fti/FTI_112.json create mode 100644 doc/ref/csharp/html/fti/FTI_113.json create mode 100644 doc/ref/csharp/html/fti/FTI_114.json create mode 100644 doc/ref/csharp/html/fti/FTI_115.json create mode 100644 doc/ref/csharp/html/fti/FTI_116.json create mode 100644 doc/ref/csharp/html/fti/FTI_117.json create mode 100644 doc/ref/csharp/html/fti/FTI_118.json create mode 100644 doc/ref/csharp/html/fti/FTI_119.json create mode 100644 doc/ref/csharp/html/fti/FTI_122.json create mode 100644 doc/ref/csharp/html/fti/FTI_97.json create mode 100644 doc/ref/csharp/html/fti/FTI_98.json create mode 100644 doc/ref/csharp/html/fti/FTI_99.json create mode 100644 doc/ref/csharp/html/fti/FTI_Files.json create mode 100644 doc/ref/csharp/html/html/Events_T_Grpc_Core_RpcException.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Census.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_DefaultAuthority.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Http2InitialSequenceNumber.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxConcurrentStreams.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxMessageLength.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_PrimaryUserAgentString.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SecondaryUserAgentString.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SslTargetNameOverride.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ContextPropagationOptions_Default.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_Metadata_BinaryHeaderSuffix.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_Metadata_Empty.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_ServerPort_PickUnused.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultCancelled.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultSuccess.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_VersionInfo_CurrentVersion.htm create mode 100644 doc/ref/csharp/html/html/F_Grpc_Core_WriteOptions_Default.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_ChannelOptions.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_ContextPropagationOptions.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_Metadata.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_ServerPort.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_Status.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_VersionInfo.htm create mode 100644 doc/ref/csharp/html/html/Fields_T_Grpc_Core_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromAccessToken.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromCredential.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_Dispose.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetAwaiter.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetStatus.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetTrailers.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_Dispose.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetStatus.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetTrailers.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_Dispose.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetStatus.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetTrailers.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2_WithOptions.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithCancellationToken.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithDeadline.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithHeaders.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_CallOptions__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncClientStreamingCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncDuplexStreamingCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncServerStreamingCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncUnaryCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Calls_BlockingUnaryCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Channel_ConnectAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Channel_ShutdownAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Channel_WaitForStateChangedAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ClientBase_CreateCall__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ClientBase__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ContextPropagationOptions__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Credentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_GrpcEnvironment_SetLogger.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_IAsyncStreamWriter_1_WriteAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_IClientStreamWriter_1_CompleteAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_KeyCertificatePair__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Debug.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_ForType__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Info.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Debug.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_ForType__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Info.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Marshaller_1__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Marshallers_Create__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Clear.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Contains.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_CopyTo.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry_ToString.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_GetEnumerator.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_IndexOf.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Insert.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Remove.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata_RemoveAt.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Metadata__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Method_2__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_CreatePropagationToken.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_WriteResponseHeadersAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerCredentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerPort__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_3.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_Build.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_CreateBuilder.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_KillAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_GetEnumerator.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_Add.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_GetEnumerator.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_ShutdownAsync.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server_Start.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Server__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_2.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Status_ToString.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Status__ctor.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ForEachAsync__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ToListAsync__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_BenchmarkUtil_RunBenchmark.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState_1.htm create mode 100644 doc/ref/csharp/html/html/M_Grpc_Core_WriteOptions__ctor.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Auth_AuthInterceptors.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncUnaryCall_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallInvocationDetails_2.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallOptions.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Calls.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Channel.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ChannelOption.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ClientBase.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationOptions.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationToken.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Credentials.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_GrpcEnvironment.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamReader_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_IClientStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_IServerStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_KeyCertificatePair.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ConsoleLogger.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ILogger.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshaller_1.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshallers.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata_Entry.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Method_2.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_RpcException.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCallContext.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerPort.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServerPortCollection.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslCredentials.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Status.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_BenchmarkUtil.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_Preconditions.htm create mode 100644 doc/ref/csharp/html/html/Methods_T_Grpc_Core_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/N_Grpc_Auth.htm create mode 100644 doc/ref/csharp/html/html/N_Grpc_Core.htm create mode 100644 doc/ref/csharp/html/html/N_Grpc_Core_Logging.htm create mode 100644 doc/ref/csharp/html/html/N_Grpc_Core_Utils.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_CallInvocationDetails_2__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_ChannelOption__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Channel__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Error.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Error.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Warning.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Add.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Entry__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_RpcException__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Server_ServerPortCollection_Add.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_SslCredentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_SslServerCredentials__ctor.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.htm create mode 100644 doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckState.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_RequestStream.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseHeadersAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_RequestStream.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseHeadersAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseStream.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseHeadersAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseStream.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseHeadersAsync.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Channel.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Host.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Method.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Options.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_RequestMarshaller.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_ResponseMarshaller.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_CancellationToken.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Deadline.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Headers.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_PropagationToken.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_IntValue.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Name.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_StringValue.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Type.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Channel_ResolvedTarget.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Channel_State.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Channel_Target.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Channel.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_HeaderInterceptor.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Host.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateCancellation.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateDeadline.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Credentials_Insecure.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_GrpcEnvironment_Logger.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IAsyncStreamWriter_1_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IHasWriteOptions_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IMethod_FullName.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Name.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IMethod_ServiceName.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Type.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_CertificateChain.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_PrivateKey.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Deserializer.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Serializer.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Marshallers_StringMarshaller.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Count.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_IsBinary.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Key.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Value.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_ValueBytes.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_IsReadOnly.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Item.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_FullName.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Name.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_RequestMarshaller.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ResponseMarshaller.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ServiceName.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Type.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_RpcException_Status.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_CancellationToken.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Deadline.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Host.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Method.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Peer.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_RequestHeaders.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_ResponseTrailers.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Status.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerCredentials_Insecure.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_BoundPort.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Credentials.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Host.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Port.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Server_Ports.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Server_Services.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Server_ShutdownTask.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_KeyCertificatePair.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_RootCertificates.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_ForceClientAuthentication.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_KeyCertificatePairs.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_RootCertificates.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Status_Detail.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_Status_StatusCode.htm create mode 100644 doc/ref/csharp/html/html/P_Grpc_Core_WriteOptions_Flags.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncUnaryCall_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallInvocationDetails_2.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallOptions.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Channel.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ChannelOption.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ClientBase.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ContextPropagationOptions.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Credentials.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_GrpcEnvironment.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamReader_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IClientStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IHasWriteOptions.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IMethod.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_IServerStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_KeyCertificatePair.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshaller_1.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshallers.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata_Entry.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Method_2.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_RpcException.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Server.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCallContext.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerPort.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslCredentials.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_Status.htm create mode 100644 doc/ref/csharp/html/html/Properties_T_Grpc_Core_WriteOptions.htm create mode 100644 doc/ref/csharp/html/html/R_Project_Documentation.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Auth_AuthInterceptors.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_AsyncClientStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_AsyncDuplexStreamingCall_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_AsyncServerStreamingCall_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_AsyncUnaryCall_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_CallInvocationDetails_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_CallOptions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Calls.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Channel.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption_OptionType.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ChannelOptions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ChannelState.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ClientBase.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ClientStreamingServerMethod_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_CompressionLevel.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationOptions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationToken.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Credentials.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_DuplexStreamingServerMethod_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_GrpcEnvironment.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_HeaderInterceptor.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamReader_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IClientStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IHasWriteOptions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IMethod.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_IServerStreamWriter_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_KeyCertificatePair.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Logging_ConsoleLogger.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Logging_ILogger.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Marshaller_1.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Marshallers.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Metadata.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Metadata_Entry.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_MethodType.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Method_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_RpcException.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Server.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerCallContext.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerPort.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition_Builder.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_ServerStreamingServerMethod_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Server_ServerPortCollection.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Server_ServiceDefinitionCollection.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_SslCredentials.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_SslServerCredentials.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Status.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_StatusCode.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_UnaryServerMethod_2.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Utils_AsyncStreamExtensions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Utils_BenchmarkUtil.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_Utils_Preconditions.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_VersionInfo.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_WriteFlags.htm create mode 100644 doc/ref/csharp/html/html/T_Grpc_Core_WriteOptions.htm create mode 100644 doc/ref/csharp/html/icons/AlertCaution.png create mode 100644 doc/ref/csharp/html/icons/AlertNote.png create mode 100644 doc/ref/csharp/html/icons/AlertSecurity.png create mode 100644 doc/ref/csharp/html/icons/CFW.gif create mode 100644 doc/ref/csharp/html/icons/CodeExample.png create mode 100644 doc/ref/csharp/html/icons/Search.png create mode 100644 doc/ref/csharp/html/icons/SectionCollapsed.png create mode 100644 doc/ref/csharp/html/icons/SectionExpanded.png create mode 100644 doc/ref/csharp/html/icons/TocClose.gif create mode 100644 doc/ref/csharp/html/icons/TocCollapsed.gif create mode 100644 doc/ref/csharp/html/icons/TocExpanded.gif create mode 100644 doc/ref/csharp/html/icons/TocOpen.gif create mode 100644 doc/ref/csharp/html/icons/favicon.ico create mode 100644 doc/ref/csharp/html/icons/privclass.gif create mode 100644 doc/ref/csharp/html/icons/privdelegate.gif create mode 100644 doc/ref/csharp/html/icons/privenumeration.gif create mode 100644 doc/ref/csharp/html/icons/privevent.gif create mode 100644 doc/ref/csharp/html/icons/privextension.gif create mode 100644 doc/ref/csharp/html/icons/privfield.gif create mode 100644 doc/ref/csharp/html/icons/privinterface.gif create mode 100644 doc/ref/csharp/html/icons/privmethod.gif create mode 100644 doc/ref/csharp/html/icons/privproperty.gif create mode 100644 doc/ref/csharp/html/icons/privstructure.gif create mode 100644 doc/ref/csharp/html/icons/protclass.gif create mode 100644 doc/ref/csharp/html/icons/protdelegate.gif create mode 100644 doc/ref/csharp/html/icons/protenumeration.gif create mode 100644 doc/ref/csharp/html/icons/protevent.gif create mode 100644 doc/ref/csharp/html/icons/protextension.gif create mode 100644 doc/ref/csharp/html/icons/protfield.gif create mode 100644 doc/ref/csharp/html/icons/protinterface.gif create mode 100644 doc/ref/csharp/html/icons/protmethod.gif create mode 100644 doc/ref/csharp/html/icons/protoperator.gif create mode 100644 doc/ref/csharp/html/icons/protproperty.gif create mode 100644 doc/ref/csharp/html/icons/protstructure.gif create mode 100644 doc/ref/csharp/html/icons/pubclass.gif create mode 100644 doc/ref/csharp/html/icons/pubdelegate.gif create mode 100644 doc/ref/csharp/html/icons/pubenumeration.gif create mode 100644 doc/ref/csharp/html/icons/pubevent.gif create mode 100644 doc/ref/csharp/html/icons/pubextension.gif create mode 100644 doc/ref/csharp/html/icons/pubfield.gif create mode 100644 doc/ref/csharp/html/icons/pubinterface.gif create mode 100644 doc/ref/csharp/html/icons/pubmethod.gif create mode 100644 doc/ref/csharp/html/icons/puboperator.gif create mode 100644 doc/ref/csharp/html/icons/pubproperty.gif create mode 100644 doc/ref/csharp/html/icons/pubstructure.gif create mode 100644 doc/ref/csharp/html/icons/slMobile.gif create mode 100644 doc/ref/csharp/html/icons/static.gif create mode 100644 doc/ref/csharp/html/icons/xna.gif create mode 100644 doc/ref/csharp/html/index.html create mode 100644 doc/ref/csharp/html/scripts/branding-Website.js create mode 100644 doc/ref/csharp/html/scripts/branding.js create mode 100644 doc/ref/csharp/html/scripts/jquery-1.11.0.min.js create mode 100644 doc/ref/csharp/html/search.html create mode 100644 doc/ref/csharp/html/styles/branding-Help1.css create mode 100644 doc/ref/csharp/html/styles/branding-HelpViewer.css create mode 100644 doc/ref/csharp/html/styles/branding-Website.css create mode 100644 doc/ref/csharp/html/styles/branding-cs-CZ.css create mode 100644 doc/ref/csharp/html/styles/branding-de-DE.css create mode 100644 doc/ref/csharp/html/styles/branding-en-US.css create mode 100644 doc/ref/csharp/html/styles/branding-es-ES.css create mode 100644 doc/ref/csharp/html/styles/branding-fr-FR.css create mode 100644 doc/ref/csharp/html/styles/branding-it-IT.css create mode 100644 doc/ref/csharp/html/styles/branding-ja-JP.css create mode 100644 doc/ref/csharp/html/styles/branding-ko-KR.css create mode 100644 doc/ref/csharp/html/styles/branding-pl-PL.css create mode 100644 doc/ref/csharp/html/styles/branding-pt-BR.css create mode 100644 doc/ref/csharp/html/styles/branding-ru-RU.css create mode 100644 doc/ref/csharp/html/styles/branding-tr-TR.css create mode 100644 doc/ref/csharp/html/styles/branding-zh-CN.css create mode 100644 doc/ref/csharp/html/styles/branding-zh-TW.css create mode 100644 doc/ref/csharp/html/styles/branding.css create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_ChannelOptions.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_ContextPropagationOptions.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_Metadata.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_ServerPort.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_Status.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_VersionInfo.xml create mode 100644 doc/ref/csharp/html/toc/Fields_T_Grpc_Core_WriteOptions.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Auth_AuthInterceptors.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_AsyncUnaryCall_1.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_CallInvocationDetails_2.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_CallOptions.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Calls.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Channel.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_ClientBase.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_GrpcEnvironment.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_IAsyncStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_IClientStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Logging_ConsoleLogger.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Logging_ILogger.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Marshallers.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Metadata.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Metadata_Entry.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Server.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_ServerCallContext.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_ServerServiceDefinition.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Server_ServerPortCollection.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Status.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Utils_BenchmarkUtil.xml create mode 100644 doc/ref/csharp/html/toc/Methods_T_Grpc_Core_Utils_Preconditions.xml create mode 100644 doc/ref/csharp/html/toc/N_Grpc_Auth.xml create mode 100644 doc/ref/csharp/html/toc/N_Grpc_Core.xml create mode 100644 doc/ref/csharp/html/toc/N_Grpc_Core_Logging.xml create mode 100644 doc/ref/csharp/html/toc/N_Grpc_Core_Utils.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_CallInvocationDetails_2__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_ChannelOption__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Channel__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Logging_ConsoleLogger_Error.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Logging_ILogger_Error.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Logging_ILogger_Warning.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Metadata_Add.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Metadata_Entry__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_RpcException__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Server_ServerPortCollection_Add.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_SslCredentials__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_SslServerCredentials__ctor.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.xml create mode 100644 doc/ref/csharp/html/toc/Overload_Grpc_Core_Utils_Preconditions_CheckState.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_AsyncUnaryCall_1.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_CallInvocationDetails_2.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_CallOptions.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Channel.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ChannelOption.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ClientBase.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ContextPropagationOptions.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Credentials.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_GrpcEnvironment.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_IAsyncStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_IHasWriteOptions.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_IMethod.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_KeyCertificatePair.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Marshaller_1.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Marshallers.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Metadata.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Metadata_Entry.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Method_2.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_RpcException.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Server.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ServerCallContext.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ServerCredentials.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_ServerPort.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_SslCredentials.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_SslServerCredentials.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_Status.xml create mode 100644 doc/ref/csharp/html/toc/Properties_T_Grpc_Core_WriteOptions.xml create mode 100644 doc/ref/csharp/html/toc/R_Project_Documentation.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Auth_AuthInterceptors.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_AsyncClientStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_AsyncDuplexStreamingCall_2.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_AsyncServerStreamingCall_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_AsyncUnaryCall_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_CallInvocationDetails_2.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_CallOptions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Calls.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Channel.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ChannelOption.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ChannelOptions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ClientBase.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ContextPropagationOptions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ContextPropagationToken.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Credentials.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_GrpcEnvironment.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IAsyncStreamReader_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IAsyncStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IClientStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IHasWriteOptions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IMethod.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_IServerStreamWriter_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_KeyCertificatePair.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Logging_ConsoleLogger.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Logging_ILogger.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Marshaller_1.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Marshallers.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Metadata.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Metadata_Entry.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Method_2.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_RpcException.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Server.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ServerCallContext.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ServerCredentials.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ServerPort.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ServerServiceDefinition.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_ServerServiceDefinition_Builder.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Server_ServerPortCollection.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Server_ServiceDefinitionCollection.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_SslCredentials.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_SslServerCredentials.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Status.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Utils_AsyncStreamExtensions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Utils_BenchmarkUtil.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_Utils_Preconditions.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_VersionInfo.xml create mode 100644 doc/ref/csharp/html/toc/T_Grpc_Core_WriteOptions.xml create mode 100644 doc/ref/csharp/html/toc/roottoc.xml diff --git a/doc/ref/csharp/.gitignore b/doc/ref/csharp/.gitignore new file mode 100644 index 00000000000..809997171c5 --- /dev/null +++ b/doc/ref/csharp/.gitignore @@ -0,0 +1 @@ +LastBuild.log diff --git a/doc/ref/csharp/html/SearchHelp.aspx b/doc/ref/csharp/html/SearchHelp.aspx new file mode 100644 index 00000000000..6e2a17b6abc --- /dev/null +++ b/doc/ref/csharp/html/SearchHelp.aspx @@ -0,0 +1,233 @@ +<%@ Page Language="C#" EnableViewState="False" %> + + diff --git a/doc/ref/csharp/html/SearchHelp.inc.php b/doc/ref/csharp/html/SearchHelp.inc.php new file mode 100644 index 00000000000..b905e130cfd --- /dev/null +++ b/doc/ref/csharp/html/SearchHelp.inc.php @@ -0,0 +1,173 @@ +filename = $file; + $this->pageTitle = $title; + $this->rank = $rank; + } +} + + +/// +/// Split the search text up into keywords +/// +/// The keywords to parse +/// A list containing the words for which to search +function ParseKeywords($keywords) +{ + $keywordList = array(); + $words = preg_split("/[^\w]+/", $keywords); + + foreach($words as $word) + { + $checkWord = strtolower($word); + $first = substr($checkWord, 0, 1); + if(strlen($checkWord) > 2 && !ctype_digit($first) && !in_array($checkWord, $keywordList)) + { + array_push($keywordList, $checkWord); + } + } + + return $keywordList; +} + + +/// +/// Search for the specified keywords and return the results as a block of +/// HTML. +/// +/// The keywords for which to search +/// The file list +/// The dictionary used to find the words +/// True to sort by title, false to sort by +/// ranking +/// A block of HTML representing the search results. +function Search($keywords, $fileInfo, $wordDictionary, $sortByTitle) +{ + $sb = "
    "; + $matches = array(); + $matchingFileIndices = array(); + $rankings = array(); + + $isFirst = true; + + foreach($keywords as $word) + { + if (!array_key_exists($word, $wordDictionary)) + { + return "Nothing found"; + } + $occurrences = $wordDictionary[$word]; + + $matches[$word] = $occurrences; + $occurrenceIndices = array(); + + // Get a list of the file indices for this match + foreach($occurrences as $entry) + array_push($occurrenceIndices, ($entry >> 16)); + + if($isFirst) + { + $isFirst = false; + foreach($occurrenceIndices as $i) + { + array_push($matchingFileIndices, $i); + } + } + else + { + // After the first match, remove files that do not appear for + // all found keywords. + for($idx = 0; $idx < count($matchingFileIndices); $idx++) + { + if (!in_array($matchingFileIndices[$idx], $occurrenceIndices)) + { + array_splice($matchingFileIndices, $idx, 1); + $idx--; + } + } + } + } + + if(count($matchingFileIndices) == 0) + { + return "Nothing found"; + } + + // Rank the files based on the number of times the words occurs + foreach($matchingFileIndices as $index) + { + // Split out the title, filename, and word count + $fileIndex = explode("\x00", $fileInfo[$index]); + + $title = $fileIndex[0]; + $filename = $fileIndex[1]; + $wordCount = intval($fileIndex[2]); + $matchCount = 0; + + foreach($keywords as $words) + { + $occurrences = $matches[$word]; + + foreach($occurrences as $entry) + { + if(($entry >> 16) == $index) + $matchCount += $entry & 0xFFFF; + } + } + + $r = new Ranking($filename, $title, $matchCount * 1000 / $wordCount); + array_push($rankings, $r); + + if(count($rankings) > 99) + break; + } + + // Sort by rank in descending order or by page title in ascending order + if($sortByTitle) + { + usort($rankings, "cmprankbytitle"); + } + else + { + usort($rankings, "cmprank"); + } + + // Format the file list and return the results + foreach($rankings as $r) + { + $f = $r->filename; + $t = $r->pageTitle; + $sb .= "
  1. $t
  2. "; + } + + $sb .= "rank - $x->rank; +} + +function cmprankbytitle($x, $y) +{ + return strcmp($x->pageTitle, $y->pageTitle); +} + +?> diff --git a/doc/ref/csharp/html/SearchHelp.php b/doc/ref/csharp/html/SearchHelp.php new file mode 100644 index 00000000000..eaa1e117f94 --- /dev/null +++ b/doc/ref/csharp/html/SearchHelp.php @@ -0,0 +1,58 @@ + + Nothing found + $val) + { + $wordDictionary[$ftiWord] = $val; + } + } + } + } + + // Perform the search and return the results as a block of HTML + $results = Search($keywords, $fileList, $wordDictionary, $sortByTitle); + echo $results; +?> \ No newline at end of file diff --git a/doc/ref/csharp/html/Web.Config b/doc/ref/csharp/html/Web.Config new file mode 100644 index 00000000000..26672e8189f --- /dev/null +++ b/doc/ref/csharp/html/Web.Config @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/ref/csharp/html/WebKI.xml b/doc/ref/csharp/html/WebKI.xml new file mode 100644 index 00000000000..1318ed5f171 --- /dev/null +++ b/doc/ref/csharp/html/WebKI.xml @@ -0,0 +1,1005 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/ref/csharp/html/WebTOC.xml b/doc/ref/csharp/html/WebTOC.xml new file mode 100644 index 00000000000..63da550f44c --- /dev/null +++ b/doc/ref/csharp/html/WebTOC.xml @@ -0,0 +1,523 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/ref/csharp/html/fti/FTI_100.json b/doc/ref/csharp/html/fti/FTI_100.json new file mode 100644 index 00000000000..e9e948d71cd --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_100.json @@ -0,0 +1 @@ +{"default":[1,196609,262146,458754,589826,720897,1179654,1441793,1507329,1638406,1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3276801,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4456449,5701633,6750209,12648449,14221314,14548993,14614529,14811137,17825794,18153473,19267586,21561345,21626881,21692417,21757953,22020098,22085633,22151169,22347779,22544387,22609921,22675457,22806529,23003137,23068673,23265281,23330817,23396353,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707074,25231363],"description":[131073,196609,262145,327681,393217,458753,524289,589825,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686978,2752513,2818050,2883586,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4390913,4456449,12255233,12320774,12386306,12451841,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,21430273,21495809,21561346,21626882,21692418,21757954,21823491,21889027,21954561,22020099,22085635,22151169,22216705,22282241,22347779,22478849,22544388,22609921,22675459,22806530,22937603,23003138,23068675,23134209,23199745,23265283,23330819,23396354,23461889,23527426,23592963,23658500,23724035,23789569,23855108,23920644,23986179,24051714,24117251,24182788,24248321,24313858,24444929,24510465,24576003,24641539,24707076,24772609,24903681,24969217,25034753,25100289,25165825,25231364],"data":[131073,15269889,23920642,24772609],"defaultauthority":[196609,720901,22151169],"defaultcancelled":[458753,1441797,24707073],"details":[458754,1441793,1507329,6881281,12320769,21823489,24707074],"defaultsuccess":[458753,1507333,24707073],"dll":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189697,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22413313,22478849,22544385,22609921,22675457,22740993,22806529,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24707073,24772609,24838145,24903681,24969217,25034753,25100289,25165825,25231361],"dispose":[1769473,1835009,1900545,1966081,2686977,4653063,4915207,5111815,5308423,21561345,21626881,21692417,21757953,22937601],"determines":[1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3276801,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4456449,21561345,21626881,21692417,21757953,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,25231361],"directly":[1769473,1966081,4718593,5373953,21561345,21757953],"deadline":[2097153,2228226,5898247,6029321,6553610,6684681,7012353,12320769,14024706,14286849,15400962,16973830,17956865,19857414,21889027,22020098,22544385,22609921,24051714,24772610],"duplex":[2162690,6160386,21954562],"different":[2228225,6684673,22020097],"defined":[2686979,2818049,2883585,15269889,22937603,23068673,23265281,23920641],"debug":[3014658,3080194,7405578,7929864,23396354,23461890],"deserializer":[3145729,8388615,8454149,15007746,18743302,23527425,23592962],"derived":[3473410,23920642],"definitions":[3866628,9961473,10027009,10092545,10158081,12320769,13172740,24313860,24510465],"duplexstreamingservermethod":[3866625,10027014,12320769,13172737,22740997,24313857],"definition":[3997697,6160385,10682369,12320770,15335426,20709377,20774913,21954561,23986178,24248321,24510465],"documentation":[5570561,6684674,7143425,7405570,7471107,7536642,7602177,7667714,7733251,7798786,7929858,7995395,8060930,8126465,8192002,8257539,8323074,8388611,8519682,8585219,8650755,8716289,8781826,8847363,9109505,9175042,9240579,9306114,9371650,9699329,10485761,10682369,11075585,11468803,11534338,11599876,11665411,11730947,11927553,11993089,18874369,19202049,19267585,20447233,20512769,20578305,20643841,23265281,23592961],"datetime":[5898245,6029317,6553605,6684679,16973830,19857414],"defaults":[6029313,6553601,6684673,6750209,6815745,7012353,9699329,10944513,11599873,12189697],"defaultarg":[6029317,6553601,6684673,6750209,6815745,7012354,9699329,10944513,11599873,12189697],"defintion":[6094849,6225921,6291457,6356993],"deserialize":[8454145],"disk":[11010050,13303810,24576002],"detail":[11403270,12320769,15728642,21233670,24707075],"defines":[12320769,22151169],"deserializing":[12320769,23592961],"delegates":[12320769],"delegate":[12320769,22413317,22740997,22872069,24379397,24838149],"destination":[12386305,21430273],"deserialized":[13959169,16842753,21823489],"dispatched":[14745601,15204353,18284545,19333121,23199745,23855105],"describes":[15269889,23920641],"duplexstreaming":[23789569],"differs":[24772609],"deadlineexceeded":[24772609],"delayed":[24772609],"directory":[24772612],"deleted":[24772609],"dataloss":[24772609],"disabled":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_101.json b/doc/ref/csharp/html/fti/FTI_101.json new file mode 100644 index 00000000000..f1e9b9f803c --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_101.json @@ -0,0 +1 @@ +{"events":[131074,23920641],"exposes":[131073,196609,262145,327681,393217,458753,524289,589825,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4456449,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22347777,22544385,22609921,22675457,22806529,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24903681,24969217,25100289,25231361],"exception":[131076,3014660,3080196,3473415,7471123,7733267,7995408,8257552,9633793,12713986,12779522,12845058,12910594,15269903,23396356,23461892,23920671],"enable":[196609,655361,22151169],"end":[196609,1048577,12320769,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151170,22347777,22544385,22609921,22675457,22806529,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658498,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24772609,24903681,24969217,25034753,25100289,25231361],"empty":[327681,458754,1310725,1441793,1507329,3604481,9764865,23658497,24051713,24707074,24772609],"entries":[327681,1310721,12320769,23658498],"eventually":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,21561345,21626881,21692417,21757953],"equals":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,25231361],"equal":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,25231361],"explicitly":[2228226,6553602,12320769,14221313,17825793,22020098,22347777,22609921],"enters":[2228225,6553601,22020097],"error":[2228225,3014660,3080196,6684673,7471116,7536651,7995402,8060937,11862017,12124161,12713989,12845061,15269889,15728641,21299201,22020097,23396356,23461892,23920641,24707073,24772615],"extension":[2686977,2818049,2883585,11468802,11534338,11599874,11665410,12451841,22937601,23068673,23265281,24903681],"entire":[2686978,4259842,11468801,11534337,22937602,24772609,24903682],"executes":[2686977,4259841,11468801,22937601,24903681],"element":[2686977,4259841,11468801,22937601,24903681],"elements":[2686977,2818049,2883585,4259843,11534337,11599879,11665415,13434882,22937601,23068673,23265281,24903683],"enumerable":[2818049,2883585,4259842,11599873,11665409,13434882,23068673,23265281,24903682],"entry":[3276801,3342340,8519689,8781832,8847369,8912899,8978440,9043976,9109510,9175048,9240585,9306120,12320770,12976129,13041670,15138824,18939908,19005443,19070979,19136515,19267592,23658509,23724049],"exceptions":[3473409,23920641],"enumerator":[3932161,3997697,10616833,10747905,24444929,24510465],"encoded":[7340034,11075585,11141121,11272193,13303809,14876674,15663105,18546689,18612225,21168129,23330818,24576001,24641537],"environment":[11010049,13303809,24576001],"extensionattribute":[11468803,11534339,11599875,11665411,24903683],"errormessage":[11862021,12124165],"expensive":[12320769,22020097],"encapsulates":[12320770,22806529,23592961],"encoding":[12320769,15597569,20971521,23330817,24576001],"exchanged":[12320769,23658497],"exposed":[12320769,15400961,20316161,24051713,24182785],"enumerations":[12320769],"enumeration":[12320769,22216706,22282242,22478850,23789570,24772610,25165826],"endpoint":[14090241,15400961,17498113,20054017,22020097,24051713],"encryption":[14352385,15466497,18022401,20381697,22675457,24117249],"exported":[15335425,20774913,23986177],"enforced":[15663105,21037057,24641537],"enum":[22216706,22282242,22478850,23789570,24772610,25165826],"expects":[22282241],"example":[24772611],"errors":[24772613],"expired":[24772609],"expire":[24772609],"entity":[24772610],"exists":[24772609],"execute":[24772609],"exhausting":[24772609],"exhausted":[24772609],"execution":[24772609],"enabled":[24772609],"expected":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_102.json b/doc/ref/csharp/html/fti/FTI_102.json new file mode 100644 index 00000000000..a1d03f68e2e --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_102.json @@ -0,0 +1 @@ +{"follow":[1,2818049,7274497,23068673],"following":[131073,196609,262145,327681,393217,458753,524289,589825,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4456449,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400962,15466497,15532033,15597569,15663105,15728641,15794177,20316161,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22347777,22544385,22609921,22675457,22806529,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23855105,23920641,23986177,24051714,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24903681,24969217,25100289,25231361],"fields":[196610,262146,327682,393218,458754,524290,589826,2031617,2097155,5570561,5832705,5898241,5963777,21823489,21889027,22151169,22544385,23658497,24182785,24707073,25100289,25231361],"field":[655362,720898,786434,851970,917506,983042,1048578,1114114,1179650,1245186,1310722,1376258,1441794,1507330,1572866,1638402],"fromaccesstoken":[1703937,4521989,21495809],"fromcredential":[1703937,4587525,21495809],"finished":[1769475,1835011,1900547,1966083,4653057,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5439489,5505025,9764865,21561347,21626883,21692419,21757955],"function":[1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3276801,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4456449,4521985,4587521,4718593,4784129,4849665,4980737,5046273,5177345,5242881,5373953,5439489,5505025,5570561,5832705,5898241,5963777,6094849,6160385,6225921,6291457,6356993,6553601,6619137,6684673,6881281,7208961,7274497,7602177,8126465,8388609,8454146,8781825,8912897,9109505,9175041,9306113,9699329,9764865,9961473,10027009,10092545,10158081,10223617,10354689,10420225,10485761,10551297,10616833,10747905,10813441,11337729,11468801,11534337,11599873,11665409,11927553,11993089,15007746,18743297,18808833,21561345,21626881,21692417,21757953,22020097,22085633,22347777,22413313,22544385,22609921,22675457,22740993,22806529,23330817,23396353,23592962,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24838145,25231361],"fully":[1835009,1900545,2031617,2097153,3211265,4915201,5111809,14745601,15204353,18284545,19333121,21626881,21692417,21823489,21889025,23199745,23592961,23855105],"fashion":[2162689,6356993,21954561],"fatalfailure":[2228225,6553601,22020097,22282241],"finalize":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"free":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25165825,25231361],"freeing":[2686977,22937601],"foreachasync":[2686977,4259841,11468808,22937601,24903681],"false":[2818049,4259841,4390916,11599873,11796481,11862017,12058625,12124161,13434881,13500418,13631490,23068673,24903681,25034756],"fortype":[3014657,3080193,7602184,8126470,23396353,23461889],"finishes":[3538946,10420225,10813441,15400962,20185089,20250625,23986178,24051714],"first":[3604481,9764865,11468801,11534337,11599873,11665409,24051713],"finish":[6029313],"formatargs":[7405575,7471111,7536647,7667719,7733255,7798791,7929862,7995398,8060934,8192006,8257542,8323078],"func":[8388624,8454154,11468808,18743302,18808838],"file":[11010049,13303809,15269889,23920641,24576001,24772613],"fails":[11010049,12320769,13303809,23920641,24576001],"forceclientauth":[11272197],"flags":[12189704,12320769,15794178,21364742,25165825,25231362],"factory":[12255233,12320769,21495809,24248321],"functionality":[12320769,12386305,21430274],"files":[12320769,21954561],"format":[14090241,15400961,17498113,20054017,22020097,24051713],"fullname":[14745601,15204353,18284549,19333127,23199745,23855105],"frames":[15269889,23920641],"forceclientauthentication":[15663105,21037061,24641537],"failure":[22282242],"failed_precondition":[24772609],"failedprecondition":[24772609],"failures":[24772609],"flagsattribute":[25165828],"force":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_103.json b/doc/ref/csharp/html/fti/FTI_103.json new file mode 100644 index 00000000000..398e827a531 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_103.json @@ -0,0 +1 @@ +{"grpc":[65537,131074,196610,262146,327682,393218,458754,524291,589826,655365,720901,786437,851973,917509,983045,1048581,1114117,1179653,1245189,1310725,1376261,1441797,1507333,1572870,1638405,1703938,1769474,1835010,1900546,1966082,2031618,2097154,2162690,2228226,2293762,2359298,2424834,2490370,2555906,2621443,2686978,2752514,2818050,2883586,2949122,3014658,3080194,3145730,3211266,3276802,3342338,3407874,3473410,3538946,3604482,3670018,3735554,3801090,3866626,3932162,3997698,4063234,4128770,4194306,4259842,4325378,4390914,4456450,4521989,4587525,4653061,4718597,4784133,4849669,4915205,4980741,5046277,5111813,5177349,5242885,5308421,5373957,5439493,5505029,5570568,5636104,5701640,5767177,5832709,5898245,5963782,6029320,6094854,6160390,6225926,6291462,6356998,6422533,6488069,6553605,6619141,6684682,6750214,6815750,6881287,6946822,7012357,7077893,7143433,7208965,7274501,7340037,7405575,7471112,7536647,7602182,7667719,7733256,7798791,7864325,7929863,7995400,8060935,8126470,8192007,8257544,8323079,8388616,8454149,8519690,8585224,8650760,8716294,8781834,8847372,8912901,8978437,9043973,9109510,9175050,9240588,9306122,9371655,9437189,9502728,9568262,9633798,9699336,9764870,9830405,9895942,9961479,10027015,10092551,10158087,10223621,10289157,10354693,10420229,10485768,10551302,10616837,10682376,10747909,10813445,10878981,10944517,11010053,11075590,11141126,11206661,11272197,11337733,11403270,11468812,11534346,11599886,11665420,11730952,11796485,11862021,11927558,11993094,12058629,12124165,12189702,12255237,12320787,12386307,12451844,12517378,12582914,12648450,12713986,12779522,12845058,12910594,12976130,13041666,13107202,13172738,13238274,13303810,13369346,13434882,13500418,13565954,13631490,13697026,13762562,13828098,13893634,13959170,14024706,14090242,14155778,14221315,14286850,14352386,14417923,14483458,14548994,14614530,14680066,14745602,14811138,14876674,14942210,15007746,15073282,15138818,15204354,15269890,15335426,15400962,15466498,15532034,15597570,15663106,15728643,15794178,15859717,15925253,15990789,16056325,16121861,16187397,16252933,16318469,16384005,16449541,16515077,16580613,16646149,16711685,16777221,16842757,16908293,16973829,17039365,17104901,17170437,17235973,17301509,17367045,17432581,17498117,17563653,17629189,17694725,17760261,17825798,17891333,17956869,18022405,18087942,18153477,18219013,18284549,18350085,18415621,18481157,18546693,18612229,18677765,18743301,18808837,18874374,18939909,19005445,19070981,19136517,19202054,19267590,19333125,19398661,19464197,19529733,19595269,19660805,19726341,19791877,19857413,19922949,19988485,20054021,20119557,20185093,20250629,20316165,20381701,20447238,20512774,20578310,20643846,20709381,20774917,20840453,20905989,20971525,21037061,21102597,21168133,21233669,21299206,21364741,21430283,21495815,21561350,21626886,21692422,21757958,21823493,21889029,21954566,22020103,22085640,22151174,22216709,22282247,22347783,22413319,22478854,22544390,22609927,22675463,22741000,22806537,22872071,22937605,23003141,23068677,23134213,23199749,23265286,23330822,23396358,23461893,23527430,23592966,23658503,23724037,23789574,23855110,23920646,23986183,24051718,24117255,24182790,24248326,24313862,24379399,24444934,24510470,24576007,24641543,24707078,24772614,24838150,24903687,24969222,25034758,25100296,25165830,25231366],"goes":[196610,983041,1048577,22151170],"given":[1703937,2228225,2359297,2818049,2883585,4259842,4390914,4521985,6684673,6881281,9568257,9633793,11599873,11665409,11862017,12124161,13107202,13434882,13500417,13631489,21495809,22020097,22347777,23068673,23265281,23920642,24903682,25034754],"googlecredential":[1703937,4587521,21495809],"generic":[1769473,1835009,1900545,1966081,2031617,2686977,2752513,2818049,2883585,3211265,3407873,6094849,6160385,6225921,6291457,6356993,6750209,6815745,6881281,7602177,8126465,8388609,9961473,10027009,10092545,10158081,10944513,11206657,11272193,11468801,11534337,11599878,11665413,11927553,11993089,12320769,13697025,13762561,13828097,13893633,13959169,14483457,14548993,14614529,14811137,15007745,15204353,21561345,21626881,21692417,21757953,21823489,22413313,22740993,22937601,23003137,23068673,23199745,23265281,23592961,23855105,24379393,24838145],"getawaiter":[1769473,1966081,4718597,5373957,21561345,21757953],"gethashcode":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,25231361],"getstatus":[1769473,1835009,1900545,1966081,4784133,4980741,5177349,5439493,21561345,21626881,21692417,21757953],"gets":[1769475,1835011,1900547,1966083,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932162,3997698,4063233,4128769,4194305,4456449,4784129,4849665,4980737,5046273,5177345,5242881,5439489,5505025,10616833,10747905,11010049,13303809,13959172,14090241,14155780,14417921,14680065,14745604,15007746,15138819,15204358,15269896,15728642,15794177,16646145,16711681,16777217,16842753,17235969,17301505,17367041,17432577,17563649,18087937,18219009,18284545,18350081,18415617,18481153,18743297,18808833,19005441,19070977,19136513,19333121,19398657,19464193,19529729,19595265,19660801,21233665,21299201,21364737,21561347,21626883,21692419,21757955,21823493,21889025,22020098,22085637,22347777,22544385,22609921,22675457,22806530,23134209,23199748,23330817,23396353,23592963,23658497,23724036,23855111,23920649,23986177,24051713,24117249,24182785,24248321,24313857,24444930,24510466,24576002,24641537,24707075,25231362],"gettrailers":[1769473,1835009,1900545,1966081,4849669,5046277,5242885,5505029,21561345,21626881,21692417,21757953],"gettype":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,25231361],"garbage":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"grpcenvironment":[2621443,7143427,12320769,14417923,18087938,22806535],"getenumerator":[3276801,3932161,3997697,9109512,10616839,10747911,23658497,24444929,24510465],"getbaseexception":[3473409,23920641],"getobjectdata":[3473409,23920641],"grpc_default_ssl_roots_file_path":[11010049,13303809,24576001],"guide":[11468801,11534337,11599873,11665409],"google":[12255233,21430273],"generated":[12320770,21954562],"general":[12320769,22020097],"grpc_channel_args":[12320769,22085633],"grpc_connectivity_state":[12320769,22282241],"grpc_compression_level":[12320769,22478849],"grpc_status_code":[12320769,24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_104.json b/doc/ref/csharp/html/fti/FTI_104.json new file mode 100644 index 00000000000..4c30282ae7c --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_104.json @@ -0,0 +1 @@ +{"http2initialsequencenumber":[196609,786437,22151169],"http2":[196610,786433,851969,22151170],"headers":[327681,1245185,2097153,3604482,5963783,6029320,9764868,12320771,13697025,13762561,13828097,13893633,14024706,15990785,16121857,16252929,16449537,17039366,21561345,21626881,21692417,21757953,21889027,22872065,23658499,24051714],"hash":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,25231361],"handlers":[3997697,10682369,12320771,22609921,23265281,24248321,24510465],"headerinterceptor":[4521989,4587525,12320769,14221313,17760268,22347777,22872069],"header":[4521985,4587521,14221313,17760257,22347777],"host":[5701639,5767174,6750209,6815751,9895942,10551302,12648450,13959170,14221315,15400962,15532033,16580614,17825799,19922950,20578311,21823490,22020098,22347779,24051714,24182785],"holding":[9043969,13041665,23724033],"handler":[9961478,10027014,10092550,10158086,12320773,22413313,22740993,23658497,24379393,24838145],"helper":[12320769,21954561],"hosts":[14221313,17825793,22347777],"helplink":[15269889,23920641],"help":[15269889,23920641],"hresult":[15269890,23920642],"hierarchy":[21495809,21561345,21626881,21692417,21757953,21954561,22020097,22085633,22151169,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23527425,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24903681,24969217,25034753,25100289,25231361],"high":[22478850],"hint":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_105.json b/doc/ref/csharp/html/fti/FTI_105.json new file mode 100644 index 00000000000..d521afa4a08 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_105.json @@ -0,0 +1 @@ +{"inherited":[131073,1769476,1835012,1900548,1966084,2031620,2097156,2228230,2293764,2359302,2424838,2490374,2555910,2621446,2686978,2818049,2883585,2949124,3014662,3211268,3276804,3342339,3407878,3473416,3538950,3604486,3670022,3735558,3801094,3866630,3932166,3997702,4063236,4128774,4194307,4456454,14483457,14614529,14811137,15269896,21561348,21626884,21692420,21757956,21823492,21889028,22020102,22085636,22347782,22544390,22609926,22675462,22806534,22937603,23068674,23265282,23330820,23396358,23592964,23658500,23724035,23855110,23920657,23986182,24051718,24117254,24182790,24248326,24313862,24444934,24510470,24576004,24641542,24707075,25231366],"initial":[196609,786433,15400961,20119553,22151169,24051713],"incoming":[196609,851969,22151169],"instance":[327681,1310721,1769473,1835009,1900545,1966081,2031621,2097159,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211268,3276801,3342339,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194307,4456449,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6946817,7077889,8978433,9043969,9437185,9502721,9830401,9961473,10027009,10092545,10158081,10289153,11403265,11468802,11534338,11599874,11665410,12189697,12517379,13041666,14352385,15269889,15466497,18022401,20381697,21561345,21626881,21692417,21757953,21823496,21889032,22020097,22085633,22347778,22544385,22609921,22675459,22806529,23330817,23396353,23592964,23658499,23724037,23855106,23920642,23986177,24051713,24117251,24182785,24248321,24313858,24444929,24510465,24576001,24641537,24707076,25231362],"initonly":[1179649,1310721,1441793,1507329,1638401],"int":[1376259,6422531,6815747,8847364,9175044,9240580,9371652,9895939,10485763,10551302,11730950,17235972,18874373,19267588,20447236,20643844],"integer":[1376257,6422531,6815745,8847361,9175041,9240577,9371649,9895937,10485761,10551298,11730946,12582913,14155777,17235970,18874369,19267585,20447233,20643841,22085634,22216706],"int32":[1376257,3932161,6422530,6815746,8847365,9175041,9240581,9371652,9895937,10485762,10551300,11730952,12582913,12648449,13238273,17235969,18874369,19267587,20447233,20643841,22020097,22085633,24444929],"interceptor":[1703938,4521986,4587522,12320769,14221314,17760258,21495810,22347778,22872065],"implements":[1703937,4587521,4653057,4915201,5111809,5308417,7405569,7471105,7536641,7602177,7667713,7733249,7798785,8519681,8716289,8781825,8847361,9109505,9175041,9240577,9306113,9371649,10616833,10747905,18874369,19202049,19267585,19333121,19398657,19595265,19660801,21495809,21561345,21626881,21692417,21757953,23396353,23658497,23855105,24444929,24510465],"itokenaccess":[1703937,4587526,21495809],"invalidoperationexception":[1769474,1835010,1900546,1966082,4390914,4784129,4849665,4980737,5046273,5177345,5242881,5439489,5505025,12058625,12124161,13631490,21561346,21626882,21692418,21757954,25034754],"indicates":[2031617,2097153,3211265,3342337,4194305,6553601,15728641,21299201,21823489,21889025,23592961,23724033,24707074,24772609],"invokes":[2162693,6094849,6160385,6225921,6291457,6356993,21954565],"independent":[2162689,6160385,21954561],"implicitly":[2228225,3604481,6553601,9764865,22020097,24051713],"iasyncstreamreader":[2686979,11468809,11534344,12320769,14483459,16187398,16318470,22413317,22740997,22937606],"idisposable":[2686977,4653057,4915201,5111809,5308417,21561348,21626884,21692420,21757956,22937605],"iasyncenumerator":[2686977,14483457,22937606],"interface":[2686977,2752513,2818049,2883585,3080193,7208961,7274497,7929857,7995393,8060929,8126465,8192001,8257537,8323073,12320769,12386305,12845057,12910593,14483457,14548993,14614529,14680065,14745601,14811137,18153473,18219009,18284545,18350081,18415617,18481153,21561345,21626881,21692417,21757953,22937607,23003141,23068678,23134213,23199749,23265286,23396353,23461893,23658500,23855105,24444930,24510466],"iasyncstreamwriter":[2752515,2818049,2883585,7208962,12320769,14548995,14614529,14811137,18153474,23003142,23068678,23265286],"iclientstreamwriter":[2818051,4259841,7274498,11599883,12320769,13434881,14614531,15859718,16056326,23068678,24903681],"iserverstreamwriter":[2883587,4259841,11665418,12320769,13434881,14811139,15400961,20316161,22740997,23265287,24051713,24379397,24903681],"info":[3014658,3080194,7667722,8192008,12320769,23396354,23461890,25100289],"ilogger":[3080195,7143430,7405569,7471105,7536641,7602183,7667713,7733249,7798785,7929860,7995397,8060932,8126472,8192004,8257541,8323076,12386305,12845058,12910594,18087942,23396356,23461894],"indexof":[3276801,9175049,23658497],"insert":[3276801,9240586,23658497],"information":[3473409,11468801,11534337,11599873,11665409,15269889,23920642,24772609],"invoked":[3604482,9764866,12320769,14221313,17760257,21823489,22347777,24051714],"immutable":[3866625,10223617,24313857],"ienumerable":[4259842,6750214,6815750,9109505,10616833,10747905,10944517,11206662,11272198,11599882,11665417,12648450,13369346,13434882,22020098,23658504,24444936,24510472,24641538,24903682],"initializes":[5636097,5701633,5767169,6946817,7077889,8454145,8978433,9043969,9437185,9502721,9830401,12189697,12517379,13041666,21823491,22347777,22675457,23592961,23658497,23724034,23855105,24117249,25231361],"intvalue":[6422533,14155777,17235973,22085633],"invoke":[6881281],"invocation":[6881281,6946817],"item":[8519687,8781831,9175047,9240583,9306119,15073281,19267590,23658497],"icollection":[8519681,8716289,8781825,8847361,9306113,18874369,19202049,23658500],"indicating":[8978433,9043969],"ienumerator":[9109510,10616838,10747910],"ilist":[9175041,9240577,9371649,19267585,21102598,23658500],"index":[9240583,9371655,19267590],"interceptors":[12255234,21495810],"inherit":[12255233,21495809,23920641,24576001,24641537],"indirectly":[12320769,21954561],"invoking":[12320769,22020097],"initialization":[12320769,22806529],"interfaces":[12320769,12386305],"ihaswriteoptions":[12320769,14680067,18219010,23134214],"imethod":[12320769,14745603,18284546,18350082,18415618,18481154,19333121,19398657,19595265,19660801,22872069,23199750,23855108],"ispropagatecancellation":[14286849,17891333,22544385],"ispropagatedeadline":[14286849,17956869,22544385],"insecure":[14352385,15466497,18022405,20381701,22675457,24117249],"isreadonly":[15073281,19202056,23658497],"isbinary":[15138817,18939909,23724033],"innerexception":[15269889,23920641],"immediate":[15269889,23920641],"indicate":[15728641,21299201,24707073],"inheritance":[21495809,21561345,21626881,21692417,21757953,21954561,22020097,22085633,22151169,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23527425,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24903681,24969217,25034753,25100289,25231361],"idle":[22282242],"inherits":[22937601,23068673,23265281,23920641,24576001,24641537],"invalidargument":[24772609],"invalid":[24772609],"invalid_argument":[24772609],"instead":[24772610],"identified":[24772609],"issue":[24772609],"implemented":[24772609],"internal":[24772610],"invariants":[24772609],"immediately":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_107.json b/doc/ref/csharp/html/fti/FTI_107.json new file mode 100644 index 00000000000..6ce520d7967 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_107.json @@ -0,0 +1 @@ +{"keycertificatepair":[2949123,7340037,11141131,11206662,11272198,12320769,13303809,13369346,14876675,15597569,18546690,18612226,20905995,21102598,23330824,24576002,24641538],"killasync":[3538945,10420229,23986177],"key":[7340034,8585222,8650758,8978438,9043974,11141121,11206657,11272193,12320769,14876673,15138818,15269889,15597570,15663105,18612225,19005446,20905986,21102593,23330819,23724034,23920641,24576002,24641537],"known":[11010049,13303809,24576001,24772609],"keycertificatepairs":[11206661,11272197,15663105,21102597,24641537]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_108.json b/doc/ref/csharp/html/fti/FTI_108.json new file mode 100644 index 00000000000..0e8d26a2391 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_108.json @@ -0,0 +1 @@ +{"link":[1,15269889,23920641],"length":[196609,917505,22151169],"listening":[393217,1376257,3932162,9895937,10485761,10551297,13238274,24182785,24444930],"literal":[655361,720897,786433,851969,917505,983041,1048577,1114113,1245185,1376257,1572865],"lastobservedstate":[2228225,6684679,22020097],"logger":[2621441,3014657,3080193,7143425,7602177,7864321,8126465,12386305,14417922,18087943,22806531,23396355,23461889],"list":[2686977,4259841,11534342,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,22937601,24903681],"logs":[3014662,3080198,7405569,7471105,7536641,7667713,7733249,7798785,7929857,7995393,8060929,8192001,8257537,8323073,12386306,12713986,12779522,12845058,12910594,21430273,23396359,23461894],"logging":[3014657,3080193,7143426,7405572,7471109,7536644,7602179,7667716,7733253,7798788,7864322,7929860,7995397,8060932,8126467,8192004,8257541,8323076,12386306,12713985,12779521,12845057,12910593,21430273,23396355,23461891],"listen":[3932162,9895937,10485761,10551297,12320769,13238274,15335425,20709377,23986178,24182785,24444930],"let":[6029317,6553601,6684673,6750209,6815745,7012354,9699329,10944513,11599873,12189697,20447233],"loaded":[11010049,13303809,24576001],"lightweight":[12255233,21430273],"library":[12255233,12320769,21430273,22806529],"logic":[12320770,21430273,23592961],"long":[12320769,22020097,24772609],"lived":[12320769,22020097],"like":[12320770,22609922,24772609],"layer":[12320770,22609922],"level":[12320769,22478849],"low":[22478850],"likely":[24772609],"loss":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_109.json b/doc/ref/csharp/html/fti/FTI_109.json new file mode 100644 index 00000000000..6c114c9ab65 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_109.json @@ -0,0 +1 @@ +{"members":[131073,196609,262145,327681,393217,458753,524289,589825,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4456449,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22478849,22544385,22609921,22675457,22806529,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24772609,24903681,24969217,25100289,25165825,25231361],"maxconcurrentstreams":[196609,851973,22151169],"maximum":[196610,851969,917505,22151170],"maxmessagelength":[196609,917509,22151169],"message":[196609,458754,917505,1441793,1507329,3014662,3080198,3604481,4390914,6094849,6225922,6291459,6356995,6881282,7208966,7405576,7471112,7536648,7667720,7733256,7798792,7929863,7995399,8060935,8192007,8257543,8323079,9633799,9764865,9961474,10027010,10092546,10158082,11862018,12124162,12713986,12779522,12845058,12910594,13107201,13500417,13631489,15269890,21561346,21626882,21692417,21757953,21823490,22151169,22413314,22740994,22937601,23003137,23068673,23396358,23461894,23855106,23920643,24051713,24379394,24707074,24838146,25034754,25165825],"metadata":[196610,327684,983041,1048577,1245186,1310728,1769473,1835009,1900545,1966081,3276804,3342339,4849670,5046278,5242886,5505030,5963781,6029317,8519693,8585221,8650757,8716291,8781836,8847374,8912899,8978438,9043974,9109513,9175052,9240590,9306124,9371652,9437190,9764869,12320773,12976131,13041669,14221313,15073283,15138821,15400961,15990790,16121862,16252934,16449542,17039366,17760257,18874371,18939906,19005443,19070979,19136515,19202051,19267595,20119559,20185094,21561345,21626881,21692417,21757953,22151170,22347777,22872074,23658521,23724043,24051713],"mutable":[655361,720897,786433,851969,917505,983041,1048577,1114113,1245185,1376257,1572865],"methods":[1703938,1769474,1835010,1900546,1966082,2031618,2097154,2162690,2228226,2293762,2359298,2424834,2490370,2555906,2621442,2686979,2752514,2818051,2883587,2949122,3014658,3080194,3145730,3211266,3276802,3342338,3407874,3473410,3538946,3604482,3670018,3735554,3801090,3866626,3932162,3997698,4063234,4128770,4194306,4259842,4325378,4390914,4456450,11468802,11534338,11599874,11665410,12255233,12320769,12451843,14745601,15204353,18284545,19333121,21495810,21561345,21626881,21692417,21757953,21823489,21889025,21954562,22020097,22085633,22347777,22544385,22609921,22675457,22806529,22937602,23003137,23068674,23199745,23265282,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23855106,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24903682,24969218,25034754,25231361],"means":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,6029313,21561345,21626881,21692417,21757953,24772609],"messages":[2162689,3604481,6094849,6160387,6225921,8454146,9502722,9764865,12320775,12386305,15204354,19464193,19529729,21954561,22937601,23003137,23068673,23265281,23461889,23592961,23658498,23855106,24051713],"memberwiseclone":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"method":[2359297,3407875,3604481,3866632,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636108,5701645,5767175,5832705,5898241,5963777,6094849,6160385,6225921,6291457,6356993,6553601,6619137,6684673,6881293,7143425,7208961,7274497,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8519681,8585217,8650753,8716289,8781825,8847361,8912897,9109505,9175041,9240577,9306113,9371649,9502729,9699329,9764866,9961487,10027023,10092559,10158095,10223617,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,11337729,11468805,11534341,11599877,11665413,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12320774,12517378,12713985,12779521,12845057,12910593,12976129,13172745,13238273,13434881,13500417,13565953,13631489,13959170,14745604,15204359,15269889,15400962,16646150,18284545,18350081,18415617,18481153,19333123,19398659,19464194,19529730,19595267,19660803,19988486,21823492,22347777,22413314,22740994,22872069,23199749,23789569,23855120,23920641,24051715,24248322,24313864,24379394,24838146],"movenext":[2686977,22937601],"marshallers":[3145731,8388613,12320770,14942211,18677762,23527432],"marshaller":[3145729,3211267,5767182,8388614,8454150,9502732,12320769,12517378,13959170,14942209,15007747,15204354,16777223,16842759,18677767,18743298,18808834,19464199,19529735,21823492,23527426,23592969,23855106],"member":[4521985,4587521,4718593,4784129,4849665,4980737,5046273,5177345,5242881,5373953,5439489,5505025,5570561,5832705,5898241,5963777,6094849,6160385,6225921,6291457,6356993,6553601,6619137,6684673,6881281,7143425,8388609,8585217,8650753,9699329,9764865,9961473,10027009,10092545,10158081,10223617,10354689,10420225,10485761,10551297,10682369,10813441,10878977,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18546689,18612225,18677761,18743297,18808833,18939905,19005441,19070977,19136513,19464193,19529729,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,22216705,22282241,22478849,23789569,24772609,25165825],"missing":[5570561,6684674,7143425,7405570,7471107,7536642,7602177,7667714,7733251,7798786,7929858,7995395,8060930,8126465,8192002,8257539,8323074,8388611,8519682,8585219,8650755,8716289,8781826,8847363,9109505,9175042,9240579,9306114,9371650,9699329,10485761,10682369,11075585,11468803,11534338,11599876,11665411,11730947,11927553,11993089,18874369,19202049,19267585,20447233,20512769,20578305,20643841,23265281,23592961],"methodtype":[9502725,12320769,18481158,19660807,23789573],"main":[12320769,21430273],"make":[12320769,21954561],"making":[12320770,21954561,22609921],"makes":[12320769,22609921],"mapping":[12320769,24248321],"microbenchmarks":[12451841,24969217],"multiple":[14221313,17825793,22347777],"meaning":[14221313,17825793,22347777],"maintains":[14548993,14614529,14811137,18153473,23003137,23068673,23265281],"mustinherit":[22347777,22675457,24117249],"medium":[22478850],"malformed":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_110.json b/doc/ref/csharp/html/fti/FTI_110.json new file mode 100644 index 00000000000..4df2bf7fdeb --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_110.json @@ -0,0 +1 @@ +{"namespace":[131073,196609,262145,327681,393217,458753,524289,589825,655362,720898,786434,851970,917506,983042,1048578,1114114,1179650,1245186,1310722,1376258,1441794,1507330,1572866,1638402,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4390913,4456449,4521986,4587522,4653058,4718594,4784130,4849666,4915202,4980738,5046274,5111810,5177346,5242882,5308418,5373954,5439490,5505026,5570562,5636098,5701634,5767170,5832706,5898242,5963778,6029314,6094850,6160386,6225922,6291458,6356994,6422530,6488066,6553602,6619138,6684674,6750210,6815746,6881282,6946818,7012354,7077890,7143426,7208962,7274498,7340034,7405570,7471106,7536642,7602178,7667714,7733250,7798786,7864322,7929858,7995394,8060930,8126466,8192002,8257538,8323074,8388610,8454146,8519682,8585218,8650754,8716290,8781826,8847362,8912898,8978434,9043970,9109506,9175042,9240578,9306114,9371650,9437186,9502722,9568258,9633794,9699330,9764866,9830402,9895938,9961474,10027010,10092546,10158082,10223618,10289154,10354690,10420226,10485762,10551298,10616834,10682370,10747906,10813442,10878978,10944514,11010050,11075586,11141122,11206658,11272194,11337730,11403266,11468802,11534338,11599874,11665410,11730946,11796482,11862018,11927554,11993090,12058626,12124162,12189698,12255233,12320770,12386305,12451841,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,15859714,15925250,15990786,16056322,16121858,16187394,16252930,16318466,16384002,16449538,16515074,16580610,16646146,16711682,16777218,16842754,16908290,16973826,17039362,17104898,17170434,17235970,17301506,17367042,17432578,17498114,17563650,17629186,17694722,17760258,17825794,17891330,17956866,18022402,18087938,18153474,18219010,18284546,18350082,18415618,18481154,18546690,18612226,18677762,18743298,18808834,18874370,18939906,19005442,19070978,19136514,19202050,19267586,19333122,19398658,19464194,19529730,19595266,19660802,19726338,19791874,19857410,19922946,19988482,20054018,20119554,20185090,20250626,20316162,20381698,20447234,20512770,20578306,20643842,20709378,20774914,20840450,20905986,20971522,21037058,21102594,21168130,21233666,21299202,21364738,21430274,21495810,21561346,21626882,21692418,21757954,21823490,21889026,21954562,22020098,22085634,22151170,22216706,22282242,22347778,22413314,22478850,22544386,22609922,22675458,22740994,22806530,22872066,22937602,23003138,23068674,23134210,23199746,23265282,23330818,23396354,23461890,23527426,23592962,23658498,23724034,23789570,23855106,23920642,23986178,24051714,24117250,24182786,24248322,24313858,24379394,24444930,24510466,24576002,24641538,24707074,24772610,24838146,24903682,24969218,25034754,25100290,25165826,25231362],"number":[196610,786433,851969,12320769,22151170,23789569,23986177],"normally":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,12320769,21561345,21626881,21692417,21757953,24248321],"new":[2031617,2097155,2228225,2359297,3801089,3932162,5570561,5636099,5701635,5767171,5832705,5898241,5963777,6029315,6422530,6488066,6553601,6750210,6815746,6881281,6946819,7012355,7077891,7340035,7864322,8454147,8978435,9043971,9437187,9502723,9568259,9633795,9830403,9895939,10289155,10354689,10485761,10551297,10944515,11010050,11075586,11141122,11206658,11272194,11403267,12189699,12517379,13041666,13107202,13238274,14221313,17760257,21823492,21889028,22020097,22347779,22544385,22675457,23330817,23592961,23658497,23724034,23855105,23920642,23986177,24117249,24182785,24248321,24313857,24444930,24707073,25231361],"need":[2228225,6553601,22020097,25165826],"needs":[3604481,8978433,9764865,24051713],"null":[4390914,5701633,6029323,6553603,6684674,6750210,6815746,7208961,9699330,10944514,11927553,11993089,13565954,14221313,14548993,14614529,14811137,15597569,17825793,18153473,20905985,22347777,23003137,23068673,23265281,24576001,25034754],"nullable":[6029317,6553605,6684679,16973830],"nullptr":[6029317,6553601,6684673,6750209,6815745,9699329,10944513],"names":[12320770,22151169,24248321],"native":[12320769,22609921],"numerical":[15269889,23920641],"namespaces":[21430274],"notinheritable":[21495809,21561345,21626881,21692417,21757953,21954561,22085633,22151169,23330817,23527425,23658497,24576001,24903681,24969217,25034753,25100289],"notfound":[24772609],"nocompress":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_111.json b/doc/ref/csharp/html/fti/FTI_111.json new file mode 100644 index 00000000000..d6598433cd7 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_111.json @@ -0,0 +1 @@ +{"occurs":[131073,2228225,6684673,22020097,23920641],"object":[131073,1769480,1835015,1900551,1966088,2031618,2097154,2228235,2293767,2359307,2424843,2490379,2555915,2621451,2949127,3014671,3080196,3211266,3276807,3342338,3407883,3473416,3538955,3604491,3670027,3735563,3801100,3866635,3932171,3997707,4063239,4128779,4194306,4456459,4718593,5373953,6094849,6160385,6225921,6291457,7405577,7471115,7536650,7667721,7733259,7798794,7929863,7995401,8060936,8192007,8257545,8323080,10223617,10354690,11468801,11534337,11599873,11665409,12320769,12713986,12779522,12845058,12910594,15269889,21495809,21561353,21626888,21692424,21757961,21823490,21889026,21954562,22020108,22085640,22151169,22347788,22544396,22609932,22675468,22806540,23330824,23396368,23461892,23527425,23592962,23658504,23724034,23855116,23920651,23986188,24051724,24117260,24182796,24248333,24313868,24444940,24510476,24576008,24641548,24707074,24903681,24969217,25034753,25100289,25231372],"override":[196609,1114113,4653057,4915201,5111809,5308417,7405569,7471105,7536641,7602177,7667713,7733249,7798785,8519681,8716289,8781825,8847361,8912899,9109505,9175041,9240577,9306113,9371649,10616833,10747905,11337731,18874369,19202049,19267585,19333121,19398657,19595265,19660801,22151169],"options":[262145,589825,1179649,1638401,2031617,5570567,5636102,5701638,5767174,6029313,6750216,6815752,6881286,7012353,9699336,10944520,12320773,13959170,14024705,14548994,14614530,14680065,14811138,15400961,16711686,17170433,18153474,18219009,20316161,21823491,21889026,22151169,22544387,23003138,23068674,23134210,23265282,24051713,25231362],"oauth2":[1703937,4521986,12255233,21430273,21495809],"obtain":[1703937,4587522,21495809],"operations":[1769473,1835009,1900545,1966081,2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,4653057,4915201,5111809,5308417,12320770,21561345,21626881,21692417,21757953,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,24772609,25165825,25231362],"one":[2752513,2818049,2883585,3473409,7208961,12320769,23003137,23068673,23265281,23920641,23986177,24772609],"overrides":[3342337,4194305,8912897,11337729,23724033,24707073],"overridden":[3473410,23920642],"overload":[5636097,5701633,5767169,6422529,6488065,6750209,6815745,7471105,7536641,7733249,7798785,7995393,8060929,8257537,8323073,8519681,8585217,8650753,8978433,9043969,9568257,9633793,9961473,10027009,10092545,10158081,10485761,10551297,11010049,11075585,11141121,11206657,11272193,11599873,11665409,11796481,11862017,11927553,11993089,12058625,12124161,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489],"optional":[6029322,6553602,6684674,6750210,6815746,7012356,9699330,10944514,11599874,12189698,12320769,24707073],"obtained":[6029313],"option":[6422529,6488065,12320769,12582914,22085635,22216706],"omit":[11468801,11534337,11599873,11665409],"objects":[12320771,22020097,23134209,24248321],"operation":[12320769,22020097,24772618],"optiontype":[12320769,17432582,22216709],"original":[14090241,17629185,22020097],"operatio":[24772609],"outofrange":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_112.json b/doc/ref/csharp/html/fti/FTI_112.json new file mode 100644 index 00000000000..f8b685b9ef5 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_112.json @@ -0,0 +1 @@ +{"primaryuseragentstring":[196609,983045,22151169],"primary":[196609,983041,22151169],"propagation":[262145,1179649,3604481,6029313,7012353,9699329,22544386,24051713],"pickunused":[393217,1376261,20447233,24182785],"pass":[393217,1376257,24182785],"port":[393219,1376259,3932164,6750209,6815751,9895946,10485762,10551306,12320769,12648450,13238276,15335425,15466497,15532033,20381697,20447234,20643847,20709377,22020098,23986177,24117249,24182790,24444932],"ports":[393217,1376257,12320770,15335426,20709382,23986179,24182785,24444929],"property":[393217,1376257,14221313,14548993,14614529,14811137,15400961,15859716,15925252,15990788,16056324,16121860,16187396,16252932,16318468,16384004,16449540,16515076,16580612,16646148,16711684,16777220,16842756,16908292,16973828,17039364,17104900,17170436,17235972,17301508,17367044,17432580,17498116,17563652,17629188,17694724,17760260,17825797,17891332,17956868,18022404,18087940,18153477,18219012,18284548,18350084,18415620,18481156,18546692,18612228,18677764,18743300,18808836,18874372,18939908,19005444,19070980,19136516,19202052,19267588,19333124,19398660,19464196,19529732,19595268,19660804,19726340,19791876,19857412,19922948,19988484,20054020,20119556,20185092,20250628,20316165,20381700,20447236,20512772,20578308,20643844,20709380,20774916,20840452,20905988,20971524,21037060,21102596,21168132,21233668,21299204,21364740,22347777,23003137,23068673,23265281,24051713,24182785],"public":[655363,720899,786435,851971,917507,983043,1048579,1114115,1179651,1245187,1310723,1376259,1441795,1507331,1572867,1638403,4521987,4587523,4653059,4718595,4784131,4849667,4915203,4980739,5046275,5111811,5177347,5242883,5308419,5373955,5439491,5505027,5570563,5636099,5701635,5767171,5832707,5898243,5963779,6029315,6094851,6160387,6225923,6291459,6356995,6422531,6488067,6553603,6619139,6684675,6750211,6815747,6946819,7012355,7143427,7340035,7405571,7471107,7536643,7602179,7667715,7733251,7798787,7864323,8388611,8454147,8519683,8585219,8650755,8716291,8781827,8847363,8912899,8978435,9043971,9109507,9175043,9240579,9306115,9371651,9437187,9502723,9568259,9633795,9699331,9764867,9895939,9961475,10027011,10092547,10158083,10223619,10289155,10354691,10420227,10485763,10551299,10616835,10682371,10747907,10813443,10878979,10944515,11010051,11075587,11141123,11206659,11272195,11337731,11403267,11468803,11534339,11599875,11665411,11730947,11796483,11862019,11927555,11993091,12058627,12124163,12189699,15859715,15925251,15990787,16056323,16121859,16187395,16252931,16318467,16384003,16449539,16515075,16580611,16646147,16711683,16777219,16842755,16908291,16973827,17039363,17104899,17170435,17235971,17301507,17367043,17432579,17498115,17563651,17629187,17694723,17760259,17825795,17891331,17956867,18022403,18087939,18546691,18612227,18677763,18743299,18808835,18874371,18939907,19005443,19070979,19136515,19202051,19267587,19333123,19398659,19464195,19529731,19595267,19660803,19726339,19791875,19857411,19922947,19988483,20054019,20119555,20185091,20250627,20316163,20381699,20447235,20512771,20578307,20643843,20709379,20774915,20840451,20905987,20971523,21037059,21102595,21168131,21233667,21299203,21364739,21495811,21561347,21626883,21692419,21757955,21823491,21889027,21954563,22020099,22085635,22151171,22216707,22282243,22347779,22413315,22478851,22544387,22609923,22675459,22740995,22806531,22872067,22937603,23003139,23068675,23134211,23199747,23265283,23330819,23396355,23461891,23527427,23592963,23658499,23724035,23789571,23855107,23920644,23986179,24051715,24117251,24182787,24248323,24313859,24379395,24444931,24510467,24576004,24641540,24707075,24772611,24838147,24903683,24969219,25034755,25100291,25165827,25231363],"provides":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,12255233,12320770,12386305,14352385,15466497,18022401,20381697,21430274,21561345,21626881,21692417,21757953,22609921,22675457,24117249,25100289],"pending":[1769473,1835009,1900545,1966081,2752513,2818050,2883585,4653057,4915201,5111809,5308417,7208961,7274497,21561345,21626881,21692417,21757953,23003137,23068674,23265281],"provided":[2031617,2097155,5570561,5832705,5898241,5963777,21823489,21889027],"preserved":[2031617,2097155,5570561,5832705,5898241,5963777,21823489,21889027],"perform":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"performs":[2686977,22937601],"progress":[3538945,10420225,23986177],"procedure":[3538946,10420225,10813441,12320770,23920641,23986178,24772609],"propagate":[3604481,9699329,12320769,22609921,24051713],"preceded":[4325377,11730945,24969217],"phase":[4325377,11730945,24969217],"preconditions":[4390914,11796482,11862018,11927555,11993091,12058626,12124162,12451842,13500418,13565954,13631490,25034759],"parameters":[4521985,4587521,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094850,6160386,6225922,6291458,6356994,6422529,6488065,6553601,6684673,6750209,6815745,6881282,6946817,7012353,7143425,7208961,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388610,8454145,8519681,8585217,8650753,8781825,8847361,8978433,9043969,9175041,9240577,9306113,9371649,9502721,9568257,9633793,9699329,9764865,9895937,9961474,10027010,10092546,10158082,10289153,10354689,10485761,10551297,10682369,10944513,11075585,11141121,11206657,11272193,11403265,11468802,11534338,11599874,11665410,11730945,11796481,11862017,11927554,11993090,12058625,12124161,12189697,19267585,21561345,21626881,21692417,21757953,21823489,22413314,22740994,22872065,22937601,23003137,23068673,23265281,23592961,23855105,24379394,24838146],"param":[5570561,6684674,7143425,7405570,7471107,7536642,7667714,7733251,7798786,7929858,7995395,8060930,8192002,8257539,8323074,8388610,8519681,8585218,8650754,8781825,8847362,9175041,9240578,9306113,9371649,9699329,10485761,10682369,11075585,11468802,11534337,11599875,11665410,11730947],"propagationtoken":[6029319,14024705,17104901,21889025],"providing":[6094849,6160385,6225921,6291457],"protected":[6881283,7077891,9830403],"propagatedeadline":[7012359],"propagatecancellation":[7012359],"parent":[7012354,14024705,14286850,17104897,17891329,17956865,21889025,22544386],"propagated":[7012354,14286850,17891329,17956865,22544386],"private":[7340034,14876673,18612225,23330818],"pair":[7340033,11141121,12320769,15597570,20905986,23330818,24576002],"privatekey":[7340037,14876673,18612229,23330817],"pem":[7340034,11075585,11141121,11272193,12320769,13303809,14876674,15597569,15663105,18546689,18612225,20971521,21168129,23330819,24576002,24641537],"params":[7405569,7471105,7536641,7667713,7733249,7798785,7929857,7995393,8060929,8192001,8257537,8323073],"paramarray":[7405569,7471105,7536641,7667713,7733249,7798785,7929857,7995393,8060929,8192001,8257537,8323073],"pointed":[11010049,13303809,24576001],"place":[11010049,13303809,24576001],"proves":[11272193],"parameter":[11468801,11534337,11599873,11665409,11993089],"programming":[11468801,11534337,11599873,11665409],"paramname":[11993093],"protocol":[12320770,21954561,24248321],"possible":[12320769,22020097],"propagating":[12320770,14024705,17104897,21889025,22609922],"properties":[12320769,13697026,13762562,13828098,13893634,13959170,14024706,14090242,14155778,14221314,14286850,14352386,14417922,14483458,14548994,14614530,14680066,14745602,14811138,14876674,14942210,15007746,15073282,15138818,15204354,15269890,15335426,15400963,15466498,15532034,15597570,15663106,15728642,15794178,20316161,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23527425,23592961,23658497,23724033,23855105,23920641,23986177,24051714,24117249,24182785,24576001,24641537,24707073,25231361],"part":[12320769,24248321],"pairs":[15269889,15663105,21102593,23920641,24641537],"provide":[15269889,23920641],"peer":[15400961,20054021,24051713],"pick":[20447233],"problematic":[24772609],"permissiondenied":[24772609],"permission":[24772609],"permission_denied":[24772610],"past":[24772610],"particular":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_113.json b/doc/ref/csharp/html/fti/FTI_113.json new file mode 100644 index 00000000000..50cc318bdfe --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_113.json @@ -0,0 +1 @@ +{"qualified":[2031617,2097153,3211265,5767169,14745601,15204353,18284545,19333121,21823489,21889025,23199745,23592961,23855105],"quota":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_114.json b/doc/ref/csharp/html/fti/FTI_114.json new file mode 100644 index 00000000000..eb0e8484e81 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_114.json @@ -0,0 +1 @@ +{"redirected":[1],"rpcexception":[131075,3473411,9568263,9633799,12320770,13107206,15269891,19726338,23920652],"reference":[131073,196609,262145,327681,393217,458753,524289,589825,655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4390915,4456449,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927560,11993096,12058625,12124161,12189697,12320769,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565955,13631489,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22413313,22478849,22544385,22609921,22675457,22740993,22806529,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24707073,24772609,24838145,24903681,24969217,25034755,25100289,25165825,25231361],"receive":[196609,917505,22151169],"read":[327681,1310721,1835009,1900545,2686977,4259841,4915201,5111809,11534337,12320769,13762561,13828097,16187393,16318465,21626882,21692418,22937602,23658497,24903681],"result":[458754,1441793,1507329,1769474,1835009,1900545,1966082,4653058,4915201,5111809,5308418,12320770,13697025,13893633,14352385,15466497,15925249,16384001,18022401,20381697,21561347,21626881,21692417,21757955,22675457,24117249,24707075,24772609],"rpc":[458754,1441793,1507329,2228226,6553602,12320770,15400965,19857409,19922945,19988481,20185089,20250625,21954561,22020098,24051717,24707075],"readonly":[1179650,1310722,1441794,1507330,1638402,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17891329,17956865,18022401,18087937,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737],"request":[1769473,1835009,1966081,2162689,2228225,3866625,4653057,4915201,5308417,5767169,6029313,6094849,6160386,6225923,6291458,6356994,6553601,6881281,9502721,9961473,10027009,10092545,10158082,12320771,13172737,14221313,15204353,17760257,19464193,21561346,21626882,21757954,21823489,21954561,22020097,22347777,22413313,22740993,23658498,23789571,23855106,24313857,24379398,24772609,24838150],"received":[1769473,1966081,4653057,5308417,21561345,21757953,23789571,24772609],"requests":[1769473,1835009,1900545,1966081,2162690,3538946,4653057,4915201,5111809,5308417,6094849,6160385,10420225,10813441,13697025,13762561,13959169,15859713,16056321,16777217,21561346,21626882,21692417,21757953,21823489,21954562,23789569,23986178],"resources":[1769473,1835009,1900545,1966081,2228226,2359297,2424833,2490369,2555905,2621441,2686977,3014657,3407873,3473409,3538946,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,4653057,4915201,5111809,5308417,6619137,10813441,21561345,21626881,21692417,21757953,22020098,22347777,22544385,22609921,22675457,22806529,22937601,23396353,23855105,23920641,23986178,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"released":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,21561345,21626881,21692417,21757953],"returns":[1769473,1835009,1900545,1966081,2031619,2097157,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014658,3080193,3211266,3276801,3342338,3407873,3473410,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194306,4456449,5570561,5832705,5898241,5963777,7602177,8126465,8912897,11337729,14352385,14942209,15138817,15466497,18022401,18677761,18939905,20381697,21561345,21626881,21692417,21757953,21823491,21889029,22020097,22085633,22347777,22544385,22609921,22675458,22806529,23330817,23396354,23461889,23527425,23592962,23658497,23724035,23855105,23920642,23986177,24051713,24117250,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707074,25231361],"represents":[1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3276801,3342337,3407873,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,8912897,11337729,12320770,21561345,21626881,21692417,21757953,22020098,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23658497,23724033,23855105,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707074,25231361],"response":[1835009,1900545,2162690,3604484,3866625,4915201,5111809,5767169,6094851,6160386,6225922,6291458,6356994,6881281,9502721,9764870,9961473,10027009,10092545,10158082,12320772,13172737,13697025,13762561,13828097,13893633,15204353,15400961,15990785,16121857,16252929,16449537,19529729,20316161,21561346,21626883,21692419,21757955,21823489,21954562,22413313,22740993,23658499,23789570,23855106,24051717,24313857,24379393,24772609,24838145],"responds":[2162691,6094849,6160385,6225921,21954563],"responses":[2162690,6160385,6225921,13762561,13828097,13959169,16187393,16318465,16842753,21626881,21692417,21823489,21954562,23789570],"remote":[2162690,6291457,6356993,6946817,12320777,14090241,15400961,17498113,20054017,21954562,22020099,23199745,23658499,23855105,23920641,24051713,24772609],"requesting":[2228225,6553601,22020097],"returned":[2228227,3538946,6553601,6684674,10420225,10813441,22020099,23986178,24772611],"ready":[2228225,6553601,22020097,22282242],"reached":[2228226,6553601,6684673,22020098],"requires":[2228225,6553601,22020097],"reclaimed":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"releasing":[2686977,22937601],"resetting":[2686977,22937601],"reads":[2686978,4259842,11468801,11534337,22937602,24903682],"remove":[3276801,9306121,23658497],"removeat":[3276801,9371657,23658497],"root":[3473409,11075585,11141121,11206657,11272193,13303809,13369345,15597569,15663105,20971521,21168129,23920641,24576002,24641538],"runtime":[3473409,23920641],"representation":[3473409,12320769,15269889,23199745,23920642],"return":[3932162,4521985,4587521,4718593,4784129,4849665,4980737,5046273,5177345,5242881,5373953,5439489,5505025,5570561,5832705,5898241,5963777,6094849,6160385,6225921,6291457,6356993,6553601,6619137,6684673,6881281,7208961,7274497,7602177,8126465,8388609,8781825,8912897,9109505,9175041,9306113,9699329,9764865,9895937,9961473,10027009,10092545,10158081,10223617,10354689,10420225,10485762,10551298,10616833,10747905,10813441,11337729,11468801,11534337,11599873,11665409,11927553,11993089,12320772,13238274,21561345,21626881,21692417,21757953,22413313,22740993,24379393,24444930,24772609,24838145],"register":[3997697,10682369,14221313,15335426,17760257,20709377,20774913,22347777,23986178,24510465],"runbenchmark":[4325377,11730952,24969217],"runs":[4325377,11730945,24969217],"requestmarshaller":[5767173,9502725,13959169,15204353,16777221,19464197,21823489,23855105],"responsemarshaller":[5767173,9502725,13959169,15204353,16842757,19529733,21823489,23855105],"ref":[6094850,6160386,6225922,6291458,6356994,6881282,9961474,10027010,10092546,10158082,11468801,11534337,11599873,11665409,21495809,21561345,21626881,21692417,21757953,21954561,22020097,22085633,22151169,22347777,22413314,22544385,22609921,22675457,22740994,22806529,23330817,23396353,23527425,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379394,24444929,24510465,24576001,24641537,24838146,24903681,24969217,25034753,25100289,25231361],"reponse":[6160385],"req":[6225925,6291461,6356997],"resulting":[9568257,9633793,12320770,15269889,19726337,23658497,23920642],"responseheaders":[9764869],"roots":[11010049,13303809,24576001],"rootcertificates":[11075590,11141125,11272198,15597569,15663105,20971525,21168133,24576001,24641537],"rejected":[11272193,24772609],"registered":[12255233,21495809],"representing":[12320769,21430273],"reuse":[12320770,22020098],"redirect":[12386305,21430273],"requeststream":[13697025,13762561,15859717,16056325,21561345,21626881,22413317,22740997],"responseasync":[13697025,13893633,15925253,16384005,21561345,21757953],"responseheadersasync":[13697025,13762561,13828097,13893633,15990789,16121861,16252933,16449541,21561345,21626881,21692417,21757953],"responsestream":[13762561,13828097,16187397,16318469,21626881,21692417,22740997,24379397],"resolvedtarget":[14090241,17498117,22020097],"resolved":[14090241,17498113,22020097],"requestheaders":[15400961,20119557,24051713],"responsetrailers":[15400961,20185093,24051713],"recover":[22282242],"raised":[24772609],"regardless":[24772609],"requested":[24772609],"rejections":[24772609],"resource":[24772610],"resource_exhausted":[24772609],"resourceexhausted":[24772609],"required":[24772609],"rmdir":[24772609],"range":[24772609],"reading":[24772609],"retrying":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_115.json b/doc/ref/csharp/html/fti/FTI_115.json new file mode 100644 index 00000000000..37245fd262a --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_115.json @@ -0,0 +1 @@ +{"search":[65537],"sort":[65537],"serializeobjectstate":[131073,23920641],"serialized":[131074,23920642],"state":[131073,2228227,6553602,6684673,12320769,14090242,17563654,22020101,22282241,23920641,24772611],"stats":[196609,655361,22151169],"sequence":[196609,786433,22151169],"streams":[196609,851969,6160385,22151169],"start":[196609,983041,3538945,3932161,3997697,10485761,10682369,10878981,13238273,22151169,23986177,24444929,24510465],"secondaryuseragentstring":[196609,1048581,22151169],"secondary":[196609,1048577,22151169],"ssltargetnameoverride":[196609,1114117,22151169],"ssl":[196609,1114113,11010049,11075585,11141121,11206657,11272193,12320770,13303811,13369346,22151169,24576004,24641539],"suffix":[327681,1245185,8978433,9043969,23658497],"serverport":[393219,1376258,3735555,3932161,9895941,10485773,10616838,12320769,13238273,15532035,20447235,20512771,20578307,20643843,24182792,24444933],"server":[393218,1376258,2162693,3538950,3866625,3932166,3997700,6094849,6160385,6225923,9895938,10092545,10420227,10485765,10551300,10616834,10682373,10747906,10813443,10878979,10944518,11141121,11206657,11272193,12320793,13172737,13238277,13369346,14221313,14745601,15204353,15335432,15466497,15597569,17825793,18284545,19333121,20381697,20447234,20512769,20709386,20774922,20840451,20971521,21430273,21692417,21954565,22347777,22413313,22609922,22740993,23199745,23265281,23658498,23789572,23855105,23986196,24051713,24117250,24182788,24248321,24313857,24379394,24444936,24510469,24576001,24641539,24772609,24838145],"status":[458755,1441799,1507335,1769473,1835009,1900545,1966081,4194308,4784134,4980742,5177350,5439494,9568269,9633805,11337731,11403271,12320772,13107204,15269890,15400962,15728644,19726348,20250637,21233666,21299203,21561345,21626881,21692417,21757953,23658497,23920647,24051714,24707082,24772610],"statuscode":[458754,1441793,1507329,11403274,12320770,15728641,21299211,24707076,24772613],"successful":[458753,1507329,24707073,24772609],"structure":[458753,1441793,1507329,2031617,2097153,3211265,3342337,4194305,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,8454145,8912897,8978433,9043969,11337729,11403265,12320769,12517377,13041665,13959169,14024705,15007745,15138817,15728641,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,18743297,18808833,18939905,19005441,19070977,19136513,21233665,21299201,21823490,21889026,23592962,23724034,24707074],"syntax":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468802,11534338,11599874,11665410,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189697,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22413313,22478849,22544385,22609921,22675457,22740993,22806529,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24707073,24772609,24838145,24903681,24969217,25034753,25100289,25165825,25231361],"string":[655365,720901,786437,851973,917509,983045,1048581,1114117,1245189,1572869,1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014661,3080196,3276804,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932162,3997697,4063233,4128769,4194305,4390915,4456449,4521989,5701638,5767180,6422534,6488078,6750214,6815750,7340042,7405577,7471115,7536650,7667721,7733259,7798794,7929863,7995401,8060936,8192007,8257545,8323080,8585225,8650770,8912903,8978438,9043981,9502730,9633798,9895941,10289157,10354693,10551302,11075592,11141127,11272198,11337735,11403269,11862022,11993095,12124166,12320769,12517379,12582916,12648450,12713986,12779522,12845058,12910594,12976131,13041667,13107201,13238273,13303811,13369345,13500417,13565953,13631489,14155777,14942209,15138817,15269889,16580614,16646150,17301510,17367047,17498118,17629190,17825799,18284550,18350086,18415622,18546694,18612230,18677767,19005446,19070983,19333127,19398663,19595271,19922950,19988486,20054022,20578310,20971526,21168134,21233670,21561345,21626881,21692417,21757953,21823491,22020099,22085638,22216706,22347777,22544385,22609921,22675457,22806529,22872069,23330817,23396357,23461892,23527425,23658500,23724037,23855105,23920643,23986177,24051713,24117249,24182785,24248321,24313857,24444930,24510465,24576004,24641538,24707074,25034755,25231361],"static":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179651,1245185,1310723,1376257,1441795,1507331,1572865,1638403,4521987,4587523,6094851,6160387,6225923,6291459,6356995,7143427,8388611,10354691,11468803,11534339,11599875,11665411,11730947,11796483,11862019,11927555,11993091,12058627,12124163,18022403,18087939,18677763,20381699,21495809,21954561,22151169,23527425,24903681,24969217,25034753,25100289],"shared":[1179649,1310721,1441793,1507329,1638401,4521985,4587521,6094849,6160385,6225921,6291457,6356993,7143425,8388609,10354689,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,18022401,18087937,18677761,20381697],"stream":[1769473,1835010,1900545,1966081,2162693,2686978,2818051,2883585,4259845,4653057,4915202,5111809,5308417,6094849,6160387,6225922,7274497,11468801,11534337,11599874,11665409,12320772,13434883,13697025,13762562,13828097,15859713,16056321,16187393,16318465,21561346,21626884,21692418,21757953,21954565,22937603,23003137,23068676,23265282,23789571,24903685,25165825],"specified":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014658,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4456449,7602177,8126465,8388609,12320769,12386305,21430273,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085634,22347777,22544385,22609921,22675457,22806529,23330817,23396354,23461889,23527425,23592961,23658497,23724033,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707073,24772610,25231361],"serves":[1769473,1835009,1900545,1966081,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3276801,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4456449,21561345,21626881,21692417,21757953,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23658497,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,25231361],"set":[2031617,2097155,5570561,5832705,5898241,5963777,7012354,12255233,14221314,14548993,14614529,14811137,17760260,17825798,18153477,18219012,19267589,20250628,20316164,21430273,21823489,21889027,22347778,23003137,23068673,23265281],"streaming":[2162694,3866627,6094850,6160386,6225922,9961473,10027009,10092545,12320774,12451841,13172739,13697025,13762562,13828097,15400961,15859713,16056321,16187393,16318465,20316161,21561346,21626883,21692418,21954566,22413313,22740993,24051713,24313859,24379393,24903681],"scenario":[2162691,6094849,6160385,6225921,21954563],"sends":[2162691,3604482,6094849,6160385,6225921,9764866,21954563,24051714],"single":[2162689,2752513,2818049,2883585,3866626,6094849,7208961,10158082,12320772,13172738,14221313,17825793,21757954,21954561,22020097,22347777,23003137,23068673,23265281,23789572,23986177,24313858],"sending":[2162689,6160385,21954561],"simple":[2162690,4325377,6291457,6356993,11730945,21954562,24969217],"starting":[2228226,6553602,22020098],"shallow":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"shutdownasync":[2228225,3538945,6619141,10813445,22020097,23986177],"setlogger":[2621441,7143430,22806529],"sets":[2621441,3473409,7143425,14680065,15269891,18219009,22806529,23134209,23920644],"severity":[3014662,3080198,7405569,7471105,7536641,7667713,7733249,7798785,7929857,7995393,8060929,8192001,8257537,8323073,12713986,12779522,12845058,12910594,23396358,23461894],"serializer":[3145729,8388615,8454149,15007746,18808838,23527425,23592962],"subsequent":[3473409,14548993,14614529,14811137,18153473,23003137,23068673,23265281,23920641],"serializationinfo":[3473409,23920641],"shutdown":[3538948,10420226,10813442,12320769,22806529,23986180],"serviced":[3538945,10813441,23986177],"starts":[3538945,10878977,23986177],"servercallcontext":[3604483,6029313,9699331,9764866,12320770,15400963,19791874,19857410,19922946,19988482,20054018,20119554,20185090,20250626,20316162,22413317,22740997,23134209,24051719,24379397,24838149],"servercredentials":[3670019,3932161,9830406,9895941,10551302,12320769,13238273,15466499,20381704,20512774,24117257,24444929,24641541],"serverservicedefinition":[3801092,3866627,9961479,10027015,10092551,10158087,10223625,10289154,10354696,10682374,10747910,12320772,13172737,24248329,24313862,24510468],"serverstreamingservermethod":[3866625,10092550,12320769,13172737,24313857,24379397],"serverportcollection":[3932163,10485763,10551298,10616834,12320769,13238274,20709382,24444935],"servicedefinitioncollection":[3997699,10682371,10747906,12320769,20774918,24510471],"service":[3997698,9502721,10289153,10354689,10682370,12320770,14745601,15204353,15335425,18415617,19595265,20774913,23199745,23855105,23986177,24248321,24510467,24772610],"sslcredentials":[4063235,11010054,11075591,11141126,12320769,13303813,15597571,20905986,20971522,22675457,24576010],"sslservercredentials":[4128771,11206662,11272198,12320769,13369348,15663107,21037058,21102594,21168130,24117249,24641545],"system":[4521985,5701633,5767170,5832705,5898241,6029314,6422530,6488066,6553601,6684677,6750210,6815747,7012354,7340034,7405574,7471116,7536646,7667718,7733260,7798790,7929862,7995404,8060934,8192006,8257548,8323078,8388622,8454146,8585224,8650760,8847364,8978434,9043970,9240580,9371651,9502722,9633793,9895938,10289153,10354689,10551298,10944513,11075586,11141121,11206657,11272195,11403265,11468807,11599882,11665412,11730956,11796481,11862018,11993090,12058625,12124162,12386305,19267586,21495809,21561345,21626881,21692417,21757953,21954561,22020097,22085633,22151169,22347777,22544385,22609921,22675457,22806529,22872065,23330817,23396354,23527425,23658497,23855105,23920642,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24772613,24903681,24969217,25034753,25100289,25231361],"sub":[4653057,4915201,5111809,5308417,5636097,5701633,5767169,6029313,6422529,6488065,6750209,6815745,6946817,7012353,7077889,7143425,7340033,7405569,7471105,7536641,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8192001,8257537,8323073,8454145,8519681,8585217,8650753,8716289,8847361,8978433,9043969,9240577,9371649,9437185,9502721,9568257,9633793,9830401,9895937,10289153,10682369,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11403265,11730945,11796481,11862017,12058625,12124161,12189697,22872065],"sealed":[4653057,4915201,5111809,5308417,7405569,7471105,7536641,7602177,7667713,7733249,7798785,8519681,8716289,8781825,8847361,9109505,9175041,9240577,9306113,9371649,10616833,10747905,18874369,19202049,19267586,19333121,19398657,19595265,19660801,21495809,21561346,21626882,21692418,21757954,21954561,22085634,22151169,23330818,23527425,23658498,24576002,24903681,24969217,25034753,25100289],"struct":[5636097,5701633,5767169,6029313,6094850,6160386,6225922,6291458,6356994,6881282,8978433,9043969,9961474,10027010,10092546,10158082,11468801,11534337,11599873,11665409,12517379,13041666,21823493,21889027,23592962,23724036,24707074],"sent":[6029313,12320773,15400961,20119553,23658501,23789571,24051713],"stringvalue":[6488069,14155777,17367045,22085633],"specific":[6750209,6815745,7864321,12648450,15269889,22020098,23396353,23920641],"secure":[6750210,6815745,9895937,10551297,12320769,12648449,22020097,22675457],"serialize":[8454145,13959169,16777217,21823489],"summary":[8519681,8585217,8650753,8716289,8781825,8847361,9109505,9175041,9240577,9306113,9371649,18874369,19202049,19267585,20447233,20512769,20578305,20643841],"servicename":[9502725,10289157,10354693,14745601,15204353,18415621,19595271,23199745,23855105],"send":[9764865,13697025,13762561,14024705,15400962,15859713,16056321,17039361,20185089,20250625,21561345,21626881,21889025,24051714],"servicedefinition":[10682374],"streamreader":[11468806,11534342],"streamwriter":[11599878,11665414],"stubs":[12255233,12320769,21495809,22347777],"servers":[12320769,22020097],"supported":[12320770,22151169,23789569,24772609],"situations":[12320769,22609921],"sense":[12320769,22609921],"supports":[12320769,14221313,17825793,22347777,23658497],"services":[12320769,15335426,20774918,23986179],"structures":[12320769],"serializing":[12320769,23592961],"sharing":[12320769,23134209],"simplify":[12451842,24903681,25034753],"started":[14221313,15335426,17760257,20709377,20774913,22347777,23986178],"served":[14221313,17825793,22347777],"security":[14352385,15466497,18022401,20381697,22675457,24117249],"stringmarshaller":[14942209,18677765,23527425],"source":[15269889,23920641],"stacktrace":[15269889,23920641],"stack":[15269889,23920641],"shutdowntask":[15335425,20840453,23986177],"signals":[15400961,19791873,24051713],"setting":[15400961,20316161,24051713],"success":[15728641,21299201,24707073,24772609],"sealedattribute":[21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22085633,22151169,23330817,23527425,23592961,23658497,23724033,24576001,24707073,24903681,24969217,25034753,25100289],"serverstreaming":[23789569],"simultaneously":[23789569],"space":[24772612],"successfully":[24772609],"sequencer":[24772609],"seeking":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_116.json b/doc/ref/csharp/html/fti/FTI_116.json new file mode 100644 index 00000000000..5e6f03ef405 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_116.json @@ -0,0 +1 @@ +{"topic":[1],"title":[65537],"type":[131073,196609,262145,327681,393217,458753,524289,589825,655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,1703938,1769474,1835010,1900546,1966082,2031619,2097155,2162689,2228226,2293762,2359298,2424834,2490370,2555906,2621442,2686977,2752513,2818049,2883585,2949122,3014659,3080194,3145729,3211267,3276802,3342338,3407874,3473410,3538946,3604482,3670018,3735554,3801090,3866626,3932164,3997698,4063234,4128770,4194306,4259841,4325377,4456450,4521986,4587523,4718593,4784129,4849665,4980737,5046273,5177345,5242881,5373953,5439489,5505025,5570562,5636099,5701636,5767174,5832706,5898242,5963778,6029317,6094852,6160389,6225925,6291461,6356997,6422530,6488066,6553602,6619137,6684675,6750211,6815748,6881286,6946817,7012354,7143425,7208962,7274497,7340034,7405570,7471107,7536642,7602179,7667714,7733251,7798786,7864321,7929858,7995395,8060930,8126467,8192002,8257539,8323074,8388612,8454146,8519681,8585218,8650754,8781826,8847362,8912897,8978434,9043970,9109505,9175042,9240578,9306114,9371649,9502731,9568257,9633794,9699330,9764866,9895940,9961476,10027012,10092548,10158084,10223617,10289153,10354690,10420225,10485763,10551301,10616833,10682369,10747905,10813441,10944513,11075585,11141122,11206657,11272195,11337729,11403266,11468805,11534340,11599878,11665413,11730947,11796481,11862018,11927555,11993092,12058625,12124162,12189697,12320773,13238274,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155779,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745603,14811137,14876673,14942210,15007745,15073281,15138817,15204355,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432583,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481159,18546689,18612225,18677762,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267586,19333121,19398657,19464193,19529729,19595265,19660809,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495811,21561351,21626887,21692422,21757958,21823495,21889028,21954562,22020099,22085637,22151170,22216706,22282241,22347779,22413319,22478849,22544387,22609923,22675459,22741000,22806531,22872068,22937604,23003140,23068676,23134210,23199748,23265283,23330819,23396357,23461891,23527427,23592965,23658499,23724035,23789569,23855112,23920643,23986179,24051715,24117251,24182787,24248323,24313859,24379400,24444933,24510467,24576003,24641539,24707075,24772609,24838151,24903682,24969218,25034753,25100290,25165825,25231363],"top":[131073,196609,262145,327681,393217,458753,524289,589825,1703937,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686978,2752513,2818050,2883586,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4390913,4456449,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,21495809,21561346,21626882,21692418,21757954,21823491,21889027,21954561,22020099,22085635,22151169,22347779,22544388,22609921,22675459,22806530,22937603,23003138,23068675,23134209,23199745,23265283,23330819,23396354,23461889,23527426,23592963,23658500,23724035,23855107,23920644,23986179,24051714,24117251,24182788,24248321,24313858,24444929,24510465,24576003,24641539,24707076,24903681,24969217,25034753,25100289,25231364],"tracing":[196609,655361,12320769,22151169,22609921],"transports":[196609,786433,22151169],"target":[196609,1114113,6750214,14090242,14221313,17629190,17825793,22020098,22151169,22347777],"testing":[196609,1114113,14942209,18677761,22151169,23527425],"token":[1703938,3604481,4521986,4587521,5832705,6029313,7012353,9699329,12320771,14024706,14286849,15400961,16908289,17104897,17891329,19791873,21495810,21889026,22544385,22609923,24051714],"trequest":[1769475,1835011,2031620,2162693,2359297,3407875,3866636,4653058,4718594,4784130,4849666,4915202,4980738,5046274,5570568,5636106,5701642,5767178,6094866,6160402,6225938,6291474,6357010,6881298,9502727,9961492,10027028,10092564,10158100,12320776,12517387,13172748,13697027,13762563,13959171,15204355,15859720,15925250,15990786,16056328,16121858,16187394,16515074,16580610,16646146,16711682,16777224,16842754,19333122,19398658,19464200,19529730,19595266,19660802,21561352,21626888,21823505,21954565,22347777,22413324,22741004,23855113,24313868,24379404,24838156],"tresponse":[1769475,1835011,1900547,1966083,2031620,2162693,2359297,3407875,3866636,4653058,4718599,4784130,4849666,4915202,4980738,5046274,5111810,5177346,5242882,5308418,5373959,5439490,5505026,5570568,5636106,5701642,5767178,6094866,6160402,6225938,6291474,6357010,6881298,9502727,9961492,10027028,10092564,10158100,12320778,12517387,13172748,13697027,13762563,13828099,13893635,13959171,15204355,15859714,15925256,15990786,16056322,16121858,16187400,16252930,16318472,16384008,16449538,16515074,16580610,16646146,16711682,16777218,16842760,19333122,19398658,19464194,19529736,19595266,19660802,21561352,21626888,21692424,21757960,21823505,21954565,22347777,22413324,22741004,23855113,24313868,24379404,24838156],"terminate":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,21561345,21626881,21692417,21757953],"throws":[1769474,1835010,1900546,1966082,4390918,4784129,4849665,4980737,5046273,5177345,5242881,5439489,5505025,11796481,11862017,11927553,11993089,12058625,12124161,13500418,13565954,13631490,15269889,21561346,21626882,21692418,21757954,23920641,25034758],"trailing":[1769473,1835009,1900545,1966081,4849665,5046273,5242881,5505025,21561345,21626881,21692417,21757953],"tostring":[1769473,1835009,1900545,1966081,2031617,2097153,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3211265,3276801,3342338,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194306,4456449,8912902,11337734,21561345,21626881,21692417,21757953,21823489,21889025,22020097,22085633,22347777,22544385,22609921,22675457,22806529,23330817,23396353,23592961,23658497,23724034,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24576001,24641537,24707074,25231361],"time":[2162689,2752513,2818049,2883585,6160385,7208961,14221313,17760257,21954561,22347777,23003137,23068673,23265281],"task":[2228227,3538946,6553607,6619141,6684678,7208965,7274501,9764870,10420230,10813446,11468813,11534341,11599877,11665413,15925254,15990790,16121862,16252934,16384006,16449542,20840454,22020099,22413317,22740997,23986178,24379397,24838149],"try":[2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"tasks":[2228225,2686977,6684673,11468803,22020097,22937601],"tolistasync":[2686977,4259841,11534343,22937601,24903681],"tokens":[4587521],"taskawaiter":[4718597,5373957],"threading":[5832705,6029313,11468803],"typename":[6094850,6160386,6225922,6291458,6356994,6881282,7602177,8126465,8388609,9961474,10027010,10092546,10158082,11468801,11534337,11599873,11665409,11927553,11993089,21561346,21626882,21692417,21757953,21823490,22413314,22740994,22937601,23003137,23068673,23265281,23592961,23855106,24379394,24838146],"true":[7012362,11272193,11599876,14286850,15138817,15663105,17891329,17956865,18939905,21037057,22544386,23724033,24641537],"typeparam":[7602177,8126465,8388609,11468801,11534337,11599873,11665409,11927553,11993089,23265281,23592961],"types":[12320770,23658497,23789569],"trailers":[12320769,15400961,20185089,23658497,24051713],"thrown":[12320769,23920641],"targetsite":[15269889,23920641],"termination":[15335425,20840449,23986177],"transientfailure":[22282241],"typically":[24772610],"transaction":[24772609],"transient":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_117.json b/doc/ref/csharp/html/fti/FTI_117.json new file mode 100644 index 00000000000..d53c17bcd08 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_117.json @@ -0,0 +1 @@ +{"user":[196612,983042,1048578,15269889,22151172,23920641,24772609],"used":[196609,262145,1114113,1179649,1769473,1835009,1900545,1966081,2228225,2621441,3538945,3604481,4653057,4915201,5111809,5308417,5701633,6029314,6619137,7143425,8454146,9502722,9699329,10813441,11272193,12320770,13959170,14024706,14090241,14221314,14417921,14548994,14614530,14811138,15204354,16777217,16842753,16908289,17170433,17629185,17760257,17825793,18087937,18153474,19464193,19529729,21561345,21626881,21692417,21757953,21823490,21889026,22020098,22151169,22347778,22544385,22675457,22806530,23003138,23068674,23265283,23855106,23986177,24051713,24772610],"unused":[393217,1376257,9895937,10551297,24182785],"unless":[2228225,2818049,4259841,6553601,11272193,11599873,13434881,22020097,23068673,24903681],"unmanaged":[2686977,22937601],"unaryservermethod":[3866625,10158086,12320769,13172737,24313857,24838149],"utils":[4259841,4325377,4390913,11468805,11534340,11599878,11665413,11730949,11796482,11862018,11927555,11993091,12058626,12124162,12451841,13434881,13500417,13565953,13631489,21430273,24903683,24969219,25034755],"unit":[4653060,4718593,4784129,4849665,4915204,4980737,5046273,5111812,5177345,5242881,5308420,5373953,5439489,5505025,6619137,7077889,7143425,7274497,7405570,7471106,7536642,7602178,7667714,7733250,7798786,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8519682,8585217,8650753,8716292,8847362,8912898,9109506,9240578,9371650,9437185,9830401,10223617,10420225,10616834,10682369,10747906,10813441,10878978,11010049,11337730,11730945,11796481,11862017,12058625,12124161,22872065],"unsecure":[6750209,12648449,14352385,15466497,18022401,20381697,22020097,22675457,24117249],"unsigned":[8388610,8454146,8585217,8978433,18743298,18808834,19136514],"unqualified":[9502721,14745601,15204353,18350081,19398657,23199745,23855105],"using":[11206657,11272193,12320769,13369345,21954561,24641537],"unthenticity":[11272193],"usage":[11468801,11534337,11599873,11665409],"uses":[12255233,21430273],"users":[12320769,21954561],"utilities":[12320769,12451841,21430273,23527425],"unary":[12320769,23789569,24838145],"utility":[12451842,24969217,25034753],"uri":[14090241,15400961,17498113,20054017,22020097,24051713],"useful":[14942209,18677761,20447233,23527425],"underlying":[15400961,20316161,24051713,24772609],"unknown":[24772610],"unauthenticated":[24772610],"unimplemented":[24772609],"unavailable":[24772610],"unrecoverable":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_118.json b/doc/ref/csharp/html/fti/FTI_118.json new file mode 100644 index 00000000000..934344f41fd --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_118.json @@ -0,0 +1 @@ +{"value":[393217,655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376258,1441793,1507329,1572865,1638401,2031617,2097155,3932162,4521985,4587521,4718593,4784129,4849665,4980737,5046273,5177345,5242881,5373953,5439489,5505025,5570562,5832706,5898242,5963778,6094849,6160385,6225921,6291457,6356993,6422530,6488066,6553601,6619137,6684673,6881281,7208961,7274497,7602177,8126465,8388609,8650758,8781825,8912897,8978434,9043975,9109505,9175041,9306113,9699329,9764865,9895937,9961473,10027009,10092545,10158081,10223617,10354689,10420225,10485762,10551298,10616833,10747905,10813441,11337729,11468801,11534337,11599873,11665409,11927553,11993089,12582914,13041666,13238274,14155778,14548993,14614529,14811137,15138820,15269890,15400961,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235970,17301505,17367042,17432577,17498113,17563649,17629185,17694721,17760258,17825794,17891329,17956865,18022401,18087937,18153475,18219010,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939906,19005441,19070983,19136514,19202049,19267586,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250626,20316163,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21823490,21889028,22085636,22216707,22282241,22413313,22478849,22740993,23003137,23068673,23265281,23592961,23724039,23789569,23920642,24051713,24182785,24379393,24444930,24707073,24772610,24838145,25165825],"versioninfo":[524291,1572866,12320769,25100295],"version":[524289,655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572866,1638401,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189697,12320769,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22413313,22478849,22544385,22609921,22675457,22740993,22806529,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24707073,24772609,24838145,24903681,24969217,25034753,25100291,25165825,25231361],"val":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401],"valuetype":[2031619,2097155,3211267,3342339,4194307,21823491,21889027,23592963,23724035,24707075],"values":[2031617,2097155,5570561,5832705,5898241,5963777,15728641,21299201,21823489,21889027,24707073],"void":[4653058,4915202,5111810,5308418,7143426,7405570,7471106,7536642,7667714,7733250,7798786,7929858,7995394,8060930,8192002,8257538,8323074,8519682,8585218,8650754,8716290,8847362,9240578,9371650,10682370,10878978,11730946,11796482,11862018,12058626,12124162,17760257,17825793,18153473,18219009,19267585,20250625,20316161,22872066],"virtual":[4653057,4915201,5111809,5308417,7405569,7471105,7536641,7602177,7667713,7733249,7798785,8519681,8716289,8781825,8847361,8912897,9109505,9175041,9240577,9306113,9371649,10616833,10747905,11337729,18874369,19202049,19267585,19333121,19398657,19595265,19660801],"valuebytes":[8585222,8978437,15138817,19136517,23724033],"valued":[8978433,9043969],"variable":[11010049,13303809,24576001],"visual":[11468802,11534338,11599874,11665410],"various":[12451841,21430273],"valid":[24772610]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_119.json b/doc/ref/csharp/html/fti/FTI_119.json new file mode 100644 index 00000000000..ee9112dc18a --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_119.json @@ -0,0 +1 @@ +{"writeoptions":[589827,1638407,4456451,6029324,12189702,12320769,14024705,14548993,14614529,14680065,14811137,15400961,15794179,17170443,18153484,18219020,20316172,21364738,21889025,23003137,23068673,23134209,23265281,24051713,25231369],"write":[589825,1638401,2752513,2818050,2883585,6029313,7208961,7274497,12189697,12320771,14024705,14548994,14614530,14680065,14811138,15400962,15794177,17170433,18153474,18219009,20316162,21364737,21889025,23003139,23068676,23134210,23265283,24051714,25165829,25231363],"withoptions":[2031617,5570566,21823489],"withcancellationtoken":[2097153,5832709,21889025],"withdeadline":[2097153,5898245,21889025],"withheaders":[2097153,5963781,21889025],"waits":[2228225,6619137,22020097],"waitforstatechangedasync":[2228225,6684679,22020097],"wide":[2621441,7143425,14417921,18087937,22806530],"writeasync":[2752513,2818049,2883585,7208965,23003137,23068673,23265281],"writes":[2752513,2818051,2883586,4259842,7208961,7274497,11599873,11665409,13434882,14548993,14614529,14811137,18153473,23003138,23068676,23265283,24903682],"writeallasync":[2818049,2883585,4259842,11599882,11665417,13434883,23068673,23265281,24903682],"warning":[3014660,3080196,7733260,7798795,8257546,8323081,12779525,12910597,23396356,23461892],"writeresponseheadersasync":[3604482,9764870,24051714],"written":[3604481,7208961,9764866,24051713],"writing":[3604481,9764865,24051713],"warmup":[4325377,11730945,24969217],"wish":[11206657,13369345,24641537],"warmupiterations":[11730950],"writeflags":[12189701,12320769,21364742,25165829],"wrappers":[12255233,21430273],"writable":[12320771,23003137,23068673,23265281],"work":[12451841,22282241,24903681],"whatsoever":[14352385,15466497,18022401,20381697,22675457,24117249],"wire":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_122.json b/doc/ref/csharp/html/fti/FTI_122.json new file mode 100644 index 00000000000..6a0eef704ab --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_122.json @@ -0,0 +1 @@ +{"zero":[9895937,10551297]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_97.json b/doc/ref/csharp/html/fti/FTI_97.json new file mode 100644 index 00000000000..2a75124bdfa --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_97.json @@ -0,0 +1 @@ +{"automatically":[1,9895937,10551297,20447233],"authority":[196609,720897,22151169],"allow":[196609,851969,15335425,20840449,22151169,23986177],"agent":[196612,983042,1048578,22151172],"added":[393217,1376257,24182785],"assembly":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189697,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020097,22085633,22151169,22216705,22282241,22347777,22413313,22478849,22544385,22609921,22675457,22740993,22806529,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396353,23461889,23527425,23592961,23658497,23724033,23789569,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24379393,24444929,24510465,24576001,24641537,24707073,24772609,24838145,24903681,24969217,25034753,25100289,25165825,25231361],"authinterceptors":[1703939,4521986,4587522,12255233,21495815],"access":[1703938,4521986,4587522,6094849,6160385,6225921,6291457,13697025,13762561,13828097,13893633,15990785,16121857,16252929,16449537,21495810,21561345,21626881,21692417,21757953],"authorization":[1703937,4521985,12255233,21495810],"auth":[1703937,4521988,4587524,12255235,21430275,21495813],"asyncclientstreamingcall":[1769475,2162689,4653058,4718594,4784130,4849666,6094858,12320769,13697027,15859714,15925250,15990786,21561351,21954561],"async":[1769473,1835009,1900545,1966081,2686977,4259841,4653057,4915201,5111809,5308417,11468801,13697025,13762562,13828097,15859713,16056321,16187393,16318465,21561346,21626883,21692418,21757953,22937601,24903681],"associated":[1769473,1835009,1900545,1966081,2686977,3014659,3080195,4653057,4915201,5111809,5308417,7471105,7602177,7733249,7864321,7995393,8126465,8257537,9568257,9633793,12320769,12713985,12779521,12845057,12910593,13107202,13959169,14221313,15269889,16515073,17694721,21561345,21626881,21692417,21757953,21823489,22347777,22937601,23396356,23461891,23920644],"allows":[1769473,1966081,2228226,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,4718593,5373953,6553601,12320770,15400961,20316161,21561345,21757953,22020098,22347777,22544385,22609922,22675457,22806529,23134209,23396353,23855105,23920641,23986177,24051714,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"awaiting":[1769473,1966081,4718593,5373953,15335425,20840449,21561345,21757953,23986177],"asyncduplexstreamingcall":[1835011,2162689,4915202,4980738,5046274,6160394,12320769,13762563,16056322,16121858,16187394,21626887,21954561],"asyncserverstreamingcall":[1900547,2162689,5111810,5177346,5242882,6225930,12320769,13828099,16252930,16318466,21692423,21954561],"asyncunarycall":[1966083,2162689,5308418,5373954,5439490,5505026,6291466,12320769,13893635,16384002,16449538,21757959,21954561],"asynchronously":[2162692,2752513,2818049,2883585,3604481,6094849,6160385,6225921,6291457,7208961,9764865,21954564,23003137,23068673,23265281,24051713],"active":[2228225,6619137,22020097],"application":[2621441,2686977,7143425,12386305,14417921,15269889,18087937,21430273,22806530,22937601,23920641],"action":[2686977,4259841,11468801,11730958,22937601,24903681],"asyncstreamextensions":[2686978,2818049,2883585,4259843,11468805,11534340,11599878,11665413,12451841,13434882,22937602,23068673,23265281,24903687],"add":[3276803,3932162,3997697,8519690,8585225,8650761,10485767,10551302,10682374,12976132,13238275,23658499,24444930,24510465],"addmethod":[3866628,9961478,10027014,10092550,10158086,13172741,24313860],"adds":[3866628,3932162,3997697,9961473,10027009,10092545,10158081,10485761,10551297,10682369,13172740,13238274,24313860,24444930,24510465],"argumentexception":[4390914,11796481,11862017,13500418,25034754],"argumentnullexception":[4390914,11927553,11993089,13565954,25034754],"accesstoken":[4521989],"abstract":[4653057,4915201,5111809,5308417,7208961,7274497,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8519681,8716289,8781825,8847361,8912897,9109505,9175041,9240577,9306113,9371649,10616833,10747905,11337729,18153473,18219009,18284545,18350081,18415617,18481153,18874369,19202049,19267585,19333121,19398657,19595265,19660801,21495809,21954561,22151169,22347778,22675458,23527425,24117250,24903681,24969217,25034753,25100289],"awaitable":[6094849,6291457],"asynchronous":[6160385,6225921,13697026,13762561,13828097,13893634,15925249,15990785,16121857,16252929,16384001,16449537,21561346,21626881,21692417,21757954],"address":[6815745,14090241,15400961,17498113,20054017,22020097,24051713,24772610],"array":[7405569,7471105,7536641,7667713,7733249,7798785,7929857,7995393,8060929,8192001,8257537,8323073,8388610,8454146,8585217,8847368,8978433,18743298,18808834,19136514],"arrayindex":[8847367],"ascii":[9043970,13041665,23724033],"allowed":[9043969],"autheticate":[11206657,13369345,24641537],"authenticate":[11272193],"asyncaction":[11468806],"authentication":[12255233,21430273,24772609],"apis":[12255233,21430273,24772609],"autogenerated":[12255233,12320769,21495809,24248321],"abstraction":[12320769,22020097],"accessible":[12320769,22609921],"arbitrary":[12320769,23789569,23986177],"additional":[15269889,23920641],"assigned":[15269889,23920641],"adding":[15335426,20709377,20774913,23986178],"authenticity":[15663105,21037057,24641537],"actually":[20447233],"abstractclassattribute":[21495809,21954561,22151169,22347777,22675457,23527425,24117249,24903681,24969217,25034753,25100289],"authuri":[22872069],"argument":[24772609],"arguments":[24772609],"alreadyexists":[24772609],"attempted":[24772610],"applied":[24772609],"aborted":[24772610],"aborts":[24772609]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_98.json b/doc/ref/csharp/html/fti/FTI_98.json new file mode 100644 index 00000000000..aa09b59f12a --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_98.json @@ -0,0 +1 @@ +{"binaryheadersuffix":[327681,1245189,23658497],"binary":[327681,1245185,8978434,9043969,13041665,15138818,18939905,19136513,23658497,23724035],"bound":[393217,1376257,20447233,24182785],"boundport":[393217,1376257,15532033,20447238,24182786],"blockingunarycall":[2162689,6356997,21954561],"blocking":[2162689,6356993,21954561],"byte":[3276801,8388622,8454152,8585224,8978437,12976129,13041665,18743300,18808836,19136516,23658497,23724033],"builder":[3801089,3866628,9961480,10027016,10092552,10158088,10223619,10289158,10354695,12320770,13172738,24248321,24313867],"bidirectional":[3866625,10027009,12320769,13172737,21626881,24313857],"build":[3866625,10223621,24313857],"boolean":[4259841,4390916,7012356,8781826,9306114,11272195,11599879,11796483,11862019,12058627,12124163,13369345,13434881,13500418,13631490,17891330,17956866,18939906,19202050,21037058,24641537,24903681,25034756],"benchmarkutil":[4325379,11730949,12451841,24969223],"benchmark":[4325377,11730945,24969217],"bool":[7012358,8781828,9306116,11272195,11599875,11796483,11862019,12058627,12124163,17891332,17956868,18939908,19202053,21037060],"bytes":[8978433],"belongs":[9502721,14745601,15204353,18415617,19595265,23199745,23855105,24772609],"basic":[11468802,11534338,11599874,11665410],"benchmarkiterations":[11730950],"based":[12255233,12320771,14745601,15204353,18284545,19333121,21430273,22282241,22478849,23199745,23855105,24772609],"buffer":[12320769,21954561,25165826],"base":[12320769,22347777],"backend":[12320770,22609922],"beginning":[12320770,14024705,17039361,21889025,23658498],"bindservice":[12320769,24248321],"buffers":[12320769,24248321],"bidi":[12320769,22740993],"backed":[15400961,20316161,24051713],"broken":[24772610],"backoff":[24772609],"bufferhint":[25165825],"buffered":[25165826]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_99.json b/doc/ref/csharp/html/fti/FTI_99.json new file mode 100644 index 00000000000..a53458d4f37 --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_99.json @@ -0,0 +1 @@ +{"create":[131073,3145729,8388616,10944513,12255233,14090241,17629185,21495809,22020097,23527425,23920641,23986177,24772609],"contains":[131073,3276801,5701633,5767169,8781833,12320769,21430273,23658497,23920641],"class":[131073,196609,262145,327681,393217,524289,589825,655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1572865,1638401,1703937,1769473,1835009,1900545,1966081,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2949121,3014657,3145729,3276801,3407873,3473411,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4259841,4325377,4390913,4456449,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,6094855,6160391,6225927,6291463,6356999,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881287,6946818,7012353,7077890,7143425,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,8388609,8519681,8585217,8650753,8716289,8781825,8847361,9109505,9175041,9240577,9306113,9371649,9437185,9502722,9568257,9633793,9699329,9764865,9830402,9895937,9961481,10027017,10092553,10158089,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11468804,11534340,11599876,11665412,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189698,12255233,12320772,12386305,12451841,12582913,12648449,12713985,12779521,12976129,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,13697025,13762561,13828097,13893633,14090241,14155777,14221313,14286849,14352385,14417921,14876673,14942209,15073281,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15794177,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18546689,18612225,18677761,18874369,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21364737,21495813,21561349,21626885,21692421,21757957,21823489,21889025,21954566,22020101,22085637,22151173,22216705,22282241,22347783,22413318,22478849,22544389,22609925,22675462,22740998,22806533,22937601,23003137,23068673,23134209,23199745,23265281,23330821,23396357,23461889,23527429,23592961,23658501,23724033,23789569,23855110,23920647,23986181,24051717,24117254,24182789,24248325,24313862,24379398,24444933,24510469,24576005,24641541,24707073,24772609,24838150,24903685,24969221,25034757,25100293,25165825,25231366],"core":[131073,196609,262145,327681,393217,458753,524289,589825,655364,720900,786436,851972,917508,983044,1048580,1114116,1179652,1245188,1310724,1376260,1441796,1507332,1572868,1638404,1769473,1835009,1900545,1966081,2031617,2097153,2162689,2228225,2293761,2359297,2424833,2490369,2555905,2621441,2686977,2752513,2818049,2883585,2949121,3014657,3080193,3145729,3211265,3276801,3342337,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4063233,4128769,4194305,4259841,4325377,4390913,4456449,4653060,4718596,4784132,4849668,4915204,4980740,5046276,5111812,5177348,5242884,5308420,5373956,5439492,5505028,5570567,5636103,5701639,5767176,5832708,5898244,5963781,6029319,6094853,6160389,6225925,6291461,6356997,6422532,6488068,6553604,6619140,6684681,6750213,6815749,6881286,6946821,7012356,7077892,7143431,7208964,7274500,7340036,7405574,7471111,7536646,7602181,7667718,7733255,7798790,7864324,7929862,7995399,8060934,8126469,8192006,8257543,8323078,8388615,8454148,8519689,8585223,8650759,8716293,8781833,8847371,8912900,8978436,9043972,9109509,9175049,9240587,9306121,9371654,9437188,9502727,9568261,9633797,9699335,9764869,9830404,9895941,9961478,10027014,10092550,10158086,10223620,10289156,10354692,10420228,10485767,10551301,10616836,10682375,10747908,10813444,10878980,10944516,11010052,11075589,11141125,11206660,11272196,11337732,11403269,11468811,11534345,11599885,11665419,11730951,11796484,11862020,11927557,11993093,12058628,12124164,12189701,12320771,12386305,12451841,12517377,12582913,12648449,12713985,12779521,12845057,12910593,12976129,13041665,13107201,13172737,13238273,13303809,13369345,13434881,13500417,13565953,13631489,13697025,13762561,13828097,13893633,13959169,14024705,14090241,14155777,14221313,14286849,14352385,14417921,14483457,14548993,14614529,14680065,14745601,14811137,14876673,14942209,15007745,15073281,15138817,15204353,15269889,15335425,15400961,15466497,15532033,15597569,15663105,15728641,15794177,15859716,15925252,15990788,16056324,16121860,16187396,16252932,16318468,16384004,16449540,16515076,16580612,16646148,16711684,16777220,16842756,16908292,16973828,17039364,17104900,17170436,17235972,17301508,17367044,17432580,17498116,17563652,17629188,17694724,17760260,17825796,17891332,17956868,18022404,18087940,18153476,18219012,18284548,18350084,18415620,18481156,18546692,18612228,18677764,18743300,18808836,18874373,18939908,19005444,19070980,19136516,19202053,19267589,19333124,19398660,19464196,19529732,19595268,19660804,19726340,19791876,19857412,19922948,19988484,20054020,20119556,20185092,20250628,20316164,20381700,20447237,20512773,20578309,20643845,20709380,20774916,20840452,20905988,20971524,21037060,21102596,21168132,21233668,21299204,21364740,21430275,21561349,21626885,21692421,21757957,21823492,21889028,21954565,22020101,22085637,22151173,22216708,22282244,22347781,22413318,22478852,22544389,22609925,22675462,22740999,22806533,22872070,22937604,23003140,23068676,23134212,23199748,23265285,23330821,23396357,23461892,23527429,23592965,23658501,23724036,23789572,23855109,23920645,23986181,24051717,24117254,24182789,24248325,24313861,24379398,24444933,24510469,24576006,24641542,24707076,24772612,24838149,24903685,24969221,25034757,25100293,25165828,25231365],"channeloptions":[196611,655362,720898,786434,851970,917506,983042,1048578,1114114,12320769,22151175],"census":[196610,655366,22151170],"collection":[196609,655361,2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932162,3997698,4128769,4456449,10616833,10747905,12320771,15269889,15335426,20709377,20774913,22020097,22151169,22347777,22544385,22609921,22675457,22806529,23396353,23658497,23855105,23920642,23986179,24051713,24117249,24182785,24248321,24313857,24444931,24510467,24641537,25231361],"calls":[196609,720897,2162691,2228225,3538946,6094850,6160386,6225922,6291458,6356994,6619137,10420225,10813441,12320778,12451841,15400961,20316161,21561345,21626881,21692417,21889025,21954569,22020098,22151169,22609922,23986178,24051713,24903681],"concurrent":[196609,851969,22151169],"connection":[196609,851969,2228225,6553601,22020097,22151169],"channel":[196609,917505,2228233,5636108,5701644,5767180,6422529,6488065,6553605,6619140,6684677,6750220,6815753,6946827,10944513,12320779,12517379,12582914,12648456,13959170,14090245,14221314,14352385,16515084,17498114,17563651,17629187,17694732,18022401,21823493,22020121,22085636,22151170,22216706,22282246,22347778,22675458],"check":[196609,1114113,15663105,21037057,22151169,24641537,24772609],"contextpropagationoptions":[262147,1179655,2424835,7012357,9699334,12320769,14286851,17891330,17956866,22544392],"context":[262145,1179649,3604481,6029313,7012353,9699329,12320771,14024705,17104897,21889025,22413317,22544386,22609922,22740997,24051714,24379397,24838149],"containing":[327681,1310721,2686977,4259841,11075585,11141121,11534337,13303809,22937601,23658497,24576001,24903681],"choose":[393217,1376257,24182785],"contain":[393217,1376257,24182785],"cancelled":[458754,1441794,2228226,6553601,6684673,15400961,19791873,22020098,24051713,24707074,24772610],"currentversion":[524289,1572869,25100289],"current":[524289,1572865,1769475,1835011,1900547,1966083,2031617,2097153,2228228,2293763,2359300,2424836,2490372,2555908,2621444,2949123,3014660,3211265,3276803,3342338,3407876,3473412,3538948,3604485,3670020,3735556,3801092,3866628,3932164,3997700,4063235,4128772,4194306,4456452,8912897,9764865,11337729,12320769,14090241,14483457,15269891,17563649,21561347,21626883,21692419,21757955,21823489,21889025,22020101,22085635,22347780,22544388,22609924,22675460,22806532,22937601,23330819,23396356,23592961,23658499,23724034,23855108,23920647,23986180,24051717,24117252,24182788,24248324,24313860,24444932,24510468,24576003,24641540,24707074,25100290,25231364],"copy":[655361,720897,786433,851969,917505,983041,1048577,1114113,1179649,1245185,1310721,1376257,1441793,1507329,1572865,1638401,2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,4521985,4587521,4653057,4718593,4784129,4849665,4915201,4980737,5046273,5111809,5177345,5242881,5308417,5373953,5439489,5505025,5570561,5636097,5701633,5767169,5832705,5898241,5963777,6029313,6094849,6160385,6225921,6291457,6356993,6422529,6488065,6553601,6619137,6684673,6750209,6815745,6881281,6946817,7012353,7077889,7143425,7208961,7274497,7340033,7405569,7471105,7536641,7602177,7667713,7733249,7798785,7864321,7929857,7995393,8060929,8126465,8192001,8257537,8323073,8388609,8454145,8519681,8585217,8650753,8716289,8781825,8847361,8912897,8978433,9043969,9109505,9175041,9240577,9306113,9371649,9437185,9502721,9568257,9633793,9699329,9764865,9830401,9895937,9961473,10027009,10092545,10158081,10223617,10289153,10354689,10420225,10485761,10551297,10616833,10682369,10747905,10813441,10878977,10944513,11010049,11075585,11141121,11206657,11272193,11337729,11403265,11468801,11534337,11599873,11665409,11730945,11796481,11862017,11927553,11993089,12058625,12124161,12189697,15859713,15925249,15990785,16056321,16121857,16187393,16252929,16318465,16384001,16449537,16515073,16580609,16646145,16711681,16777217,16842753,16908289,16973825,17039361,17104897,17170433,17235969,17301505,17367041,17432577,17498113,17563649,17629185,17694721,17760257,17825793,17891329,17956865,18022401,18087937,18153473,18219009,18284545,18350081,18415617,18481153,18546689,18612225,18677761,18743297,18808833,18874369,18939905,19005441,19070977,19136513,19202049,19267585,19333121,19398657,19464193,19529729,19595265,19660801,19726337,19791873,19857409,19922945,19988481,20054017,20119553,20185089,20250625,20316161,20381697,20447233,20512769,20578305,20643841,20709377,20774913,20840449,20905985,20971521,21037057,21102593,21168129,21233665,21299201,21364737,21495809,21561345,21626881,21692417,21757953,21823489,21889025,21954561,22020098,22085633,22151169,22216705,22282241,22347778,22413313,22478849,22544386,22609922,22675458,22740993,22806530,22872065,22937601,23003137,23068673,23134209,23199745,23265281,23330817,23396354,23461889,23527425,23592961,23658497,23724033,23789569,23855106,23920642,23986178,24051714,24117250,24182786,24248322,24313858,24379393,24444930,24510466,24576001,24641538,24707073,24772609,24838145,24903681,24969217,25034753,25100289,25165825,25231362],"const":[655362,720898,786434,851970,917506,983042,1048578,1114114,1245186,1376258,1572866],"creates":[1703938,2228225,2359298,2424833,2490369,2555905,2621441,2686977,3014657,3145729,3407873,3473410,3538945,3604482,3670017,3735553,3801090,3866626,3932161,3997697,4128769,4259841,4456449,4521985,4587521,6029313,6422529,6488065,6750209,6815745,6881281,7012353,7340033,7864321,8388609,9568257,9633793,9699329,9895937,10223617,10289153,10354689,11010049,11075585,11141121,11206657,11272193,11403265,11534337,12582914,12648450,13107202,13303811,13369346,21495810,21889025,22020099,22085634,22347778,22544386,22609921,22675457,22806529,22937601,23330817,23396354,23527425,23855105,23920644,23986177,24051714,24117249,24182786,24248322,24313859,24444929,24510465,24576003,24641539,24707073,24903681,25231361],"credential":[1703937,4587527,14352385,15466497,18022401,20381697,21495809,22675457,24117249],"cleanup":[1769473,1835009,1900545,1966081,2228225,2359297,2424833,2490369,2555905,2621441,3014657,3407873,3473409,3538945,3604481,3670017,3735553,3801089,3866625,3932161,3997697,4128769,4456449,4653057,4915201,5111809,5308417,21561345,21626881,21692417,21757953,22020097,22347777,22544385,22609921,22675457,22806529,23396353,23855105,23920641,23986177,24051713,24117249,24182785,24248321,24313857,24444929,24510465,24641537,25231361],"call":[1769482,1835017,1900553,1966090,2162693,2228225,2359297,3604484,3932161,3997697,4653062,4784130,4849666,4915205,4980738,5046274,5111813,5177346,5242882,5308422,5439490,5505026,5636099,5701635,5767170,6029316,6094856,6160392,6225928,6291464,6356999,6553601,6881283,6946817,7012354,9568257,9633793,9699330,9764866,10485761,10682369,11468802,11534338,11599874,11665410,12320788,13238273,13697025,13893633,13959170,14024709,14221313,14286850,15269890,15400961,15925249,16384001,16515073,16711681,16908289,16973825,17039361,17104897,17170433,17760257,17891329,17956865,19726337,19791873,21561357,21626891,21692426,21757965,21823493,21889029,21954565,22020098,22347778,22413313,22544386,22609922,22740993,22872065,23658501,23920644,24051718,24248321,24379393,24444929,24510465,24772609,24838145],"completed":[1769473,1835009,1966081,4653057,4915201,5308417,21561345,21626881,21757953,24772609],"cancellation":[1769473,1835009,1900545,1966081,4653057,4915201,5111809,5308417,5832705,6029313,7012353,12320769,14286849,15400961,17891329,19791873,21561345,21626881,21692417,21757953,22544385,22609921,24051713],"callinvocationdetails":[2031620,5570569,5636103,5701639,5767175,6094853,6160389,6225925,6291461,6356997,6881285,12320769,12517384,13959171,16515074,16580610,16646146,16711682,16777218,16842754,21823501],"code":[2031617,2097153,3211265,3342337,4194305,11403265,12320769,12451841,15728641,21299201,21823489,21889025,23592961,23724033,24248321,24707074,25034753],"calloptions":[2097158,5570566,5636102,5701638,5767174,5832712,5898248,5963784,6029318,6881285,12320769,12517379,14024707,16711686,16908290,16973826,17039362,17104898,17170434,21823491,21889035],"cancellationtoken":[2097153,5832715,6029324,14024705,15400961,16908299,19791883,21889026,24051713],"client":[2162693,3604481,3866625,6094851,6160385,6225921,9764865,9961473,11010049,11075585,11141121,11206658,11272195,12255234,12320780,13172737,13303811,13369346,14221314,15400963,15597570,15663106,17694721,17760257,20119553,20185089,20250625,20905986,21037057,21168129,21430273,21495810,21561345,21823489,21889025,21954566,22020097,22347779,22413313,22675457,23068673,23658497,23789572,24051716,24313857,24576006,24641540,24772609],"completely":[2162689,6160385,21954561,25165825],"connectasync":[2228225,6553605,22020097],"connect":[2228225,6553601,22020097],"completes":[2228226,2818050,4259841,6553601,6684673,7274497,11599873,13434881,22020098,23068674,24903681],"case":[2228225,6553601,22020097],"cleans":[2228225,3538945,6619137,10813441,22020097,23986177],"channeloption":[2293763,6422534,6488070,6750214,6815750,10944517,12320771,12582916,12648450,14155783,17235971,17301507,17367043,17432585,22020098,22085645,22216706],"clientbase":[2359299,6881282,6946822,12255233,12320769,14221315,17694722,17760258,17825794,21495809,22347785],"createcall":[2359297,6881285,22347777],"contextpropagationtoken":[2490371,6029317,9699333,12320770,17104902,22544385,22609927],"credentials":[2555907,6750220,6815756,7077894,9895942,10551302,11010049,11075585,11141121,11206657,11272193,12320773,12648450,13303811,13369346,14352387,15532033,18022408,20512775,22020098,22675466,24117249,24182785,24576009,24641539,24772609],"completeasync":[2818049,7274501,23068673],"closes":[2818049,7274497,23068673],"called":[2818049,3604481,7274497,9764865,13959169,15400962,16646145,19922945,19988481,21823489,23068673,24051715],"calling":[2818049,7274497,23068673],"close":[2818049,4259841,11599873,12320769,13434881,23068674,24903681],"consolelogger":[3014659,7405572,7471109,7536644,7602179,7667716,7733253,7798788,7864325,12386305,12713986,12779522,23396360],"clear":[3276801,8716296,23658497],"copyto":[3276801,8847370,23658497],"cause":[3473409,23920641],"cancelling":[3538945,10420225,14024705,16908289,21889025,23986177],"complete":[3538946,10420225,10813441,11599880,23986178,24772609],"createpropagationtoken":[3604481,9699334,24051713],"child":[3604481,7012354,9699329,12320770,14286850,17891329,17956865,22544386,22609922,24051713],"createbuilder":[3801089,10354693,24248321],"clientstreamingservermethod":[3866625,9961478,12320769,13172737,22413317,24313857],"checkargument":[4390914,11796486,11862022,13500419,25034754],"condition":[4390916,11796487,11862023,12058631,12124167,13500418,13631490,24772609,25034756],"checknotnull":[4390914,11927559,11993095,13565955,25034754],"checkstate":[4390914,12058630,12124166,13631491,25034754],"constructor":[5636097,5701633,5767169,6029313,6422529,6488065,6750209,6815745,6946817,7012353,7077889,7340033,7864321,8454145,8978433,9043969,9437185,9502721,9568257,9633793,9830401,9895937,10289153,10944513,11010049,11075585,11141121,11206658,11272193,11403265,12189697,12517377,12582913,12648449,13041665,13107201,13303809,13369346,24641537],"channelstate":[6684679,12320769,17563654,22282245],"connects":[6750209,6815745,12648450,22020098],"collections":[6750209,6815745,10944513,11206657,11272193,11599877,11665412],"cal":[7012354,14286850,17891329,17956865,22544386],"customlogger":[7143430],"certificate":[7340034,11141121,12320769,14876673,15597570,15663105,18546689,20905986,21102593,23330819,24576002,24641537],"chain":[7340034,14876673,18546689,23330818],"certificatechain":[7340037,14876673,18546693,23330817],"console":[7864321,12386305,23396354],"char":[8388610,8454146,8585217,8978433,18743298,18808834,19136514],"characters":[9043969],"chosen":[9895937,10551297],"certificates":[11010049,11075585,11141121,11206658,11272194,13303810,13369345,15597569,15663105,20971521,21168129,24576003,24641538],"ctor":[11075585],"currently":[12255233,21430273,24772609],"consists":[12255233,12320769,21430273,24707073],"classes":[12255234,12320769,12386305,12451841,21495809],"created":[12255233,12320769,21495809,24248321],"concepts":[12320769,21430273],"clients":[12320769,21954561],"channels":[12320769,22020097],"connections":[12320769,22020097],"creating":[12320771,14352385,15466497,18022401,20381697,22020097,22085633,22675457,23527425,24117249],"compared":[12320769,22020097],"corresponds":[12320769,22085633],"contexts":[12320769,22609921],"creation":[12320769,22675457],"capability":[12320769,23068673],"connectivity":[12320769,14090241,17563649,22020097,22282241],"compressionlevel":[12320769,22478853],"compression":[12320770,22478854,25165825],"checking":[12451841,25034753],"custom":[14221313,17760257,22347777],"count":[15073281,18874376,23658497],"coded":[15269889,23920641],"caused":[15269889,23920641,24772609],"causes":[15269889,23920641],"convenience":[15400961,20316161,24051713],"constructors":[21823489,21889025,22020097,22085633,22347777,22544385,22675457,23330817,23396353,23592961,23658497,23724033,23855105,23920641,23986177,24117249,24182785,24313857,24576001,24641537,24707073,25231361],"connecting":[22282242],"clientstreaming":[23789569],"caller":[24772611],"converted":[24772609],"change":[24772609],"concurrency":[24772609],"corrected":[24772609],"corruption":[24772609],"completion":[25165825]} \ No newline at end of file diff --git a/doc/ref/csharp/html/fti/FTI_Files.json b/doc/ref/csharp/html/fti/FTI_Files.json new file mode 100644 index 00000000000..7439f6f829f --- /dev/null +++ b/doc/ref/csharp/html/fti/FTI_Files.json @@ -0,0 +1 @@ +["gRPC C# - Redirect\u0000index.html\u000018","gRPC C# - Search\u0000search.html\u000012","RpcException Events\u0000html/Events_T_Grpc_Core_RpcException.htm\u000055","ChannelOptions Fields\u0000html/Fields_T_Grpc_Core_ChannelOptions.htm\u0000111","ContextPropagationOptions Fields\u0000html/Fields_T_Grpc_Core_ContextPropagationOptions.htm\u000039","Metadata Fields\u0000html/Fields_T_Grpc_Core_Metadata.htm\u000047","ServerPort Fields\u0000html/Fields_T_Grpc_Core_ServerPort.htm\u000060","Status Fields\u0000html/Fields_T_Grpc_Core_Status.htm\u000057","VersionInfo Fields\u0000html/Fields_T_Grpc_Core_VersionInfo.htm\u000032","WriteOptions Fields\u0000html/Fields_T_Grpc_Core_WriteOptions.htm\u000032","ChannelOptions.Census Field\u0000html/F_Grpc_Core_ChannelOptions_Census.htm\u000082","ChannelOptions.DefaultAuthority Field\u0000html/F_Grpc_Core_ChannelOptions_DefaultAuthority.htm\u000080","ChannelOptions.Http2InitialSequenceNumber Field\u0000html/F_Grpc_Core_ChannelOptions_Http2InitialSequenceNumber.htm\u000081","ChannelOptions.MaxConcurrentStreams Field\u0000html/F_Grpc_Core_ChannelOptions_MaxConcurrentStreams.htm\u000087","ChannelOptions.MaxMessageLength Field\u0000html/F_Grpc_Core_ChannelOptions_MaxMessageLength.htm\u000083","ChannelOptions.PrimaryUserAgentString Field\u0000html/F_Grpc_Core_ChannelOptions_PrimaryUserAgentString.htm\u000088","ChannelOptions.SecondaryUserAgentString Field\u0000html/F_Grpc_Core_ChannelOptions_SecondaryUserAgentString.htm\u000088","ChannelOptions.SslTargetNameOverride Field\u0000html/F_Grpc_Core_ChannelOptions_SslTargetNameOverride.htm\u000087","ContextPropagationOptions.Default Field\u0000html/F_Grpc_Core_ContextPropagationOptions_Default.htm\u000088","Metadata.BinaryHeaderSuffix Field\u0000html/F_Grpc_Core_Metadata_BinaryHeaderSuffix.htm\u000083","Metadata.Empty Field\u0000html/F_Grpc_Core_Metadata_Empty.htm\u000087","ServerPort.PickUnused Field\u0000html/F_Grpc_Core_ServerPort_PickUnused.htm\u0000105","Status.DefaultCancelled Field\u0000html/F_Grpc_Core_Status_DefaultCancelled.htm\u000089","Status.DefaultSuccess Field\u0000html/F_Grpc_Core_Status_DefaultSuccess.htm\u000089","VersionInfo.CurrentVersion Field\u0000html/F_Grpc_Core_VersionInfo_CurrentVersion.htm\u000079","WriteOptions.Default Field\u0000html/F_Grpc_Core_WriteOptions_Default.htm\u000081","AuthInterceptors Methods\u0000html/Methods_T_Grpc_Auth_AuthInterceptors.htm\u000065","AsyncClientStreamingCall(TRequest, TResponse) Methods\u0000html/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.htm\u0000215","AsyncDuplexStreamingCall(TRequest, TResponse) Methods\u0000html/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm\u0000209","AsyncServerStreamingCall(TResponse) Methods\u0000html/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.htm\u0000196","AsyncUnaryCall(TResponse) Methods\u0000html/Methods_T_Grpc_Core_AsyncUnaryCall_1.htm\u0000208","CallInvocationDetails(TRequest, TResponse) Methods\u0000html/Methods_T_Grpc_Core_CallInvocationDetails_2.htm\u0000132","CallOptions Methods\u0000html/Methods_T_Grpc_Core_CallOptions.htm\u0000162","Calls Methods\u0000html/Methods_T_Grpc_Core_Calls.htm\u0000160","Channel Methods\u0000html/Methods_T_Grpc_Core_Channel.htm\u0000258","ChannelOption Methods\u0000html/Methods_T_Grpc_Core_ChannelOption.htm\u000095","ClientBase Methods\u0000html/Methods_T_Grpc_Core_ClientBase.htm\u0000154","ContextPropagationOptions Methods\u0000html/Methods_T_Grpc_Core_ContextPropagationOptions.htm\u0000142","ContextPropagationToken Methods\u0000html/Methods_T_Grpc_Core_ContextPropagationToken.htm\u0000142","Credentials Methods\u0000html/Methods_T_Grpc_Core_Credentials.htm\u0000142","GrpcEnvironment Methods\u0000html/Methods_T_Grpc_Core_GrpcEnvironment.htm\u0000155","IAsyncStreamReader(T) Methods\u0000html/Methods_T_Grpc_Core_IAsyncStreamReader_1.htm\u0000113","IAsyncStreamWriter(T) Methods\u0000html/Methods_T_Grpc_Core_IAsyncStreamWriter_1.htm\u000047","IClientStreamWriter(T) Methods\u0000html/Methods_T_Grpc_Core_IClientStreamWriter_1.htm\u0000113","IServerStreamWriter(T) Methods\u0000html/Methods_T_Grpc_Core_IServerStreamWriter_1.htm\u000079","KeyCertificatePair Methods\u0000html/Methods_T_Grpc_Core_KeyCertificatePair.htm\u000095","ConsoleLogger Methods\u0000html/Methods_T_Grpc_Core_Logging_ConsoleLogger.htm\u0000234","ILogger Methods\u0000html/Methods_T_Grpc_Core_Logging_ILogger.htm\u0000119","Marshallers Methods\u0000html/Methods_T_Grpc_Core_Marshallers.htm\u000038","Marshaller(T) Methods\u0000html/Methods_T_Grpc_Core_Marshaller_1.htm\u0000100","Metadata Methods\u0000html/Methods_T_Grpc_Core_Metadata.htm\u0000118","Entry Methods\u0000html/Methods_T_Grpc_Core_Metadata_Entry.htm\u000099","Method(TRequest, TResponse) Methods\u0000html/Methods_T_Grpc_Core_Method_2.htm\u0000153","RpcException Methods\u0000html/Methods_T_Grpc_Core_RpcException.htm\u0000199","Server Methods\u0000html/Methods_T_Grpc_Core_Server.htm\u0000198","ServerCallContext Methods\u0000html/Methods_T_Grpc_Core_ServerCallContext.htm\u0000211","ServerCredentials Methods\u0000html/Methods_T_Grpc_Core_ServerCredentials.htm\u0000142","ServerPort Methods\u0000html/Methods_T_Grpc_Core_ServerPort.htm\u0000142","ServerServiceDefinition Methods\u0000html/Methods_T_Grpc_Core_ServerServiceDefinition.htm\u0000152","Builder Methods\u0000html/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.htm\u0000261","ServerPortCollection Methods\u0000html/Methods_T_Grpc_Core_Server_ServerPortCollection.htm\u0000215","ServiceDefinitionCollection Methods\u0000html/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.htm\u0000181","SslCredentials Methods\u0000html/Methods_T_Grpc_Core_SslCredentials.htm\u000095","SslServerCredentials Methods\u0000html/Methods_T_Grpc_Core_SslServerCredentials.htm\u0000142","Status Methods\u0000html/Methods_T_Grpc_Core_Status.htm\u000096","AsyncStreamExtensions Methods\u0000html/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.htm\u0000113","BenchmarkUtil Methods\u0000html/Methods_T_Grpc_Core_Utils_BenchmarkUtil.htm\u000038","Preconditions Methods\u0000html/Methods_T_Grpc_Core_Utils_Preconditions.htm\u000096","WriteOptions Methods\u0000html/Methods_T_Grpc_Core_WriteOptions.htm\u0000142","AuthInterceptors.FromAccessToken Method\u0000html/M_Grpc_Auth_AuthInterceptors_FromAccessToken.htm\u0000129","AuthInterceptors.FromCredential Method\u0000html/M_Grpc_Auth_AuthInterceptors_FromCredential.htm\u0000145","AsyncClientStreamingCall(TRequest, TResponse).Dispose Method\u0000html/M_Grpc_Core_AsyncClientStreamingCall_2_Dispose.htm\u0000161","AsyncClientStreamingCall(TRequest, TResponse).GetAwaiter Method\u0000html/M_Grpc_Core_AsyncClientStreamingCall_2_GetAwaiter.htm\u0000108","AsyncClientStreamingCall(TRequest, TResponse).GetStatus Method\u0000html/M_Grpc_Core_AsyncClientStreamingCall_2_GetStatus.htm\u0000101","AsyncClientStreamingCall(TRequest, TResponse).GetTrailers Method\u0000html/M_Grpc_Core_AsyncClientStreamingCall_2_GetTrailers.htm\u0000104","AsyncDuplexStreamingCall(TRequest, TResponse).Dispose Method\u0000html/M_Grpc_Core_AsyncDuplexStreamingCall_2_Dispose.htm\u0000162","AsyncDuplexStreamingCall(TRequest, TResponse).GetStatus Method\u0000html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetStatus.htm\u0000101","AsyncDuplexStreamingCall(TRequest, TResponse).GetTrailers Method\u0000html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetTrailers.htm\u0000104","AsyncServerStreamingCall(TResponse).Dispose Method\u0000html/M_Grpc_Core_AsyncServerStreamingCall_1_Dispose.htm\u0000151","AsyncServerStreamingCall(TResponse).GetStatus Method\u0000html/M_Grpc_Core_AsyncServerStreamingCall_1_GetStatus.htm\u000096","AsyncServerStreamingCall(TResponse).GetTrailers Method\u0000html/M_Grpc_Core_AsyncServerStreamingCall_1_GetTrailers.htm\u000099","AsyncUnaryCall(TResponse).Dispose Method\u0000html/M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm\u0000156","AsyncUnaryCall(TResponse).GetAwaiter Method\u0000html/M_Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm\u0000103","AsyncUnaryCall(TResponse).GetStatus Method\u0000html/M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm\u000096","AsyncUnaryCall(TResponse).GetTrailers Method\u0000html/M_Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm\u000099","CallInvocationDetails(TRequest, TResponse).WithOptions Method\u0000html/M_Grpc_Core_CallInvocationDetails_2_WithOptions.htm\u0000186","CallInvocationDetails(TRequest, TResponse) Constructor (Channel, Method(TRequest, TResponse), CallOptions)\u0000html/M_Grpc_Core_CallInvocationDetails_2__ctor.htm\u0000221","CallInvocationDetails(TRequest, TResponse) Constructor (Channel, Method(TRequest, TResponse), String, CallOptions)\u0000html/M_Grpc_Core_CallInvocationDetails_2__ctor_1.htm\u0000265","CallInvocationDetails(TRequest, TResponse) Constructor (Channel, String, String, Marshaller(TRequest), Marshaller(TResponse), CallOptions)\u0000html/M_Grpc_Core_CallInvocationDetails_2__ctor_2.htm\u0000317","CallOptions.WithCancellationToken Method\u0000html/M_Grpc_Core_CallOptions_WithCancellationToken.htm\u0000127","CallOptions.WithDeadline Method\u0000html/M_Grpc_Core_CallOptions_WithDeadline.htm\u0000125","CallOptions.WithHeaders Method\u0000html/M_Grpc_Core_CallOptions_WithHeaders.htm\u0000128","CallOptions Constructor\u0000html/M_Grpc_Core_CallOptions__ctor.htm\u0000397","Calls.AsyncClientStreamingCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_Calls_AsyncClientStreamingCall__2.htm\u0000283","Calls.AsyncDuplexStreamingCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_Calls_AsyncDuplexStreamingCall__2.htm\u0000305","Calls.AsyncServerStreamingCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_Calls_AsyncServerStreamingCall__2.htm\u0000297","Calls.AsyncUnaryCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_Calls_AsyncUnaryCall__2.htm\u0000278","Calls.BlockingUnaryCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_Calls_BlockingUnaryCall__2.htm\u0000258","ChannelOption Constructor (String, Int32)\u0000html/M_Grpc_Core_ChannelOption__ctor.htm\u0000137","ChannelOption Constructor (String, String)\u0000html/M_Grpc_Core_ChannelOption__ctor_1.htm\u0000139","Channel.ConnectAsync Method\u0000html/M_Grpc_Core_Channel_ConnectAsync.htm\u0000229","Channel.ShutdownAsync Method\u0000html/M_Grpc_Core_Channel_ShutdownAsync.htm\u0000102","Channel.WaitForStateChangedAsync Method\u0000html/M_Grpc_Core_Channel_WaitForStateChangedAsync.htm\u0000266","Channel Constructor (String, Credentials, IEnumerable(ChannelOption))\u0000html/M_Grpc_Core_Channel__ctor.htm\u0000252","Channel Constructor (String, Int32, Credentials, IEnumerable(ChannelOption))\u0000html/M_Grpc_Core_Channel__ctor_1.htm\u0000270","ClientBase.CreateCall(TRequest, TResponse) Method\u0000html/M_Grpc_Core_ClientBase_CreateCall__2.htm\u0000283","ClientBase Constructor\u0000html/M_Grpc_Core_ClientBase__ctor.htm\u0000110","ContextPropagationOptions Constructor\u0000html/M_Grpc_Core_ContextPropagationOptions__ctor.htm\u0000205","Credentials Constructor\u0000html/M_Grpc_Core_Credentials__ctor.htm\u000076","GrpcEnvironment.SetLogger Method\u0000html/M_Grpc_Core_GrpcEnvironment_SetLogger.htm\u0000139","IAsyncStreamWriter(T).WriteAsync Method\u0000html/M_Grpc_Core_IAsyncStreamWriter_1_WriteAsync.htm\u0000125","IClientStreamWriter(T).CompleteAsync Method\u0000html/M_Grpc_Core_IClientStreamWriter_1_CompleteAsync.htm\u0000101","KeyCertificatePair Constructor\u0000html/M_Grpc_Core_KeyCertificatePair__ctor.htm\u0000139","ConsoleLogger.Debug Method\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Debug.htm\u0000238","ConsoleLogger.Error Method (Exception, String, Object[])\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Error.htm\u0000320","ConsoleLogger.Error Method (String, Object[])\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Error_1.htm\u0000246","ConsoleLogger.ForType(T) Method\u0000html/M_Grpc_Core_Logging_ConsoleLogger_ForType__1.htm\u0000147","ConsoleLogger.Info Method\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Info.htm\u0000238","ConsoleLogger.Warning Method (Exception, String, Object[])\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Warning.htm\u0000320","ConsoleLogger.Warning Method (String, Object[])\u0000html/M_Grpc_Core_Logging_ConsoleLogger_Warning_1.htm\u0000246","ConsoleLogger Constructor\u0000html/M_Grpc_Core_Logging_ConsoleLogger__ctor.htm\u000081","ILogger.Debug Method\u0000html/M_Grpc_Core_Logging_ILogger_Debug.htm\u0000202","ILogger.Error Method (Exception, String, Object[])\u0000html/M_Grpc_Core_Logging_ILogger_Error.htm\u0000276","ILogger.Error Method (String, Object[])\u0000html/M_Grpc_Core_Logging_ILogger_Error_1.htm\u0000210","ILogger.ForType(T) Method\u0000html/M_Grpc_Core_Logging_ILogger_ForType__1.htm\u0000127","ILogger.Info Method\u0000html/M_Grpc_Core_Logging_ILogger_Info.htm\u0000202","ILogger.Warning Method (Exception, String, Object[])\u0000html/M_Grpc_Core_Logging_ILogger_Warning.htm\u0000276","ILogger.Warning Method (String, Object[])\u0000html/M_Grpc_Core_Logging_ILogger_Warning_1.htm\u0000210","Marshallers.Create(T) Method\u0000html/M_Grpc_Core_Marshallers_Create__1.htm\u0000390","Marshaller(T) Constructor\u0000html/M_Grpc_Core_Marshaller_1__ctor.htm\u0000229","Metadata.Add Method (Metadata.Entry)\u0000html/M_Grpc_Core_Metadata_Add.htm\u0000172","Metadata.Add Method (String, Byte[])\u0000html/M_Grpc_Core_Metadata_Add_1.htm\u0000220","Metadata.Add Method (String, String)\u0000html/M_Grpc_Core_Metadata_Add_2.htm\u0000199","Metadata.Clear Method\u0000html/M_Grpc_Core_Metadata_Clear.htm\u0000102","Metadata.Contains Method\u0000html/M_Grpc_Core_Metadata_Contains.htm\u0000173","Metadata.CopyTo Method\u0000html/M_Grpc_Core_Metadata_CopyTo.htm\u0000254","Metadata.Entry.ToString Method\u0000html/M_Grpc_Core_Metadata_Entry_ToString.htm\u0000107","Metadata.Entry Constructor (String, Byte[])\u0000html/M_Grpc_Core_Metadata_Entry__ctor.htm\u0000174","Metadata.Entry Constructor (String, String)\u0000html/M_Grpc_Core_Metadata_Entry__ctor_1.htm\u0000165","Metadata.GetEnumerator Method\u0000html/M_Grpc_Core_Metadata_GetEnumerator.htm\u0000143","Metadata.IndexOf Method\u0000html/M_Grpc_Core_Metadata_IndexOf.htm\u0000173","Metadata.Insert Method\u0000html/M_Grpc_Core_Metadata_Insert.htm\u0000229","Metadata.Remove Method\u0000html/M_Grpc_Core_Metadata_Remove.htm\u0000173","Metadata.RemoveAt Method\u0000html/M_Grpc_Core_Metadata_RemoveAt.htm\u0000155","Metadata Constructor\u0000html/M_Grpc_Core_Metadata__ctor.htm\u000076","Method(TRequest, TResponse) Constructor\u0000html/M_Grpc_Core_Method_2__ctor.htm\u0000270","RpcException Constructor (Status)\u0000html/M_Grpc_Core_RpcException__ctor.htm\u0000111","RpcException Constructor (Status, String)\u0000html/M_Grpc_Core_RpcException__ctor_1.htm\u0000145","ServerCallContext.CreatePropagationToken Method\u0000html/M_Grpc_Core_ServerCallContext_CreatePropagationToken.htm\u0000177","ServerCallContext.WriteResponseHeadersAsync Method\u0000html/M_Grpc_Core_ServerCallContext_WriteResponseHeadersAsync.htm\u0000174","ServerCredentials Constructor\u0000html/M_Grpc_Core_ServerCredentials__ctor.htm\u000076","ServerPort Constructor\u0000html/M_Grpc_Core_ServerPort__ctor.htm\u0000189","ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), ClientStreamingServerMethod(TRequest, TResponse))\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2.htm\u0000310","ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), DuplexStreamingServerMethod(TRequest, TResponse))\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_1.htm\u0000310","ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), ServerStreamingServerMethod(TRequest, TResponse))\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_2.htm\u0000310","ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), UnaryServerMethod(TRequest, TResponse))\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_3.htm\u0000314","ServerServiceDefinition.Builder.Build Method\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder_Build.htm\u000095","ServerServiceDefinition.Builder Constructor\u0000html/M_Grpc_Core_ServerServiceDefinition_Builder__ctor.htm\u0000105","ServerServiceDefinition.CreateBuilder Method\u0000html/M_Grpc_Core_ServerServiceDefinition_CreateBuilder.htm\u0000131","Server.KillAsync Method\u0000html/M_Grpc_Core_Server_KillAsync.htm\u0000102","Server.ServerPortCollection.Add Method (ServerPort)\u0000html/M_Grpc_Core_Server_ServerPortCollection_Add.htm\u0000168","Server.ServerPortCollection.Add Method (String, Int32, ServerCredentials)\u0000html/M_Grpc_Core_Server_ServerPortCollection_Add_1.htm\u0000212","Server.ServerPortCollection.GetEnumerator Method\u0000html/M_Grpc_Core_Server_ServerPortCollection_GetEnumerator.htm\u0000131","Server.ServiceDefinitionCollection.Add Method\u0000html/M_Grpc_Core_Server_ServiceDefinitionCollection_Add.htm\u0000153","Server.ServiceDefinitionCollection.GetEnumerator Method\u0000html/M_Grpc_Core_Server_ServiceDefinitionCollection_GetEnumerator.htm\u0000131","Server.ShutdownAsync Method\u0000html/M_Grpc_Core_Server_ShutdownAsync.htm\u0000109","Server.Start Method\u0000html/M_Grpc_Core_Server_Start.htm\u000076","Server Constructor\u0000html/M_Grpc_Core_Server__ctor.htm\u0000155","SslCredentials Constructor\u0000html/M_Grpc_Core_SslCredentials__ctor.htm\u0000103","SslCredentials Constructor (String)\u0000html/M_Grpc_Core_SslCredentials__ctor_1.htm\u0000135","SslCredentials Constructor (String, KeyCertificatePair)\u0000html/M_Grpc_Core_SslCredentials__ctor_2.htm\u0000145","SslServerCredentials Constructor (IEnumerable(KeyCertificatePair))\u0000html/M_Grpc_Core_SslServerCredentials__ctor.htm\u0000152","SslServerCredentials Constructor (IEnumerable(KeyCertificatePair), String, Boolean)\u0000html/M_Grpc_Core_SslServerCredentials__ctor_1.htm\u0000213","Status.ToString Method\u0000html/M_Grpc_Core_Status_ToString.htm\u0000104","Status Constructor\u0000html/M_Grpc_Core_Status__ctor.htm\u0000130","AsyncStreamExtensions.ForEachAsync(T) Method\u0000html/M_Grpc_Core_Utils_AsyncStreamExtensions_ForEachAsync__1.htm\u0000440","AsyncStreamExtensions.ToListAsync(T) Method\u0000html/M_Grpc_Core_Utils_AsyncStreamExtensions_ToListAsync__1.htm\u0000358","AsyncStreamExtensions.WriteAllAsync(T) Method (IClientStreamWriter(T), IEnumerable(T), Boolean)\u0000html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1.htm\u0000541","AsyncStreamExtensions.WriteAllAsync(T) Method (IServerStreamWriter(T), IEnumerable(T))\u0000html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1_1.htm\u0000428","BenchmarkUtil.RunBenchmark Method\u0000html/M_Grpc_Core_Utils_BenchmarkUtil_RunBenchmark.htm\u0000243","Preconditions.CheckArgument Method (Boolean)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckArgument.htm\u0000115","Preconditions.CheckArgument Method (Boolean, String)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckArgument_1.htm\u0000150","Preconditions.CheckNotNull(T) Method (T)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1.htm\u0000169","Preconditions.CheckNotNull(T) Method (T, String)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1_1.htm\u0000202","Preconditions.CheckState Method (Boolean)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckState.htm\u0000115","Preconditions.CheckState Method (Boolean, String)\u0000html/M_Grpc_Core_Utils_Preconditions_CheckState_1.htm\u0000150","WriteOptions Constructor\u0000html/M_Grpc_Core_WriteOptions__ctor.htm\u0000130","Grpc.Auth Namespace\u0000html/N_Grpc_Auth.htm\u000066","Grpc.Core Namespace\u0000html/N_Grpc_Core.htm\u0000823","Grpc.Core.Logging Namespace\u0000html/N_Grpc_Core_Logging.htm\u000039","Grpc.Core.Utils Namespace\u0000html/N_Grpc_Core_Utils.htm\u000048","CallInvocationDetails(TRequest, TResponse) Constructor\u0000html/Overload_Grpc_Core_CallInvocationDetails_2__ctor.htm\u0000116","ChannelOption Constructor\u0000html/Overload_Grpc_Core_ChannelOption__ctor.htm\u000048","Channel Constructor\u0000html/Overload_Grpc_Core_Channel__ctor.htm\u000079","ConsoleLogger.Error Method\u0000html/Overload_Grpc_Core_Logging_ConsoleLogger_Error.htm\u000054","ConsoleLogger.Warning Method\u0000html/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.htm\u000054","ILogger.Error Method\u0000html/Overload_Grpc_Core_Logging_ILogger_Error.htm\u000054","ILogger.Warning Method\u0000html/Overload_Grpc_Core_Logging_ILogger_Warning.htm\u000054","Metadata.Add Method\u0000html/Overload_Grpc_Core_Metadata_Add.htm\u000036","Entry Constructor\u0000html/Overload_Grpc_Core_Metadata_Entry__ctor.htm\u000062","RpcException Constructor\u0000html/Overload_Grpc_Core_RpcException__ctor.htm\u000048","Builder.AddMethod Method\u0000html/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.htm\u0000130","ServerPortCollection.Add Method\u0000html/Overload_Grpc_Core_Server_ServerPortCollection_Add.htm\u000086","SslCredentials Constructor\u0000html/Overload_Grpc_Core_SslCredentials__ctor.htm\u000082","SslServerCredentials Constructor\u0000html/Overload_Grpc_Core_SslServerCredentials__ctor.htm\u000064","AsyncStreamExtensions.WriteAllAsync Method\u0000html/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.htm\u000076","Preconditions.CheckArgument Method\u0000html/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.htm\u000047","Preconditions.CheckNotNull Method\u0000html/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.htm\u000048","Preconditions.CheckState Method\u0000html/Overload_Grpc_Core_Utils_Preconditions_CheckState.htm\u000047","AsyncClientStreamingCall(TRequest, TResponse) Properties\u0000html/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.htm\u000058","AsyncDuplexStreamingCall(TRequest, TResponse) Properties\u0000html/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm\u000061","AsyncServerStreamingCall(TResponse) Properties\u0000html/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.htm\u000046","AsyncUnaryCall(TResponse) Properties\u0000html/Properties_T_Grpc_Core_AsyncUnaryCall_1.htm\u000043","CallInvocationDetails(TRequest, TResponse) Properties\u0000html/Properties_T_Grpc_Core_CallInvocationDetails_2.htm\u000083","CallOptions Properties\u0000html/Properties_T_Grpc_Core_CallOptions.htm\u000072","Channel Properties\u0000html/Properties_T_Grpc_Core_Channel.htm\u000057","ChannelOption Properties\u0000html/Properties_T_Grpc_Core_ChannelOption.htm\u000063","ClientBase Properties\u0000html/Properties_T_Grpc_Core_ClientBase.htm\u0000108","ContextPropagationOptions Properties\u0000html/Properties_T_Grpc_Core_ContextPropagationOptions.htm\u000056","Credentials Properties\u0000html/Properties_T_Grpc_Core_Credentials.htm\u000049","GrpcEnvironment Properties\u0000html/Properties_T_Grpc_Core_GrpcEnvironment.htm\u000036","IAsyncStreamReader(T) Properties\u0000html/Properties_T_Grpc_Core_IAsyncStreamReader_1.htm\u000040","IAsyncStreamWriter(T) Properties\u0000html/Properties_T_Grpc_Core_IAsyncStreamWriter_1.htm\u000064","IClientStreamWriter(T) Properties\u0000html/Properties_T_Grpc_Core_IClientStreamWriter_1.htm\u000072","IHasWriteOptions Properties\u0000html/Properties_T_Grpc_Core_IHasWriteOptions.htm\u000035","IMethod Properties\u0000html/Properties_T_Grpc_Core_IMethod.htm\u000080","IServerStreamWriter(T) Properties\u0000html/Properties_T_Grpc_Core_IServerStreamWriter_1.htm\u000072","KeyCertificatePair Properties\u0000html/Properties_T_Grpc_Core_KeyCertificatePair.htm\u000039","Marshallers Properties\u0000html/Properties_T_Grpc_Core_Marshallers.htm\u000041","Marshaller(T) Properties\u0000html/Properties_T_Grpc_Core_Marshaller_1.htm\u000043","Metadata Properties\u0000html/Properties_T_Grpc_Core_Metadata.htm\u000030","Entry Properties\u0000html/Properties_T_Grpc_Core_Metadata_Entry.htm\u000068","Method(TRequest, TResponse) Properties\u0000html/Properties_T_Grpc_Core_Method_2.htm\u0000109","RpcException Properties\u0000html/Properties_T_Grpc_Core_RpcException.htm\u0000203","Server Properties\u0000html/Properties_T_Grpc_Core_Server.htm\u000087","ServerCallContext Properties\u0000html/Properties_T_Grpc_Core_ServerCallContext.htm\u0000135","ServerCredentials Properties\u0000html/Properties_T_Grpc_Core_ServerCredentials.htm\u000050","ServerPort Properties\u0000html/Properties_T_Grpc_Core_ServerPort.htm\u000031","SslCredentials Properties\u0000html/Properties_T_Grpc_Core_SslCredentials.htm\u000056","SslServerCredentials Properties\u0000html/Properties_T_Grpc_Core_SslServerCredentials.htm\u000052","Status Properties\u0000html/Properties_T_Grpc_Core_Status.htm\u000050","WriteOptions Properties\u0000html/Properties_T_Grpc_Core_WriteOptions.htm\u000033","AsyncClientStreamingCall(TRequest, TResponse).RequestStream Property\u0000html/P_Grpc_Core_AsyncClientStreamingCall_2_RequestStream.htm\u0000126","AsyncClientStreamingCall(TRequest, TResponse).ResponseAsync Property\u0000html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseAsync.htm\u0000123","AsyncClientStreamingCall(TRequest, TResponse).ResponseHeadersAsync Property\u0000html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseHeadersAsync.htm\u0000135","AsyncDuplexStreamingCall(TRequest, TResponse).RequestStream Property\u0000html/P_Grpc_Core_AsyncDuplexStreamingCall_2_RequestStream.htm\u0000126","AsyncDuplexStreamingCall(TRequest, TResponse).ResponseHeadersAsync Property\u0000html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseHeadersAsync.htm\u0000135","AsyncDuplexStreamingCall(TRequest, TResponse).ResponseStream Property\u0000html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseStream.htm\u0000126","AsyncServerStreamingCall(TResponse).ResponseHeadersAsync Property\u0000html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseHeadersAsync.htm\u0000130","AsyncServerStreamingCall(TResponse).ResponseStream Property\u0000html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseStream.htm\u0000121","AsyncUnaryCall(TResponse).ResponseAsync Property\u0000html/P_Grpc_Core_AsyncUnaryCall_1_ResponseAsync.htm\u0000118","AsyncUnaryCall(TResponse).ResponseHeadersAsync Property\u0000html/P_Grpc_Core_AsyncUnaryCall_1_ResponseHeadersAsync.htm\u0000130","CallInvocationDetails(TRequest, TResponse).Channel Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_Channel.htm\u0000109","CallInvocationDetails(TRequest, TResponse).Host Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_Host.htm\u0000107","CallInvocationDetails(TRequest, TResponse).Method Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_Method.htm\u0000110","CallInvocationDetails(TRequest, TResponse).Options Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_Options.htm\u0000103","CallInvocationDetails(TRequest, TResponse).RequestMarshaller Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_RequestMarshaller.htm\u0000124","CallInvocationDetails(TRequest, TResponse).ResponseMarshaller Property\u0000html/P_Grpc_Core_CallInvocationDetails_2_ResponseMarshaller.htm\u0000124","CallOptions.CancellationToken Property\u0000html/P_Grpc_Core_CallOptions_CancellationToken.htm\u0000101","CallOptions.Deadline Property\u0000html/P_Grpc_Core_CallOptions_Deadline.htm\u0000121","CallOptions.Headers Property\u0000html/P_Grpc_Core_CallOptions_Headers.htm\u0000105","CallOptions.PropagationToken Property\u0000html/P_Grpc_Core_CallOptions_PropagationToken.htm\u0000102","CallOptions.WriteOptions Property\u0000html/P_Grpc_Core_CallOptions_WriteOptions.htm\u0000105","ChannelOption.IntValue Property\u0000html/P_Grpc_Core_ChannelOption_IntValue.htm\u000099","ChannelOption.Name Property\u0000html/P_Grpc_Core_ChannelOption_Name.htm\u0000103","ChannelOption.StringValue Property\u0000html/P_Grpc_Core_ChannelOption_StringValue.htm\u0000103","ChannelOption.Type Property\u0000html/P_Grpc_Core_ChannelOption_Type.htm\u0000105","Channel.ResolvedTarget Property\u0000html/P_Grpc_Core_Channel_ResolvedTarget.htm\u0000105","Channel.State Property\u0000html/P_Grpc_Core_Channel_State.htm\u000099","Channel.Target Property\u0000html/P_Grpc_Core_Channel_Target.htm\u0000104","ClientBase.Channel Property\u0000html/P_Grpc_Core_ClientBase_Channel.htm\u0000101","ClientBase.HeaderInterceptor Property\u0000html/P_Grpc_Core_ClientBase_HeaderInterceptor.htm\u0000141","ClientBase.Host Property\u0000html/P_Grpc_Core_ClientBase_Host.htm\u0000155","ContextPropagationOptions.IsPropagateCancellation Property\u0000html/P_Grpc_Core_ContextPropagationOptions_IsPropagateCancellation.htm\u0000105","ContextPropagationOptions.IsPropagateDeadline Property\u0000html/P_Grpc_Core_ContextPropagationOptions_IsPropagateDeadline.htm\u0000104","Credentials.Insecure Property\u0000html/P_Grpc_Core_Credentials_Insecure.htm\u0000120","GrpcEnvironment.Logger Property\u0000html/P_Grpc_Core_GrpcEnvironment_Logger.htm\u0000110","IAsyncStreamWriter(T).WriteOptions Property\u0000html/P_Grpc_Core_IAsyncStreamWriter_1_WriteOptions.htm\u0000141","IHasWriteOptions.WriteOptions Property\u0000html/P_Grpc_Core_IHasWriteOptions_WriteOptions.htm\u0000114","IMethod.FullName Property\u0000html/P_Grpc_Core_IMethod_FullName.htm\u0000112","IMethod.Name Property\u0000html/P_Grpc_Core_IMethod_Name.htm\u000098","IMethod.ServiceName Property\u0000html/P_Grpc_Core_IMethod_ServiceName.htm\u0000102","IMethod.Type Property\u0000html/P_Grpc_Core_IMethod_Type.htm\u000093","KeyCertificatePair.CertificateChain Property\u0000html/P_Grpc_Core_KeyCertificatePair_CertificateChain.htm\u0000100","KeyCertificatePair.PrivateKey Property\u0000html/P_Grpc_Core_KeyCertificatePair_PrivateKey.htm\u0000100","Marshallers.StringMarshaller Property\u0000html/P_Grpc_Core_Marshallers_StringMarshaller.htm\u0000137","Marshaller(T).Deserializer Property\u0000html/P_Grpc_Core_Marshaller_1_Deserializer.htm\u0000159","Marshaller(T).Serializer Property\u0000html/P_Grpc_Core_Marshaller_1_Serializer.htm\u0000155","Metadata.Count Property\u0000html/P_Grpc_Core_Metadata_Count.htm\u0000120","Metadata.Entry.IsBinary Property\u0000html/P_Grpc_Core_Metadata_Entry_IsBinary.htm\u0000104","Metadata.Entry.Key Property\u0000html/P_Grpc_Core_Metadata_Entry_Key.htm\u0000103","Metadata.Entry.Value Property\u0000html/P_Grpc_Core_Metadata_Entry_Value.htm\u0000106","Metadata.Entry.ValueBytes Property\u0000html/P_Grpc_Core_Metadata_Entry_ValueBytes.htm\u0000125","Metadata.IsReadOnly Property\u0000html/P_Grpc_Core_Metadata_IsReadOnly.htm\u0000120","Metadata.Item Property\u0000html/P_Grpc_Core_Metadata_Item.htm\u0000185","Method(TRequest, TResponse).FullName Property\u0000html/P_Grpc_Core_Method_2_FullName.htm\u0000137","Method(TRequest, TResponse).Name Property\u0000html/P_Grpc_Core_Method_2_Name.htm\u0000123","Method(TRequest, TResponse).RequestMarshaller Property\u0000html/P_Grpc_Core_Method_2_RequestMarshaller.htm\u0000125","Method(TRequest, TResponse).ResponseMarshaller Property\u0000html/P_Grpc_Core_Method_2_ResponseMarshaller.htm\u0000125","Method(TRequest, TResponse).ServiceName Property\u0000html/P_Grpc_Core_Method_2_ServiceName.htm\u0000127","Method(TRequest, TResponse).Type Property\u0000html/P_Grpc_Core_Method_2_Type.htm\u0000118","RpcException.Status Property\u0000html/P_Grpc_Core_RpcException_Status.htm\u000097","ServerCallContext.CancellationToken Property\u0000html/P_Grpc_Core_ServerCallContext_CancellationToken.htm\u000099","ServerCallContext.Deadline Property\u0000html/P_Grpc_Core_ServerCallContext_Deadline.htm\u000096","ServerCallContext.Host Property\u0000html/P_Grpc_Core_ServerCallContext_Host.htm\u0000103","ServerCallContext.Method Property\u0000html/P_Grpc_Core_ServerCallContext_Method.htm\u0000103","ServerCallContext.Peer Property\u0000html/P_Grpc_Core_ServerCallContext_Peer.htm\u0000104","ServerCallContext.RequestHeaders Property\u0000html/P_Grpc_Core_ServerCallContext_RequestHeaders.htm\u0000101","ServerCallContext.ResponseTrailers Property\u0000html/P_Grpc_Core_ServerCallContext_ResponseTrailers.htm\u0000105","ServerCallContext.Status Property\u0000html/P_Grpc_Core_ServerCallContext_Status.htm\u0000116","ServerCallContext.WriteOptions Property\u0000html/P_Grpc_Core_ServerCallContext_WriteOptions.htm\u0000147","ServerCredentials.Insecure Property\u0000html/P_Grpc_Core_ServerCredentials_Insecure.htm\u0000121","ServerPort.BoundPort Property\u0000html/P_Grpc_Core_ServerPort_BoundPort.htm\u0000126","ServerPort.Credentials Property\u0000html/P_Grpc_Core_ServerPort_Credentials.htm\u0000114","ServerPort.Host Property\u0000html/P_Grpc_Core_ServerPort_Host.htm\u0000113","ServerPort.Port Property\u0000html/P_Grpc_Core_ServerPort_Port.htm\u0000109","Server.Ports Property\u0000html/P_Grpc_Core_Server_Ports.htm\u0000125","Server.Services Property\u0000html/P_Grpc_Core_Server_Services.htm\u0000126","Server.ShutdownTask Property\u0000html/P_Grpc_Core_Server_ShutdownTask.htm\u0000103","SslCredentials.KeyCertificatePair Property\u0000html/P_Grpc_Core_SslCredentials_KeyCertificatePair.htm\u0000114","SslCredentials.RootCertificates Property\u0000html/P_Grpc_Core_SslCredentials_RootCertificates.htm\u0000103","SslServerCredentials.ForceClientAuthentication Property\u0000html/P_Grpc_Core_SslServerCredentials_ForceClientAuthentication.htm\u0000103","SslServerCredentials.KeyCertificatePairs Property\u0000html/P_Grpc_Core_SslServerCredentials_KeyCertificatePairs.htm\u0000126","SslServerCredentials.RootCertificates Property\u0000html/P_Grpc_Core_SslServerCredentials_RootCertificates.htm\u0000101","Status.Detail Property\u0000html/P_Grpc_Core_Status_Detail.htm\u000099","Status.StatusCode Property\u0000html/P_Grpc_Core_Status_StatusCode.htm\u0000108","WriteOptions.Flags Property\u0000html/P_Grpc_Core_WriteOptions_Flags.htm\u000096","Namespaces\u0000html/R_Project_Documentation.htm\u000084","AuthInterceptors Class\u0000html/T_Grpc_Auth_AuthInterceptors.htm\u0000161","AsyncClientStreamingCall(TRequest, TResponse) Class\u0000html/T_Grpc_Core_AsyncClientStreamingCall_2.htm\u0000362","AsyncDuplexStreamingCall(TRequest, TResponse) Class\u0000html/T_Grpc_Core_AsyncDuplexStreamingCall_2.htm\u0000359","AsyncServerStreamingCall(TResponse) Class\u0000html/T_Grpc_Core_AsyncServerStreamingCall_1.htm\u0000320","AsyncUnaryCall(TResponse) Class\u0000html/T_Grpc_Core_AsyncUnaryCall_1.htm\u0000333","CallInvocationDetails(TRequest, TResponse) Structure\u0000html/T_Grpc_Core_CallInvocationDetails_2.htm\u0000377","CallOptions Structure\u0000html/T_Grpc_Core_CallOptions.htm\u0000282","Calls Class\u0000html/T_Grpc_Core_Calls.htm\u0000262","Channel Class\u0000html/T_Grpc_Core_Channel.htm\u0000461","ChannelOption Class\u0000html/T_Grpc_Core_ChannelOption.htm\u0000244","ChannelOptions Class\u0000html/T_Grpc_Core_ChannelOptions.htm\u0000187","ChannelOption.OptionType Enumeration\u0000html/T_Grpc_Core_ChannelOption_OptionType.htm\u000082","ChannelState Enumeration\u0000html/T_Grpc_Core_ChannelState.htm\u0000113","ClientBase Class\u0000html/T_Grpc_Core_ClientBase.htm\u0000320","ClientStreamingServerMethod(TRequest, TResponse) Delegate\u0000html/T_Grpc_Core_ClientStreamingServerMethod_2.htm\u0000240","CompressionLevel Enumeration\u0000html/T_Grpc_Core_CompressionLevel.htm\u000089","ContextPropagationOptions Class\u0000html/T_Grpc_Core_ContextPropagationOptions.htm\u0000258","ContextPropagationToken Class\u0000html/T_Grpc_Core_ContextPropagationToken.htm\u0000268","Credentials Class\u0000html/T_Grpc_Core_Credentials.htm\u0000257","DuplexStreamingServerMethod(TRequest, TResponse) Delegate\u0000html/T_Grpc_Core_DuplexStreamingServerMethod_2.htm\u0000266","GrpcEnvironment Class\u0000html/T_Grpc_Core_GrpcEnvironment.htm\u0000227","HeaderInterceptor Delegate\u0000html/T_Grpc_Core_HeaderInterceptor.htm\u0000155","IAsyncStreamReader(T) Interface\u0000html/T_Grpc_Core_IAsyncStreamReader_1.htm\u0000234","IAsyncStreamWriter(T) Interface\u0000html/T_Grpc_Core_IAsyncStreamWriter_1.htm\u0000157","IClientStreamWriter(T) Interface\u0000html/T_Grpc_Core_IClientStreamWriter_1.htm\u0000260","IHasWriteOptions Interface\u0000html/T_Grpc_Core_IHasWriteOptions.htm\u000089","IMethod Interface\u0000html/T_Grpc_Core_IMethod.htm\u0000133","IServerStreamWriter(T) Interface\u0000html/T_Grpc_Core_IServerStreamWriter_1.htm\u0000245","KeyCertificatePair Class\u0000html/T_Grpc_Core_KeyCertificatePair.htm\u0000197","ConsoleLogger Class\u0000html/T_Grpc_Core_Logging_ConsoleLogger.htm\u0000320","ILogger Interface\u0000html/T_Grpc_Core_Logging_ILogger.htm\u0000168","Marshallers Class\u0000html/T_Grpc_Core_Marshallers.htm\u0000130","Marshaller(T) Structure\u0000html/T_Grpc_Core_Marshaller_1.htm\u0000226","Metadata Class\u0000html/T_Grpc_Core_Metadata.htm\u0000421","Metadata.Entry Structure\u0000html/T_Grpc_Core_Metadata_Entry.htm\u0000240","MethodType Enumeration\u0000html/T_Grpc_Core_MethodType.htm\u0000126","Method(TRequest, TResponse) Class\u0000html/T_Grpc_Core_Method_2.htm\u0000358","RpcException Class\u0000html/T_Grpc_Core_RpcException.htm\u0000526","Server Class\u0000html/T_Grpc_Core_Server.htm\u0000344","ServerCallContext Class\u0000html/T_Grpc_Core_ServerCallContext.htm\u0000381","ServerCredentials Class\u0000html/T_Grpc_Core_ServerCredentials.htm\u0000250","ServerPort Class\u0000html/T_Grpc_Core_ServerPort.htm\u0000260","ServerServiceDefinition Class\u0000html/T_Grpc_Core_ServerServiceDefinition.htm\u0000239","ServerServiceDefinition.Builder Class\u0000html/T_Grpc_Core_ServerServiceDefinition_Builder.htm\u0000332","ServerStreamingServerMethod(TRequest, TResponse) Delegate\u0000html/T_Grpc_Core_ServerStreamingServerMethod_2.htm\u0000248","Server.ServerPortCollection Class\u0000html/T_Grpc_Core_Server_ServerPortCollection.htm\u0000312","Server.ServiceDefinitionCollection Class\u0000html/T_Grpc_Core_Server_ServiceDefinitionCollection.htm\u0000278","SslCredentials Class\u0000html/T_Grpc_Core_SslCredentials.htm\u0000274","SslServerCredentials Class\u0000html/T_Grpc_Core_SslServerCredentials.htm\u0000289","Status Structure\u0000html/T_Grpc_Core_Status.htm\u0000235","StatusCode Enumeration\u0000html/T_Grpc_Core_StatusCode.htm\u0000545","UnaryServerMethod(TRequest, TResponse) Delegate\u0000html/T_Grpc_Core_UnaryServerMethod_2.htm\u0000221","AsyncStreamExtensions Class\u0000html/T_Grpc_Core_Utils_AsyncStreamExtensions.htm\u0000211","BenchmarkUtil Class\u0000html/T_Grpc_Core_Utils_BenchmarkUtil.htm\u0000115","Preconditions Class\u0000html/T_Grpc_Core_Utils_Preconditions.htm\u0000177","VersionInfo Class\u0000html/T_Grpc_Core_VersionInfo.htm\u0000109","WriteFlags Enumeration\u0000html/T_Grpc_Core_WriteFlags.htm\u0000148","WriteOptions Class\u0000html/T_Grpc_Core_WriteOptions.htm\u0000230"] \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Events_T_Grpc_Core_RpcException.htm b/doc/ref/csharp/html/html/Events_T_Grpc_Core_RpcException.htm new file mode 100644 index 00000000000..e24bbc2c7e0 --- /dev/null +++ b/doc/ref/csharp/html/html/Events_T_Grpc_Core_RpcException.htm @@ -0,0 +1,3 @@ +RpcException Events
    RpcException Events

    The RpcException type exposes the following members.

    Events
    +   + NameDescription
    Protected eventSerializeObjectState
    Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.
    (Inherited from Exception.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Census.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Census.htm new file mode 100644 index 00000000000..ed73663360d --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Census.htm @@ -0,0 +1,2 @@ +ChannelOptions.Census Field
    ChannelOptionsCensus Field
    Enable census for tracing and stats collection

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string Census

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_DefaultAuthority.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_DefaultAuthority.htm new file mode 100644 index 00000000000..25b96ead2a3 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_DefaultAuthority.htm @@ -0,0 +1,2 @@ +ChannelOptions.DefaultAuthority Field
    ChannelOptionsDefaultAuthority Field
    Default authority for calls.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string DefaultAuthority

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Http2InitialSequenceNumber.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Http2InitialSequenceNumber.htm new file mode 100644 index 00000000000..02a7dbba253 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_Http2InitialSequenceNumber.htm @@ -0,0 +1,2 @@ +ChannelOptions.Http2InitialSequenceNumber Field
    ChannelOptionsHttp2InitialSequenceNumber Field
    Initial sequence number for http2 transports

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string Http2InitialSequenceNumber

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxConcurrentStreams.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxConcurrentStreams.htm new file mode 100644 index 00000000000..b68c6b35bd7 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxConcurrentStreams.htm @@ -0,0 +1,2 @@ +ChannelOptions.MaxConcurrentStreams Field
    ChannelOptionsMaxConcurrentStreams Field
    Maximum number of concurrent incoming streams to allow on a http2 connection

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string MaxConcurrentStreams

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxMessageLength.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxMessageLength.htm new file mode 100644 index 00000000000..fd8731373c5 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_MaxMessageLength.htm @@ -0,0 +1,2 @@ +ChannelOptions.MaxMessageLength Field
    ChannelOptionsMaxMessageLength Field
    Maximum message length that the channel can receive

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string MaxMessageLength

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_PrimaryUserAgentString.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_PrimaryUserAgentString.htm new file mode 100644 index 00000000000..1e0f197ef2c --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_PrimaryUserAgentString.htm @@ -0,0 +1,2 @@ +ChannelOptions.PrimaryUserAgentString Field
    ChannelOptionsPrimaryUserAgentString Field
    Primary user agent: goes at the start of the user-agent metadata

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string PrimaryUserAgentString

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SecondaryUserAgentString.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SecondaryUserAgentString.htm new file mode 100644 index 00000000000..1ab07bbcc9f --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SecondaryUserAgentString.htm @@ -0,0 +1,2 @@ +ChannelOptions.SecondaryUserAgentString Field
    ChannelOptionsSecondaryUserAgentString Field
    Secondary user agent: goes at the end of the user-agent metadata

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string SecondaryUserAgentString

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SslTargetNameOverride.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SslTargetNameOverride.htm new file mode 100644 index 00000000000..45c372a0619 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ChannelOptions_SslTargetNameOverride.htm @@ -0,0 +1,2 @@ +ChannelOptions.SslTargetNameOverride Field
    ChannelOptionsSslTargetNameOverride Field
    Override SSL target check. Only to be used for testing.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string SslTargetNameOverride

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ContextPropagationOptions_Default.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ContextPropagationOptions_Default.htm new file mode 100644 index 00000000000..da242446913 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ContextPropagationOptions_Default.htm @@ -0,0 +1,4 @@ +ContextPropagationOptions.Default Field
    ContextPropagationOptionsDefault Field
    + The context propagation options that will be used by default. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static readonly ContextPropagationOptions Default

    Field Value

    Type: ContextPropagationOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_BinaryHeaderSuffix.htm b/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_BinaryHeaderSuffix.htm new file mode 100644 index 00000000000..a38b7a906d4 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_BinaryHeaderSuffix.htm @@ -0,0 +1,4 @@ +Metadata.BinaryHeaderSuffix Field
    MetadataBinaryHeaderSuffix Field
    + All binary headers should have this suffix. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string BinaryHeaderSuffix

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_Empty.htm b/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_Empty.htm new file mode 100644 index 00000000000..eec5d71768d --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_Metadata_Empty.htm @@ -0,0 +1,4 @@ +Metadata.Empty Field
    MetadataEmpty Field
    + An read-only instance of metadata containing no entries. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static readonly Metadata Empty

    Field Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_ServerPort_PickUnused.htm b/doc/ref/csharp/html/html/F_Grpc_Core_ServerPort_PickUnused.htm new file mode 100644 index 00000000000..200823cc865 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_ServerPort_PickUnused.htm @@ -0,0 +1,5 @@ +ServerPort.PickUnused Field
    ServerPortPickUnused Field
    + Pass this value as port to have the server choose an unused listening port for you. + Ports added to a server will contain the bound port in their BoundPort property. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const int PickUnused

    Field Value

    Type: Int32
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultCancelled.htm b/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultCancelled.htm new file mode 100644 index 00000000000..ebb33491006 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultCancelled.htm @@ -0,0 +1,4 @@ +Status.DefaultCancelled Field
    StatusDefaultCancelled Field
    + Default result of a cancelled RPC. StatusCode=Cancelled, empty details message. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static readonly Status DefaultCancelled

    Field Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultSuccess.htm b/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultSuccess.htm new file mode 100644 index 00000000000..683f4e09fd9 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_Status_DefaultSuccess.htm @@ -0,0 +1,4 @@ +Status.DefaultSuccess Field
    StatusDefaultSuccess Field
    + Default result of a successful RPC. StatusCode=OK, empty details message. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static readonly Status DefaultSuccess

    Field Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_VersionInfo_CurrentVersion.htm b/doc/ref/csharp/html/html/F_Grpc_Core_VersionInfo_CurrentVersion.htm new file mode 100644 index 00000000000..fd0b2c5e8d1 --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_VersionInfo_CurrentVersion.htm @@ -0,0 +1,4 @@ +VersionInfo.CurrentVersion Field
    VersionInfoCurrentVersion Field
    + Current version of gRPC +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public const string CurrentVersion

    Field Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/F_Grpc_Core_WriteOptions_Default.htm b/doc/ref/csharp/html/html/F_Grpc_Core_WriteOptions_Default.htm new file mode 100644 index 00000000000..89ab161c53a --- /dev/null +++ b/doc/ref/csharp/html/html/F_Grpc_Core_WriteOptions_Default.htm @@ -0,0 +1,4 @@ +WriteOptions.Default Field
    WriteOptionsDefault Field
    + Default write options. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static readonly WriteOptions Default

    Field Value

    Type: WriteOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ChannelOptions.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ChannelOptions.htm new file mode 100644 index 00000000000..8c995989ff2 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ChannelOptions.htm @@ -0,0 +1,3 @@ +ChannelOptions Fields
    ChannelOptions Fields

    The ChannelOptions type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberCensus
    Enable census for tracing and stats collection
    Public fieldStatic memberDefaultAuthority
    Default authority for calls.
    Public fieldStatic memberHttp2InitialSequenceNumber
    Initial sequence number for http2 transports
    Public fieldStatic memberMaxConcurrentStreams
    Maximum number of concurrent incoming streams to allow on a http2 connection
    Public fieldStatic memberMaxMessageLength
    Maximum message length that the channel can receive
    Public fieldStatic memberPrimaryUserAgentString
    Primary user agent: goes at the start of the user-agent metadata
    Public fieldStatic memberSecondaryUserAgentString
    Secondary user agent: goes at the end of the user-agent metadata
    Public fieldStatic memberSslTargetNameOverride
    Override SSL target check. Only to be used for testing.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ContextPropagationOptions.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ContextPropagationOptions.htm new file mode 100644 index 00000000000..06d95f38318 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ContextPropagationOptions.htm @@ -0,0 +1,5 @@ +ContextPropagationOptions Fields
    ContextPropagationOptions Fields

    The ContextPropagationOptions type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberDefault
    + The context propagation options that will be used by default. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Metadata.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Metadata.htm new file mode 100644 index 00000000000..4949c9f7b06 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Metadata.htm @@ -0,0 +1,7 @@ +Metadata Fields
    Metadata Fields

    The Metadata type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberBinaryHeaderSuffix
    + All binary headers should have this suffix. +
    Public fieldStatic memberEmpty
    + An read-only instance of metadata containing no entries. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ServerPort.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ServerPort.htm new file mode 100644 index 00000000000..6c8b60e2094 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_ServerPort.htm @@ -0,0 +1,6 @@ +ServerPort Fields
    ServerPort Fields

    The ServerPort type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberPickUnused
    + Pass this value as port to have the server choose an unused listening port for you. + Ports added to a server will contain the bound port in their BoundPort property. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Status.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Status.htm new file mode 100644 index 00000000000..824fb063678 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_Status.htm @@ -0,0 +1,7 @@ +Status Fields
    Status Fields

    The Status type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberDefaultCancelled
    + Default result of a cancelled RPC. StatusCode=Cancelled, empty details message. +
    Public fieldStatic memberDefaultSuccess
    + Default result of a successful RPC. StatusCode=OK, empty details message. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_VersionInfo.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_VersionInfo.htm new file mode 100644 index 00000000000..5373a4af501 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_VersionInfo.htm @@ -0,0 +1,5 @@ +VersionInfo Fields
    VersionInfo Fields

    The VersionInfo type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberCurrentVersion
    + Current version of gRPC +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Fields_T_Grpc_Core_WriteOptions.htm b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_WriteOptions.htm new file mode 100644 index 00000000000..cf412e42ab2 --- /dev/null +++ b/doc/ref/csharp/html/html/Fields_T_Grpc_Core_WriteOptions.htm @@ -0,0 +1,5 @@ +WriteOptions Fields
    WriteOptions Fields

    The WriteOptions type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberDefault
    + Default write options. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromAccessToken.htm b/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromAccessToken.htm new file mode 100644 index 00000000000..7d1f9d636b3 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromAccessToken.htm @@ -0,0 +1,12 @@ +AuthInterceptors.FromAccessToken Method
    AuthInterceptorsFromAccessToken Method
    + Creates OAuth2 interceptor that will use given access token as authorization. +

    Namespace: Grpc.Auth
    Assembly: Grpc.Auth (in Grpc.Auth.dll) Version: 0.6.1.0
    Syntax
    public static HeaderInterceptor FromAccessToken(
    +	string accessToken
    +)

    Parameters

    accessToken
    Type: SystemString
    OAuth2 access token.

    Return Value

    Type: HeaderInterceptor
    The header interceptor.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromCredential.htm b/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromCredential.htm new file mode 100644 index 00000000000..6c42a93dfa2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Auth_AuthInterceptors_FromCredential.htm @@ -0,0 +1,13 @@ +AuthInterceptors.FromCredential Method
    AuthInterceptorsFromCredential Method
    + Creates interceptor that will obtain access token from any credential type that implements + ITokenAccess. (e.g. GoogleCredential). +

    Namespace: Grpc.Auth
    Assembly: Grpc.Auth (in Grpc.Auth.dll) Version: 0.6.1.0
    Syntax
    public static HeaderInterceptor FromCredential(
    +	ITokenAccess credential
    +)

    Parameters

    credential
    Type: ITokenAccess
    The credential to use to obtain access tokens.

    Return Value

    Type: HeaderInterceptor
    The header interceptor.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_Dispose.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_Dispose.htm new file mode 100644 index 00000000000..206999e0f46 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_Dispose.htm @@ -0,0 +1,8 @@ +AsyncClientStreamingCall(TRequest, TResponse).Dispose Method
    AsyncClientStreamingCallTRequest, TResponseDispose Method
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Dispose()

    Implements

    IDisposableDispose
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetAwaiter.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetAwaiter.htm new file mode 100644 index 00000000000..581f356f700 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetAwaiter.htm @@ -0,0 +1,5 @@ +AsyncClientStreamingCall(TRequest, TResponse).GetAwaiter Method
    AsyncClientStreamingCallTRequest, TResponseGetAwaiter Method
    + Allows awaiting this object directly. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public TaskAwaiter<TResponse> GetAwaiter()

    Return Value

    Type: TaskAwaiterTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetStatus.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetStatus.htm new file mode 100644 index 00000000000..f3b2899b0c8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetStatus.htm @@ -0,0 +1,6 @@ +AsyncClientStreamingCall(TRequest, TResponse).GetStatus Method
    AsyncClientStreamingCallTRequest, TResponseGetStatus Method
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status GetStatus()

    Return Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetTrailers.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetTrailers.htm new file mode 100644 index 00000000000..981d6055651 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncClientStreamingCall_2_GetTrailers.htm @@ -0,0 +1,6 @@ +AsyncClientStreamingCall(TRequest, TResponse).GetTrailers Method
    AsyncClientStreamingCallTRequest, TResponseGetTrailers Method
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata GetTrailers()

    Return Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_Dispose.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_Dispose.htm new file mode 100644 index 00000000000..652274451be --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_Dispose.htm @@ -0,0 +1,8 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).Dispose Method
    AsyncDuplexStreamingCallTRequest, TResponseDispose Method
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Dispose()

    Implements

    IDisposableDispose
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetStatus.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetStatus.htm new file mode 100644 index 00000000000..ba96ac35f59 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetStatus.htm @@ -0,0 +1,6 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).GetStatus Method
    AsyncDuplexStreamingCallTRequest, TResponseGetStatus Method
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status GetStatus()

    Return Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetTrailers.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetTrailers.htm new file mode 100644 index 00000000000..3b9acfe3634 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncDuplexStreamingCall_2_GetTrailers.htm @@ -0,0 +1,6 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).GetTrailers Method
    AsyncDuplexStreamingCallTRequest, TResponseGetTrailers Method
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata GetTrailers()

    Return Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_Dispose.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_Dispose.htm new file mode 100644 index 00000000000..452b70ad2ec --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_Dispose.htm @@ -0,0 +1,8 @@ +AsyncServerStreamingCall(TResponse).Dispose Method
    AsyncServerStreamingCallTResponseDispose Method
    + Provides means to cleanup after the call. + If the call has already finished normally (response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Dispose()

    Implements

    IDisposableDispose
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetStatus.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetStatus.htm new file mode 100644 index 00000000000..a61665e4012 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetStatus.htm @@ -0,0 +1,6 @@ +AsyncServerStreamingCall(TResponse).GetStatus Method
    AsyncServerStreamingCallTResponseGetStatus Method
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status GetStatus()

    Return Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetTrailers.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetTrailers.htm new file mode 100644 index 00000000000..e1cb9b82316 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncServerStreamingCall_1_GetTrailers.htm @@ -0,0 +1,6 @@ +AsyncServerStreamingCall(TResponse).GetTrailers Method
    AsyncServerStreamingCallTResponseGetTrailers Method
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata GetTrailers()

    Return Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm new file mode 100644 index 00000000000..190d28d0108 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_Dispose.htm @@ -0,0 +1,8 @@ +AsyncUnaryCall(TResponse).Dispose Method
    AsyncUnaryCallTResponseDispose Method
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Dispose()

    Implements

    IDisposableDispose
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm new file mode 100644 index 00000000000..4d12b2a9f9f --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetAwaiter.htm @@ -0,0 +1,5 @@ +AsyncUnaryCall(TResponse).GetAwaiter Method
    AsyncUnaryCallTResponseGetAwaiter Method
    + Allows awaiting this object directly. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public TaskAwaiter<TResponse> GetAwaiter()

    Return Value

    Type: TaskAwaiterTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm new file mode 100644 index 00000000000..9c6bc1bce35 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetStatus.htm @@ -0,0 +1,6 @@ +AsyncUnaryCall(TResponse).GetStatus Method
    AsyncUnaryCallTResponseGetStatus Method
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status GetStatus()

    Return Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm new file mode 100644 index 00000000000..b78100c95ee --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_AsyncUnaryCall_1_GetTrailers.htm @@ -0,0 +1,6 @@ +AsyncUnaryCall(TResponse).GetTrailers Method
    AsyncUnaryCallTResponseGetTrailers Method
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata GetTrailers()

    Return Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2_WithOptions.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2_WithOptions.htm new file mode 100644 index 00000000000..e7f9826e8f9 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2_WithOptions.htm @@ -0,0 +1,13 @@ +CallInvocationDetails(TRequest, TResponse).WithOptions Method
    CallInvocationDetailsTRequest, TResponseWithOptions Method

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallInvocationDetails<TRequest, TResponse> WithOptions(
    +	CallOptions options
    +)

    Parameters

    options
    Type: Grpc.CoreCallOptions

    [Missing <param name="options"/> documentation for "M:Grpc.Core.CallInvocationDetails`2.WithOptions(Grpc.Core.CallOptions)"]

    Return Value

    Type: CallInvocationDetailsTRequest, TResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor.htm new file mode 100644 index 00000000000..1b3b2d32185 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor.htm @@ -0,0 +1,19 @@ +CallInvocationDetails(TRequest, TResponse) Constructor (Channel, Method(TRequest, TResponse), CallOptions)
    CallInvocationDetailsTRequest, TResponse Constructor (Channel, MethodTRequest, TResponse, CallOptions)

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallInvocationDetails(
    +	Channel channel,
    +	Method<TRequest, TResponse> method,
    +	CallOptions options
    +)

    Parameters

    channel
    Type: Grpc.CoreChannel
    Channel to use for this call.
    method
    Type: Grpc.CoreMethodTRequest, TResponse
    Method to call.
    options
    Type: Grpc.CoreCallOptions
    Call options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_1.htm new file mode 100644 index 00000000000..f8caf7e06a0 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_1.htm @@ -0,0 +1,23 @@ +CallInvocationDetails(TRequest, TResponse) Constructor (Channel, Method(TRequest, TResponse), String, CallOptions)
    CallInvocationDetailsTRequest, TResponse Constructor (Channel, MethodTRequest, TResponse, String, CallOptions)

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallInvocationDetails(
    +	Channel channel,
    +	Method<TRequest, TResponse> method,
    +	string host,
    +	CallOptions options
    +)

    Parameters

    channel
    Type: Grpc.CoreChannel
    Channel to use for this call.
    method
    Type: Grpc.CoreMethodTRequest, TResponse
    Method to call.
    host
    Type: SystemString
    Host that contains the method. if null, default host will be used.
    options
    Type: Grpc.CoreCallOptions
    Call options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_2.htm new file mode 100644 index 00000000000..52738bfc456 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallInvocationDetails_2__ctor_2.htm @@ -0,0 +1,31 @@ +CallInvocationDetails(TRequest, TResponse) Constructor (Channel, String, String, Marshaller(TRequest), Marshaller(TResponse), CallOptions)
    CallInvocationDetailsTRequest, TResponse Constructor (Channel, String, String, MarshallerTRequest, MarshallerTResponse, CallOptions)

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallInvocationDetails(
    +	Channel channel,
    +	string method,
    +	string host,
    +	Marshaller<TRequest> requestMarshaller,
    +	Marshaller<TResponse> responseMarshaller,
    +	CallOptions options
    +)

    Parameters

    channel
    Type: Grpc.CoreChannel
    Channel to use for this call.
    method
    Type: SystemString
    Qualified method name.
    host
    Type: SystemString
    Host that contains the method.
    requestMarshaller
    Type: Grpc.CoreMarshallerTRequest
    Request marshaller.
    responseMarshaller
    Type: Grpc.CoreMarshallerTResponse
    Response marshaller.
    options
    Type: Grpc.CoreCallOptions
    Call options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithCancellationToken.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithCancellationToken.htm new file mode 100644 index 00000000000..e5bbc4eaae6 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithCancellationToken.htm @@ -0,0 +1,13 @@ +CallOptions.WithCancellationToken Method
    CallOptionsWithCancellationToken Method
    + Returns new instance of CallOptions with + CancellationToken set to the value provided. Values of all other fields are preserved. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallOptions WithCancellationToken(
    +	CancellationToken cancellationToken
    +)

    Parameters

    cancellationToken
    Type: System.ThreadingCancellationToken
    The cancellation token.

    Return Value

    Type: CallOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithDeadline.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithDeadline.htm new file mode 100644 index 00000000000..9d7e0d2dcb7 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithDeadline.htm @@ -0,0 +1,13 @@ +CallOptions.WithDeadline Method
    CallOptionsWithDeadline Method
    + Returns new instance of CallOptions with + Deadline set to the value provided. Values of all other fields are preserved. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallOptions WithDeadline(
    +	DateTime deadline
    +)

    Parameters

    deadline
    Type: SystemDateTime
    The deadline.

    Return Value

    Type: CallOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithHeaders.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithHeaders.htm new file mode 100644 index 00000000000..6d65f8330e8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions_WithHeaders.htm @@ -0,0 +1,13 @@ +CallOptions.WithHeaders Method
    CallOptionsWithHeaders Method
    + Returns new instance of CallOptions with + Headers set to the value provided. Values of all other fields are preserved. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallOptions WithHeaders(
    +	Metadata headers
    +)

    Parameters

    headers
    Type: Grpc.CoreMetadata
    The headers.

    Return Value

    Type: CallOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions__ctor.htm new file mode 100644 index 00000000000..ee9c631edba --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_CallOptions__ctor.htm @@ -0,0 +1,35 @@ +CallOptions Constructor
    CallOptions Constructor
    + Creates a new instance of CallOptions struct. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallOptions(
    +	Metadata headers = null,
    +	Nullable<DateTime> deadline = null,
    +	CancellationToken cancellationToken = null,
    +	WriteOptions writeOptions = null,
    +	ContextPropagationToken propagationToken = null
    +)

    Parameters

    headers (Optional)
    Type: Grpc.CoreMetadata
    Headers to be sent with the call.
    deadline (Optional)
    Type: SystemNullableDateTime
    Deadline for the call to finish. null means no deadline.
    cancellationToken (Optional)
    Type: System.ThreadingCancellationToken
    Can be used to request cancellation of the call.
    writeOptions (Optional)
    Type: Grpc.CoreWriteOptions
    Write options that will be used for this call.
    propagationToken (Optional)
    Type: Grpc.CoreContextPropagationToken
    Context propagation token obtained from ServerCallContext.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncClientStreamingCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncClientStreamingCall__2.htm new file mode 100644 index 00000000000..f1a9131a2a2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncClientStreamingCall__2.htm @@ -0,0 +1,19 @@ +Calls.AsyncClientStreamingCall(TRequest, TResponse) Method
    CallsAsyncClientStreamingCallTRequest, TResponse Method
    + Invokes a client streaming call asynchronously. + In client streaming scenario, client sends a stream of requests and server responds with a single response. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(
    +	CallInvocationDetails<TRequest, TResponse> call
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    call
    Type: Grpc.CoreCallInvocationDetailsTRequest, TResponse
    The call defintion.

    Type Parameters

    TRequest
    Type of request messages.
    TResponse
    The of response message.

    Return Value

    Type: AsyncClientStreamingCallTRequest, TResponse
    An awaitable call object providing access to the response.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncDuplexStreamingCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncDuplexStreamingCall__2.htm new file mode 100644 index 00000000000..6dba139ab8e --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncDuplexStreamingCall__2.htm @@ -0,0 +1,20 @@ +Calls.AsyncDuplexStreamingCall(TRequest, TResponse) Method
    CallsAsyncDuplexStreamingCallTRequest, TResponse Method
    + Invokes a duplex streaming call asynchronously. + In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + The response stream is completely independent and both side can be sending messages at the same time. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static AsyncDuplexStreamingCall<TRequest, TResponse> AsyncDuplexStreamingCall<TRequest, TResponse>(
    +	CallInvocationDetails<TRequest, TResponse> call
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    call
    Type: Grpc.CoreCallInvocationDetailsTRequest, TResponse
    The call definition.

    Type Parameters

    TRequest
    Type of request messages.
    TResponse
    Type of reponse messages.

    Return Value

    Type: AsyncDuplexStreamingCallTRequest, TResponse
    A call object providing access to the asynchronous request and response streams.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncServerStreamingCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncServerStreamingCall__2.htm new file mode 100644 index 00000000000..b5ac0db6c59 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncServerStreamingCall__2.htm @@ -0,0 +1,23 @@ +Calls.AsyncServerStreamingCall(TRequest, TResponse) Method
    CallsAsyncServerStreamingCallTRequest, TResponse Method
    + Invokes a server streaming call asynchronously. + In server streaming scenario, client sends on request and server responds with a stream of responses. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static AsyncServerStreamingCall<TResponse> AsyncServerStreamingCall<TRequest, TResponse>(
    +	CallInvocationDetails<TRequest, TResponse> call,
    +	TRequest req
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    call
    Type: Grpc.CoreCallInvocationDetailsTRequest, TResponse
    The call defintion.
    req
    Type: TRequest
    Request message.

    Type Parameters

    TRequest
    Type of request message.
    TResponse
    The of response messages.

    Return Value

    Type: AsyncServerStreamingCallTResponse
    A call object providing access to the asynchronous response stream.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncUnaryCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncUnaryCall__2.htm new file mode 100644 index 00000000000..233475428ad --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_AsyncUnaryCall__2.htm @@ -0,0 +1,22 @@ +Calls.AsyncUnaryCall(TRequest, TResponse) Method
    CallsAsyncUnaryCallTRequest, TResponse Method
    + Invokes a simple remote call asynchronously. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(
    +	CallInvocationDetails<TRequest, TResponse> call,
    +	TRequest req
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    call
    Type: Grpc.CoreCallInvocationDetailsTRequest, TResponse
    The call defintion.
    req
    Type: TRequest
    Request message.

    Type Parameters

    TRequest
    Type of request message.
    TResponse
    The of response message.

    Return Value

    Type: AsyncUnaryCallTResponse
    An awaitable call object providing access to the response.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Calls_BlockingUnaryCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_BlockingUnaryCall__2.htm new file mode 100644 index 00000000000..438ef1d39ca --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Calls_BlockingUnaryCall__2.htm @@ -0,0 +1,22 @@ +Calls.BlockingUnaryCall(TRequest, TResponse) Method
    CallsBlockingUnaryCallTRequest, TResponse Method
    + Invokes a simple remote call in a blocking fashion. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static TResponse BlockingUnaryCall<TRequest, TResponse>(
    +	CallInvocationDetails<TRequest, TResponse> call,
    +	TRequest req
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    call
    Type: Grpc.CoreCallInvocationDetailsTRequest, TResponse
    The call defintion.
    req
    Type: TRequest
    Request message.

    Type Parameters

    TRequest
    Type of request message.
    TResponse
    The of response message.

    Return Value

    Type: TResponse
    The response.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor.htm new file mode 100644 index 00000000000..2cf5522f329 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor.htm @@ -0,0 +1,15 @@ +ChannelOption Constructor (String, Int32)
    ChannelOption Constructor (String, Int32)
    + Creates a channel option with an integer value. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ChannelOption(
    +	string name,
    +	int intValue
    +)

    Parameters

    name
    Type: SystemString
    Name.
    intValue
    Type: SystemInt32
    Integer value.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor_1.htm new file mode 100644 index 00000000000..0cb44f83e9a --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ChannelOption__ctor_1.htm @@ -0,0 +1,15 @@ +ChannelOption Constructor (String, String)
    ChannelOption Constructor (String, String)
    + Creates a channel option with a string value. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ChannelOption(
    +	string name,
    +	string stringValue
    +)

    Parameters

    name
    Type: SystemString
    Name.
    stringValue
    Type: SystemString
    String value.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ConnectAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ConnectAsync.htm new file mode 100644 index 00000000000..c3dc1a1577d --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ConnectAsync.htm @@ -0,0 +1,20 @@ +Channel.ConnectAsync Method
    ChannelConnectAsync Method
    + Allows explicitly requesting channel to connect without starting an RPC. + Returned task completes once state Ready was seen. If the deadline is reached, + or channel enters the FatalFailure state, the task is cancelled. + There is no need to call this explicitly unless your use case requires that. + Starting an RPC on a new channel will request connection implicitly. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task ConnectAsync(
    +	Nullable<DateTime> deadline = null
    +)

    Parameters

    deadline (Optional)
    Type: SystemNullableDateTime
    The deadline. null indicates no deadline.

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ShutdownAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ShutdownAsync.htm new file mode 100644 index 00000000000..f8a04d4f8cf --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_ShutdownAsync.htm @@ -0,0 +1,6 @@ +Channel.ShutdownAsync Method
    ChannelShutdownAsync Method
    + Waits until there are no more active calls for this channel and then cleans up + resources used by this channel. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task ShutdownAsync()

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Channel_WaitForStateChangedAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_WaitForStateChangedAsync.htm new file mode 100644 index 00000000000..92b613f8b6d --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Channel_WaitForStateChangedAsync.htm @@ -0,0 +1,22 @@ +Channel.WaitForStateChangedAsync Method
    ChannelWaitForStateChangedAsync Method
    + Returned tasks completes once channel state has become different from + given lastObservedState. + If deadline is reached or and error occurs, returned task is cancelled. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task WaitForStateChangedAsync(
    +	ChannelState lastObservedState,
    +	Nullable<DateTime> deadline = null
    +)

    Parameters

    lastObservedState
    Type: Grpc.CoreChannelState

    [Missing <param name="lastObservedState"/> documentation for "M:Grpc.Core.Channel.WaitForStateChangedAsync(Grpc.Core.ChannelState,System.Nullable{System.DateTime})"]

    deadline (Optional)
    Type: SystemNullableDateTime

    [Missing <param name="deadline"/> documentation for "M:Grpc.Core.Channel.WaitForStateChangedAsync(Grpc.Core.ChannelState,System.Nullable{System.DateTime})"]

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor.htm new file mode 100644 index 00000000000..fcc5831c797 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor.htm @@ -0,0 +1,24 @@ +Channel Constructor (String, Credentials, IEnumerable(ChannelOption))
    Channel Constructor (String, Credentials, IEnumerableChannelOption)
    + Creates a channel that connects to a specific host. + Port will default to 80 for an unsecure channel and to 443 for a secure channel. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Channel(
    +	string target,
    +	Credentials credentials,
    +	IEnumerable<ChannelOption> options = null
    +)

    Parameters

    target
    Type: SystemString
    Target of the channel.
    credentials
    Type: Grpc.CoreCredentials
    Credentials to secure the channel.
    options (Optional)
    Type: System.Collections.GenericIEnumerableChannelOption
    Channel options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor_1.htm new file mode 100644 index 00000000000..f888c880ec9 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Channel__ctor_1.htm @@ -0,0 +1,27 @@ +Channel Constructor (String, Int32, Credentials, IEnumerable(ChannelOption))
    Channel Constructor (String, Int32, Credentials, IEnumerableChannelOption)
    + Creates a channel that connects to a specific host and port. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Channel(
    +	string host,
    +	int port,
    +	Credentials credentials,
    +	IEnumerable<ChannelOption> options = null
    +)

    Parameters

    host
    Type: SystemString
    The name or IP address of the host.
    port
    Type: SystemInt32
    The port.
    credentials
    Type: Grpc.CoreCredentials
    Credentials to secure the channel.
    options (Optional)
    Type: System.Collections.GenericIEnumerableChannelOption
    Channel options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase_CreateCall__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase_CreateCall__2.htm new file mode 100644 index 00000000000..39494dca379 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase_CreateCall__2.htm @@ -0,0 +1,22 @@ +ClientBase.CreateCall(TRequest, TResponse) Method
    ClientBaseCreateCallTRequest, TResponse Method
    + Creates a new call to given method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    protected CallInvocationDetails<TRequest, TResponse> CreateCall<TRequest, TResponse>(
    +	Method<TRequest, TResponse> method,
    +	CallOptions options
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    method
    Type: Grpc.CoreMethodTRequest, TResponse
    The method to invoke.
    options
    Type: Grpc.CoreCallOptions
    The call options.

    Type Parameters

    TRequest
    Request message type.
    TResponse
    Response message type.

    Return Value

    Type: CallInvocationDetailsTRequest, TResponse
    The call invocation details.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase__ctor.htm new file mode 100644 index 00000000000..5bce0afd309 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ClientBase__ctor.htm @@ -0,0 +1,11 @@ +ClientBase Constructor
    ClientBase Constructor
    + Initializes a new instance of ClientBase class. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ClientBase(
    +	Channel channel
    +)

    Parameters

    channel
    Type: Grpc.CoreChannel
    The channel to use for remote call invocation.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ContextPropagationOptions__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ContextPropagationOptions__ctor.htm new file mode 100644 index 00000000000..8a0c3a6866e --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ContextPropagationOptions__ctor.htm @@ -0,0 +1,20 @@ +ContextPropagationOptions Constructor
    ContextPropagationOptions Constructor
    + Creates new context propagation options. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ContextPropagationOptions(
    +	bool propagateDeadline = true,
    +	bool propagateCancellation = true
    +)

    Parameters

    propagateDeadline (Optional)
    Type: SystemBoolean
    If set to true parent call's deadline will be propagated to the child call.
    propagateCancellation (Optional)
    Type: SystemBoolean
    If set to true parent call's cancellation token will be propagated to the child call.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Credentials__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Credentials__ctor.htm new file mode 100644 index 00000000000..126e39a55ac --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Credentials__ctor.htm @@ -0,0 +1,2 @@ +Credentials Constructor
    Credentials Constructor
    Initializes a new instance of the Credentials class

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    protected Credentials()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_GrpcEnvironment_SetLogger.htm b/doc/ref/csharp/html/html/M_Grpc_Core_GrpcEnvironment_SetLogger.htm new file mode 100644 index 00000000000..2ce38bb3eba --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_GrpcEnvironment_SetLogger.htm @@ -0,0 +1,12 @@ +GrpcEnvironment.SetLogger Method
    GrpcEnvironmentSetLogger Method
    + Sets the application-wide logger that should be used by gRPC. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void SetLogger(
    +	ILogger customLogger
    +)

    Parameters

    customLogger
    Type: Grpc.Core.LoggingILogger

    [Missing <param name="customLogger"/> documentation for "M:Grpc.Core.GrpcEnvironment.SetLogger(Grpc.Core.Logging.ILogger)"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_IAsyncStreamWriter_1_WriteAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_IAsyncStreamWriter_1_WriteAsync.htm new file mode 100644 index 00000000000..28d348c0143 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_IAsyncStreamWriter_1_WriteAsync.htm @@ -0,0 +1,11 @@ +IAsyncStreamWriter(T).WriteAsync Method
    IAsyncStreamWriterTWriteAsync Method
    + Writes a single asynchronously. Only one write can be pending at a time. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    Task WriteAsync(
    +	T message
    +)

    Parameters

    message
    Type: T
    the message to be written. Cannot be null.

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_IClientStreamWriter_1_CompleteAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_IClientStreamWriter_1_CompleteAsync.htm new file mode 100644 index 00000000000..9518f187f89 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_IClientStreamWriter_1_CompleteAsync.htm @@ -0,0 +1,4 @@ +IClientStreamWriter(T).CompleteAsync Method
    IClientStreamWriterTCompleteAsync Method
    + Completes/closes the stream. Can only be called once there is no pending write. No writes should follow calling this. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    Task CompleteAsync()

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_KeyCertificatePair__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_KeyCertificatePair__ctor.htm new file mode 100644 index 00000000000..d0d3deb61f2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_KeyCertificatePair__ctor.htm @@ -0,0 +1,15 @@ +KeyCertificatePair Constructor
    KeyCertificatePair Constructor
    + Creates a new certificate chain - private key pair. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public KeyCertificatePair(
    +	string certificateChain,
    +	string privateKey
    +)

    Parameters

    certificateChain
    Type: SystemString
    PEM encoded certificate chain.
    privateKey
    Type: SystemString
    PEM encoded private key.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Debug.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Debug.htm new file mode 100644 index 00000000000..5e32929e415 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Debug.htm @@ -0,0 +1,16 @@ +ConsoleLogger.Debug Method
    ConsoleLoggerDebug Method
    Logs a message with severity Debug.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Debug(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Debug(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Debug(System.String,System.Object[])"]

    Implements

    ILoggerDebug(String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error.htm new file mode 100644 index 00000000000..6d80286475b --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error.htm @@ -0,0 +1,21 @@ +ConsoleLogger.Error Method (Exception, String, Object[])
    ConsoleLoggerError Method (Exception, String, Object)
    Logs a message and an associated exception with severity Error.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Error(
    +	Exception exception,
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    exception
    Type: SystemException

    [Missing <param name="exception"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Error(System.Exception,System.String,System.Object[])"]

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Error(System.Exception,System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Error(System.Exception,System.String,System.Object[])"]

    Implements

    ILoggerError(Exception, String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error_1.htm new file mode 100644 index 00000000000..8d154f118b7 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Error_1.htm @@ -0,0 +1,16 @@ +ConsoleLogger.Error Method (String, Object[])
    ConsoleLoggerError Method (String, Object)
    Logs a message with severity Error.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Error(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Error(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Error(System.String,System.Object[])"]

    Implements

    ILoggerError(String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_ForType__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_ForType__1.htm new file mode 100644 index 00000000000..66335da42be --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_ForType__1.htm @@ -0,0 +1,7 @@ +ConsoleLogger.ForType(T) Method
    ConsoleLoggerForTypeT Method
    + Returns a logger associated with the specified type. +

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ILogger ForType<T>()
    +

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.ForType``1"]

    Return Value

    Type: ILogger

    Implements

    ILoggerForTypeT
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Info.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Info.htm new file mode 100644 index 00000000000..fa46de948fc --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Info.htm @@ -0,0 +1,16 @@ +ConsoleLogger.Info Method
    ConsoleLoggerInfo Method
    Logs a message with severity Info.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Info(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Info(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Info(System.String,System.Object[])"]

    Implements

    ILoggerInfo(String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning.htm new file mode 100644 index 00000000000..3f8c17d05ec --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning.htm @@ -0,0 +1,21 @@ +ConsoleLogger.Warning Method (Exception, String, Object[])
    ConsoleLoggerWarning Method (Exception, String, Object)
    Logs a message and an associated exception with severity Warning.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Warning(
    +	Exception exception,
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    exception
    Type: SystemException

    [Missing <param name="exception"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Warning(System.Exception,System.String,System.Object[])"]

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Warning(System.Exception,System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Warning(System.Exception,System.String,System.Object[])"]

    Implements

    ILoggerWarning(Exception, String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning_1.htm new file mode 100644 index 00000000000..e8ee3327668 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger_Warning_1.htm @@ -0,0 +1,16 @@ +ConsoleLogger.Warning Method (String, Object[])
    ConsoleLoggerWarning Method (String, Object)
    Logs a message with severity Warning.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Warning(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Warning(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ConsoleLogger.Warning(System.String,System.Object[])"]

    Implements

    ILoggerWarning(String, Object)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger__ctor.htm new file mode 100644 index 00000000000..e1b50253979 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ConsoleLogger__ctor.htm @@ -0,0 +1,2 @@ +ConsoleLogger Constructor
    ConsoleLogger Constructor
    Creates a console logger not associated to any specific type.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ConsoleLogger()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Debug.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Debug.htm new file mode 100644 index 00000000000..c4a15c5b5af --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Debug.htm @@ -0,0 +1,13 @@ +ILogger.Debug Method
    ILoggerDebug Method
    Logs a message with severity Debug.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Debug(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Debug(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Debug(System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error.htm new file mode 100644 index 00000000000..6f5cbfa1431 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error.htm @@ -0,0 +1,17 @@ +ILogger.Error Method (Exception, String, Object[])
    ILoggerError Method (Exception, String, Object)
    Logs a message and an associated exception with severity Error.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Error(
    +	Exception exception,
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    exception
    Type: SystemException

    [Missing <param name="exception"/> documentation for "M:Grpc.Core.Logging.ILogger.Error(System.Exception,System.String,System.Object[])"]

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Error(System.Exception,System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Error(System.Exception,System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error_1.htm new file mode 100644 index 00000000000..8c8e5e3425a --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Error_1.htm @@ -0,0 +1,13 @@ +ILogger.Error Method (String, Object[])
    ILoggerError Method (String, Object)
    Logs a message with severity Error.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Error(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Error(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Error(System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_ForType__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_ForType__1.htm new file mode 100644 index 00000000000..b95f904aeed --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_ForType__1.htm @@ -0,0 +1,4 @@ +ILogger.ForType(T) Method
    ILoggerForTypeT Method
    Returns a logger associated with the specified type.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    ILogger ForType<T>()
    +

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Logging.ILogger.ForType``1"]

    Return Value

    Type: ILogger
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Info.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Info.htm new file mode 100644 index 00000000000..cba47673b98 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Info.htm @@ -0,0 +1,13 @@ +ILogger.Info Method
    ILoggerInfo Method
    Logs a message with severity Info.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Info(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Info(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Info(System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning.htm new file mode 100644 index 00000000000..c103df89408 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning.htm @@ -0,0 +1,17 @@ +ILogger.Warning Method (Exception, String, Object[])
    ILoggerWarning Method (Exception, String, Object)
    Logs a message and an associated exception with severity Warning.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Warning(
    +	Exception exception,
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    exception
    Type: SystemException

    [Missing <param name="exception"/> documentation for "M:Grpc.Core.Logging.ILogger.Warning(System.Exception,System.String,System.Object[])"]

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Warning(System.Exception,System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Warning(System.Exception,System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning_1.htm new file mode 100644 index 00000000000..a2abe0f8ed1 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Logging_ILogger_Warning_1.htm @@ -0,0 +1,13 @@ +ILogger.Warning Method (String, Object[])
    ILoggerWarning Method (String, Object)
    Logs a message with severity Warning.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    void Warning(
    +	string message,
    +	params Object[] formatArgs
    +)

    Parameters

    message
    Type: SystemString

    [Missing <param name="message"/> documentation for "M:Grpc.Core.Logging.ILogger.Warning(System.String,System.Object[])"]

    formatArgs
    Type: SystemObject

    [Missing <param name="formatArgs"/> documentation for "M:Grpc.Core.Logging.ILogger.Warning(System.String,System.Object[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Marshaller_1__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Marshaller_1__ctor.htm new file mode 100644 index 00000000000..4bf979904b6 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Marshaller_1__ctor.htm @@ -0,0 +1,15 @@ +Marshaller(T) Constructor
    MarshallerT Constructor
    + Initializes a new marshaller. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Marshaller(
    +	Func<T, byte[]> serializer,
    +	Func<byte[], T> deserializer
    +)

    Parameters

    serializer
    Type: SystemFuncT, Byte
    Function that will be used to serialize messages.
    deserializer
    Type: SystemFuncByte, T
    Function that will be used to deserialize messages.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Marshallers_Create__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Marshallers_Create__1.htm new file mode 100644 index 00000000000..61818afdb67 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Marshallers_Create__1.htm @@ -0,0 +1,18 @@ +Marshallers.Create(T) Method
    MarshallersCreateT Method
    + Creates a marshaller from specified serializer and deserializer. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Marshaller<T> Create<T>(
    +	Func<T, byte[]> serializer,
    +	Func<byte[], T> deserializer
    +)
    +

    Parameters

    serializer
    Type: SystemFuncT, Byte

    [Missing <param name="serializer"/> documentation for "M:Grpc.Core.Marshallers.Create``1(System.Func{``0,System.Byte[]},System.Func{System.Byte[],``0})"]

    deserializer
    Type: SystemFuncByte, T

    [Missing <param name="deserializer"/> documentation for "M:Grpc.Core.Marshallers.Create``1(System.Func{``0,System.Byte[]},System.Func{System.Byte[],``0})"]

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Marshallers.Create``1(System.Func{``0,System.Byte[]},System.Func{System.Byte[],``0})"]

    Return Value

    Type: MarshallerT
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add.htm new file mode 100644 index 00000000000..c8137c6c117 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add.htm @@ -0,0 +1,11 @@ +Metadata.Add Method (Metadata.Entry)
    MetadataAdd Method (MetadataEntry)

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Add(Grpc.Core.Metadata.Entry)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Add(
    +	MetadataEntry item
    +)

    Parameters

    item
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="item"/> documentation for "M:Grpc.Core.Metadata.Add(Grpc.Core.Metadata.Entry)"]

    Implements

    ICollectionTAdd(T)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_1.htm new file mode 100644 index 00000000000..6240e9bbe20 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_1.htm @@ -0,0 +1,14 @@ +Metadata.Add Method (String, Byte[])
    MetadataAdd Method (String, Byte)

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.Byte[])"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Add(
    +	string key,
    +	byte[] valueBytes
    +)

    Parameters

    key
    Type: SystemString

    [Missing <param name="key"/> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.Byte[])"]

    valueBytes
    Type: SystemByte

    [Missing <param name="valueBytes"/> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.Byte[])"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_2.htm new file mode 100644 index 00000000000..54030d4c1c0 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Add_2.htm @@ -0,0 +1,14 @@ +Metadata.Add Method (String, String)
    MetadataAdd Method (String, String)

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.String)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Add(
    +	string key,
    +	string value
    +)

    Parameters

    key
    Type: SystemString

    [Missing <param name="key"/> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.String)"]

    value
    Type: SystemString

    [Missing <param name="value"/> documentation for "M:Grpc.Core.Metadata.Add(System.String,System.String)"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Clear.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Clear.htm new file mode 100644 index 00000000000..63b79b103e9 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Clear.htm @@ -0,0 +1,3 @@ +Metadata.Clear Method
    MetadataClear Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Clear"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Contains.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Contains.htm new file mode 100644 index 00000000000..25711d28fa5 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Contains.htm @@ -0,0 +1,11 @@ +Metadata.Contains Method
    MetadataContains Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Contains(Grpc.Core.Metadata.Entry)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool Contains(
    +	MetadataEntry item
    +)

    Parameters

    item
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="item"/> documentation for "M:Grpc.Core.Metadata.Contains(Grpc.Core.Metadata.Entry)"]

    Return Value

    Type: Boolean

    Implements

    ICollectionTContains(T)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_CopyTo.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_CopyTo.htm new file mode 100644 index 00000000000..151dc2e4cd6 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_CopyTo.htm @@ -0,0 +1,16 @@ +Metadata.CopyTo Method
    MetadataCopyTo Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.CopyTo(Grpc.Core.Metadata.Entry[],System.Int32)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void CopyTo(
    +	MetadataEntry[] array,
    +	int arrayIndex
    +)

    Parameters

    array
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="array"/> documentation for "M:Grpc.Core.Metadata.CopyTo(Grpc.Core.Metadata.Entry[],System.Int32)"]

    arrayIndex
    Type: SystemInt32

    [Missing <param name="arrayIndex"/> documentation for "M:Grpc.Core.Metadata.CopyTo(Grpc.Core.Metadata.Entry[],System.Int32)"]

    Implements

    ICollectionTCopyTo(T, Int32)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry_ToString.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry_ToString.htm new file mode 100644 index 00000000000..88c335739a8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry_ToString.htm @@ -0,0 +1,5 @@ +Metadata.Entry.ToString Method
    MetadataEntryToString Method

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public override string ToString()

    Return Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor.htm new file mode 100644 index 00000000000..775e8b5a942 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor.htm @@ -0,0 +1,15 @@ +Metadata.Entry Constructor (String, Byte[])
    MetadataEntry Constructor (String, Byte)
    + Initializes a new instance of the MetadataEntry struct with a binary value. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Entry(
    +	string key,
    +	byte[] valueBytes
    +)

    Parameters

    key
    Type: SystemString
    Metadata key, needs to have suffix indicating a binary valued metadata entry.
    valueBytes
    Type: SystemByte
    Value bytes.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor_1.htm new file mode 100644 index 00000000000..355545e1ac8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Entry__ctor_1.htm @@ -0,0 +1,15 @@ +Metadata.Entry Constructor (String, String)
    MetadataEntry Constructor (String, String)
    + Initializes a new instance of the MetadataEntry struct holding an ASCII value. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Entry(
    +	string key,
    +	string value
    +)

    Parameters

    key
    Type: SystemString
    Metadata key, must not use suffix indicating a binary valued metadata entry.
    value
    Type: SystemString
    Value string. Only ASCII characters are allowed.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_GetEnumerator.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_GetEnumerator.htm new file mode 100644 index 00000000000..a8720d73a14 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_GetEnumerator.htm @@ -0,0 +1,3 @@ +Metadata.GetEnumerator Method
    MetadataGetEnumerator Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.GetEnumerator"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IEnumerator<MetadataEntry> GetEnumerator()

    Return Value

    Type: IEnumeratorMetadataEntry

    Implements

    IEnumerableTGetEnumerator
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_IndexOf.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_IndexOf.htm new file mode 100644 index 00000000000..e1791e72315 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_IndexOf.htm @@ -0,0 +1,11 @@ +Metadata.IndexOf Method
    MetadataIndexOf Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.IndexOf(Grpc.Core.Metadata.Entry)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int IndexOf(
    +	MetadataEntry item
    +)

    Parameters

    item
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="item"/> documentation for "M:Grpc.Core.Metadata.IndexOf(Grpc.Core.Metadata.Entry)"]

    Return Value

    Type: Int32

    Implements

    IListTIndexOf(T)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Insert.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Insert.htm new file mode 100644 index 00000000000..a6f0cfd1639 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Insert.htm @@ -0,0 +1,16 @@ +Metadata.Insert Method
    MetadataInsert Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Insert(System.Int32,Grpc.Core.Metadata.Entry)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Insert(
    +	int index,
    +	MetadataEntry item
    +)

    Parameters

    index
    Type: SystemInt32

    [Missing <param name="index"/> documentation for "M:Grpc.Core.Metadata.Insert(System.Int32,Grpc.Core.Metadata.Entry)"]

    item
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="item"/> documentation for "M:Grpc.Core.Metadata.Insert(System.Int32,Grpc.Core.Metadata.Entry)"]

    Implements

    IListTInsert(Int32, T)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Remove.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Remove.htm new file mode 100644 index 00000000000..fda57bc4583 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_Remove.htm @@ -0,0 +1,11 @@ +Metadata.Remove Method
    MetadataRemove Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.Remove(Grpc.Core.Metadata.Entry)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool Remove(
    +	MetadataEntry item
    +)

    Parameters

    item
    Type: Grpc.CoreMetadataEntry

    [Missing <param name="item"/> documentation for "M:Grpc.Core.Metadata.Remove(Grpc.Core.Metadata.Entry)"]

    Return Value

    Type: Boolean

    Implements

    ICollectionTRemove(T)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_RemoveAt.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_RemoveAt.htm new file mode 100644 index 00000000000..519eac63b72 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata_RemoveAt.htm @@ -0,0 +1,11 @@ +Metadata.RemoveAt Method
    MetadataRemoveAt Method

    [Missing <summary> documentation for "M:Grpc.Core.Metadata.RemoveAt(System.Int32)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void RemoveAt(
    +	int index
    +)

    Parameters

    index
    Type: SystemInt32

    [Missing <param name="index"/> documentation for "M:Grpc.Core.Metadata.RemoveAt(System.Int32)"]

    Implements

    IListTRemoveAt(Int32)
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Metadata__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata__ctor.htm new file mode 100644 index 00000000000..844e6135cc2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Metadata__ctor.htm @@ -0,0 +1,4 @@ +Metadata Constructor
    Metadata Constructor
    + Initializes a new instance of Metadata. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Method_2__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Method_2__ctor.htm new file mode 100644 index 00000000000..7708571728c --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Method_2__ctor.htm @@ -0,0 +1,27 @@ +Method(TRequest, TResponse) Constructor
    MethodTRequest, TResponse Constructor
    + Initializes a new instance of the Method class. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Method(
    +	MethodType type,
    +	string serviceName,
    +	string name,
    +	Marshaller<TRequest> requestMarshaller,
    +	Marshaller<TResponse> responseMarshaller
    +)

    Parameters

    type
    Type: Grpc.CoreMethodType
    Type of method.
    serviceName
    Type: SystemString
    Name of service this method belongs to.
    name
    Type: SystemString
    Unqualified name of the method.
    requestMarshaller
    Type: Grpc.CoreMarshallerTRequest
    Marshaller used for request messages.
    responseMarshaller
    Type: Grpc.CoreMarshallerTResponse
    Marshaller used for response messages.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor.htm new file mode 100644 index 00000000000..0eacf485d3c --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor.htm @@ -0,0 +1,11 @@ +RpcException Constructor (Status)
    RpcException Constructor (Status)
    + Creates a new RpcException associated with given status. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public RpcException(
    +	Status status
    +)

    Parameters

    status
    Type: Grpc.CoreStatus
    Resulting status of a call.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor_1.htm new file mode 100644 index 00000000000..d1611a2c416 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_RpcException__ctor_1.htm @@ -0,0 +1,15 @@ +RpcException Constructor (Status, String)
    RpcException Constructor (Status, String)
    + Creates a new RpcException associated with given status and message. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public RpcException(
    +	Status status,
    +	string message
    +)

    Parameters

    status
    Type: Grpc.CoreStatus
    Resulting status of a call.
    message
    Type: SystemString
    The exception message.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_CreatePropagationToken.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_CreatePropagationToken.htm new file mode 100644 index 00000000000..40fbe7c30e2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_CreatePropagationToken.htm @@ -0,0 +1,16 @@ +ServerCallContext.CreatePropagationToken Method
    ServerCallContextCreatePropagationToken Method
    + Creates a propagation token to be used to propagate call context to a child call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ContextPropagationToken CreatePropagationToken(
    +	ContextPropagationOptions options = null
    +)

    Parameters

    options (Optional)
    Type: Grpc.CoreContextPropagationOptions

    [Missing <param name="options"/> documentation for "M:Grpc.Core.ServerCallContext.CreatePropagationToken(Grpc.Core.ContextPropagationOptions)"]

    Return Value

    Type: ContextPropagationToken
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_WriteResponseHeadersAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_WriteResponseHeadersAsync.htm new file mode 100644 index 00000000000..b62606fafd8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCallContext_WriteResponseHeadersAsync.htm @@ -0,0 +1,14 @@ +ServerCallContext.WriteResponseHeadersAsync Method
    ServerCallContextWriteResponseHeadersAsync Method
    + Asynchronously sends response headers for the current call to the client. This method may only be invoked once for each call and needs to be invoked + before any response messages are written. Writing the first response message implicitly sends empty response headers if WriteResponseHeadersAsync haven't + been called yet. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task WriteResponseHeadersAsync(
    +	Metadata responseHeaders
    +)

    Parameters

    responseHeaders
    Type: Grpc.CoreMetadata
    The response headers to send.

    Return Value

    Type: Task
    The task that finished once response headers have been written.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerCredentials__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCredentials__ctor.htm new file mode 100644 index 00000000000..ec8b030d85e --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerCredentials__ctor.htm @@ -0,0 +1,2 @@ +ServerCredentials Constructor
    ServerCredentials Constructor
    Initializes a new instance of the ServerCredentials class

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    protected ServerCredentials()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerPort__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerPort__ctor.htm new file mode 100644 index 00000000000..4d29fd3c5b0 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerPort__ctor.htm @@ -0,0 +1,19 @@ +ServerPort Constructor
    ServerPort Constructor
    + Creates a new port on which server should listen. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerPort(
    +	string host,
    +	int port,
    +	ServerCredentials credentials
    +)

    Parameters

    host
    Type: SystemString
    the host
    port
    Type: SystemInt32
    the port. If zero, an unused port is chosen automatically.
    credentials
    Type: Grpc.CoreServerCredentials
    credentials to use to secure this port.

    Return Value

    Type: 
    The port on which server will be listening.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2.htm new file mode 100644 index 00000000000..2fadac3cf89 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2.htm @@ -0,0 +1,22 @@ +ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), ClientStreamingServerMethod(TRequest, TResponse))
    ServerServiceDefinitionBuilderAddMethodTRequest, TResponse Method (MethodTRequest, TResponse, ClientStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a client streaming method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinitionBuilder AddMethod<TRequest, TResponse>(
    +	Method<TRequest, TResponse> method,
    +	ClientStreamingServerMethod<TRequest, TResponse> handler
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    method
    Type: Grpc.CoreMethodTRequest, TResponse
    The method.
    handler
    Type: Grpc.CoreClientStreamingServerMethodTRequest, TResponse
    The method handler.

    Type Parameters

    TRequest
    The request message class.
    TResponse
    The response message class.

    Return Value

    Type: ServerServiceDefinitionBuilder
    This builder instance.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_1.htm new file mode 100644 index 00000000000..da7d825115a --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_1.htm @@ -0,0 +1,22 @@ +ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), DuplexStreamingServerMethod(TRequest, TResponse))
    ServerServiceDefinitionBuilderAddMethodTRequest, TResponse Method (MethodTRequest, TResponse, DuplexStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a bidirectional streaming method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinitionBuilder AddMethod<TRequest, TResponse>(
    +	Method<TRequest, TResponse> method,
    +	DuplexStreamingServerMethod<TRequest, TResponse> handler
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    method
    Type: Grpc.CoreMethodTRequest, TResponse
    The method.
    handler
    Type: Grpc.CoreDuplexStreamingServerMethodTRequest, TResponse
    The method handler.

    Type Parameters

    TRequest
    The request message class.
    TResponse
    The response message class.

    Return Value

    Type: ServerServiceDefinitionBuilder
    This builder instance.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_2.htm new file mode 100644 index 00000000000..9e8a832ba52 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_2.htm @@ -0,0 +1,22 @@ +ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), ServerStreamingServerMethod(TRequest, TResponse))
    ServerServiceDefinitionBuilderAddMethodTRequest, TResponse Method (MethodTRequest, TResponse, ServerStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a server streaming method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinitionBuilder AddMethod<TRequest, TResponse>(
    +	Method<TRequest, TResponse> method,
    +	ServerStreamingServerMethod<TRequest, TResponse> handler
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    method
    Type: Grpc.CoreMethodTRequest, TResponse
    The method.
    handler
    Type: Grpc.CoreServerStreamingServerMethodTRequest, TResponse
    The method handler.

    Type Parameters

    TRequest
    The request message class.
    TResponse
    The response message class.

    Return Value

    Type: ServerServiceDefinitionBuilder
    This builder instance.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_3.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_3.htm new file mode 100644 index 00000000000..de304e706c9 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_AddMethod__2_3.htm @@ -0,0 +1,22 @@ +ServerServiceDefinition.Builder.AddMethod(TRequest, TResponse) Method (Method(TRequest, TResponse), UnaryServerMethod(TRequest, TResponse))
    ServerServiceDefinitionBuilderAddMethodTRequest, TResponse Method (MethodTRequest, TResponse, UnaryServerMethodTRequest, TResponse)
    + Adds a definitions for a single request - single response method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinitionBuilder AddMethod<TRequest, TResponse>(
    +	Method<TRequest, TResponse> method,
    +	UnaryServerMethod<TRequest, TResponse> handler
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    method
    Type: Grpc.CoreMethodTRequest, TResponse
    The method.
    handler
    Type: Grpc.CoreUnaryServerMethodTRequest, TResponse
    The method handler.

    Type Parameters

    TRequest
    The request message class.
    TResponse
    The response message class.

    Return Value

    Type: ServerServiceDefinitionBuilder
    This builder instance.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_Build.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_Build.htm new file mode 100644 index 00000000000..38d2dff08b9 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder_Build.htm @@ -0,0 +1,5 @@ +ServerServiceDefinition.Builder.Build Method
    ServerServiceDefinitionBuilderBuild Method
    + Creates an immutable ServerServiceDefinition from this builder. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinition Build()

    Return Value

    Type: ServerServiceDefinition
    The ServerServiceDefinition object.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder__ctor.htm new file mode 100644 index 00000000000..dae62e89489 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_Builder__ctor.htm @@ -0,0 +1,11 @@ +ServerServiceDefinition.Builder Constructor
    ServerServiceDefinitionBuilder Constructor
    + Creates a new instance of builder. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Builder(
    +	string serviceName
    +)

    Parameters

    serviceName
    Type: SystemString
    The service name.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_CreateBuilder.htm b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_CreateBuilder.htm new file mode 100644 index 00000000000..c4773bb452e --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_ServerServiceDefinition_CreateBuilder.htm @@ -0,0 +1,12 @@ +ServerServiceDefinition.CreateBuilder Method
    ServerServiceDefinitionCreateBuilder Method
    + Creates a new builder object for ServerServiceDefinition. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static ServerServiceDefinitionBuilder CreateBuilder(
    +	string serviceName
    +)

    Parameters

    serviceName
    Type: SystemString
    The service name.

    Return Value

    Type: ServerServiceDefinitionBuilder
    The builder object.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_KillAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_KillAsync.htm new file mode 100644 index 00000000000..426ecb67618 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_KillAsync.htm @@ -0,0 +1,6 @@ +Server.KillAsync Method
    ServerKillAsync Method
    + Requests server shutdown while cancelling all the in-progress calls. + The returned task finishes when shutdown procedure is complete. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task KillAsync()

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add.htm new file mode 100644 index 00000000000..1630b0207d3 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add.htm @@ -0,0 +1,13 @@ +Server.ServerPortCollection.Add Method (ServerPort)
    ServerServerPortCollectionAdd Method (ServerPort)
    + Adds a new port on which server should listen. + Only call this before Start(). +

    Return Value

    Type: Int32
    The port on which server will be listening.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int Add(
    +	ServerPort serverPort
    +)

    Parameters

    serverPort
    Type: Grpc.CoreServerPort

    [Missing <param name="serverPort"/> documentation for "M:Grpc.Core.Server.ServerPortCollection.Add(Grpc.Core.ServerPort)"]

    Return Value

    Type: Int32
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add_1.htm new file mode 100644 index 00000000000..5ab99149365 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_Add_1.htm @@ -0,0 +1,20 @@ +Server.ServerPortCollection.Add Method (String, Int32, ServerCredentials)
    ServerServerPortCollectionAdd Method (String, Int32, ServerCredentials)
    + Adds a new port on which server should listen. +

    Return Value

    Type: Int32
    The port on which server will be listening.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int Add(
    +	string host,
    +	int port,
    +	ServerCredentials credentials
    +)

    Parameters

    host
    Type: SystemString
    the host
    port
    Type: SystemInt32
    the port. If zero, an unused port is chosen automatically.
    credentials
    Type: Grpc.CoreServerCredentials
    credentials to use to secure this port.

    Return Value

    Type: Int32
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_GetEnumerator.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_GetEnumerator.htm new file mode 100644 index 00000000000..c3f33973678 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServerPortCollection_GetEnumerator.htm @@ -0,0 +1,5 @@ +Server.ServerPortCollection.GetEnumerator Method
    ServerServerPortCollectionGetEnumerator Method
    + Gets enumerator for this collection. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IEnumerator<ServerPort> GetEnumerator()

    Return Value

    Type: IEnumeratorServerPort

    Implements

    IEnumerableTGetEnumerator
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_Add.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_Add.htm new file mode 100644 index 00000000000..c525f99a9ec --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_Add.htm @@ -0,0 +1,13 @@ +Server.ServiceDefinitionCollection.Add Method
    ServerServiceDefinitionCollectionAdd Method
    + Adds a service definition to the server. This is how you register + handlers for a service with the server. Only call this before Start(). +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Add(
    +	ServerServiceDefinition serviceDefinition
    +)

    Parameters

    serviceDefinition
    Type: Grpc.CoreServerServiceDefinition

    [Missing <param name="serviceDefinition"/> documentation for "M:Grpc.Core.Server.ServiceDefinitionCollection.Add(Grpc.Core.ServerServiceDefinition)"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_GetEnumerator.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_GetEnumerator.htm new file mode 100644 index 00000000000..afa388ca280 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ServiceDefinitionCollection_GetEnumerator.htm @@ -0,0 +1,5 @@ +Server.ServiceDefinitionCollection.GetEnumerator Method
    ServerServiceDefinitionCollectionGetEnumerator Method
    + Gets enumerator for this collection. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IEnumerator<ServerServiceDefinition> GetEnumerator()

    Return Value

    Type: IEnumeratorServerServiceDefinition

    Implements

    IEnumerableTGetEnumerator
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_ShutdownAsync.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ShutdownAsync.htm new file mode 100644 index 00000000000..77cc86e8fe3 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_ShutdownAsync.htm @@ -0,0 +1,7 @@ +Server.ShutdownAsync Method
    ServerShutdownAsync Method
    + Requests server shutdown and when there are no more calls being serviced, + cleans up used resources. The returned task finishes when shutdown procedure + is complete. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task ShutdownAsync()

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server_Start.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server_Start.htm new file mode 100644 index 00000000000..09d55ea5464 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server_Start.htm @@ -0,0 +1,5 @@ +Server.Start Method
    ServerStart Method
    + Starts the server. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public void Start()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Server__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Server__ctor.htm new file mode 100644 index 00000000000..268246bb354 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Server__ctor.htm @@ -0,0 +1,15 @@ +Server Constructor
    Server Constructor
    + Create a new server. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Server(
    +	IEnumerable<ChannelOption> options = null
    +)

    Parameters

    options (Optional)
    Type: System.Collections.GenericIEnumerableChannelOption
    Channel options.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor.htm new file mode 100644 index 00000000000..eda9fee34ee --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor.htm @@ -0,0 +1,6 @@ +SslCredentials Constructor
    SslCredentials Constructor
    + Creates client-side SSL credentials loaded from + disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable. + If that fails, gets the roots certificates from a well known place on disk. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public SslCredentials()
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_1.htm new file mode 100644 index 00000000000..cfdcd658e0c --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_1.htm @@ -0,0 +1,12 @@ +SslCredentials Constructor (String)
    SslCredentials Constructor (String)
    + Creates client-side SSL credentials from + a string containing PEM encoded root certificates. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public SslCredentials(
    +	string rootCertificates
    +)

    Parameters

    rootCertificates
    Type: SystemString

    [Missing <param name="rootCertificates"/> documentation for "M:Grpc.Core.SslCredentials.#ctor(System.String)"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_2.htm b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_2.htm new file mode 100644 index 00000000000..4f73a16035a --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_SslCredentials__ctor_2.htm @@ -0,0 +1,15 @@ +SslCredentials Constructor (String, KeyCertificatePair)
    SslCredentials Constructor (String, KeyCertificatePair)
    + Creates client-side SSL credentials. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public SslCredentials(
    +	string rootCertificates,
    +	KeyCertificatePair keyCertificatePair
    +)

    Parameters

    rootCertificates
    Type: SystemString
    string containing PEM encoded server root certificates.
    keyCertificatePair
    Type: Grpc.CoreKeyCertificatePair
    a key certificate pair.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor.htm new file mode 100644 index 00000000000..f7042eb5d47 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor.htm @@ -0,0 +1,13 @@ +SslServerCredentials Constructor (IEnumerable(KeyCertificatePair))
    SslServerCredentials Constructor (IEnumerableKeyCertificatePair)
    + Creates server-side SSL credentials. + This constructor should be use if you do not wish to autheticate client + using client root certificates. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public SslServerCredentials(
    +	IEnumerable<KeyCertificatePair> keyCertificatePairs
    +)

    Parameters

    keyCertificatePairs
    Type: System.Collections.GenericIEnumerableKeyCertificatePair
    Key-certificates to use.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor_1.htm new file mode 100644 index 00000000000..39b6f74eb09 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_SslServerCredentials__ctor_1.htm @@ -0,0 +1,19 @@ +SslServerCredentials Constructor (IEnumerable(KeyCertificatePair), String, Boolean)
    SslServerCredentials Constructor (IEnumerableKeyCertificatePair, String, Boolean)
    + Creates server-side SSL credentials. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public SslServerCredentials(
    +	IEnumerable<KeyCertificatePair> keyCertificatePairs,
    +	string rootCertificates,
    +	bool forceClientAuth
    +)

    Parameters

    keyCertificatePairs
    Type: System.Collections.GenericIEnumerableKeyCertificatePair
    Key-certificates to use.
    rootCertificates
    Type: SystemString
    PEM encoded client root certificates used to authenticate client.
    forceClientAuth
    Type: SystemBoolean
    If true, client will be rejected unless it proves its unthenticity using against rootCertificates.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Status_ToString.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Status_ToString.htm new file mode 100644 index 00000000000..5132664b73d --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Status_ToString.htm @@ -0,0 +1,5 @@ +Status.ToString Method
    StatusToString Method
    + Returns a String that represents the current Status. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public override string ToString()

    Return Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Status__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Status__ctor.htm new file mode 100644 index 00000000000..1e613e2ab04 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Status__ctor.htm @@ -0,0 +1,15 @@ +Status Constructor
    Status Constructor
    + Creates a new instance of Status. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status(
    +	StatusCode statusCode,
    +	string detail
    +)

    Parameters

    statusCode
    Type: Grpc.CoreStatusCode
    Status code.
    detail
    Type: SystemString
    Detail.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ForEachAsync__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ForEachAsync__1.htm new file mode 100644 index 00000000000..ad827bda7b6 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ForEachAsync__1.htm @@ -0,0 +1,23 @@ +AsyncStreamExtensions.ForEachAsync(T) Method
    AsyncStreamExtensionsForEachAsyncT Method
    + Reads the entire stream and executes an async action for each element. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Task ForEachAsync<T>(
    +	this IAsyncStreamReader<T> streamReader,
    +	Func<T, Task> asyncAction
    +)
    +where T : class
    +

    Parameters

    streamReader
    Type: Grpc.CoreIAsyncStreamReaderT

    [Missing <param name="streamReader"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.ForEachAsync``1(Grpc.Core.IAsyncStreamReader{``0},System.Func{``0,System.Threading.Tasks.Task})"]

    asyncAction
    Type: SystemFuncT, Task

    [Missing <param name="asyncAction"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.ForEachAsync``1(Grpc.Core.IAsyncStreamReader{``0},System.Func{``0,System.Threading.Tasks.Task})"]

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.ForEachAsync``1(Grpc.Core.IAsyncStreamReader{``0},System.Func{``0,System.Threading.Tasks.Task})"]

    Return Value

    Type: Task

    Usage Note

    In Visual Basic and C#, you can call this method as an instance method on any object of type IAsyncStreamReaderT. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ToListAsync__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ToListAsync__1.htm new file mode 100644 index 00000000000..3b76b6d21f8 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_ToListAsync__1.htm @@ -0,0 +1,19 @@ +AsyncStreamExtensions.ToListAsync(T) Method
    AsyncStreamExtensionsToListAsyncT Method
    + Reads the entire stream and creates a list containing all the elements read. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Task<List<T>> ToListAsync<T>(
    +	this IAsyncStreamReader<T> streamReader
    +)
    +where T : class
    +

    Parameters

    streamReader
    Type: Grpc.CoreIAsyncStreamReaderT

    [Missing <param name="streamReader"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.ToListAsync``1(Grpc.Core.IAsyncStreamReader{``0})"]

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.ToListAsync``1(Grpc.Core.IAsyncStreamReader{``0})"]

    Return Value

    Type: TaskListT

    Usage Note

    In Visual Basic and C#, you can call this method as an instance method on any object of type IAsyncStreamReaderT. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1.htm new file mode 100644 index 00000000000..cd81b87f036 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1.htm @@ -0,0 +1,32 @@ +AsyncStreamExtensions.WriteAllAsync(T) Method (IClientStreamWriter(T), IEnumerable(T), Boolean)
    AsyncStreamExtensionsWriteAllAsyncT Method (IClientStreamWriterT, IEnumerableT, Boolean)
    + Writes all elements from given enumerable to the stream. + Completes the stream afterwards unless close = false. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Task WriteAllAsync<T>(
    +	this IClientStreamWriter<T> streamWriter,
    +	IEnumerable<T> elements,
    +	bool complete = true
    +)
    +where T : class
    +

    Parameters

    streamWriter
    Type: Grpc.CoreIClientStreamWriterT

    [Missing <param name="streamWriter"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IClientStreamWriter{``0},System.Collections.Generic.IEnumerable{``0},System.Boolean)"]

    elements
    Type: System.Collections.GenericIEnumerableT

    [Missing <param name="elements"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IClientStreamWriter{``0},System.Collections.Generic.IEnumerable{``0},System.Boolean)"]

    complete (Optional)
    Type: SystemBoolean

    [Missing <param name="complete"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IClientStreamWriter{``0},System.Collections.Generic.IEnumerable{``0},System.Boolean)"]

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IClientStreamWriter{``0},System.Collections.Generic.IEnumerable{``0},System.Boolean)"]

    Return Value

    Type: Task

    Usage Note

    In Visual Basic and C#, you can call this method as an instance method on any object of type IClientStreamWriterT. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1_1.htm new file mode 100644 index 00000000000..04fb4e52352 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync__1_1.htm @@ -0,0 +1,23 @@ +AsyncStreamExtensions.WriteAllAsync(T) Method (IServerStreamWriter(T), IEnumerable(T))
    AsyncStreamExtensionsWriteAllAsyncT Method (IServerStreamWriterT, IEnumerableT)
    + Writes all elements from given enumerable to the stream. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Task WriteAllAsync<T>(
    +	this IServerStreamWriter<T> streamWriter,
    +	IEnumerable<T> elements
    +)
    +where T : class
    +

    Parameters

    streamWriter
    Type: Grpc.CoreIServerStreamWriterT

    [Missing <param name="streamWriter"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IServerStreamWriter{``0},System.Collections.Generic.IEnumerable{``0})"]

    elements
    Type: System.Collections.GenericIEnumerableT

    [Missing <param name="elements"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IServerStreamWriter{``0},System.Collections.Generic.IEnumerable{``0})"]

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.AsyncStreamExtensions.WriteAllAsync``1(Grpc.Core.IServerStreamWriter{``0},System.Collections.Generic.IEnumerable{``0})"]

    Return Value

    Type: Task

    Usage Note

    In Visual Basic and C#, you can call this method as an instance method on any object of type IServerStreamWriterT. When you use instance method syntax to call this method, omit the first parameter. For more information, see Extension Methods (Visual Basic) or Extension Methods (C# Programming Guide).
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_BenchmarkUtil_RunBenchmark.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_BenchmarkUtil_RunBenchmark.htm new file mode 100644 index 00000000000..47138a00ba1 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_BenchmarkUtil_RunBenchmark.htm @@ -0,0 +1,20 @@ +BenchmarkUtil.RunBenchmark Method
    BenchmarkUtilRunBenchmark Method
    + Runs a simple benchmark preceded by warmup phase. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void RunBenchmark(
    +	int warmupIterations,
    +	int benchmarkIterations,
    +	Action action
    +)

    Parameters

    warmupIterations
    Type: SystemInt32

    [Missing <param name="warmupIterations"/> documentation for "M:Grpc.Core.Utils.BenchmarkUtil.RunBenchmark(System.Int32,System.Int32,System.Action)"]

    benchmarkIterations
    Type: SystemInt32

    [Missing <param name="benchmarkIterations"/> documentation for "M:Grpc.Core.Utils.BenchmarkUtil.RunBenchmark(System.Int32,System.Int32,System.Action)"]

    action
    Type: SystemAction

    [Missing <param name="action"/> documentation for "M:Grpc.Core.Utils.BenchmarkUtil.RunBenchmark(System.Int32,System.Int32,System.Action)"]

    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument.htm new file mode 100644 index 00000000000..067a90ed7cd --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument.htm @@ -0,0 +1,12 @@ +Preconditions.CheckArgument Method (Boolean)
    PreconditionsCheckArgument Method (Boolean)
    + Throws ArgumentException if condition is false. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void CheckArgument(
    +	bool condition
    +)

    Parameters

    condition
    Type: SystemBoolean
    The condition.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument_1.htm new file mode 100644 index 00000000000..4bc9b4e26fe --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckArgument_1.htm @@ -0,0 +1,16 @@ +Preconditions.CheckArgument Method (Boolean, String)
    PreconditionsCheckArgument Method (Boolean, String)
    + Throws ArgumentException with given message if condition is false. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void CheckArgument(
    +	bool condition,
    +	string errorMessage
    +)

    Parameters

    condition
    Type: SystemBoolean
    The condition.
    errorMessage
    Type: SystemString
    The error message.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1.htm new file mode 100644 index 00000000000..71e09518018 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1.htm @@ -0,0 +1,14 @@ +Preconditions.CheckNotNull(T) Method (T)
    PreconditionsCheckNotNullT Method (T)
    + Throws ArgumentNullException if reference is null. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static T CheckNotNull<T>(
    +	T reference
    +)
    +

    Parameters

    reference
    Type: T
    The reference.

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.Preconditions.CheckNotNull``1(``0)"]

    Return Value

    Type: T
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1_1.htm new file mode 100644 index 00000000000..a8442ff5f9c --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckNotNull__1_1.htm @@ -0,0 +1,18 @@ +Preconditions.CheckNotNull(T) Method (T, String)
    PreconditionsCheckNotNullT Method (T, String)
    + Throws ArgumentNullException if reference is null. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static T CheckNotNull<T>(
    +	T reference,
    +	string paramName
    +)
    +

    Parameters

    reference
    Type: T
    The reference.
    paramName
    Type: SystemString
    The parameter name.

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "M:Grpc.Core.Utils.Preconditions.CheckNotNull``1(``0,System.String)"]

    Return Value

    Type: T
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState.htm new file mode 100644 index 00000000000..db25a18cc3a --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState.htm @@ -0,0 +1,12 @@ +Preconditions.CheckState Method (Boolean)
    PreconditionsCheckState Method (Boolean)
    + Throws InvalidOperationException if condition is false. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void CheckState(
    +	bool condition
    +)

    Parameters

    condition
    Type: SystemBoolean
    The condition.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState_1.htm b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState_1.htm new file mode 100644 index 00000000000..98a215c2aa2 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_Utils_Preconditions_CheckState_1.htm @@ -0,0 +1,16 @@ +Preconditions.CheckState Method (Boolean, String)
    PreconditionsCheckState Method (Boolean, String)
    + Throws InvalidOperationException with given message if condition is false. +

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static void CheckState(
    +	bool condition,
    +	string errorMessage
    +)

    Parameters

    condition
    Type: SystemBoolean
    The condition.
    errorMessage
    Type: SystemString
    The error message.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/M_Grpc_Core_WriteOptions__ctor.htm b/doc/ref/csharp/html/html/M_Grpc_Core_WriteOptions__ctor.htm new file mode 100644 index 00000000000..8d09de81080 --- /dev/null +++ b/doc/ref/csharp/html/html/M_Grpc_Core_WriteOptions__ctor.htm @@ -0,0 +1,15 @@ +WriteOptions Constructor
    WriteOptions Constructor
    + Initializes a new instance of WriteOptions class. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public WriteOptions(
    +	WriteFlags flags = 
    +)

    Parameters

    flags (Optional)
    Type: Grpc.CoreWriteFlags
    The write flags.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Auth_AuthInterceptors.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Auth_AuthInterceptors.htm new file mode 100644 index 00000000000..67729e61c1a --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Auth_AuthInterceptors.htm @@ -0,0 +1,8 @@ +AuthInterceptors Methods
    AuthInterceptors Methods

    The AuthInterceptors type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberFromAccessToken
    + Creates OAuth2 interceptor that will use given access token as authorization. +
    Public methodStatic memberFromCredential
    + Creates interceptor that will obtain access token from any credential type that implements + ITokenAccess. (e.g. GoogleCredential). +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.htm new file mode 100644 index 00000000000..1a980e8a2a3 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncClientStreamingCall_2.htm @@ -0,0 +1,16 @@ +AsyncClientStreamingCall(TRequest, TResponse) Methods
    AsyncClientStreamingCallTRequest, TResponse Methods

    The AsyncClientStreamingCallTRequest, TResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetAwaiter
    + Allows awaiting this object directly. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm new file mode 100644 index 00000000000..b52e7bb7c7a --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm @@ -0,0 +1,14 @@ +AsyncDuplexStreamingCall(TRequest, TResponse) Methods
    AsyncDuplexStreamingCallTRequest, TResponse Methods

    The AsyncDuplexStreamingCallTRequest, TResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.htm new file mode 100644 index 00000000000..c2cbdffe878 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncServerStreamingCall_1.htm @@ -0,0 +1,14 @@ +AsyncServerStreamingCall(TResponse) Methods
    AsyncServerStreamingCallTResponse Methods

    The AsyncServerStreamingCallTResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncUnaryCall_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncUnaryCall_1.htm new file mode 100644 index 00000000000..7be009c0694 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_AsyncUnaryCall_1.htm @@ -0,0 +1,16 @@ +AsyncUnaryCall(TResponse) Methods
    AsyncUnaryCallTResponse Methods

    The AsyncUnaryCallTResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetAwaiter
    + Allows awaiting this object directly. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallInvocationDetails_2.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallInvocationDetails_2.htm new file mode 100644 index 00000000000..2cc225528fa --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallInvocationDetails_2.htm @@ -0,0 +1,6 @@ +CallInvocationDetails(TRequest, TResponse) Methods
    CallInvocationDetailsTRequest, TResponse Methods

    The CallInvocationDetailsTRequest, TResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Public methodWithOptions
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallOptions.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallOptions.htm new file mode 100644 index 00000000000..f9fe02ed1ce --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_CallOptions.htm @@ -0,0 +1,12 @@ +CallOptions Methods
    CallOptions Methods

    The CallOptions type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Public methodWithCancellationToken
    + Returns new instance of CallOptions with + CancellationToken set to the value provided. Values of all other fields are preserved. +
    Public methodWithDeadline
    + Returns new instance of CallOptions with + Deadline set to the value provided. Values of all other fields are preserved. +
    Public methodWithHeaders
    + Returns new instance of CallOptions with + Headers set to the value provided. Values of all other fields are preserved. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Calls.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Calls.htm new file mode 100644 index 00000000000..8933af3feae --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Calls.htm @@ -0,0 +1,17 @@ +Calls Methods
    Calls Methods

    The Calls type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberAsyncClientStreamingCallTRequest, TResponse
    + Invokes a client streaming call asynchronously. + In client streaming scenario, client sends a stream of requests and server responds with a single response. +
    Public methodStatic memberAsyncDuplexStreamingCallTRequest, TResponse
    + Invokes a duplex streaming call asynchronously. + In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + The response stream is completely independent and both side can be sending messages at the same time. +
    Public methodStatic memberAsyncServerStreamingCallTRequest, TResponse
    + Invokes a server streaming call asynchronously. + In server streaming scenario, client sends on request and server responds with a stream of responses. +
    Public methodStatic memberAsyncUnaryCallTRequest, TResponse
    + Invokes a simple remote call asynchronously. +
    Public methodStatic memberBlockingUnaryCallTRequest, TResponse
    + Invokes a simple remote call in a blocking fashion. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Channel.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Channel.htm new file mode 100644 index 00000000000..5aa7e521756 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Channel.htm @@ -0,0 +1,16 @@ +Channel Methods
    Channel Methods

    The Channel type exposes the following members.

    Methods
    +   + NameDescription
    Public methodConnectAsync
    + Allows explicitly requesting channel to connect without starting an RPC. + Returned task completes once state Ready was seen. If the deadline is reached, + or channel enters the FatalFailure state, the task is cancelled. + There is no need to call this explicitly unless your use case requires that. + Starting an RPC on a new channel will request connection implicitly. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodShutdownAsync
    + Waits until there are no more active calls for this channel and then cleans up + resources used by this channel. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWaitForStateChangedAsync
    + Returned tasks completes once channel state has become different from + given lastObservedState. + If deadline is reached or and error occurs, returned task is cancelled. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ChannelOption.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ChannelOption.htm new file mode 100644 index 00000000000..4629b7a4a30 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ChannelOption.htm @@ -0,0 +1,3 @@ +ChannelOption Methods
    ChannelOption Methods

    The ChannelOption type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ClientBase.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ClientBase.htm new file mode 100644 index 00000000000..b0f38c947f5 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ClientBase.htm @@ -0,0 +1,5 @@ +ClientBase Methods
    ClientBase Methods

    The ClientBase type exposes the following members.

    Methods
    +   + NameDescription
    Protected methodCreateCallTRequest, TResponse
    + Creates a new call to given method. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationOptions.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationOptions.htm new file mode 100644 index 00000000000..abc1abbea8f --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationOptions.htm @@ -0,0 +1,3 @@ +ContextPropagationOptions Methods
    ContextPropagationOptions Methods

    The ContextPropagationOptions type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationToken.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationToken.htm new file mode 100644 index 00000000000..0bf0e221adc --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ContextPropagationToken.htm @@ -0,0 +1,3 @@ +ContextPropagationToken Methods
    ContextPropagationToken Methods

    The ContextPropagationToken type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Credentials.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Credentials.htm new file mode 100644 index 00000000000..2ab1c230630 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Credentials.htm @@ -0,0 +1,3 @@ +Credentials Methods
    Credentials Methods

    The Credentials type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_GrpcEnvironment.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_GrpcEnvironment.htm new file mode 100644 index 00000000000..56aede94470 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_GrpcEnvironment.htm @@ -0,0 +1,5 @@ +GrpcEnvironment Methods
    GrpcEnvironment Methods

    The GrpcEnvironment type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodStatic memberSetLogger
    + Sets the application-wide logger that should be used by gRPC. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamReader_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamReader_1.htm new file mode 100644 index 00000000000..9ccee5b4b6d --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamReader_1.htm @@ -0,0 +1,9 @@ +IAsyncStreamReader(T) Methods
    IAsyncStreamReaderT Methods

    The IAsyncStreamReaderT generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDispose
    Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    (Inherited from IDisposable.)
    Public methodMoveNext (Inherited from IAsyncEnumeratorT.)
    Top
    Extension Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamWriter_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamWriter_1.htm new file mode 100644 index 00000000000..f69951fdf01 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IAsyncStreamWriter_1.htm @@ -0,0 +1,5 @@ +IAsyncStreamWriter(T) Methods
    IAsyncStreamWriterT Methods

    The IAsyncStreamWriterT generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodWriteAsync
    + Writes a single asynchronously. Only one write can be pending at a time. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IClientStreamWriter_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IClientStreamWriter_1.htm new file mode 100644 index 00000000000..271b5cf2513 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IClientStreamWriter_1.htm @@ -0,0 +1,12 @@ +IClientStreamWriter(T) Methods
    IClientStreamWriterT Methods

    The IClientStreamWriterT generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodCompleteAsync
    + Completes/closes the stream. Can only be called once there is no pending write. No writes should follow calling this. +
    Public methodWriteAsync
    + Writes a single asynchronously. Only one write can be pending at a time. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    Extension Methods
    +   + NameDescription
    Public Extension MethodWriteAllAsyncT
    + Writes all elements from given enumerable to the stream. + Completes the stream afterwards unless close = false. +
    (Defined by AsyncStreamExtensions.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IServerStreamWriter_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IServerStreamWriter_1.htm new file mode 100644 index 00000000000..9ab9b0d00fd --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_IServerStreamWriter_1.htm @@ -0,0 +1,9 @@ +IServerStreamWriter(T) Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_KeyCertificatePair.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_KeyCertificatePair.htm new file mode 100644 index 00000000000..31988564f91 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_KeyCertificatePair.htm @@ -0,0 +1,3 @@ +KeyCertificatePair Methods
    KeyCertificatePair Methods

    The KeyCertificatePair type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ConsoleLogger.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ConsoleLogger.htm new file mode 100644 index 00000000000..5ee03065d1e --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ConsoleLogger.htm @@ -0,0 +1,5 @@ +ConsoleLogger Methods
    ConsoleLogger Methods

    The ConsoleLogger type exposes the following members.

    Methods
    +   + NameDescription
    Public methodDebug
    Logs a message with severity Debug.
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodError(String, Object)
    Logs a message with severity Error.
    Public methodError(Exception, String, Object)
    Logs a message and an associated exception with severity Error.
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodForTypeT
    + Returns a logger associated with the specified type. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodInfo
    Logs a message with severity Info.
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWarning(String, Object)
    Logs a message with severity Warning.
    Public methodWarning(Exception, String, Object)
    Logs a message and an associated exception with severity Warning.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ILogger.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ILogger.htm new file mode 100644 index 00000000000..0f4357be401 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Logging_ILogger.htm @@ -0,0 +1,3 @@ +ILogger Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshaller_1.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshaller_1.htm new file mode 100644 index 00000000000..127f58079d7 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshaller_1.htm @@ -0,0 +1,3 @@ +Marshaller(T) Methods
    MarshallerT Methods

    The MarshallerT generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshallers.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshallers.htm new file mode 100644 index 00000000000..aa8491ca2f5 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Marshallers.htm @@ -0,0 +1,5 @@ +Marshallers Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata.htm new file mode 100644 index 00000000000..aacbe035f78 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata.htm @@ -0,0 +1,3 @@ +Metadata Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata_Entry.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata_Entry.htm new file mode 100644 index 00000000000..44e0cd1fa05 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Metadata_Entry.htm @@ -0,0 +1,5 @@ +Entry Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Method_2.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Method_2.htm new file mode 100644 index 00000000000..b4b0b5cc631 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Method_2.htm @@ -0,0 +1,3 @@ +Method(TRequest, TResponse) Methods
    MethodTRequest, TResponse Methods

    The MethodTRequest, TResponse generic type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_RpcException.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_RpcException.htm new file mode 100644 index 00000000000..83c86a82066 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_RpcException.htm @@ -0,0 +1,3 @@ +RpcException Methods
    RpcException Methods

    The RpcException type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetBaseException
    When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.
    (Inherited from Exception.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetObjectData
    When overridden in a derived class, sets the SerializationInfo with information about the exception.
    (Inherited from Exception.)
    Public methodGetType
    Gets the runtime type of the current instance.
    (Inherited from Exception.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Creates and returns a string representation of the current exception.
    (Inherited from Exception.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server.htm new file mode 100644 index 00000000000..bf2e344c91e --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server.htm @@ -0,0 +1,12 @@ +Server Methods
    Server Methods

    The Server type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodKillAsync
    + Requests server shutdown while cancelling all the in-progress calls. + The returned task finishes when shutdown procedure is complete. +
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodShutdownAsync
    + Requests server shutdown and when there are no more calls being serviced, + cleans up used resources. The returned task finishes when shutdown procedure + is complete. +
    Public methodStart
    + Starts the server. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCallContext.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCallContext.htm new file mode 100644 index 00000000000..a55e4815e5a --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCallContext.htm @@ -0,0 +1,9 @@ +ServerCallContext Methods
    ServerCallContext Methods

    The ServerCallContext type exposes the following members.

    Methods
    +   + NameDescription
    Public methodCreatePropagationToken
    + Creates a propagation token to be used to propagate call context to a child call. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWriteResponseHeadersAsync
    + Asynchronously sends response headers for the current call to the client. This method may only be invoked once for each call and needs to be invoked + before any response messages are written. Writing the first response message implicitly sends empty response headers if WriteResponseHeadersAsync haven't + been called yet. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCredentials.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCredentials.htm new file mode 100644 index 00000000000..c603f7c234f --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerCredentials.htm @@ -0,0 +1,3 @@ +ServerCredentials Methods
    ServerCredentials Methods

    The ServerCredentials type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerPort.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerPort.htm new file mode 100644 index 00000000000..87d83868f72 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerPort.htm @@ -0,0 +1,3 @@ +ServerPort Methods
    ServerPort Methods

    The ServerPort type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition.htm new file mode 100644 index 00000000000..11b14918718 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition.htm @@ -0,0 +1,5 @@ +ServerServiceDefinition Methods
    ServerServiceDefinition Methods

    The ServerServiceDefinition type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberCreateBuilder
    + Creates a new builder object for ServerServiceDefinition. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.htm new file mode 100644 index 00000000000..dccc51fe172 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_ServerServiceDefinition_Builder.htm @@ -0,0 +1,13 @@ +Builder Methods
    Builder Methods

    The ServerServiceDefinitionBuilder type exposes the following members.

    Methods
    +   + NameDescription
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ClientStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a client streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, DuplexStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a bidirectional streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ServerStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a server streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, UnaryServerMethodTRequest, TResponse)
    + Adds a definitions for a single request - single response method. +
    Public methodBuild
    + Creates an immutable ServerServiceDefinition from this builder. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServerPortCollection.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServerPortCollection.htm new file mode 100644 index 00000000000..b8e44358fb1 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServerPortCollection.htm @@ -0,0 +1,10 @@ +ServerPortCollection Methods
    ServerPortCollection Methods

    The ServerServerPortCollection type exposes the following members.

    Methods
    +   + NameDescription
    Public methodAdd(ServerPort)
    + Adds a new port on which server should listen. + Only call this before Start(). +

    Return Value

    Type: 
    The port on which server will be listening.
    Public methodAdd(String, Int32, ServerCredentials)
    + Adds a new port on which server should listen. +

    Return Value

    Type: 
    The port on which server will be listening.
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetEnumerator
    + Gets enumerator for this collection. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.htm new file mode 100644 index 00000000000..08c940b8316 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Server_ServiceDefinitionCollection.htm @@ -0,0 +1,8 @@ +ServiceDefinitionCollection Methods
    ServiceDefinitionCollection Methods

    The ServerServiceDefinitionCollection type exposes the following members.

    Methods
    +   + NameDescription
    Public methodAdd
    + Adds a service definition to the server. This is how you register + handlers for a service with the server. Only call this before Start(). +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetEnumerator
    + Gets enumerator for this collection. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslCredentials.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslCredentials.htm new file mode 100644 index 00000000000..b4ef394fbe7 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslCredentials.htm @@ -0,0 +1,3 @@ +SslCredentials Methods
    SslCredentials Methods

    The SslCredentials type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslServerCredentials.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslServerCredentials.htm new file mode 100644 index 00000000000..cbe8f3e41ff --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_SslServerCredentials.htm @@ -0,0 +1,3 @@ +SslServerCredentials Methods
    SslServerCredentials Methods

    The SslServerCredentials type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Status.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Status.htm new file mode 100644 index 00000000000..8a477adba01 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Status.htm @@ -0,0 +1,5 @@ +Status Methods
    Status Methods

    The Status type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    + Returns a String that represents the current Status. +
    (Overrides ValueTypeToString.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.htm new file mode 100644 index 00000000000..bade3e79f22 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_AsyncStreamExtensions.htm @@ -0,0 +1,12 @@ +AsyncStreamExtensions Methods
    AsyncStreamExtensions Methods

    The AsyncStreamExtensions type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberForEachAsyncT
    + Reads the entire stream and executes an async action for each element. +
    Public methodStatic memberToListAsyncT
    + Reads the entire stream and creates a list containing all the elements read. +
    Public methodStatic memberWriteAllAsyncT(IServerStreamWriterT, IEnumerableT)
    + Writes all elements from given enumerable to the stream. +
    Public methodStatic memberWriteAllAsyncT(IClientStreamWriterT, IEnumerableT, Boolean)
    + Writes all elements from given enumerable to the stream. + Completes the stream afterwards unless close = false. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_BenchmarkUtil.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_BenchmarkUtil.htm new file mode 100644 index 00000000000..cf12124a285 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_BenchmarkUtil.htm @@ -0,0 +1,5 @@ +BenchmarkUtil Methods
    BenchmarkUtil Methods

    The BenchmarkUtil type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberRunBenchmark
    + Runs a simple benchmark preceded by warmup phase. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_Preconditions.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_Preconditions.htm new file mode 100644 index 00000000000..9b150653cb9 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_Utils_Preconditions.htm @@ -0,0 +1,15 @@ +Preconditions Methods \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Methods_T_Grpc_Core_WriteOptions.htm b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_WriteOptions.htm new file mode 100644 index 00000000000..abfae7f92a8 --- /dev/null +++ b/doc/ref/csharp/html/html/Methods_T_Grpc_Core_WriteOptions.htm @@ -0,0 +1,3 @@ +WriteOptions Methods
    WriteOptions Methods

    The WriteOptions type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/N_Grpc_Auth.htm b/doc/ref/csharp/html/html/N_Grpc_Auth.htm new file mode 100644 index 00000000000..2b80dc68bd1 --- /dev/null +++ b/doc/ref/csharp/html/html/N_Grpc_Auth.htm @@ -0,0 +1,6 @@ +Grpc.Auth Namespace
    Grpc.Auth Namespace
    Provides OAuth2 based authentication for gRPC. Grpc.Auth currently consists of a set of very lightweight wrappers and uses C# Google.Apis.Auth library.
    Classes
    +   + ClassDescription
    Public classAuthInterceptors
    + Factory methods to create authorization interceptors. Interceptors created can be registered with gRPC client classes (autogenerated client stubs that + inherit from ClientBase). +
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/N_Grpc_Core.htm b/doc/ref/csharp/html/html/N_Grpc_Core.htm new file mode 100644 index 00000000000..83d06a49513 --- /dev/null +++ b/doc/ref/csharp/html/html/N_Grpc_Core.htm @@ -0,0 +1,133 @@ +Grpc.Core Namespace
    Grpc.Core Namespace
    Main namespace for gRPC C# functionality. Contains concepts representing both client side and server side gRPC logic. + +
    Classes
    +   + ClassDescription
    Public classAsyncClientStreamingCallTRequest, TResponse
    + Return type for client streaming calls. +
    Public classAsyncDuplexStreamingCallTRequest, TResponse
    + Return type for bidirectional streaming calls. +
    Public classAsyncServerStreamingCallTResponse
    + Return type for server streaming calls. +
    Public classAsyncUnaryCallTResponse
    + Return type for single request - single response call. +
    Public classCalls
    + Helper methods for generated clients to make RPC calls. + Most users will use this class only indirectly and will be + making calls using client object generated from protocol + buffer definition files. +
    Public classChannel
    + Represents a gRPC channel. Channels are an abstraction of long-lived connections to remote servers. + More client objects can reuse the same channel. Creating a channel is an expensive operation compared to invoking + a remote call so in general you should reuse a single channel for as many calls as possible. +
    Public classChannelOption
    + Channel option specified when creating a channel. + Corresponds to grpc_channel_args from grpc/grpc.h. +
    Public classChannelOptions
    + Defines names of supported channel options. +
    Public classClientBase
    + Base class for client-side stubs. +
    Public classContextPropagationOptions
    + Options for ContextPropagationToken. +
    Public classContextPropagationToken
    + Token for propagating context of server side handlers to child calls. + In situations when a backend is making calls to another backend, + it makes sense to propagate properties like deadline and cancellation + token of the server call to the child call. + The gRPC native layer provides some other contexts (like tracing context) that + are not accessible to explicitly C# layer, but this token still allows propagating them. +
    Public classCredentials
    + Client-side credentials. Used for creation of a secure channel. +
    Public classGrpcEnvironment
    + Encapsulates initialization and shutdown of gRPC library. +
    Public classKeyCertificatePair
    + Key certificate pair (in PEM encoding). +
    Public classMarshallers
    + Utilities for creating marshallers. +
    Public classMetadata
    + A collection of metadata entries that can be exchanged during a call. + gRPC supports these types of metadata: +
    • Request headers - are sent by the client at the beginning of a remote call before any request messages are sent.
    • Response headers - are sent by the server at the beginning of a remote call handler before any response messages are sent.
    • Response trailers - are sent by the server at the end of a remote call along with resulting call status.
    Public classMethodTRequest, TResponse
    + A description of a remote method. +
    Public classRpcException
    + Thrown when remote procedure call fails. Every RpcException is associated with a resulting Status of the call. +
    Public classServer
    + gRPC server. A single server can server arbitrary number of services and can listen on more than one ports. +
    Public classServerServerPortCollection
    + Collection of server ports. +
    Public classServerServiceDefinitionCollection
    + Collection of service definitions. +
    Public classServerCallContext
    + Context for a server-side call. +
    Public classServerCredentials
    + Server side credentials. +
    Public classServerPort
    + A port exposed by a server. +
    Public classServerServiceDefinition
    + Mapping of method names to server call handlers. + Normally, the ServerServiceDefinition objects will be created by the BindService factory method + that is part of the autogenerated code for a protocol buffers service definition. +
    Public classServerServiceDefinitionBuilder
    + Builder class for ServerServiceDefinition. +
    Public classSslCredentials
    + Client-side SSL credentials. +
    Public classSslServerCredentials
    + Server-side SSL credentials. +
    Public classVersionInfo
    + Provides info about current version of gRPC. +
    Public classWriteOptions
    + Options for write operations. +
    Structures
    Interfaces
    Delegates
    Enumerations
    +   + EnumerationDescription
    Public enumerationChannelOptionOptionType
    + Type of ChannelOption. +
    Public enumerationChannelState
    + Connectivity state of a channel. + Based on grpc_connectivity_state from grpc/grpc.h +
    Public enumerationCompressionLevel
    + Compression level based on grpc_compression_level from grpc/compression.h +
    Public enumerationMethodType
    + Method types supported by gRPC. +
    Public enumerationStatusCode
    + Result of a remote procedure call. + Based on grpc_status_code from grpc/status.h +
    Public enumerationWriteFlags
    + Flags for write operations. +
    See Also

    Reference

    [Grpc.Core.Channel]
    [Grpc.Core.Server]
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/N_Grpc_Core_Logging.htm b/doc/ref/csharp/html/html/N_Grpc_Core_Logging.htm new file mode 100644 index 00000000000..e0f8f6fae66 --- /dev/null +++ b/doc/ref/csharp/html/html/N_Grpc_Core_Logging.htm @@ -0,0 +1,5 @@ +Grpc.Core.Logging Namespace
    Grpc.Core.Logging Namespace
    Provides functionality to redirect gRPC logs to application-specified destination.
    Classes
    +   + ClassDescription
    Public classConsoleLogger
    Logger that logs to System.Console.
    Interfaces
    +   + InterfaceDescription
    Public interfaceILogger
    For logging messages.
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/N_Grpc_Core_Utils.htm b/doc/ref/csharp/html/html/N_Grpc_Core_Utils.htm new file mode 100644 index 00000000000..07574fcfa8a --- /dev/null +++ b/doc/ref/csharp/html/html/N_Grpc_Core_Utils.htm @@ -0,0 +1,9 @@ +Grpc.Core.Utils Namespace
    Grpc.Core.Utils Namespace
    Various utilities for gRPC C#.
    Classes
    +   + ClassDescription
    Public classAsyncStreamExtensions
    + Extension methods that simplify work with gRPC streaming calls. +
    Public classBenchmarkUtil
    + Utility methods to run microbenchmarks. +
    Public classPreconditions
    + Utility methods to simplify checking preconditions in the code. +
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_CallInvocationDetails_2__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_CallInvocationDetails_2__ctor.htm new file mode 100644 index 00000000000..bdfed5182c4 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_CallInvocationDetails_2__ctor.htm @@ -0,0 +1,9 @@ +CallInvocationDetails(TRequest, TResponse) Constructor
    CallInvocationDetailsTRequest, TResponse Constructor
    Overload List
    +   + NameDescription
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, MethodTRequest, TResponse, CallOptions)
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, MethodTRequest, TResponse, String, CallOptions)
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, String, String, MarshallerTRequest, MarshallerTResponse, CallOptions)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_ChannelOption__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_ChannelOption__ctor.htm new file mode 100644 index 00000000000..f9d3b537559 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_ChannelOption__ctor.htm @@ -0,0 +1,7 @@ +ChannelOption Constructor
    ChannelOption Constructor
    Overload List
    +   + NameDescription
    Public methodChannelOption(String, Int32)
    + Creates a channel option with an integer value. +
    Public methodChannelOption(String, String)
    + Creates a channel option with a string value. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Channel__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Channel__ctor.htm new file mode 100644 index 00000000000..ba465a1a919 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Channel__ctor.htm @@ -0,0 +1,8 @@ +Channel Constructor \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Error.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Error.htm new file mode 100644 index 00000000000..534abce9e1a --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Error.htm @@ -0,0 +1,3 @@ +ConsoleLogger.Error Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.htm new file mode 100644 index 00000000000..463eff04863 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ConsoleLogger_Warning.htm @@ -0,0 +1,3 @@ +ConsoleLogger.Warning Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Error.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Error.htm new file mode 100644 index 00000000000..38204e336d7 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Error.htm @@ -0,0 +1,3 @@ +ILogger.Error Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Warning.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Warning.htm new file mode 100644 index 00000000000..bfb1543a0a8 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Logging_ILogger_Warning.htm @@ -0,0 +1,3 @@ +ILogger.Warning Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Add.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Add.htm new file mode 100644 index 00000000000..58693f58dde --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Add.htm @@ -0,0 +1,3 @@ +Metadata.Add Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Entry__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Entry__ctor.htm new file mode 100644 index 00000000000..7355bb6cd1c --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Metadata_Entry__ctor.htm @@ -0,0 +1,7 @@ +Entry Constructor \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_RpcException__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_RpcException__ctor.htm new file mode 100644 index 00000000000..aa64c87501d --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_RpcException__ctor.htm @@ -0,0 +1,7 @@ +RpcException Constructor
    RpcException Constructor
    Overload List
    +   + NameDescription
    Public methodRpcException(Status)
    + Creates a new RpcException associated with given status. +
    Public methodRpcException(Status, String)
    + Creates a new RpcException associated with given status and message. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.htm new file mode 100644 index 00000000000..534bdc60015 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_ServerServiceDefinition_Builder_AddMethod.htm @@ -0,0 +1,11 @@ +Builder.AddMethod Method
    BuilderAddMethod Method
    Overload List
    +   + NameDescription
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ClientStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a client streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, DuplexStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a bidirectional streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ServerStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a server streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, UnaryServerMethodTRequest, TResponse)
    + Adds a definitions for a single request - single response method. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Server_ServerPortCollection_Add.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Server_ServerPortCollection_Add.htm new file mode 100644 index 00000000000..9e5a944189e --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Server_ServerPortCollection_Add.htm @@ -0,0 +1,8 @@ +ServerPortCollection.Add Method
    ServerPortCollectionAdd Method
    Overload List
    +   + NameDescription
    Public methodAdd(ServerPort)
    + Adds a new port on which server should listen. + Only call this before Start(). +

    Return Value

    Type: 
    The port on which server will be listening.
    Public methodAdd(String, Int32, ServerCredentials)
    + Adds a new port on which server should listen. +

    Return Value

    Type: 
    The port on which server will be listening.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_SslCredentials__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_SslCredentials__ctor.htm new file mode 100644 index 00000000000..93219ea1528 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_SslCredentials__ctor.htm @@ -0,0 +1,12 @@ +SslCredentials Constructor
    SslCredentials Constructor
    Overload List
    +   + NameDescription
    Public methodSslCredentials
    + Creates client-side SSL credentials loaded from + disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable. + If that fails, gets the roots certificates from a well known place on disk. +
    Public methodSslCredentials(String)
    + Creates client-side SSL credentials from + a string containing PEM encoded root certificates. +
    Public methodSslCredentials(String, KeyCertificatePair)
    + Creates client-side SSL credentials. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_SslServerCredentials__ctor.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_SslServerCredentials__ctor.htm new file mode 100644 index 00000000000..f8506d929d0 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_SslServerCredentials__ctor.htm @@ -0,0 +1,9 @@ +SslServerCredentials Constructor \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.htm new file mode 100644 index 00000000000..af7b9578870 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_AsyncStreamExtensions_WriteAllAsync.htm @@ -0,0 +1,8 @@ +AsyncStreamExtensions.WriteAllAsync Method
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.htm new file mode 100644 index 00000000000..4b4a4afdf9f --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckArgument.htm @@ -0,0 +1,7 @@ +Preconditions.CheckArgument Method
    PreconditionsCheckArgument Method
    Overload List
    +   + NameDescription
    Public methodStatic memberCheckArgument(Boolean)
    + Throws ArgumentException if condition is false. +
    Public methodStatic memberCheckArgument(Boolean, String)
    + Throws ArgumentException with given message if condition is false. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.htm new file mode 100644 index 00000000000..3d1638474d8 --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckNotNull.htm @@ -0,0 +1,7 @@ +Preconditions.CheckNotNull Method \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckState.htm b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckState.htm new file mode 100644 index 00000000000..2e223aabd9c --- /dev/null +++ b/doc/ref/csharp/html/html/Overload_Grpc_Core_Utils_Preconditions_CheckState.htm @@ -0,0 +1,7 @@ +Preconditions.CheckState Method
    PreconditionsCheckState Method
    Overload List
    +   + NameDescription
    Public methodStatic memberCheckState(Boolean)
    + Throws InvalidOperationException if condition is false. +
    Public methodStatic memberCheckState(Boolean, String)
    + Throws InvalidOperationException with given message if condition is false. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_RequestStream.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_RequestStream.htm new file mode 100644 index 00000000000..de95638d566 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_RequestStream.htm @@ -0,0 +1,8 @@ +AsyncClientStreamingCall(TRequest, TResponse).RequestStream Property
    AsyncClientStreamingCallTRequest, TResponseRequestStream Property
    + Async stream to send streaming requests. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IClientStreamWriter<TRequest> RequestStream { get; }

    Property Value

    Type: IClientStreamWriterTRequest
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseAsync.htm new file mode 100644 index 00000000000..35acc657aaf --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseAsync.htm @@ -0,0 +1,8 @@ +AsyncClientStreamingCall(TRequest, TResponse).ResponseAsync Property
    AsyncClientStreamingCallTRequest, TResponseResponseAsync Property
    + Asynchronous call result. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<TResponse> ResponseAsync { get; }

    Property Value

    Type: TaskTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseHeadersAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseHeadersAsync.htm new file mode 100644 index 00000000000..78a07362f36 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncClientStreamingCall_2_ResponseHeadersAsync.htm @@ -0,0 +1,8 @@ +AsyncClientStreamingCall(TRequest, TResponse).ResponseHeadersAsync Property
    AsyncClientStreamingCallTRequest, TResponseResponseHeadersAsync Property
    + Asynchronous access to response headers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<Metadata> ResponseHeadersAsync { get; }

    Property Value

    Type: TaskMetadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_RequestStream.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_RequestStream.htm new file mode 100644 index 00000000000..7a79a06a9db --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_RequestStream.htm @@ -0,0 +1,8 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).RequestStream Property
    AsyncDuplexStreamingCallTRequest, TResponseRequestStream Property
    + Async stream to send streaming requests. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IClientStreamWriter<TRequest> RequestStream { get; }

    Property Value

    Type: IClientStreamWriterTRequest
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseHeadersAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseHeadersAsync.htm new file mode 100644 index 00000000000..7c331475f06 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseHeadersAsync.htm @@ -0,0 +1,8 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).ResponseHeadersAsync Property
    AsyncDuplexStreamingCallTRequest, TResponseResponseHeadersAsync Property
    + Asynchronous access to response headers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<Metadata> ResponseHeadersAsync { get; }

    Property Value

    Type: TaskMetadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseStream.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseStream.htm new file mode 100644 index 00000000000..c5b298e025e --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncDuplexStreamingCall_2_ResponseStream.htm @@ -0,0 +1,8 @@ +AsyncDuplexStreamingCall(TRequest, TResponse).ResponseStream Property
    AsyncDuplexStreamingCallTRequest, TResponseResponseStream Property
    + Async stream to read streaming responses. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IAsyncStreamReader<TResponse> ResponseStream { get; }

    Property Value

    Type: IAsyncStreamReaderTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseHeadersAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseHeadersAsync.htm new file mode 100644 index 00000000000..5b1ab81753b --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseHeadersAsync.htm @@ -0,0 +1,8 @@ +AsyncServerStreamingCall(TResponse).ResponseHeadersAsync Property
    AsyncServerStreamingCallTResponseResponseHeadersAsync Property
    + Asynchronous access to response headers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<Metadata> ResponseHeadersAsync { get; }

    Property Value

    Type: TaskMetadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseStream.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseStream.htm new file mode 100644 index 00000000000..d6124eff064 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncServerStreamingCall_1_ResponseStream.htm @@ -0,0 +1,8 @@ +AsyncServerStreamingCall(TResponse).ResponseStream Property
    AsyncServerStreamingCallTResponseResponseStream Property
    + Async stream to read streaming responses. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IAsyncStreamReader<TResponse> ResponseStream { get; }

    Property Value

    Type: IAsyncStreamReaderTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseAsync.htm new file mode 100644 index 00000000000..cefbf51be27 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseAsync.htm @@ -0,0 +1,8 @@ +AsyncUnaryCall(TResponse).ResponseAsync Property
    AsyncUnaryCallTResponseResponseAsync Property
    + Asynchronous call result. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<TResponse> ResponseAsync { get; }

    Property Value

    Type: TaskTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseHeadersAsync.htm b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseHeadersAsync.htm new file mode 100644 index 00000000000..9e40fbf3283 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_AsyncUnaryCall_1_ResponseHeadersAsync.htm @@ -0,0 +1,8 @@ +AsyncUnaryCall(TResponse).ResponseHeadersAsync Property
    AsyncUnaryCallTResponseResponseHeadersAsync Property
    + Asynchronous access to response headers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task<Metadata> ResponseHeadersAsync { get; }

    Property Value

    Type: TaskMetadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Channel.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Channel.htm new file mode 100644 index 00000000000..ada168e5694 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Channel.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).Channel Property
    CallInvocationDetailsTRequest, TResponseChannel Property
    + Get channel associated with this call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Channel Channel { get; }

    Property Value

    Type: Channel
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Host.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Host.htm new file mode 100644 index 00000000000..2482b0c997d --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Host.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).Host Property
    CallInvocationDetailsTRequest, TResponseHost Property
    + Get name of host. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Host { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Method.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Method.htm new file mode 100644 index 00000000000..26913ed3738 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Method.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).Method Property
    CallInvocationDetailsTRequest, TResponseMethod Property
    + Gets name of method to be called. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Method { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Options.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Options.htm new file mode 100644 index 00000000000..ddcf02baa4a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_Options.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).Options Property
    CallInvocationDetailsTRequest, TResponseOptions Property
    + Gets the call options. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CallOptions Options { get; }

    Property Value

    Type: CallOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_RequestMarshaller.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_RequestMarshaller.htm new file mode 100644 index 00000000000..ecd55008218 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_RequestMarshaller.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).RequestMarshaller Property
    CallInvocationDetailsTRequest, TResponseRequestMarshaller Property
    + Gets marshaller used to serialize requests. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Marshaller<TRequest> RequestMarshaller { get; }

    Property Value

    Type: MarshallerTRequest
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_ResponseMarshaller.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_ResponseMarshaller.htm new file mode 100644 index 00000000000..6b74eb825d3 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallInvocationDetails_2_ResponseMarshaller.htm @@ -0,0 +1,8 @@ +CallInvocationDetails(TRequest, TResponse).ResponseMarshaller Property
    CallInvocationDetailsTRequest, TResponseResponseMarshaller Property
    + Gets marshaller used to deserialized responses. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Marshaller<TResponse> ResponseMarshaller { get; }

    Property Value

    Type: MarshallerTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_CancellationToken.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_CancellationToken.htm new file mode 100644 index 00000000000..6aa8d3d3f6a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_CancellationToken.htm @@ -0,0 +1,8 @@ +CallOptions.CancellationToken Property
    CallOptionsCancellationToken Property
    + Token that can be used for cancelling the call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CancellationToken CancellationToken { get; }

    Property Value

    Type: CancellationToken
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Deadline.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Deadline.htm new file mode 100644 index 00000000000..55813372130 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Deadline.htm @@ -0,0 +1,8 @@ +CallOptions.Deadline Property
    CallOptionsDeadline Property
    + Call deadline. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Nullable<DateTime> Deadline { get; }

    Property Value

    Type: NullableDateTime
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Headers.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Headers.htm new file mode 100644 index 00000000000..3637bd445fa --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_Headers.htm @@ -0,0 +1,8 @@ +CallOptions.Headers Property
    CallOptionsHeaders Property
    + Headers to send at the beginning of the call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata Headers { get; }

    Property Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_PropagationToken.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_PropagationToken.htm new file mode 100644 index 00000000000..6f3c6ab081a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_PropagationToken.htm @@ -0,0 +1,8 @@ +CallOptions.PropagationToken Property
    CallOptionsPropagationToken Property
    + Token for propagating parent call context. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ContextPropagationToken PropagationToken { get; }

    Property Value

    Type: ContextPropagationToken
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_WriteOptions.htm b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_WriteOptions.htm new file mode 100644 index 00000000000..c95e3f6835d --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_CallOptions_WriteOptions.htm @@ -0,0 +1,8 @@ +CallOptions.WriteOptions Property
    CallOptionsWriteOptions Property
    + Write options that will be used for this call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public WriteOptions WriteOptions { get; }

    Property Value

    Type: WriteOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_IntValue.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_IntValue.htm new file mode 100644 index 00000000000..dc638c48ee8 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_IntValue.htm @@ -0,0 +1,8 @@ +ChannelOption.IntValue Property
    ChannelOptionIntValue Property
    + Gets the integer value the ChannelOption. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int IntValue { get; }

    Property Value

    Type: Int32
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Name.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Name.htm new file mode 100644 index 00000000000..2115bbc7c43 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Name.htm @@ -0,0 +1,8 @@ +ChannelOption.Name Property
    ChannelOptionName Property
    + Gets the name of the ChannelOption. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Name { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_StringValue.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_StringValue.htm new file mode 100644 index 00000000000..35f2567c0be --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_StringValue.htm @@ -0,0 +1,8 @@ +ChannelOption.StringValue Property
    ChannelOptionStringValue Property
    + Gets the string value the ChannelOption. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string StringValue { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Type.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Type.htm new file mode 100644 index 00000000000..150b85c8178 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ChannelOption_Type.htm @@ -0,0 +1,8 @@ +ChannelOption.Type Property
    ChannelOptionType Property
    + Gets the type of the ChannelOption. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ChannelOptionOptionType Type { get; }

    Property Value

    Type: ChannelOptionOptionType
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Channel_ResolvedTarget.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_ResolvedTarget.htm new file mode 100644 index 00000000000..daaf5c99f41 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_ResolvedTarget.htm @@ -0,0 +1,6 @@ +Channel.ResolvedTarget Property
    ChannelResolvedTarget Property
    Resolved address of the remote endpoint in URI format.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string ResolvedTarget { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Channel_State.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_State.htm new file mode 100644 index 00000000000..d4c9af655a2 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_State.htm @@ -0,0 +1,8 @@ +Channel.State Property
    ChannelState Property
    + Gets current connectivity state of this channel. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ChannelState State { get; }

    Property Value

    Type: ChannelState
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Channel_Target.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_Target.htm new file mode 100644 index 00000000000..70d27d840f3 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Channel_Target.htm @@ -0,0 +1,6 @@ +Channel.Target Property
    ChannelTarget Property
    The original target used to create the channel.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Target { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Channel.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Channel.htm new file mode 100644 index 00000000000..ed648e8dd3f --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Channel.htm @@ -0,0 +1,8 @@ +ClientBase.Channel Property
    ClientBaseChannel Property
    + Channel associated with this client. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Channel Channel { get; }

    Property Value

    Type: Channel
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_HeaderInterceptor.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_HeaderInterceptor.htm new file mode 100644 index 00000000000..3187fe47248 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_HeaderInterceptor.htm @@ -0,0 +1,11 @@ +ClientBase.HeaderInterceptor Property
    ClientBaseHeaderInterceptor Property
    + Can be used to register a custom header (request metadata) interceptor. + The interceptor is invoked each time a new call on this client is started. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public HeaderInterceptor HeaderInterceptor { get; set; }

    Property Value

    Type: HeaderInterceptor
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Host.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Host.htm new file mode 100644 index 00000000000..f25e313c962 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ClientBase_Host.htm @@ -0,0 +1,13 @@ +ClientBase.Host Property
    ClientBaseHost Property
    + gRPC supports multiple "hosts" being served by a single server. + This property can be used to set the target host explicitly. + By default, this will be set to null with the meaning + "use default host". +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Host { get; set; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateCancellation.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateCancellation.htm new file mode 100644 index 00000000000..f6e87d64bec --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateCancellation.htm @@ -0,0 +1,6 @@ +ContextPropagationOptions.IsPropagateCancellation Property
    ContextPropagationOptionsIsPropagateCancellation Property
    true if parent call's cancellation token should be propagated to the child call.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool IsPropagateCancellation { get; }

    Property Value

    Type: Boolean
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateDeadline.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateDeadline.htm new file mode 100644 index 00000000000..f5c43152c63 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ContextPropagationOptions_IsPropagateDeadline.htm @@ -0,0 +1,6 @@ +ContextPropagationOptions.IsPropagateDeadline Property
    ContextPropagationOptionsIsPropagateDeadline Property
    true if parent call's deadline should be propagated to the child call.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool IsPropagateDeadline { get; }

    Property Value

    Type: Boolean
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Credentials_Insecure.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Credentials_Insecure.htm new file mode 100644 index 00000000000..bab175df216 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Credentials_Insecure.htm @@ -0,0 +1,9 @@ +Credentials.Insecure Property
    CredentialsInsecure Property
    + Returns instance of credential that provides no security and + will result in creating an unsecure channel with no encryption whatsoever. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Credentials Insecure { get; }

    Property Value

    Type: Credentials
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_GrpcEnvironment_Logger.htm b/doc/ref/csharp/html/html/P_Grpc_Core_GrpcEnvironment_Logger.htm new file mode 100644 index 00000000000..3e552479501 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_GrpcEnvironment_Logger.htm @@ -0,0 +1,8 @@ +GrpcEnvironment.Logger Property
    GrpcEnvironmentLogger Property
    + Gets application-wide logger used by gRPC. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static ILogger Logger { get; }

    Property Value

    Type: ILogger
    The logger.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IAsyncStreamWriter_1_WriteOptions.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IAsyncStreamWriter_1_WriteOptions.htm new file mode 100644 index 00000000000..c6b3ebad549 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IAsyncStreamWriter_1_WriteOptions.htm @@ -0,0 +1,12 @@ +IAsyncStreamWriter(T).WriteOptions Property
    IAsyncStreamWriterTWriteOptions Property
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    WriteOptions WriteOptions { get; set; }

    Property Value

    Type: WriteOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IHasWriteOptions_WriteOptions.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IHasWriteOptions_WriteOptions.htm new file mode 100644 index 00000000000..6c0d622527f --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IHasWriteOptions_WriteOptions.htm @@ -0,0 +1,9 @@ +IHasWriteOptions.WriteOptions Property
    IHasWriteOptionsWriteOptions Property
    + Gets or sets the write options. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    WriteOptions WriteOptions { get; set; }

    Property Value

    Type: WriteOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_FullName.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_FullName.htm new file mode 100644 index 00000000000..5c898296212 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_FullName.htm @@ -0,0 +1,8 @@ +IMethod.FullName Property
    IMethodFullName Property
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    string FullName { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Name.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Name.htm new file mode 100644 index 00000000000..01fd7db14f7 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Name.htm @@ -0,0 +1,7 @@ +IMethod.Name Property
    IMethodName Property
    + Gets the unqualified name of the method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    string Name { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_ServiceName.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_ServiceName.htm new file mode 100644 index 00000000000..e94184fcc04 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_ServiceName.htm @@ -0,0 +1,7 @@ +IMethod.ServiceName Property
    IMethodServiceName Property
    + Gets the name of the service to which this method belongs. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    string ServiceName { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Type.htm b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Type.htm new file mode 100644 index 00000000000..54613fc5e61 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_IMethod_Type.htm @@ -0,0 +1,7 @@ +IMethod.Type Property
    IMethodType Property
    + Gets the type of the method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    MethodType Type { get; }

    Property Value

    Type: MethodType
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_CertificateChain.htm b/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_CertificateChain.htm new file mode 100644 index 00000000000..3eae8efe9a9 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_CertificateChain.htm @@ -0,0 +1,8 @@ +KeyCertificatePair.CertificateChain Property
    KeyCertificatePairCertificateChain Property
    + PEM encoded certificate chain. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string CertificateChain { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_PrivateKey.htm b/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_PrivateKey.htm new file mode 100644 index 00000000000..70ccc67e8e1 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_KeyCertificatePair_PrivateKey.htm @@ -0,0 +1,8 @@ +KeyCertificatePair.PrivateKey Property
    KeyCertificatePairPrivateKey Property
    + PEM encoded private key. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string PrivateKey { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Deserializer.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Deserializer.htm new file mode 100644 index 00000000000..281cddc77a4 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Deserializer.htm @@ -0,0 +1,8 @@ +Marshaller(T).Deserializer Property
    MarshallerTDeserializer Property
    + Gets the deserializer function. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Func<byte[], T> Deserializer { get; }

    Property Value

    Type: FuncByte, T
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Serializer.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Serializer.htm new file mode 100644 index 00000000000..d288c6329c8 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Marshaller_1_Serializer.htm @@ -0,0 +1,8 @@ +Marshaller(T).Serializer Property
    MarshallerTSerializer Property
    + Gets the serializer function. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Func<T, byte[]> Serializer { get; }

    Property Value

    Type: FuncT, Byte
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Marshallers_StringMarshaller.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Marshallers_StringMarshaller.htm new file mode 100644 index 00000000000..0db6f764c00 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Marshallers_StringMarshaller.htm @@ -0,0 +1,8 @@ +Marshallers.StringMarshaller Property
    MarshallersStringMarshaller Property
    + Returns a marshaller for string type. This is useful for testing. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static Marshaller<string> StringMarshaller { get; }

    Property Value

    Type: MarshallerString
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Count.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Count.htm new file mode 100644 index 00000000000..348175b9399 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Count.htm @@ -0,0 +1,6 @@ +Metadata.Count Property
    MetadataCount Property

    [Missing <summary> documentation for "P:Grpc.Core.Metadata.Count"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int Count { get; }

    Property Value

    Type: Int32

    Implements

    ICollectionTCount
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_IsBinary.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_IsBinary.htm new file mode 100644 index 00000000000..efa7628e436 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_IsBinary.htm @@ -0,0 +1,8 @@ +Metadata.Entry.IsBinary Property
    MetadataEntryIsBinary Property
    + Returns true if this entry is a binary-value entry. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool IsBinary { get; }

    Property Value

    Type: Boolean
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Key.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Key.htm new file mode 100644 index 00000000000..f72d768eb54 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Key.htm @@ -0,0 +1,8 @@ +Metadata.Entry.Key Property
    MetadataEntryKey Property
    + Gets the metadata entry key. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Key { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Value.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Value.htm new file mode 100644 index 00000000000..53fc9515031 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_Value.htm @@ -0,0 +1,8 @@ +Metadata.Entry.Value Property
    MetadataEntryValue Property
    + Gets the string value of this metadata entry. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Value { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_ValueBytes.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_ValueBytes.htm new file mode 100644 index 00000000000..00b325c1c11 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Entry_ValueBytes.htm @@ -0,0 +1,8 @@ +Metadata.Entry.ValueBytes Property
    MetadataEntryValueBytes Property
    + Gets the binary value of this metadata entry. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public byte[] ValueBytes { get; }

    Property Value

    Type: Byte
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_IsReadOnly.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_IsReadOnly.htm new file mode 100644 index 00000000000..da27809a7e0 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_IsReadOnly.htm @@ -0,0 +1,6 @@ +Metadata.IsReadOnly Property
    MetadataIsReadOnly Property

    [Missing <summary> documentation for "P:Grpc.Core.Metadata.IsReadOnly"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool IsReadOnly { get; }

    Property Value

    Type: Boolean

    Implements

    ICollectionTIsReadOnly
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Item.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Item.htm new file mode 100644 index 00000000000..4147b734514 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Metadata_Item.htm @@ -0,0 +1,12 @@ +Metadata.Item Property
    MetadataItem Property

    [Missing <summary> documentation for "P:Grpc.Core.Metadata.Item(System.Int32)"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public MetadataEntry this[
    +	int index
    +] { get; set; }

    Parameters

    index
    Type: SystemInt32

    Property Value

    Type: MetadataEntry

    Implements

    IListTItemInt32
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_FullName.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_FullName.htm new file mode 100644 index 00000000000..d3940aeb126 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_FullName.htm @@ -0,0 +1,9 @@ +Method(TRequest, TResponse).FullName Property
    MethodTRequest, TResponseFullName Property
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string FullName { get; }

    Property Value

    Type: String

    Implements

    IMethodFullName
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Name.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Name.htm new file mode 100644 index 00000000000..832b9683192 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Name.htm @@ -0,0 +1,8 @@ +Method(TRequest, TResponse).Name Property
    MethodTRequest, TResponseName Property
    + Gets the unqualified name of the method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Name { get; }

    Property Value

    Type: String

    Implements

    IMethodName
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_RequestMarshaller.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_RequestMarshaller.htm new file mode 100644 index 00000000000..8a4c5b3da0e --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_RequestMarshaller.htm @@ -0,0 +1,8 @@ +Method(TRequest, TResponse).RequestMarshaller Property
    MethodTRequest, TResponseRequestMarshaller Property
    + Gets the marshaller used for request messages. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Marshaller<TRequest> RequestMarshaller { get; }

    Property Value

    Type: MarshallerTRequest
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ResponseMarshaller.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ResponseMarshaller.htm new file mode 100644 index 00000000000..dbe51e6d4d1 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ResponseMarshaller.htm @@ -0,0 +1,8 @@ +Method(TRequest, TResponse).ResponseMarshaller Property
    MethodTRequest, TResponseResponseMarshaller Property
    + Gets the marshaller used for response messages. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Marshaller<TResponse> ResponseMarshaller { get; }

    Property Value

    Type: MarshallerTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ServiceName.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ServiceName.htm new file mode 100644 index 00000000000..00816a5b623 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_ServiceName.htm @@ -0,0 +1,8 @@ +Method(TRequest, TResponse).ServiceName Property
    MethodTRequest, TResponseServiceName Property
    + Gets the name of the service to which this method belongs. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string ServiceName { get; }

    Property Value

    Type: String

    Implements

    IMethodServiceName
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Type.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Type.htm new file mode 100644 index 00000000000..76c2f26b0d8 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Method_2_Type.htm @@ -0,0 +1,8 @@ +Method(TRequest, TResponse).Type Property
    MethodTRequest, TResponseType Property
    + Gets the type of the method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public MethodType Type { get; }

    Property Value

    Type: MethodType

    Implements

    IMethodType
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_RpcException_Status.htm b/doc/ref/csharp/html/html/P_Grpc_Core_RpcException_Status.htm new file mode 100644 index 00000000000..679d1a940e4 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_RpcException_Status.htm @@ -0,0 +1,8 @@ +RpcException.Status Property
    RpcExceptionStatus Property
    + Resulting status of the call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status Status { get; }

    Property Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_CancellationToken.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_CancellationToken.htm new file mode 100644 index 00000000000..15cfa92efb9 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_CancellationToken.htm @@ -0,0 +1,6 @@ +ServerCallContext.CancellationToken Property
    ServerCallContextCancellationToken Property
    Cancellation token signals when call is cancelled.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public CancellationToken CancellationToken { get; }

    Property Value

    Type: CancellationToken
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Deadline.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Deadline.htm new file mode 100644 index 00000000000..1c8c57decd5 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Deadline.htm @@ -0,0 +1,6 @@ +ServerCallContext.Deadline Property
    ServerCallContextDeadline Property
    Deadline for this RPC.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public DateTime Deadline { get; }

    Property Value

    Type: DateTime
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Host.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Host.htm new file mode 100644 index 00000000000..88cf207e616 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Host.htm @@ -0,0 +1,6 @@ +ServerCallContext.Host Property
    ServerCallContextHost Property
    Name of host called in this RPC.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Host { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Method.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Method.htm new file mode 100644 index 00000000000..5c8e643be31 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Method.htm @@ -0,0 +1,6 @@ +ServerCallContext.Method Property
    ServerCallContextMethod Property
    Name of method called in this RPC.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Method { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Peer.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Peer.htm new file mode 100644 index 00000000000..0222fd07f17 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Peer.htm @@ -0,0 +1,6 @@ +ServerCallContext.Peer Property
    ServerCallContextPeer Property
    Address of the remote endpoint in URI format.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Peer { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_RequestHeaders.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_RequestHeaders.htm new file mode 100644 index 00000000000..e81a00be350 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_RequestHeaders.htm @@ -0,0 +1,6 @@ +ServerCallContext.RequestHeaders Property
    ServerCallContextRequestHeaders Property
    Initial metadata sent by client.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata RequestHeaders { get; }

    Property Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_ResponseTrailers.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_ResponseTrailers.htm new file mode 100644 index 00000000000..e80e6395293 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_ResponseTrailers.htm @@ -0,0 +1,6 @@ +ServerCallContext.ResponseTrailers Property
    ServerCallContextResponseTrailers Property
    Trailers to send back to client after RPC finishes.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Metadata ResponseTrailers { get; }

    Property Value

    Type: Metadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Status.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Status.htm new file mode 100644 index 00000000000..fc2ff6fce22 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_Status.htm @@ -0,0 +1,8 @@ +ServerCallContext.Status Property
    ServerCallContextStatus Property
    Status to send back to client after RPC finishes.

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Status Status { get; set; }

    Property Value

    Type: Status
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_WriteOptions.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_WriteOptions.htm new file mode 100644 index 00000000000..46365ef1b9a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCallContext_WriteOptions.htm @@ -0,0 +1,12 @@ +ServerCallContext.WriteOptions Property
    ServerCallContextWriteOptions Property
    + Allows setting write options for the following write. + For streaming response calls, this property is also exposed as on IServerStreamWriter for convenience. + Both properties are backed by the same underlying value. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public WriteOptions WriteOptions { get; set; }

    Property Value

    Type: WriteOptions
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerCredentials_Insecure.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCredentials_Insecure.htm new file mode 100644 index 00000000000..df7c2a2809a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerCredentials_Insecure.htm @@ -0,0 +1,9 @@ +ServerCredentials.Insecure Property
    ServerCredentialsInsecure Property
    + Returns instance of credential that provides no security and + will result in creating an unsecure server port with no encryption whatsoever. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static ServerCredentials Insecure { get; }

    Property Value

    Type: ServerCredentials
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_BoundPort.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_BoundPort.htm new file mode 100644 index 00000000000..93075277bf6 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_BoundPort.htm @@ -0,0 +1,8 @@ +ServerPort.BoundPort Property
    ServerPortBoundPort Property

    [Missing <summary> documentation for "P:Grpc.Core.ServerPort.BoundPort"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int BoundPort { get; }

    Property Value

    Type: Int32
    + The port actually bound by the server. This is useful if you let server + pick port automatically. PickUnused
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Credentials.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Credentials.htm new file mode 100644 index 00000000000..cb062ea8669 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Credentials.htm @@ -0,0 +1,6 @@ +ServerPort.Credentials Property
    ServerPortCredentials Property

    [Missing <summary> documentation for "P:Grpc.Core.ServerPort.Credentials"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerCredentials Credentials { get; }

    Property Value

    Type: ServerCredentials
    The server credentials.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Host.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Host.htm new file mode 100644 index 00000000000..5788f1ecdaa --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Host.htm @@ -0,0 +1,6 @@ +ServerPort.Host Property
    ServerPortHost Property

    [Missing <summary> documentation for "P:Grpc.Core.ServerPort.Host"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Host { get; }

    Property Value

    Type: String
    The host.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Port.htm b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Port.htm new file mode 100644 index 00000000000..5db0562f51a --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_ServerPort_Port.htm @@ -0,0 +1,6 @@ +ServerPort.Port Property
    ServerPortPort Property

    [Missing <summary> documentation for "P:Grpc.Core.ServerPort.Port"]

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public int Port { get; }

    Property Value

    Type: Int32
    The port.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Server_Ports.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Server_Ports.htm new file mode 100644 index 00000000000..943d8173ea3 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Server_Ports.htm @@ -0,0 +1,9 @@ +Server.Ports Property
    ServerPorts Property
    + Ports on which the server will listen once started. Register a port with this + server by adding its definition to this collection. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServerPortCollection Ports { get; }

    Property Value

    Type: ServerServerPortCollection
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Server_Services.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Server_Services.htm new file mode 100644 index 00000000000..ae85da5838e --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Server_Services.htm @@ -0,0 +1,9 @@ +Server.Services Property
    ServerServices Property
    + Services that will be exported by the server once started. Register a service with this + server by adding its definition to this collection. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public ServerServiceDefinitionCollection Services { get; }

    Property Value

    Type: ServerServiceDefinitionCollection
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Server_ShutdownTask.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Server_ShutdownTask.htm new file mode 100644 index 00000000000..f9b26163d8c --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Server_ShutdownTask.htm @@ -0,0 +1,8 @@ +Server.ShutdownTask Property
    ServerShutdownTask Property
    + To allow awaiting termination of the server. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public Task ShutdownTask { get; }

    Property Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_KeyCertificatePair.htm b/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_KeyCertificatePair.htm new file mode 100644 index 00000000000..459a8c7a4a3 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_KeyCertificatePair.htm @@ -0,0 +1,9 @@ +SslCredentials.KeyCertificatePair Property
    SslCredentialsKeyCertificatePair Property
    + Client side key and certificate pair. + If null, client will not use key and certificate pair. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public KeyCertificatePair KeyCertificatePair { get; }

    Property Value

    Type: KeyCertificatePair
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_RootCertificates.htm b/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_RootCertificates.htm new file mode 100644 index 00000000000..730008cad71 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_SslCredentials_RootCertificates.htm @@ -0,0 +1,8 @@ +SslCredentials.RootCertificates Property
    SslCredentialsRootCertificates Property
    + PEM encoding of the server root certificates. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string RootCertificates { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_ForceClientAuthentication.htm b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_ForceClientAuthentication.htm new file mode 100644 index 00000000000..0eb8dea6ff9 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_ForceClientAuthentication.htm @@ -0,0 +1,8 @@ +SslServerCredentials.ForceClientAuthentication Property
    SslServerCredentialsForceClientAuthentication Property
    + If true, the authenticity of client check will be enforced. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public bool ForceClientAuthentication { get; }

    Property Value

    Type: Boolean
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_KeyCertificatePairs.htm b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_KeyCertificatePairs.htm new file mode 100644 index 00000000000..530f0677db1 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_KeyCertificatePairs.htm @@ -0,0 +1,8 @@ +SslServerCredentials.KeyCertificatePairs Property
    SslServerCredentialsKeyCertificatePairs Property
    + Key-certificate pairs. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public IList<KeyCertificatePair> KeyCertificatePairs { get; }

    Property Value

    Type: IListKeyCertificatePair
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_RootCertificates.htm b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_RootCertificates.htm new file mode 100644 index 00000000000..44fb25a5570 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_SslServerCredentials_RootCertificates.htm @@ -0,0 +1,8 @@ +SslServerCredentials.RootCertificates Property
    SslServerCredentialsRootCertificates Property
    + PEM encoded client root certificates. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string RootCertificates { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Status_Detail.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Status_Detail.htm new file mode 100644 index 00000000000..7510c98b0a5 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Status_Detail.htm @@ -0,0 +1,8 @@ +Status.Detail Property
    StatusDetail Property
    + Gets the detail. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public string Detail { get; }

    Property Value

    Type: String
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_Status_StatusCode.htm b/doc/ref/csharp/html/html/P_Grpc_Core_Status_StatusCode.htm new file mode 100644 index 00000000000..accc218630c --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_Status_StatusCode.htm @@ -0,0 +1,8 @@ +Status.StatusCode Property
    StatusStatusCode Property
    + Gets the gRPC status code. OK indicates success, all other values indicate an error. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public StatusCode StatusCode { get; }

    Property Value

    Type: StatusCode
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/P_Grpc_Core_WriteOptions_Flags.htm b/doc/ref/csharp/html/html/P_Grpc_Core_WriteOptions_Flags.htm new file mode 100644 index 00000000000..5ef39577b85 --- /dev/null +++ b/doc/ref/csharp/html/html/P_Grpc_Core_WriteOptions_Flags.htm @@ -0,0 +1,8 @@ +WriteOptions.Flags Property
    WriteOptionsFlags Property
    + Gets the write flags. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public WriteFlags Flags { get; }

    Property Value

    Type: WriteFlags
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.htm new file mode 100644 index 00000000000..86ce8b14978 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncClientStreamingCall_2.htm @@ -0,0 +1,9 @@ +AsyncClientStreamingCall(TRequest, TResponse) Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm new file mode 100644 index 00000000000..40c4705d232 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncDuplexStreamingCall_2.htm @@ -0,0 +1,9 @@ +AsyncDuplexStreamingCall(TRequest, TResponse) Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.htm new file mode 100644 index 00000000000..7d3a77b2cbd --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncServerStreamingCall_1.htm @@ -0,0 +1,7 @@ +AsyncServerStreamingCall(TResponse) Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncUnaryCall_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncUnaryCall_1.htm new file mode 100644 index 00000000000..d9e266b4371 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_AsyncUnaryCall_1.htm @@ -0,0 +1,7 @@ +AsyncUnaryCall(TResponse) Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallInvocationDetails_2.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallInvocationDetails_2.htm new file mode 100644 index 00000000000..258b83626a1 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallInvocationDetails_2.htm @@ -0,0 +1,15 @@ +CallInvocationDetails(TRequest, TResponse) Properties
    CallInvocationDetailsTRequest, TResponse Properties

    The CallInvocationDetailsTRequest, TResponse generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyChannel
    + Get channel associated with this call. +
    Public propertyHost
    + Get name of host. +
    Public propertyMethod
    + Gets name of method to be called. +
    Public propertyOptions
    + Gets the call options. +
    Public propertyRequestMarshaller
    + Gets marshaller used to serialize requests. +
    Public propertyResponseMarshaller
    + Gets marshaller used to deserialized responses. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallOptions.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallOptions.htm new file mode 100644 index 00000000000..53786c4c482 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_CallOptions.htm @@ -0,0 +1,13 @@ +CallOptions Properties
    CallOptions Properties

    The CallOptions type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCancellationToken
    + Token that can be used for cancelling the call. +
    Public propertyDeadline
    + Call deadline. +
    Public propertyHeaders
    + Headers to send at the beginning of the call. +
    Public propertyPropagationToken
    + Token for propagating parent call context. +
    Public propertyWriteOptions
    + Write options that will be used for this call. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Channel.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Channel.htm new file mode 100644 index 00000000000..d2b2c776ea7 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Channel.htm @@ -0,0 +1,5 @@ +Channel Properties
    Channel Properties

    The Channel type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyResolvedTarget
    Resolved address of the remote endpoint in URI format.
    Public propertyState
    + Gets current connectivity state of this channel. +
    Public propertyTarget
    The original target used to create the channel.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ChannelOption.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ChannelOption.htm new file mode 100644 index 00000000000..a788a1d8093 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ChannelOption.htm @@ -0,0 +1,11 @@ +ChannelOption Properties
    ChannelOption Properties

    The ChannelOption type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyIntValue
    + Gets the integer value the ChannelOption. +
    Public propertyName
    + Gets the name of the ChannelOption. +
    Public propertyStringValue
    + Gets the string value the ChannelOption. +
    Public propertyType
    + Gets the type of the ChannelOption. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ClientBase.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ClientBase.htm new file mode 100644 index 00000000000..eb63eea16b6 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ClientBase.htm @@ -0,0 +1,13 @@ +ClientBase Properties
    ClientBase Properties

    The ClientBase type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyChannel
    + Channel associated with this client. +
    Public propertyHeaderInterceptor
    + Can be used to register a custom header (request metadata) interceptor. + The interceptor is invoked each time a new call on this client is started. +
    Public propertyHost
    + gRPC supports multiple "hosts" being served by a single server. + This property can be used to set the target host explicitly. + By default, this will be set to null with the meaning + "use default host". +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ContextPropagationOptions.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ContextPropagationOptions.htm new file mode 100644 index 00000000000..f32cf204694 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ContextPropagationOptions.htm @@ -0,0 +1,3 @@ +ContextPropagationOptions Properties
    ContextPropagationOptions Properties

    The ContextPropagationOptions type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyIsPropagateCancellation
    true if parent call's cancellation token should be propagated to the child call.
    Public propertyIsPropagateDeadline
    true if parent call's deadline should be propagated to the child call.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Credentials.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Credentials.htm new file mode 100644 index 00000000000..acc2578652e --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Credentials.htm @@ -0,0 +1,6 @@ +Credentials Properties
    Credentials Properties

    The Credentials type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberInsecure
    + Returns instance of credential that provides no security and + will result in creating an unsecure channel with no encryption whatsoever. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_GrpcEnvironment.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_GrpcEnvironment.htm new file mode 100644 index 00000000000..438d48f35a6 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_GrpcEnvironment.htm @@ -0,0 +1,5 @@ +GrpcEnvironment Properties
    GrpcEnvironment Properties

    The GrpcEnvironment type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberLogger
    + Gets application-wide logger used by gRPC. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamReader_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamReader_1.htm new file mode 100644 index 00000000000..53aa3b5f90a --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamReader_1.htm @@ -0,0 +1,3 @@ +IAsyncStreamReader(T) Properties
    IAsyncStreamReaderT Properties

    The IAsyncStreamReaderT generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCurrent (Inherited from IAsyncEnumeratorT.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamWriter_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamWriter_1.htm new file mode 100644 index 00000000000..ad71094d4b9 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IAsyncStreamWriter_1.htm @@ -0,0 +1,8 @@ +IAsyncStreamWriter(T) Properties
    IAsyncStreamWriterT Properties

    The IAsyncStreamWriterT generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IClientStreamWriter_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IClientStreamWriter_1.htm new file mode 100644 index 00000000000..f04ab0d40d9 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IClientStreamWriter_1.htm @@ -0,0 +1,8 @@ +IClientStreamWriter(T) Properties
    IClientStreamWriterT Properties

    The IClientStreamWriterT generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IHasWriteOptions.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IHasWriteOptions.htm new file mode 100644 index 00000000000..fd1f5ca0c20 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IHasWriteOptions.htm @@ -0,0 +1,5 @@ +IHasWriteOptions Properties
    IHasWriteOptions Properties

    The IHasWriteOptions type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Gets or sets the write options. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IMethod.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IMethod.htm new file mode 100644 index 00000000000..efa7de8377e --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IMethod.htm @@ -0,0 +1,12 @@ +IMethod Properties
    IMethod Properties

    The IMethod type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyFullName
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +
    Public propertyName
    + Gets the unqualified name of the method. +
    Public propertyServiceName
    + Gets the name of the service to which this method belongs. +
    Public propertyType
    + Gets the type of the method. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IServerStreamWriter_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IServerStreamWriter_1.htm new file mode 100644 index 00000000000..0bebdd57119 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_IServerStreamWriter_1.htm @@ -0,0 +1,8 @@ +IServerStreamWriter(T) Properties
    IServerStreamWriterT Properties

    The IServerStreamWriterT generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_KeyCertificatePair.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_KeyCertificatePair.htm new file mode 100644 index 00000000000..286a0cec9e5 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_KeyCertificatePair.htm @@ -0,0 +1,7 @@ +KeyCertificatePair Properties
    KeyCertificatePair Properties

    The KeyCertificatePair type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCertificateChain
    + PEM encoded certificate chain. +
    Public propertyPrivateKey
    + PEM encoded private key. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshaller_1.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshaller_1.htm new file mode 100644 index 00000000000..2f8b99b98ea --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshaller_1.htm @@ -0,0 +1,7 @@ +Marshaller(T) Properties
    MarshallerT Properties

    The MarshallerT generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyDeserializer
    + Gets the deserializer function. +
    Public propertySerializer
    + Gets the serializer function. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshallers.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshallers.htm new file mode 100644 index 00000000000..c104a3c2db1 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Marshallers.htm @@ -0,0 +1,5 @@ +Marshallers Properties
    Marshallers Properties

    The Marshallers type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberStringMarshaller
    + Returns a marshaller for string type. This is useful for testing. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata.htm new file mode 100644 index 00000000000..48674e9e0f2 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata.htm @@ -0,0 +1,3 @@ +Metadata Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata_Entry.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata_Entry.htm new file mode 100644 index 00000000000..30f20816be5 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Metadata_Entry.htm @@ -0,0 +1,11 @@ +Entry Properties
    Entry Properties

    The MetadataEntry type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyIsBinary
    + Returns true if this entry is a binary-value entry. +
    Public propertyKey
    + Gets the metadata entry key. +
    Public propertyValue
    + Gets the string value of this metadata entry. +
    Public propertyValueBytes
    + Gets the binary value of this metadata entry. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Method_2.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Method_2.htm new file mode 100644 index 00000000000..776f8035982 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Method_2.htm @@ -0,0 +1,16 @@ +Method(TRequest, TResponse) Properties
    MethodTRequest, TResponse Properties

    The MethodTRequest, TResponse generic type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyFullName
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +
    Public propertyName
    + Gets the unqualified name of the method. +
    Public propertyRequestMarshaller
    + Gets the marshaller used for request messages. +
    Public propertyResponseMarshaller
    + Gets the marshaller used for response messages. +
    Public propertyServiceName
    + Gets the name of the service to which this method belongs. +
    Public propertyType
    + Gets the type of the method. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_RpcException.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_RpcException.htm new file mode 100644 index 00000000000..2d40825eef7 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_RpcException.htm @@ -0,0 +1,5 @@ +RpcException Properties
    RpcException Properties

    The RpcException type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyData
    Gets a collection of key/value pairs that provide additional user-defined information about the exception.
    (Inherited from Exception.)
    Public propertyHelpLink
    Gets or sets a link to the help file associated with this exception.
    (Inherited from Exception.)
    Public propertyHResult
    Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.
    (Inherited from Exception.)
    Public propertyInnerException
    Gets the Exception instance that caused the current exception.
    (Inherited from Exception.)
    Public propertyMessage
    Gets a message that describes the current exception.
    (Inherited from Exception.)
    Public propertySource
    Gets or sets the name of the application or the object that causes the error.
    (Inherited from Exception.)
    Public propertyStackTrace
    Gets a string representation of the immediate frames on the call stack.
    (Inherited from Exception.)
    Public propertyStatus
    + Resulting status of the call. +
    Public propertyTargetSite
    Gets the method that throws the current exception.
    (Inherited from Exception.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Server.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Server.htm new file mode 100644 index 00000000000..38762cc5a86 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Server.htm @@ -0,0 +1,11 @@ +Server Properties
    Server Properties

    The Server type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyPorts
    + Ports on which the server will listen once started. Register a port with this + server by adding its definition to this collection. +
    Public propertyServices
    + Services that will be exported by the server once started. Register a service with this + server by adding its definition to this collection. +
    Public propertyShutdownTask
    + To allow awaiting termination of the server. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCallContext.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCallContext.htm new file mode 100644 index 00000000000..4d5d01ccccb --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCallContext.htm @@ -0,0 +1,7 @@ +ServerCallContext Properties
    ServerCallContext Properties

    The ServerCallContext type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCancellationToken
    Cancellation token signals when call is cancelled.
    Public propertyDeadline
    Deadline for this RPC.
    Public propertyHost
    Name of host called in this RPC.
    Public propertyMethod
    Name of method called in this RPC.
    Public propertyPeer
    Address of the remote endpoint in URI format.
    Public propertyRequestHeaders
    Initial metadata sent by client.
    Public propertyResponseTrailers
    Trailers to send back to client after RPC finishes.
    Public propertyStatus
    Status to send back to client after RPC finishes.
    Public propertyWriteOptions
    + Allows setting write options for the following write. + For streaming response calls, this property is also exposed as on IServerStreamWriter for convenience. + Both properties are backed by the same underlying value. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCredentials.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCredentials.htm new file mode 100644 index 00000000000..701aba7ee8a --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerCredentials.htm @@ -0,0 +1,6 @@ +ServerCredentials Properties
    ServerCredentials Properties

    The ServerCredentials type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberInsecure
    + Returns instance of credential that provides no security and + will result in creating an unsecure server port with no encryption whatsoever. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerPort.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerPort.htm new file mode 100644 index 00000000000..454a82575e4 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_ServerPort.htm @@ -0,0 +1,3 @@ +ServerPort Properties \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslCredentials.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslCredentials.htm new file mode 100644 index 00000000000..b808cf05c44 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslCredentials.htm @@ -0,0 +1,8 @@ +SslCredentials Properties
    SslCredentials Properties

    The SslCredentials type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyKeyCertificatePair
    + Client side key and certificate pair. + If null, client will not use key and certificate pair. +
    Public propertyRootCertificates
    + PEM encoding of the server root certificates. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslServerCredentials.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslServerCredentials.htm new file mode 100644 index 00000000000..f879ba0fd44 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_SslServerCredentials.htm @@ -0,0 +1,9 @@ +SslServerCredentials Properties
    SslServerCredentials Properties

    The SslServerCredentials type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyForceClientAuthentication
    + If true, the authenticity of client check will be enforced. +
    Public propertyKeyCertificatePairs
    + Key-certificate pairs. +
    Public propertyRootCertificates
    + PEM encoded client root certificates. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Status.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Status.htm new file mode 100644 index 00000000000..cb8c929e813 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_Status.htm @@ -0,0 +1,7 @@ +Status Properties
    Status Properties

    The Status type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyDetail
    + Gets the detail. +
    Public propertyStatusCode
    + Gets the gRPC status code. OK indicates success, all other values indicate an error. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/Properties_T_Grpc_Core_WriteOptions.htm b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_WriteOptions.htm new file mode 100644 index 00000000000..b6e2b08ab04 --- /dev/null +++ b/doc/ref/csharp/html/html/Properties_T_Grpc_Core_WriteOptions.htm @@ -0,0 +1,5 @@ +WriteOptions Properties
    WriteOptions Properties

    The WriteOptions type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyFlags
    + Gets the write flags. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/R_Project_Documentation.htm b/doc/ref/csharp/html/html/R_Project_Documentation.htm new file mode 100644 index 00000000000..1c2487cd40d --- /dev/null +++ b/doc/ref/csharp/html/html/R_Project_Documentation.htm @@ -0,0 +1,11 @@ +Namespaces
    Namespaces
    Namespaces
    NamespaceDescription
    Grpc.Auth
    Provides OAuth2 based authentication for gRPC. Grpc.Auth currently consists of a set of very lightweight wrappers and uses C# Google.Apis.Auth library.
    Grpc.Core
    Main namespace for gRPC C# functionality. Contains concepts representing both client side and server side gRPC logic. + +
    Grpc.Core.Logging
    Provides functionality to redirect gRPC logs to application-specified destination.
    Grpc.Core.Utils
    Various utilities for gRPC C#.
    + \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Auth_AuthInterceptors.htm b/doc/ref/csharp/html/html/T_Grpc_Auth_AuthInterceptors.htm new file mode 100644 index 00000000000..89a0923148e --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Auth_AuthInterceptors.htm @@ -0,0 +1,13 @@ +AuthInterceptors Class
    AuthInterceptors Class
    + Factory methods to create authorization interceptors. Interceptors created can be registered with gRPC client classes (autogenerated client stubs that + inherit from ClientBase). +
    Inheritance Hierarchy
    SystemObject
      Grpc.AuthAuthInterceptors

    Namespace: Grpc.Auth
    Assembly: Grpc.Auth (in Grpc.Auth.dll) Version: 0.6.1.0
    Syntax
    public static class AuthInterceptors

    The AuthInterceptors type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberFromAccessToken
    + Creates OAuth2 interceptor that will use given access token as authorization. +
    Public methodStatic memberFromCredential
    + Creates interceptor that will obtain access token from any credential type that implements + ITokenAccess. (e.g. GoogleCredential). +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_AsyncClientStreamingCall_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncClientStreamingCall_2.htm new file mode 100644 index 00000000000..ea662d9d73b --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncClientStreamingCall_2.htm @@ -0,0 +1,33 @@ +AsyncClientStreamingCall(TRequest, TResponse) Class
    AsyncClientStreamingCallTRequest, TResponse Class
    + Return type for client streaming calls. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreAsyncClientStreamingCallTRequest, TResponse

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class AsyncClientStreamingCall<TRequest, TResponse> : IDisposable
    +

    Type Parameters

    TRequest
    Request message type for this call.
    TResponse
    Response message type for this call.

    The AsyncClientStreamingCallTRequest, TResponse type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyRequestStream
    + Async stream to send streaming requests. +
    Public propertyResponseAsync
    + Asynchronous call result. +
    Public propertyResponseHeadersAsync
    + Asynchronous access to response headers. +
    Top
    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetAwaiter
    + Allows awaiting this object directly. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_AsyncDuplexStreamingCall_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncDuplexStreamingCall_2.htm new file mode 100644 index 00000000000..f81978d67bf --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncDuplexStreamingCall_2.htm @@ -0,0 +1,31 @@ +AsyncDuplexStreamingCall(TRequest, TResponse) Class
    AsyncDuplexStreamingCallTRequest, TResponse Class
    + Return type for bidirectional streaming calls. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreAsyncDuplexStreamingCallTRequest, TResponse

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class AsyncDuplexStreamingCall<TRequest, TResponse> : IDisposable
    +

    Type Parameters

    TRequest
    Request message type for this call.
    TResponse
    Response message type for this call.

    The AsyncDuplexStreamingCallTRequest, TResponse type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyRequestStream
    + Async stream to send streaming requests. +
    Public propertyResponseHeadersAsync
    + Asynchronous access to response headers. +
    Public propertyResponseStream
    + Async stream to read streaming responses. +
    Top
    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_AsyncServerStreamingCall_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncServerStreamingCall_1.htm new file mode 100644 index 00000000000..4b2407ca18e --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncServerStreamingCall_1.htm @@ -0,0 +1,29 @@ +AsyncServerStreamingCall(TResponse) Class
    AsyncServerStreamingCallTResponse Class
    + Return type for server streaming calls. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreAsyncServerStreamingCallTResponse

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class AsyncServerStreamingCall<TResponse> : IDisposable
    +

    Type Parameters

    TResponse
    Response message type for this call.

    The AsyncServerStreamingCallTResponse type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyResponseHeadersAsync
    + Asynchronous access to response headers. +
    Public propertyResponseStream
    + Async stream to read streaming responses. +
    Top
    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (response stream has been fully read), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_AsyncUnaryCall_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncUnaryCall_1.htm new file mode 100644 index 00000000000..e370a9e0375 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_AsyncUnaryCall_1.htm @@ -0,0 +1,31 @@ +AsyncUnaryCall(TResponse) Class
    AsyncUnaryCallTResponse Class
    + Return type for single request - single response call. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreAsyncUnaryCallTResponse

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class AsyncUnaryCall<TResponse> : IDisposable
    +

    Type Parameters

    TResponse
    Response message type for this call.

    The AsyncUnaryCallTResponse type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyResponseAsync
    + Asynchronous call result. +
    Public propertyResponseHeadersAsync
    + Asynchronous access to response headers. +
    Top
    Methods
    +   + NameDescription
    Public methodDispose
    + Provides means to cleanup after the call. + If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything. + Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call. + As a result, all resources being used by the call should be released eventually. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetAwaiter
    + Allows awaiting this object directly. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetStatus
    + Gets the call status if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetTrailers
    + Gets the call trailing metadata if the call has already finished. + Throws InvalidOperationException otherwise. +
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_CallInvocationDetails_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_CallInvocationDetails_2.htm new file mode 100644 index 00000000000..bc7ecf9ed05 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_CallInvocationDetails_2.htm @@ -0,0 +1,33 @@ +CallInvocationDetails(TRequest, TResponse) Structure
    CallInvocationDetailsTRequest, TResponse Structure
    + Details about a client-side call to be invoked. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public struct CallInvocationDetails<TRequest, TResponse>
    +

    Type Parameters

    TRequest
    Request message type for the call.
    TResponse
    Response message type for the call.

    The CallInvocationDetailsTRequest, TResponse type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, MethodTRequest, TResponse, CallOptions)
    + Initializes a new instance of the CallInvocationDetailsTRequest, TResponse struct. +
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, MethodTRequest, TResponse, String, CallOptions)
    + Initializes a new instance of the CallInvocationDetailsTRequest, TResponse struct. +
    Public methodCallInvocationDetailsTRequest, TResponse(Channel, String, String, MarshallerTRequest, MarshallerTResponse, CallOptions)
    + Initializes a new instance of the CallInvocationDetailsTRequest, TResponse struct. +
    Top
    Properties
    +   + NameDescription
    Public propertyChannel
    + Get channel associated with this call. +
    Public propertyHost
    + Get name of host. +
    Public propertyMethod
    + Gets name of method to be called. +
    Public propertyOptions
    + Gets the call options. +
    Public propertyRequestMarshaller
    + Gets marshaller used to serialize requests. +
    Public propertyResponseMarshaller
    + Gets marshaller used to deserialized responses. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Public methodWithOptions
    + Returns new instance of CallInvocationDetailsTRequest, TResponse with + Options set to the value provided. Values of all other fields are preserved. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_CallOptions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_CallOptions.htm new file mode 100644 index 00000000000..3829d0ddab4 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_CallOptions.htm @@ -0,0 +1,31 @@ +CallOptions Structure
    CallOptions Structure
    + Options for calls made by client. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public struct CallOptions

    The CallOptions type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodCallOptions
    + Creates a new instance of CallOptions struct. +
    Top
    Properties
    +   + NameDescription
    Public propertyCancellationToken
    + Token that can be used for cancelling the call. +
    Public propertyDeadline
    + Call deadline. +
    Public propertyHeaders
    + Headers to send at the beginning of the call. +
    Public propertyPropagationToken
    + Token for propagating parent call context. +
    Public propertyWriteOptions
    + Write options that will be used for this call. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Public methodWithCancellationToken
    + Returns new instance of CallOptions with + CancellationToken set to the value provided. Values of all other fields are preserved. +
    Public methodWithDeadline
    + Returns new instance of CallOptions with + Deadline set to the value provided. Values of all other fields are preserved. +
    Public methodWithHeaders
    + Returns new instance of CallOptions with + Headers set to the value provided. Values of all other fields are preserved. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Calls.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Calls.htm new file mode 100644 index 00000000000..ba5465dbd06 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Calls.htm @@ -0,0 +1,24 @@ +Calls Class
    Calls Class
    + Helper methods for generated clients to make RPC calls. + Most users will use this class only indirectly and will be + making calls using client object generated from protocol + buffer definition files. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreCalls

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class Calls

    The Calls type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberAsyncClientStreamingCallTRequest, TResponse
    + Invokes a client streaming call asynchronously. + In client streaming scenario, client sends a stream of requests and server responds with a single response. +
    Public methodStatic memberAsyncDuplexStreamingCallTRequest, TResponse
    + Invokes a duplex streaming call asynchronously. + In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + The response stream is completely independent and both side can be sending messages at the same time. +
    Public methodStatic memberAsyncServerStreamingCallTRequest, TResponse
    + Invokes a server streaming call asynchronously. + In server streaming scenario, client sends on request and server responds with a stream of responses. +
    Public methodStatic memberAsyncUnaryCallTRequest, TResponse
    + Invokes a simple remote call asynchronously. +
    Public methodStatic memberBlockingUnaryCallTRequest, TResponse
    + Invokes a simple remote call in a blocking fashion. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Channel.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Channel.htm new file mode 100644 index 00000000000..0d4fe96397b --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Channel.htm @@ -0,0 +1,31 @@ +Channel Class
    Channel Class
    + Represents a gRPC channel. Channels are an abstraction of long-lived connections to remote servers. + More client objects can reuse the same channel. Creating a channel is an expensive operation compared to invoking + a remote call so in general you should reuse a single channel for as many calls as possible. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreChannel

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class Channel

    The Channel type exposes the following members.

    Constructors
    Properties
    +   + NameDescription
    Public propertyResolvedTarget
    Resolved address of the remote endpoint in URI format.
    Public propertyState
    + Gets current connectivity state of this channel. +
    Public propertyTarget
    The original target used to create the channel.
    Top
    Methods
    +   + NameDescription
    Public methodConnectAsync
    + Allows explicitly requesting channel to connect without starting an RPC. + Returned task completes once state Ready was seen. If the deadline is reached, + or channel enters the FatalFailure state, the task is cancelled. + There is no need to call this explicitly unless your use case requires that. + Starting an RPC on a new channel will request connection implicitly. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodShutdownAsync
    + Waits until there are no more active calls for this channel and then cleans up + resources used by this channel. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWaitForStateChangedAsync
    + Returned tasks completes once channel state has become different from + given lastObservedState. + If deadline is reached or and error occurs, returned task is cancelled. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption.htm new file mode 100644 index 00000000000..eddd74e9348 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption.htm @@ -0,0 +1,23 @@ +ChannelOption Class
    ChannelOption Class
    + Channel option specified when creating a channel. + Corresponds to grpc_channel_args from grpc/grpc.h. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreChannelOption

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class ChannelOption

    The ChannelOption type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodChannelOption(String, Int32)
    + Creates a channel option with an integer value. +
    Public methodChannelOption(String, String)
    + Creates a channel option with a string value. +
    Top
    Properties
    +   + NameDescription
    Public propertyIntValue
    + Gets the integer value the ChannelOption. +
    Public propertyName
    + Gets the name of the ChannelOption. +
    Public propertyStringValue
    + Gets the string value the ChannelOption. +
    Public propertyType
    + Gets the type of the ChannelOption. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption_OptionType.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption_OptionType.htm new file mode 100644 index 00000000000..0953710b291 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOption_OptionType.htm @@ -0,0 +1,9 @@ +ChannelOption.OptionType Enumeration
    ChannelOptionOptionType Enumeration
    + Type of ChannelOption. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public enum OptionType
    Members
    +   + Member nameValueDescription
    Integer0 + Channel option with integer value. +
    String1 + Channel option with string value. +
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOptions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOptions.htm new file mode 100644 index 00000000000..bd1f0db02c6 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelOptions.htm @@ -0,0 +1,7 @@ +ChannelOptions Class
    ChannelOptions Class
    + Defines names of supported channel options. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreChannelOptions

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class ChannelOptions

    The ChannelOptions type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberCensus
    Enable census for tracing and stats collection
    Public fieldStatic memberDefaultAuthority
    Default authority for calls.
    Public fieldStatic memberHttp2InitialSequenceNumber
    Initial sequence number for http2 transports
    Public fieldStatic memberMaxConcurrentStreams
    Maximum number of concurrent incoming streams to allow on a http2 connection
    Public fieldStatic memberMaxMessageLength
    Maximum message length that the channel can receive
    Public fieldStatic memberPrimaryUserAgentString
    Primary user agent: goes at the start of the user-agent metadata
    Public fieldStatic memberSecondaryUserAgentString
    Secondary user agent: goes at the end of the user-agent metadata
    Public fieldStatic memberSslTargetNameOverride
    Override SSL target check. Only to be used for testing.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ChannelState.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelState.htm new file mode 100644 index 00000000000..da05bfba642 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ChannelState.htm @@ -0,0 +1,16 @@ +ChannelState Enumeration
    ChannelState Enumeration
    + Connectivity state of a channel. + Based on grpc_connectivity_state from grpc/grpc.h +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public enum ChannelState
    Members
    +   + Member nameValueDescription
    Idle0 + Channel is idle +
    Connecting1 + Channel is connecting +
    Ready2 + Channel is ready for work +
    TransientFailure3 + Channel has seen a failure but expects to recover +
    FatalFailure4 + Channel has seen a failure that it cannot recover from +
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ClientBase.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ClientBase.htm new file mode 100644 index 00000000000..98b64764a34 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ClientBase.htm @@ -0,0 +1,24 @@ +ClientBase Class
    ClientBase Class
    + Base class for client-side stubs. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreClientBase

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public abstract class ClientBase

    The ClientBase type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodClientBase
    + Initializes a new instance of ClientBase class. +
    Top
    Properties
    +   + NameDescription
    Public propertyChannel
    + Channel associated with this client. +
    Public propertyHeaderInterceptor
    + Can be used to register a custom header (request metadata) interceptor. + The interceptor is invoked each time a new call on this client is started. +
    Public propertyHost
    + gRPC supports multiple "hosts" being served by a single server. + This property can be used to set the target host explicitly. + By default, this will be set to null with the meaning + "use default host". +
    Top
    Methods
    +   + NameDescription
    Protected methodCreateCallTRequest, TResponse
    + Creates a new call to given method. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ClientStreamingServerMethod_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ClientStreamingServerMethod_2.htm new file mode 100644 index 00000000000..d2073102cfb --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ClientStreamingServerMethod_2.htm @@ -0,0 +1,21 @@ +ClientStreamingServerMethod(TRequest, TResponse) Delegate
    ClientStreamingServerMethodTRequest, TResponse Delegate
    + Server-side handler for client streaming call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public delegate Task<TResponse> ClientStreamingServerMethod<TRequest, TResponse>(
    +	IAsyncStreamReader<TRequest> requestStream,
    +	ServerCallContext context
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    requestStream
    Type: Grpc.CoreIAsyncStreamReaderTRequest
    context
    Type: Grpc.CoreServerCallContext

    Type Parameters

    TRequest
    Request message type for this method.
    TResponse
    Response message type for this method.

    Return Value

    Type: TaskTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_CompressionLevel.htm b/doc/ref/csharp/html/html/T_Grpc_Core_CompressionLevel.htm new file mode 100644 index 00000000000..f70286751c4 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_CompressionLevel.htm @@ -0,0 +1,13 @@ +CompressionLevel Enumeration
    CompressionLevel Enumeration
    + Compression level based on grpc_compression_level from grpc/compression.h +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public enum CompressionLevel
    Members
    +   + Member nameValueDescription
    None0 + No compression. +
    Low1 + Low compression. +
    Medium2 + Medium compression. +
    High3 + High compression. +
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationOptions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationOptions.htm new file mode 100644 index 00000000000..73d262063c6 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationOptions.htm @@ -0,0 +1,15 @@ +ContextPropagationOptions Class
    ContextPropagationOptions Class
    + Options for ContextPropagationToken. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreContextPropagationOptions

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ContextPropagationOptions

    The ContextPropagationOptions type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodContextPropagationOptions
    + Creates new context propagation options. +
    Top
    Properties
    +   + NameDescription
    Public propertyIsPropagateCancellation
    true if parent call's cancellation token should be propagated to the child call.
    Public propertyIsPropagateDeadline
    true if parent call's deadline should be propagated to the child call.
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    Fields
    +   + NameDescription
    Public fieldStatic memberDefault
    + The context propagation options that will be used by default. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationToken.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationToken.htm new file mode 100644 index 00000000000..64ee49df361 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ContextPropagationToken.htm @@ -0,0 +1,10 @@ +ContextPropagationToken Class
    ContextPropagationToken Class
    + Token for propagating context of server side handlers to child calls. + In situations when a backend is making calls to another backend, + it makes sense to propagate properties like deadline and cancellation + token of the server call to the child call. + The gRPC native layer provides some other contexts (like tracing context) that + are not accessible to explicitly C# layer, but this token still allows propagating them. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreContextPropagationToken

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ContextPropagationToken

    The ContextPropagationToken type exposes the following members.

    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Credentials.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Credentials.htm new file mode 100644 index 00000000000..b3da8eea78a --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Credentials.htm @@ -0,0 +1,13 @@ +Credentials Class
    Credentials Class
    + Client-side credentials. Used for creation of a secure channel. +
    Inheritance Hierarchy

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public abstract class Credentials

    The Credentials type exposes the following members.

    Constructors
    +   + NameDescription
    Protected methodCredentials
    Initializes a new instance of the Credentials class
    Top
    Properties
    +   + NameDescription
    Public propertyStatic memberInsecure
    + Returns instance of credential that provides no security and + will result in creating an unsecure channel with no encryption whatsoever. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_DuplexStreamingServerMethod_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_DuplexStreamingServerMethod_2.htm new file mode 100644 index 00000000000..c5783a7416f --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_DuplexStreamingServerMethod_2.htm @@ -0,0 +1,25 @@ +DuplexStreamingServerMethod(TRequest, TResponse) Delegate
    DuplexStreamingServerMethodTRequest, TResponse Delegate
    + Server-side handler for bidi streaming call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public delegate Task DuplexStreamingServerMethod<TRequest, TResponse>(
    +	IAsyncStreamReader<TRequest> requestStream,
    +	IServerStreamWriter<TResponse> responseStream,
    +	ServerCallContext context
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    requestStream
    Type: Grpc.CoreIAsyncStreamReaderTRequest
    responseStream
    Type: Grpc.CoreIServerStreamWriterTResponse
    context
    Type: Grpc.CoreServerCallContext

    Type Parameters

    TRequest
    Request message type for this method.
    TResponse
    Response message type for this method.

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_GrpcEnvironment.htm b/doc/ref/csharp/html/html/T_Grpc_Core_GrpcEnvironment.htm new file mode 100644 index 00000000000..ac67b12fc69 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_GrpcEnvironment.htm @@ -0,0 +1,11 @@ +GrpcEnvironment Class
    GrpcEnvironment Class
    + Encapsulates initialization and shutdown of gRPC library. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreGrpcEnvironment

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class GrpcEnvironment

    The GrpcEnvironment type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberLogger
    + Gets application-wide logger used by gRPC. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodStatic memberSetLogger
    + Sets the application-wide logger that should be used by gRPC. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_HeaderInterceptor.htm b/doc/ref/csharp/html/html/T_Grpc_Core_HeaderInterceptor.htm new file mode 100644 index 00000000000..d2bc5c96002 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_HeaderInterceptor.htm @@ -0,0 +1,19 @@ +HeaderInterceptor Delegate
    HeaderInterceptor Delegate
    + Interceptor for call headers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public delegate void HeaderInterceptor(
    +	IMethod method,
    +	string authUri,
    +	Metadata metadata
    +)

    Parameters

    method
    Type: Grpc.CoreIMethod
    authUri
    Type: SystemString
    metadata
    Type: Grpc.CoreMetadata
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamReader_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamReader_1.htm new file mode 100644 index 00000000000..07ebcd902e4 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamReader_1.htm @@ -0,0 +1,22 @@ +IAsyncStreamReader(T) Interface
    IAsyncStreamReaderT Interface
    + A stream of messages to be read. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IAsyncStreamReader<T> : IAsyncEnumerator<T>, 
    +	IDisposable
    +

    Type Parameters

    T
    The message type.

    The IAsyncStreamReaderT type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCurrent (Inherited from IAsyncEnumeratorT.)
    Top
    Methods
    +   + NameDescription
    Public methodDispose
    Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
    (Inherited from IDisposable.)
    Public methodMoveNext (Inherited from IAsyncEnumeratorT.)
    Top
    Extension Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamWriter_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamWriter_1.htm new file mode 100644 index 00000000000..c60aa5eae45 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IAsyncStreamWriter_1.htm @@ -0,0 +1,16 @@ +IAsyncStreamWriter(T) Interface
    IAsyncStreamWriterT Interface
    + A writable stream of messages. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IAsyncStreamWriter<T>
    +

    Type Parameters

    T
    The message type.

    The IAsyncStreamWriterT type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    Top
    Methods
    +   + NameDescription
    Public methodWriteAsync
    + Writes a single asynchronously. Only one write can be pending at a time. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IClientStreamWriter_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IClientStreamWriter_1.htm new file mode 100644 index 00000000000..a5e3b474833 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IClientStreamWriter_1.htm @@ -0,0 +1,27 @@ +IClientStreamWriter(T) Interface
    IClientStreamWriterT Interface
    + Client-side writable stream of messages with Close capability. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IClientStreamWriter<T> : IAsyncStreamWriter<T>
    +

    Type Parameters

    T
    The message type.

    The IClientStreamWriterT type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    Methods
    +   + NameDescription
    Public methodCompleteAsync
    + Completes/closes the stream. Can only be called once there is no pending write. No writes should follow calling this. +
    Public methodWriteAsync
    + Writes a single asynchronously. Only one write can be pending at a time. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    Extension Methods
    +   + NameDescription
    Public Extension MethodWriteAllAsyncT
    + Writes all elements from given enumerable to the stream. + Completes the stream afterwards unless close = false. +
    (Defined by AsyncStreamExtensions.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IHasWriteOptions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IHasWriteOptions.htm new file mode 100644 index 00000000000..1a6a4f76974 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IHasWriteOptions.htm @@ -0,0 +1,7 @@ +IHasWriteOptions Interface
    IHasWriteOptions Interface
    + Allows sharing write options between ServerCallContext and other objects. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IHasWriteOptions

    The IHasWriteOptions type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Gets or sets the write options. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IMethod.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IMethod.htm new file mode 100644 index 00000000000..c76e049dce7 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IMethod.htm @@ -0,0 +1,14 @@ +IMethod Interface
    IMethod Interface
    + A non-generic representation of a remote method. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IMethod

    The IMethod type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyFullName
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +
    Public propertyName
    + Gets the unqualified name of the method. +
    Public propertyServiceName
    + Gets the name of the service to which this method belongs. +
    Public propertyType
    + Gets the type of the method. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_IServerStreamWriter_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_IServerStreamWriter_1.htm new file mode 100644 index 00000000000..c4a194bcbfc --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_IServerStreamWriter_1.htm @@ -0,0 +1,24 @@ +IServerStreamWriter(T) Interface
    IServerStreamWriterT Interface
    + A writable stream of messages that is used in server-side handlers. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface IServerStreamWriter<T> : IAsyncStreamWriter<T>
    +

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "T:Grpc.Core.IServerStreamWriter`1"]

    The IServerStreamWriterT type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyWriteOptions
    + Write options that will be used for the next write. + If null, default options will be used. + Once set, this property maintains its value across subsequent + writes. +
    (Inherited from IAsyncStreamWriterT.)
    Top
    Methods
    Extension Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_KeyCertificatePair.htm b/doc/ref/csharp/html/html/T_Grpc_Core_KeyCertificatePair.htm new file mode 100644 index 00000000000..9cd008f7f1f --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_KeyCertificatePair.htm @@ -0,0 +1,16 @@ +KeyCertificatePair Class
    KeyCertificatePair Class
    + Key certificate pair (in PEM encoding). +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreKeyCertificatePair

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class KeyCertificatePair

    The KeyCertificatePair type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodKeyCertificatePair
    + Creates a new certificate chain - private key pair. +
    Top
    Properties
    +   + NameDescription
    Public propertyCertificateChain
    + PEM encoded certificate chain. +
    Public propertyPrivateKey
    + PEM encoded private key. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ConsoleLogger.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ConsoleLogger.htm new file mode 100644 index 00000000000..469d5dba42a --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ConsoleLogger.htm @@ -0,0 +1,11 @@ +ConsoleLogger Class
    ConsoleLogger Class
    Logger that logs to System.Console.
    Inheritance Hierarchy
    SystemObject
      Grpc.Core.LoggingConsoleLogger

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ConsoleLogger : ILogger

    The ConsoleLogger type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodConsoleLogger
    Creates a console logger not associated to any specific type.
    Top
    Methods
    +   + NameDescription
    Public methodDebug
    Logs a message with severity Debug.
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodError(String, Object)
    Logs a message with severity Error.
    Public methodError(Exception, String, Object)
    Logs a message and an associated exception with severity Error.
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodForTypeT
    + Returns a logger associated with the specified type. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodInfo
    Logs a message with severity Info.
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWarning(String, Object)
    Logs a message with severity Warning.
    Public methodWarning(Exception, String, Object)
    Logs a message and an associated exception with severity Warning.
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ILogger.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ILogger.htm new file mode 100644 index 00000000000..16971f8ddad --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Logging_ILogger.htm @@ -0,0 +1,3 @@ +ILogger Interface
    ILogger Interface
    For logging messages.

    Namespace: Grpc.Core.Logging
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public interface ILogger

    The ILogger type exposes the following members.

    Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Marshaller_1.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Marshaller_1.htm new file mode 100644 index 00000000000..20aaf66d94d --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Marshaller_1.htm @@ -0,0 +1,18 @@ +Marshaller(T) Structure
    MarshallerT Structure
    + Encapsulates the logic for serializing and deserializing messages. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public struct Marshaller<T>
    +

    Type Parameters

    T

    [Missing <typeparam name="T"/> documentation for "T:Grpc.Core.Marshaller`1"]

    The MarshallerT type exposes the following members.

    Constructors
    Properties
    +   + NameDescription
    Public propertyDeserializer
    + Gets the deserializer function. +
    Public propertySerializer
    + Gets the serializer function. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns the fully qualified type name of this instance.
    (Inherited from ValueType.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Marshallers.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Marshallers.htm new file mode 100644 index 00000000000..b79baad9141 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Marshallers.htm @@ -0,0 +1,13 @@ +Marshallers Class
    Marshallers Class
    + Utilities for creating marshallers. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreMarshallers

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class Marshallers

    The Marshallers type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyStatic memberStringMarshaller
    + Returns a marshaller for string type. This is useful for testing. +
    Top
    Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Metadata.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Metadata.htm new file mode 100644 index 00000000000..d4570461295 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Metadata.htm @@ -0,0 +1,29 @@ +Metadata Class
    Metadata Class
    + A collection of metadata entries that can be exchanged during a call. + gRPC supports these types of metadata: +
    • Request headers - are sent by the client at the beginning of a remote call before any request messages are sent.
    • Response headers - are sent by the server at the beginning of a remote call handler before any response messages are sent.
    • Response trailers - are sent by the server at the end of a remote call along with resulting call status.
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreMetadata

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class Metadata : IList<MetadataEntry>, 
    +	ICollection<MetadataEntry>, IEnumerable<MetadataEntry>, IEnumerable

    The Metadata type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodMetadata
    + Initializes a new instance of Metadata. +
    Top
    Properties
    +   + NameDescription
    Public propertyCount
    Public propertyIsReadOnly
    Public propertyItem
    Top
    Methods
    +   + NameDescription
    Public methodAdd(MetadataEntry)
    Public methodAdd(String, Byte)
    Public methodAdd(String, String)
    Public methodClear
    Public methodContains
    Public methodCopyTo
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetEnumerator
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodIndexOf
    Public methodInsert
    Public methodRemove
    Public methodRemoveAt
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    Fields
    +   + NameDescription
    Public fieldStatic memberBinaryHeaderSuffix
    + All binary headers should have this suffix. +
    Public fieldStatic memberEmpty
    + An read-only instance of metadata containing no entries. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Metadata_Entry.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Metadata_Entry.htm new file mode 100644 index 00000000000..b7e276ca2e6 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Metadata_Entry.htm @@ -0,0 +1,24 @@ +Metadata.Entry Structure
    MetadataEntry Structure
    + Metadata entry +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public struct Entry

    The MetadataEntry type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodMetadataEntry(String, Byte)
    + Initializes a new instance of the MetadataEntry struct with a binary value. +
    Public methodMetadataEntry(String, String)
    + Initializes a new instance of the MetadataEntry struct holding an ASCII value. +
    Top
    Properties
    +   + NameDescription
    Public propertyIsBinary
    + Returns true if this entry is a binary-value entry. +
    Public propertyKey
    + Gets the metadata entry key. +
    Public propertyValue
    + Gets the string value of this metadata entry. +
    Public propertyValueBytes
    + Gets the binary value of this metadata entry. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    + Returns a String that represents the current MetadataEntry. +
    (Overrides ValueTypeToString.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_MethodType.htm b/doc/ref/csharp/html/html/T_Grpc_Core_MethodType.htm new file mode 100644 index 00000000000..264622b1b67 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_MethodType.htm @@ -0,0 +1,5 @@ +MethodType Enumeration
    MethodType Enumeration
    + Method types supported by gRPC. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public enum MethodType
    Members
    +   + Member nameValueDescription
    Unary0Single request sent from client, single response received from server.
    ClientStreaming1Stream of request sent from client, single response received from server.
    ServerStreaming2Single request sent from client, stream of responses received from server.
    DuplexStreaming3Both server and client can stream arbitrary number of requests and responses simultaneously.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Method_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Method_2.htm new file mode 100644 index 00000000000..054329f4bb1 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Method_2.htm @@ -0,0 +1,30 @@ +Method(TRequest, TResponse) Class
    MethodTRequest, TResponse Class
    + A description of a remote method. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreMethodTRequest, TResponse

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class Method<TRequest, TResponse> : IMethod
    +

    Type Parameters

    TRequest
    Request message type for this method.
    TResponse
    Response message type for this method.

    The MethodTRequest, TResponse type exposes the following members.

    Constructors
    Properties
    +   + NameDescription
    Public propertyFullName
    + Gets the fully qualified name of the method. On the server side, methods are dispatched + based on this name. +
    Public propertyName
    + Gets the unqualified name of the method. +
    Public propertyRequestMarshaller
    + Gets the marshaller used for request messages. +
    Public propertyResponseMarshaller
    + Gets the marshaller used for response messages. +
    Public propertyServiceName
    + Gets the name of the service to which this method belongs. +
    Public propertyType
    + Gets the type of the method. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_RpcException.htm b/doc/ref/csharp/html/html/T_Grpc_Core_RpcException.htm new file mode 100644 index 00000000000..497c69ddbce --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_RpcException.htm @@ -0,0 +1,21 @@ +RpcException Class
    RpcException Class
    + Thrown when remote procedure call fails. Every RpcException is associated with a resulting Status of the call. +
    Inheritance Hierarchy

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class RpcException : Exception

    The RpcException type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodRpcException(Status)
    + Creates a new RpcException associated with given status. +
    Public methodRpcException(Status, String)
    + Creates a new RpcException associated with given status and message. +
    Top
    Properties
    +   + NameDescription
    Public propertyData
    Gets a collection of key/value pairs that provide additional user-defined information about the exception.
    (Inherited from Exception.)
    Public propertyHelpLink
    Gets or sets a link to the help file associated with this exception.
    (Inherited from Exception.)
    Public propertyHResult
    Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.
    (Inherited from Exception.)
    Public propertyInnerException
    Gets the Exception instance that caused the current exception.
    (Inherited from Exception.)
    Public propertyMessage
    Gets a message that describes the current exception.
    (Inherited from Exception.)
    Public propertySource
    Gets or sets the name of the application or the object that causes the error.
    (Inherited from Exception.)
    Public propertyStackTrace
    Gets a string representation of the immediate frames on the call stack.
    (Inherited from Exception.)
    Public propertyStatus
    + Resulting status of the call. +
    Public propertyTargetSite
    Gets the method that throws the current exception.
    (Inherited from Exception.)
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetBaseException
    When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.
    (Inherited from Exception.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetObjectData
    When overridden in a derived class, sets the SerializationInfo with information about the exception.
    (Inherited from Exception.)
    Public methodGetType
    Gets the runtime type of the current instance.
    (Inherited from Exception.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Creates and returns a string representation of the current exception.
    (Inherited from Exception.)
    Top
    Events
    +   + NameDescription
    Protected eventSerializeObjectState
    Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.
    (Inherited from Exception.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Server.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Server.htm new file mode 100644 index 00000000000..a32eeceb244 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Server.htm @@ -0,0 +1,28 @@ +Server Class
    Server Class
    + gRPC server. A single server can server arbitrary number of services and can listen on more than one ports. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServer

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class Server

    The Server type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodServer
    + Create a new server. +
    Top
    Properties
    +   + NameDescription
    Public propertyPorts
    + Ports on which the server will listen once started. Register a port with this + server by adding its definition to this collection. +
    Public propertyServices
    + Services that will be exported by the server once started. Register a service with this + server by adding its definition to this collection. +
    Public propertyShutdownTask
    + To allow awaiting termination of the server. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodKillAsync
    + Requests server shutdown while cancelling all the in-progress calls. + The returned task finishes when shutdown procedure is complete. +
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodShutdownAsync
    + Requests server shutdown and when there are no more calls being serviced, + cleans up used resources. The returned task finishes when shutdown procedure + is complete. +
    Public methodStart
    + Starts the server. +
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerCallContext.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerCallContext.htm new file mode 100644 index 00000000000..0e0c4b4aedd --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerCallContext.htm @@ -0,0 +1,17 @@ +ServerCallContext Class
    ServerCallContext Class
    + Context for a server-side call. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerCallContext

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ServerCallContext

    The ServerCallContext type exposes the following members.

    Properties
    +   + NameDescription
    Public propertyCancellationToken
    Cancellation token signals when call is cancelled.
    Public propertyDeadline
    Deadline for this RPC.
    Public propertyHost
    Name of host called in this RPC.
    Public propertyMethod
    Name of method called in this RPC.
    Public propertyPeer
    Address of the remote endpoint in URI format.
    Public propertyRequestHeaders
    Initial metadata sent by client.
    Public propertyResponseTrailers
    Trailers to send back to client after RPC finishes.
    Public propertyStatus
    Status to send back to client after RPC finishes.
    Public propertyWriteOptions
    + Allows setting write options for the following write. + For streaming response calls, this property is also exposed as on IServerStreamWriter for convenience. + Both properties are backed by the same underlying value. +
    Top
    Methods
    +   + NameDescription
    Public methodCreatePropagationToken
    + Creates a propagation token to be used to propagate call context to a child call. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Public methodWriteResponseHeadersAsync
    + Asynchronously sends response headers for the current call to the client. This method may only be invoked once for each call and needs to be invoked + before any response messages are written. Writing the first response message implicitly sends empty response headers if WriteResponseHeadersAsync haven't + been called yet. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerCredentials.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerCredentials.htm new file mode 100644 index 00000000000..dab5f273203 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerCredentials.htm @@ -0,0 +1,13 @@ +ServerCredentials Class
    ServerCredentials Class
    + Server side credentials. +
    Inheritance Hierarchy

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public abstract class ServerCredentials

    The ServerCredentials type exposes the following members.

    Constructors
    +   + NameDescription
    Protected methodServerCredentials
    Initializes a new instance of the ServerCredentials class
    Top
    Properties
    +   + NameDescription
    Public propertyStatic memberInsecure
    + Returns instance of credential that provides no security and + will result in creating an unsecure server port with no encryption whatsoever. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerPort.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerPort.htm new file mode 100644 index 00000000000..21ddace1d03 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerPort.htm @@ -0,0 +1,16 @@ +ServerPort Class
    ServerPort Class
    + A port exposed by a server. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerPort

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ServerPort

    The ServerPort type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodServerPort
    + Creates a new port on which server should listen. +
    Top
    Properties
    +   + NameDescription
    Public propertyBoundPort
    Public propertyCredentials
    Public propertyHost
    Public propertyPort
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    Fields
    +   + NameDescription
    Public fieldStatic memberPickUnused
    + Pass this value as port to have the server choose an unused listening port for you. + Ports added to a server will contain the bound port in their BoundPort property. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition.htm new file mode 100644 index 00000000000..a673de01d1c --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition.htm @@ -0,0 +1,9 @@ +ServerServiceDefinition Class
    ServerServiceDefinition Class
    + Mapping of method names to server call handlers. + Normally, the ServerServiceDefinition objects will be created by the BindService factory method + that is part of the autogenerated code for a protocol buffers service definition. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerServiceDefinition

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ServerServiceDefinition

    The ServerServiceDefinition type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberCreateBuilder
    + Creates a new builder object for ServerServiceDefinition. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition_Builder.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition_Builder.htm new file mode 100644 index 00000000000..442df368ef0 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerServiceDefinition_Builder.htm @@ -0,0 +1,19 @@ +ServerServiceDefinition.Builder Class
    ServerServiceDefinitionBuilder Class
    + Builder class for ServerServiceDefinition. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerServiceDefinitionBuilder

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class Builder

    The ServerServiceDefinitionBuilder type exposes the following members.

    Constructors
    Methods
    +   + NameDescription
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ClientStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a client streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, DuplexStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a bidirectional streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, ServerStreamingServerMethodTRequest, TResponse)
    + Adds a definitions for a server streaming method. +
    Public methodAddMethodTRequest, TResponse(MethodTRequest, TResponse, UnaryServerMethodTRequest, TResponse)
    + Adds a definitions for a single request - single response method. +
    Public methodBuild
    + Creates an immutable ServerServiceDefinition from this builder. +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_ServerStreamingServerMethod_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_ServerStreamingServerMethod_2.htm new file mode 100644 index 00000000000..cf02bb4f6bc --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_ServerStreamingServerMethod_2.htm @@ -0,0 +1,25 @@ +ServerStreamingServerMethod(TRequest, TResponse) Delegate
    ServerStreamingServerMethodTRequest, TResponse Delegate
    + Server-side handler for server streaming call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public delegate Task ServerStreamingServerMethod<TRequest, TResponse>(
    +	TRequest request,
    +	IServerStreamWriter<TResponse> responseStream,
    +	ServerCallContext context
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    request
    Type: TRequest
    responseStream
    Type: Grpc.CoreIServerStreamWriterTResponse
    context
    Type: Grpc.CoreServerCallContext

    Type Parameters

    TRequest
    Request message type for this method.
    TResponse
    Response message type for this method.

    Return Value

    Type: Task
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServerPortCollection.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServerPortCollection.htm new file mode 100644 index 00000000000..08ab135f4d5 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServerPortCollection.htm @@ -0,0 +1,19 @@ +Server.ServerPortCollection Class
    ServerServerPortCollection Class
    + Collection of server ports. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerServerPortCollection

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ServerPortCollection : IEnumerable<ServerPort>, 
    +	IEnumerable

    The ServerServerPortCollection type exposes the following members.

    Methods
    +   + NameDescription
    Public methodAdd(ServerPort)
    + Adds a new port on which server should listen. + Only call this before Start(). +

    Return Value

    Type: 
    The port on which server will be listening.
    Public methodAdd(String, Int32, ServerCredentials)
    + Adds a new port on which server should listen. +

    Return Value

    Type: 
    The port on which server will be listening.
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetEnumerator
    + Gets enumerator for this collection. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServiceDefinitionCollection.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServiceDefinitionCollection.htm new file mode 100644 index 00000000000..054b16bc4d4 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Server_ServiceDefinitionCollection.htm @@ -0,0 +1,17 @@ +Server.ServiceDefinitionCollection Class
    ServerServiceDefinitionCollection Class
    + Collection of service definitions. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreServerServiceDefinitionCollection

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class ServiceDefinitionCollection : IEnumerable<ServerServiceDefinition>, 
    +	IEnumerable

    The ServerServiceDefinitionCollection type exposes the following members.

    Methods
    +   + NameDescription
    Public methodAdd
    + Adds a service definition to the server. This is how you register + handlers for a service with the server. Only call this before Start(). +
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetEnumerator
    + Gets enumerator for this collection. +
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_SslCredentials.htm b/doc/ref/csharp/html/html/T_Grpc_Core_SslCredentials.htm new file mode 100644 index 00000000000..84580d7864e --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_SslCredentials.htm @@ -0,0 +1,28 @@ +SslCredentials Class
    SslCredentials Class
    + Client-side SSL credentials. +
    Inheritance Hierarchy

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public sealed class SslCredentials : Credentials

    The SslCredentials type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodSslCredentials
    + Creates client-side SSL credentials loaded from + disk file pointed to by the GRPC_DEFAULT_SSL_ROOTS_FILE_PATH environment variable. + If that fails, gets the roots certificates from a well known place on disk. +
    Public methodSslCredentials(String)
    + Creates client-side SSL credentials from + a string containing PEM encoded root certificates. +
    Public methodSslCredentials(String, KeyCertificatePair)
    + Creates client-side SSL credentials. +
    Top
    Properties
    +   + NameDescription
    Public propertyKeyCertificatePair
    + Client side key and certificate pair. + If null, client will not use key and certificate pair. +
    Public propertyRootCertificates
    + PEM encoding of the server root certificates. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_SslServerCredentials.htm b/doc/ref/csharp/html/html/T_Grpc_Core_SslServerCredentials.htm new file mode 100644 index 00000000000..641f2b7a532 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_SslServerCredentials.htm @@ -0,0 +1,25 @@ +SslServerCredentials Class
    SslServerCredentials Class
    + Server-side SSL credentials. +
    Inheritance Hierarchy

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class SslServerCredentials : ServerCredentials

    The SslServerCredentials type exposes the following members.

    Constructors
    Properties
    +   + NameDescription
    Public propertyForceClientAuthentication
    + If true, the authenticity of client check will be enforced. +
    Public propertyKeyCertificatePairs
    + Key-certificate pairs. +
    Public propertyRootCertificates
    + PEM encoded client root certificates. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Status.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Status.htm new file mode 100644 index 00000000000..7f2848d4ca1 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Status.htm @@ -0,0 +1,24 @@ +Status Structure
    Status Structure
    + Represents RPC result, which consists of StatusCode and an optional detail string. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public struct Status

    The Status type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodStatus
    + Creates a new instance of Status. +
    Top
    Properties
    +   + NameDescription
    Public propertyDetail
    + Gets the detail. +
    Public propertyStatusCode
    + Gets the gRPC status code. OK indicates success, all other values indicate an error. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Indicates whether this instance and a specified object are equal.
    (Inherited from ValueType.)
    Public methodGetHashCode
    Returns the hash code for this instance.
    (Inherited from ValueType.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Public methodToString
    + Returns a String that represents the current Status. +
    (Overrides ValueTypeToString.)
    Top
    Fields
    +   + NameDescription
    Public fieldStatic memberDefaultCancelled
    + Default result of a cancelled RPC. StatusCode=Cancelled, empty details message. +
    Public fieldStatic memberDefaultSuccess
    + Default result of a successful RPC. StatusCode=OK, empty details message. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_StatusCode.htm b/doc/ref/csharp/html/html/T_Grpc_Core_StatusCode.htm new file mode 100644 index 00000000000..a160be54e8f --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_StatusCode.htm @@ -0,0 +1,52 @@ +StatusCode Enumeration
    StatusCode Enumeration
    + Result of a remote procedure call. + Based on grpc_status_code from grpc/status.h +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public enum StatusCode
    Members
    +   + Member nameValueDescription
    OK0Not an error; returned on success.
    Cancelled1The operation was cancelled (typically by the caller).
    Unknown2 + Unknown error. An example of where this error may be returned is + if a Status value received from another address space belongs to + an error-space that is not known in this address space. Also + errors raised by APIs that do not return enough error information + may be converted to this error. +
    InvalidArgument3 + Client specified an invalid argument. Note that this differs + from FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments + that are problematic regardless of the state of the system + (e.g., a malformed file name). +
    DeadlineExceeded4 + Deadline expired before operation could complete. For operations + that change the state of the system, this error may be returned + even if the operation has completed successfully. For example, a + successful response from a server could have been delayed long + enough for the deadline to expire. +
    NotFound5Some requested entity (e.g., file or directory) was not found.
    AlreadyExists6Some entity that we attempted to create (e.g., file or directory) already exists.
    PermissionDenied7 + The caller does not have permission to execute the specified + operation. PERMISSION_DENIED must not be used for rejections + caused by exhausting some resource (use RESOURCE_EXHAUSTED + instead for those errors). PERMISSION_DENIED must not be + used if the caller can not be identified (use UNAUTHENTICATED + instead for those errors). +
    Unauthenticated16The request does not have valid authentication credentials for the operation.
    ResourceExhausted8 + Some resource has been exhausted, perhaps a per-user quota, or + perhaps the entire file system is out of space. +
    FailedPrecondition9 + Operation was rejected because the system is not in a state + required for the operation's execution. For example, directory + to be deleted may be non-empty, an rmdir operation is applied to + a non-directory, etc. +
    Aborted10 + The operation was aborted, typically due to a concurrency issue + like sequencer check failures, transaction aborts, etc. +
    OutOfRange11 + Operation was attempted past the valid range. E.g., seeking or + reading past end of file. +
    Unimplemented12Operation is not implemented or not supported/enabled in this service.
    Internal13 + Internal errors. Means some invariants expected by underlying + system has been broken. If you see one of these errors, + something is very broken. +
    Unavailable14 + The service is currently unavailable. This is a most likely a + transient condition and may be corrected by retrying with + a backoff. +
    DataLoss15Unrecoverable data loss or corruption.
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_UnaryServerMethod_2.htm b/doc/ref/csharp/html/html/T_Grpc_Core_UnaryServerMethod_2.htm new file mode 100644 index 00000000000..f0a32a30158 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_UnaryServerMethod_2.htm @@ -0,0 +1,21 @@ +UnaryServerMethod(TRequest, TResponse) Delegate
    UnaryServerMethodTRequest, TResponse Delegate
    + Server-side handler for unary call. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public delegate Task<TResponse> UnaryServerMethod<TRequest, TResponse>(
    +	TRequest request,
    +	ServerCallContext context
    +)
    +where TRequest : class
    +where TResponse : class
    +

    Parameters

    request
    Type: TRequest
    context
    Type: Grpc.CoreServerCallContext

    Type Parameters

    TRequest
    Request message type for this method.
    TResponse
    Response message type for this method.

    Return Value

    Type: TaskTResponse
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Utils_AsyncStreamExtensions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_AsyncStreamExtensions.htm new file mode 100644 index 00000000000..52ddee0058f --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_AsyncStreamExtensions.htm @@ -0,0 +1,19 @@ +AsyncStreamExtensions Class
    AsyncStreamExtensions Class
    + Extension methods that simplify work with gRPC streaming calls. +
    Inheritance Hierarchy
    SystemObject
      Grpc.Core.UtilsAsyncStreamExtensions

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class AsyncStreamExtensions

    The AsyncStreamExtensions type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberForEachAsyncT
    + Reads the entire stream and executes an async action for each element. +
    Public methodStatic memberToListAsyncT
    + Reads the entire stream and creates a list containing all the elements read. +
    Public methodStatic memberWriteAllAsyncT(IServerStreamWriterT, IEnumerableT)
    + Writes all elements from given enumerable to the stream. +
    Public methodStatic memberWriteAllAsyncT(IClientStreamWriterT, IEnumerableT, Boolean)
    + Writes all elements from given enumerable to the stream. + Completes the stream afterwards unless close = false. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Utils_BenchmarkUtil.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_BenchmarkUtil.htm new file mode 100644 index 00000000000..b05566cedff --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_BenchmarkUtil.htm @@ -0,0 +1,9 @@ +BenchmarkUtil Class
    BenchmarkUtil Class
    + Utility methods to run microbenchmarks. +
    Inheritance Hierarchy
    SystemObject
      Grpc.Core.UtilsBenchmarkUtil

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class BenchmarkUtil

    The BenchmarkUtil type exposes the following members.

    Methods
    +   + NameDescription
    Public methodStatic memberRunBenchmark
    + Runs a simple benchmark preceded by warmup phase. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_Utils_Preconditions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_Preconditions.htm new file mode 100644 index 00000000000..0c41403431e --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_Utils_Preconditions.htm @@ -0,0 +1,19 @@ +Preconditions Class
    Preconditions Class
    + Utility methods to simplify checking preconditions in the code. +
    Inheritance Hierarchy
    SystemObject
      Grpc.Core.UtilsPreconditions

    Namespace: Grpc.Core.Utils
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class Preconditions
    Methods
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_VersionInfo.htm b/doc/ref/csharp/html/html/T_Grpc_Core_VersionInfo.htm new file mode 100644 index 00000000000..a53a4185ab3 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_VersionInfo.htm @@ -0,0 +1,9 @@ +VersionInfo Class
    VersionInfo Class
    + Provides info about current version of gRPC. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreVersionInfo

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public static class VersionInfo

    The VersionInfo type exposes the following members.

    Fields
    +   + NameDescription
    Public fieldStatic memberCurrentVersion
    + Current version of gRPC +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_WriteFlags.htm b/doc/ref/csharp/html/html/T_Grpc_Core_WriteFlags.htm new file mode 100644 index 00000000000..ddd3eed6542 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_WriteFlags.htm @@ -0,0 +1,15 @@ +WriteFlags Enumeration
    WriteFlags Enumeration
    + Flags for write operations. +

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    [FlagsAttribute]
    +public enum WriteFlags
    Members
    +   + Member nameValueDescription
    BufferHint1 + Hint that the write may be buffered and need not go out on the wire immediately. + gRPC is free to buffer the message until the next non-buffered + write, or until write stream completion, but it need not buffer completely or at all. +
    NoCompress2 + Force compression to be disabled for a particular write. +
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/html/T_Grpc_Core_WriteOptions.htm b/doc/ref/csharp/html/html/T_Grpc_Core_WriteOptions.htm new file mode 100644 index 00000000000..94460aa93b5 --- /dev/null +++ b/doc/ref/csharp/html/html/T_Grpc_Core_WriteOptions.htm @@ -0,0 +1,17 @@ +WriteOptions Class
    WriteOptions Class
    + Options for write operations. +
    Inheritance Hierarchy
    SystemObject
      Grpc.CoreWriteOptions

    Namespace: Grpc.Core
    Assembly: Grpc.Core (in Grpc.Core.dll) Version: 0.6.1.0
    Syntax
    public class WriteOptions

    The WriteOptions type exposes the following members.

    Constructors
    +   + NameDescription
    Public methodWriteOptions
    + Initializes a new instance of WriteOptions class. +
    Top
    Properties
    +   + NameDescription
    Public propertyFlags
    + Gets the write flags. +
    Top
    Methods
    +   + NameDescription
    Public methodEquals
    Determines whether the specified object is equal to the current object.
    (Inherited from Object.)
    Protected methodFinalize
    Allows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection.
    (Inherited from Object.)
    Public methodGetHashCode
    Serves as the default hash function.
    (Inherited from Object.)
    Public methodGetType
    Gets the Type of the current instance.
    (Inherited from Object.)
    Protected methodMemberwiseClone
    Creates a shallow copy of the current Object.
    (Inherited from Object.)
    Public methodToString
    Returns a string that represents the current object.
    (Inherited from Object.)
    Top
    Fields
    +   + NameDescription
    Public fieldStatic memberDefault
    + Default write options. +
    Top
    See Also
    \ No newline at end of file diff --git a/doc/ref/csharp/html/icons/AlertCaution.png b/doc/ref/csharp/html/icons/AlertCaution.png new file mode 100644 index 0000000000000000000000000000000000000000..78f246f047efee82e1ee0b64f1adbef606253054 GIT binary patch literal 618 zcmV-w0+s!VP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-;7LS5RCwBylfP~gK^Vk;-}-FFIChME=h(5G2(T6; zpah97qN1X89i>STp`=JblN3Bb-XLY%Q1AcdkQrp!HXSPCG~edkf_v zbNLd`4I;g&my7af(tY z!^x4-&e|Q|sk}S%YrxB;<)U85f{Q}17Mvr0|04k1_t(Mm5D^gJ?7QL1(b)&!p$F_H zQ=ZPJBkW)V#(=Z@IwE#7fKVZ7{EzbK1jh-bjj_8Pu)0*s;YK}N6oDJ3Bf{6$rO6{A zf)fBiL|Ck3`TVK7>H(*(-W>D)7;>$iJe67F{IB>i05~0`Lczgc$^ZZW07*qoM6N<$ Ef-W!&ivR!s literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/AlertNote.png b/doc/ref/csharp/html/icons/AlertNote.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab92b66aa6ba6ba29e37046059c5314b4971341 GIT binary patch literal 3236 zcmV;V3|sSwP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005cNkl7i60=bh^UBQ70kLDH=DWlycTmaJ1bb_!ezLJJI{IFcg~n34zem7a7_U` zeKapQxPwc0G~9(N)tvD;is*(MuHV?ODS#Nnm8%c`(?g*2v~hLm_O-Esy#Nr$7ZCz1 zFOcU{0s$dv3<#N!k3a%by1Ne&mR_@TMk3oQWsn7shB-hKAlJVTB{fbqsQ`$7k~q%+ z``wDpK4B-z$_g^!zBB1xUO-e>OEV)8LkY0eo58a!tTLS-juenp3pJpL3_>go(s1yL z=g(G%!_P4KiuYDoUt1<-+sFqH`^fva4^SK+9}q$*gL=KjyZ0M>`?5*1ZXB+Q?S7Tn zqn~KCPo=Jays$9w86~l}xWKE`HRjvrnXbWT_ct$JbUA*cMt!!4nWqSHJF#pb3()Bt z zF>4e-6o9|k-P;^zp(G}o+k;ec1O#g<5k!p<3mXf2!IaktVku~48GAv{RuEBy5X2vl z#t`C}C57MRV)tMtBW^pOj9bC84h9&!WM3@%+kg+#{JoaBE&hFgzeSF?RlT} z9&C3kv^j^PLoUr+;3}V4+Moga8-Q)sZ8czJWypgkuQIzg&*$XwMPRdBFScOivh=v; z!-HXNd-tayjs;t{iuDD+DIy0DF(86SZnh{T7y*>~2S5S5exw8-D&5Hr&L;1&b=SH} z$=1Y&L%h;Q0Pa6Ke#HT}J~t0Q?m tQ)sP!{{^91t5K;`{%`Qbw-vBLDh*rjvI{K}%vsHm@h_?tw;Z7`jJPwSdcxnw$~gG!RFk%*O*|I1~?_r=Vw zW31k*ZJTPZXD-TrHg274%78fS{q4kPEz6ow%IwOa&Zb~yd6;xJgr$h)xL?S8H^*){ zp<^_vpM8wGik;1zgtUU`!F9`^RlDZ8o2#KvOh%~ItUx<8m&TTvYdD#5KgoSI$$&Y` zo>9tvHrAF=$caVbrC^oCleOlxnP@f1x`BYNevGeAzwg4P)T&`vMTm%qrD-ymZaeFe zLb8BL$&X25Vq(gVN10|b$9Xr%dpF$l+yDRn000000000000000A^8LW004UcEC2ui z01yBW000N6fO~>_1}SLPB)mW!_w<;6q)BF&{is;nBp+15yFz aYzYIwMwU7PNbLy_pn!w|0x}K?1OPh{BoK)J literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/CodeExample.png b/doc/ref/csharp/html/icons/CodeExample.png new file mode 100644 index 0000000000000000000000000000000000000000..a3b9fba4cc5f29460d711dddb32b79b85783af9a GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!AMUR#}EtuMf8pRk0XW?`S;ryG~}Z?XkE$(i7NV%yAs7l(t? nuW2~*F(>VD=(TZ|HfE5{S-0gp>+@4UOBg&|{an^LB{Ts5mnuH4 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/Search.png b/doc/ref/csharp/html/icons/Search.png new file mode 100644 index 0000000000000000000000000000000000000000..42165b6d64c2ad706179b7eaa0485caa089e6ed9 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^!ayvawSc zV~Bl)>eG>!R=iK_%P!ZR!uvNw-nA5}SoCV%;XLf~kk5Lzl-FVdQ&MBb@0IsfxDF6Tf literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/SectionCollapsed.png b/doc/ref/csharp/html/icons/SectionCollapsed.png new file mode 100644 index 0000000000000000000000000000000000000000..8ded1ebc6b03328520aac9416ea15f07e63809a8 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamUKs7M+SzC{oH>NS%G}c0*}aI z1_mK8X6#Yg$qp2hDshb{3C>R|DNig)We7;j%q!9Ja}7}_GuAWJGc|_p9mFVf> z7-HeScG5-81_K@!>nOKVY?6k`bMLh$RNeCW@W8S5!vYcZ1~H{GJn!n{R?im{6g+Vz zSEosFd$((h;`T1rJI?QP_2g6db}rxH@?`sl(yP}VuTfHJdZ?$QbZh?|a|1rj<3Z`n T`6XRI%NRUe{an^LB{Ts5&hJQu literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/SectionExpanded.png b/doc/ref/csharp/html/icons/SectionExpanded.png new file mode 100644 index 0000000000000000000000000000000000000000..b693921cc92c2b00c06b842c8d098ea63afc1cfc GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1|;P@bT0xamUKs7M+SzC{oH>NS%G}c0*}aI z1_mK8X6#Yg$qp2hDshb{3C>R|DNig)We7;j%q!9Ja}7}_GuAWJGc|_p9747Nb z7-Hc+xBDRP0RtW;<0khn|GalRO}y^q>HN!rlhIu1k@%L71xuN9)9?JPQ?iR~71fmO zjGc5ea*~T$?$N0%zt%JTnB?&Pl+X$N6$xqUli92599x4kcB&s^{ZR0-?|xgoAkZ2H MPgg&ebxsLQ08eg56951J literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/TocClose.gif b/doc/ref/csharp/html/icons/TocClose.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6d7b5edcc237dc7d59b4a42910a4abab459c94e GIT binary patch literal 893 zcmZ?wbhEHba}ave*XOV_wV2T|Nk?Lg3%Bd;vt{|az7|9FmPxysB_48 t1Sl}Dva;%BI4C4Ca`Fg?$QUR#H8gQ3@l*tSXkcXLWOnfIFj8Q!1_0$!Io|*P literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/TocExpanded.gif b/doc/ref/csharp/html/icons/TocExpanded.gif new file mode 100644 index 0000000000000000000000000000000000000000..f774d9bb6589737768a8bf788046a8bbe53ca902 GIT binary patch literal 837 zcmZ?wbhEHb7O#s`Kb79LTx z0D+J54|j4a#f5BWU_8vgZ&{@x;lOZgBD1%Uz|TO2Mkd+leI^Z`=6lUB4c(-YS(JWi df}!fKEgT`qC%VM7g+j9?zO-NdpNWaV8UQoLL&5+6 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/favicon.ico b/doc/ref/csharp/html/icons/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2b9963f814281f0b1b7bb661be8d579191b59a42 GIT binary patch literal 25094 zcmeHv2Yi&(w(s}71ThMTM?F}sl6wFFkxoF80ESQ$K{#STn2>}NIs_sC1R?Yy0#Xy? zSg;`=DoueTg!DF(-jhj%^h_qnlq8c`@4vp8NkNLnKS9urvC!KJi>yKKA_xOeCeQ>o0Lyc~L_|_H zwUD4|&Uh|efr+kH|kLC&)dp!jDZiApav{X>+1kR}q zLNIj5fILzAeFX|RDO}!FK@DMU~LXOXU1qI4e?1v0n@$MM-U)d)pKSx=|HV7Ht?Gtp-C?oN*pbUYH zp}#6I81)7_LJvB%RG{-41UkcX+XV&iRj`W=cA+Yzkb(N43&;=IC(yO+sJAGAqK}}? z;R7wGchnJOvJNM4{TBJSS268n)E{tLaNmL}!8b@HC=0+7KA}id2*Dwc1HPkz@079c znEmX2zW7((|7#ZL(ViYGI&jCdCp_JkgpvPdyL-2_we{}Zwtuq)<$Wl+cOT=oJ0Jka zrW6pc+ZH7EqUiqA6E=(-*p{rV0|F$9y9w2O6JrMko;Y&s=#ef`0-<$)ji2q9yJ*q9 zD~g}t&)Z9h_4NcDSy?k47apZ(8QUzC~BivyNC+m|Tz zM*m{b-gk+F?J)nX<0q`FY-Tb6C}#Czg54bnx&z(1?<@(y-roM*qg4Z3Zz3J3^r%mV<{;;R`yqlSTUphFv2mG!q zP`BQqmDNalmvQ4P?CsrPPqFJl3qA8Uz_(%i$B|_5j*e~o?d_Kymk3xS7sxu!e&KG&A?dpdoMyVd^pa~weEX%x zU{i6_IN*Hk3xVtVsb|gTYCz;WH z(38+`_e{ru&~3pmW@`4&-hBVMr{@$8cdz4tU}|#BWsjgD`*{tV;O_4J@+&~GF*is_ zpzYq?QztvS_c_5C&kS~%xU4TIt)F|@-3h8a!z@kWz=OC3#O3SO4e@lIah%OA`i=gG zuU02UyzJrZJn1!--pb4#1dJkXS^wc1-jg>T16xb#^5k0QDU+v6VQIt{ByCw^smjE| z+qP|3|HkX@9b*+ZS#|06PtU1Sr+TjDCyVqF0lyFr@7S?p>y{6n>2*{}M~nUoIh-@k9)UKF!! z!-j2Jk+$tMW%TZZjuLj7-irr6{qz76eT<^^?%i|9^xEbQbP#kk6Nus=&@j<~gO*o! za%Zu+z0kps7DUtaiQjRT2rNo;Mus8piq1u}Y0*w{Z){T;^SJ6Q$!1Jl zX@k_&Z_@*@O{|zkN_XRom=sBEO%&Qyx*7$$Nplv#OS03-a>;L5Qocj6SZDQE{KQ`GuVwyuf;@9s^jPBi^ z-;KG*kt3LJSmR^c8Kb+cEha+!#=bpm`m`lJ&vn71!OyNej_7WS+3BM`6J@d&XW^f0 zmcMmiM}(fp?#DB_0eu1=nStwzK3%}U!ob%yAmBNk!6DkU64zjsA(Jfu!t-VXU#oz} z$4k?gLB~bW2O%ObW(Qh7V#@dJ8el!kJcXJyinAqzX9LU(e66hJ$nKm3&3BmiXn@4P z*Uu_omVe-E0)lAm-vi>i+N6f z{9%k|?_%#Tv9F|}FV7e;$&g;Z)kW+*L&|rtAK%Z4C$q>Oj@a0gKi)3Dgn*gBxQ|40 z{xHY35PUwSOw7S$oXfb!E&0#5PH^on@y86uUlcdF+4pyJ8RTcmw-Lv2u0?|DoECObO~_74!}K=+A# zQ3sCh?i2nlT73k1!PiQ(d1I=lQ=i=+9PBk$6a!~YaGC&e(_G!xPZVESw{GeTj(BYl zGY9l?c6NSkr$_p%X3$}lctf$1e_tdtFSo(X!1 zj|_I;CBX5%PngDb*+_97zyA+YP%!?eXj+q%Ee-&qUg8}4anfkrCqNp@UF-)xVt#KL zWCuLULo`^L->-Ik$+U<%-e2rG*uK9D7PXkq3r-VUO~d}gN5m2Kj{TR3(tGir&I1QO z`_WKH`Mfx%|AhXdSmRy+;&#u;FCP=1@UkCnC608RfYl{`Rt)3w5YOR(;;zl2_~>gM z&SON8S2B8GJl?b6jc1NvHNWpLJc=_Rdj^up-)$-W&so_Xe-4eOV87-%_T*CAK3tt*ueR4HqgQVpYC+cVEfe)JCo=~@Fp4DTh0Q{p&|4@J9uq<_ zlri{YIAh?^=Rsh>Wjf};yqG8R=5eeiz*ge&*S_#y`@(|s?ED_;_nyzwU930F}|8(y-JHjD7Q zyKfKwd6>FkTzgLJZ$Az*N`LY7{!47VWXr_0ve&qS_uuS1DL{Ny3>fIz`(c#tFMjgj zu)cv0zd3n~=+7!(#&-aV@q0wmBVOPQ#?oF=E@KG2{E?(PLEl>t3NecaMVIT3E|=k6 zNy-OaDDVq$wnsm~bpFN`1g`=_Y36{N|L;;-=;g}vxVpULjvrNSQei@9$hlMhjyb9_ z6Y2{y8p}%>RW*%`4GoQrb@dHu=~J&(H`Y`%+{&-bO_E}{ir>3qRA60#QL%q7Oq6F&v@ggcS;x$#b8a0|ab$yMxzBE5K z{-;wRAFsZ#abDQEx1v6JKjFZt^s~nb6cH5_6(|L0+Q!EEqO3nsgeoUdt5&fo8a0(= zx6{ua4PEv6^?5Ia%E)%7Am8ISdlt)qgLB^TY3K? zAh}Lm!;&{@Ze=CM_`3wp9dKjbOW|%q!@OUKJoB&WT9u}zB4xKnn9HEh`GbSs?;q?o zBKfO5l@;YGwOXUqH56yxtBAa)YufT6txi|3(-+HchA(#xnL8kS!SE=L5pfHK1g(AN zW<;c3--Jbg%D8LM9>efHV!?<|*C9c32gnbus;;b1*Vlu*EEvphFF zVuf?4?4?ML5iy=4RU?tcK-s4cpu{+@kuhE)qdkU)xep7P^I}rK z##$A8p;22~nHLj$M-jJ@B6PJCT78pRU8mUX9V#0bEk^z-g8*&4v&hM zU-M5Nh+i~1!E<wYCwPyLFL*i5ZBU%+OYt5<6TC-CpHcDNqo7E%=Ll3sl;4c1+a(Pe zjkcz|AU?FMh`Nl}##?z!%`J_MjY)gF!sic)^R|;O8ZBQW@dqof5pfIc;*V~u2t8LB zdM0(_toQ{(%tc5F#(9l`F>lBQ8ca(pm z+-rE$qOsS%2~=zKrXsRFMiGO!h=rqotXMn-E)fI%nerxsQCD><`tsQ}{zhXfs7k-z zld^1V`l<=3D;yF#^9LWf=g`PSVv4He>+I@IQ- zz|^|xcK)!xv4u&huYQrWdVG%Gq>NSLVImN=8QF9r_Z$+r*giSYuu|w9PVOE;bybE6*H}lU<&{yAP z>}Fl{ryk{7XO?W5p0#>H;>rn$2Uq2M_et5+uhTw)&kr^g5$7?iNFK)QVbY(ECM_J9 zv3h*g2TmzV$J{!*pWhmd@EH?x{IAQ1ZY<8`_poa0dG)ThYWKcZvhlSPzt>{JLeyIB z)2hPG!{^a*SQJfhlX>NZ$NzY4lZ7L#U~# z&O5NAz|W~<^Nhl^ld8_{We!BzilWG0zH5^oH|5EZ+VVnEE|sLv*DL7jRn14;3-`Lp zqr%a&O<4wwx<#)w-D_J~OX5OqZ+okH=j^I&Gpi4Kw`yvUWi%M>I$TOBuqikdh0|q! zy0nE(t+@Twrc6bAExN6y7F|oLuEl`n1EW=BC96;R>JQCtKJ2DF;%+QXF_G#jisP=B zJ-?$0%BZUiMVTfX{$G_wNhc}(I9=bRySS&~#+m%6kj&^%d+K0Yb zN#{3FxtY+Q(^O~4JF@L~UzrxuZY309s3BDpRa~O{?W7Ha_>csZ5J)D9nJSZM2pf^db15?c&4zNn6s_mfy8b?^Q~E#BX(ZN$6t@ z`o=aUzrQgWTF{rGt1nKtc`sJ?d0(C!p~_8cC`^YxH`mvq)qo*B2A#I4wnB3&A2OGv zM&F0S1GCf_F%5YNb&ec;6zZ=1ldDi?#;G%7AIJd+ZHkBDI0R0X@SX$q9te97n+vfI z5o+Gs@W=iH&@sbkgM007wBayKs0n%(f*12--fjCD{*T?Uukke4|6fQ;T;BWni{rTo z5oI}PWx464nThi27Z3Qaw;ws=4@$GrLspO+YidpCd>WfuwFc6*7@H07RU=&V!q=bK z4d%tK`y}9?lSYT8(&!6vvf?j(pYYw`w6n)@uAV7MiLb1#uGclAzEq|8Zg0PNFFtv( zp}=WqGL#o9lfT>@vV2m|+?Q@Hb&B5bcJRDGAq(tcwz=nqUPSQU)M_+p>Y)4YSxJ&m zgTAFWF*4Hc&5$|$!siXRvD`U1>Sj}ObN=_AgyHf17lUPk6(=@TR#fO)je1q(#Id6~ zvRdQqil(YH7)ui)!xlT-oHqcWAO^A^zu9RyJkFNIUW;8YG{$2%V)&r<`pQ4`t*Na= zZ=M|&*2X6<=$tA)wb@8DWu?(;XNJiJ#&YmEO71-(+S@Me`-2F`6F0tvu^0g@f{;k} zVZn1=%s6wTK@VHC`Yl>uVx>z9Z`IW6jg)idFoXvaxhaB`B22|nha{g@<>r`;V`H!i zcO4wIbbNVUCaN$q`i6;5V`i+O)!3k_j$b!3+I@&QQkBB^s3nfsVON@}O7f1aj-4;X zcv66hP(1Yg{#j>_qV(q4vhjAqz)Dw=1x>3`V`97!p4lPDk#kIrKxkORB8QA5IqY-$ zVqna?z6gN%J+rclnE#Suw^yS^i;>L7Lk2!ARV8f6n?J>Q4M&&+KBhPUVP~wz(6FzM z=nQ12ugTi$5i5nA9B?ik9fK(S!&wa~9uqhCEMY!U5K?*LOya^(sVf{4m$dO=k-`@{ zCS3g)VHUc?tUU`5`^guLLdX>FHA1m|W}}KD&y7Ay!Kb;h829SFIGFQKvylgDX z0~L7EF;c!@Fj!?phXALkraWcsv;@y#$xFv_|OZ z>!+k6f#8e(R(k$0IH#_3OjMV<|cN#g0lzn zR*x%K>s-9g-9(jm<5w_2QpNwKE6xHHx&?|nMPDq|9h{f(`PTB9I)10u=*kM<7)VvO zOG^)WS8bhMxqVhscC_@)uyEcxCO*tce%;WZ;`c^9CI3KIx3+x$LCK|)w+oaNRkam0 z>Z%%5ZBcIh`F+iYU0RO08xmL}r1XgEZA?rz+MEPq3->K7RdoU>&yf6RQ`m9UjW4Q# zKC24~G+f$2Kdqzd`=}&ILL+r~@f}P|k4L_XLvpCTBn#XuYPPd9>NQa2^49?m zWMXEO7T%a1uFX%>6{WRQ6}MEEHkT>2c?wN>Bq{G1o}oM^qd-o2VS*F(L!7WL;)MMX zCw~Br3YbB}^;UWs90QyHd=B`+44>h89B>e@6R;kz2=Erb9?%c)B;bES50iwWMvRCyg1j^(xY0Jkeo1(v{{A<5#CfwFG^AybOHK0a%xR0X_z> zpK*P%>;E0Vb^X5p{}nx$hH1Gzp9Q?~h|R-pDZia5l4QP>M>>|Zv4OBuMGXxNR9|0D zSP_z-uCA`_p5JjE<7t4eQ$wfQN=cX0tLM}`yLbBq{J#gV&us&^1Gp}p2Rs5`zx}g1 zuc!hHh?IKw%r_Q20mhQ`BY|#qC~1$)E3_?5jUeacTmUm))k0daxbX z_q19q>Ct}bvlCipPkl8K<(~!|0k94e0nY)rJ+OTDN}R|2%#+`Iym<}kwY90SUgFJV zbhLR{aRFst|B)hgEv6tZdkS(LM#1xkn!t4^g_yzeF35E_g)DTSxQ~}n_O&x~yHF|V z&vszH;yPuY)T6w{+(hI1(Oq1c_C6vXnH<-FlGj6wl7y~k4A{#BIvw$e~AHWsB;~meN@75M9e)B?oR)VgnQ4OEbNj}qN_sR-N z`*uHtE^?G)vB(_eKAf;QL19bAQ^fZHl$n_+(Q+SJ@XKcu;W2{3fpgQ{q@zWTV9zmF zcG^N^h53>{cG3a$z`pcQ7wexO?^ghSz)XNG;BJ1zWB20~iJ=8ewdJJO>m^&TO}Ku` z3vx()zz1>N|ki5_>!qTR8c|XZ(7K877z&Fw!mZc6M#EojfXRSJ$(SdxUspp zN%9*@KU1#ErnqhMO>(1LE+5-HlH6EFC+wRLHa6(OzV&qN+BHdEgTX+pt*sI$PalwQ zu{>Di_S`&@^*h($eMl|ky?ENy}7595yUQ5&0|A@4~5kI`HQ9D{KkNU1dP%K4`9 z0^&MvYqOY-W_-JkLQ#ffbJz`AS;XaIJ}$|O`5##zYK1dhJ#}0vpY5;0xRw3$Ny0=K zI3p#Hbih5=8T%a9MY|5eur#`vs;ercI^=$X>!7Ln7RCMYO$`L)I@kr^7=zIRv2X0f7WH?R#d`f{DI&v89=)FIS!G%0WV+_?@g_HfMd?BAcf2w{%_yaC)7bpr_M#E@p!K`a5-q+wMkHrNxpTTIvA5 zA3>K+etHYyehF9y;Q0o(V?mQ0UuI~mlYGb0XWohnq6p7Xush2>s)Ouygq0qX4tL59 zed3pmqa@$Sl=Q)5N?tRSu&fLZ=KZI9AUC%GPr$(X zl(27_5fgKHY=8EjvgqFkd&BLrFCIhK(j;u--rIK|f8@$Zbp5B(QoLc5Hc^Qh^OFht ziucrk>(bMtUpL*gzEsV=3M z4t8zPVNA`6H$d($0c!vwb@@q6mh~;RR}17%-@SkmmW(CEGJ8q_Uc{A^*```Llfcx z#HEm%?eA-rzu6+cR0oKevDHqA%N;0rg(Kkr0Aa_Pu!W8`!2W-K`B{f+o80Ky#a|@f zwfGV9u9XK-vfpc+b+E_}-rUCIfH>&D{YK)Jxztd@b0?kT7p+*5L?1+uo9Fu+%MC-{ z*-3tCZK0fxJt<}7cuMn`02ohLzeXLvhyI}atiyGG4+;wjYHQ1u{-{Y%yHDyvAvedOivfe-KibwN^ENdb38~=73QAw? zM47%50ZxR)Zq$Lj)CT^D{UyJK4#8X8Ngf*`*^leN(jKZKFOVFvGM-8P(UR;*uo3&K z9KIV59a49?Vb0xXvORp;h%pNO(+ar{16%?9u~J-STGBSj&i^ZZ*hATVlPPB{z;6;| zL5H-JjwT=Cc7}5QD1_`-O!-;qQr~8gAA=1kKU?1>Ki4ZZ4J1EJhOZ_rbCB9!)*&B> zj&0AW6)U^EJ_fmYKK3@iR+AZ%WKdU0`Idj0$R8>H!`Dc;;dN5tiW44`v1$UPz&3xz zhge7MlR}Sd{#{$BOO1q__LA>#-@x^Y4GRF`5BRGBIuxBfAoal(xeN`pR2X@+0dj8v zOaVOIkaF`g(;kZj3)e~|6>t3~;UooMIu$~XoHfp-I*|IIKUW7azOPYHMzYjDTk3%4 zcIsC69;v;ht$LL*H@{6rX@kcs5$LdEKzsa_ z-h|w4fPsKVRk4@5>7_o%a$LlWpYj{k?43ikfa=}v(CsZVNx6P1Wx_sjyS+&+my=Sd zl*UG;;5kOJ-|Kg67x62ds0h2smN89=Q?T}!eP9XtHV4AKnpD5JXm8o!0SN|0R(M!oD@TJBEW<0Pn3VT}TBz%C@o&Q%JGt zT?)H)MOsVaxJpVm)P?=YyUL$@bSD92i1QvkIJ{r zlG^souMSD;3>JUpats*XZ~c6Xunj52tN0B*N;~RD)rGl|?=TMQz;oM@gqxJJ9{mIC zQT)*xQd=wDG@S}IPNUijhZ(g!vG0^-)8Wk@T!q}c{>|&UJa=rHzw4Dr4ctHdE?ves zsIOKMeYt|@vqhvueN^q7O)2{pQ|OHlDOT=GW5hanF4d+)P)&9s)~D+wf4AVU@9=tQ z(T|6yXyfaWUs~GPZS)!ChrHp8ys_Dya1@Oia^)QN@Vs$2pw0HUmr`xQHIJrSxxcRi z-k!suB|7&Z(V2C`$Cz3Jyhy$8eM4^4bFRFE{p|Otg6OxML{|Zq zw?Ur`M5la6dtxc2|MEF06bfnGhTG@865GA3tc)shQmFQ;52^8h3+a!zOMa<4>`n~_ z=MyQ+8?qgkw8AG<=`lLU$m7+E0G_kobsf4Y=JF_gVOlHB*LC1vxy8n56#O#!C{e_x zL_zSYUp5nczmCc;22fU9gtT^^o}Nyrsi_k1T6#uC2Ib`BP*H)BYT~a^)AykHY%$Rn z%i)*sNxt%P(nU)_?N{^(`l58>p^sJ{hs;9(j|1*pcf+gp)R-D}u(_h>E`DTYn|ltY zFTTa5^(olvBvIrcqHDWRFMCNJ^tm(^ltf&nLWb~5R2p%SYD3RZ>!tlfr`HgjU61

    Kc9++bfW=J0=U2Yo!{VHr=-h{leg4$jww2@Mf*y{5sk|@ z&~XX=`ZH1P4}=A0qPPH}u!E+$VPE@o2mB6jZI|g?$UdSQpAdz7Y|=UYYp}h$&vC3! zF27L;!Fb)g7vK-cZc#*+rzkL=Cg>!3=Z8!T5|KE-iUX+X5FAnXjp!D9xZp?Vbebp& z^^^e_xvo;bB1-;(Nd6g78uT@mb!OG!iG98yJAr-P&MbSUzS1J&gRc7g#G)2e1BRO9bAb-pD-O-GiS&U5&N>1kKx1otz-wANHAh z>7vbvi*7D2H2(ga!aW4|FTUnJqq(ZYSebaU0J8K2a39|V@IZeD&V3Ww^jE+wON!gAWP0=nImH^~D*j+`qMI>!o=qD&`IW z?|6irS!ZsW&4^WT9;+4W`ju&yzvXz0$0U}U$EE)fxxu$ns!O%~_d&$$n1DpMNy#E-r(wGMP=5i?Hd#PI*(gIa!VGUjpXwK=g@ zrMf9hsh0HOYe8}e`halcZ>(1Y&A@zv_ul^75+Cf9ejhCq6^GwHBY&{wE0-|A{5x{J z+poNM$G^)4G7y@7j}5;ESIEz}hVoT3Uxf!>{TUy4{(Qkzy8Iu!`b!12mmkW{7Wr{4 zP=V|z(<+uXs9p=P^U>?|F2Mn3s>wfx>(PmtOI{=_*gj-$o{ zcpc_vz{L*mBks2Wcz?$RaA$f(Hv7$uMe>Mx{t7}P&fYYZI0smEE3WeZ#spgRKK zn49|stEAwIKWK0sv=LoP;t7BHb^23u)zgu(e>y>-bNbNLcl%QMPhXG@`TQl7*>6mV z0UfW^{NsxQJ4e(*K0WfHKbk|=CwHT$H=m%eZ;nbGRrVq5)lYkjew+L#DZrcY@P$mS z4n9NRjqj)w@xE@>>4OyfT6dB!7(#NlffT>gp0f5YqPY13DPh52igg)CSEu%*!q{NK zSJUX|F8>_R|Er-8WkcsktZT=~UL?grtnJL}Lvec+6OL#~Yg=)1`w+fBMB%faqv&grlpJF!w(xY$sx8r1Bp>r3lE+GQ_(MAbjzS z@O@6!fnDpD`l4)V$ciKRynj$4(|Zmj9C@XPcY5Qe))8wV6`uT%qGvw~y#`Sf^wFqm zsIDNL>3>v1{+62Cl)GdEr7pt$>HGl{JLf+s_U&ir<{LdRZHkh3Bw@`|KG#;-GcaI2 zqf(|a{Smb?P0H5`d595WA zvZI33pntnAC-Ek}42rd>T%x_0H}8@Wq5+IOtyFgPE8+;Op~*;vs~zdKj~yOrsj;k( zwyark1@yfEf<*?ZP!L`4q3WM@QFUtb58!kIVT*mdLS^KKk!3ASNGUCr~eI_expJF literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privclass.gif b/doc/ref/csharp/html/icons/privclass.gif new file mode 100644 index 0000000000000000000000000000000000000000..0939694ce08ad44508f6f017b68e46f0f22377b9 GIT binary patch literal 621 zcmZ?wbhEHb6krfwc;?UW|NsB|hUt&r{rL9oM)d3(_aDFd`{wV%RU+Tt-(Iu*bdPSY zqjyAO5)Xs%%*W4OT}r)t^1|KQ1$X{_`1|40mlNl1p1OGN*VKPj>%-QMrvoZ0aqv=U>zv((uk1Z`&AIsGhXbbm$u+t4({AM4 zoUwe*+pV&@k6t-)=GK>oZB<oaqPkBNogHUHno4%^Ngbh!J5dZ96zXj&rOBmSr#rWBn`?Qta4AyNBlN99gXZF;U z(BWY`VYPQZo4>HAqB^H51EW8i_+6gJ+{k9ar8DD%q6<$7gRGgrgar((tRfl{0+c)& nCbWOC3iz+epk2~OYT literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privdelegate.gif b/doc/ref/csharp/html/icons/privdelegate.gif new file mode 100644 index 0000000000000000000000000000000000000000..d3aa8a65ef5277c6682f106de956da036c50d363 GIT binary patch literal 1045 zcmZ?wbhEHb6krfw_&$x{|NsBD3-0`y@q4k|5=ZZdhfm);e)ek3_S5^0UpsN`=JQu? zFQs0-|M=CZi}!XMxOD0IqaNMfjl0hJCs*%1c5Tz{a|>10-$^W=rQx9>k+>ALFmyU(xQe4H?EgI8Snr_bMJEZ?*H@RcuL ze=OZ_+&{Ty;o2jswjSAiIO7^wyn6fTZ3ixeXEp6UdL_BEH>IrC+CTH&qnA?_ zZr-r_?BoSIFQ;Fbx_Ik^d0S4LzjJZVqo>#39XfGw&#H^BC%mcZTCnHn)n99Wox5`H z=da%fPF&x-_rl%7FP}Vr9h%+{U)V8w*_Mra&Odl`_2jZ^p&5-&p1+&CaMzAQm*=cF zU=x^q`R1Lk-+rv!ekLNjxp&UC=}Y#m-gbJC-Qv>LIg{q^j4SB0@XI)R`PRnW=VJ5Q zXDr?K;^v1fd(Y(7PdmEh)~oK}Z+;!hSv z28L-2Iv@i;d4hrC6N4_N%!&qId44W7EtMCGCW#wQIi?e0vCxHsp-kl9Op6K4Vs;D+ zcRp^uaCVY-@DqoX8Ynj67>A_%qWsZWPnuD}Kw%&~mCC`=#izx;#2uhqQ1RGQZ~`_sezFVAOg+I?={@oQh6&3J#O_0`3qcQ@)kJ)ZdG+03e*WmVnF z^Bd>vIB@CF#g+GVc;49Hc?*VhX^eEL$_I;S?t z;q-yc?{Bw0JskD*+0M2c_oqi=CRPT;=C|KGzkX&z#JAUn!n2y*T&c`&nEqh9%hwnC zj-0t!6=(DDL0?K)@6G+0dyidvbv}Rpw$;g{y)%~Yxxd46$H7ahx1WA_Dm}e?LT>%E z=ORU|^GzS5cL1XHZiY5LXoA)t{s+AtlYi9Tz=Gm|uiP)WbllqpPP+ z)n1a1MVG-Qb@J5dGyP4i^w=yDcg>x@Fn~iQhRG>ed)KlRqDdT#Ok55L&0)4WTUh+8 zU7DCIG@4uk%^kgCje~tTIqkw(n`EO*4C6yN8JXA^6cbM@GzwzkiQs5z?rCOXl94EQ h;J~8BE~;=s>7Yl8atNQ8$3hiOG3k^KQ#n}}tN|oJ0crpM literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privevent.gif b/doc/ref/csharp/html/icons/privevent.gif new file mode 100644 index 0000000000000000000000000000000000000000..30db46df766c1b49bf86b168eaae03052ce8f292 GIT binary patch literal 580 zcmZ?wbhEHb6krfwcoxC%u)XR2<5$m5ME<&1wr2ZjNAHM}7w(?Ac<;oyoByBGKYsS= z!>2EQo@`jK`p~A`=l*@Vx#Pg4eaEjod-~|o^+*5z|L>^sdbOcGw|?5!19>l>J$(7} z{;?esvXVR|%-eGJOka3b)BFnAZ|^Vv{PMV`DW&#T9hkzICOvb-pxf=`s=6a*ZoWIz zncpzIeag~^VDI;PCrob+ez~A=_t7iqfi@{+eH(Y3%?r|f{`lU39rK<(ymj|z)7mD5 zrw^`IbuB!xslq?GCb_hC@3CvEx1X-eaXWu-;f{ls(#t3KCsj|)mk0WVVIY9wPZmZ7 zh6n~7kmaB_VPId_5Yg1!(%ROnB&Vz4>1!6;9>K)JX=TD-E7GpT#LsNOAR{z!GP4+i z=;C(8xe^TKMzh+PI5{=#92lIWnz-2oTv$x)gOr&WT)msw8CiG(d?KWetLrp#Tk1El zSi2t&_h{jAlx1VncGhE1P;F&n{J)Pg~o YNt8WsjZ2WhW2dPS@^dsgL^v3%0lNU+2mk;8 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privextension.gif b/doc/ref/csharp/html/icons/privextension.gif new file mode 100644 index 0000000000000000000000000000000000000000..51dd267f0f7fa11a657ef51a69cb9159ced8775f GIT binary patch literal 608 zcmZ?wbhEHb6krfwc$Uj>|M9Ey9p}}Y>Kwfz)@(n0{n3wKGk%}Cc< z_}MGFi~}D&eOa*j(7xl>E?s|g`Sz<#yU*=7aOue|7!l#yEE=pbuCOO>kH3nI&$V# zjc)DB39o7_8sE)*uj)OkMz7}o|NlqM+G+UdKH=Bu-=(c{a_gsQ z1uU2rG~KoM((a>IdQJQC8>WYKecrh1?6QF6Z*RPfE9eZ(Xq;m+*QfS@Z~c=GS3ax^ zTJ>w@@5E{UcO1MFKjq)+iEn)CAJ^&CP4Jue`SIu17hjhcRQy`^J9g6Fcl+M0-hSFY zsoJCbCeRHGWC6vWEQ|~cxePiW-Jm#OVBg!2+mtK9sNLMr*(%AH(%Bisn3JRM%%x*_Q%!)u8UTgK6xaX& literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privfield.gif b/doc/ref/csharp/html/icons/privfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..cbf70f7a3fc3875ee62d9a4dacf3a088e60f2eff GIT binary patch literal 574 zcmZ?wbhEHb6krfwcoxXOU_A5w<5$tMZ>-sV+R-~==Gp&`pS{|2ck;sB zs9D$d9ly5Yz@<&Q&uu;O@WZDsC9Cc&SbgZy^+%N(9`8MN?Z}y%6XtD6FP{*e)in3~ zzufw1b5DMnaOB&iXFs-|e^#^Q<&J}w)?fS6ec;Rd3;%W>y&~tgvS#!1OV55@eerwW z>8D3;f7FcHFk|_i)!R>>ef+a_)6>Nl|83lLHm;y^;^B`~T?=Do-)Ne+#58$p#rnq@ z;p=xFzH;Qut;^4U{r>&u-rHZLt#eY!di|5Cv#KYq*?aHM%@6qv)B6s6UU=bOMceF@ zvc9J6ue$cWTYU13e{xOrrl-$8{{H{}Kf|B_ia%Kx85jZ?bU-cw#R&uZ?1sRm=9bpB zHaUZU_EvpM9})YWCR<-wR(BDN9!-B`R#p!gogQ@)DOMGBHHIERZ+1g=D~7d!0-U@? z%mRW;3Q87Rw{bEu3yGSVF)U@oS6M zA3Ad8=A4!LcOSW$UOu6=Z^@K}JJxPL8J*X*|M-=-g3j&xFKyU)V)>?{I}TpXZ~<8FFA!5q?GmgC)b2$HO1z)FWq>|KdHLBV_s-R-W7qZ^xtdtqH)rL+s;-4+F5gKh>zlEBk85Oca%u1E75ir{-(B0g{Nd9# zy|Xv%K71v)w13l{a|_oV*|_WMw*9Ab>!+2r&Z+KNvj6DiBWG>_y~!{@K=CIFBLhP? zgAT}kP@FKZFKY;IYHn$5Yvu6MkYR3b=1}JKwsGk75|9;ZQRHQ1XO;2{7vK;Tv@llE zQ8i=dV%PEww-YrK_mH=CRq&t38YmJjCMfRI!tAads%9?~&cq`ez{u3h9AYkVE}Vyf zQNq@-@4U1N7Z;=E)pj;hOKxsmXSP0WhVKk~l5TxI3@i+?J`E2w7#dhugj6aV4hyoe bg&D1>Sm4~I%pAO=LgC{f*1gV+3=Gx);f>!6 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privmethod.gif b/doc/ref/csharp/html/icons/privmethod.gif new file mode 100644 index 0000000000000000000000000000000000000000..71f882264291eb056bc55dce1c73f9b7cae1aa4a GIT binary patch literal 603 zcmZ?wbhEHb6krfwc$UHN|NsB{k6)edIDhH-BS-IuHQP_0ICpc??sJcyy*hRA-iJ?L ze$DuO^1|H}0V}UwUGr|~``!6_zJFLf1uPs=8=+o^_@AkcWyykJKdg;o5 zRcp4cO)Tnsaq-2=r>kFIe7)n~r6Xr+a6D*XPzhEogdr`Gor$?uTbJUCqDx;p&H8)4r=Su0A{SY{rsxbq4hpvo3Yb zTvysUr$(=)P^IYQgjc<@*Zx}f``z64DP_I$ZRY>}{pZ*0-%~B7olZY9f7R|9-P$kD zzFf+_TyN0u`SIt=H*SBp^5M;;Hxv9OR%uuJC)eygd}Z&kYjFjgZ*RQ)wfgsm#~*U* zr=^tj{hIlEj?LUh>mU7^|NHgCHwTZbSrxH*!n`dPb1zkO%w4_xbbkF5V7M_*11SDv zVPs&)V9)^>28t5~_8kowP0cN0Opz^}&217)zFjT;OyUj+rW!4Rd|Flv25}MG+;&V} z3=@(B_+7bU)B_m=<@ge%%`?eE&*(~qUwlq@F(Tx>i;Nlc!XZ6ca;`P?Fa5nK| z;ACVKW%g*2m2wwy3o_2xq2V9{v&NLh ymNqX2CINOIi^Cfn7?@djBrFazCbqIDYBX3REMswIvEH(0gHSS;U|S;tgEasMh7D{0 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privproperty.gif b/doc/ref/csharp/html/icons/privproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1e8074654b3fc0601b0302f1be7b39f5bf5eb7b GIT binary patch literal 1054 zcmZ?wbhEHb6krfw_&$T-|NsAs)*t!*_xJtBuWIMsU$g!6|JQkr-VrCx-Te0d|C%NJ z|KDc#`iGpnaQD>3dpizXdi?CwzT?+6?LK$##HE5n?}9|H1*;ETy8h_kiHi+|F+YC) zd+_viY3rPnvfkYKX@^c;e);mzk;$UQ>Y{gVUU{=ZaB^$$wHr64wgkWb^84*^@73E+ zf4QE%Zbro0!wx@w{k?ZEv8rpKe^T|Gy&(BuL?`9o2b8GLhYo9Mg{CZU6pIo!!;H4vHZhpI+=@Sqfn$b98`JViS z>9P6kH|{<=asK9nd0XypGDaQ4Lh`rPOfGiB|kYwkSxG`b>k*`oNO7)Rg0u+B-# z18g0q&0TV2$JD1!?uTbJ)z&xlObBqCXS85iLwZ6`cTr$+Y44wZ{}xYgc=YVeuU$%d zicHs5>iJt4eERnH>E*U%2iKiDb?DLAsx@mjMEZuOl=c1m{r~U3e{*)seD~}B)7PJ$ zz59LO_{HV>mT0EQ{QLiZegvM@3* z%wW&~X$9p829DnhhMY%Cj-2iAu6$vlInmK)kpr_~;3LCh4M#P#Q*QiBR9>`Hk~>1; z#zz(RF58Sgfryzdj{U;ie_|$HYU1RyEas3fT)cpz)v;7;1EaHA3%^t7xQ zt(lQk$EC6HC36DtS^a6kC&EH94>aBumn&dwYH7?jjd&y?(eQwQiA89WOHal@#wi@3Dl0lR)+n&> P$sO`(a%OdMV6X-N?RS8o literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/privstructure.gif b/doc/ref/csharp/html/icons/privstructure.gif new file mode 100644 index 0000000000000000000000000000000000000000..ed6d1ef68f8736e5c05137be2af0ff7714ddb85b GIT binary patch literal 630 zcmZ?wbhEHb6krfwc$UZT|NsB{k6(RzcjN2h?jGIVhpR-szrX#Y;OUy}ryac`8k2Z_ z@BIDv-H#LJZvJ}l`*!M`Qy1@@ym0sat*<9$h(CVz>ir&_-|zqIIB@CG^+(RdC-)t{ zwqW%k2IHCEUeEn_%=zsWiC@ouZ`ytC_q#uzZe4l1S>nT|FQu(>er^Bt?bY0GYrb7d zy*#gi@9oUD{z=t$my4#9^~M!+KB#{9Vd2N!hp%khb@t2cQqTF1cOShHo8O*N)>pXg zHH@xPxjsT^kdVHrL_XzU(fST zu9>&-#=*NkLo*uhoIn5Zxbw$14}LsZ{^>%@yZhUJzFe1EKP^0~>Dz{HpKp~Oxc4o+ ze8Q^qrg}0wC#Qc1@2^f+LqyxpDEQ|~cc?>!rt)MtzV87gu*Tlfa%EZvr*_GGAsv#WQ z(cRoC%WNv#-qY2a!kl66Ka)XhQXUiQw9FtmQ57yG_N7gFp3D(BYvs9=`MKGZIy{&| zas!=qE3_;~z{nwOo0cu4rD^0GYsjLS9HY&}k>n#O z<^9_#Rm)yEerz82^S71ck}Y`NGQz`RA_YP5iejl$gyCd w0t=&*O2!2Rm&vL;0yA$hJnU(cRXnwYAz4e1RXB9Zfenj}c%OG^WMHrc0AYACZvX%Q literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protclass.gif b/doc/ref/csharp/html/icons/protclass.gif new file mode 100644 index 0000000000000000000000000000000000000000..0f9294292a9b5f94a281de7657b5555d06bb4a96 GIT binary patch literal 600 zcmZ?wbhEHb6krfwc;>?J|NsBT?|$SrO#k-o#@{!8qi5gvaUU(s18H{JnJp2FehrhQA?)+N&>)iqU6Enm=U(5M5fY;zXP32Fyxl50uY&Kx0h7BEa_ z?`}`~_jQeF^42G}kG*|#swZ3i{XYG#uh+de5exJS!%zc?KUo+V7+e^1Kn@4R2?P7q z2A3um22KuUhUTv3Rt|a5j-IYweO2iRO$>saEp2LIin69W%r1i5vwPJSD61@SVc{0$ zW?}BrkT%y`zfo9Rh>wBUOiR|0hv}r@z5^@__Ply>21}VX=$>`4;I(99Gf{H6wt-Kg ziPy=-fn9;?QL_XqqYJM!8#}wmyT^>I0@{ov6%2_E_j}6!DimmZXz1u?W)nFfFy+ks jL+qbB9IhJYjEY8z0)sUGw};FY literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protdelegate.gif b/doc/ref/csharp/html/icons/protdelegate.gif new file mode 100644 index 0000000000000000000000000000000000000000..b209f2d816d78188dbcd93907917d7a0ef34eaa9 GIT binary patch literal 1041 zcmZ?wbhEHb6krfw_&$N*|NsBD3+~+A6ZPXp#$vlAiyQQQ&G>zJNB#3xZ!e`@es@5B z!P>(;y1i#F-}-;v$UnLI#LD>oJSE4_{Mix^8B4gbm`4|&u-s;K7H|8YyZs6doR3x z_j&TdT|a;QzPRU+cYNjj^Xpc+uA07N@6j!{KD@sF_1lk==kIRVefIw2S1Y%i+_-M) z-ecE}pSyD{_tJ!U8y49u{fPP+3%f) zFMoJ(?Q;5+wL8vCUa)iavMt*WUINA!!ziF$2q^w!VPs&Kz@P&%5|k$xINmWRa>{fl zaL=>hVAE3JU}|3=V-}|qvSL}Us7ElH;!KMVf^0?;7;-c>3bamE^yxBiI-JPZ%5C1D zlgXgT(lA?dhsMfcr2~9UzGi0{Ltdygs2goj;e4RvFx{n0&S6)vf3EF6*!Fv!K9+hCZoKv#l4gfF7O*r}nJDO8B1BdLL*QL>%yjiiD@LlaY-SSZH> z@l#x!T?!Tw1r}#TG8VDV9AMK_f%j88HWS`1}G*;p8?0XW=!tN;K2 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protenumeration.gif b/doc/ref/csharp/html/icons/protenumeration.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc96bb635982abc9d306f219ebdd71d29f95757c GIT binary patch literal 583 zcmZ?wbhEHb6krfwcoxO*cwfNXJyAbyWGrsbORt)`XI}KX1Nx8l`hR;p|JB8!{ye2m zk0*Y4Hsj0lneXqkzPnNX_FB!CXEVRQJ^%Vr>BoDW-`_5)>RI;bVSiQk^1Q~`_jY(b zy0~)tH18W596!9ie`%$~|MNy?78$<2Sp4<%g8arg54O9UKCt=oqt(k=EpDFOI=>_C z^~1B@UY)qPKlAC~sLu~q&1{HRGO_gO(U`_G=gmtdytz{O{&s73q0h$$edSS>Z8`2O znXX@-?fm*?)7KaKUYv;i_jS$9BQxKh=+*iB+9Zb^Gs7O8ZGCe4*rPpu?{7E1 zJe@hOGymnO^yk+$KR=Q3;`Xc`Z%*Ie;n|Zd|Lygmm*=Xh;%pvX-v0XbmZyg!|NsBb zKwqHvlZBCiA&NlUeGH<Cw3dOhd6|LdLB1d>tfmE9rf=H=>LCGe_~~Pf1c9Y zN2i`Wee~h={r~5U{yf?6e(!{TpKh+3o^ba}-}A@!UM^@{)@m^|U;ggVrVlT!J-L1C z-R)^#-)ySPar^!2$G7*FzkmPs?oj7~Znt-@?)5aqoY+)xdVOiOzvlA`ookyEUYv-% zee250RdruquX}!d^YrH6Z=YVqxf{HEdVl$pglFeFPwkt3Y{!I%VDAH)`d=)qdHV2H zN0rz4gA0FtdAw$N*6YVto?c$vlP%wqq4enP)mIzppFX($@9UaRXQte{ac+Kv?2pg) zvXVT$9>{z7?BR!Flm7qz&oIb<;!hSv1_ply9gw>~al*hpvBAHoxuvzO*;ZJ?L_*ch zrrn>JpF`1-!Cax;i&>CWhryd?;$&7A2J6M`@^gI{l(Z*K;^1%>5M?klYT{;7<8%+3`kU9um%8i0?sP{ literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protextension.gif b/doc/ref/csharp/html/icons/protextension.gif new file mode 100644 index 0000000000000000000000000000000000000000..dcd07f5e1a673de3120e3f82e6f8c24f8bcd723b GIT binary patch literal 589 zcmZ?wbhEHb6krfwc$Ua;zT^Cl8yR=^L@jR6yZ-3MV_iN9!Lg_h0dD?)!JI?*07!^J4C$ zcekf`l;3>)@T_a`r57h+f6e|~XHfs-_OS_m6My~sRi$11?bFL;trl$?{)cpY`0(P| z)%>dtImdfV`@X)}RHIk(Y{v7RZ21pYKGf;e?J3w>yyX9{b-&}M{F`Gl_uamCv6KFK zRNVBffAV_bo3O6WH&)F1@c6^Dpy{RRr6o)MKVI`#)q9p!z=9gx+OMzI`P4l;y}s19 z{_#|cX}?zgUKX%?zRmo*GwwY*^UOSc!>^gYUtfHkIPL$3s~`S-UE@>x;Pd0ppB{Yv z^6X2WTmSa1mX$%Pe$D@VG3(O*|Nj|i1{8m?FfuSCGU$M80L2Ld`>KY-rbJ!_hvtsX zRu_iI&Q2o+OEX)BsQzXKQC|)Y5r*g)iGDm>3LL=(%8SILmd1-a>Mx2*&^8H(u`pKg zv~q6dWA);!TW$=&E7f#Oe`l$Rxz<6f%QVnvsc#lR2=N-PEp0 zi(iQGm23xlsCTmx6C<+(o1{U3LTkHh1k2B0^Nc1&4w;G#3JX3QZsO>Wahl*1IH9w< MpF`rM1P6mP0LI|@H~;_u literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protfield.gif b/doc/ref/csharp/html/icons/protfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..9ae6833e0821dae813c941500d1e12a88c7c334f GIT binary patch literal 570 zcmZ?wbhEHb6krfwc;>;tU_A5x|NlR3WZc~owYWhqdiIT(XaB!DpnrKs{iYkgqh?)y zetq+ocMndijNf|XVSk>|hu8NjH$0wu^3#VG*J`%B{P^up-=WVH>mS!{dTN@y_21Vu zPp@u~^IO@q_ubdm>$(qo`S$7MlMla}w>;W@{@MRqDVk9m-o3illPzDl;mP8Q{~o;i zGvUa$|L2XqzS%VQ*xT1%{w%!k@5PDO)9XtQ-TW~B!oPR7r#(B<)Vk%-vrm7Tw!eDv z@z2rQA15CExbO7SHGA)Ags-pO^mOj|e=)OftiSf>^~1AIZXa9LYH{h=PoSq5h5}Ih z$->CM;K85+ax5rL7}%#bcr-P)crdnhG&3qnh_-h&F=~m+3hMWFFj{G7vxy11Pq1*1 zXJa!EQk|e@39u6a3Zboxf5ogJLn-A(TF}ZO&v9g|F zu=S9ZlTv5aVNvF~wvVrg!<31cnVrSMnCoe?Fs};JTbCwl2D?^QW+sjq4K62+*_N}g T@^*Y=aB^}~kW%AeVXy`OyDG~U literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protinterface.gif b/doc/ref/csharp/html/icons/protinterface.gif new file mode 100644 index 0000000000000000000000000000000000000000..a1b96d2c6a0b681cb6d65d30f8e212a3c2d29081 GIT binary patch literal 562 zcmZ?wbhEHb6krfwc;?OU<3`5aJyDAr^e*qHzj623`;VWm+%v`?v$?aqRzOH$9d)n96>o)Bhta8)1|Mi^~NxQF@vOm zFpg~@_}FOOyjstQ&;S4bA^8LW000jFEC2ui01*HX000DJ@X1NvaHVQ_1K!j%1YSl7 z!f_N1>3$&4x&a`esrtx(3nZYOW9aw+9|nSwFt7k*i6}5BU@#N{&QsbXpcV~;Vlpr` lA6`ZyJSHd3NCJW(HUuSx#?^k8=*4}04GVmI1%!PO06U9(O_u-w literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protoperator.gif b/doc/ref/csharp/html/icons/protoperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..2cb75ab8b05d4b8d65401c5270ae31836ce04f9b GIT binary patch literal 547 zcmZ?wbhEHb6krfwc*el+|Ns9VH!|+-iCWyCcX>zsy94@eC70hmI`!t=#}BXX|37bZ zVrBfD`%n7wl)S3$oi{TqY?_(4!sFfTX;-}6{(W6jyEikvaza4Ui(`_)xl^8eeY5H7 z>vatWa<`xT8M)A|CtH5zwojcaUd`L~!Z)!hWtF#W`d-U~El+MAtK5~6TR*k)SVdBC zw@-X!Y1^C+FRn#4U3bhm@$S{V*!+%NTUVJzuYUdTY-s1F=hrt!_y0V-zBFO#f8&T{ znd<^isVOXLwRmwNHax4@J*u>DOEkmK1d2adzz){|k)SwXU~gz(Xlib0ZRXKz>tYb# zXp!h<5NolW$Y9jRz~5wLVJ6PU*6zq4JZ*U!JBuZ^v8;k5n}MpDi8aG2DMm&+^NB3d zBJxaJ%=?8HnV49am6~OmbQ$!xxfsuwwrDhKGpI8$G8;B)i8`ssF*r0mIHRcFY}2g# S#-5k6Rj^5?<@@qR25SJ^#+_vV literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protproperty.gif b/doc/ref/csharp/html/icons/protproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..55473d16e1321bc3e4cbcb5a165f51a55f9f07a0 GIT binary patch literal 1039 zcmZ?wbhEHb6krfw_}<0v|Ns9*>yP~Z`}@a@jJtcH7B}eC&b@zmNB#fTdA|N3?+)m% zS;^7aopc;aF~qSuL)@dr;_n%Q4680UFSixNI0mLUEZ?`} z#fjKI|NeP<``x{HCBWA4%k}hc51ZeA`ThNF*3aMnPp>b1vqEsyu3Ha3{O_ETIk~lX z-HeEP2NTm1f({(NxOUx|ohP4OIC1FT*EMe*ukg1r@C^+6_UWZhKrk1(z|V(8pU#J+ zhWY<`z2U@6*`93qx38c7dQ^1w#Qx{kHwUkAytY!$e!8Z#0Qaw5N-tkNdUUob(l^}4 zKd3%8`p({vmeRPNkL%z3{BNu-dg$ck?WaC|z7%m}$JFA|njgRZww`HSJiX!D?aX6m zj_D~fEtuBu_OQdJSDO-IVqZTz`|9S@2e(daUDkNw{LN3_{{H>2Wa z5)tO9PzZ2J_GH&-Ss@Y8nantYm#1ru=I3P>cwO3fRJb-d9AnnClQ?kWF^jXjXc*6g z$c9Ia99*{BJ_t@;!YeGKpvG|G(^D1(UXfKXou3^abO}bWaxgF~Xq_k0z;|QC1jh&b z3|Wj1J{Gi}W3*sq`!jP<22TS6qn83-LBoj&>MSxM0V#~@8yqsyc&rT485o(k)WY3j zk_{(t@v*f`TYRGLDcgp_PZFFH92y0f&hPLzaGOJjGe+eKpX|mT4oo^q4hDIDIzBZr IGBQ{L0HyC{fdBvi literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/protstructure.gif b/doc/ref/csharp/html/icons/protstructure.gif new file mode 100644 index 0000000000000000000000000000000000000000..af356a1db0b8e8821d2f6c94734b98354875e85d GIT binary patch literal 619 zcmZ?wbhEHb6krfwc$UoY|Ns9VH!{AxyYcwl4+i6ziyQQMbbBAJ67ih>_({Rj@9%G4 z-ckScarf_?zZ;Wy?(T{D{rb=STVGGi5Px?-|90w~Z?ETmJm&o8{h#-HbUxj>Qn>Bo z+bt6Pc}gc%#yc0E{D0o)*}2x=@BaLH{`>3eb$8C6fAjR(+szV3uHFA~tK`G$`;jYO zo_X;3?aa5^raC;Re)xImr+;79EUgtdc=Pp#7uW7C7yW!b?c;Ih&lh4oUyOO$@%+V! z*k!F2ukX$Le5>Ty%{}+ZA3SM!viAD_d&T$O-JUkjbbj>g8^7Kkt=jqK$EF|OUd?^` z=+xFD_rBaN{d6Jb)r41q|f1D*d+M+lPf8BUilmaDT_QSMz?o*$)gT1{wgxpDc_F49N^SAhSVn!oYr_ zA-Rcxi=By~sk1A&h22vqqNBUHRg}j^sJ*AFH<8EI!fYmk_@rbe_GucvViIb6Oq@%b zOoDl0%-2fuNs91tDs~tKxdkSf?v~`_<@FFb$fV01Et|lnaym3tUq?jAi`#~g(b~>c z&_66L(o&C&TiGCrU!K)bPSC~A!JbWt+nLFx!eAkT2=5Ob4nqdU13i55Od>XgPq~?x zm?e~$0vx!9%B@<;gKug_44ZM@5qqv}A&K6gC{1vdDqK8UQ3G B8EpUn literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubclass.gif b/doc/ref/csharp/html/icons/pubclass.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a968ab633207f47ec5e3130ec676f0d43598bb0 GIT binary patch literal 368 zcmZ?wbhEHb6krfwxN5}k|NsAQ?`}lTzVZ0okG0#6JX|I6_s!pL?{8g7z5Mo8Mbf(8r2 zp(R0XIx!l@Rf3{yHW~z|JTT0ir6tMRSy-d6W0S){R=L^}M$Ar41`Kl)d3;!=d+P}E z3NrF(N$K-&bt%+03NkRT^J(+3Gq4n@_Qg(`W;COaS31~v-h5AKCe0;2o(q_n1avjl otTWmmAj8DX?Cr$DwQ<*;tzL4nyP1!AF&G}%w~yhJrz3+k0J6oL{{R30 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubdelegate.gif b/doc/ref/csharp/html/icons/pubdelegate.gif new file mode 100644 index 0000000000000000000000000000000000000000..0a43eb261adccddee2206769150a9e2d964ed136 GIT binary patch literal 1041 zcmeH`{WFsR0LLG0>%7DvcU^bR#jQK%xKkV}(m0l0*4uHXy30!^gj%}Nd&*TyI9D<@ zvNh&y4`a+Q^=w|YC(LZ@1(C@%8_USsGcV;o=nv@o`{$R>=e{RT;ju>(oB$_ajSB4S z?2Hp9kP-_cv{GkSkR{361hPEe{IHnYgYvO@Za)p|{=Kq({`%wgZh2`S#V}j1RIsSn zG6dOdruCn`mi0N5A?Rh5*9uh`YLGWTss0+9mJ@aLUVa%@B$>cnO6Lh=jK;n?4p`kJ z(i_ZMTifYRixe5MrRCKb-9m56SjfdRc<6idjpwCR4Tg6{G6U4i&QHx4wEAB^W{d(@ zB^hF^tga&b4!;L5-Z7-T}_>mGjR`LrsAj0w1HTP=p6nY#WHr%q^+gG;Pa{2b1CXc-3NLHr%U>g(W;)*VhPC+v6*Ex zP-FXG@p~?n*#fqLNE2dST9qe{EH14un??M(;rA8oGL@#YXLNgeyP6|jUE82A8x~B< zYwL(sQ*W_s7JgzEGx!hQR!Byshxr;~;r!UGaRIEPgFWJ*i7Oee*qwt-{2`-h`HM&~ ztk68lrOhf$H?j(2lC!yx%rI}Jh0yC-d%kzi6_j&pBkOoVxk|~ZZGnvoOI2)95uMZB z$I8s1C?>T0-ch}Jk(f>XsWXoM&_`ar`!^`?fB$U2V*_Oc093$dm)QLTU}FM;Y~7-u zZ!RvVJ>D3S82*SOKk|uQ$4DFjJjJUNE5%{l03dpr?X=G|;1!ZWM5S82cE}uf5XFY^ zQ9x=zr60x%=XpFVoTrMO)1vk~^FfQ9X$3hR4uJ=NMeS?HzyRy)X^(@D9XcY=$|_zs zSmNS;LFEkHcP@3L@-V5Gxqf>ev^C`97msuIrMf~1QhX%SKhcEJKTffKNw}%Nk%$Qq zd7kJadkcv;8xp}&xLFhSR`TXVl3grTdMLMuVDApotZUHj_$OW=i!UNB787i>XOA5w W!S3M>-YMZwV($I|X%HF(1pfiQ@~q|n literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubenumeration.gif b/doc/ref/csharp/html/icons/pubenumeration.gif new file mode 100644 index 0000000000000000000000000000000000000000..46888adef937f09868b1aff485010ad847625183 GIT binary patch literal 339 zcmV-Z0j&N(Pbf!&&RmbLYrp^5KtqjHc?* za^l2s<;7g>)_nBlnc}@q=gfSDY)AL)rrf+_?%03v-ihkZZ{W8?^yiuK(X`h>z|#7Zt2TuZ-Jcm?a$@ITH?{E>B?vC+=aBHilvcv^yZk%qA_}lr+8dCZh@Qc z+k=5-L-F8_pNL-BziE|zWSN9&dR{ztS~=^`gneQ_?9_R@tdifjNurK)@7sl*iE#h_ z{{R30A^8LW002G!EC2ui01yBW000JXK%a0(EE!iiKn z4i!jX__&S%6r$8nkQg@~(+QQv5-foTK=WC#T3itp2L%roH9i4gVq_mXCIcrPD;kPw lY;FuaM>a1!czOUcM>;JygoYO~M-8eVBIr#a7&Z+tGuQt>#pOO#}?0x>=!f)>{|M-0G_pcwfZ(ZrA@_Mnf=Gpnq zmrw66=yp4>bIF?NS=s)YSxFvu&-Bf&kUg=fq9;S?<*K@;53avl(D?lEy|qmWUk~J+ z+Bg61(Wa*lZ~gr8_}GpKpUzCF%yD~nsPq4m`d=5zo}Y+(*xvO2|9=J?K=CIFBLjmu zgAPa@MKlJCh@8yFl7ixFRNZ06KZzOwPN+z zv<(MOw%xcR)*I23_It(+G5s19o*Z-S8h+h27B({_t~PU7W=)Mr<}8BjGt3=_Q{DAPKYq>lt?WK&MZn5;OW*I#-&3bo_v!Yh%ePmOK&_XZeGp5`ugJQ8r@p0fCbZnrk_qf<6Hlv&#nK%)epr> z{uingwQcx+G3(OH39sU({EMCR*Qf5`lT%MVJpS`{L6a^97CgNFGw z^IuPVb20bQulc`y>mR?{_b#mKvrp{<89)!|G(D#{&3~PuhqXFt$#GZ zZ{k#oX?JJbD^)N3^x(63{D%Mk|1%64p!k!8k%1wQK?md_P@FKZw=@Jc1#&W&G0fUL<3?)XqgsXpxwn5}&UoFGrw} zp=^gSE5D_rwY18jKnW>z4j)miKxbWpepgm2Kjl-+3OeG=EZUBDAGz5-V`O9zlv8v% Z#l^^Np~1s+_cM3E&u2`ke^{9qtN|Sl$x;9S literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubfield.gif b/doc/ref/csharp/html/icons/pubfield.gif new file mode 100644 index 0000000000000000000000000000000000000000..5aed17576f4493ccfdb12f7a8a55fa2cbd74041c GIT binary patch literal 311 zcmZ?wbhEHb6krfwxT?dzU_3K=_Klfm|8KhSJ8IVTsr#N)Zg{-)$iwF!e=of7Z{p#P z_ul^M+WW3)`>Uh3Kh|z~su8|^-|45`C41!jR$hMoYyGu9l^dR1diL|uvmbqjKJU8z z@&Et-hi-nj`r>!@fiGtt|J;A$y=n5+`4|4pJ^5+Ek#CDH{;OF3xMuV7x#$1I%)U{x z<>i{a_kda$$OVc&Sr{1@bbt^DKz?Fi3vrlM;GrYc@1gXp(Sy%ktu684k_eBco`+3u zGHjR}lT;k%iD)!t7%(bu_c~@WFz)DYZCE9=iP_9ulaaBGLC`~irKODBPllz(&xwyg Nd(!k7GhG}RtO2HXg;M|k literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubinterface.gif b/doc/ref/csharp/html/icons/pubinterface.gif new file mode 100644 index 0000000000000000000000000000000000000000..c38a4c46a9a7603bc498664c294c7c06a713e555 GIT binary patch literal 314 zcmZ?wbhEHb6krfwxN5|3ZVUQpY+eD{&7vsdijaq#l?{g*cFIk#xtz9|cLB$xCr-*j~8#$(6M z-8^&oPXD~kdyZV)fBed}{il;l`>VT_0BvC)4k-R)VPs%1V$cC82lE)~P;Pd*c`+O~Z`kDLHZ`GDkm))4&({9xIoBQn2?6teCjWv##q^{)3yhlKQmSzza_!jd?!NB&pZmx!AK(QVR|IF|6^@a~=O^W*cU zPpJB?`{m-RrckHo(dc?Bd*+zuoTskl%;w{)5%GwFo3C0s(vtkd@g)-Cw0$= z&;S4bA^8LW002J#EC2ui01yBR000JNz@KnPMEF$1LIW=%7c@T_3Mdpi3m6Y) bKQTH02`MrHm_Hv1IXxz!LKYr1LO}pKPRg(M literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/puboperator.gif b/doc/ref/csharp/html/icons/puboperator.gif new file mode 100644 index 0000000000000000000000000000000000000000..0ebe10a7ec532625741cc8668b1126f2553cdc9c GIT binary patch literal 310 zcmZ?wbhEHb6krfwxXQrr|Nnols(WwVeRM0i9NPIQy8maw)c<$xKM81hkzP3=w|;8n zu9VpPj#Fw1>9hZrw#_+jW|+Ayuy9Ls{=)w$tGs;^tFCyvC9d#rk1DlH*wSzy_n4$` zQgL@-(@dZEO5=!S;aSa*3+-&v_nJnpcFZ}^d90##ZzcovfZ|UUuwgnN667ZawqS>b z0uLQ7ey+tr7X$^&y&alvbTCQyF}P%C2naMD{LsJ{u_oi`k&A!ZJQtmLF?n6|?Szd1 l$~7_D1)D@O#GT~o%bXk;tN}%7Un2kj literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/pubproperty.gif b/doc/ref/csharp/html/icons/pubproperty.gif new file mode 100644 index 0000000000000000000000000000000000000000..dfad7b43006984b0d27846a9c6d23d9bfb94ec95 GIT binary patch literal 609 zcmV-n0-pUxNk%w1VGsZi0OoxFqOZjN|NsB}`$kSweVyO`>u#*1kM{rn|Ltf^PgLme z{K3f4!N}5ZVMGba^OtU*~#SN;C}nU8wy>*wOldhGfC z-?B2qlNCRgDag;+-oar{IxyDd|Io<7(&G5ItfO0aS?~1wb9H=)lBYqQGU~fAU|e1H z+i8`AQ-Et%&dS31i;r~82J1CqnCh$bzU0~3xIK4DP|np>HmqGY1XMO=I;CB?f-vmTl3Ob zwWfhgP*e8dgO;77(Bl94x+41PunGqd`1<`&JwatwPwmG`u9#ST!Em?A@zv`8`r>l@ z{{E(-U;O_6j$#x`PEp?J`mC+6`TPHJTtULg)AG+&+`UxY+0;u*PN0^6jF3?6!$9=c zXSvDci*ixKxRuk{FMI-(}u{I9ZgYI|Ii=*|Nj6000000A^8LW004aeEC2ui z01yBW000NRfPI34goTAAb!|{YZy0w+I6hs3BUVlYm|${jbV@vg87~N21rtDPTUBBe z1g$p)F)j!pEl+VPKX57pIdcY54;nTISsZ#DWI7%MUIuv&DGeYNd=ys^S|&mZ0eD3+ z0Wb|qMl4f;J4oCD0s#SGXK8j#1B5jJ>;V@;Gztny^#-X40001lf(S(f6vP0ZfH7E3 vFfl`d%ECSk3!*_-aK^Am}xe((G}uY&L6G3OIA#BZnGdAnKS{;jW_hkyQl{pal#iQn)3e7+F# zey`4-_kX^eH{!7h~?6KmX}M%-b)&zODK8`Bv%2V=k|!ynfp8 ze4gq2kH?)qEd2O(=Gz~eetcf~>GQ3U$dxanR=jvn{qR!i&%1CPg|qcFzfuSnN3rm2{>v z$jq9|;iMv{Ai~7RyQIn8jYC~(l?0QVFh8$khXseZl!o*UIbME#ec^qK0!o6?Ym`q| zI~(W;%X?Z1IIiJi6E#)S)zmU!Z92#Fkc&rD+sxLL^>!2AJ2B1=tS+qLCcFj<667bb vva>O?uq!GFSrunAz6B literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/slMobile.gif b/doc/ref/csharp/html/icons/slMobile.gif new file mode 100644 index 0000000000000000000000000000000000000000..5edc31f94c61a7a50c3285ef00dcbe86e8690974 GIT binary patch literal 909 zcmZ?wbhEHb6krfw_|Cw<&~QMZ;eZ1WEjW;{;6MWq9XPP;)QA7SKm7myA1FTxMnhm2 zhky>qZ=k%uz){2?%pv2kVSxi92Q!O8!-mAe%}h)j784dUxU@4Vuq~MJz`>+3{L1~0m@lAUkDoRe1;9$K%)+a)R?z+epkVS_+3 literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/icons/static.gif b/doc/ref/csharp/html/icons/static.gif new file mode 100644 index 0000000000000000000000000000000000000000..33723a92be0a7b2b9fc8057fb6f9a2a3ee729a7e GIT binary patch literal 879 zcmZ?wbhEHb;QNUQFEiC% z7n}SzyY0{GNB_QlU>F6XAuzl`K=CIFBLf3JgAT}Bpgh6A;lm)$!85^uv7wn=Tt*;+ zVd3FsMix6Afdzk*vw)JdXGPApH;j#U@kM7;k+&W>y z^wuAltPk$pT~`~kchkxZQyRXfGPHEeZ0eYOFP8aU0_X7)rxq_>)-z%8ruFMDoj-H> z^qK2dF6~Uw+p%NUy!ne7dzQ|dzj*Jy{qIs)>l%8FB+6~*F05{x+}7UT(%Sp$*RQVL z1$(z`+`VV-`swY5cWvHL=&-5K`^3RLyVou`apL5QScdH>+WX>V>l%9-nkN1E^JnSO z73=bxUcUi?x988Dd;aX{#Okt|hW@>K_pi-%S+;WB%NNhr<-4qD%f55_c6Z-`|Ns9p z&=Dy9WMO1rh-T0M*$Ijh2KJ_gNS5f9*0wel8;SOwRxe)eu-;y0H~Yyw>~``!!FopR zvOZc2t?JC;`aM?e!YwYI){K*##LWDIqD=f|C@AVGi)hb?W)k3Z3_TL97O1MibA-#o zAjFl8V}^y0xu&Uc#AHKeR_|zOK7O4ZTP2On(E)-oa_vl_QkK50k`CbvjSLLd0ER== A(*OVf literal 0 HcmV?d00001 diff --git a/doc/ref/csharp/html/index.html b/doc/ref/csharp/html/index.html new file mode 100644 index 00000000000..c7d36cc3c3c --- /dev/null +++ b/doc/ref/csharp/html/index.html @@ -0,0 +1,14 @@ + + + + + + + gRPC C# - Redirect + + +

    If you are not redirected automatically, follow this link to the default topic.

    + + diff --git a/doc/ref/csharp/html/scripts/branding-Website.js b/doc/ref/csharp/html/scripts/branding-Website.js new file mode 100644 index 00000000000..06ab9808ccc --- /dev/null +++ b/doc/ref/csharp/html/scripts/branding-Website.js @@ -0,0 +1,624 @@ +//=============================================================================================================== +// System : Sandcastle Help File Builder +// File : branding-Website.js +// Author : Eric Woodruff (Eric@EWoodruff.us) +// Updated : 03/04/2015 +// Note : Copyright 2014-2015, Eric Woodruff, All rights reserved +// Portions Copyright 2014 Sam Harwell, All rights reserved +// +// This file contains the methods necessary to implement the lightweight TOC and search functionality. +// +// This code is published under the Microsoft Public License (Ms-PL). A copy of the license should be +// distributed with the code. It can also be found at the project website: https://GitHub.com/EWSoftware/SHFB. This +// notice, the author's name, and all copyright notices must remain intact in all applications, documentation, +// and source files. +// +// Date Who Comments +// ============================================================================================================== +// 05/04/2014 EFW Created the code based on a combination of the lightweight TOC code from Sam Harwell and +// the existing search code from SHFB. +//=============================================================================================================== + +// Width of the TOC +var tocWidth; + +// Search method (0 = To be determined, 1 = ASPX, 2 = PHP, anything else = client-side script +var searchMethod = 0; + +// Table of contents script + +// Initialize the TOC by restoring its width from the cookie if present +function InitializeToc() +{ + tocWidth = parseInt(GetCookie("TocWidth", "280")); + ResizeToc(); + $(window).resize(SetNavHeight) +} + +function SetNavHeight() +{ + $leftNav = $("#leftNav") + $topicContent = $("#TopicContent") + leftNavPadding = $leftNav.outerHeight() - $leftNav.height() + contentPadding = $topicContent.outerHeight() - $topicContent.height() + // want outer height of left navigation div to match outer height of content + leftNavHeight = $topicContent.outerHeight() - leftNavPadding + $leftNav.css("min-height", leftNavHeight + "px") +} + +// Increase the TOC width +function OnIncreaseToc() +{ + if(tocWidth < 1) + tocWidth = 280; + else + tocWidth += 100; + + if(tocWidth > 680) + tocWidth = 0; + + ResizeToc(); + SetCookie("TocWidth", tocWidth); +} + +// Reset the TOC to its default width +function OnResetToc() +{ + tocWidth = 0; + + ResizeToc(); + SetCookie("TocWidth", tocWidth); +} + +// Resize the TOC width +function ResizeToc() +{ + var toc = document.getElementById("leftNav"); + + if(toc) + { + // Set TOC width + toc.style.width = tocWidth + "px"; + + var leftNavPadding = 10; + + document.getElementById("TopicContent").style.marginLeft = (tocWidth + leftNavPadding) + "px"; + + // Position images + document.getElementById("TocResize").style.left = (tocWidth + leftNavPadding) + "px"; + + // Hide/show increase TOC width image + document.getElementById("ResizeImageIncrease").style.display = (tocWidth >= 680) ? "none" : ""; + + // Hide/show reset TOC width image + document.getElementById("ResizeImageReset").style.display = (tocWidth < 680) ? "none" : ""; + } + + SetNavHeight() +} + +// Toggle a TOC entry between its collapsed and expanded state +function Toggle(item) +{ + var isExpanded = $(item).hasClass("tocExpanded"); + + $(item).toggleClass("tocExpanded tocCollapsed"); + + if(isExpanded) + { + Collapse($(item).parent()); + } + else + { + var childrenLoaded = $(item).parent().attr("data-childrenloaded"); + + if(childrenLoaded) + { + Expand($(item).parent()); + } + else + { + var tocid = $(item).next().attr("tocid"); + + $.ajax({ + url: "../toc/" + tocid + ".xml", + async: true, + dataType: "xml", + success: function(data) + { + BuildChildren($(item).parent(), data); + } + }); + } + } +} + +// HTML encode a value for use on the page +function HtmlEncode(value) +{ + // Create an in-memory div, set it's inner text (which jQuery automatically encodes) then grab the encoded + // contents back out. The div never exists on the page. + return $('
    ').text(value).html(); +} + +// Build the child entries of a TOC entry +function BuildChildren(tocDiv, data) +{ + var childLevel = +tocDiv.attr("data-toclevel") + 1; + var childTocLevel = childLevel >= 10 ? 10 : childLevel; + var elements = data.getElementsByTagName("HelpTOCNode"); + + var isRoot = true; + + if(data.getElementsByTagName("HelpTOC").length == 0) + { + // The first node is the root node of this group, don't show it again + isRoot = false; + } + + for(var i = elements.length - 1; i > 0 || (isRoot && i == 0); i--) + { + var childHRef, childId = elements[i].getAttribute("Url"); + + if(childId != null && childId.length > 5) + { + // The Url attribute has the form "html/{childId}.htm" + childHRef = childId.substring(5, childId.length); + childId = childId.substring(5, childId.lastIndexOf(".")); + } + else + { + // The Id attribute is in raw form. There is no URL (empty container node). In this case, we'll + // just ignore it and go nowhere. It's a rare case that isn't worth trying to get the first child. + // Instead, we'll just expand the node (see below). + childHRef = "#"; + childId = elements[i].getAttribute("Id"); + } + + var existingItem = null; + + tocDiv.nextAll().each(function() + { + if(!existingItem && $(this).children().last("a").attr("tocid") == childId) + { + existingItem = $(this); + } + }); + + if(existingItem != null) + { + // First move the children of the existing item + var existingChildLevel = +existingItem.attr("data-toclevel"); + var doneMoving = false; + var inserter = tocDiv; + + existingItem.nextAll().each(function() + { + if(!doneMoving && +$(this).attr("data-toclevel") > existingChildLevel) + { + inserter.after($(this)); + inserter = $(this); + $(this).attr("data-toclevel", +$(this).attr("data-toclevel") + childLevel - existingChildLevel); + + if($(this).hasClass("current")) + $(this).attr("class", "toclevel" + (+$(this).attr("data-toclevel") + " current")); + else + $(this).attr("class", "toclevel" + (+$(this).attr("data-toclevel"))); + } + else + { + doneMoving = true; + } + }); + + // Now move the existing item itself + tocDiv.after(existingItem); + existingItem.attr("data-toclevel", childLevel); + existingItem.attr("class", "toclevel" + childLevel); + } + else + { + var hasChildren = elements[i].getAttribute("HasChildren"); + var childTitle = HtmlEncode(elements[i].getAttribute("Title")); + var expander = ""; + + if(hasChildren) + expander = ""; + + var text = "
    " + + expander + "" + + childTitle + "
    "; + + tocDiv.after(text); + } + } + + tocDiv.attr("data-childrenloaded", true); +} + +// Collapse a TOC entry +function Collapse(tocDiv) +{ + // Hide all the TOC elements after item, until we reach one with a data-toclevel less than or equal to the + // current item's value. + var tocLevel = +tocDiv.attr("data-toclevel"); + var done = false; + + tocDiv.nextAll().each(function() + { + if(!done && +$(this).attr("data-toclevel") > tocLevel) + { + $(this).hide(); + } + else + { + done = true; + } + }); +} + +// Expand a TOC entry +function Expand(tocDiv) +{ + // Show all the TOC elements after item, until we reach one with a data-toclevel less than or equal to the + // current item's value + var tocLevel = +tocDiv.attr("data-toclevel"); + var done = false; + + tocDiv.nextAll().each(function() + { + if(done) + { + return; + } + + var childTocLevel = +$(this).attr("data-toclevel"); + + if(childTocLevel == tocLevel + 1) + { + $(this).show(); + + if($(this).children("a").first().hasClass("tocExpanded")) + { + Expand($(this)); + } + } + else if(childTocLevel > tocLevel + 1) + { + // Ignore this node, handled by recursive calls + } + else + { + done = true; + } + }); +} + +// This is called to prepare for dragging the sizer div +function OnMouseDown(event) +{ + document.addEventListener("mousemove", OnMouseMove, true); + document.addEventListener("mouseup", OnMouseUp, true); + event.preventDefault(); +} + +// Resize the TOC as the sizer is dragged +function OnMouseMove(event) +{ + tocWidth = (event.clientX > 700) ? 700 : (event.clientX < 100) ? 100 : event.clientX; + + ResizeToc(); +} + +// Finish the drag operation when the mouse button is released +function OnMouseUp(event) +{ + document.removeEventListener("mousemove", OnMouseMove, true); + document.removeEventListener("mouseup", OnMouseUp, true); + + SetCookie("TocWidth", tocWidth); +} + +// Search functions + +// Transfer to the search page from a topic +function TransferToSearchPage() +{ + var searchText = document.getElementById("SearchTextBox").value.trim(); + + if(searchText.length != 0) + document.location.replace(encodeURI("../search.html?SearchText=" + searchText)); +} + +// Initiate a search when the search page loads +function OnSearchPageLoad() +{ + var queryString = decodeURI(document.location.search); + + if(queryString != "") + { + var idx, options = queryString.split(/[\?\=\&]/); + + for(idx = 0; idx < options.length; idx++) + if(options[idx] == "SearchText" && idx + 1 < options.length) + { + document.getElementById("txtSearchText").value = options[idx + 1]; + PerformSearch(); + break; + } + } +} + +// Perform a search using the best available method +function PerformSearch() +{ + var searchText = document.getElementById("txtSearchText").value; + var sortByTitle = document.getElementById("chkSortByTitle").checked; + var searchResults = document.getElementById("searchResults"); + + if(searchText.length == 0) + { + searchResults.innerHTML = "Nothing found"; + return; + } + + searchResults.innerHTML = "Searching..."; + + // Determine the search method if not done already. The ASPX and PHP searches are more efficient as they + // run asynchronously server-side. If they can't be used, it defaults to the client-side script below which + // will work but has to download the index files. For large help sites, this can be inefficient. + if(searchMethod == 0) + searchMethod = DetermineSearchMethod(); + + if(searchMethod == 1) + { + $.ajax({ + type: "GET", + url: encodeURI("SearchHelp.aspx?Keywords=" + searchText + "&SortByTitle=" + sortByTitle), + success: function(html) + { + searchResults.innerHTML = html; + } + }); + + return; + } + + if(searchMethod == 2) + { + $.ajax({ + type: "GET", + url: encodeURI("SearchHelp.php?Keywords=" + searchText + "&SortByTitle=" + sortByTitle), + success: function(html) + { + searchResults.innerHTML = html; + } + }); + + return; + } + + // Parse the keywords + var keywords = ParseKeywords(searchText); + + // Get the list of files. We'll be getting multiple files so we need to do this synchronously. + var fileList = []; + + $.ajax({ + type: "GET", + url: "fti/FTI_Files.json", + dataType: "json", + async: false, + success: function(data) + { + $.each(data, function(key, val) + { + fileList[key] = val; + }); + } + }); + + var letters = []; + var wordDictionary = {}; + var wordNotFound = false; + + // Load the keyword files for each keyword starting letter + for(var idx = 0; idx < keywords.length && !wordNotFound; idx++) + { + var letter = keywords[idx].substring(0, 1); + + if($.inArray(letter, letters) == -1) + { + letters.push(letter); + + $.ajax({ + type: "GET", + url: "fti/FTI_" + letter.charCodeAt(0) + ".json", + dataType: "json", + async: false, + success: function(data) + { + var wordCount = 0; + + $.each(data, function(key, val) + { + wordDictionary[key] = val; + wordCount++; + }); + + if(wordCount == 0) + wordNotFound = true; + } + }); + } + } + + if(wordNotFound) + searchResults.innerHTML = "Nothing found"; + else + searchResults.innerHTML = SearchForKeywords(keywords, fileList, wordDictionary, sortByTitle); +} + +// Determine the search method by seeing if the ASPX or PHP search pages are present and working +function DetermineSearchMethod() +{ + var method = 3; + + try + { + $.ajax({ + type: "GET", + url: "SearchHelp.aspx", + async: false, + success: function(html) + { + if(html.substring(0, 8) == "") + method = 1; + } + }); + + if(method == 3) + $.ajax({ + type: "GET", + url: "SearchHelp.php", + async: false, + success: function(html) + { + if(html.substring(0, 8) == "") + method = 2; + } + }); + } + catch(e) + { + } + + return method; +} + +// Split the search text up into keywords +function ParseKeywords(keywords) +{ + var keywordList = []; + var checkWord; + var words = keywords.split(/\W+/); + + for(var idx = 0; idx < words.length; idx++) + { + checkWord = words[idx].toLowerCase(); + + if(checkWord.length > 2) + { + var charCode = checkWord.charCodeAt(0); + + if((charCode < 48 || charCode > 57) && $.inArray(checkWord, keywordList) == -1) + keywordList.push(checkWord); + } + } + + return keywordList; +} + +// Search for keywords and generate a block of HTML containing the results +function SearchForKeywords(keywords, fileInfo, wordDictionary, sortByTitle) +{ + var matches = [], matchingFileIndices = [], rankings = []; + var isFirst = true; + + for(var idx = 0; idx < keywords.length; idx++) + { + var word = keywords[idx]; + var occurrences = wordDictionary[word]; + + // All keywords must be found + if(occurrences == null) + return "Nothing found"; + + matches[word] = occurrences; + var occurrenceIndices = []; + + // Get a list of the file indices for this match. These are 64-bit numbers but JavaScript only does + // bit shifts on 32-bit values so we divide by 2^16 to get the same effect as ">> 16" and use floor() + // to truncate the result. + for(var ind in occurrences) + occurrenceIndices.push(Math.floor(occurrences[ind] / Math.pow(2, 16))); + + if(isFirst) + { + isFirst = false; + + for(var matchInd in occurrenceIndices) + matchingFileIndices.push(occurrenceIndices[matchInd]); + } + else + { + // After the first match, remove files that do not appear for all found keywords + for(var checkIdx = 0; checkIdx < matchingFileIndices.length; checkIdx++) + if($.inArray(matchingFileIndices[checkIdx], occurrenceIndices) == -1) + { + matchingFileIndices.splice(checkIdx, 1); + checkIdx--; + } + } + } + + if(matchingFileIndices.length == 0) + return "Nothing found"; + + // Rank the files based on the number of times the words occurs + for(var fileIdx = 0; fileIdx < matchingFileIndices.length; fileIdx++) + { + // Split out the title, filename, and word count + var matchingIdx = matchingFileIndices[fileIdx]; + var fileIndex = fileInfo[matchingIdx].split(/\0/); + + var title = fileIndex[0]; + var filename = fileIndex[1]; + var wordCount = parseInt(fileIndex[2]); + var matchCount = 0; + + for(var idx = 0; idx < keywords.length; idx++) + { + occurrences = matches[keywords[idx]]; + + for(var ind in occurrences) + { + var entry = occurrences[ind]; + + // These are 64-bit numbers but JavaScript only does bit shifts on 32-bit values so we divide + // by 2^16 to get the same effect as ">> 16" and use floor() to truncate the result. + if(Math.floor(entry / Math.pow(2, 16)) == matchingIdx) + matchCount += (entry & 0xFFFF); + } + } + + rankings.push({ Filename: filename, PageTitle: title, Rank: matchCount * 1000 / wordCount }); + + if(rankings.length > 99) + break; + } + + rankings.sort(function(x, y) + { + if(!sortByTitle) + return y.Rank - x.Rank; + + return x.PageTitle.localeCompare(y.PageTitle); + }); + + // Format and return the results + var content = "
      "; + + for(var r in rankings) + content += "
    1. " + + rankings[r].PageTitle + "
    2. "; + + content += "
    "; + + if(rankings.length < matchingFileIndices.length) + content += "

    Omitted " + (matchingFileIndices.length - rankings.length) + " more results

    "; + + return content; +} diff --git a/doc/ref/csharp/html/scripts/branding.js b/doc/ref/csharp/html/scripts/branding.js new file mode 100644 index 00000000000..9be90f3d478 --- /dev/null +++ b/doc/ref/csharp/html/scripts/branding.js @@ -0,0 +1,528 @@ +//=============================================================================================================== +// System : Sandcastle Help File Builder +// File : branding.js +// Author : Eric Woodruff (Eric@EWoodruff.us) +// Updated : 05/15/2014 +// Note : Copyright 2014, Eric Woodruff, All rights reserved +// Portions Copyright 2010-2014 Microsoft, All rights reserved +// +// This file contains the methods necessary to implement the language filtering, collapsible section, and +// copy to clipboard options. +// +// This code is published under the Microsoft Public License (Ms-PL). A copy of the license should be +// distributed with the code. It can also be found at the project website: https://GitHub.com/EWSoftware/SHFB. This +// notice, the author's name, and all copyright notices must remain intact in all applications, documentation, +// and source files. +// +// Date Who Comments +// ============================================================================================================== +// 05/04/2014 EFW Created the code based on the MS Help Viewer script +//=============================================================================================================== + +// The IDs of all code snippet sets on the same page are stored so that we can keep them in synch when a tab is +// selected. +var allTabSetIds = new Array(); + +// The IDs of language-specific text (LST) spans are used as dictionary keys so that we can get access to the +// spans and update them when the user changes to a different language tab. The values of the dictionary +// objects are pipe separated language-specific attributes (lang1=value|lang2=value|lang3=value). The language +// ID can be specific (cs, vb, cpp, etc.) or may be a neutral entry (nu) which specifies text common to multiple +// languages. If a language is not present and there is no neutral entry, the span is hidden for all languages +// to which it does not apply. +var allLSTSetIds = new Object(); + +// Help 1 persistence support. This code must appear inline. +var isHelp1; + +var curLoc = document.location + "."; + +if(curLoc.indexOf("mk:@MSITStore") == 0) +{ + isHelp1 = true; + curLoc = "ms-its:" + curLoc.substring(14, curLoc.length - 1); + document.location.replace(curLoc); +} +else + if(curLoc.indexOf("ms-its:") == 0) + isHelp1 = true; + else + isHelp1 = false; + +// The OnLoad method +function OnLoad(defaultLanguage) +{ + var defLang; + + if(typeof (defaultLanguage) == "undefined" || defaultLanguage == null || defaultLanguage == "") + defLang = "vb"; + else + defLang = defaultLanguage; + + // In MS Help Viewer, the transform the topic is ran through can move the footer. Move it back where it + // belongs if necessary. + try + { + var footer = document.getElementById("pageFooter") + + if(footer) + { + var footerParent = document.body; + + if(footer.parentElement != footerParent) + { + footer.parentElement.removeChild(footer); + footerParent.appendChild(footer); + } + } + } + catch(e) + { + } + + var language = GetCookie("CodeSnippetContainerLanguage", defLang); + + // If LST exists on the page, set the LST to show the user selected programming language + UpdateLST(language); + + // If code snippet groups exist, set the current language for them + if(allTabSetIds.length > 0) + { + var i = 0; + + while(i < allTabSetIds.length) + { + var tabCount = 1; + + // The tab count may vary so find the last one in this set + while(document.getElementById(allTabSetIds[i] + "_tab" + tabCount) != null) + tabCount++; + + tabCount--; + + // If not grouped, skip it + if(tabCount < 2) + { + // Disable the Copy Code link if in Chrome + if(navigator.userAgent.toLowerCase().indexOf("chrome") != -1) + document.getElementById(allTabSetIds[i] + "_copyCode").style.display = "none"; + } + else + SetCurrentLanguage(allTabSetIds[i], language, tabCount); + + i++; + } + } + + InitializeToc(); +} + +// This is just a place holder. The website script implements this function to initialize it's in-page TOC pane +function InitializeToc() +{ +} + +// This function executes in the OnLoad event and ChangeTab action on code snippets. The function parameter +// is the user chosen programming language. This function iterates through the "allLSTSetIds" dictionary object +// to update the node value of the LST span tag per the user's chosen programming language. +function UpdateLST(language) +{ + for(var lstMember in allLSTSetIds) + { + var devLangSpan = document.getElementById(lstMember); + + if(devLangSpan != null) + { + // There may be a carriage return before the LST span in the content so the replace function below + // is used to trim the whitespace at the end of the previous node of the current LST node. + if(devLangSpan.previousSibling != null && devLangSpan.previousSibling.nodeValue != null) + devLangSpan.previousSibling.nodeValue = devLangSpan.previousSibling.nodeValue.replace(/\s+$/, ""); + + var langs = allLSTSetIds[lstMember].split("|"); + var k = 0; + var keyValue; + + while(k < langs.length) + { + keyValue = langs[k].split("="); + + if(keyValue[0] == language) + { + devLangSpan.innerHTML = keyValue[1]; + + // Help 1 and MS Help Viewer workaround. Add a space if the following text element starts + // with a space to prevent things running together. + if(devLangSpan.parentNode != null && devLangSpan.parentNode.nextSibling != null) + { + if (devLangSpan.parentNode.nextSibling.nodeValue != null && + !devLangSpan.parentNode.nextSibling.nodeValue.substring(0, 1).match(/[.,);:!/?]/)) + { + devLangSpan.innerHTML = keyValue[1] + " "; + } + } + break; + } + + k++; + } + + // If not found, default to the neutral language. If there is no neutral language entry, clear the + // content to hide it. + if(k >= langs.length) + { + if(language != "nu") + { + k = 0; + + while(k < langs.length) + { + keyValue = langs[k].split("="); + + if(keyValue[0] == "nu") + { + devLangSpan.innerHTML = keyValue[1]; + + // Help 1 and MS Help Viewer workaround. Add a space if the following text element + // starts with a space to prevent things running together. + if(devLangSpan.parentNode != null && devLangSpan.parentNode.nextSibling != null) + { + if(devLangSpan.parentNode.nextSibling.nodeValue != null && + !devLangSpan.parentNode.nextSibling.nodeValue.substring(0, 1).match(/[.,);:!/?]/)) + { + devLangSpan.innerHTML = keyValue[1] + " "; + } + } + break; + } + + k++; + } + } + + if(k >= langs.length) + devLangSpan.innerHTML = ""; + } + } + } +} + +// Get the specified cookie. If not found, return the specified default value. +function GetCookie(cookieName, defaultValue) +{ + if(isHelp1) + { + try + { + var globals = Help1Globals; + + var value = globals.Load(cookieName); + + if(value == null) + value = defaultValue; + + return value; + } + catch(e) + { + return defaultValue; + } + } + + var cookie = document.cookie.split("; "); + + for(var i = 0; i < cookie.length; i++) + { + var crumb = cookie[i].split("="); + + if(cookieName == crumb[0]) + return unescape(crumb[1]) + } + + return defaultValue; +} + +// Set the specified cookie to the specified value +function SetCookie(name, value) +{ + if(isHelp1) + { + try + { + var globals = Help1Globals; + + globals.Save(name, value); + } + catch(e) + { + } + + return; + } + + var today = new Date(); + + today.setTime(today.getTime()); + + // Set the expiration time to be 60 days from now (in milliseconds) + var expires_date = new Date(today.getTime() + (60 * 1000 * 60 * 60 * 24)); + + document.cookie = name + "=" + escape(value) + ";expires=" + expires_date.toGMTString() + ";path=/"; +} + +// Add a language-specific text ID +function AddLanguageSpecificTextSet(lstId) +{ + var keyValue = lstId.split("?") + + allLSTSetIds[keyValue[0]] = keyValue[1]; +} + +// Add a language tab set ID +function AddLanguageTabSet(tabSetId) +{ + allTabSetIds.push(tabSetId); +} + +// Switch the active tab for all of other code snippets +function ChangeTab(tabSetId, language, snippetIdx, snippetCount) +{ + SetCookie("CodeSnippetContainerLanguage", language); + + SetActiveTab(tabSetId, snippetIdx, snippetCount); + + // If LST exists on the page, set the LST to show the user selected programming language + UpdateLST(language); + + var i = 0; + + while(i < allTabSetIds.length) + { + // We just care about other snippets + if(allTabSetIds[i] != tabSetId) + { + // Other tab sets may not have the same number of tabs + var tabCount = 1; + + while(document.getElementById(allTabSetIds[i] + "_tab" + tabCount) != null) + tabCount++; + + tabCount--; + + // If not grouped, skip it + if(tabCount > 1) + SetCurrentLanguage(allTabSetIds[i], language, tabCount); + } + + i++; + } +} + +// Sets the current language in the specified tab set +function SetCurrentLanguage(tabSetId, language, tabCount) +{ + var tabIndex = 1; + + while(tabIndex <= tabCount) + { + var tabTemp = document.getElementById(tabSetId + "_tab" + tabIndex); + + if(tabTemp != null && tabTemp.innerHTML.indexOf("'" + language + "'") != -1) + break; + + tabIndex++; + } + + if(tabIndex > tabCount) + { + // Select the first non-disabled tab + tabIndex = 1; + + if(document.getElementById(tabSetId + "_tab1").className == "codeSnippetContainerTabPhantom") + { + tabIndex++; + + while(tabIndex <= tabCount) + { + var tab = document.getElementById(tabSetId + "_tab" + tabIndex); + + if(tab.className != "codeSnippetContainerTabPhantom") + { + tab.className = "codeSnippetContainerTabActive"; + document.getElementById(tabSetId + "_code_Div" + j).style.display = "block"; + break; + } + + tabIndex++; + } + } + } + + SetActiveTab(tabSetId, tabIndex, tabCount); +} + +// Set the active tab within a tab set +function SetActiveTab(tabSetId, tabIndex, tabCount) +{ + var i = 1; + + while(i <= tabCount) + { + var tabTemp = document.getElementById(tabSetId + "_tab" + i); + + if(tabTemp.className == "codeSnippetContainerTabActive") + tabTemp.className = "codeSnippetContainerTab"; + else + if(tabTemp.className == "codeSnippetContainerTabPhantom") + tabTemp.style.display = "none"; + + var codeTemp = document.getElementById(tabSetId + "_code_Div" + i); + + if(codeTemp.style.display != "none") + codeTemp.style.display = "none"; + + i++; + } + + // Phantom tabs are shown or hidden as needed + if(document.getElementById(tabSetId + "_tab" + tabIndex).className != "codeSnippetContainerTabPhantom") + document.getElementById(tabSetId + "_tab" + tabIndex).className = "codeSnippetContainerTabActive"; + else + document.getElementById(tabSetId + "_tab" + tabIndex).style.display = "block"; + + document.getElementById(tabSetId + "_code_Div" + tabIndex).style.display = "block"; + + // Show copy code button if not in Chrome + if(navigator.userAgent.toLowerCase().indexOf("chrome") == -1) + document.getElementById(tabSetId + "_copyCode").style.display = "inline"; + else + document.getElementById(tabSetId + "_copyCode").style.display = "none"; +} + +// Copy the code from the active tab of the given tab set to the clipboard +function CopyToClipboard(tabSetId) +{ + var tabTemp, contentId; + var i = 1; + + do + { + contentId = tabSetId + "_code_Div" + i; + tabTemp = document.getElementById(contentId); + + if(tabTemp != null && tabTemp.style.display != "none") + break; + + i++; + + } while(tabTemp != null); + + if(tabTemp == null) + return; + + if(window.clipboardData) + { + try + { + window.clipboardData.setData("Text", document.getElementById(contentId).innerText); + } + catch(e) + { + alert("Permission denied. Enable copying to the clipboard."); + } + } + else if(window.netscape) + { + try + { + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + var clip = Components.classes["@mozilla.org/widget/clipboard;1"].createInstance( + Components.interfaces.nsIClipboard); + + if(!clip) + return; + + var trans = Components.classes["@mozilla.org/widget/transferable;1"].createInstance( + Components.interfaces.nsITransferable); + + if(!trans) + return; + + trans.addDataFlavor("text/unicode"); + + var str = new Object(); + var len = new Object(); + var str = Components.classes["@mozilla.org/supports-string;1"].createInstance( + Components.interfaces.nsISupportsString); + + var copytext = document.getElementById(contentId).textContent; + + str.data = copytext; + trans.setTransferData("text/unicode", str, copytext.length * 2); + + var clipid = Components.interfaces.nsIClipboard; + + clip.setData(trans, null, clipid.kGlobalClipboard); + } + catch(e) + { + alert("Permission denied. Enter \"about:config\" in the address bar and double-click the \"signed.applets.codebase_principal_support\" setting to enable copying to the clipboard."); + } + } +} + +// Expand or collapse a section +function SectionExpandCollapse(togglePrefix) +{ + var image = document.getElementById(togglePrefix + "Toggle"); + var section = document.getElementById(togglePrefix + "Section"); + + if(image != null && section != null) + if(section.style.display == "") + { + image.src = image.src.replace("SectionExpanded.png", "SectionCollapsed.png"); + section.style.display = "none"; + } + else + { + image.src = image.src.replace("SectionCollapsed.png", "SectionExpanded.png"); + section.style.display = ""; + } +} + +// Expand or collapse a section when it has the focus and Enter is hit +function SectionExpandCollapse_CheckKey(togglePrefix, eventArgs) +{ + if(eventArgs.keyCode == 13) + SectionExpandCollapse(togglePrefix); +} + +// Help 1 persistence object. This requires a hidden input element on the page with a class of "userDataStyle" +// defined in the style sheet that implements the user data binary behavior: +// +var Help1Globals = +{ + UserDataCache: function() + { + var userData = document.getElementById("userDataCache"); + + return userData; + }, + + Load: function(key) + { + var userData = this.UserDataCache(); + + userData.load("userDataSettings"); + + var value = userData.getAttribute(key); + + return value; + }, + + Save: function(key, value) + { + var userData = this.UserDataCache(); + userData.setAttribute(key, value); + userData.save("userDataSettings"); + } +}; diff --git a/doc/ref/csharp/html/scripts/jquery-1.11.0.min.js b/doc/ref/csharp/html/scripts/jquery-1.11.0.min.js new file mode 100644 index 00000000000..73f33fb3aa5 --- /dev/null +++ b/doc/ref/csharp/html/scripts/jquery-1.11.0.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
    ",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
    a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("