diff --git a/BUILD b/BUILD
index 8c10f118c27..67e727bd521 100644
--- a/BUILD
+++ b/BUILD
@@ -691,6 +691,8 @@ grpc_cc_library(
"src/core/lib/transport/timeout_encoding.c",
"src/core/lib/transport/transport.c",
"src/core/lib/transport/transport_op_string.c",
+ "src/core/lib/debug/stats.c",
+ "src/core/lib/debug/stats_data.c",
],
hdrs = [
"src/core/lib/channel/channel_args.h",
@@ -807,6 +809,8 @@ grpc_cc_library(
"src/core/lib/transport/timeout_encoding.h",
"src/core/lib/transport/transport.h",
"src/core/lib/transport/transport_impl.h",
+ "src/core/lib/debug/stats.h",
+ "src/core/lib/debug/stats_data.h",
],
external_deps = [
"zlib",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4bc1476053b..efc33c0a6c2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -962,6 +962,8 @@ add_library(grpc
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
@@ -1311,6 +1313,8 @@ add_library(grpc_cronet
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
@@ -1628,6 +1632,8 @@ add_library(grpc_test_util
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
@@ -1889,6 +1895,8 @@ add_library(grpc_test_util_unsecure
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
@@ -2136,6 +2144,8 @@ add_library(grpc_unsecure
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
@@ -2835,6 +2845,8 @@ add_library(grpc++_cronet
src/core/lib/compression/compression.c
src/core/lib/compression/message_compress.c
src/core/lib/compression/stream_compression.c
+ src/core/lib/debug/stats.c
+ src/core/lib/debug/stats_data.c
src/core/lib/http/format_request.c
src/core/lib/http/httpcli.c
src/core/lib/http/parser.c
diff --git a/Makefile b/Makefile
index ad8511f2cb2..4fd534df098 100644
--- a/Makefile
+++ b/Makefile
@@ -2907,6 +2907,8 @@ LIBGRPC_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
@@ -3254,6 +3256,8 @@ LIBGRPC_CRONET_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
@@ -3568,6 +3572,8 @@ LIBGRPC_TEST_UTIL_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
@@ -3818,6 +3824,8 @@ LIBGRPC_TEST_UTIL_UNSECURE_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
@@ -4041,6 +4049,8 @@ LIBGRPC_UNSECURE_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
@@ -4723,6 +4733,8 @@ LIBGRPC++_CRONET_SRC = \
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
diff --git a/binding.gyp b/binding.gyp
index bbefd05c20b..946edd8139c 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -667,6 +667,8 @@
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
diff --git a/build.yaml b/build.yaml
index 537a8e585cc..a43ad6ae31f 100644
--- a/build.yaml
+++ b/build.yaml
@@ -195,6 +195,8 @@ filegroups:
- src/core/lib/compression/compression.c
- src/core/lib/compression/message_compress.c
- src/core/lib/compression/stream_compression.c
+ - src/core/lib/debug/stats.c
+ - src/core/lib/debug/stats_data.c
- src/core/lib/http/format_request.c
- src/core/lib/http/httpcli.c
- src/core/lib/http/parser.c
@@ -345,6 +347,8 @@ filegroups:
- src/core/lib/compression/algorithm_metadata.h
- src/core/lib/compression/message_compress.h
- src/core/lib/compression/stream_compression.h
+ - src/core/lib/debug/stats.h
+ - src/core/lib/debug/stats_data.h
- src/core/lib/http/format_request.h
- src/core/lib/http/httpcli.h
- src/core/lib/http/parser.h
diff --git a/config.m4 b/config.m4
index f6f8531b2fd..d9d25cb0065 100644
--- a/config.m4
+++ b/config.m4
@@ -96,6 +96,8 @@ if test "$PHP_GRPC" != "no"; then
src/core/lib/compression/compression.c \
src/core/lib/compression/message_compress.c \
src/core/lib/compression/stream_compression.c \
+ src/core/lib/debug/stats.c \
+ src/core/lib/debug/stats_data.c \
src/core/lib/http/format_request.c \
src/core/lib/http/httpcli.c \
src/core/lib/http/parser.c \
diff --git a/config.w32 b/config.w32
index 1d1a0a4b63f..640115e8614 100644
--- a/config.w32
+++ b/config.w32
@@ -73,6 +73,8 @@ if (PHP_GRPC != "no") {
"src\\core\\lib\\compression\\compression.c " +
"src\\core\\lib\\compression\\message_compress.c " +
"src\\core\\lib\\compression\\stream_compression.c " +
+ "src\\core\\lib\\debug\\stats.c " +
+ "src\\core\\lib\\debug\\stats_data.c " +
"src\\core\\lib\\http\\format_request.c " +
"src\\core\\lib\\http\\httpcli.c " +
"src\\core\\lib\\http\\parser.c " +
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 74fa6046ca0..e82f917bdbd 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -329,6 +329,8 @@ Pod::Spec.new do |s|
'src/core/lib/compression/algorithm_metadata.h',
'src/core/lib/compression/message_compress.h',
'src/core/lib/compression/stream_compression.h',
+ 'src/core/lib/debug/stats.h',
+ 'src/core/lib/debug/stats_data.h',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.h',
'src/core/lib/http/parser.h',
@@ -477,6 +479,8 @@ Pod::Spec.new do |s|
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
@@ -822,6 +826,8 @@ Pod::Spec.new do |s|
'src/core/lib/compression/algorithm_metadata.h',
'src/core/lib/compression/message_compress.h',
'src/core/lib/compression/stream_compression.h',
+ 'src/core/lib/debug/stats.h',
+ 'src/core/lib/debug/stats_data.h',
'src/core/lib/http/format_request.h',
'src/core/lib/http/httpcli.h',
'src/core/lib/http/parser.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index 794a89fddc7..2b41f134691 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -261,6 +261,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/compression/algorithm_metadata.h )
s.files += %w( src/core/lib/compression/message_compress.h )
s.files += %w( src/core/lib/compression/stream_compression.h )
+ s.files += %w( src/core/lib/debug/stats.h )
+ s.files += %w( src/core/lib/debug/stats_data.h )
s.files += %w( src/core/lib/http/format_request.h )
s.files += %w( src/core/lib/http/httpcli.h )
s.files += %w( src/core/lib/http/parser.h )
@@ -413,6 +415,8 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/compression/compression.c )
s.files += %w( src/core/lib/compression/message_compress.c )
s.files += %w( src/core/lib/compression/stream_compression.c )
+ s.files += %w( src/core/lib/debug/stats.c )
+ s.files += %w( src/core/lib/debug/stats_data.c )
s.files += %w( src/core/lib/http/format_request.c )
s.files += %w( src/core/lib/http/httpcli.c )
s.files += %w( src/core/lib/http/parser.c )
diff --git a/grpc.gyp b/grpc.gyp
index f888c040e1e..40938a4564a 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -233,6 +233,8 @@
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
@@ -531,6 +533,8 @@
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
@@ -734,6 +738,8 @@
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
@@ -922,6 +928,8 @@
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
diff --git a/package.xml b/package.xml
index 49e9aee47e6..1cca4fbdddb 100644
--- a/package.xml
+++ b/package.xml
@@ -271,6 +271,8 @@
+
+
@@ -423,6 +425,8 @@
+
+
diff --git a/src/core/lib/debug/stats.c b/src/core/lib/debug/stats.c
new file mode 100644
index 00000000000..4dbd94c7241
--- /dev/null
+++ b/src/core/lib/debug/stats.c
@@ -0,0 +1,67 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "src/core/lib/debug/stats.h"
+
+#include
+#include
+
+#include
+#include
+#include
+
+#include "src/core/lib/support/string.h"
+
+grpc_stats_data *grpc_stats_per_cpu_storage = NULL;
+static size_t g_num_cores;
+
+void grpc_stats_init(void) {
+ g_num_cores = GPR_MAX(1, gpr_cpu_num_cores());
+ grpc_stats_per_cpu_storage =
+ gpr_zalloc(sizeof(grpc_stats_data) * g_num_cores);
+}
+
+void grpc_stats_shutdown(void) { gpr_free(grpc_stats_per_cpu_storage); }
+
+void grpc_stats_collect(grpc_stats_data *output) {
+ memset(output, 0, sizeof(*output));
+ for (size_t core = 0; core < g_num_cores; core++) {
+ for (size_t i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
+ output->counters[i] += gpr_atm_no_barrier_load(
+ &grpc_stats_per_cpu_storage[core].counters[i]);
+ }
+ }
+}
+
+char *grpc_stats_data_as_json(const grpc_stats_data *data) {
+ gpr_strvec v;
+ char *tmp;
+ bool is_first = true;
+ gpr_strvec_init(&v);
+ gpr_strvec_add(&v, gpr_strdup("{"));
+ for (size_t i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
+ gpr_asprintf(&tmp, "%s\"%s\": %" PRIdPTR, is_first ? "" : ", ",
+ grpc_stats_counter_name[i], data->counters[i]);
+ gpr_strvec_add(&v, tmp);
+ is_first = false;
+ }
+ gpr_strvec_add(&v, gpr_strdup("}"));
+ tmp = gpr_strvec_flatten(&v, NULL);
+ gpr_strvec_destroy(&v);
+ return tmp;
+}
diff --git a/src/core/lib/debug/stats.h b/src/core/lib/debug/stats.h
new file mode 100644
index 00000000000..563b108dff9
--- /dev/null
+++ b/src/core/lib/debug/stats.h
@@ -0,0 +1,44 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_DEBUG_STATS_H
+#define GRPC_CORE_LIB_DEBUG_STATS_H
+
+#include
+#include "src/core/lib/debug/stats_data.h"
+#include "src/core/lib/iomgr/exec_ctx.h"
+
+typedef struct grpc_stats_data {
+ gpr_atm counters[GRPC_STATS_COUNTER_COUNT];
+} grpc_stats_data;
+
+extern grpc_stats_data *grpc_stats_per_cpu_storage;
+
+#define GRPC_THREAD_STATS_DATA(exec_ctx) \
+ (&grpc_stats_per_cpu_storage[(exec_ctx)->starting_cpu])
+
+#define GRPC_STATS_INC_COUNTER(exec_ctx, ctr) \
+ (gpr_atm_no_barrier_fetch_add( \
+ &GRPC_THREAD_STATS_DATA((exec_ctx))->counters[(ctr)], 1))
+
+void grpc_stats_init(void);
+void grpc_stats_shutdown(void);
+void grpc_stats_collect(grpc_stats_data *output);
+char *grpc_stats_data_as_json(const grpc_stats_data *data);
+
+#endif
diff --git a/src/core/lib/debug/stats_data.c b/src/core/lib/debug/stats_data.c
new file mode 100644
index 00000000000..2203358a7e5
--- /dev/null
+++ b/src/core/lib/debug/stats_data.c
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Automatically generated by tools/codegen/core/gen_stats_data.py
+ */
+
+#include "src/core/lib/debug/stats_data.h"
+const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT] = {
+ "client_calls_created", "server_calls_created", "syscall_write",
+ "syscall_read", "syscall_poll", "syscall_wait",
+};
diff --git a/src/core/lib/debug/stats_data.h b/src/core/lib/debug/stats_data.h
new file mode 100644
index 00000000000..c9c2f65c30f
--- /dev/null
+++ b/src/core/lib/debug/stats_data.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * Automatically generated by tools/codegen/core/gen_stats_data.py
+ */
+
+#ifndef GRPC_CORE_LIB_DEBUG_STATS_DATA_H
+#define GRPC_CORE_LIB_DEBUG_STATS_DATA_H
+
+typedef enum {
+ GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED,
+ GRPC_STATS_COUNTER_SERVER_CALLS_CREATED,
+ GRPC_STATS_COUNTER_SYSCALL_WRITE,
+ GRPC_STATS_COUNTER_SYSCALL_READ,
+ GRPC_STATS_COUNTER_SYSCALL_POLL,
+ GRPC_STATS_COUNTER_SYSCALL_WAIT,
+ GRPC_STATS_COUNTER_COUNT
+} grpc_stats_counters;
+#define GRPC_STATS_INC_CLIENT_CALLS_CREATED(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED)
+#define GRPC_STATS_INC_SERVER_CALLS_CREATED(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SERVER_CALLS_CREATED)
+#define GRPC_STATS_INC_SYSCALL_WRITE(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_WRITE)
+#define GRPC_STATS_INC_SYSCALL_READ(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_READ)
+#define GRPC_STATS_INC_SYSCALL_POLL(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_POLL)
+#define GRPC_STATS_INC_SYSCALL_WAIT(exec_ctx) \
+ GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_SYSCALL_WAIT)
+extern const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT];
+
+#endif /* GRPC_CORE_LIB_DEBUG_STATS_DATA_H */
diff --git a/src/core/lib/debug/stats_data.yaml b/src/core/lib/debug/stats_data.yaml
new file mode 100644
index 00000000000..8afe48f5cd1
--- /dev/null
+++ b/src/core/lib/debug/stats_data.yaml
@@ -0,0 +1,9 @@
+# Stats data declaration
+# use tools/codegen/core/gen_stats_data.py to turn this into stats_data.h
+
+- counter: client_calls_created
+- counter: server_calls_created
+- counter: syscall_write
+- counter: syscall_read
+- counter: syscall_poll
+- counter: syscall_wait
diff --git a/src/core/lib/iomgr/ev_epoll1_linux.c b/src/core/lib/iomgr/ev_epoll1_linux.c
index 8b0a65006e0..7f053fa728b 100644
--- a/src/core/lib/iomgr/ev_epoll1_linux.c
+++ b/src/core/lib/iomgr/ev_epoll1_linux.c
@@ -39,6 +39,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/lockfree_event.h"
@@ -635,6 +636,7 @@ static grpc_error *do_epoll_wait(grpc_exec_ctx *exec_ctx, grpc_pollset *ps,
GRPC_SCHEDULING_START_BLOCKING_REGION;
}
do {
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
r = epoll_wait(g_epoll_set.epfd, g_epoll_set.events, MAX_EPOLL_EVENTS,
timeout);
} while (r < 0 && errno == EINTR);
diff --git a/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c b/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c
index f2f3e157046..e2e3cd9003f 100644
--- a/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c
+++ b/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c
@@ -40,6 +40,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
@@ -1286,7 +1287,8 @@ static void pollset_destroy(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) {
}
/* NOTE: This function may modify 'now' */
-static bool acquire_polling_lease(grpc_pollset_worker *worker,
+static bool acquire_polling_lease(grpc_exec_ctx *exec_ctx,
+ grpc_pollset_worker *worker,
polling_island *pi, gpr_timespec deadline,
gpr_timespec *now) {
bool is_lease_acquired = false;
@@ -1306,6 +1308,7 @@ static bool acquire_polling_lease(grpc_pollset_worker *worker,
} else {
struct timespec sigwait_timeout = millis_to_timespec(timeout_ms);
GRPC_SCHEDULING_START_BLOCKING_REGION;
+ GRPC_STATS_INC_SYSCALL_WAIT(exec_ctx);
ret = sigtimedwait(&g_wakeup_sig_set, NULL, &sigwait_timeout);
GRPC_SCHEDULING_END_BLOCKING_REGION;
}
@@ -1378,7 +1381,7 @@ static void pollset_do_epoll_pwait(grpc_exec_ctx *exec_ctx, int epoll_fd,
sigset_t *sig_mask, grpc_error **error) {
/* Only g_max_pollers_per_pi threads can be doing polling in parallel.
If we cannot get a lease, we cannot continue to do epoll_pwait() */
- if (!acquire_polling_lease(worker, pi, deadline, &now)) {
+ if (!acquire_polling_lease(exec_ctx, worker, pi, deadline, &now)) {
return;
}
@@ -1391,6 +1394,7 @@ static void pollset_do_epoll_pwait(grpc_exec_ctx *exec_ctx, int epoll_fd,
int timeout_ms = poll_deadline_to_millis_timeout(deadline, now);
GRPC_SCHEDULING_START_BLOCKING_REGION;
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
ep_rv =
epoll_pwait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms, sig_mask);
GRPC_SCHEDULING_END_BLOCKING_REGION;
diff --git a/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c b/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c
index 07c8eadf4f4..ddb8c74d2de 100644
--- a/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c
+++ b/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c
@@ -41,6 +41,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/lockfree_event.h"
@@ -776,6 +777,7 @@ static void do_epoll_wait(grpc_exec_ctx *exec_ctx, int epoll_fd, epoll_set *eps,
GRPC_SCHEDULING_START_BLOCKING_REGION;
acquire_epoll_lease(eps);
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
ep_rv = epoll_wait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms);
release_epoll_lease(eps);
GRPC_SCHEDULING_END_BLOCKING_REGION;
diff --git a/src/core/lib/iomgr/ev_epollex_linux.c b/src/core/lib/iomgr/ev_epollex_linux.c
index 1f4adea5d4e..0e42f76af37 100644
--- a/src/core/lib/iomgr/ev_epollex_linux.c
+++ b/src/core/lib/iomgr/ev_epollex_linux.c
@@ -37,6 +37,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/is_epollexclusive_available.h"
@@ -814,6 +815,7 @@ static grpc_error *pollset_epoll(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
}
int r;
do {
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
r = epoll_wait(p->epfd, pollset->events, MAX_EPOLL_EVENTS, timeout);
} while (r < 0 && errno == EINTR);
if (timeout != 0) {
diff --git a/src/core/lib/iomgr/ev_epollsig_linux.c b/src/core/lib/iomgr/ev_epollsig_linux.c
index fad12ff65c6..59c7cdc285f 100644
--- a/src/core/lib/iomgr/ev_epollsig_linux.c
+++ b/src/core/lib/iomgr/ev_epollsig_linux.c
@@ -39,6 +39,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/lockfree_event.h"
@@ -1236,6 +1237,7 @@ static void pollset_work_and_unlock(grpc_exec_ctx *exec_ctx,
g_current_thread_polling_island = pi;
GRPC_SCHEDULING_START_BLOCKING_REGION;
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
ep_rv =
epoll_pwait(epoll_fd, ep_ev, GRPC_EPOLL_MAX_EVENTS, timeout_ms, sig_mask);
GRPC_SCHEDULING_END_BLOCKING_REGION;
diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c
index 9472a8e5208..fbd265f3ce7 100644
--- a/src/core/lib/iomgr/ev_poll_posix.c
+++ b/src/core/lib/iomgr/ev_poll_posix.c
@@ -36,6 +36,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/iomgr/wakeup_fd_cv.h"
@@ -983,6 +984,7 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
/* TODO(vpai): Consider first doing a 0 timeout poll here to avoid
even going into the blocking annotation if possible */
GRPC_SCHEDULING_START_BLOCKING_REGION;
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
r = grpc_poll_function(pfds, pfd_count, timeout);
GRPC_SCHEDULING_END_BLOCKING_REGION;
diff --git a/src/core/lib/iomgr/exec_ctx.h b/src/core/lib/iomgr/exec_ctx.h
index a0d2a965d53..c89792c8c4f 100644
--- a/src/core/lib/iomgr/exec_ctx.h
+++ b/src/core/lib/iomgr/exec_ctx.h
@@ -19,6 +19,7 @@
#ifndef GRPC_CORE_LIB_IOMGR_EXEC_CTX_H
#define GRPC_CORE_LIB_IOMGR_EXEC_CTX_H
+#include
#include "src/core/lib/iomgr/closure.h"
/* #define GRPC_EXECUTION_CONTEXT_SANITIZER 1 */
@@ -62,6 +63,7 @@ struct grpc_exec_ctx {
/** last active combiner in the active combiner list */
grpc_combiner *last_combiner;
uintptr_t flags;
+ unsigned starting_cpu;
void *check_ready_to_finish_arg;
bool (*check_ready_to_finish)(grpc_exec_ctx *exec_ctx, void *arg);
};
@@ -69,7 +71,10 @@ struct grpc_exec_ctx {
/* initializer for grpc_exec_ctx:
prefer to use GRPC_EXEC_CTX_INIT whenever possible */
#define GRPC_EXEC_CTX_INITIALIZER(flags, finish_check, finish_check_arg) \
- { GRPC_CLOSURE_LIST_INIT, NULL, NULL, flags, finish_check_arg, finish_check }
+ { \
+ GRPC_CLOSURE_LIST_INIT, NULL, NULL, flags, gpr_cpu_current_cpu(), \
+ finish_check_arg, finish_check \
+ }
/* initialize an execution context at the top level of an API call into grpc
(this is safe to use elsewhere, though possibly not as efficient) */
diff --git a/src/core/lib/iomgr/iocp_windows.c b/src/core/lib/iomgr/iocp_windows.c
index e343f8a794a..c082179c0b4 100644
--- a/src/core/lib/iomgr/iocp_windows.c
+++ b/src/core/lib/iomgr/iocp_windows.c
@@ -27,6 +27,7 @@
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/iocp_windows.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
#include "src/core/lib/iomgr/socket_windows.h"
@@ -65,6 +66,7 @@ grpc_iocp_work_status grpc_iocp_work(grpc_exec_ctx *exec_ctx,
LPOVERLAPPED overlapped;
grpc_winsocket *socket;
grpc_winsocket_callback_info *info;
+ GRPC_STATS_INC_SYSCALL_POLL(exec_ctx);
success = GetQueuedCompletionStatus(
g_iocp, &bytes, &completion_key, &overlapped,
deadline_to_millis_timeout(deadline, gpr_now(deadline.clock_type)));
diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c
index 2f543fd8a9e..7e789cc5b5e 100644
--- a/src/core/lib/iomgr/tcp_posix.c
+++ b/src/core/lib/iomgr/tcp_posix.c
@@ -40,6 +40,7 @@
#include
#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/iomgr/ev_posix.h"
#include "src/core/lib/profiling/timers.h"
@@ -258,6 +259,7 @@ static void tcp_do_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
GPR_TIMER_BEGIN("recvmsg", 0);
do {
+ GRPC_STATS_INC_SYSCALL_READ(exec_ctx);
read_bytes = recvmsg(tcp->fd, &msg, 0);
} while (read_bytes < 0 && errno == EINTR);
GPR_TIMER_END("recvmsg", read_bytes >= 0);
@@ -361,7 +363,8 @@ static void tcp_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
/* returns true if done, false if pending; if returning true, *error is set */
#define MAX_WRITE_IOVEC 1000
-static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
+static bool tcp_flush(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp,
+ grpc_error **error) {
struct msghdr msg;
struct iovec iov[MAX_WRITE_IOVEC];
msg_iovlen_type iov_size;
@@ -403,6 +406,7 @@ static bool tcp_flush(grpc_tcp *tcp, grpc_error **error) {
GPR_TIMER_BEGIN("sendmsg", 1);
do {
/* TODO(klempner): Cork if this is a partial write */
+ GRPC_STATS_INC_SYSCALL_WRITE(exec_ctx);
sent_length = sendmsg(tcp->fd, &msg, SENDMSG_FLAGS);
} while (sent_length < 0 && errno == EINTR);
GPR_TIMER_END("sendmsg", 0);
@@ -459,7 +463,7 @@ static void tcp_handle_write(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */,
return;
}
- if (!tcp_flush(tcp, &error)) {
+ if (!tcp_flush(exec_ctx, tcp, &error)) {
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
gpr_log(GPR_DEBUG, "write: delayed");
}
@@ -510,7 +514,7 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
tcp->outgoing_slice_idx = 0;
tcp->outgoing_byte_idx = 0;
- if (!tcp_flush(tcp, &error)) {
+ if (!tcp_flush(exec_ctx, tcp, &error)) {
TCP_REF(tcp, "write");
tcp->write_cb = cb;
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c
index 62d542d2c55..e68c201134d 100644
--- a/src/core/lib/surface/call.c
+++ b/src/core/lib/surface/call.c
@@ -32,6 +32,7 @@
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/compression/algorithm_metadata.h"
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/slice/slice_internal.h"
@@ -334,6 +335,11 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx,
/* Always support no compression */
GPR_BITSET(&call->encodings_accepted_by_peer, GRPC_COMPRESS_NONE);
call->is_client = args->server_transport_data == NULL;
+ if (call->is_client) {
+ GRPC_STATS_INC_CLIENT_CALLS_CREATED(exec_ctx);
+ } else {
+ GRPC_STATS_INC_SERVER_CALLS_CREATED(exec_ctx);
+ }
call->stream_op_payload.context = call->context;
grpc_slice path = grpc_empty_slice();
if (call->is_client) {
diff --git a/src/core/lib/surface/init.c b/src/core/lib/surface/init.c
index d199ac060e6..898476daee9 100644
--- a/src/core/lib/surface/init.c
+++ b/src/core/lib/surface/init.c
@@ -28,6 +28,7 @@
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/channel/connected_channel.h"
#include "src/core/lib/channel/handshaker_registry.h"
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/debug/trace.h"
#include "src/core/lib/http/parser.h"
#include "src/core/lib/iomgr/combiner.h"
@@ -118,6 +119,7 @@ void grpc_init(void) {
gpr_mu_lock(&g_init_mu);
if (++g_initializations == 1) {
gpr_time_init();
+ grpc_stats_init();
grpc_slice_intern_init();
grpc_mdctx_global_init();
grpc_channel_init_init();
@@ -186,6 +188,7 @@ void grpc_shutdown(void) {
grpc_mdctx_global_shutdown(&exec_ctx);
grpc_handshaker_factory_registry_shutdown(&exec_ctx);
grpc_slice_intern_shutdown();
+ grpc_stats_shutdown();
}
gpr_mu_unlock(&g_init_mu);
grpc_exec_ctx_finish(&exec_ctx);
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index dc4d28f95bd..1cbf345ab6e 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -72,6 +72,8 @@ CORE_SOURCE_FILES = [
'src/core/lib/compression/compression.c',
'src/core/lib/compression/message_compress.c',
'src/core/lib/compression/stream_compression.c',
+ 'src/core/lib/debug/stats.c',
+ 'src/core/lib/debug/stats_data.c',
'src/core/lib/http/format_request.c',
'src/core/lib/http/httpcli.c',
'src/core/lib/http/parser.c',
diff --git a/test/core/end2end/tests/simple_request.c b/test/core/end2end/tests/simple_request.c
index 7a81133dfa7..82ab0a1cfeb 100644
--- a/test/core/end2end/tests/simple_request.c
+++ b/test/core/end2end/tests/simple_request.c
@@ -27,6 +27,7 @@
#include
#include
#include
+#include "src/core/lib/debug/stats.h"
#include "src/core/lib/support/string.h"
#include "test/core/end2end/cq_verifier.h"
@@ -102,6 +103,10 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_slice details;
int was_cancelled = 2;
char *peer;
+ grpc_stats_data before;
+ grpc_stats_data after;
+
+ grpc_stats_collect(&before);
gpr_timespec deadline = five_seconds_from_now();
c = grpc_channel_create_call(
@@ -208,6 +213,23 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_call_unref(s);
cq_verifier_destroy(cqv);
+
+ grpc_stats_collect(&after);
+
+ char *stats = grpc_stats_data_as_json(&after);
+ gpr_log(GPR_DEBUG, "%s", stats);
+ gpr_free(stats);
+
+ int expected_calls = 1;
+ if (config.feature_mask & FEATURE_MASK_SUPPORTS_REQUEST_PROXYING) {
+ expected_calls *= 2;
+ }
+ GPR_ASSERT(after.counters[GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED] -
+ before.counters[GRPC_STATS_COUNTER_CLIENT_CALLS_CREATED] ==
+ expected_calls);
+ GPR_ASSERT(after.counters[GRPC_STATS_COUNTER_SERVER_CALLS_CREATED] -
+ before.counters[GRPC_STATS_COUNTER_SERVER_CALLS_CREATED] ==
+ expected_calls);
}
static void test_invoke_simple_request(grpc_end2end_test_config config) {
diff --git a/test/core/iomgr/ev_epollsig_linux_test.c b/test/core/iomgr/ev_epollsig_linux_test.c
index c702065d4d6..cca07bf0020 100644
--- a/test/core/iomgr/ev_epollsig_linux_test.c
+++ b/test/core/iomgr/ev_epollsig_linux_test.c
@@ -26,6 +26,7 @@
#include
#include
+#include
#include
#include
#include
@@ -308,9 +309,8 @@ static void test_threading(void) {
int main(int argc, char **argv) {
const char *poll_strategy = NULL;
grpc_test_init(argc, argv);
+ grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_iomgr_init(&exec_ctx);
- grpc_iomgr_start(&exec_ctx);
poll_strategy = grpc_get_poll_strategy_name();
if (poll_strategy != NULL && strcmp(poll_strategy, "epollsig") == 0) {
@@ -323,8 +323,8 @@ int main(int argc, char **argv) {
poll_strategy);
}
- grpc_iomgr_shutdown(&exec_ctx);
grpc_exec_ctx_finish(&exec_ctx);
+ grpc_shutdown();
return 0;
}
#else /* defined(GRPC_LINUX_EPOLL) */
diff --git a/test/core/iomgr/fd_posix_test.c b/test/core/iomgr/fd_posix_test.c
index 85d5d9c07f3..5791d17af62 100644
--- a/test/core/iomgr/fd_posix_test.c
+++ b/test/core/iomgr/fd_posix_test.c
@@ -35,6 +35,7 @@
#include
#include
+#include
#include
#include
#include
@@ -530,8 +531,7 @@ int main(int argc, char **argv) {
grpc_closure destroyed;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_test_init(argc, argv);
- grpc_iomgr_init(&exec_ctx);
- grpc_iomgr_start(&exec_ctx);
+ grpc_init();
g_pollset = gpr_zalloc(grpc_pollset_size());
grpc_pollset_init(g_pollset, &g_mu);
test_grpc_fd();
@@ -541,8 +541,8 @@ int main(int argc, char **argv) {
grpc_pollset_shutdown(&exec_ctx, g_pollset, &destroyed);
grpc_exec_ctx_flush(&exec_ctx);
gpr_free(g_pollset);
- grpc_iomgr_shutdown(&exec_ctx);
grpc_exec_ctx_finish(&exec_ctx);
+ grpc_shutdown();
return 0;
}
diff --git a/test/core/iomgr/resolve_address_posix_test.c b/test/core/iomgr/resolve_address_posix_test.c
index 9cc09ed5d3a..e4be99f03c7 100644
--- a/test/core/iomgr/resolve_address_posix_test.c
+++ b/test/core/iomgr/resolve_address_posix_test.c
@@ -21,12 +21,14 @@
#include
#include
+#include
#include
#include
#include
#include
#include
#include
+
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/iomgr.h"
#include "test/core/util/test_config.h"
@@ -159,13 +161,12 @@ static void test_unix_socket_path_name_too_long(void) {
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
+ grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_iomgr_init(&exec_ctx);
- grpc_iomgr_start(&exec_ctx);
test_unix_socket();
test_unix_socket_path_name_too_long();
grpc_executor_shutdown(&exec_ctx);
- grpc_iomgr_shutdown(&exec_ctx);
grpc_exec_ctx_finish(&exec_ctx);
+ grpc_shutdown();
return 0;
}
diff --git a/test/core/iomgr/resolve_address_test.c b/test/core/iomgr/resolve_address_test.c
index cb156ee61e3..7f5c4073d81 100644
--- a/test/core/iomgr/resolve_address_test.c
+++ b/test/core/iomgr/resolve_address_test.c
@@ -17,6 +17,7 @@
*/
#include "src/core/lib/iomgr/resolve_address.h"
+#include
#include
#include
#include
@@ -250,9 +251,8 @@ static void test_unparseable_hostports(void) {
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
+ grpc_init();
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_iomgr_init(&exec_ctx);
- grpc_iomgr_start(&exec_ctx);
test_localhost();
test_default_port();
test_non_numeric_default_port();
@@ -262,7 +262,7 @@ int main(int argc, char **argv) {
test_invalid_ip_addresses();
test_unparseable_hostports();
grpc_executor_shutdown(&exec_ctx);
- grpc_iomgr_shutdown(&exec_ctx);
grpc_exec_ctx_finish(&exec_ctx);
+ grpc_shutdown();
return 0;
}
diff --git a/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc b/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
index f109fe62519..9d71d3990d4 100644
--- a/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
+++ b/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
@@ -38,6 +38,8 @@ struct grpc_pollset {
namespace grpc {
namespace testing {
+auto& force_library_initialization = Library::get();
+
static void* g_tag = (void*)(intptr_t)10; // Some random number
static grpc_completion_queue* g_cq;
static grpc_event_engine_vtable g_vtable;
diff --git a/test/cpp/microbenchmarks/helpers.cc b/test/cpp/microbenchmarks/helpers.cc
index 0c10d6c4cee..415d27445f7 100644
--- a/test/cpp/microbenchmarks/helpers.cc
+++ b/test/cpp/microbenchmarks/helpers.cc
@@ -29,6 +29,13 @@ void TrackCounters::Finish(benchmark::State &state) {
}
void TrackCounters::AddToLabel(std::ostream &out, benchmark::State &state) {
+ grpc_stats_data stats_end;
+ grpc_stats_collect(&stats_end);
+ for (int i = 0; i < GRPC_STATS_COUNTER_COUNT; i++) {
+ out << " " << grpc_stats_counter_name[i] << "/iter:"
+ << ((double)(stats_end.counters[i] - stats_begin_.counters[i]) /
+ (double)state.iterations());
+ }
#ifdef GPR_LOW_LEVEL_COUNTERS
grpc_memory_counters counters_at_end = grpc_memory_counters_snapshot();
out << " locks/iter:" << ((double)(gpr_atm_no_barrier_load(&gpr_mu_locks) -
diff --git a/test/cpp/microbenchmarks/helpers.h b/test/cpp/microbenchmarks/helpers.h
index c81d95a4ea6..07dd6117098 100644
--- a/test/cpp/microbenchmarks/helpers.h
+++ b/test/cpp/microbenchmarks/helpers.h
@@ -23,6 +23,7 @@
extern "C" {
#include
+#include "src/core/lib/debug/stats.h"
#include "test/core/util/memory_counters.h"
}
@@ -62,10 +63,12 @@ extern "C" gpr_atm gpr_now_call_count;
class TrackCounters {
public:
+ TrackCounters() { grpc_stats_collect(&stats_begin_); }
virtual void Finish(benchmark::State& state);
virtual void AddToLabel(std::ostream& out, benchmark::State& state);
private:
+ grpc_stats_data stats_begin_;
#ifdef GPR_LOW_LEVEL_COUNTERS
const size_t mu_locks_at_start_ = gpr_atm_no_barrier_load(&gpr_mu_locks);
const size_t atm_cas_at_start_ =
diff --git a/tools/codegen/core/gen_stats_data.py b/tools/codegen/core/gen_stats_data.py
new file mode 100755
index 00000000000..bc601a89a7f
--- /dev/null
+++ b/tools/codegen/core/gen_stats_data.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python2.7
+
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import collections
+import sys
+import yaml
+
+with open('src/core/lib/debug/stats_data.yaml') as f:
+ attrs = yaml.load(f.read())
+
+Counter = collections.namedtuple('Counter', 'name')
+
+counters = []
+
+for attr in attrs:
+ if 'counter' in attr:
+ counters.append(Counter(name=attr['counter']))
+ else:
+ print 'Error: bad attr %r' % attr
+
+# utility: print a big comment block into a set of files
+def put_banner(files, banner):
+ for f in files:
+ print >>f, '/*'
+ for line in banner:
+ print >>f, ' * %s' % line
+ print >>f, ' */'
+ print >>f
+
+with open('src/core/lib/debug/stats_data.h', 'w') as H:
+ # copy-paste copyright notice from this file
+ with open(sys.argv[0]) as my_source:
+ copyright = []
+ for line in my_source:
+ if line[0] != '#': break
+ for line in my_source:
+ if line[0] == '#':
+ copyright.append(line)
+ break
+ for line in my_source:
+ if line[0] != '#':
+ break
+ copyright.append(line)
+ put_banner([H], [line[2:].rstrip() for line in copyright])
+
+ put_banner([H], ["Automatically generated by tools/codegen/core/gen_stats_data.py"])
+
+ print >>H, "#ifndef GRPC_CORE_LIB_DEBUG_STATS_DATA_H"
+ print >>H, "#define GRPC_CORE_LIB_DEBUG_STATS_DATA_H"
+ print >>H
+
+ print >>H, "typedef enum {"
+ for ctr in counters:
+ print >>H, " GRPC_STATS_COUNTER_%s," % ctr.name.upper()
+ print >>H, " GRPC_STATS_COUNTER_COUNT"
+ print >>H, "} grpc_stats_counters;"
+
+ for ctr in counters:
+ print >>H, "#define GRPC_STATS_INC_%s(exec_ctx) GRPC_STATS_INC_COUNTER((exec_ctx), GRPC_STATS_COUNTER_%s)" % (ctr.name.upper(), ctr.name.upper())
+
+ print >>H, "extern const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT];"
+
+ print >>H
+ print >>H, "#endif /* GRPC_CORE_LIB_DEBUG_STATS_DATA_H */"
+
+with open('src/core/lib/debug/stats_data.c', 'w') as C:
+ # copy-paste copyright notice from this file
+ with open(sys.argv[0]) as my_source:
+ copyright = []
+ for line in my_source:
+ if line[0] != '#': break
+ for line in my_source:
+ if line[0] == '#':
+ copyright.append(line)
+ break
+ for line in my_source:
+ if line[0] != '#':
+ break
+ copyright.append(line)
+ put_banner([C], [line[2:].rstrip() for line in copyright])
+
+ put_banner([C], ["Automatically generated by tools/codegen/core/gen_stats_data.py"])
+
+ print >>C, "#include \"src/core/lib/debug/stats_data.h\""
+
+ print >>C, "const char *grpc_stats_counter_name[GRPC_STATS_COUNTER_COUNT] = {";
+ for ctr in counters:
+ print >>C, " \"%s\"," % ctr.name
+ print >>C, "};"
diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal
index 6e80ab2443e..91c149eec92 100644
--- a/tools/doxygen/Doxyfile.c++.internal
+++ b/tools/doxygen/Doxyfile.c++.internal
@@ -942,6 +942,8 @@ src/core/lib/channel/handshaker_registry.h \
src/core/lib/compression/algorithm_metadata.h \
src/core/lib/compression/message_compress.h \
src/core/lib/compression/stream_compression.h \
+src/core/lib/debug/stats.h \
+src/core/lib/debug/stats_data.h \
src/core/lib/debug/trace.h \
src/core/lib/http/format_request.h \
src/core/lib/http/httpcli.h \
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index f526e2cbf81..26d982acd7d 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1077,6 +1077,10 @@ src/core/lib/compression/message_compress.c \
src/core/lib/compression/message_compress.h \
src/core/lib/compression/stream_compression.c \
src/core/lib/compression/stream_compression.h \
+src/core/lib/debug/stats.c \
+src/core/lib/debug/stats.h \
+src/core/lib/debug/stats_data.c \
+src/core/lib/debug/stats_data.h \
src/core/lib/debug/trace.c \
src/core/lib/debug/trace.h \
src/core/lib/http/format_request.c \
diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json
index 19767623670..5ce25dc14a6 100644
--- a/tools/run_tests/generated/sources_and_headers.json
+++ b/tools/run_tests/generated/sources_and_headers.json
@@ -7822,6 +7822,8 @@
"src/core/lib/compression/compression.c",
"src/core/lib/compression/message_compress.c",
"src/core/lib/compression/stream_compression.c",
+ "src/core/lib/debug/stats.c",
+ "src/core/lib/debug/stats_data.c",
"src/core/lib/http/format_request.c",
"src/core/lib/http/httpcli.c",
"src/core/lib/http/parser.c",
@@ -7973,6 +7975,8 @@
"src/core/lib/compression/algorithm_metadata.h",
"src/core/lib/compression/message_compress.h",
"src/core/lib/compression/stream_compression.h",
+ "src/core/lib/debug/stats.h",
+ "src/core/lib/debug/stats_data.h",
"src/core/lib/http/format_request.h",
"src/core/lib/http/httpcli.h",
"src/core/lib/http/parser.h",
@@ -8103,6 +8107,8 @@
"src/core/lib/compression/algorithm_metadata.h",
"src/core/lib/compression/message_compress.h",
"src/core/lib/compression/stream_compression.h",
+ "src/core/lib/debug/stats.h",
+ "src/core/lib/debug/stats_data.h",
"src/core/lib/http/format_request.h",
"src/core/lib/http/httpcli.h",
"src/core/lib/http/parser.h",
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
new file mode 100644
index 00000000000..fbb9fde7538
--- /dev/null
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -0,0 +1,1065 @@
+
+
+
+
+
+ Debug-DLL
+ Win32
+
+
+ Debug-DLL
+ x64
+
+
+ Release-DLL
+ Win32
+
+
+ Release-DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {29D16885-7228-4C31-81ED-5F9187C7F2A9}
+ true
+ $(SolutionDir)IntDir\$(MSBuildProjectName)\
+
+
+
+ v100
+
+
+ v110
+
+
+ v120
+
+
+ v140
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+ grpc
+ static
+ Debug
+ static
+ Debug
+
+
+ grpc
+ static
+ Release
+ static
+ Release
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
new file mode 100644
index 00000000000..5332066df63
--- /dev/null
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -0,0 +1,1759 @@
+
+
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+ src\core\ext\transport\chttp2\server\secure
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\alpn
+
+
+ src\core\ext\filters\http\client
+
+
+ src\core\ext\filters\http
+
+
+ src\core\ext\filters\http\message_compress
+
+
+ src\core\ext\filters\http\server
+
+
+ src\core\lib\http
+
+
+ src\core\lib\security\context
+
+
+ src\core\lib\security\credentials\composite
+
+
+ src\core\lib\security\credentials
+
+
+ src\core\lib\security\credentials
+
+
+ src\core\lib\security\credentials\fake
+
+
+ src\core\lib\security\credentials\google_default
+
+
+ src\core\lib\security\credentials\google_default
+
+
+ src\core\lib\security\credentials\iam
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\oauth2
+
+
+ src\core\lib\security\credentials\plugin
+
+
+ src\core\lib\security\credentials\ssl
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\util
+
+
+ src\core\lib\surface
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\ext\transport\chttp2\server
+
+
+ src\core\ext\transport\chttp2\client\secure
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\deadline
+
+
+ src\core\ext\transport\chttp2\client
+
+
+ src\core\ext\transport\chttp2\server\insecure
+
+
+ src\core\ext\transport\chttp2\server\insecure
+
+
+ src\core\ext\transport\chttp2\client\insecure
+
+
+ src\core\ext\transport\chttp2\client\insecure
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb\proto\grpc\lb\v1
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ src\core\ext\filters\client_channel\lb_policy\pick_first
+
+
+ src\core\ext\filters\client_channel\lb_policy\round_robin
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\native
+
+
+ src\core\ext\filters\client_channel\resolver\sockaddr
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\filters\max_age
+
+
+ src\core\ext\filters\message_size
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\plugin_registry
+
+
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc\support
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\alpn
+
+
+ src\core\ext\filters\http\client
+
+
+ src\core\ext\filters\http\message_compress
+
+
+ src\core\ext\filters\http\server
+
+
+ src\core\lib\security\context
+
+
+ src\core\lib\security\credentials\composite
+
+
+ src\core\lib\security\credentials
+
+
+ src\core\lib\security\credentials\fake
+
+
+ src\core\lib\security\credentials\google_default
+
+
+ src\core\lib\security\credentials\iam
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\jwt
+
+
+ src\core\lib\security\credentials\oauth2
+
+
+ src\core\lib\security\credentials\plugin
+
+
+ src\core\lib\security\credentials\ssl
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\transport
+
+
+ src\core\lib\security\util
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\tsi
+
+
+ src\core\ext\transport\chttp2\server
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\deadline
+
+
+ src\core\ext\transport\chttp2\client
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb\proto\grpc\lb\v1
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\filters\max_age
+
+
+ src\core\ext\filters\message_size
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\ext\filters\workarounds
+
+
+
+
+
+ {968de0a1-346d-b75a-6f19-6a55119b8235}
+
+
+ {880c644d-b84f-cfca-98bd-e145f36232ab}
+
+
+ {38832702-fee1-b2bc-75d3-923e748dcde9}
+
+
+ {def748f5-ed2a-a9bb-40d9-c31d00f0e13b}
+
+
+ {31de82ea-dc6c-73fb-a640-979b8a7b240c}
+
+
+ {d538af37-07b2-062b-fa2a-d9f882cb2737}
+
+
+ {ea745680-21ea-9c5e-679b-64dc40562d08}
+
+
+ {3f32a58f-394f-5f13-06aa-6cc52cc2daaf}
+
+
+ {9bf70bd2-f553-11b2-c237-abd148971eea}
+
+
+ {4a14dd37-5868-c656-7333-fa80574cbb07}
+
+
+ {a7cd279d-e0ec-32d3-4cbe-778aba4a0000}
+
+
+ {d38c43fd-50e4-fba5-59c5-0d4817159aad}
+
+
+ {784368be-88aa-3170-1479-48fdf8fbc7be}
+
+
+ {82e39ac8-1993-6894-efed-651068234a28}
+
+
+ {ff02fee6-7304-df5f-76a6-008b5a1c7d19}
+
+
+ {953a74cb-cafd-eedd-8d34-038c28daf188}
+
+
+ {595a1701-eb5a-e8af-ffa3-f67c0e380894}
+
+
+ {af8e2597-93ef-1381-d773-082a85e7eaf1}
+
+
+ {9a3e8049-bc04-8341-5173-6fe5f8a4465c}
+
+
+ {6d3d5842-8257-9c58-7985-75f4d98b7d5c}
+
+
+ {c9873fec-2f83-0497-6d0a-bd9c1cc63be3}
+
+
+ {91b79502-da45-f80b-933e-c974b089db5c}
+
+
+ {73d42c09-d1b5-2e4e-ef12-d74d8ee33ac2}
+
+
+ {9b2d7e1f-b78a-2e7a-3000-944e46a5fab9}
+
+
+ {e75d1482-9a43-5fdf-03a5-e2b2833715fb}
+
+
+ {bd317dd5-323e-5b27-4c05-d85786be36ab}
+
+
+ {c8dcda4e-dbaa-1ae8-67a9-0dd26046f652}
+
+
+ {2e3ab9f3-39ca-db39-cb3e-2196cbc68098}
+
+
+ {e4f7616b-2b49-7df9-8ca3-eb7848d4609d}
+
+
+ {7b595f5a-c5b5-29fe-74c2-5ec5fd5c94d2}
+
+
+ {a40e82ca-0c04-35b8-898d-7ad5f323d110}
+
+
+ {12559ba7-9445-92ae-0c5a-2d79570d4c9b}
+
+
+ {5369e83c-4625-fc14-cc40-9db5da3a7af4}
+
+
+ {5ca3f38c-539f-3c4f-b68c-38b31ba339ba}
+
+
+ {2ec64619-e2c4-da0f-c10e-e03f5a151300}
+
+
+ {e3abfd0a-064e-0f2f-c8e8-7c5a7e98142a}
+
+
+ {ac42667b-bbba-3571-20bc-7a4240ef26ca}
+
+
+ {ef2aa344-783f-7fbd-c83a-47e2d38db14d}
+
+
+ {dbffebe0-eebb-577d-1860-ef6837f4cf50}
+
+
+ {4e699b02-fae4-dabd-afd2-2e41b05bef0e}
+
+
+ {e98ed28e-8dc5-3bb4-22a2-8893831a0ab8}
+
+
+ {1d36fe16-b004-6bee-c661-328234bbb469}
+
+
+ {e8539863-6029-cca4-44a9-5481cacf8144}
+
+
+ {0afa539f-8c83-d4b9-cdea-550091f09638}
+
+
+ {6f34254e-e69f-c9b4-156d-5024bade5408}
+
+
+ {fb9e878e-fc50-40af-7646-074229a9d676}
+
+
+ {5b2ded3f-84a5-f6b4-2060-286c7d1dc945}
+
+
+ {1931b044-90f3-cd68-b5f8-23be77ca8efc}
+
+
+ {dadf7fe9-3f15-d431-e4f6-f987b090536c}
+
+
+ {19122742-9b92-5b67-9fb9-e552ac62ca5d}
+
+
+ {dab8f03a-73de-8cfa-88fb-6e04402efb54}
+
+
+ {5468ba38-b8a3-85b1-216f-48a2364e18df}
+
+
+ {cb2b0073-f2a7-5c63-d182-8874b24bdf36}
+
+
+ {c4661d64-349f-01c1-1ba8-0602f9047595}
+
+
+ {187b52e3-bc78-6c62-3e68-4eb19a257661}
+
+
+ {c8af33b1-f786-001d-3e92-140872dc9829}
+
+
+ {197ed135-5f84-9f6a-6751-38dc5e9dd38c}
+
+
+ {6d391299-53d7-ee6a-55aa-d4c46cd86e82}
+
+
+ {412c7418-e90a-de77-5705-7890ba960911}
+
+
+ {718f826c-994b-7dd4-3042-0e999c5c22ba}
+
+
+ {ab21bcdf-de99-5838-699a-19ecb0c4aa14}
+
+
+ {f47a7a32-3166-b899-3622-f062f372feea}
+
+
+ {46120bcc-03e3-1aaa-fc61-9cef786bd70c}
+
+
+ {9d7802bc-d459-1a9b-3c97-868cddcca1d1}
+
+
+ {b22e611f-8272-9914-24a5-8107ebf51eeb}
+
+
+ {fcd7b397-aadd-556a-8aae-0cb7c893fbe0}
+
+
+ {aed4de18-0b8a-0fed-6f5b-41ea3442310d}
+
+
+ {a21971fb-304f-da08-b1b2-7bd8df8ac373}
+
+
+ {e9d0d3fc-c100-f3e6-89b8-649f241155bf}
+
+
+ {02bec99b-ff39-88d7-9dea-e0ff9f4a2701}
+
+
+ {0b0f9ab1-efa4-7f03-e446-6fb9b5227e84}
+
+
+ {aaab30a4-2a15-732e-c141-3fbc0f0f5a7a}
+
+
+ {93d6596d-330c-1d27-6f84-3c840e57869e}
+
+
+
+
diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj
new file mode 100644
index 00000000000..3fd0fb5f9fd
--- /dev/null
+++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj
@@ -0,0 +1,632 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}
+ true
+ $(SolutionDir)IntDir\$(MSBuildProjectName)\
+
+
+
+ v100
+
+
+ v110
+
+
+ v120
+
+
+ v140
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+ grpc_test_util
+
+
+ grpc_test_util
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {EAB0A629-17A9-44DB-B5FF-E91A721FE037}
+
+
+ {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
+
+
+ {29D16885-7228-4C31-81ED-5F9187C7F2A9}
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters
new file mode 100644
index 00000000000..d51623834f4
--- /dev/null
+++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters
@@ -0,0 +1,1030 @@
+
+
+
+
+ test\core\end2end\data
+
+
+ test\core\end2end\data
+
+
+ test\core\end2end\data
+
+
+ test\core\end2end\data
+
+
+ test\core\security
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ test\core\end2end
+
+
+ test\core\end2end\fixtures
+
+
+ test\core\end2end\fixtures
+
+
+ test\core\iomgr
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc\support
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+
+
+ test\core\end2end\data
+
+
+ test\core\security
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ test\core\end2end
+
+
+ test\core\end2end\fixtures
+
+
+ test\core\end2end\fixtures
+
+
+ test\core\iomgr
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ test\core\util
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+
+
+
+ {50129440-aff7-7df7-682c-b9671be19a6f}
+
+
+ {d448b078-95a6-6fca-fe4a-8b44dd71f359}
+
+
+ {314a6801-6fe3-9211-33d8-ecf3332c1151}
+
+
+ {8e97f1e1-f4d1-a56e-0837-7901778fb3b9}
+
+
+ {b783a829-3703-129f-39ee-528ac0a06e06}
+
+
+ {7d107d7c-1da3-9525-3ba1-3a411b552ea8}
+
+
+ {f7bfac91-5eb2-dea7-4601-6c63edbbf997}
+
+
+ {5db70e06-741d-708c-bf0a-b59f8ca1f8bd}
+
+
+ {f0f88514-c2d8-c4c9-c3bd-591682207751}
+
+
+ {5bb60a9e-156f-e1c8-3b9c-1b23e7992d7a}
+
+
+ {24a50975-435e-20a5-b0f2-71bc330d0378}
+
+
+ {9e94ffec-fe00-d132-db50-c4a3c218f102}
+
+
+ {f4e8c61e-1ca6-0fdd-7b5e-b7f9a30c9a21}
+
+
+ {1cd1503c-bec0-5ade-c75f-aa25c80975ec}
+
+
+ {09632582-2cc3-5618-d673-65d3884f8ce5}
+
+
+ {2c1a72e9-886e-8082-9d2f-0fc9cb3ab996}
+
+
+ {4862ecce-fa07-eb5e-5c05-bfa753c8bfe5}
+
+
+ {fc7f488e-08b4-8366-3720-1f7ffaa0b0b3}
+
+
+ {89bc8f83-e29a-ddab-8f6b-22df11cdc867}
+
+
+ {4d172bbc-20c4-6e7d-872a-2d287b589aa0}
+
+
+ {7f2b7dca-395f-94dd-c9ad-9a286bd9751e}
+
+
+ {5249e884-ea07-6782-531d-ec622c54b9af}
+
+
+ {a2783de3-4fcf-718d-a859-c2108350ff33}
+
+
+ {f95a0dc5-2e57-c168-6128-fe07e1bd58a9}
+
+
+ {7004f7a6-a821-a581-1df5-94c7d22c6850}
+
+
+ {c0da5050-98b1-e4af-71a7-6317af6338e0}
+
+
+ {1daa14ff-cf54-5a38-9104-46ed9882784b}
+
+
+ {d3dce584-6111-9ff2-affe-5933a9291c17}
+
+
+ {b0938b31-f9d5-21d7-de41-08107caafd80}
+
+
+ {6e9f8de1-258c-578f-aa3d-7da9320a3171}
+
+
+
+
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
new file mode 100644
index 00000000000..08c1e78e8f9
--- /dev/null
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -0,0 +1,957 @@
+
+
+
+
+ Debug-DLL
+ Win32
+
+
+ Debug-DLL
+ x64
+
+
+ Release-DLL
+ Win32
+
+
+ Release-DLL
+ x64
+
+
+ Debug
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ Win32
+
+
+ Release
+ x64
+
+
+
+ {46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}
+ true
+ $(SolutionDir)IntDir\$(MSBuildProjectName)\
+
+
+
+ v100
+
+
+ v110
+
+
+ v120
+
+
+ v140
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+ StaticLibrary
+ true
+ Unicode
+
+
+ StaticLibrary
+ false
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+ grpc_unsecure
+
+
+ grpc_unsecure
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ Disabled
+ WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ MultiThreadedDebug
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+ NotUsing
+ Level3
+ MaxSpeed
+ WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ true
+ true
+ MultiThreaded
+ true
+ None
+ false
+
+
+ Windows
+ true
+ false
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
new file mode 100644
index 00000000000..d9a5914e653
--- /dev/null
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -0,0 +1,1540 @@
+
+
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+ src\core\ext\transport\chttp2\server\insecure
+
+
+ src\core\ext\transport\chttp2\server\insecure
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\alpn
+
+
+ src\core\ext\filters\http\client
+
+
+ src\core\ext\filters\http
+
+
+ src\core\ext\filters\http\message_compress
+
+
+ src\core\ext\filters\http\server
+
+
+ src\core\ext\transport\chttp2\server
+
+
+ src\core\ext\transport\chttp2\client\insecure
+
+
+ src\core\ext\transport\chttp2\client\insecure
+
+
+ src\core\ext\transport\chttp2\client
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\deadline
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\native
+
+
+ src\core\ext\filters\client_channel\resolver\sockaddr
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb\proto\grpc\lb\v1
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ src\core\ext\filters\client_channel\lb_policy\pick_first
+
+
+ src\core\ext\filters\client_channel\lb_policy\round_robin
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\filters\max_age
+
+
+ src\core\ext\filters\message_size
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\plugin_registry
+
+
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc
+
+
+ include\grpc\support
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc\impl\codegen
+
+
+ include\grpc
+
+
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\channel
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\compression
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\debug
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\http
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\iomgr
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\json
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\slice
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\surface
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\transport
+
+
+ src\core\lib\debug
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\transport
+
+
+ src\core\ext\transport\chttp2\alpn
+
+
+ src\core\ext\filters\http\client
+
+
+ src\core\ext\filters\http\message_compress
+
+
+ src\core\ext\filters\http\server
+
+
+ src\core\ext\transport\chttp2\server
+
+
+ src\core\ext\transport\chttp2\client
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\client_channel
+
+
+ src\core\ext\filters\deadline
+
+
+ src\core\ext\transport\inproc
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\dns\c_ares
+
+
+ src\core\ext\filters\client_channel\resolver\fake
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\load_reporting
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb
+
+
+ src\core\ext\filters\client_channel\lb_policy\grpclb\proto\grpc\lb\v1
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ third_party\nanopb
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census\gen
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\census
+
+
+ src\core\ext\filters\max_age
+
+
+ src\core\ext\filters\message_size
+
+
+ src\core\ext\filters\workarounds
+
+
+ src\core\ext\filters\workarounds
+
+
+
+
+
+ {10076c7e-7c8e-8005-0c81-64454af2cbc8}
+
+
+ {77b9717b-b8d8-dd5f-14bb-a3e96809a70a}
+
+
+ {10cfa248-c60f-376f-e7ae-2a7d7d8e81f5}
+
+
+ {03cc6735-c734-7017-4000-a435f29d55c3}
+
+
+ {a553e3dc-8973-1b23-8be4-31852fd9e429}
+
+
+ {aaf326a1-c884-46ea-875a-cbbd9983e539}
+
+
+ {88491077-386b-2039-d14c-0c40136b5f7a}
+
+
+ {82f86e8c-00a4-f566-d235-670fc629798d}
+
+
+ {3f21cd12-b8b9-18f8-8780-e21bbe2285d0}
+
+
+ {dfe53168-57b0-3ac4-d8ba-07fd958cc8f5}
+
+
+ {5e37012e-a374-e285-bbda-b0dbe6327663}
+
+
+ {bb0de45a-745e-8822-7ad5-453f9e060f8c}
+
+
+ {2ac0872e-12dc-0b08-68e0-66829ce8c268}
+
+
+ {6cc603b0-7272-0a9f-59c2-5561c1856a6a}
+
+
+ {0d3bc4ed-1eea-8b17-c26f-7d87c3dd2220}
+
+
+ {32d37957-d122-e649-b9c1-3f13f6674479}
+
+
+ {153a159f-1ba7-aea7-ebed-4f2d9e2e7bb9}
+
+
+ {f8747b87-02f9-df6c-0eeb-27ab1d037d0c}
+
+
+ {4df776ac-ebeb-4933-554e-749a0399ff51}
+
+
+ {5244539b-6cec-80c7-61dc-df51e531bedd}
+
+
+ {663be499-ce6c-8afd-db98-674f26be1149}
+
+
+ {f6bf03da-fa0d-0c24-bba2-17dc5a3c8fe0}
+
+
+ {54bc0ac2-39c8-dbfd-c5dd-b9fb597dd820}
+
+
+ {55f499bd-ae18-5210-81e1-385c85e60875}
+
+
+ {7f924133-4a98-87b0-f158-cb64ea91e71a}
+
+
+ {99210f5e-b2a0-ecd1-024f-fc152db68a11}
+
+
+ {ac374be1-7a3f-14a8-69fe-badac2d9f9ec}
+
+
+ {33287f7d-739b-d30d-a9f3-b338103456b0}
+
+
+ {95cd5972-7339-6f09-2332-e6769b3cba3f}
+
+
+ {cf8cb886-3020-e143-317e-730ff9bbddc3}
+
+
+ {2c1e7897-6f69-f8b9-0b90-5c3fae59a48f}
+
+
+ {0aef07b4-39d2-f862-15ac-65b4bf00dabb}
+
+
+ {d3bc80c1-5f2d-e842-42ac-43d8a6ada8de}
+
+
+ {8cbe7444-caac-49dc-be89-d4c4d1c7966a}
+
+
+ {8bd0612e-bd53-c9e6-7b3c-20937e4e1e9e}
+
+
+ {967c89fe-c97c-27e2-aac0-9ba5854cb5fa}
+
+
+ {702829f0-099e-2ab7-6b44-ed7cff3ec083}
+
+
+ {7d4830f7-20db-07d3-c3a9-ecfe63ae1992}
+
+
+ {0d589e16-e470-4968-318c-796af5a33637}
+
+
+ {34dfdc9b-ab97-47f0-c1e1-b2e7381c3de6}
+
+
+ {81fb55f4-9216-441b-8389-a7120bbcd45e}
+
+
+ {3f53dcb6-71d7-28ff-1794-26a08e4601fe}
+
+
+ {45b20f28-376c-9dea-1800-8a0193411946}
+
+
+ {287a62fa-b646-5062-49c4-9e7bd5bc5b96}
+
+
+ {8bd5b461-bff8-6aa8-b5a6-85da2834eb8a}
+
+
+ {fb964f3d-a59c-a7ba-fee5-6072dbb94a7b}
+
+
+ {b88002e9-185e-4e64-49f5-2d8989ce87f6}
+
+
+ {7f23789d-f18a-2a2d-60fe-a87dc656f539}
+
+
+ {748c8078-2027-8641-f485-1d4c66466e79}
+
+
+ {bb1a1cf2-6824-08f0-a9bd-3fafcaf13042}
+
+
+ {681cdaeb-c47f-8853-d985-bf13c2873947}
+
+
+ {74c81ab7-e329-a362-3890-4c41b90f0511}
+
+
+ {506dc3b3-d884-2b59-0dfa-57ed6affa2d3}
+
+
+ {6c3394d1-27e9-003e-19ed-8116d210f7cc}
+
+
+ {babf0a90-e934-f599-5475-e6937d9580fe}
+
+
+ {025c051e-8eba-125b-67f9-173f95176eb2}
+
+
+ {6511f77d-f28c-80e0-0889-8975e688e344}
+
+
+
+