From 1dcd922ce65a00892e0815262b8446af06ad882b Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 9 Feb 2017 09:40:07 -0800 Subject: [PATCH 001/186] Remove initial_connect_string hack. --- BUILD | 3 - CMakeLists.txt | 37 --- Makefile | 44 --- binding.gyp | 2 - build.yaml | 17 -- config.m4 | 2 - gRPC-Core.podspec | 4 - grpc.gemspec | 3 - package.xml | 3 - src/core/ext/client_channel/connector.h | 2 - .../default_initial_connect_string.c | 38 --- .../client_channel/initial_connect_string.c | 52 ---- .../client_channel/initial_connect_string.h | 50 ---- src/core/ext/client_channel/subchannel.c | 7 - .../chttp2/client/chttp2_connector.c | 37 +-- .../!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/python/grpcio/grpc_core_dependencies.py | 2 - .../set_initial_connect_string_test.c | 268 ------------------ tools/doxygen/Doxyfile.core.internal | 3 - .../generated/sources_and_headers.json | 22 -- tools/run_tests/generated/tests.json | 24 -- vsprojects/buildtests_c.sln | 28 -- vsprojects/vcxproj/grpc/grpc.vcxproj | 5 - vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 9 - .../grpc_unsecure/grpc_unsecure.vcxproj | 5 - .../grpc_unsecure.vcxproj.filters | 9 - .../set_initial_connect_string_test.vcxproj | 202 ------------- ...nitial_connect_string_test.vcxproj.filters | 21 -- 28 files changed, 2 insertions(+), 899 deletions(-) delete mode 100644 src/core/ext/client_channel/default_initial_connect_string.c delete mode 100644 src/core/ext/client_channel/initial_connect_string.c delete mode 100644 src/core/ext/client_channel/initial_connect_string.h delete mode 100644 test/core/client_channel/set_initial_connect_string_test.c delete mode 100644 vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj delete mode 100644 vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj.filters diff --git a/BUILD b/BUILD index ba92279b8e7..9901333e427 100644 --- a/BUILD +++ b/BUILD @@ -677,10 +677,8 @@ grpc_cc_library( "src/core/ext/client_channel/client_channel_factory.c", "src/core/ext/client_channel/client_channel_plugin.c", "src/core/ext/client_channel/connector.c", - "src/core/ext/client_channel/default_initial_connect_string.c", "src/core/ext/client_channel/http_connect_handshaker.c", "src/core/ext/client_channel/http_proxy.c", - "src/core/ext/client_channel/initial_connect_string.c", "src/core/ext/client_channel/lb_policy.c", "src/core/ext/client_channel/lb_policy_factory.c", "src/core/ext/client_channel/lb_policy_registry.c", @@ -700,7 +698,6 @@ grpc_cc_library( "src/core/ext/client_channel/connector.h", "src/core/ext/client_channel/http_connect_handshaker.h", "src/core/ext/client_channel/http_proxy.h", - "src/core/ext/client_channel/initial_connect_string.h", "src/core/ext/client_channel/lb_policy.h", "src/core/ext/client_channel/lb_policy_factory.h", "src/core/ext/client_channel/lb_policy_registry.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 9d2040c3660..b264d9dc77a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -455,7 +455,6 @@ add_dependencies(buildtests_c secure_endpoint_test) add_dependencies(buildtests_c sequential_connectivity_test) add_dependencies(buildtests_c server_chttp2_test) add_dependencies(buildtests_c server_test) -add_dependencies(buildtests_c set_initial_connect_string_test) add_dependencies(buildtests_c slice_buffer_test) add_dependencies(buildtests_c slice_string_helpers_test) add_dependencies(buildtests_c slice_test) @@ -975,10 +974,8 @@ add_library(grpc src/core/ext/client_channel/client_channel_factory.c src/core/ext/client_channel/client_channel_plugin.c src/core/ext/client_channel/connector.c - src/core/ext/client_channel/default_initial_connect_string.c src/core/ext/client_channel/http_connect_handshaker.c src/core/ext/client_channel/http_proxy.c - src/core/ext/client_channel/initial_connect_string.c src/core/ext/client_channel/lb_policy.c src/core/ext/client_channel/lb_policy_factory.c src/core/ext/client_channel/lb_policy_registry.c @@ -1245,10 +1242,8 @@ add_library(grpc_cronet src/core/ext/client_channel/client_channel_factory.c src/core/ext/client_channel/client_channel_plugin.c src/core/ext/client_channel/connector.c - src/core/ext/client_channel/default_initial_connect_string.c src/core/ext/client_channel/http_connect_handshaker.c src/core/ext/client_channel/http_proxy.c - src/core/ext/client_channel/initial_connect_string.c src/core/ext/client_channel/lb_policy.c src/core/ext/client_channel/lb_policy_factory.c src/core/ext/client_channel/lb_policy_registry.c @@ -1758,10 +1753,8 @@ add_library(grpc_unsecure src/core/ext/client_channel/client_channel_factory.c src/core/ext/client_channel/client_channel_plugin.c src/core/ext/client_channel/connector.c - src/core/ext/client_channel/default_initial_connect_string.c src/core/ext/client_channel/http_connect_handshaker.c src/core/ext/client_channel/http_proxy.c - src/core/ext/client_channel/initial_connect_string.c src/core/ext/client_channel/lb_policy.c src/core/ext/client_channel/lb_policy_factory.c src/core/ext/client_channel/lb_policy_registry.c @@ -2279,10 +2272,8 @@ add_library(grpc++_cronet src/core/ext/client_channel/client_channel_factory.c src/core/ext/client_channel/client_channel_plugin.c src/core/ext/client_channel/connector.c - src/core/ext/client_channel/default_initial_connect_string.c src/core/ext/client_channel/http_connect_handshaker.c src/core/ext/client_channel/http_proxy.c - src/core/ext/client_channel/initial_connect_string.c src/core/ext/client_channel/lb_policy.c src/core/ext/client_channel/lb_policy_factory.c src/core/ext/client_channel/lb_policy_registry.c @@ -6387,34 +6378,6 @@ target_link_libraries(server_test endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) -add_executable(set_initial_connect_string_test - test/core/client_channel/set_initial_connect_string_test.c -) - - -target_include_directories(set_initial_connect_string_test - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include - PRIVATE ${BORINGSSL_ROOT_DIR}/include - PRIVATE ${PROTOBUF_ROOT_DIR}/src - PRIVATE ${BENCHMARK_ROOT_DIR}/include - PRIVATE ${ZLIB_ROOT_DIR} - PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib - PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include -) - -target_link_libraries(set_initial_connect_string_test - ${_gRPC_ALLTARGETS_LIBRARIES} - test_tcp_server - grpc_test_util - grpc - gpr_test_util - gpr -) - -endif (gRPC_BUILD_TESTS) -if (gRPC_BUILD_TESTS) - add_executable(slice_buffer_test test/core/slice/slice_buffer_test.c ) diff --git a/Makefile b/Makefile index 125512307c2..e727a4c5d2c 100644 --- a/Makefile +++ b/Makefile @@ -1016,7 +1016,6 @@ sequential_connectivity_test: $(BINDIR)/$(CONFIG)/sequential_connectivity_test server_chttp2_test: $(BINDIR)/$(CONFIG)/server_chttp2_test server_fuzzer: $(BINDIR)/$(CONFIG)/server_fuzzer server_test: $(BINDIR)/$(CONFIG)/server_test -set_initial_connect_string_test: $(BINDIR)/$(CONFIG)/set_initial_connect_string_test slice_buffer_test: $(BINDIR)/$(CONFIG)/slice_buffer_test slice_string_helpers_test: $(BINDIR)/$(CONFIG)/slice_string_helpers_test slice_test: $(BINDIR)/$(CONFIG)/slice_test @@ -1363,7 +1362,6 @@ buildtests_c: privatelibs_c \ $(BINDIR)/$(CONFIG)/sequential_connectivity_test \ $(BINDIR)/$(CONFIG)/server_chttp2_test \ $(BINDIR)/$(CONFIG)/server_test \ - $(BINDIR)/$(CONFIG)/set_initial_connect_string_test \ $(BINDIR)/$(CONFIG)/slice_buffer_test \ $(BINDIR)/$(CONFIG)/slice_string_helpers_test \ $(BINDIR)/$(CONFIG)/slice_test \ @@ -1786,8 +1784,6 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/server_chttp2_test || ( echo test server_chttp2_test failed ; exit 1 ) $(E) "[RUN] Testing server_test" $(Q) $(BINDIR)/$(CONFIG)/server_test || ( echo test server_test failed ; exit 1 ) - $(E) "[RUN] Testing set_initial_connect_string_test" - $(Q) $(BINDIR)/$(CONFIG)/set_initial_connect_string_test || ( echo test set_initial_connect_string_test failed ; exit 1 ) $(E) "[RUN] Testing slice_buffer_test" $(Q) $(BINDIR)/$(CONFIG)/slice_buffer_test || ( echo test slice_buffer_test failed ; exit 1 ) $(E) "[RUN] Testing slice_string_helpers_test" @@ -2825,10 +2821,8 @@ LIBGRPC_SRC = \ src/core/ext/client_channel/client_channel_factory.c \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ - src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_proxy.c \ - src/core/ext/client_channel/initial_connect_string.c \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy_factory.c \ src/core/ext/client_channel/lb_policy_registry.c \ @@ -3109,10 +3103,8 @@ LIBGRPC_CRONET_SRC = \ src/core/ext/client_channel/client_channel_factory.c \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ - src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_proxy.c \ - src/core/ext/client_channel/initial_connect_string.c \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy_factory.c \ src/core/ext/client_channel/lb_policy_registry.c \ @@ -3638,10 +3630,8 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/client_channel/client_channel_factory.c \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ - src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_proxy.c \ - src/core/ext/client_channel/initial_connect_string.c \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy_factory.c \ src/core/ext/client_channel/lb_policy_registry.c \ @@ -4205,10 +4195,8 @@ LIBGRPC++_CRONET_SRC = \ src/core/ext/client_channel/client_channel_factory.c \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ - src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_proxy.c \ - src/core/ext/client_channel/initial_connect_string.c \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy_factory.c \ src/core/ext/client_channel/lb_policy_registry.c \ @@ -11490,38 +11478,6 @@ endif endif -SET_INITIAL_CONNECT_STRING_TEST_SRC = \ - test/core/client_channel/set_initial_connect_string_test.c \ - -SET_INITIAL_CONNECT_STRING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(SET_INITIAL_CONNECT_STRING_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/set_initial_connect_string_test: openssl_dep_error - -else - - - -$(BINDIR)/$(CONFIG)/set_initial_connect_string_test: $(SET_INITIAL_CONNECT_STRING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libtest_tcp_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(SET_INITIAL_CONNECT_STRING_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libtest_tcp_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/set_initial_connect_string_test - -endif - -$(OBJDIR)/$(CONFIG)/test/core/client_channel/set_initial_connect_string_test.o: $(LIBDIR)/$(CONFIG)/libtest_tcp_server.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - -deps_set_initial_connect_string_test: $(SET_INITIAL_CONNECT_STRING_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(SET_INITIAL_CONNECT_STRING_TEST_OBJS:.o=.dep) -endif -endif - - SLICE_BUFFER_TEST_SRC = \ test/core/slice/slice_buffer_test.c \ diff --git a/binding.gyp b/binding.gyp index 8ff3d8c1a34..92e1f2aed67 100644 --- a/binding.gyp +++ b/binding.gyp @@ -777,10 +777,8 @@ 'src/core/ext/client_channel/client_channel_factory.c', 'src/core/ext/client_channel/client_channel_plugin.c', 'src/core/ext/client_channel/connector.c', - 'src/core/ext/client_channel/default_initial_connect_string.c', 'src/core/ext/client_channel/http_connect_handshaker.c', 'src/core/ext/client_channel/http_proxy.c', - 'src/core/ext/client_channel/initial_connect_string.c', 'src/core/ext/client_channel/lb_policy.c', 'src/core/ext/client_channel/lb_policy_factory.c', 'src/core/ext/client_channel/lb_policy_registry.c', diff --git a/build.yaml b/build.yaml index 62321fafc26..2c382ba1431 100644 --- a/build.yaml +++ b/build.yaml @@ -405,7 +405,6 @@ filegroups: - src/core/ext/client_channel/connector.h - src/core/ext/client_channel/http_connect_handshaker.h - src/core/ext/client_channel/http_proxy.h - - src/core/ext/client_channel/initial_connect_string.h - src/core/ext/client_channel/lb_policy.h - src/core/ext/client_channel/lb_policy_factory.h - src/core/ext/client_channel/lb_policy_registry.h @@ -424,10 +423,8 @@ filegroups: - src/core/ext/client_channel/client_channel_factory.c - src/core/ext/client_channel/client_channel_plugin.c - src/core/ext/client_channel/connector.c - - src/core/ext/client_channel/default_initial_connect_string.c - src/core/ext/client_channel/http_connect_handshaker.c - src/core/ext/client_channel/http_proxy.c - - src/core/ext/client_channel/initial_connect_string.c - src/core/ext/client_channel/lb_policy.c - src/core/ext/client_channel/lb_policy_factory.c - src/core/ext/client_channel/lb_policy_registry.c @@ -2648,20 +2645,6 @@ targets: - grpc - gpr_test_util - gpr -- name: set_initial_connect_string_test - cpu_cost: 0.1 - build: test - language: c - src: - - test/core/client_channel/set_initial_connect_string_test.c - deps: - - test_tcp_server - - grpc_test_util - - grpc - - gpr_test_util - - gpr - exclude_iomgrs: - - uv - name: slice_buffer_test build: test language: c diff --git a/config.m4 b/config.m4 index 90536e503ed..6a90b82b2d2 100644 --- a/config.m4 +++ b/config.m4 @@ -256,10 +256,8 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/client_channel/client_channel_factory.c \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ - src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_proxy.c \ - src/core/ext/client_channel/initial_connect_string.c \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy_factory.c \ src/core/ext/client_channel/lb_policy_registry.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 07b3b2bad53..b72268b1314 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -406,7 +406,6 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/connector.h', 'src/core/ext/client_channel/http_connect_handshaker.h', 'src/core/ext/client_channel/http_proxy.h', - 'src/core/ext/client_channel/initial_connect_string.h', 'src/core/ext/client_channel/lb_policy.h', 'src/core/ext/client_channel/lb_policy_factory.h', 'src/core/ext/client_channel/lb_policy_registry.h', @@ -622,10 +621,8 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/client_channel_factory.c', 'src/core/ext/client_channel/client_channel_plugin.c', 'src/core/ext/client_channel/connector.c', - 'src/core/ext/client_channel/default_initial_connect_string.c', 'src/core/ext/client_channel/http_connect_handshaker.c', 'src/core/ext/client_channel/http_proxy.c', - 'src/core/ext/client_channel/initial_connect_string.c', 'src/core/ext/client_channel/lb_policy.c', 'src/core/ext/client_channel/lb_policy_factory.c', 'src/core/ext/client_channel/lb_policy_registry.c', @@ -840,7 +837,6 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/connector.h', 'src/core/ext/client_channel/http_connect_handshaker.h', 'src/core/ext/client_channel/http_proxy.h', - 'src/core/ext/client_channel/initial_connect_string.h', 'src/core/ext/client_channel/lb_policy.h', 'src/core/ext/client_channel/lb_policy_factory.h', 'src/core/ext/client_channel/lb_policy_registry.h', diff --git a/grpc.gemspec b/grpc.gemspec index 335021fdc83..67bc2fd942b 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -323,7 +323,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/client_channel/connector.h ) s.files += %w( src/core/ext/client_channel/http_connect_handshaker.h ) s.files += %w( src/core/ext/client_channel/http_proxy.h ) - s.files += %w( src/core/ext/client_channel/initial_connect_string.h ) s.files += %w( src/core/ext/client_channel/lb_policy.h ) s.files += %w( src/core/ext/client_channel/lb_policy_factory.h ) s.files += %w( src/core/ext/client_channel/lb_policy_registry.h ) @@ -539,10 +538,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/client_channel/client_channel_factory.c ) s.files += %w( src/core/ext/client_channel/client_channel_plugin.c ) s.files += %w( src/core/ext/client_channel/connector.c ) - s.files += %w( src/core/ext/client_channel/default_initial_connect_string.c ) s.files += %w( src/core/ext/client_channel/http_connect_handshaker.c ) s.files += %w( src/core/ext/client_channel/http_proxy.c ) - s.files += %w( src/core/ext/client_channel/initial_connect_string.c ) s.files += %w( src/core/ext/client_channel/lb_policy.c ) s.files += %w( src/core/ext/client_channel/lb_policy_factory.c ) s.files += %w( src/core/ext/client_channel/lb_policy_registry.c ) diff --git a/package.xml b/package.xml index 6250c78ddc9..af24737e39c 100644 --- a/package.xml +++ b/package.xml @@ -332,7 +332,6 @@ - @@ -548,10 +547,8 @@ - - diff --git a/src/core/ext/client_channel/connector.h b/src/core/ext/client_channel/connector.h index 9bff41f003f..94b5fb5c9e1 100644 --- a/src/core/ext/client_channel/connector.h +++ b/src/core/ext/client_channel/connector.h @@ -48,8 +48,6 @@ struct grpc_connector { typedef struct { /** set of pollsets interested in this connection */ grpc_pollset_set *interested_parties; - /** initial connect string to send */ - grpc_slice initial_connect_string; /** deadline for connection */ gpr_timespec deadline; /** channel arguments (to be passed to transport) */ diff --git a/src/core/ext/client_channel/default_initial_connect_string.c b/src/core/ext/client_channel/default_initial_connect_string.c deleted file mode 100644 index 6db82d84ef1..00000000000 --- a/src/core/ext/client_channel/default_initial_connect_string.c +++ /dev/null @@ -1,38 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include -#include "src/core/lib/iomgr/resolve_address.h" - -void grpc_set_default_initial_connect_string(grpc_resolved_address **addr, - grpc_slice *initial_str) {} diff --git a/src/core/ext/client_channel/initial_connect_string.c b/src/core/ext/client_channel/initial_connect_string.c deleted file mode 100644 index 8ebd06c458a..00000000000 --- a/src/core/ext/client_channel/initial_connect_string.c +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "src/core/ext/client_channel/initial_connect_string.h" - -#include - -extern void grpc_set_default_initial_connect_string( - grpc_resolved_address **addr, grpc_slice *initial_str); - -static grpc_set_initial_connect_string_func g_set_initial_connect_string_func = - grpc_set_default_initial_connect_string; - -void grpc_test_set_initial_connect_string_function( - grpc_set_initial_connect_string_func func) { - g_set_initial_connect_string_func = func; -} - -void grpc_set_initial_connect_string(grpc_resolved_address **addr, - grpc_slice *initial_str) { - g_set_initial_connect_string_func(addr, initial_str); -} diff --git a/src/core/ext/client_channel/initial_connect_string.h b/src/core/ext/client_channel/initial_connect_string.h deleted file mode 100644 index 876abea40e4..00000000000 --- a/src/core/ext/client_channel/initial_connect_string.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef GRPC_CORE_EXT_CLIENT_CHANNEL_INITIAL_CONNECT_STRING_H -#define GRPC_CORE_EXT_CLIENT_CHANNEL_INITIAL_CONNECT_STRING_H - -#include -#include "src/core/lib/iomgr/resolve_address.h" - -typedef void (*grpc_set_initial_connect_string_func)( - grpc_resolved_address **addr, grpc_slice *initial_str); - -void grpc_test_set_initial_connect_string_function( - grpc_set_initial_connect_string_func func); - -/** Set a string to be sent once connected. Optionally reset addr. */ -void grpc_set_initial_connect_string(grpc_resolved_address **addr, - grpc_slice *connect_string); - -#endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_INITIAL_CONNECT_STRING_H */ diff --git a/src/core/ext/client_channel/subchannel.c b/src/core/ext/client_channel/subchannel.c index aa036e883ba..15021a240a1 100644 --- a/src/core/ext/client_channel/subchannel.c +++ b/src/core/ext/client_channel/subchannel.c @@ -41,7 +41,6 @@ #include #include "src/core/ext/client_channel/client_channel.h" -#include "src/core/ext/client_channel/initial_connect_string.h" #include "src/core/ext/client_channel/parse_address.h" #include "src/core/ext/client_channel/proxy_mapper_registry.h" #include "src/core/ext/client_channel/subchannel_index.h" @@ -103,9 +102,6 @@ struct grpc_subchannel { grpc_subchannel_key *key; - /** initial string to send to peer */ - grpc_slice initial_connect_string; - /** set during connection */ grpc_connect_out_args connecting_result; @@ -214,7 +210,6 @@ static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg, grpc_subchannel *c = arg; gpr_free((void *)c->filters); grpc_channel_args_destroy(exec_ctx, c->args); - grpc_slice_unref_internal(exec_ctx, c->initial_connect_string); grpc_connectivity_state_destroy(exec_ctx, &c->state_tracker); grpc_connector_unref(exec_ctx, c->connector); grpc_pollset_set_destroy(c->pollset_set); @@ -333,7 +328,6 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx, c->pollset_set = grpc_pollset_set_create(); grpc_resolved_address *addr = gpr_malloc(sizeof(*addr)); grpc_get_subchannel_address_arg(args->args, addr); - grpc_set_initial_connect_string(&addr, &c->initial_connect_string); grpc_resolved_address *new_address = NULL; grpc_channel_args *new_args = NULL; if (grpc_proxy_mappers_map_address(exec_ctx, addr, args->args, &new_address, @@ -406,7 +400,6 @@ static void continue_connect_locked(grpc_exec_ctx *exec_ctx, args.interested_parties = c->pollset_set; args.deadline = c->next_attempt; args.channel_args = c->args; - args.initial_connect_string = c->initial_connect_string; grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_CONNECTING, GRPC_ERROR_NONE, diff --git a/src/core/ext/transport/chttp2/client/chttp2_connector.c b/src/core/ext/transport/chttp2/client/chttp2_connector.c index d0a762a2803..e7d6801a44e 100644 --- a/src/core/ext/transport/chttp2/client/chttp2_connector.c +++ b/src/core/ext/transport/chttp2/client/chttp2_connector.c @@ -63,8 +63,6 @@ typedef struct { grpc_closure *notify; grpc_connect_in_args args; grpc_connect_out_args *result; - grpc_closure initial_string_sent; - grpc_slice_buffer initial_string_buffer; grpc_endpoint *endpoint; // Non-NULL until handshaking starts. @@ -82,7 +80,6 @@ static void chttp2_connector_unref(grpc_exec_ctx *exec_ctx, grpc_connector *con) { chttp2_connector *c = (chttp2_connector *)con; if (gpr_unref(&c->refs)) { - /* c->initial_string_buffer does not need to be destroyed */ gpr_mu_destroy(&c->mu); // If handshaking is not yet in progress, destroy the endpoint. // Otherwise, the handshaker will do this for us. @@ -160,28 +157,6 @@ static void start_handshake_locked(grpc_exec_ctx *exec_ctx, c->endpoint = NULL; // Endpoint handed off to handshake manager. } -static void on_initial_connect_string_sent(grpc_exec_ctx *exec_ctx, void *arg, - grpc_error *error) { - chttp2_connector *c = arg; - gpr_mu_lock(&c->mu); - if (error != GRPC_ERROR_NONE || c->shutdown) { - if (error == GRPC_ERROR_NONE) { - error = GRPC_ERROR_CREATE("connector shutdown"); - } else { - error = GRPC_ERROR_REF(error); - } - memset(c->result, 0, sizeof(*c->result)); - grpc_closure *notify = c->notify; - c->notify = NULL; - grpc_closure_sched(exec_ctx, notify, error); - gpr_mu_unlock(&c->mu); - chttp2_connector_unref(exec_ctx, arg); - } else { - start_handshake_locked(exec_ctx, c); - gpr_mu_unlock(&c->mu); - } -} - static void connected(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { chttp2_connector *c = arg; gpr_mu_lock(&c->mu); @@ -204,17 +179,7 @@ static void connected(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { chttp2_connector_unref(exec_ctx, arg); } else { GPR_ASSERT(c->endpoint != NULL); - if (!GRPC_SLICE_IS_EMPTY(c->args.initial_connect_string)) { - grpc_closure_init(&c->initial_string_sent, on_initial_connect_string_sent, - c, grpc_schedule_on_exec_ctx); - grpc_slice_buffer_init(&c->initial_string_buffer); - grpc_slice_buffer_add(&c->initial_string_buffer, - c->args.initial_connect_string); - grpc_endpoint_write(exec_ctx, c->endpoint, &c->initial_string_buffer, - &c->initial_string_sent); - } else { - start_handshake_locked(exec_ctx, c); - } + start_handshake_locked(exec_ctx, c); gpr_mu_unlock(&c->mu); } } diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index 1a3b775c609..3429e2b29bd 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -101,7 +101,7 @@ Pod::Spec.new do |s| s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.1.0' + s.dependency '!ProtoCompiler', '3.0.2' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.1' s.osx.deployment_target = '10.9' diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index a9f20e6d2a8..8d813e9d15f 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -250,10 +250,8 @@ CORE_SOURCE_FILES = [ 'src/core/ext/client_channel/client_channel_factory.c', 'src/core/ext/client_channel/client_channel_plugin.c', 'src/core/ext/client_channel/connector.c', - 'src/core/ext/client_channel/default_initial_connect_string.c', 'src/core/ext/client_channel/http_connect_handshaker.c', 'src/core/ext/client_channel/http_proxy.c', - 'src/core/ext/client_channel/initial_connect_string.c', 'src/core/ext/client_channel/lb_policy.c', 'src/core/ext/client_channel/lb_policy_factory.c', 'src/core/ext/client_channel/lb_policy_registry.c', diff --git a/test/core/client_channel/set_initial_connect_string_test.c b/test/core/client_channel/set_initial_connect_string_test.c deleted file mode 100644 index a0a33667cc8..00000000000 --- a/test/core/client_channel/set_initial_connect_string_test.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/* With the addition of a libuv endpoint, sockaddr.h now includes uv.h when - using that endpoint. Because of various transitive includes in uv.h, - including windows.h on Windows, uv.h must be included before other system - headers. Therefore, sockaddr.h must always be included first */ -#include "src/core/lib/iomgr/sockaddr.h" - -#include - -#include -#include -#include -#include -#include -#include - -#include "src/core/ext/client_channel/initial_connect_string.h" -#include "src/core/lib/iomgr/sockaddr.h" -#include "src/core/lib/security/credentials/fake/fake_credentials.h" -#include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" -#include "test/core/util/port.h" -#include "test/core/util/test_config.h" -#include "test/core/util/test_tcp_server.h" - -struct rpc_state { - char *target; - grpc_channel_credentials *creds; - grpc_completion_queue *cq; - grpc_channel *channel; - grpc_call *call; - grpc_op op; - grpc_slice_buffer incoming_buffer; - grpc_slice_buffer temp_incoming_buffer; - grpc_endpoint *tcp; - gpr_atm done_atm; -}; - -static const char *magic_connect_string = "magic initial string"; -static int server_port; -static struct rpc_state state; -static grpc_closure on_read; - -static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { - GPR_ASSERT(error == GRPC_ERROR_NONE); - grpc_slice_buffer_move_into(&state.temp_incoming_buffer, - &state.incoming_buffer); - gpr_log(GPR_DEBUG, "got %" PRIuPTR " bytes, magic is %" PRIuPTR " bytes", - state.incoming_buffer.length, strlen(magic_connect_string)); - if (state.incoming_buffer.length > strlen(magic_connect_string)) { - gpr_atm_rel_store(&state.done_atm, 1); - grpc_endpoint_shutdown( - exec_ctx, state.tcp, - GRPC_ERROR_CREATE("Incoming buffer longer than magic_connect_string")); - grpc_endpoint_destroy(exec_ctx, state.tcp); - } else { - grpc_endpoint_read(exec_ctx, state.tcp, &state.temp_incoming_buffer, - &on_read); - } -} - -static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp, - grpc_pollset *accepting_pollset, - grpc_tcp_server_acceptor *acceptor) { - gpr_free(acceptor); - test_tcp_server *server = arg; - grpc_closure_init(&on_read, handle_read, NULL, grpc_schedule_on_exec_ctx); - grpc_slice_buffer_init(&state.incoming_buffer); - grpc_slice_buffer_init(&state.temp_incoming_buffer); - state.tcp = tcp; - grpc_endpoint_add_to_pollset(exec_ctx, tcp, server->pollset); - grpc_endpoint_read(exec_ctx, tcp, &state.temp_incoming_buffer, &on_read); -} - -static void set_magic_initial_string(grpc_resolved_address **addr, - grpc_slice *connect_string) { - GPR_ASSERT(addr); - GPR_ASSERT((*addr)->len); - *connect_string = grpc_slice_from_copied_string(magic_connect_string); -} - -static void reset_addr_and_set_magic_string(grpc_resolved_address **addr, - grpc_slice *connect_string) { - struct sockaddr_in target; - *connect_string = grpc_slice_from_copied_string(magic_connect_string); - gpr_free(*addr); - target.sin_family = AF_INET; - target.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - target.sin_port = htons((uint16_t)server_port); - *addr = (grpc_resolved_address *)gpr_malloc(sizeof(grpc_resolved_address)); - (*addr)->len = sizeof(target); - memcpy((*addr)->addr, &target, sizeof(target)); -} - -static gpr_timespec n_sec_deadline(int seconds) { - return gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_seconds(seconds, GPR_TIMESPAN)); -} - -static void start_rpc(int use_creds, int target_port) { - state.cq = grpc_completion_queue_create(NULL); - if (use_creds) { - state.creds = grpc_fake_transport_security_credentials_create(); - } else { - state.creds = NULL; - } - gpr_join_host_port(&state.target, "127.0.0.1", target_port); - if (use_creds) { - state.channel = - grpc_secure_channel_create(state.creds, state.target, NULL, NULL); - } else { - state.channel = grpc_insecure_channel_create(state.target, NULL, NULL); - } - grpc_slice host = grpc_slice_from_static_string("localhost"); - state.call = grpc_channel_create_call( - state.channel, NULL, GRPC_PROPAGATE_DEFAULTS, state.cq, - grpc_slice_from_static_string("/Service/Method"), &host, - gpr_inf_future(GPR_CLOCK_REALTIME), NULL); - memset(&state.op, 0, sizeof(state.op)); - state.op.op = GRPC_OP_SEND_INITIAL_METADATA; - state.op.data.send_initial_metadata.count = 0; - state.op.flags = 0; - state.op.reserved = NULL; - GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(state.call, &state.op, - (size_t)(1), NULL, NULL)); - grpc_completion_queue_next(state.cq, n_sec_deadline(5), NULL); -} - -static void cleanup_rpc(void) { - grpc_event ev; - grpc_slice_buffer_destroy(&state.incoming_buffer); - grpc_slice_buffer_destroy(&state.temp_incoming_buffer); - grpc_channel_credentials_release(state.creds); - grpc_call_destroy(state.call); - grpc_completion_queue_shutdown(state.cq); - do { - ev = grpc_completion_queue_next(state.cq, n_sec_deadline(1), NULL); - } while (ev.type != GRPC_QUEUE_SHUTDOWN); - grpc_completion_queue_destroy(state.cq); - grpc_channel_destroy(state.channel); - gpr_free(state.target); -} - -typedef struct { - test_tcp_server *server; - gpr_event *signal_when_done; -} poll_args; - -static void actually_poll_server(void *arg) { - poll_args *pa = arg; - gpr_timespec deadline = n_sec_deadline(10); - while (true) { - bool done = gpr_atm_acq_load(&state.done_atm) != 0; - gpr_timespec time_left = - gpr_time_sub(deadline, gpr_now(GPR_CLOCK_REALTIME)); - gpr_log(GPR_DEBUG, "done=%d, time_left=%" PRId64 ".%09" PRId32, done, - time_left.tv_sec, time_left.tv_nsec); - if (done || gpr_time_cmp(time_left, gpr_time_0(GPR_TIMESPAN)) < 0) { - break; - } - test_tcp_server_poll(pa->server, 1); - } - gpr_event_set(pa->signal_when_done, (void *)1); - gpr_free(pa); -} - -static void poll_server_until_read_done(test_tcp_server *server, - gpr_event *signal_when_done) { - gpr_atm_rel_store(&state.done_atm, 0); - gpr_thd_id id; - poll_args *pa = gpr_malloc(sizeof(*pa)); - pa->server = server; - pa->signal_when_done = signal_when_done; - gpr_thd_new(&id, actually_poll_server, pa, NULL); -} - -static void match_initial_magic_string(grpc_slice_buffer *buffer) { - size_t i, j, cmp_length; - size_t magic_length = strlen(magic_connect_string); - GPR_ASSERT(buffer->length >= magic_length); - for (i = 0, j = 0; i < state.incoming_buffer.count && j < magic_length; i++) { - char *dump = grpc_slice_to_c_string(state.incoming_buffer.slices[i]); - cmp_length = GPR_MIN(strlen(dump), magic_length - j); - GPR_ASSERT(strncmp(dump, magic_connect_string + j, cmp_length) == 0); - j += cmp_length; - gpr_free(dump); - } -} - -static void test_initial_string(test_tcp_server *server, int secure) { - gpr_event ev; - gpr_event_init(&ev); - grpc_test_set_initial_connect_string_function(set_magic_initial_string); - poll_server_until_read_done(server, &ev); - start_rpc(secure, server_port); - gpr_event_wait(&ev, gpr_inf_future(GPR_CLOCK_REALTIME)); - match_initial_magic_string(&state.incoming_buffer); - cleanup_rpc(); -} - -static void test_initial_string_with_redirect(test_tcp_server *server, - int secure) { - gpr_event ev; - gpr_event_init(&ev); - int another_port = grpc_pick_unused_port_or_die(); - grpc_test_set_initial_connect_string_function( - reset_addr_and_set_magic_string); - poll_server_until_read_done(server, &ev); - start_rpc(secure, another_port); - gpr_event_wait(&ev, gpr_inf_future(GPR_CLOCK_REALTIME)); - match_initial_magic_string(&state.incoming_buffer); - cleanup_rpc(); -} - -static void run_test(void (*test)(test_tcp_server *server, int secure), - int secure) { - test_tcp_server test_server; - server_port = grpc_pick_unused_port_or_die(); - test_tcp_server_init(&test_server, on_connect, &test_server); - test_tcp_server_start(&test_server, server_port); - test(&test_server, secure); - test_tcp_server_destroy(&test_server); -} - -int main(int argc, char **argv) { - grpc_test_init(argc, argv); - grpc_init(); - - run_test(test_initial_string, 0); - run_test(test_initial_string, 1); - run_test(test_initial_string_with_redirect, 0); - run_test(test_initial_string_with_redirect, 1); - - grpc_shutdown(); - return 0; -} diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index ce7e1036478..f7d566ed643 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -899,13 +899,10 @@ src/core/ext/client_channel/client_channel_factory.h \ src/core/ext/client_channel/client_channel_plugin.c \ src/core/ext/client_channel/connector.c \ src/core/ext/client_channel/connector.h \ -src/core/ext/client_channel/default_initial_connect_string.c \ src/core/ext/client_channel/http_connect_handshaker.c \ src/core/ext/client_channel/http_connect_handshaker.h \ src/core/ext/client_channel/http_proxy.c \ src/core/ext/client_channel/http_proxy.h \ -src/core/ext/client_channel/initial_connect_string.c \ -src/core/ext/client_channel/initial_connect_string.h \ src/core/ext/client_channel/lb_policy.c \ src/core/ext/client_channel/lb_policy.h \ src/core/ext/client_channel/lb_policy_factory.c \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 046076bd105..a4999fe77eb 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -1897,24 +1897,6 @@ "third_party": false, "type": "target" }, - { - "deps": [ - "gpr", - "gpr_test_util", - "grpc", - "grpc_test_util", - "test_tcp_server" - ], - "headers": [], - "is_filegroup": false, - "language": "c", - "name": "set_initial_connect_string_test", - "src": [ - "test/core/client_channel/set_initial_connect_string_test.c" - ], - "third_party": false, - "type": "target" - }, { "deps": [ "gpr", @@ -7443,7 +7425,6 @@ "src/core/ext/client_channel/connector.h", "src/core/ext/client_channel/http_connect_handshaker.h", "src/core/ext/client_channel/http_proxy.h", - "src/core/ext/client_channel/initial_connect_string.h", "src/core/ext/client_channel/lb_policy.h", "src/core/ext/client_channel/lb_policy_factory.h", "src/core/ext/client_channel/lb_policy_registry.h", @@ -7469,13 +7450,10 @@ "src/core/ext/client_channel/client_channel_plugin.c", "src/core/ext/client_channel/connector.c", "src/core/ext/client_channel/connector.h", - "src/core/ext/client_channel/default_initial_connect_string.c", "src/core/ext/client_channel/http_connect_handshaker.c", "src/core/ext/client_channel/http_connect_handshaker.h", "src/core/ext/client_channel/http_proxy.c", "src/core/ext/client_channel/http_proxy.h", - "src/core/ext/client_channel/initial_connect_string.c", - "src/core/ext/client_channel/initial_connect_string.h", "src/core/ext/client_channel/lb_policy.c", "src/core/ext/client_channel/lb_policy.h", "src/core/ext/client_channel/lb_policy_factory.c", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 9206d209b54..c47ee0b1e9e 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -1915,30 +1915,6 @@ "windows" ] }, - { - "args": [], - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 0.1, - "exclude_configs": [], - "exclude_iomgrs": [ - "uv" - ], - "flaky": false, - "gtest": false, - "language": "c", - "name": "set_initial_connect_string_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ] - }, { "args": [], "ci_platforms": [ diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln index ca7f969aa1b..a81e349ce3a 100644 --- a/vsprojects/buildtests_c.sln +++ b/vsprojects/buildtests_c.sln @@ -1377,18 +1377,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "server_test", "vcxproj\test {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} EndProjectSection EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "set_initial_connect_string_test", "vcxproj\test\set_initial_connect_string_test\set_initial_connect_string_test.vcxproj", "{4A48E5A5-2E69-ED6D-063C-C297180A54D0}" - ProjectSection(myProperties) = preProject - lib = "False" - EndProjectSection - ProjectSection(ProjectDependencies) = postProject - {E3110C46-A148-FF65-08FD-3324829BE7FE} = {E3110C46-A148-FF65-08FD-3324829BE7FE} - {17BCAFC0-5FDC-4C94-AEB9-95F3E220614B} = {17BCAFC0-5FDC-4C94-AEB9-95F3E220614B} - {29D16885-7228-4C31-81ED-5F9187C7F2A9} = {29D16885-7228-4C31-81ED-5F9187C7F2A9} - {EAB0A629-17A9-44DB-B5FF-E91A721FE037} = {EAB0A629-17A9-44DB-B5FF-E91A721FE037} - {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} - EndProjectSection -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "simple_request_bad_client_test", "vcxproj\test\simple_request_bad_client_test\simple_request_bad_client_test.vcxproj", "{63422647-93FA-46BB-4827-95473D9D503C}" ProjectSection(myProperties) = preProject lib = "False" @@ -3666,22 +3654,6 @@ Global {E765AC67-E4E5-C350-59A1-C6CA2BD9F64B}.Release-DLL|Win32.Build.0 = Release|Win32 {E765AC67-E4E5-C350-59A1-C6CA2BD9F64B}.Release-DLL|x64.ActiveCfg = Release|x64 {E765AC67-E4E5-C350-59A1-C6CA2BD9F64B}.Release-DLL|x64.Build.0 = Release|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug|Win32.ActiveCfg = Debug|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug|x64.ActiveCfg = Debug|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release|Win32.ActiveCfg = Release|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release|x64.ActiveCfg = Release|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug|Win32.Build.0 = Debug|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug|x64.Build.0 = Debug|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release|Win32.Build.0 = Release|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release|x64.Build.0 = Release|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug-DLL|Win32.ActiveCfg = Debug|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug-DLL|Win32.Build.0 = Debug|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug-DLL|x64.ActiveCfg = Debug|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Debug-DLL|x64.Build.0 = Debug|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release-DLL|Win32.ActiveCfg = Release|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release-DLL|Win32.Build.0 = Release|Win32 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release-DLL|x64.ActiveCfg = Release|x64 - {4A48E5A5-2E69-ED6D-063C-C297180A54D0}.Release-DLL|x64.Build.0 = Release|x64 {63422647-93FA-46BB-4827-95473D9D503C}.Debug|Win32.ActiveCfg = Debug|Win32 {63422647-93FA-46BB-4827-95473D9D503C}.Debug|x64.ActiveCfg = Debug|x64 {63422647-93FA-46BB-4827-95473D9D503C}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index 73d511ef7ce..ac69af3ba7e 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -455,7 +455,6 @@ - @@ -849,14 +848,10 @@ - - - - diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index dae55041a0b..3c066687519 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -529,18 +529,12 @@ src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel @@ -1238,9 +1232,6 @@ src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 5bdbff9a6ac..e47707bfa86 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -421,7 +421,6 @@ - @@ -766,14 +765,10 @@ - - - - diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index b2b46b052b7..c50cb6102f6 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -457,18 +457,12 @@ src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel @@ -1076,9 +1070,6 @@ src\core\ext\client_channel - - src\core\ext\client_channel - src\core\ext\client_channel diff --git a/vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj b/vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj deleted file mode 100644 index a438391f252..00000000000 --- a/vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {4A48E5A5-2E69-ED6D-063C-C297180A54D0} - true - $(SolutionDir)IntDir\$(MSBuildProjectName)\ - - - - v100 - - - v110 - - - v120 - - - v140 - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - - set_initial_connect_string_test - static - Debug - static - Debug - - - set_initial_connect_string_test - static - Release - static - Release - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreadedDebug - true - None - false - - - Console - true - false - - - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreadedDebug - true - None - false - - - Console - true - false - - - - - - NotUsing - Level3 - MaxSpeed - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - true - true - MultiThreaded - true - None - false - - - Console - true - false - true - true - - - - - - NotUsing - Level3 - MaxSpeed - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - true - true - MultiThreaded - true - None - false - - - Console - true - false - true - true - - - - - - - - - - {E3110C46-A148-FF65-08FD-3324829BE7FE} - - - {17BCAFC0-5FDC-4C94-AEB9-95F3E220614B} - - - {29D16885-7228-4C31-81ED-5F9187C7F2A9} - - - {EAB0A629-17A9-44DB-B5FF-E91A721FE037} - - - {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/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj.filters b/vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj.filters deleted file mode 100644 index 4422a3e7925..00000000000 --- a/vsprojects/vcxproj/test/set_initial_connect_string_test/set_initial_connect_string_test.vcxproj.filters +++ /dev/null @@ -1,21 +0,0 @@ - - - - - test\core\client_channel - - - - - - {413358e4-3165-f09d-071c-ee4f2ca0b826} - - - {a554b5ef-0c80-ac03-1848-bccd947a06a6} - - - {4726253c-a562-0ace-2798-996807381208} - - - - From d6d192d00591ba278115e73d264f279fe248d544 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Feb 2017 08:58:42 -0800 Subject: [PATCH 002/186] Retry throttling implementation. --- BUILD | 2 + CMakeLists.txt | 4 + Makefile | 4 + binding.gyp | 1 + build.yaml | 2 + config.m4 | 1 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + package.xml | 2 + src/core/ext/client_channel/client_channel.c | 125 ++++++++- .../client_channel/client_channel_plugin.c | 3 + src/core/ext/client_channel/retry_throttle.c | 242 ++++++++++++++++++ src/core/ext/client_channel/retry_throttle.h | 69 +++++ src/core/lib/transport/service_config.c | 12 + src/core/lib/transport/service_config.h | 6 + src/python/grpcio/grpc_core_dependencies.py | 1 + tools/doxygen/Doxyfile.core.internal | 2 + .../generated/sources_and_headers.json | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 6 + .../grpc_unsecure/grpc_unsecure.vcxproj | 3 + .../grpc_unsecure.vcxproj.filters | 6 + 22 files changed, 496 insertions(+), 6 deletions(-) create mode 100644 src/core/ext/client_channel/retry_throttle.c create mode 100644 src/core/ext/client_channel/retry_throttle.h diff --git a/BUILD b/BUILD index 9fee9085723..2df30b81802 100644 --- a/BUILD +++ b/BUILD @@ -692,6 +692,7 @@ grpc_cc_library( "src/core/ext/client_channel/resolver.c", "src/core/ext/client_channel/resolver_factory.c", "src/core/ext/client_channel/resolver_registry.c", + "src/core/ext/client_channel/retry_throttle.c", "src/core/ext/client_channel/subchannel.c", "src/core/ext/client_channel/subchannel_index.c", "src/core/ext/client_channel/uri_parser.c", @@ -712,6 +713,7 @@ grpc_cc_library( "src/core/ext/client_channel/resolver.h", "src/core/ext/client_channel/resolver_factory.h", "src/core/ext/client_channel/resolver_registry.h", + "src/core/ext/client_channel/retry_throttle.h", "src/core/ext/client_channel/subchannel.h", "src/core/ext/client_channel/subchannel_index.h", "src/core/ext/client_channel/uri_parser.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index ca0a668f580..ebe28f55bb4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1017,6 +1017,7 @@ add_library(grpc src/core/ext/client_channel/resolver.c src/core/ext/client_channel/resolver_factory.c src/core/ext/client_channel/resolver_registry.c + src/core/ext/client_channel/retry_throttle.c src/core/ext/client_channel/subchannel.c src/core/ext/client_channel/subchannel_index.c src/core/ext/client_channel/uri_parser.c @@ -1299,6 +1300,7 @@ add_library(grpc_cronet src/core/ext/client_channel/resolver.c src/core/ext/client_channel/resolver_factory.c src/core/ext/client_channel/resolver_registry.c + src/core/ext/client_channel/retry_throttle.c src/core/ext/client_channel/subchannel.c src/core/ext/client_channel/subchannel_index.c src/core/ext/client_channel/uri_parser.c @@ -1849,6 +1851,7 @@ add_library(grpc_unsecure src/core/ext/client_channel/resolver.c src/core/ext/client_channel/resolver_factory.c src/core/ext/client_channel/resolver_registry.c + src/core/ext/client_channel/retry_throttle.c src/core/ext/client_channel/subchannel.c src/core/ext/client_channel/subchannel_index.c src/core/ext/client_channel/uri_parser.c @@ -2427,6 +2430,7 @@ add_library(grpc++_cronet src/core/ext/client_channel/resolver.c src/core/ext/client_channel/resolver_factory.c src/core/ext/client_channel/resolver_registry.c + src/core/ext/client_channel/retry_throttle.c src/core/ext/client_channel/subchannel.c src/core/ext/client_channel/subchannel_index.c src/core/ext/client_channel/uri_parser.c diff --git a/Makefile b/Makefile index 93486bd2e4c..4a4c8733844 100644 --- a/Makefile +++ b/Makefile @@ -2865,6 +2865,7 @@ LIBGRPC_SRC = \ src/core/ext/client_channel/resolver.c \ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_registry.c \ + src/core/ext/client_channel/retry_throttle.c \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel_index.c \ src/core/ext/client_channel/uri_parser.c \ @@ -3150,6 +3151,7 @@ LIBGRPC_CRONET_SRC = \ src/core/ext/client_channel/resolver.c \ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_registry.c \ + src/core/ext/client_channel/retry_throttle.c \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel_index.c \ src/core/ext/client_channel/uri_parser.c \ @@ -3683,6 +3685,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/ext/client_channel/resolver.c \ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_registry.c \ + src/core/ext/client_channel/retry_throttle.c \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel_index.c \ src/core/ext/client_channel/uri_parser.c \ @@ -4263,6 +4266,7 @@ LIBGRPC++_CRONET_SRC = \ src/core/ext/client_channel/resolver.c \ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_registry.c \ + src/core/ext/client_channel/retry_throttle.c \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel_index.c \ src/core/ext/client_channel/uri_parser.c \ diff --git a/binding.gyp b/binding.gyp index 8ff3d8c1a34..5aa6ee8d234 100644 --- a/binding.gyp +++ b/binding.gyp @@ -790,6 +790,7 @@ 'src/core/ext/client_channel/resolver.c', 'src/core/ext/client_channel/resolver_factory.c', 'src/core/ext/client_channel/resolver_registry.c', + 'src/core/ext/client_channel/retry_throttle.c', 'src/core/ext/client_channel/subchannel.c', 'src/core/ext/client_channel/subchannel_index.c', 'src/core/ext/client_channel/uri_parser.c', diff --git a/build.yaml b/build.yaml index 55f011129a5..f72a992a602 100644 --- a/build.yaml +++ b/build.yaml @@ -416,6 +416,7 @@ filegroups: - src/core/ext/client_channel/resolver.h - src/core/ext/client_channel/resolver_factory.h - src/core/ext/client_channel/resolver_registry.h + - src/core/ext/client_channel/retry_throttle.h - src/core/ext/client_channel/subchannel.h - src/core/ext/client_channel/subchannel_index.h - src/core/ext/client_channel/uri_parser.h @@ -438,6 +439,7 @@ filegroups: - src/core/ext/client_channel/resolver.c - src/core/ext/client_channel/resolver_factory.c - src/core/ext/client_channel/resolver_registry.c + - src/core/ext/client_channel/retry_throttle.c - src/core/ext/client_channel/subchannel.c - src/core/ext/client_channel/subchannel_index.c - src/core/ext/client_channel/uri_parser.c diff --git a/config.m4 b/config.m4 index 90536e503ed..5eaf161f096 100644 --- a/config.m4 +++ b/config.m4 @@ -269,6 +269,7 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/client_channel/resolver.c \ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_registry.c \ + src/core/ext/client_channel/retry_throttle.c \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel_index.c \ src/core/ext/client_channel/uri_parser.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 759310346fb..1fb644ba9d5 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -417,6 +417,7 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/resolver.h', 'src/core/ext/client_channel/resolver_factory.h', 'src/core/ext/client_channel/resolver_registry.h', + 'src/core/ext/client_channel/retry_throttle.h', 'src/core/ext/client_channel/subchannel.h', 'src/core/ext/client_channel/subchannel_index.h', 'src/core/ext/client_channel/uri_parser.h', @@ -636,6 +637,7 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/resolver.c', 'src/core/ext/client_channel/resolver_factory.c', 'src/core/ext/client_channel/resolver_registry.c', + 'src/core/ext/client_channel/retry_throttle.c', 'src/core/ext/client_channel/subchannel.c', 'src/core/ext/client_channel/subchannel_index.c', 'src/core/ext/client_channel/uri_parser.c', @@ -851,6 +853,7 @@ Pod::Spec.new do |s| 'src/core/ext/client_channel/resolver.h', 'src/core/ext/client_channel/resolver_factory.h', 'src/core/ext/client_channel/resolver_registry.h', + 'src/core/ext/client_channel/retry_throttle.h', 'src/core/ext/client_channel/subchannel.h', 'src/core/ext/client_channel/subchannel_index.h', 'src/core/ext/client_channel/uri_parser.h', diff --git a/grpc.gemspec b/grpc.gemspec index 82c9d680801..fae773d7468 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -334,6 +334,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/client_channel/resolver.h ) s.files += %w( src/core/ext/client_channel/resolver_factory.h ) s.files += %w( src/core/ext/client_channel/resolver_registry.h ) + s.files += %w( src/core/ext/client_channel/retry_throttle.h ) s.files += %w( src/core/ext/client_channel/subchannel.h ) s.files += %w( src/core/ext/client_channel/subchannel_index.h ) s.files += %w( src/core/ext/client_channel/uri_parser.h ) @@ -553,6 +554,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/client_channel/resolver.c ) s.files += %w( src/core/ext/client_channel/resolver_factory.c ) s.files += %w( src/core/ext/client_channel/resolver_registry.c ) + s.files += %w( src/core/ext/client_channel/retry_throttle.c ) s.files += %w( src/core/ext/client_channel/subchannel.c ) s.files += %w( src/core/ext/client_channel/subchannel_index.c ) s.files += %w( src/core/ext/client_channel/uri_parser.c ) diff --git a/package.xml b/package.xml index e4db6a7d2e5..d4a05f7e872 100644 --- a/package.xml +++ b/package.xml @@ -343,6 +343,7 @@ + @@ -562,6 +563,7 @@ + diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index 6cbc333b832..1cc2b9455fe 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -47,6 +47,7 @@ #include "src/core/ext/client_channel/lb_policy_registry.h" #include "src/core/ext/client_channel/proxy_mapper_registry.h" #include "src/core/ext/client_channel/resolver_registry.h" +#include "src/core/ext/client_channel/retry_throttle.h" #include "src/core/ext/client_channel/subchannel.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/connected_channel.h" @@ -165,6 +166,8 @@ typedef struct client_channel_channel_data { grpc_combiner *combiner; /** currently active load balancer */ grpc_lb_policy *lb_policy; + /** retry throttle data */ + grpc_server_retry_throttle_data *retry_throttle_data; /** maps method names to method_parameters structs */ grpc_slice_hash_table *method_params_table; /** incoming resolver result - set by resolver.next() */ @@ -260,6 +263,64 @@ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand, &w->on_changed); } +typedef struct { + char *server_name; + grpc_server_retry_throttle_data *retry_throttle_data; +} service_config_parsing_state; + +static void parse_retry_throttle_params(const grpc_json *field, void *arg) { + service_config_parsing_state *parsing_state = arg; + if (strcmp(field->key, "retryThrottling") == 0) { + if (parsing_state->retry_throttle_data != NULL) return; // Duplicate. + if (field->type != GRPC_JSON_OBJECT) return; + int max_milli_tokens = 0; + int milli_token_ratio = 0; + for (grpc_json *sub_field = field->child; sub_field != NULL; + sub_field = sub_field->next) { + if (sub_field->key == NULL) continue; + if (strcmp(sub_field->key, "maxTokens") == 0) { + if (max_milli_tokens != 0) return; // Duplicate. + if (sub_field->type != GRPC_JSON_NUMBER) return; + max_milli_tokens = gpr_parse_nonnegative_int(sub_field->value); + if (max_milli_tokens == -1) return; + max_milli_tokens *= 1000; + } else if (strcmp(sub_field->key, "tokenRatio") == 0) { + if (milli_token_ratio != 0) return; // Duplicate. + if (sub_field->type != GRPC_JSON_NUMBER) return; + // We support up to 3 decimal digits. + size_t whole_len = strlen(sub_field->value); + uint32_t multiplier = 1; + uint32_t decimal_value = 0; + const char *decimal_point = strchr(sub_field->value, '.'); + if (decimal_point != NULL) { + whole_len = (size_t)(decimal_point - sub_field->value); + multiplier = 1000; + size_t decimal_len = strlen(decimal_point + 1); + if (decimal_len > 3) decimal_len = 3; + if (!gpr_parse_bytes_to_uint32(decimal_point + 1, decimal_len, + &decimal_value)) { + return; + } + uint32_t decimal_multiplier = 1; + for (size_t i = 0; i < (3 - decimal_len); ++i) { + decimal_multiplier *= 10; + } + decimal_value *= decimal_multiplier; + } + uint32_t whole_value; + if (!gpr_parse_bytes_to_uint32(sub_field->value, whole_len, + &whole_value)) { + return; + } + milli_token_ratio = (int)((whole_value * multiplier) + decimal_value); + } + } + parsing_state->retry_throttle_data = + grpc_retry_throttle_map_get_data_for_server( + parsing_state->server_name, max_milli_tokens, milli_token_ratio); + } +} + static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { channel_data *chand = arg; @@ -271,6 +332,8 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, bool exit_idle = false; grpc_error *state_error = GRPC_ERROR_CREATE("No load balancing policy"); char *service_config_json = NULL; + service_config_parsing_state parsing_state; + memset(&parsing_state, 0, sizeof(parsing_state)); if (chand->resolver_result != NULL) { // Find LB policy name. @@ -330,6 +393,18 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, grpc_service_config *service_config = grpc_service_config_create(service_config_json); if (service_config != NULL) { + channel_arg = + grpc_channel_args_find(chand->resolver_result, GRPC_ARG_SERVER_URI); + GPR_ASSERT(channel_arg != NULL); + GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING); + grpc_uri *uri = grpc_uri_parse(channel_arg->value.string, true); + GPR_ASSERT(uri->path[0] != '\0'); + parsing_state.server_name = + uri->path[0] == '/' ? uri->path + 1 : uri->path; + grpc_service_config_parse_global_params( + service_config, parse_retry_throttle_params, &parsing_state); + parsing_state.server_name = NULL; + grpc_uri_destroy(uri); method_params_table = grpc_service_config_create_method_config_table( exec_ctx, service_config, method_parameters_create_from_json, &method_parameters_vtable); @@ -361,6 +436,11 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, chand->info_service_config_json = service_config_json; } gpr_mu_unlock(&chand->info_mu); + + if (chand->retry_throttle_data != NULL) { + grpc_server_retry_throttle_data_unref(chand->retry_throttle_data); + } + chand->retry_throttle_data = parsing_state.retry_throttle_data; if (chand->method_params_table != NULL) { grpc_slice_hash_table_unref(exec_ctx, chand->method_params_table); } @@ -589,6 +669,9 @@ static void cc_destroy_channel_elem(grpc_exec_ctx *exec_ctx, } gpr_free(chand->info_lb_policy_name); gpr_free(chand->info_service_config_json); + if (chand->retry_throttle_data != NULL) { + grpc_server_retry_throttle_data_unref(chand->retry_throttle_data); + } if (chand->method_params_table != NULL) { grpc_slice_hash_table_unref(exec_ctx, chand->method_params_table); } @@ -651,6 +734,9 @@ typedef struct client_channel_call_data { grpc_call_stack *owning_call; grpc_linked_mdelem lb_token_mdelem; + + grpc_closure on_complete; + grpc_closure *original_on_complete; } call_data; grpc_subchannel_call *grpc_client_channel_get_subchannel_call( @@ -977,20 +1063,47 @@ static void start_transport_stream_op_locked_inner(grpc_exec_ctx *exec_ctx, add_waiting_locked(calld, op); } -static void cc_start_transport_stream_op_locked(grpc_exec_ctx *exec_ctx, - void *arg, - grpc_error *error_ignored) { - GPR_TIMER_BEGIN("cc_start_transport_stream_op_locked", 0); +static void on_complete_locked(grpc_exec_ctx *exec_ctx, void *arg, + grpc_error *error) { + grpc_call_element *elem = arg; + channel_data *chand = elem->channel_data; + call_data *calld = elem->call_data; + if (chand->retry_throttle_data != NULL) { + if (error == GRPC_ERROR_NONE) { + grpc_server_retry_throttle_data_record_success( + &chand->retry_throttle_data); + } else { + // TODO(roth): In a subsequent PR, check the return value here and + // decide whether or not to retry. + grpc_server_retry_throttle_data_record_failure( + &chand->retry_throttle_data); + } + } + grpc_closure_run(exec_ctx, calld->original_on_complete, error); +} + +static void start_transport_stream_op_locked(grpc_exec_ctx *exec_ctx, void *arg, + grpc_error *error_ignored) { + GPR_TIMER_BEGIN("start_transport_stream_op_locked", 0); grpc_transport_stream_op *op = arg; grpc_call_element *elem = op->handler_private.args[0]; + channel_data *chand = elem->channel_data; call_data *calld = elem->call_data; + if (op->recv_trailing_metadata != NULL) { + GPR_ASSERT(op->on_complete != NULL); + calld->original_on_complete = op->on_complete; + grpc_closure_init(&calld->on_complete, on_complete_locked, elem, + grpc_combiner_scheduler(chand->combiner, false)); + op->on_complete = &calld->on_complete; + } + start_transport_stream_op_locked_inner(exec_ctx, op, elem); GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "start_transport_stream_op"); - GPR_TIMER_END("cc_start_transport_stream_op_locked", 0); + GPR_TIMER_END("start_transport_stream_op_locked", 0); } /* The logic here is fairly complicated, due to (a) the fact that we @@ -1030,7 +1143,7 @@ static void cc_start_transport_stream_op(grpc_exec_ctx *exec_ctx, grpc_closure_sched( exec_ctx, grpc_closure_init(&op->handler_private.closure, - cc_start_transport_stream_op_locked, op, + start_transport_stream_op_locked, op, grpc_combiner_scheduler(chand->combiner, false)), GRPC_ERROR_NONE); GPR_TIMER_END("cc_start_transport_stream_op", 0); diff --git a/src/core/ext/client_channel/client_channel_plugin.c b/src/core/ext/client_channel/client_channel_plugin.c index 6f9df3e386e..c8d2105b47f 100644 --- a/src/core/ext/client_channel/client_channel_plugin.c +++ b/src/core/ext/client_channel/client_channel_plugin.c @@ -43,6 +43,7 @@ #include "src/core/ext/client_channel/lb_policy_registry.h" #include "src/core/ext/client_channel/proxy_mapper_registry.h" #include "src/core/ext/client_channel/resolver_registry.h" +#include "src/core/ext/client_channel/retry_throttle.h" #include "src/core/ext/client_channel/subchannel_index.h" #include "src/core/lib/surface/channel_init.h" @@ -82,6 +83,7 @@ static bool set_default_host_if_unset(grpc_exec_ctx *exec_ctx, void grpc_client_channel_init(void) { grpc_lb_policy_registry_init(); grpc_resolver_registry_init(); + grpc_retry_throttle_map_init(); grpc_proxy_mapper_registry_init(); grpc_register_http_proxy_mapper(); grpc_subchannel_index_init(); @@ -96,6 +98,7 @@ void grpc_client_channel_shutdown(void) { grpc_subchannel_index_shutdown(); grpc_channel_init_shutdown(); grpc_proxy_mapper_registry_shutdown(); + grpc_retry_throttle_map_shutdown(); grpc_resolver_registry_shutdown(); grpc_lb_policy_registry_shutdown(); } diff --git a/src/core/ext/client_channel/retry_throttle.c b/src/core/ext/client_channel/retry_throttle.c new file mode 100644 index 00000000000..2aa52e49033 --- /dev/null +++ b/src/core/ext/client_channel/retry_throttle.c @@ -0,0 +1,242 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/ext/client_channel/retry_throttle.h" + +#include +#include + +#include +#include +#include +#include +#include + +// +// server_retry_throttle_data +// + +struct grpc_server_retry_throttle_data { + gpr_refcount refs; + int max_milli_tokens; + int milli_token_ratio; + gpr_atm milli_tokens; + // A pointer to the replacement for this grpc_server_retry_throttle_data + // entry. If non-NULL, then this entry is stale and must not be used. + // We hold a reference to the replacement. + gpr_atm replacement; +}; + +static void get_replacement_throttle_data_if_needed( + grpc_server_retry_throttle_data** throttle_data) { + while (true) { + grpc_server_retry_throttle_data* new_throttle_data = + (grpc_server_retry_throttle_data*)gpr_atm_acq_load( + &(*throttle_data)->replacement); + if (new_throttle_data == NULL) return; + // Reset *throttle_data to its replacement, updating refcounts as + // appropriate. + // Note: It's safe to do this here, because the caller ensures that + // this will only be called with a given value of throttle_data from + // one thread at a time. + grpc_server_retry_throttle_data_ref(new_throttle_data); + grpc_server_retry_throttle_data* old_throttle_data = *throttle_data; + *throttle_data = new_throttle_data; + grpc_server_retry_throttle_data_unref(old_throttle_data); + } +} + +bool grpc_server_retry_throttle_data_record_failure( + grpc_server_retry_throttle_data** throttle_data) { + // First, check if we are stale and need to be replaced. + get_replacement_throttle_data_if_needed(throttle_data); + // We decrement milli_tokens by 1000 (1 token) for each failure. + const int delta = -1000; + const int old_value = (int)gpr_atm_full_fetch_add( + &(*throttle_data)->milli_tokens, (gpr_atm)delta); + // If the above change takes us below 0, then re-add the excess. Note + // that between these two atomic operations, the value will be + // artificially low by as much as 1000, but this window should be + // brief. + int new_value = old_value - 1000; + if (new_value < 0) { + const int excess_value = new_value - (old_value < 0 ? old_value : 0); + gpr_atm_full_fetch_add(&(*throttle_data)->milli_tokens, + (gpr_atm)-excess_value); + new_value = 0; + } + // Retries are allowed as long as the new value is above the threshold + // (max_milli_tokens / 2). + return new_value > (*throttle_data)->max_milli_tokens / 2; +} + +void grpc_server_retry_throttle_data_record_success( + grpc_server_retry_throttle_data** throttle_data) { + // First, check if we are stale and need to be replaced. + get_replacement_throttle_data_if_needed(throttle_data); + // We increment milli_tokens by milli_token_ratio for each success. + const int delta = (*throttle_data)->milli_token_ratio; + const int old_value = (int)gpr_atm_full_fetch_add( + &(*throttle_data)->milli_tokens, (gpr_atm)delta); + // If the above change takes us over max_milli_tokens, then subtract + // the excess. Note that between these two atomic operations, the + // value will be artificially high by as much as milli_token_ratio, + // but this window should be brief. + const int new_value = old_value + (*throttle_data)->milli_token_ratio; + if (new_value > (*throttle_data)->max_milli_tokens) { + const int excess_value = + new_value - (old_value > (*throttle_data)->max_milli_tokens + ? old_value + : (*throttle_data)->max_milli_tokens); + gpr_atm_full_fetch_add(&(*throttle_data)->milli_tokens, + (gpr_atm)-excess_value); + } +} + +void grpc_server_retry_throttle_data_ref( + grpc_server_retry_throttle_data* throttle_data) { + gpr_ref(&throttle_data->refs); +} + +void grpc_server_retry_throttle_data_unref( + grpc_server_retry_throttle_data* throttle_data) { + if (gpr_unref(&throttle_data->refs)) { + grpc_server_retry_throttle_data* replacement = + (grpc_server_retry_throttle_data*)gpr_atm_acq_load( + &throttle_data->replacement); + if (replacement != NULL) { + grpc_server_retry_throttle_data_unref(replacement); + } + gpr_free(throttle_data); + } +} + +static grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_create( + int max_milli_tokens, int milli_token_ratio, + grpc_server_retry_throttle_data* old_throttle_data) { + grpc_server_retry_throttle_data* throttle_data = + gpr_malloc(sizeof(*throttle_data)); + memset(throttle_data, 0, sizeof(*throttle_data)); + gpr_ref_init(&throttle_data->refs, 1); + throttle_data->max_milli_tokens = max_milli_tokens; + throttle_data->milli_token_ratio = milli_token_ratio; + int initial_milli_tokens = max_milli_tokens; + // If there was a pre-existing entry for this server name, initialize + // the token count by scaling proportionately to the old data. This + // ensures that if we're already throttling retries on the old scale, + // we will start out doing the same thing on the new one. + if (old_throttle_data != NULL) { + double token_fraction = + (int)gpr_atm_acq_load(&old_throttle_data->milli_tokens) / + (double)old_throttle_data->max_milli_tokens; + initial_milli_tokens = (int)(token_fraction * max_milli_tokens); + } + gpr_atm_rel_store(&throttle_data->milli_tokens, + (gpr_atm)initial_milli_tokens); + // If there was a pre-existing entry, mark it as stale and give it a + // pointer to the new entry, which is its replacement. + if (old_throttle_data != NULL) { + grpc_server_retry_throttle_data_ref(throttle_data); + gpr_atm_rel_store(&old_throttle_data->replacement, (gpr_atm)throttle_data); + } + return throttle_data; +} + +// +// avl vtable for string -> server_retry_throttle_data map +// + +static void* copy_server_name(void* key) { return gpr_strdup(key); } + +static long compare_server_name(void* key1, void* key2) { + return strcmp(key1, key2); +} + +static void destroy_server_retry_throttle_data(void* value) { + grpc_server_retry_throttle_data* throttle_data = value; + grpc_server_retry_throttle_data_unref(throttle_data); +} + +static void* copy_server_retry_throttle_data(void* value) { + grpc_server_retry_throttle_data* throttle_data = value; + grpc_server_retry_throttle_data_ref(throttle_data); + return value; +} + +static const gpr_avl_vtable avl_vtable = { + gpr_free /* destroy_key */, copy_server_name, compare_server_name, + destroy_server_retry_throttle_data, copy_server_retry_throttle_data}; + +// +// server_retry_throttle_map +// + +static gpr_mu g_mu; +static gpr_avl g_avl; + +void grpc_retry_throttle_map_init() { + gpr_mu_init(&g_mu); + g_avl = gpr_avl_create(&avl_vtable); +} + +void grpc_retry_throttle_map_shutdown() { + gpr_mu_destroy(&g_mu); + gpr_avl_unref(g_avl); +} + +grpc_server_retry_throttle_data* grpc_retry_throttle_map_get_data_for_server( + const char* server_name, int max_milli_tokens, int milli_token_ratio) { + gpr_mu_lock(&g_mu); + grpc_server_retry_throttle_data* throttle_data = + gpr_avl_get(g_avl, (char*)server_name); + if (throttle_data == NULL) { + // Entry not found. Create a new one. + throttle_data = grpc_server_retry_throttle_data_create( + max_milli_tokens, milli_token_ratio, NULL); + g_avl = gpr_avl_add(g_avl, (char*)server_name, throttle_data); + } else { + if (throttle_data->max_milli_tokens != max_milli_tokens || + throttle_data->milli_token_ratio != milli_token_ratio) { + // Entry found but with old parameters. Create a new one based on + // the original one. + throttle_data = grpc_server_retry_throttle_data_create( + max_milli_tokens, milli_token_ratio, throttle_data); + g_avl = gpr_avl_add(g_avl, (char*)server_name, throttle_data); + } else { + // Entry found. Increase refcount. + grpc_server_retry_throttle_data_ref(throttle_data); + } + } + gpr_mu_unlock(&g_mu); + return throttle_data; +} diff --git a/src/core/ext/client_channel/retry_throttle.h b/src/core/ext/client_channel/retry_throttle.h new file mode 100644 index 00000000000..4209bb7fb66 --- /dev/null +++ b/src/core/ext/client_channel/retry_throttle.h @@ -0,0 +1,69 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_EXT_CLIENT_CHANNEL_RETRY_THROTTLE_H +#define GRPC_CORE_EXT_CLIENT_CHANNEL_RETRY_THROTTLE_H + +#include + +/// Tracks retry throttling data for an individual server name. +typedef struct grpc_server_retry_throttle_data grpc_server_retry_throttle_data; + +/// Records a failure. Returns true if it's okay to send a retry. +/// Updates \a throttle_data if the original value is stale and has been +/// replaced. Not thread safe; caller must synchronize. +bool grpc_server_retry_throttle_data_record_failure( + grpc_server_retry_throttle_data** throttle_data); +/// Records a success. +/// Updates \a throttle_data if the original value is stale and has been +/// replaced. Not thread safe; caller must synchronize. +void grpc_server_retry_throttle_data_record_success( + grpc_server_retry_throttle_data** throttle_data); + +void grpc_server_retry_throttle_data_ref( + grpc_server_retry_throttle_data* throttle_data); +void grpc_server_retry_throttle_data_unref( + grpc_server_retry_throttle_data* throttle_data); + +/// Initializes global map of failure data for each server name. +void grpc_retry_throttle_map_init(); +/// Shuts down global map of failure data for each server name. +void grpc_retry_throttle_map_shutdown(); + +/// Returns a reference to the failure data for \a server_name, creating +/// a new entry if needed. +/// Caller must eventually unref via \a grpc_server_retry_throttle_data_unref(). +grpc_server_retry_throttle_data* grpc_retry_throttle_map_get_data_for_server( + const char* server_name, int max_milli_tokens, int milli_token_ratio); + +#endif /* GRPC_CORE_EXT_CLIENT_CHANNEL_RETRY_THROTTLE_H */ diff --git a/src/core/lib/transport/service_config.c b/src/core/lib/transport/service_config.c index 12da2a88feb..1195f75044a 100644 --- a/src/core/lib/transport/service_config.c +++ b/src/core/lib/transport/service_config.c @@ -93,6 +93,18 @@ void grpc_service_config_destroy(grpc_service_config* service_config) { gpr_free(service_config); } +void grpc_service_config_parse_global_params( + const grpc_service_config* service_config, + void (*process_json)(const grpc_json* json, void* arg), void* arg) { + const grpc_json* json = service_config->json_tree; + if (json->type != GRPC_JSON_OBJECT || json->key != NULL) return; + for (grpc_json* field = json->child; field != NULL; field = field->next) { + if (field->key == NULL) return; + if (strcmp(field->key, "methodConfig") == 0) continue; + process_json(field, arg); + } +} + const char* grpc_service_config_get_lb_policy_name( const grpc_service_config* service_config) { const grpc_json* json = service_config->json_tree; diff --git a/src/core/lib/transport/service_config.h b/src/core/lib/transport/service_config.h index cd739a593c2..ebfc59b5347 100644 --- a/src/core/lib/transport/service_config.h +++ b/src/core/lib/transport/service_config.h @@ -42,6 +42,12 @@ typedef struct grpc_service_config grpc_service_config; grpc_service_config* grpc_service_config_create(const char* json_string); void grpc_service_config_destroy(grpc_service_config* service_config); +/// Invokes \a process_json() for each global parameter in the service +/// config. \a arg is passed as the second argument to \a process_json(). +void grpc_service_config_parse_global_params( + const grpc_service_config* service_config, + void (*process_json)(const grpc_json* json, void* arg), void* arg); + /// Gets the LB policy name from \a service_config. /// Returns NULL if no LB policy name was specified. /// Caller does NOT take ownership. diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index a9f20e6d2a8..94d6e46cae8 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -263,6 +263,7 @@ CORE_SOURCE_FILES = [ 'src/core/ext/client_channel/resolver.c', 'src/core/ext/client_channel/resolver_factory.c', 'src/core/ext/client_channel/resolver_registry.c', + 'src/core/ext/client_channel/retry_throttle.c', 'src/core/ext/client_channel/subchannel.c', 'src/core/ext/client_channel/subchannel_index.c', 'src/core/ext/client_channel/uri_parser.c', diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 10801254ef9..1237bdfe3bc 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -925,6 +925,8 @@ src/core/ext/client_channel/resolver_factory.c \ src/core/ext/client_channel/resolver_factory.h \ src/core/ext/client_channel/resolver_registry.c \ src/core/ext/client_channel/resolver_registry.h \ +src/core/ext/client_channel/retry_throttle.c \ +src/core/ext/client_channel/retry_throttle.h \ src/core/ext/client_channel/subchannel.c \ src/core/ext/client_channel/subchannel.h \ src/core/ext/client_channel/subchannel_index.c \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 462353cb50a..03dbb6cc6f4 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7467,6 +7467,7 @@ "src/core/ext/client_channel/resolver.h", "src/core/ext/client_channel/resolver_factory.h", "src/core/ext/client_channel/resolver_registry.h", + "src/core/ext/client_channel/retry_throttle.h", "src/core/ext/client_channel/subchannel.h", "src/core/ext/client_channel/subchannel_index.h", "src/core/ext/client_channel/uri_parser.h" @@ -7508,6 +7509,8 @@ "src/core/ext/client_channel/resolver_factory.h", "src/core/ext/client_channel/resolver_registry.c", "src/core/ext/client_channel/resolver_registry.h", + "src/core/ext/client_channel/retry_throttle.c", + "src/core/ext/client_channel/retry_throttle.h", "src/core/ext/client_channel/subchannel.c", "src/core/ext/client_channel/subchannel.h", "src/core/ext/client_channel/subchannel_index.c", diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index fde60be3e20..695524913db 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -466,6 +466,7 @@ + @@ -876,6 +877,8 @@ + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index 8edbbc22bed..2fc34a8525f 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -568,6 +568,9 @@ src\core\ext\client_channel + + src\core\ext\client_channel + src\core\ext\client_channel @@ -1271,6 +1274,9 @@ src\core\ext\client_channel + + src\core\ext\client_channel + src\core\ext\client_channel diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 22f4740b8fa..d15c6924e02 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -432,6 +432,7 @@ + @@ -793,6 +794,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 5021cb47d8d..8e4835ee148 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -496,6 +496,9 @@ src\core\ext\client_channel + + src\core\ext\client_channel + src\core\ext\client_channel @@ -1109,6 +1112,9 @@ src\core\ext\client_channel + + src\core\ext\client_channel + src\core\ext\client_channel From b33225678a656c50df8f6437123355bd178e0e30 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 23 Feb 2017 14:38:02 -0800 Subject: [PATCH 003/186] Code review changes. --- src/core/ext/client_channel/client_channel.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index 1cc2b9455fe..967709bf741 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -277,7 +277,7 @@ static void parse_retry_throttle_params(const grpc_json *field, void *arg) { int milli_token_ratio = 0; for (grpc_json *sub_field = field->child; sub_field != NULL; sub_field = sub_field->next) { - if (sub_field->key == NULL) continue; + if (sub_field->key == NULL) return; if (strcmp(sub_field->key, "maxTokens") == 0) { if (max_milli_tokens != 0) return; // Duplicate. if (sub_field->type != GRPC_JSON_NUMBER) return; @@ -313,6 +313,7 @@ static void parse_retry_throttle_params(const grpc_json *field, void *arg) { return; } milli_token_ratio = (int)((whole_value * multiplier) + decimal_value); + if (milli_token_ratio <= 0) return; } } parsing_state->retry_throttle_data = @@ -1074,7 +1075,9 @@ static void on_complete_locked(grpc_exec_ctx *exec_ctx, void *arg, &chand->retry_throttle_data); } else { // TODO(roth): In a subsequent PR, check the return value here and - // decide whether or not to retry. + // decide whether or not to retry. Note that we should only + // record failures whose statuses match the configured retryable + // or non-fatal status codes. grpc_server_retry_throttle_data_record_failure( &chand->retry_throttle_data); } From 10cea4b121beb8697f758e08a2c48b443e20eefb Mon Sep 17 00:00:00 2001 From: Michiel de Jong Date: Fri, 24 Feb 2017 10:21:14 +0100 Subject: [PATCH 004/186] Use grpc-tools npm package in readme * Make it clearer which directory to `cd` to * Take advantage of the work done https://github.com/grpc/grpc/issues/5982 --- examples/node/static_codegen/README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/node/static_codegen/README.md b/examples/node/static_codegen/README.md index fc97d34a386..0441b27f25a 100644 --- a/examples/node/static_codegen/README.md +++ b/examples/node/static_codegen/README.md @@ -1,7 +1,8 @@ -This is the static code generation variant of the Node examples. Code in these examples is pre-generated using protoc and the Node gRPC protoc plugin, and the generated code can be found in various `*_pb.js` files. The command line sequence for generating those files is as follows (assuming that `protoc` and `grpc_node_plugin` are present, and starting in the base directory of this package): +This is the static code generation variant of the Node examples. Code in these examples is pre-generated using protoc and the Node gRPC protoc plugin, and the generated code can be found in various `*_pb.js` files. The command line sequence for generating those files is as follows (assuming that `protoc` and `grpc_node_plugin` are present, and starting in the directory which contains this README.md file): ```sh -cd ../protos -protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=grpc_node_plugin helloworld.proto -protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=../node/static_codegen/route_guide/ --plugin=protoc-gen-grpc=grpc_node_plugin route_guide.proto +cd ../../protos +npm install -g grpc-tools +grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/ --grpc_out=../node/static_codegen --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` helloworld.proto +grpc_tools_node_protoc --js_out=import_style=commonjs,binary:../node/static_codegen/route_guide/ --grpc_out=../node/static_codegen/route_guide/ --plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` route_guide.proto ``` From 95039b57dc812dff2c0edfd80f6c09179afabc97 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 24 Feb 2017 07:59:45 -0800 Subject: [PATCH 005/186] Fix refcounting bug. --- src/core/ext/client_channel/client_channel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index 967709bf741..c2982004653 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -1082,7 +1082,8 @@ static void on_complete_locked(grpc_exec_ctx *exec_ctx, void *arg, &chand->retry_throttle_data); } } - grpc_closure_run(exec_ctx, calld->original_on_complete, error); + grpc_closure_run(exec_ctx, calld->original_on_complete, + GRPC_ERROR_REF(error)); } static void start_transport_stream_op_locked(grpc_exec_ctx *exec_ctx, void *arg, From 77532e8bf3d4c93b680ac63a5e436cea92c708f5 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Mon, 27 Feb 2017 11:52:39 -0800 Subject: [PATCH 006/186] Destroy pointer args when destructing a ChannelArguments --- include/grpc++/support/channel_arguments.h | 2 +- src/cpp/common/channel_arguments.cc | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/grpc++/support/channel_arguments.h b/include/grpc++/support/channel_arguments.h index efdf7772ad7..80a3bfda3d9 100644 --- a/include/grpc++/support/channel_arguments.h +++ b/include/grpc++/support/channel_arguments.h @@ -54,7 +54,7 @@ class ResourceQuota; class ChannelArguments { public: ChannelArguments(); - ~ChannelArguments() {} + ~ChannelArguments(); ChannelArguments(const ChannelArguments& other); ChannelArguments& operator=(ChannelArguments other) { diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc index 65f32774999..34fd4491d0a 100644 --- a/src/cpp/common/channel_arguments.cc +++ b/src/cpp/common/channel_arguments.cc @@ -81,6 +81,16 @@ ChannelArguments::ChannelArguments(const ChannelArguments& other) } } +ChannelArguments::~ChannelArguments() { + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + for (auto it = args_.begin(); it != args_.end(); ++it) { + if (it->type == GRPC_ARG_POINTER) { + it->value.pointer.vtable->destroy(&exec_ctx, it->value.pointer.p); + } + } + grpc_exec_ctx_finish(&exec_ctx); +} + void ChannelArguments::Swap(ChannelArguments& other) { args_.swap(other.args_); strings_.swap(other.strings_); From c5b3b25f8d94404a6069cacd756be47d8e9d8de3 Mon Sep 17 00:00:00 2001 From: Matt Kwong Date: Wed, 22 Feb 2017 11:25:10 -0800 Subject: [PATCH 007/186] Change ssl_server_fuzzer.c to use ssl_test_data.h instead of loading mock SSL data from file --- test/core/security/BUILD | 2 +- test/core/security/ssl_server_fuzzer.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/test/core/security/BUILD b/test/core/security/BUILD index e750c39b7c6..1cb03c5cfe7 100644 --- a/test/core/security/BUILD +++ b/test/core/security/BUILD @@ -34,7 +34,7 @@ load("//test/core/util:grpc_fuzzer.bzl", "grpc_fuzzer") grpc_fuzzer( name = "ssl_server_fuzzer", srcs = ["ssl_server_fuzzer.c"], - deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util"], + deps = ["//:gpr", "//:grpc", "//test/core/util:grpc_test_util", "//test/core/end2end:ssl_test_data"], corpus = "corpus", copts = ["-std=c99"], ) diff --git a/test/core/security/ssl_server_fuzzer.c b/test/core/security/ssl_server_fuzzer.c index f789278add8..fe98799144f 100644 --- a/test/core/security/ssl_server_fuzzer.c +++ b/test/core/security/ssl_server_fuzzer.c @@ -38,6 +38,7 @@ #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/transport/security_connector.h" +#include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/memory_counters.h" #include "test/core/util/mock_endpoint.h" @@ -50,6 +51,7 @@ bool leak_check = false; #define SSL_KEY_PATH "src/core/lib/tsi/test_creds/server1.key" #define SSL_CA_PATH "src/core/lib/tsi/test_creds/ca.pem" + static void discard_write(grpc_slice slice) {} static void dont_log(gpr_log_func_args *args) {} @@ -88,12 +90,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { // Load key pair and establish server SSL credentials. grpc_ssl_pem_key_cert_pair pem_key_cert_pair; grpc_slice ca_slice, cert_slice, key_slice; - GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", - grpc_load_file(SSL_CA_PATH, 1, &ca_slice))); - GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", - grpc_load_file(SSL_CERT_PATH, 1, &cert_slice))); - GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", - grpc_load_file(SSL_KEY_PATH, 1, &key_slice))); + ca_slice = grpc_slice_from_static_string(test_root_cert); + cert_slice = grpc_slice_from_static_string(test_server1_cert); + key_slice = grpc_slice_from_static_string(test_server1_key); const char *ca_cert = (const char *)GRPC_SLICE_START_PTR(ca_slice); pem_key_cert_pair.private_key = (const char *)GRPC_SLICE_START_PTR(key_slice); pem_key_cert_pair.cert_chain = (const char *)GRPC_SLICE_START_PTR(cert_slice); From d9b257a1547f8d3d6ddf66036e19561e64de6531 Mon Sep 17 00:00:00 2001 From: Matt Kwong Date: Wed, 22 Feb 2017 15:14:28 -0800 Subject: [PATCH 008/186] Add fuzzer options for oss-fuzz --- test/core/security/ssl_server_fuzzer.c | 5 ----- tools/fuzzer/options/api_fuzzer.options | 3 +++ tools/fuzzer/options/client_fuzzer.options | 3 +++ tools/fuzzer/options/fuzzer.options | 2 ++ tools/fuzzer/options/fuzzer_response.options | 2 ++ tools/fuzzer/options/fuzzer_serverlist.options | 2 ++ tools/fuzzer/options/hpack_parser_fuzzer_test.options | 3 +++ tools/fuzzer/options/percent_decode_fuzzer.options | 2 ++ tools/fuzzer/options/percent_encode_fuzzer.options | 2 ++ tools/fuzzer/options/request_fuzzer.options | 3 +++ tools/fuzzer/options/response_fuzzer.options | 3 +++ tools/fuzzer/options/server_fuzzer.options | 3 +++ tools/fuzzer/options/ssl_server_fuzzer.options | 2 ++ tools/fuzzer/options/uri_fuzzer_test.options | 2 ++ 14 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 tools/fuzzer/options/api_fuzzer.options create mode 100644 tools/fuzzer/options/client_fuzzer.options create mode 100644 tools/fuzzer/options/fuzzer.options create mode 100644 tools/fuzzer/options/fuzzer_response.options create mode 100644 tools/fuzzer/options/fuzzer_serverlist.options create mode 100644 tools/fuzzer/options/hpack_parser_fuzzer_test.options create mode 100644 tools/fuzzer/options/percent_decode_fuzzer.options create mode 100644 tools/fuzzer/options/percent_encode_fuzzer.options create mode 100644 tools/fuzzer/options/request_fuzzer.options create mode 100644 tools/fuzzer/options/response_fuzzer.options create mode 100644 tools/fuzzer/options/server_fuzzer.options create mode 100644 tools/fuzzer/options/ssl_server_fuzzer.options create mode 100644 tools/fuzzer/options/uri_fuzzer_test.options diff --git a/test/core/security/ssl_server_fuzzer.c b/test/core/security/ssl_server_fuzzer.c index fe98799144f..7a3612c419b 100644 --- a/test/core/security/ssl_server_fuzzer.c +++ b/test/core/security/ssl_server_fuzzer.c @@ -47,11 +47,6 @@ bool squelch = true; // Turning this on will fail the leak check. bool leak_check = false; -#define SSL_CERT_PATH "src/core/lib/tsi/test_creds/server1.pem" -#define SSL_KEY_PATH "src/core/lib/tsi/test_creds/server1.key" -#define SSL_CA_PATH "src/core/lib/tsi/test_creds/ca.pem" - - static void discard_write(grpc_slice slice) {} static void dont_log(gpr_log_func_args *args) {} diff --git a/tools/fuzzer/options/api_fuzzer.options b/tools/fuzzer/options/api_fuzzer.options new file mode 100644 index 00000000000..8871ae21b6a --- /dev/null +++ b/tools/fuzzer/options/api_fuzzer.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 2048 +dict = api_fuzzer.dictionary diff --git a/tools/fuzzer/options/client_fuzzer.options b/tools/fuzzer/options/client_fuzzer.options new file mode 100644 index 00000000000..fd2eebf7d25 --- /dev/null +++ b/tools/fuzzer/options/client_fuzzer.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 2048 +dict = hpack.dictionary diff --git a/tools/fuzzer/options/fuzzer.options b/tools/fuzzer/options/fuzzer.options new file mode 100644 index 00000000000..5d468bc6e48 --- /dev/null +++ b/tools/fuzzer/options/fuzzer.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 512 diff --git a/tools/fuzzer/options/fuzzer_response.options b/tools/fuzzer/options/fuzzer_response.options new file mode 100644 index 00000000000..5dcdfac7a69 --- /dev/null +++ b/tools/fuzzer/options/fuzzer_response.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 128 diff --git a/tools/fuzzer/options/fuzzer_serverlist.options b/tools/fuzzer/options/fuzzer_serverlist.options new file mode 100644 index 00000000000..5dcdfac7a69 --- /dev/null +++ b/tools/fuzzer/options/fuzzer_serverlist.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 128 diff --git a/tools/fuzzer/options/hpack_parser_fuzzer_test.options b/tools/fuzzer/options/hpack_parser_fuzzer_test.options new file mode 100644 index 00000000000..584487fafc2 --- /dev/null +++ b/tools/fuzzer/options/hpack_parser_fuzzer_test.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 512 +dict = hpack.dictionary diff --git a/tools/fuzzer/options/percent_decode_fuzzer.options b/tools/fuzzer/options/percent_decode_fuzzer.options new file mode 100644 index 00000000000..ea2785e1104 --- /dev/null +++ b/tools/fuzzer/options/percent_decode_fuzzer.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 32 diff --git a/tools/fuzzer/options/percent_encode_fuzzer.options b/tools/fuzzer/options/percent_encode_fuzzer.options new file mode 100644 index 00000000000..ea2785e1104 --- /dev/null +++ b/tools/fuzzer/options/percent_encode_fuzzer.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 32 diff --git a/tools/fuzzer/options/request_fuzzer.options b/tools/fuzzer/options/request_fuzzer.options new file mode 100644 index 00000000000..fd32ac16e1b --- /dev/null +++ b/tools/fuzzer/options/request_fuzzer.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 2048 + diff --git a/tools/fuzzer/options/response_fuzzer.options b/tools/fuzzer/options/response_fuzzer.options new file mode 100644 index 00000000000..fd32ac16e1b --- /dev/null +++ b/tools/fuzzer/options/response_fuzzer.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 2048 + diff --git a/tools/fuzzer/options/server_fuzzer.options b/tools/fuzzer/options/server_fuzzer.options new file mode 100644 index 00000000000..fd2eebf7d25 --- /dev/null +++ b/tools/fuzzer/options/server_fuzzer.options @@ -0,0 +1,3 @@ +[libfuzzer] +max_len = 2048 +dict = hpack.dictionary diff --git a/tools/fuzzer/options/ssl_server_fuzzer.options b/tools/fuzzer/options/ssl_server_fuzzer.options new file mode 100644 index 00000000000..60bd9b0b2fa --- /dev/null +++ b/tools/fuzzer/options/ssl_server_fuzzer.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 2048 diff --git a/tools/fuzzer/options/uri_fuzzer_test.options b/tools/fuzzer/options/uri_fuzzer_test.options new file mode 100644 index 00000000000..5dcdfac7a69 --- /dev/null +++ b/tools/fuzzer/options/uri_fuzzer_test.options @@ -0,0 +1,2 @@ +[libfuzzer] +max_len = 128 From d0084c220e3f3b5a35adbed430942237ef327323 Mon Sep 17 00:00:00 2001 From: yang-g Date: Mon, 6 Mar 2017 11:23:35 -0800 Subject: [PATCH 009/186] Include x.pb.h instead of x.grpc.pb.h for message-only protos --- test/cpp/interop/http2_client.cc | 2 +- test/cpp/interop/http2_client.h | 2 +- test/cpp/interop/interop_client.cc | 4 ++-- test/cpp/interop/interop_client.h | 2 +- test/cpp/interop/interop_server.cc | 4 ++-- test/cpp/interop/reconnect_interop_client.cc | 4 ++-- test/cpp/interop/reconnect_interop_server.cc | 4 ++-- test/cpp/qps/client.h | 2 +- test/cpp/qps/driver.h | 2 +- test/cpp/qps/histogram.h | 2 +- test/cpp/qps/server.h | 4 ++-- 11 files changed, 16 insertions(+), 16 deletions(-) diff --git a/test/cpp/interop/http2_client.cc b/test/cpp/interop/http2_client.cc index 01c07823cfe..38a437f39f8 100644 --- a/test/cpp/interop/http2_client.cc +++ b/test/cpp/interop/http2_client.cc @@ -41,7 +41,7 @@ #include #include "src/core/lib/transport/byte_stream.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/cpp/interop/http2_client.h" diff --git a/test/cpp/interop/http2_client.h b/test/cpp/interop/http2_client.h index 12df5d26bc2..e57d695205b 100644 --- a/test/cpp/interop/http2_client.h +++ b/test/cpp/interop/http2_client.h @@ -38,7 +38,7 @@ #include #include -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" namespace grpc { diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc index b7f2723c39b..55ba324cc7d 100644 --- a/test/cpp/interop/interop_client.cc +++ b/test/cpp/interop/interop_client.cc @@ -46,8 +46,8 @@ #include #include "src/core/lib/transport/byte_stream.h" -#include "src/proto/grpc/testing/empty.grpc.pb.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/empty.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/cpp/interop/client_helper.h" #include "test/cpp/interop/interop_client.h" diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h index 74f4db6b789..efcb7d28608 100644 --- a/test/cpp/interop/interop_client.h +++ b/test/cpp/interop/interop_client.h @@ -38,7 +38,7 @@ #include #include -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" namespace grpc { diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index 5a810b45ef4..1cbca179287 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -48,8 +48,8 @@ #include "src/core/lib/support/string.h" #include "src/core/lib/transport/byte_stream.h" -#include "src/proto/grpc/testing/empty.grpc.pb.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/empty.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/cpp/interop/server_helper.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/interop/reconnect_interop_client.cc b/test/cpp/interop/reconnect_interop_client.cc index 1c2f6066377..01d985068dc 100644 --- a/test/cpp/interop/reconnect_interop_client.cc +++ b/test/cpp/interop/reconnect_interop_client.cc @@ -40,8 +40,8 @@ #include #include #include -#include "src/proto/grpc/testing/empty.grpc.pb.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/empty.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/cpp/util/create_test_channel.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/interop/reconnect_interop_server.cc b/test/cpp/interop/reconnect_interop_server.cc index 634d0a90fce..8d1b884af91 100644 --- a/test/cpp/interop/reconnect_interop_server.cc +++ b/test/cpp/interop/reconnect_interop_server.cc @@ -47,8 +47,8 @@ #include #include -#include "src/proto/grpc/testing/empty.grpc.pb.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/empty.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/core/util/reconnect_server.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/qps/client.h b/test/cpp/qps/client.h index baa9304cc2d..25a19a5a740 100644 --- a/test/cpp/qps/client.h +++ b/test/cpp/qps/client.h @@ -46,7 +46,7 @@ #include #include -#include "src/proto/grpc/testing/payloads.grpc.pb.h" +#include "src/proto/grpc/testing/payloads.pb.h" #include "src/proto/grpc/testing/services.grpc.pb.h" #include "test/cpp/qps/histogram.h" diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h index e72d30a4eff..dd32a16c879 100644 --- a/test/cpp/qps/driver.h +++ b/test/cpp/qps/driver.h @@ -36,7 +36,7 @@ #include -#include "src/proto/grpc/testing/control.grpc.pb.h" +#include "src/proto/grpc/testing/control.pb.h" #include "test/cpp/qps/histogram.h" namespace grpc { diff --git a/test/cpp/qps/histogram.h b/test/cpp/qps/histogram.h index acb415f0a10..470a3943013 100644 --- a/test/cpp/qps/histogram.h +++ b/test/cpp/qps/histogram.h @@ -35,7 +35,7 @@ #define TEST_QPS_HISTOGRAM_H #include -#include "src/proto/grpc/testing/stats.grpc.pb.h" +#include "src/proto/grpc/testing/stats.pb.h" namespace grpc { namespace testing { diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h index 821d5935beb..8fbf37a0957 100644 --- a/test/cpp/qps/server.h +++ b/test/cpp/qps/server.h @@ -38,8 +38,8 @@ #include #include -#include "src/proto/grpc/testing/control.grpc.pb.h" -#include "src/proto/grpc/testing/messages.grpc.pb.h" +#include "src/proto/grpc/testing/control.pb.h" +#include "src/proto/grpc/testing/messages.pb.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" #include "test/cpp/qps/usage_timer.h" From f0d6b88626223e2f8b77072fb628fdcf4a5f87ab Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Mon, 6 Mar 2017 14:20:26 -0800 Subject: [PATCH 010/186] Avoid repetitive division calculations --- test/core/support/cpu_test.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/test/core/support/cpu_test.c b/test/core/support/cpu_test.c index ca0fe0ccb50..7b9bf6c5e1d 100644 --- a/test/core/support/cpu_test.c +++ b/test/core/support/cpu_test.c @@ -81,9 +81,12 @@ static void worker_thread(void *arg) { uint32_t cpu; unsigned r = 12345678; unsigned i, j; - for (i = 0; i < 1000 / grpc_test_slowdown_factor(); i++) { + /* Avoid repetitive division calculations */ + int64_t max_i = 1000 / grpc_test_slowdown_factor(); + int64_t max_j = 1000000 / grpc_test_slowdown_factor(); + for (i = 0; i < max_i; i++) { /* run for a bit - just calculate something random. */ - for (j = 0; j < 1000000 / grpc_test_slowdown_factor(); j++) { + for (j = 0; j < max_j; j++) { r = (r * 17) & ((r - i) | (r * i)); } cpu = gpr_cpu_current_cpu(); From aef398bd8811dd292bb90c69f73c6d7c6e918e69 Mon Sep 17 00:00:00 2001 From: yang-g Date: Tue, 7 Mar 2017 15:43:53 -0800 Subject: [PATCH 011/186] Only cleanup the listeners when shutdown is set --- src/core/lib/iomgr/tcp_server_posix.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 36f878fdd4d..ed9c9c56cf1 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -258,10 +258,7 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { /* delete ALL the things */ gpr_mu_lock(&s->mu); - if (!s->shutdown) { - gpr_mu_unlock(&s->mu); - return; - } + GPR_ASSERT(s->shutdown); if (s->head) { grpc_tcp_listener *sp; @@ -465,7 +462,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) { error: gpr_mu_lock(&sp->server->mu); - if (0 == --sp->server->active_ports) { + if (0 == --sp->server->active_ports && sp->server->shutdown) { gpr_mu_unlock(&sp->server->mu); deactivated_all_ports(exec_ctx, sp->server); } else { From e0341792d5a33469bbac481e9737bd00e3cb8900 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Mar 2017 15:59:16 -0800 Subject: [PATCH 012/186] Remove most usage of the grpc_call lock --- src/core/lib/surface/call.c | 77 ++++++++++++++----------------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index c2547c5147a..9b01c46bd59 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -143,9 +143,10 @@ struct grpc_call { grpc_channel *channel; grpc_call *parent; grpc_call *first_child; + gpr_atm has_children; gpr_timespec start_time; - /* TODO(ctiller): share with cq if possible? */ - gpr_mu mu; + /* protects first_child, setting has_children, and child next/prev links */ + gpr_mu child_list_mu; /* client or server call */ bool is_client; @@ -161,7 +162,7 @@ struct grpc_call { bool receiving_message; bool requested_final_op; bool received_final_op; - bool sent_any_op; + gpr_atm num_ops_sent; /* have we received initial metadata */ bool has_initial_md_been_received; @@ -275,7 +276,7 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, GPR_TIMER_BEGIN("grpc_call_create", 0); call = gpr_zalloc(sizeof(grpc_call) + channel_stack->call_stack_size); *out_call = call; - gpr_mu_init(&call->mu); + gpr_mu_init(&call->child_list_mu); call->channel = args->channel; call->cq = args->cq; call->parent = args->parent_call; @@ -313,7 +314,8 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, GPR_ASSERT(call->is_client); GPR_ASSERT(!args->parent_call->is_client); - gpr_mu_lock(&args->parent_call->mu); + gpr_mu_lock(&args->parent_call->child_list_mu); + gpr_atm_no_barrier_store(&args->parent_call->has_children, 1); if (args->propagation_mask & GRPC_PROPAGATE_DEADLINE) { send_deadline = gpr_time_min( @@ -353,7 +355,7 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, call; } - gpr_mu_unlock(&args->parent_call->mu); + gpr_mu_unlock(&args->parent_call->child_list_mu); } call->send_deadline = send_deadline; @@ -435,7 +437,7 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, if (c->receiving_stream != NULL) { grpc_byte_stream_destroy(exec_ctx, c->receiving_stream); } - gpr_mu_destroy(&c->mu); + gpr_mu_destroy(&c->child_list_mu); for (ii = 0; ii < c->send_extra_metadata_count; ii++) { GRPC_MDELEM_UNREF(exec_ctx, c->send_extra_metadata[ii].md); } @@ -473,7 +475,7 @@ void grpc_call_destroy(grpc_call *c) { GRPC_API_TRACE("grpc_call_destroy(c=%p)", 1, (c)); if (parent) { - gpr_mu_lock(&parent->mu); + gpr_mu_lock(&parent->child_list_mu); if (c == parent->first_child) { parent->first_child = c->sibling_next; if (c == parent->first_child) { @@ -482,15 +484,13 @@ void grpc_call_destroy(grpc_call *c) { c->sibling_prev->sibling_next = c->sibling_next; c->sibling_next->sibling_prev = c->sibling_prev; } - gpr_mu_unlock(&parent->mu); + gpr_mu_unlock(&parent->child_list_mu); GRPC_CALL_INTERNAL_UNREF(&exec_ctx, parent, "child"); } - gpr_mu_lock(&c->mu); GPR_ASSERT(!c->destroy_called); c->destroy_called = 1; - cancel = c->sent_any_op && !c->received_final_op; - gpr_mu_unlock(&c->mu); + cancel = gpr_atm_no_barrier_load(&c->num_ops_sent) && !c->received_final_op; if (cancel) { cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, GRPC_ERROR_CANCELLED); @@ -555,10 +555,8 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *c, "c=%p, status=%d, description=%s, reserved=%p)", 4, (c, (int)status, description, reserved)); GPR_ASSERT(reserved == NULL); - gpr_mu_lock(&c->mu); cancel_with_status(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, status, description); - gpr_mu_unlock(&c->mu); grpc_exec_ctx_finish(&exec_ctx); return GRPC_CALL_OK; } @@ -715,9 +713,7 @@ static void set_incoming_compression_algorithm( grpc_compression_algorithm grpc_call_test_only_get_compression_algorithm( grpc_call *call) { grpc_compression_algorithm algorithm; - gpr_mu_lock(&call->mu); algorithm = call->incoming_compression_algorithm; - gpr_mu_unlock(&call->mu); return algorithm; } @@ -729,9 +725,7 @@ static grpc_compression_algorithm compression_algorithm_for_level_locked( uint32_t grpc_call_test_only_get_message_flags(grpc_call *call) { uint32_t flags; - gpr_mu_lock(&call->mu); flags = call->test_only_last_message_flags; - gpr_mu_unlock(&call->mu); return flags; } @@ -785,9 +779,7 @@ static void set_encodings_accepted_by_peer(grpc_exec_ctx *exec_ctx, uint32_t grpc_call_test_only_get_encodings_accepted_by_peer(grpc_call *call) { uint32_t encodings_accepted_by_peer; - gpr_mu_lock(&call->mu); encodings_accepted_by_peer = call->encodings_accepted_by_peer; - gpr_mu_unlock(&call->mu); return encodings_accepted_by_peer; } @@ -1083,8 +1075,6 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, grpc_call *call = bctl->call; grpc_error *error = consolidate_batch_errors(bctl); - gpr_mu_lock(&call->mu); - if (bctl->send_initial_metadata) { grpc_metadata_batch_destroy( exec_ctx, @@ -1105,17 +1095,21 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, call->received_final_op = true; /* propagate cancellation to any interested children */ - child_call = call->first_child; - if (child_call != NULL) { - do { - next_child_call = child_call->sibling_next; - if (child_call->cancellation_is_inherited) { - GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); - grpc_call_cancel(child_call, NULL); - GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); - } - child_call = next_child_call; - } while (child_call != call->first_child); + if (gpr_atm_no_barrier_load(&call->has_children)) { + gpr_mu_lock(&call->child_list_mu); + child_call = call->first_child; + if (child_call != NULL) { + do { + next_child_call = child_call->sibling_next; + if (child_call->cancellation_is_inherited) { + GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); + grpc_call_cancel(child_call, NULL); + GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); + } + child_call = next_child_call; + } while (child_call != call->first_child); + } + gpr_mu_unlock(&call->child_list_mu); } if (call->is_client) { @@ -1130,7 +1124,6 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, GRPC_ERROR_UNREF(error); error = GRPC_ERROR_NONE; } - gpr_mu_unlock(&call->mu); if (bctl->is_notify_tag_closure) { /* unrefs bctl->error */ @@ -1221,7 +1214,6 @@ static void receiving_stream_ready(grpc_exec_ctx *exec_ctx, void *bctlp, grpc_error *error) { batch_control *bctl = bctlp; grpc_call *call = bctl->call; - gpr_mu_lock(&bctl->call->mu); if (error != GRPC_ERROR_NONE) { if (call->receiving_stream != NULL) { grpc_byte_stream_destroy(exec_ctx, call->receiving_stream); @@ -1233,11 +1225,9 @@ static void receiving_stream_ready(grpc_exec_ctx *exec_ctx, void *bctlp, } if (call->has_initial_md_been_received || error != GRPC_ERROR_NONE || call->receiving_stream == NULL) { - gpr_mu_unlock(&bctl->call->mu); process_data_after_md(exec_ctx, bctlp); } else { call->saved_receiving_stream_ready_bctlp = bctlp; - gpr_mu_unlock(&bctl->call->mu); } } @@ -1309,8 +1299,6 @@ static void receiving_initial_metadata_ready(grpc_exec_ctx *exec_ctx, batch_control *bctl = bctlp; grpc_call *call = bctl->call; - gpr_mu_lock(&call->mu); - add_batch_error(exec_ctx, bctl, GRPC_ERROR_REF(error), false); if (error == GRPC_ERROR_NONE) { grpc_metadata_batch *md = @@ -1336,11 +1324,9 @@ static void receiving_initial_metadata_ready(grpc_exec_ctx *exec_ctx, receiving_stream_ready, call->saved_receiving_stream_ready_bctlp, grpc_schedule_on_exec_ctx); call->saved_receiving_stream_ready_bctlp = NULL; - grpc_closure_sched(exec_ctx, saved_rsr_closure, GRPC_ERROR_REF(error)); + grpc_closure_run(exec_ctx, saved_rsr_closure, GRPC_ERROR_REF(error)); } - gpr_mu_unlock(&call->mu); - finish_batch_step(exec_ctx, bctl); } @@ -1393,7 +1379,6 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, bctl->notify_tag = notify_tag; bctl->is_notify_tag_closure = (uint8_t)(is_notify_tag_closure != 0); - gpr_mu_lock(&call->mu); grpc_transport_stream_op *stream_op = &bctl->op; memset(stream_op, 0, sizeof(*stream_op)); stream_op->covered_by_poller = true; @@ -1679,8 +1664,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, grpc_closure_init(&bctl->finish_batch, finish_batch, bctl, grpc_schedule_on_exec_ctx); stream_op->on_complete = &bctl->finish_batch; - call->sent_any_op = true; - gpr_mu_unlock(&call->mu); + gpr_atm_no_barrier_fetch_add(&call->num_ops_sent, 1); execute_op(exec_ctx, call, stream_op); @@ -1711,7 +1695,6 @@ done_with_error: if (bctl->recv_final_op) { call->requested_final_op = 0; } - gpr_mu_unlock(&call->mu); goto done; } @@ -1760,10 +1743,8 @@ uint8_t grpc_call_is_client(grpc_call *call) { return call->is_client; } grpc_compression_algorithm grpc_call_compression_for_level( grpc_call *call, grpc_compression_level level) { - gpr_mu_lock(&call->mu); grpc_compression_algorithm algo = compression_algorithm_for_level_locked(call, level); - gpr_mu_unlock(&call->mu); return algo; } From 676db291d2387603f795dd6bd5853188e0ff7f63 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 8 Mar 2017 16:10:56 -0800 Subject: [PATCH 013/186] Fix barriers --- src/core/lib/surface/call.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 9b01c46bd59..2f3ddd6bcb9 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -315,7 +315,7 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, GPR_ASSERT(!args->parent_call->is_client); gpr_mu_lock(&args->parent_call->child_list_mu); - gpr_atm_no_barrier_store(&args->parent_call->has_children, 1); + gpr_atm_rel_store(&args->parent_call->has_children, 1); if (args->propagation_mask & GRPC_PROPAGATE_DEADLINE) { send_deadline = gpr_time_min( @@ -1095,7 +1095,7 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, call->received_final_op = true; /* propagate cancellation to any interested children */ - if (gpr_atm_no_barrier_load(&call->has_children)) { + if (gpr_atm_acq_load(&call->has_children)) { gpr_mu_lock(&call->child_list_mu); child_call = call->first_child; if (child_call != NULL) { From b597dcf53a5057425ba24a7c8dbed2f65f8c31f4 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 9 Mar 2017 07:02:11 -0800 Subject: [PATCH 014/186] Race fixes --- src/core/lib/surface/call.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 2f3ddd6bcb9..eafeef0a207 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -161,9 +161,9 @@ struct grpc_call { bool received_initial_metadata; bool receiving_message; bool requested_final_op; - bool received_final_op; - gpr_atm num_ops_sent; - + gpr_atm any_ops_sent_atm; + gpr_atm received_final_op_atm; + /* have we received initial metadata */ bool has_initial_md_been_received; @@ -458,7 +458,7 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, for (i = 0; i < STATUS_SOURCE_COUNT; i++) { GRPC_ERROR_UNREF( - unpack_received_status(gpr_atm_no_barrier_load(&c->status[i])).error); + unpack_received_status(gpr_atm_acq_load(&c->status[i])).error); } grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c), &c->final_info, c); @@ -490,7 +490,7 @@ void grpc_call_destroy(grpc_call *c) { GPR_ASSERT(!c->destroy_called); c->destroy_called = 1; - cancel = gpr_atm_no_barrier_load(&c->num_ops_sent) && !c->received_final_op; + cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) && !gpr_atm_acq_load(&c->received_final_op_atm); if (cancel) { cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, GRPC_ERROR_CANCELLED); @@ -1048,7 +1048,7 @@ static void finish_batch_completion(grpc_exec_ctx *exec_ctx, void *user_data, } static grpc_error *consolidate_batch_errors(batch_control *bctl) { - size_t n = (size_t)gpr_atm_no_barrier_load(&bctl->num_errors); + size_t n = (size_t)gpr_atm_acq_load(&bctl->num_errors); if (n == 0) { return GRPC_ERROR_NONE; } else if (n == 1) { @@ -1093,7 +1093,7 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */]; recv_trailing_filter(exec_ctx, call, md); - call->received_final_op = true; + gpr_atm_rel_store(&call->received_final_op_atm, 1); /* propagate cancellation to any interested children */ if (gpr_atm_acq_load(&call->has_children)) { gpr_mu_lock(&call->child_list_mu); @@ -1286,7 +1286,7 @@ static void validate_filtered_metadata(grpc_exec_ctx *exec_ctx, static void add_batch_error(grpc_exec_ctx *exec_ctx, batch_control *bctl, grpc_error *error, bool has_cancelled) { if (error == GRPC_ERROR_NONE) return; - int idx = (int)gpr_atm_no_barrier_fetch_add(&bctl->num_errors, 1); + int idx = (int)gpr_atm_full_fetch_add(&bctl->num_errors, 1); if (idx == 0 && !has_cancelled) { cancel_with_error(exec_ctx, bctl->call, STATUS_FROM_CORE, GRPC_ERROR_REF(error)); @@ -1664,7 +1664,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, grpc_closure_init(&bctl->finish_batch, finish_batch, bctl, grpc_schedule_on_exec_ctx); stream_op->on_complete = &bctl->finish_batch; - gpr_atm_no_barrier_fetch_add(&call->num_ops_sent, 1); + gpr_atm_rel_store(&call->any_ops_sent_atm, 1); execute_op(exec_ctx, call, stream_op); From ffe1a99bb1653d63f6f6e140a90b87f02588de8e Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Thu, 9 Mar 2017 10:04:11 -0800 Subject: [PATCH 015/186] Switch Node back to using libuv iomgr by default --- binding.gyp | 8 +++----- templates/binding.gyp.template | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/binding.gyp b/binding.gyp index c521a27c300..178d9e952d1 100644 --- a/binding.gyp +++ b/binding.gyp @@ -39,11 +39,9 @@ { 'variables': { 'runtime%': 'node', - # UV integration in C core is disabled by default while bugs are ironed - # out. It can be re-enabled for one build by setting the npm config - # variable grpc_uv to true, and it can be re-enabled permanently by - # setting it to true here. - 'grpc_uv%': 'false', + # UV integration in C core is enabled by default. It can be disabled + # by setting this argument to anything else. + 'grpc_uv%': 'true', # Some Node installations use the system installation of OpenSSL, and on # some systems, the system OpenSSL still does not have ALPN support. This # will let users recompile gRPC to work without ALPN. diff --git a/templates/binding.gyp.template b/templates/binding.gyp.template index 5e401e89773..5f30d645fa9 100644 --- a/templates/binding.gyp.template +++ b/templates/binding.gyp.template @@ -41,11 +41,9 @@ { 'variables': { 'runtime%': 'node', - # UV integration in C core is disabled by default while bugs are ironed - # out. It can be re-enabled for one build by setting the npm config - # variable grpc_uv to true, and it can be re-enabled permanently by - # setting it to true here. - 'grpc_uv%': 'false', + # UV integration in C core is enabled by default. It can be disabled + # by setting this argument to anything else. + 'grpc_uv%': 'true', # Some Node installations use the system installation of OpenSSL, and on # some systems, the system OpenSSL still does not have ALPN support. This # will let users recompile gRPC to work without ALPN. From 123c72bc3c7594e31620e603dce4322c4d7c57b1 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Mar 2017 07:33:27 -0800 Subject: [PATCH 016/186] Handle a race between cancellation of a parent call and adding a child --- src/core/lib/surface/call.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index eafeef0a207..01efcafceba 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -163,7 +163,7 @@ struct grpc_call { bool requested_final_op; gpr_atm any_ops_sent_atm; gpr_atm received_final_op_atm; - + /* have we received initial metadata */ bool has_initial_md_been_received; @@ -343,6 +343,10 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, } if (args->propagation_mask & GRPC_PROPAGATE_CANCELLATION) { call->cancellation_is_inherited = 1; + if (gpr_atm_acq_load(&args->parent_call->received_final_op_atm)) { + cancel_with_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, + GRPC_ERROR_CANCELLED); + } } if (args->parent_call->first_child == NULL) { @@ -490,7 +494,8 @@ void grpc_call_destroy(grpc_call *c) { GPR_ASSERT(!c->destroy_called); c->destroy_called = 1; - cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) && !gpr_atm_acq_load(&c->received_final_op_atm); + cancel = gpr_atm_acq_load(&c->any_ops_sent_atm) && + !gpr_atm_acq_load(&c->received_final_op_atm); if (cancel) { cancel_with_error(&exec_ctx, c, STATUS_FROM_API_OVERRIDE, GRPC_ERROR_CANCELLED); @@ -1103,7 +1108,8 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, next_child_call = child_call->sibling_next; if (child_call->cancellation_is_inherited) { GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); - grpc_call_cancel(child_call, NULL); + cancel_with_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, + GRPC_ERROR_CANCELLED); GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); } child_call = next_child_call; From 37d274a0c6a9424ad4d67072998197d60bf9bd83 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 10 Mar 2017 09:44:44 -0800 Subject: [PATCH 017/186] Node add service: allow exact match to name in proto file, improve error reporting --- src/node/src/common.js | 1 + src/node/src/server.js | 13 ++++++++++--- src/node/test/surface_test.js | 26 ++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/node/src/common.js b/src/node/src/common.js index 98eabf5c0b8..a0fe4480eab 100644 --- a/src/node/src/common.js +++ b/src/node/src/common.js @@ -149,6 +149,7 @@ exports.getProtobufServiceAttrs = function getProtobufServiceAttrs(service, return _.camelCase(method.name); }), _.map(service.children, function(method) { return { + originalName: method.name, path: prefix + method.name, requestStream: method.requestStream, responseStream: method.responseStream, diff --git a/src/node/src/server.js b/src/node/src/server.js index 8a7eff507d0..3d06c07ab44 100644 --- a/src/node/src/server.js +++ b/src/node/src/server.js @@ -755,9 +755,16 @@ Server.prototype.addService = function(service, implementation) { } var impl; if (implementation[name] === undefined) { - common.log(grpc.logVerbosity.ERROR, 'Method handler for ' + - attrs.path + ' expected but not provided'); - impl = defaultHandler[method_type]; + /* Handle the case where the method is passed with the name exactly as + written in the proto file, instead of using JavaScript function + naming style */ + if (implementation[attrs.originalName] === undefined) { + common.log(grpc.logVerbosity.ERROR, 'Method handler ' + name + ' for ' + + attrs.path + ' expected but not provided'); + impl = defaultHandler[method_type]; + } else { + impl = _.bind(implementation[attrs.originalName], implementation); + } } else { impl = _.bind(implementation[name], implementation); } diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js index 2636ea85ac8..1d739562a69 100644 --- a/src/node/test/surface_test.js +++ b/src/node/test/surface_test.js @@ -143,6 +143,32 @@ describe('Server.prototype.addProtoService', function() { server.addProtoService(mathService, dummyImpls); }); }); + it('Should allow method names as originally written', function() { + var altDummyImpls = { + 'Div': function() {}, + 'DivMany': function() {}, + 'Fib': function() {}, + 'Sum': function() {} + }; + assert.doesNotThrow(function() { + server.addProtoService(mathService, altDummyImpls); + }); + }); + it('Should have a conflict between name variations', function() { + /* This is really testing that both name variations are actually used, + by checking that the method actually gets registered, for the + corresponding function, in both cases */ + var altDummyImpls = { + 'Div': function() {}, + 'DivMany': function() {}, + 'Fib': function() {}, + 'Sum': function() {} + }; + server.addProtoService(mathService, altDummyImpls); + assert.throws(function() { + server.addProtoService(mathService, dummyImpls); + }); + }); it('Should fail if the server has been started', function() { server.start(); assert.throws(function() { From 78354300bfa7ff66d7ecc1c847fde22e932b7388 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Mon, 6 Mar 2017 09:28:16 -0800 Subject: [PATCH 018/186] Add package details to gRPC Packages --- setup.py | 4 ++++ src/python/grpcio_health_checking/setup.py | 4 ++++ src/python/grpcio_reflection/setup.py | 4 ++++ tools/distrib/python/grpcio_tools/setup.py | 4 ++++ 4 files changed, 16 insertions(+) diff --git a/setup.py b/setup.py index d5b843fdace..00694bddf18 100644 --- a/setup.py +++ b/setup.py @@ -265,6 +265,10 @@ PACKAGES = setuptools.find_packages(PYTHON_STEM) setuptools.setup( name='grpcio', version=grpc_version.VERSION, + description='HTTP/2-based RPC framework', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='http://www.grpc.io', license=LICENSE, long_description=open(README).read(), ext_modules=CYTHON_EXTENSION_MODULES, diff --git a/src/python/grpcio_health_checking/setup.py b/src/python/grpcio_health_checking/setup.py index 52ee98a2d5b..17bb3ab616e 100644 --- a/src/python/grpcio_health_checking/setup.py +++ b/src/python/grpcio_health_checking/setup.py @@ -59,6 +59,10 @@ COMMAND_CLASS = { setuptools.setup( name='grpcio-health-checking', version=grpc_version.VERSION, + description='Standard Health Checking Service for gRPC', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='http://www.grpc.io', license='3-clause BSD', package_dir=PACKAGE_DIRECTORIES, packages=setuptools.find_packages('.'), diff --git a/src/python/grpcio_reflection/setup.py b/src/python/grpcio_reflection/setup.py index e85092db570..e6cf54745e2 100644 --- a/src/python/grpcio_reflection/setup.py +++ b/src/python/grpcio_reflection/setup.py @@ -60,6 +60,10 @@ setuptools.setup( name='grpcio-reflection', version=grpc_version.VERSION, license='3-clause BSD', + description='Standard Protobuf Reflection Service for gRPC', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='http://www.grpc.io', package_dir=PACKAGE_DIRECTORIES, packages=setuptools.find_packages('.'), install_requires=INSTALL_REQUIRES, diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py index ed27f1f8350..211d442f176 100644 --- a/tools/distrib/python/grpcio_tools/setup.py +++ b/tools/distrib/python/grpcio_tools/setup.py @@ -203,6 +203,10 @@ def extension_modules(): setuptools.setup( name='grpcio-tools', version=grpc_version.VERSION, + description='Protobuf code generator for gRPC', + author='The gRPC Authors', + author_email='grpc-io@googlegroups.com', + url='http://www.grpc.io', license='3-clause BSD', ext_modules=extension_modules(), packages=setuptools.find_packages('.'), From 6bd07c656b8d0170eb499e9ee61cf9ca827d59c9 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Fri, 10 Mar 2017 10:48:57 -0800 Subject: [PATCH 019/186] Stop gRPC timers from keeping the UV loop open --- src/core/lib/iomgr/timer_uv.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/core/lib/iomgr/timer_uv.c b/src/core/lib/iomgr/timer_uv.c index f28a14405db..8e8a07578c6 100644 --- a/src/core/lib/iomgr/timer_uv.c +++ b/src/core/lib/iomgr/timer_uv.c @@ -78,6 +78,10 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer, uv_timer->data = timer; timer->uv_timer = uv_timer; uv_timer_start(uv_timer, run_expired_timer, timeout, 0); + /* We assume that gRPC timers are only used alongside other active gRPC + objects, and that there will therefore always be something else keeping + the uv loop alive whenever there is a timer */ + uv_unref((uv_handle_t *)uv_timer); } void grpc_timer_cancel(grpc_exec_ctx *exec_ctx, grpc_timer *timer) { From 7e43bfa1fa6a6b6099699baf9819f9572d9e84d2 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Mar 2017 14:01:02 -0800 Subject: [PATCH 020/186] Fix fuzzing detected error --- .../transport/chttp2/transport/hpack_parser.c | 10 ++++++-- .../clusterfuzz-testcase-5298216461402112 | Bin 0 -> 172032 bytes tools/run_tests/generated/tests.json | 22 ++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112 diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index 40f5120308c..b2f364aa1a0 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -1625,8 +1625,14 @@ grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx, stack space usage when no tail call optimization is available */ p->current_slice_refcount = slice.refcount; - grpc_error *error = p->state(exec_ctx, p, GRPC_SLICE_START_PTR(slice), - GRPC_SLICE_END_PTR(slice)); + uint8_t *start = GRPC_SLICE_START_PTR(slice); + uint8_t *end = GRPC_SLICE_END_PTR(slice); + grpc_error *error = GRPC_ERROR_NONE; + while (start != end && error == GRPC_ERROR_NONE) { + uint8_t *target = start + GPR_MIN(1024, end - start); + error = p->state(exec_ctx, p, start, target); + start = target; + } p->current_slice_refcount = NULL; return error; } diff --git a/test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112 b/test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112 new file mode 100644 index 0000000000000000000000000000000000000000..04d48d6d76f8bedfb6e708cb4e877791999dacef GIT binary patch literal 172032 zcmeF%eOM2!bdQDh4VlN>1%PGhiTM zVq;)p7b><`x5vKLcYbSqcyRv%bFKAy^uEq>AN!bMKqDi=e})DO4Hz0QG+=1J(14)< zLj#5e3=J3>Ff?Fjz|er90Yd|Z1`G`t8Zb0qXu!~bp#eh!h6W4`7#c7%U}(V5fT00H z1BM0+4Hz0QG+=1J(14)Ff?Fjz|er90Yd|Z1`G`t8Zb0qXu!~bp#eh! zh6W4`7#c7%U}(V5fT00H1BM0+4Hz0QG+=1J(14)Ff?Fjz|er90Yd|Z z1`G`t8Zb0qXu!~bp#eh!h6W4`7#c7%U}(V5fT00H1BM0+4Hz0QG+=1J(14)Ff?Fjz|g?|UjvKsQhedv%$C0Y`~Mc!cFu=OPg4E=_blA@Vm^?Mjf?*G>~KU` z9t>J;8SuYn-=4Sig%LZl3jg=)Y0_t3coCjk@V{px{a56{g>63?WXUf-nh!Nix;Ds? zu+TdX9z_TnWErq#(^1&}Wlw`FZtdC~h2D!dG&nmxB*_=NhXgg)=^GsD3uff<23gvX zYxCjxg8mKWer1m>fCug|4X!t{y3!XCSJX5(ySQ??AH48h-(aVGkKLVNnb)2MSsqxs z7eM-)`3>fNPFY(3nWe!EuJ(yXqi@y8);I(H#gPq*PP+#~}ezC#aJ9$w) zM7K(AFgO0AumEIFt~7W~jHvmW&x>5vVCRjnNd=H=^|Hav`0f||AiuG3@&7*06gNEl z!7lk=gSqEb-UVQ?Xj}gO&JEx~3SohDL4zz~UN{xP{t2xF|2wy+)YTupAM$9BCH3H9 ze;DU+xj~l2rc?aj$=r$tuiLjvmli^jU44TrRdnYt#UnXc^%z@=hGgPoHr6AGc)dRv3JZ|Bkr zpy}Lp4d$kZ6Z~P6cUXhYuFUS~5AR&IG}zg__3eCk5_+e>PI5+ZAzXWPuEE@1ov;w9 zPX{%a8`9&pKMag9Zg5uj*VZ3K53Fgh^WKM!g>c)^RrtSs9-H2`5Qy`#*`N#bI;F>elVCV8j=l$X4%83oKjJkN(51giYHJGctFDnAG z>P8K&mwq{^5E9L-8timh+S4CGA8%~1^R(yU0BBUPqrsf}ypR4M8aAlGT<^=nieS3^ z;|A|%X~vt2z~Wc5e&^v>R|y?kGrSeY0=2U54Nhc0kEje75$u5%-cL5W2Xeb zvowGG+=E1_06eERF9hnhtNu(oe|G`A%idH3@gHyNcXnBFsQ{E6+ZMr-Bx}Y0J?`zB zzAk{>tK17=#lGkIxdl^e3&8Q6FaU@!WBv6yAGuio-}XNZ0Jj&r^k=8;94vqZ_c{bX z-=-d-|GQqy%)kN|ZvLbQt}{}7mStl%BDMieSRF6#dzgf))M{!Y@JqvyM&F&&^9rEP!RNw*&zF_Lly==W*ZT1#rKq zc`=N8wn@M9a>kVcP$o|-hP`X9>31sLl@vg(?KwZV`1YiJF8Fh70jw1I383{~Z~ffn z;b-z8VXC(P{9m`wpZRsU?hE$HPKDs%d0D?RdfpyCsGGB{7>qK%>*snT{_=yQCMLxY zo1xLq-AZ%yhpVPv17M3}wfz5{*Zcdo^M~W3q6856I90zhGr-gzJYTjEz$~4K`2XhI z%vbwCMaF<)h&*AY{J*ofz`z1H_As>=$QL{HS?>1?E(Chk9Dmr-BU%5PIDe`r5p&bSl1GjXDKFiqJ zj3O8?`(!b6KQT#vHp%Bu5e#yj$NRM2UVneO@Vp`j?wck6k4PVVmYD82MX=?!i4fTF z@AUW3`rhUu=%Jd$o6h#r-}?m1&>~njx2_ll9WU2sarJsq2wNOq7DF2kPkolRR({+1u=={87&g9O^jVS*vqezykdi}q<1hL?yUm$f z3^p4t@~)MN_4nS=(_RkAJLd>s>Z1~UmL0N{mS%W7~kAZpJm0Xu?o<9O(_O{-voV@Cf-XFkkh%i7~U0p)Mv5D zj#WTpw!Iu$hTYd^>Dp_v0=CuvD27?5ZS-0CMr9~q#M0%(AP#!2pUYXhTLI^fH7kY% zAG_$Y$d?~bK-)`$F3<5lN7Lm4&ZG)+gLw0HFLcJS_X-DE{(71fA%I;El_~+>L}jM zrycY=r%oBEfSJ^M-pKFa`kkY`5el$RoWrxZHcLOZ;de6yMC@F`dzao$Kj*vWxg2cw zMk}D4>m&ca&&FxOLvrx%k*I)=cN6qy<4;YMgRob!0*-EV)$gpzv6F*OLY4x=dl`L} zWsjnZL805PfG@vD{anPn;Q=7Z+^>LGZA<;!O^;FmlypC$fH4vO@4LnKYhFT-J8J(u z(X@(|n;z)Ao%*@< zhYkxNaK$wR*jet<-$U}&t3v4V>ZJm-X|#TBw!%~d3-`TMz=dl?`aV~rxQpP_z4r=O zdEw$JPJ*K<6aFM{8DEtN2>BuRfZaQh|^I8Ysw;C&*E-#MmceW6MB zcoCd)Yp#T_q9=To(vm)f$4sL{;FSJc0k^xH;pev8`d+Z-?iLZ$*S%H1!ixWX?&-*` zDVX+9DS|iN=1NdqTEOp&TQR>Nt)fZ<+l-niq5MoE30^Capa1>befhZv9xrUJ1Yw_+ zDxAH&XkGa0?NbpjZLO8?r&kT1B_QfbLEOSyB3Sg~u>wq=HRkXAg=L6uRI76$2)SLT zfc4j&@ma3@aQ2^+cw7YMgjW^tYFZCI%f^Ip{$C%lA~>ycQi60%cRtItmLC35%Z`Y^ zKHWhHPv_s{v-Gdu)45fvts z?Iwc19p@-uR?a#;%cANQg)Yw?2w}{&d<8^2598;0!t3j z_xtp-KnQ+TDg`Xcea4@)JJiyDMoq2|HYH3|z{FPT`JHpWX#J#@6NRuS*G&$?XJ+zQ zjy%&PpioU!#l3ac+ZPlv+yDxu*@Z^HC z2wD&A%Fq4XQ(SoToLmUCYhLi$FNjnk%j(p|MUDM82%wC1l|wV}Hh!m#xl7TU>RECS zG%;2{snZ31=loQYBIh3WvXtu!Z^W)u!0?Z+L_mDm!9NEV8?`93*jA{3{mIT^7*VO^ciukP`KbStO9~L# z_7}s)-oN;rnJ1$Q)(fsFAh?^I7|fHd@pG@boh$UPKCJ+o$|4a24Qj>D?TTQEDmxxm zKo%D!f@@tV{_KWpry}i;YYHeE_CW-X%Kp2*)6IJOj&b~^fME-}i@_$#Sc>P89~%?! z-PS@0;cupi;jxvR&rKi9_o)h~IQ(7+N&P?YJD00p79EUht$=&8O~sJ?tCpY3bP^Wt4G<~7xKbbnJC|5~ zPLyv|Y_e^d0%k9}CxWcSQT*#+%${L|V}^$*!0IY30%MaRe&^BdUjruec`k?V+AIN7 zNox6>?Q&#-%&&O?5E>zu!#DOkKc}A1PO#U~TnO!)w(y8SB7Sa${q=wu>MS|`Cg$!8hgG*Gy9WjEgSk4go!ts2JP`}5W-gryrFh+qRdSPsv>{r5ia)u@ed`Lj4N zq|Z8243SR%^%BsQ6nK5UEr!vG0tJ{1;rJ{&a(WfTt!yFzQOW3B1cyDPTuwPkyJzmFB`c_bw9HePx*fPMiPtdbbU2 zBOFu{EP<$q3pxuii38=FZ#4zf0ET1L8dYI55 zL@9wJ2|lnDC=Nud3dNKQp=eUhwq7VhJ1^G>13go{ry1 zH9Ie~&`g$qkwXmcRrPOv&N0AGl(Axj1e_$%yo3UCzR%Zfhl)ma9w-5qCF^+gKW^}I zQ||?diX8h&py`(+Ui)be_{TOS(n7SkSSEph8{2u>5ea;jF3*Pw?b~#cz~k2Yc<0wT z^N;Np)~BfF;uaG4Tz8NcJ2-^TqGIO=w0kTiaCJ^D?`!aX&(9zBa$&~uIx*yD=S$#T zU=Dx1rO{?0lkn4GxJ(yIpz5-OKXbagQ5fjHNen(8N+htghltNI)H7FJe9cn~s~4S- zz`W&2e3n0RMk<=0*e8MwA?GDv({rz2DA&yP(s(eRT7A5KAqp$>qx%v*~MQ<_}1>B1bn8P;&;CCC>MSW zY_EbY^Q$HBRdAc1Yns?o7|~Lsf=NxTNx=BiHhykPT3xYx4XuLP>u*b-|M{Q%_rJ|# zs=R)Fhzg3I-j_hyVI{vaU`^}d(lPT?aJbDA3G95_T#e80lke?B+l}H>P~`na0)N`O z@}KWHZ ztCga3D|r~u%R$t1xF{nm%wi4F8o>Owj{;L>lzjKYcERRFEf(g8DHV6q%%rX zFtYNI1m3pH;?Dd-Lz;;-jA#6)c3 zQK`hE#8y&m#&w~LM|61wkIL970gCD3e@51(a;btm!sPRmqq zcF#fy7`aIKv&%j*rQesaDwv$Q-du*TzzJ~3VK+?khvV@x7RQB4@ zQw0I*!X?nmPRY;NKP?fj`S({2xUk1l0zLe9^FL4c_?9WleqG{SZZSs;C+{BPvj|U~ z6)UsmDq%@puow=sabctqAc5pS4}YQ#SU zhphN4+kD?E^J-niu;t2kB|IJan!krlXWB`IL|coYeXrw6csb65&+;N5NOdW*QVi}> zj8$;fcRzo2{e6GQEXNoz*z}*Kg89q5`1|8t_f!c(euyDeSfGM!Z@TkY-iLWe)^C0# z2D0F=3QYbsrq*r?G;= z89O8}zHpZchA#Lb#p5t+;$3B4?o~BYk zKbs5uoH|ITqJr`z5Zn5*3RWLo&tK2HST31&wF~djJ6ko}`JBf0a`nS$m1Cia6g=v! z)R2>5%HN-A#4E|;!Xln^>hCzp1*uWVZzJxH~Ec$vwko`84ICoVzlEJ@bsTq_oreDqe)e zD-p~pAc>1le5J2)JFADh`zwV319pmFO8FQzN^oA{G_AFCQI9?ZEb%H4L(SWXgxBN^ zk{|6$RL?6r5fJFxR04UL0qoYW6p3TmHF0jIwFI1fohgC*lVYOo;tt8ZeT^k=vO)+5 z3ArMH@K{f_M@f#PiG7qxa4n4hix*~6`1r`1xZzhUS-iBZ^k~Ie0w#}ZErpz1f<5d} zDw*mQtZqF25CNZJrBdj(dk8`AIwyHKaIo~K`F;W}EDM#wTE#CgGF={m160-B`nl!EhzEo?~8N6D1QUDR&g`2-~A?v;Z3ksXBV z8YAiSAx_eM^nC(0IuuLcxXT{asFS6%=bgQ(QniwRs4M5CApep@^c2`jm%2X__xfH> zK-`4KQs_4~m3_ITg|y4aIm)+bCkYrW`Xq%eCu0fELG7g191B#Io&OM^HTf-tscRRp z#7(v(x*SOlnH_^lQ%@($QhN35e`Bo457V7WJw{ zNz##@V%7I{yddDg-q}323S&uG&u!9)2}h*kH)a#yCtS#5Z~c)Rov>57IrgC1{n0T3 zB3?%G5@<(t3vQn@ZrDlb!~&LpYg>|d=dCwOtOg#DzA3+~PK$~rAid)@-pl>X#jU*M zQpIayBIx>Y-q`J_1e~@ERrL$jN)P#bQ=49GNx=8nnY^g=Pn09%Wm30rUxLZ1;7wB> zAfVOnY$-GKf^_b^PVA&9IZ`+nlTU!_PZ^sx@rHD?t{X9LWg)M_cr^hV{kIdjhwe+6 z5g}|vn`Khybf<)X--0WwN7on9YjcJZx!h{rfum&voO}F^aP_E@9#M2>{|??Hg{A|~ z5+F`^!!qN3N}b9{;&bd7DJ0yxO2F$E*NNkw8xf|PoY{%N_oXm=|3djyqBsWqTOo(9==H@ZkyW?Yc3vAv!%8KY!3XuyEr(5oqOGh=%3e3a=t@%7G}Kr zNItIj9 z_1IqA*I1fx@6m_d)L|*_-K=IL*ez^BZpaTLUgZoT;%Bd5AwQrc3F@iU>}$(l!erej zHm#oF4Y711L13OjxMvO~+V}(!PJeE&pzZ2GLg2F~w)x~ygsrC;yK;aB??Xig68aX) ziL&VviHm{PrF8=>I4FMBo`mm0Yp!F?OkzbyJ9V@DZCL0n_a-65p*z{F^+F=v*g`#W zyD0~qHu;h8BxO9Oy}q2NQofh|I5D4vXS*aMh;9ud`%hg*RQG1sf`O(S^xY>RVOfkD zr}z^~xMVFOL?Opm$leq{g45hRL{m)y5w$yxJ$UstPafKtgcpp3)HrQ3G14uEFr}Ze z&}(M^3Eqio*%e#25m%e;V(TLEc~=LMBm`faLd=wJCz8VAiPkghIk5MVkf5ypE4lP} zH=$$(vYTuRc$ukwBrIDkXIG6mKn!l>OK9HMbMUi+CkZAYPGrRMTw>jved>Ej>sW{} z?Lfl(nQgcq>4n7J$DV3qds7aUk8DrE=e@TH>v<}|Gv~`MiQW z3lhdnn96+^c!?l8uP1E%Z?oX&ZbU-XA765K?G0kS*=n|_#Ux&otM zQv`9``5Oyfp^Zpb(~DxOa~~5Wt327h4n2A8s@@Wi7IT^Cd+rs{H*LRkK+12H=XQ}8 z@Xxuz6n1K}I>ImALPfo7&w|gGqXdNZZO8g0e+kpBwcxfAa7xOOzKtzOub=}&qu$9ZbTXMv zz^UDPxF8Q3a?I;fY|WZz6~wuBCSbmxD=8agPYww_NqC3nvaq-2q!hY_xUkK0nv%*D zd)R4a52WCmvVm6~v5q}y?LyWv>xhdz#zzeJTXiQpwH(Kmo((0yKQ)bog_T)E|Jl9Bypr}r zM2ao1a}3AAl%9>bPA~hBahb2w?Zcx9IN$RG3)@`|6YepC$^LD2OO4+$1k{MiSXk*2 zLj-giNpguxRSN&(1dMKZiG?G&#oRELv1FUYX6ovNGYFVh^OOaf^>T8t(`2&Gzuy}i zbucF({EHa}Eu58HitkJ^?)-jraApqz4z0E4V4eRmQadx8JT%~$wECqj34Tly4vf0= zXFr!mkT=NFYOSIj0fUO{Ik5L^&VB5$lH6u_L3;6~5eYY?4jc$~ZXn0httB(E?ckfs79=cr(T;<8#0YY9!dCLYvagcp zOB4aW+}d!EqWH!B>6K3YSZ%KE+tG%EGwnNb@Tp4-8{c#XIduJEX^+Ba0-S3^931PL zNdEe=i)>xHU2-zcnuNn={W+L@v5KpGolVxQj#Z~tRTD7nR|^id?s!Fx{ggvqx;|ZU z<^2r;1kP3*R2LuP)J=|%MnU$h?Qk0sl$RQFaPjm&@>jP4a;H@yF{E!guPmrB2j{OK&5S@M9JdAE|(mb!9FwvHqqxhRl@Z{9`ZOVu^9F61O}Mzft4 z?AB2YP4lGO80rBT626UHquMHk{znh+n7D(|vS}a4_yT|FoW(T+d>YY=Cp`Ct2u}D$ zI65rLwSlHPj zk$`s}73{u}da_k%7jAf09}->SqabaT;8e89GGa6e_V;3m6^7fOY@S@t0 zgh9vR$W!BNsh(HV&7YR)q%qSPCDdpmG zlKfI%M!@bUA!DpNJ9QcGs=8SE9%Vk{bXRwAl|)2o+S7^ zea(4UxKZI#)^Zi6&heJUd67^zsDfNj;ZAjVDj=&ruIE)v3?M=ADW7|o*^%l$teo8t zS;oQPDZV5u=~ztOj`E@0hxKP?5$+_E^litxf8#PYc9|cw_=GQcx%+w!cH7&Npk4Qk zd^R(RP+H;66$_e5@52ijvTT+h?=rdtXX`pii3*|M+k8LoX_?8 z)`tq*Nl_Put|dWsV=VzmH+zv=qC==~GpS~BsX4D(o;d+>uLM@oVF=YuE2icKr;#wF zU#=7^_Z(CbL%Dn2xtO6u2w>iXH1gtlU_1pe-{W-lj9 zpyXd0YZRF|984VjObt2vT!`lzrc$fcHlnVb`=|z+fe|cZwAstf*fEPrba>A-cS&Hu z$v27j)Vmuw_;fh+ci1cP#L_JsSoBX|Vf1AccgZq>Y8+b4t*NvoVNTRO7M>(Gp&n0N zPQ7Y%pS(8y4F~x>?y~Sbua{gg>R`K6NMfLrXy^C?f&?7y8r zZJ7FmRfTsYVbb^(94J+3RLYGcD(G`MQCaC~qfJ06cJYm1G z5FgS=8xVMa>bbk6#w^B|*JA857EXu$p=K8zqUH}8ND-HwkPxQMWMS8%kDAw=k5cMk zt2Jg}hdC%~F`9*a!(UQGngVK+X)^U~$y^dtAA7RU>wb-9#7H@nShGd*ZmV1k1@nLK zGP~DMcN?jxD;HBK%F#&*^-Wf);KTeEnzqL^)bo?6n$0$|NLUtECWTqc-cjunOR2;g zag^8KNgR~sw<4g?&sxpn87Ham=@T_a<~<}KT(ypXx<5~-u_I1XPh~XqG3o>d5m$=| zSW|mNvw7G#>fUiPjd{dh5@tQWMZk`>N@~UAN-F>me38H)>D9la@Xj>+g3cqxV^4RiZm@)ienS z_a-}0-3C0MI+a#&#pW>t^o?ji!idd(xqRhg%4;i4eW~a{K-^s$5=PhEB1ihYpiVyM zqdDxeiv)3!HLo^cE0?T&LoKQFrK0Cf z97cAv{zCPBV@!>H?#98=@LB>!&-l*uyz+zc8?E5v(;HJTvri5IS2}m2ZXW(ab*o4u z9@*J*V5gc#z?%ijHOtN$(-mu96V1vhNC^7mMu2il3Kieal%5?N$L)At%fj??8>L{9 znW@=%!<=qw`j^}|E|XVMVXTHJ>oci4GaJ*p%{yp3>i-h(+QgBCCATs(JuGbK+IMzT z-PwF8Y)YNYLeb-$lvj}*ef453M~%!U!J_Oa3xP(5G@GV4&`wv?q@dMY4i5Z%%!1P` z4Yj9TQ+n;rrreA{$4L;od}N{E&t=V&*Ujm8)9LJx$|4SWZ?NQPwmhP&j=9jsru&hO zmveaao~=0EmZzH3ELZx$?|t0Hw&QqnYF#;)yXp=#V1pao@7yQy>WQ`loa^Dk!NTe? zjdZ0uow&$Ib9{s&3B8wf=3qunE)})113h6_J(+rM4+jo(d)~eU>6#94Ui9eV&z$hg zeG-g+wdKI(W)d}TcPBdGX)&4d##RGYo>+4*i%!vmp7f)qJ#55%Gi^eF^vO>azE@^Y zULOQ>&a-}O<0aoXxH<9(3yzO=Xdd}U=*rXKWMEwr3PxQhV?mm~l~OJwX~#ofxozTH zUTxyOn1D z<{q^9kT5Ff%2WcP`fn4#PEtj_wdhSh?i{MImGtGHN$3+P?CBKAUD*^&um3EgM&DDY zVanVH0_L3^L~d_0fR4^_&^&9^mV+sylmzrA`f|aggXu;Q6{OdGTMkN0?-8&zr#{Jq^{N^{3Mv?z=MSA2iIx##m}L+jb_qTEqYOqm))8KyUH}GN9ugKWs}{+uFlaK z=<&M+35@EH=F8E=^aB44tc7ta3Ie{`k*FAXq?Z)#{B)140c z8c+AyZpH1pbBhG47pqxtt_ackc1fgg_?jq*Gb5lDdxcI)lzz*V+P%|d_8sMu)hW*x&HsYOZ#(C-&bqpaog$rBX?@T zUNob?ix6^foz^ib#%y``t!sTh<+>yU%;CSvuQ|f*~9FvmlHeOt08;l%6>DHZ|z?84l(L+*Csw zMR%>&xI+3_+XM|0Rz$+_zaA>+xVjVV?xUm^mpW2)icBVAj-o1oUCj zsIaT0^oMMJt>x=z3U&|pPC(48p_<=SC+P6vFq+KVq=8vqn~-3C^f!6n=_xvLXSg=# z_-qQYteTN<=(HQR@^=OObVv+MoiftE<>FrioSYrT#k4(76RS6B-zg4|Fmmc;0=!~f zsJjCy>H8INbVTPW5}ce13F!WKxn^zb6?*d04cakx?sE{aFN1*g`G+X(%ys(4!}WC6 zt-C2Wv>}jyXGZ5WF->pLQMvQA%MveXAfa753GDh(L%GbYrpq?>rTaTH;VoGzW}$BX zJI%67_vyb$j@p5i|Jmu9!oujFkJN9bh7QP9P@0=k8bT*)S@@p(L32>~l+NvJr|H?Y zxfaTI-euv}(AU&<@+E!1L!>EBccNjM*nxw-z7I52XWq~kdOWA{?_JS=>lJSf4s5?j zt(^Rxwj*inmZmur1Rj-gpr}=85-dN_0nb*_J&GJOFu;c3piGfLS!%!1B_0`C$2F81 zzHAV35L!J}^D(lX9=)iTUg#Z2L4cqg2cv)1lDE43p>4g7X@5VB)WEJoE*yMlbWT0m z%9t_wQbxx=Dy3k-Xj2Z(o_@|b{A|Q*9(qDMJp7IZ(n{~M5dR>8YVy&PdHGdGUtU*5 z!H4fVSy(zytGWBmoC&qsuT7YruYsw#&Mb7T{YpjDSu!h+?Vy8C2T?HlnXw2Kd~KoK zP;bRVL~qpkx4gr_U)4P+L~WGP4pz3z#llE>>ybh=$S=+zV9=%E+P7{^m{%W0Xj_H| zDEQtcpMaa)BIxEa2PQ1PCtZDbhX(Eps3o8@EkS!?yc08Og|~KbGbIJ(b1g{ll4a4a z;+iq3$6e{OMc*_qCcha87uFSM<*YMv_F=VV&k!dXHs(8%u(td-?fTAz8TqrAid)%C z3)UJd5>(-rwL~XZ#xrZUrj5^A3c6T)BH)Jo1KME6&Ui*#qux`&J$2}($^}jf{NY5eQ)J|jF)+rsBYiljlL!26G zK*Y3^Ld{_d=2Mv`Gd(|tT-RYd1<5}7<+LNin9v zquPl>PHSM+kDeS{+GxuhKfy2^1CG&dCpuFw_%F%9g;nM{^`x#$;JGsGha-nMNLeE0 z*>?Fw_p=IQHhnowhxRn%U{kmDJnhz3+IiX_#xd%=c7^eM0;JY&S$J7;gKoR1H*@ey zIsJQlm;ko@ms|t0B%BKFWVF)VltwaRF9eiiE#rV}GP?bvVKkIC`%73bFdoc-iYnck$N1E4L+VF<&Y0W`@b8p?r(sfMu zsCm?CQ7j439o#uEJ<^d`xo|yGV04??^}am?zjyg^FfXi~PU{`Z_@2%rx)KXDpy}R; zgSbGDg?@W7}e}5~m;hwCs)4e_v&m0I|tNCe`z?-DVVIf~`#Jrl9 zz#OmrPVTSYM!}euqgj|HsL^g9H!(X;#&T^u%`|Xt;axS<9y~@@StK(n7hNGAbvnj@ z#mHM?FjMZ(-n_e+nRe!^`f~OI3f_CoCE#$;Y&uQ3g-NdX%UK_6qXk{FYXsbhY@>DD zn#v4t_Mn2J2h&jdu@MQ@U-whvBGQ-^QRy0St5I5bSnW*0a_7zL(lHs#?Cw7(GGQhS z6-RwYNOnonEb6nJnQ7y!9aA}ww{)^U2@XLm=mF$TM$^id-qW4ry}0T@!inpXw9Wi> zG0#$aYHzfDtpRh!k_3miRQkNv9%jOKDZOOnMG9me9ur{lP@!GrmCa1Z`Jw62Yy+=T zi`@i#*n5@s^WD#U8o7Yl{a`)sF1JhyY+7Z-a97szpTrbXrnuK3 zW@lwfZTFrNDY&*VmW8cd9CevtxlDX^G(9Hz4+rui1uW>AwPkiKI?DL0J)~Vh3pt1y zeTRif&VIU!Df!IDkdyRQZxIED>YX^q`}yy^Q(4H|`*vA-=W1IGgpY5&NwbqYL_M*rQ!E1cLG|D-pV*6on*|757Vc*EYw2mml6Wz zoy*isdUT5MKb@gH(Z4wjUhi6xa5Q{3<3m+278Ox+i?E>@*dHM#A)sQPZb8ObX4_{Y z?c-r38u%0#K*EH?97g){Jd=K41NmpFh=yTe5eeOs4(gJoRx*pYWfa?df);*<3rTQI z%3&g}UuJ#{_tW0WpG`yhWC;lq<@2vxFosO z+t!nY%?nZqXf-fX_c`zubKp)jZD)2`1E-oClER+Q6lT$xJIvk|jdXjvx6;6kZ!6SL z-)@8M@X&iq>X3W%kK^5V%b%=ZVN~)WCjH3+ruV2AZC!bwOLT*hj2U<%4rO89_2#-=vd>IEYAG|CIIo56ZS4s7 zwsbhNIQkoNrs-f^)0JCk=rsP{>-`^J?*!e{aF-D9bdOn1_SPB+^`LDaiY5^|KEnFXtiWf!MK(6jEiX~8bJ zI|)0++my`t+(;HZ&sDc}V=@i>BLyU+h+E5!%{P^uSUH|iU%IRXM+a9De&%;Bne)y} zX7y;JPBo{ThLhnh2ynPY%a$*&kTna;W^ANMTFCCSfPl>MJ|(ZeSjt)-JE{wKM*sWX zLemE?zmdX@vSG55QC6~G?hvzIS)+ljx%p}k{TyFnWNjnkJP+th=XjBDsB(QOQH!CbF+Hw(7Pr8?|t3Qy>SG zM*OD1Qr43L@#j?~s_~Ap0mdD5U5@+nCZ3@=*kutVTk^|E=DO=UJ?i-Y26o319AsOs zDmlBWnQUQ6w${dWqz;18n{ptJUMf@faF*3=bD$fo7|cNC!?P?j?zpg|`kw3FDiU zJSkGp5KbJH!ce!z4CUHcw$QGFthMiIEd)sjH5^!ZPM22aE331XmW)*&rJ#MpNEWJF z$(i%#{blB9{bbP=t~4AhtYBe6%nse1Ljqazo)b!3y;8L>t<0H&L4NC)>+vF4fM9`4 z`=*M98R=de{8-XYr=2H}MJ!xb5@*~(2fNChIk?)$p??#I(QNOn1yqaY^uMQkzHGmF3ZgIWZ>Zb9V~oGwW8a4caiParI(aX z`l5xjoKI?ab2~@d$i15^wrGp&p=&M;)QAsKSm0Mr*R=_hT^kr%643mR26}EfNWj2b z?z%5-K{D%Yb7Wn&W@ur-KuZ!%Q z*v0&vJV2IjX{np$bDV*+BTos~dpBG6cGV!+yOYBxZ56A7u}|U1c+rRg5kbG3gN5fmun;7%V$RQ*COg_ML1!VhVW4{C1{OZ}jMoLK zX2?#=v1E>4ptaCq2!9m`S{LKm-tj}~Kp(W#A((mFDS3{z8oGv$9Hi&#D6hM`Eox z5ZNw~i5)k{{61zI-%3Kb)f8Fgp?F#2 z19I(sCu;`!pR;D6+uP8RhhH|zxH4--=hI6ELAO$*AoL26CHGF0X_C9>+Vu!yAmU;w z0VY?wl^oo@N#-|u9%DCRh7Kxz{w83hLMZcmpCtPcxmfq$?H~pkA9N+b`+-ME(>|MJ z6CwvPTUVXeLVZa92~RSb%NAv)$m~siX{UXc@P1trkPyDbvLx`&7TKdiB@|;KVPJSS zdlIrkzA+odrOIZ%yF$O|wO~v1|Y5WdZp(sh`eBuTJcOnT6?s{Kg+$wj_^Mb)+1R6#Zc zwzI=oSe{@cv)Gd@>-^J;d9b$~4Owse)v%$|vgD4-epyeSVY=zf>$T8G(t&_i=?*ek z#sOJ%-Zp0HthT(PMTGyLd9YX8g`@Sd?D&lJ=A}Sdf zl@Y)DoZlaxzxwNT&pq!m&v`Cc+pZ)My7X~HM{FHs72Qt>!;7CuXKAX7>?b(8BJJG1 zLSpu5LF>gWNyr905#6cpipD$lm)+`rRw&({CEc~5k7#n2N*83dxUX3d#y6{I6=4a^Z0nH60@3kO&W-ZdA52LDs;XD1X%Py;)hkEXd9 z$<(59g^6>Vi(2m$Ns)n;ZUJhRb{6JpTo&YulHKeL;-0EI%rQm zvhxdk(&M7z%~&O`HNYD=3PWI|Q&47V=J7P+IwC;eSeX@@@Uq*5*f zhN>6cyb&q-^z)Jn0$G5&ODq?1@;2wInC@^#%U*VLMKg^IrLXL+2^nRT?hS8t6rq*= zeO(bVSuAn=@49f&G)#J_>uXnJsyt1!XXZYs=lT+%``aAJsDzE~$Y+zkD?0kDNTMp- zR9t7}(zzvSqM{AN6|D$-AdUWZOISsulKdkBM5)7CT+qOvx01u>%7l1nl9W#!DN5?~ z(iyEQ`zT$#=#J2|cc1${+wKw+ld>@%{k-&9V&+&bSolV`NA+J(gqD0)DL@N68l_8` zDujl*OGTQWJByA~_ANjQPgP42FWwW{R64sWR&hmg?pA=D2H%$Y#8wHZE>?xV%kqm* zMCU;T=+vMKk|)C-3Xd1|a9g@M$Q=cOc>!8Gc)QfP>my-$OtSlrwuD0D^!Y+QipiWJ zaeVz)_;4UhD%~=?2o*Y-yJ6>06er$TPk1Id_9Z`@H=yZ$aHYL=C|kIf6=tkEaw zyuw6LYTPv!Wcbg|eT4c;Vd&VKlCqwUMAgsUxS$kbD1CIWM%cJJMH(2dCPTOHw!5I1 zqfwGaGhPel&ySH*XZ{ksTK>}ot=yhjDLH)%Sp{AtDT~9qticbF1EI_00*~yBZeiioSyGyt4PLrUB zTSxPep|ypO@$9>>|4E``{JNP^v|i(L9?Ds&D~o&CB1m^`la{X;B0-Nbm0i%eLM35s zU7K*)VUOfju$~lo?#^;SnQkwo7eD_J0_Df0FL!=%NA;gHT#}Upeq_4 zHeK4ZPnkS6RF5FF^A> zo(@4(u9>p!!J0(+`YpdLiUq(;+2^pNbZqOO>Jd2R^zWxB8E=i*Izvr>$A;u?I2* zbT|2t3wohg;}b?&^z~ z40W#hnvXV^w9B?v8I$tVbwzu;as{+;v_Sz1{Q5<3S288(N$cFlb=@yRX&X!mQ2EPO zvW$M+NL$UV!ohc<1XLRTBOkTVa^di7Gjgy0!J^l3ePqaF{P}#*;XGMjx;bf63YYAR zDHd5xmgb@GX9t9;TNdQ@{Cm=)7tR%-K}U66P7IvkNl%bYGQ7-6YaIyOwdpok{LZ;04WvK+&lv?H^ z{i9LtFXr2mm{ni6213ABPm(2OVJt?x88CZa{pPiGmH1#Cy zi?f7$9dnV^{7nVuHUcB zXIt4Bhufmt-WvI6`D$-r=&AnX><+0!$-7EG_7B$%L9^1lWXpdJAQ`RWq`}>)WatuC zcR@pQsSq({5Yeu2mCUugE1*S>*SVlCUPEO44-F=EJ^vIL9juU{$IHrH(AqeAA^-aj zvgefCeOp7BfU3%VyP$Kr`m&BbE+i@Cw5zP|bs4(bYnKapnfgOwe%zH1UtMXW^t^yH z&NSp9&!kem*Xkn!IxO5cp$AfT1?o&{)RcUh6G zR3MKB9+AjyB+HP`_lX7Qj^IH5dvD3z8*hjkBpM8q?28cx~)OlGavB^$m84WJAnd(bnD0GPO0{WWHXk#PU|5 zsBOKbEBZOjNBI4D1eyAwy{LUbyA+*0Eq4(G2gyoijUo?Yx4CPKbP&*!m^m&e@Qa%FZje<#@FZq*r+`Tek znhZ@|{5v06H*b{<={=5=?no*clRiN}Mx~?xb$*m4^g1@4bkvj<-Bz`dp|huh3Xt8q z9kTBh6G`N}Qc32lqoTLJd<&2)c89QQ?<8_qX_Cx&%qv$^cD7pqvU$5**420ld3OG= zux#mkDf;9&Djx-VZ58J4@*_G?6|%;yg%Y&0YPJh{ylJCsr}0$M`m9ATuxyp0p;3CS zsC4Z*;ZWu@vd2YJ9@62P1U<_h>WcmvB*@lU&LGKJCM00dRw)Y2n&gTW`-Tgi*#Ttl zZ*%#8#`Hp@YB0nVotzUOtLZz7#6IXo3M~#xP)<&@3$jcdB}^?0BrCy0J~2>Ph9Yy5 zol&Bvi|m|N5czkg8`tUduM==?`HIh(4QFrlBXLYNWhU~ne?Wq zfFi#cyP_QyCej9nNHS^cV!@{-P=+oJ)OST4kDhgZQo5Av9`7pq_a{X_o21n)XlLuy z!V`<5NQaFdB+rg+k)gfgEnHAwYNw*9x+_S!^CW4V-WCD%wXw`cv#id$f69v{-5x1R zJ^OBuq1E+Y@=>fsXX%{4SdyUCS$NuYndt4(9tFr_`v6Hnmz8AJ%c-(?@&2M;vY`cN zcFS1lrz@+7t>#7{MCc>(3AZRfCMnY;o#rKwq3w!?YS}7_PDUxhMTN`He5Fe2Nu+4~ zPGM|Ljs%^}HO@oB6MINL)h3aeoMhRbL2IN)_sb<0G<)dzqH@`4vh0$Na6+CeK{df1 zu4qfzg~I*2lZkObciD!}4N|n_Ww0yi?QSgzShj|gO)Zs#o0W)6`;T!&?Jb9;n&a1! zy3Ef-(`tIiP*!%O3%Yr$MRK;!I^ui9RyyWRqJZLxPC28|)pjz_Od%uoo|a5sc~*uD z!_Va*_eDMe|ByniKL0EI`{0Ry_@JKoDBB}c*8lE$GBc;6@cZm<8CvjmTRzg6wp!S6 zZUgZ*SCS2`)g|a;)}4GbgQv*eZc8Os+`mZDgYD(W)H=2RIS*ea*e%;geBQp57Ty&I zS~~1n0m}LoEt~AWi9Fc!LUMn`WH~y#`gT5gz1U9}HFh(R>(|Q1j_C$yT%Sfa)ZD{X zraE;CDfFr)s&9{os!vwBqhoGd67RW{*f;+tpC*k3v~2V|2@3nzyC_e88}W6iAoVQ+ z0CnVL67;_4qEx4O8zCd^$oF>60;DFf5YWb>qlEP@wv#n?%E|BLTL3Nm7bKwisw|mG zSsIb`eJtPh^E#k6*Y^rYxK}46=ItQunQzEB!T`;=Un-zu+(`cKSUNdITjdLX)dD(W z`By-P8U>P^kwNlho#2W}qbT{IIYC{5gXJC9?Ifdr8L&^0{{YD=2tmc&H;_#$c9C86 zHt@QzGereIf(Y7q>!93l;coI~(m;0jttLf9hu0EhaygG=1?(YX!-s*-I1`GjAM7P) zc3q`>@PxhONbw}*J;#)ynjIGiGMmsy?s#XCX?`J~(_}-D=6|IG#kQ!h1!N!jJ}RD_ zylziX&E8sqp89nKts(n~rSV2s_1m7J>Syf)wG6jn1$_>Xy~}p8{lSAMG9If1h{*au zsKY^W)A$JNSl~d>uW)lfQ{|M|+8iRMtk1E(?E*!y<9Y*{<2@eUS{x=ds|z6|(T*b3 zCIQgf@j)!R+Y!>w>Lxq<+k+yx=U71Y50}CslPsbVSp~~RSW|Rl(riHPLCMU`_$V3E z_JYX*hEp`fU>TrEYd3+e@iB5OxDI+RHKVASt^xF@G=sGnA19SU6C08S6uFJs0?4Ds zLHKN%P1bk%3UrqtMdew$0o_kM!QPmkAeU(i8#-h#MU5k~0NMVy01vEA5}oC3@Jg;t z(Gu5lfb{1Uu?KdiNKRE7TMc#;-H#{$wChnZym2~BGG@0zol-}N<~J4t>fv9`eh)lD zM)GfLLaiP}9gkH4+WGkrbd#JVktrYHKlfJA`CZQe(Q~iZaL;ojBk?U${?Z00hrJg~ zKimjWV{?da{1Z4Xtq~a+e+TsU@ppD{+IdnprHpy(Dg|`GM~Nb%x&Po-@CBl1=|M^k z7yWmzBSps@I`A>eE|Rdqqilb3CZN-QH7T0%K%Hi<&Lu1NZ-KHqJ4Fr)^eH-!ugf*l zE|I#{MeNSEnShQyGNma0p%GnmYec$hCr~8)IiAPQW2CC;9E551 zW@v$qKSgIU{OFuSPKeSCrv2%nXhu)~MHThciOQ?O zDXNArzR&OmS^TjPI?Q>;P>)?pDRRhLLd%_Rl78iHn5AwPj)J}|rzoas8CRcni`05P zfeE)dbHr+6DB8AT1)Z>}lz4u-#a1oU=jh^$l@u9$jp5mc%gCoYxv)6EoFjd|c#7g1 z<7k(gw~3@+4-384jiZ6L6DYd6WEGETx9Z$dNmy@{kK8!A~ z;b?z*B1I*i<9VD=L6#rPBdrUZI68VZk)p+S^=!UX$F(0I&id##Zi>+9Lx0^sz}N8a5mzs6Gzeu z(G=(R!*XE^f`&^{|3f&vEis+jt@nKuSfIrs28Ms)-5*g zw+cu1#tx@wQ=|tiI9*Lfc^m=jU0pfywNk8RDwOng;q|Xyl8e>z*aY=v(P!Jf6rDEg zO>MiqBISywMwA!)WT-XBh9cL2R(#Q<*FPYwf`%U`s2?CY$d;)L|3C_QJOtU5S~)rv^N^rnOBp%5u8CNy zU10~GTFX(tC|!bFU*D2>mwhC~>o!8S#4vaC_^E~*d9QMnf7SX-B;I}5e?GPZm5%;T zj`oiGKu%2hLSkkuAt}>qL@sFq87g%kY+hzF`T1xrdGPFyNXIXZp&NS1;86ROXdCrp zYptdLYQJ@uAzj1ctl9B9S*W}Yq&EUY0~?ANst>va*P?z9KJzTwyEX%m@6>k;*%#Nd z-Mod23B3j8*AI)1d{pHqWsMqLs?kQCTzkNFF~u3HFv#41qhcikK56Pt(mS^jew?`{ zdbhU+N7HXAu9@s#soEau3)+d>*PLK%ikkAZ^AW)%JRcqvC0wIg|bvoegF zc8V#@>rT<&oEVN4?1`pt_NzeXsap{Ez=5KTFII6hI&~Ef9H|OXW)E3Ns0~Gv#wBtz z>QW+|{#_L$LOFQ%>PykDABh~*tw`ckht=S*`X#n)oE=4dt|f3(qM1bR_;vs{Uo{v?(=M@TVh6$ zncFyy`VJXKzXx}LJ!Lo8g@@fJ>Qy+DqlP&{`E(<77;IAsx+@JR`V!xtqmRw~sBlXi zGA~_Yfrr#7N;%SXHcr<(j^s2)(hMaF)g^X=l(01wqDRiv@q~5%Pp<=&u_F|Yeta%d3 z&U)PhbZ)3OLoPE$!u}R*_;c(soYgxa>iP4Q9KD!QA%ApQ2a->`WE~$J0+e}iy9=5T z7Af&utPAzCK7oniK7^cilo7PT;5w;u=?cZmU$M)*7X$h|d6a0)L~mx(+!Zd=U4gnM zYNFfYb^$sazY~7%(u0PQ`7Al0BcRijH$`h}Z?aY|eef$BJHdnfKH!j0pq{= z@chGLGVJ6{0o}IjO3@VqJzkV&0If?>nC*s9O$bELm2p}1h#k1lOySD zH;TGHcIO*<89``CJ*%71L1cb!G!>2Xp_kqmL1TCmIG!BO&`;~>6wO^SgU>o>46Tw% z7Lq$z^u;`cB1f|Ybkj5w$bXUnq~I_^URxq5ax`7aT@6h^O+}sQ-rg>%^o*q_cxWtL zaNiWb*-@U6SH%#uNTA3mG@hGm?FNVPr$YD8LWWptB1Kt=33T)rGe|PbWj_c06glt& ziqu0^@qeAo!Pe?Iq+Nc?kZnjDMF!oXsq-y!xZL$M8#zv$qq2`nDKb77&cCd)fHD5p zp~uut9QjXQK#{D&T6lOp$WtKX#|H4Y)3;Vfya9IqJ2&8ciJ>>4W3{`uqIa(y!z>r499`r${&8}30C)V*okCAj;7r<5oP*V z&<$65!ATWC5f^B3)UU??k@dX6ykM0hWCcwYShyNT_g;95el(1v3p}0R_NXar;L>(c zQ`$6+lGaVB+ zqgB^e(MNy!f!2XQ;<9NGLpJYYITBVy^KZBMLu7U`JO5>bs3~R%M=#pL=+^WBP`kJS zE}E(`RCjj{N9BIA`SHMku>QtJ7BS|U9KFz*z|r{AW2tNJK`?9P6Y#oHEkhM?5{^6v zx^eHHgWzg>8vA~_K!QT&+i|+$GSu8b3vMdA z!s8BK*>l@8K-!LdrRc)%KGMSbuCRh!g<;?KinKyB08Ps2#B8(N;F{eqwyuK|(1OxU zqPDX2(0Q3VJiItiZo2;tpht0)q6egm&G(eREJY1Ta{9H%`BEo};*(S<7zyC&Q_Uu* z{s81{YDbZFt0muFFF--(UtsxAm7;NDsHlIG8=a;|r-v+f!cqsTQ>2_bMU)>pj_=Fqq2N{oRD3m~XxHm$fOb?)gy3bPASK;i zNEl#BkxuvJ1eu=P{YV^Fz<0D{26yir0zVEqjcXu-sU?V zmMneA0*`G4)Y1~p(e3wBu9 zkEcIq=eR)gnl238Icmt!Ff&tHWj7U8O)eoPKM!VTRoQD%+pl-bsM9pi9eJLW%nTNJ z?@41wCt)X))=z_D%HILL?PTcWzHf3gcc~J4e|tK}a^JJThKEFC;y8jXD_$QKb#4Y2 z25f~P4{kCvu5dP>5FdXC+a3Vpc7m+o;5~*^>x%(}ERnOSWi!EL?;2)#yFoOjLl=q) zrE2u3|16l_wFXLDl{q@muQx@99@+Dkl0f+R)CZ2Sy)od_)dJMWB z(dTG)!W@cTX3yXm9fCmdE0+6@*5_!+!(|k$DhZ`JAA+FmkstfdwmU~E1@RO`Jy^lN z-kSrLv+u)74{MIJt|e0BJu8-y{JC(YZv(5gvE#`6Ml3}!mQlR^)QO|$X?_$voH&th3!M*A>i~9jqytCN=ZctCVL_BLjh-9= z+~YaaHuT}>h>I~rbdUkRDJ+0${hw^d1v`$STVDctFz_j?v|9-Eky2>6XUCCx<$6FL zUan>t+Ka&F?^}7l6^PFr!qCY>eNM=GTkipUZ8S zbJ&8TRadt%@!^zxFKsLa-q zzdaHTr*4JI{~O)L(DEYSXjria9lIq0e5)c@#kdC1RhJnYO+Pu4o5U`G?*%oWUH*un z8HP(ZGAWOw!-6AWWZoy%Unmlh_*EPQM8xyE6PAKx+W{CJl+Dnxw}~9>(MY0~U>O+H zm&r72wlMTYH;$vy{jt2wDGGYVZD1$5&Jz7HTg=hKUW@2H)8%k<=o<(fFpwd?6_Yqp zbDqfeby@*?^{biXr4Mp+p>7aICF=*$)*matuO$NF_65k%uC`4mPUaVnM|N0PV6LDLQ|9G>lT*8)MqF!N_i+DC0y4Ae&z|nBMhOa4v8#OsZcm zI{ZzWB2Bptop~r8uGKzbg=>!jx^L!8QM{!KU${O2TKl!Y*-izb;J$torN{Zx!EuQY z?|zC^?WhEFu_BD3oVgJ^*EtEc4K*OvSDFB|eqKq@mg|bz@P#C(aZZJ!0pCQjH;VIJ z!Tw7Uk9AxP=d){Bmc8PPQAn8+D|)85C!aXB8ip;n2Q5rX(ecru>1hi@Cr>Wo9W9f= zAaF3#T5U+t>JDQ?S>4CeoqLm^+a^6$bj6aQ&&*MDzP2~_Ggt#d5PmgmJ&bX9$$BoaplI&uIF5udF?2!WdeGa|2)F!oDVp#rk)z3D5;zIj z04G)@GhGjDii~c=a-@DTh7Nzb0o4BOmS-PRp@^t2;ON`h5FQ(p3THMJ!nmx@B8~Vl z9NDFhp|4-2!p~7nZ0Dz1Ks8hBI8xHE=c@uXf_kr`F#atUZQ1gPp<$9{@OZWnhAq1% zHJYCb=ucG&LrT{+vi?&yLA!96ji}uLXxXM=a&&OmVlv^;CTQv341MgwMG;Z`04dMv z0a=qbgZ7_d_Q=}T_5>=c3y zHxY^!WxMm!_qM>A5%p}c`U3%J_6(%x%+LUOdE8bAlRSVuKa=I?<-+9@*>+jRKU8dm zw!V7I>fdoWN{CLR==!O6I)3anIQY$;%C1Nr|+q#BP zblNnOX8CRh*}eCyBrrwPf6N4mE{2WgTgtbCb@T+V_;QM&>8Bkjs?X^~vwhRxa*a9I zUA@FmXwMcvFHe1AP337IUHO>3oBu+z_gN~SxHFL5O8Y0$djkxG7kII|>`h%CWWal=FB}W7;3(60zDVnFFuyc;Cxiu9 z0gtrdNaIDUD7;@Ro&IPi6r6j(($+X~q|urvdfq*eJ5AjMFzW+^J+|Y>;7hdVNZ)Ac z_-q&C>da#in|gDkV>CxpoEgL?2keGji}l!j#gZcOUrj~z{*<14xf>LF0C4Y&14rXJ z>WTamwKcn-JrHm8mT74^aI}*aFyu9@0LtI&0XlgMbgZ`GD0#3dLv8^o?C|`(aN|N> zkhPg}R8{zvpg9JO@&gTffkxJ_-noVxoz=JqsQ2PaP!gI6%Hc0zN3a%0=Mr=%@-^zJ z_?(&WWS#?C=Gu{?YXm5=|4HfQW&0r5%8&K#{#~T|F^Hm{OXl)^t@~iL>pQrq`kJBH zlVT`3uBg5JiQ5lLlPXz`(p}MspNSMDt0(d1zxyF>^F1=+$4Q1XN5oJRvn-nGtT_Nm zX{pe);s8Tqwgyq;R2#_sIvoW6>d$P->UpAR+JqwA+wQbv(?RgwDur4N4~8P&Xi`Li z)OmpJA^4?KA={ntTaG?fod9%Q=O~!%JOnut&obo!F>-Wh&sl<+8}`dpx*dk@acvN2 zHC~3Aoq92Jll5g?4;=q~^!!8x`kGci17_K9lo{+q=TABg4`Md4b^}$4dbd1e z$O#(QkEh3>T z6nVZ&5QVg?rfK@8;gatINNRMXXnAFX$SZCIpTF-k?6Jy{uTi(7==*a;4@BW|Pk%bI z#~E02{vd0AU_+5_FKbb*a!($8<_vtA(hT>`TTnEjvK-K`)F*Ix&{-fqb}$noBZ^FS z8vydWYQ^+rXThkoTJCA2P0^?0zvbw~%wO^h&vRgR=c%Hm)qx_v@5KxmR+WKE`8gQB z;sxt@u?3J*x&=ogmh|9%rsRNu={KUJ_7YI_6JL%(%={GRdk*xj+Xhh~rJ@Fh2#$KS z#PIha=OMVInJun31L#yk0!Q03*HZ1~^U!JbVTjJ#A@aDplA|BeWIiSC0whj4O#V9* z45+j=n4=z_!>CO4B0P1x&u*yn1Jw02aC9}$lY4Ht2qVWohg%sh3HtT5Ge;U7HEE+! zE-3$LlgID%BxvKjG=|(y?qKH+=fZ2gm3@3QR)$jd_7!dGRw_w%yaeNVeS+Epd*vu? z_hSZ%3yuV7ib;g$dPZ|Vo~R9p>)@08L0XuF{N*cSXH57vX^MdZ7-g* zQVzpw1~Zq5Jvds`pe3@3)28X27+kNehh>rG9Lb|I7-}27i&dpFFi^V0UcWQqXiha0 zprR9}B;Or4Xg{7JAE>0o(T6)3fYxnIgFnR_bc?DWrd5rjsT;K^n%t<#FHXD)md=k^ zr;*=8JHxywn(FRFjUHZwNRLhA$=Ih1dFY2x#srD-jB@V{SlGI#5jtML@4^#E3QLhF#+;@GegQ@ffViDrl{+v7DJ!sNwB(T z3PUPM{VDojJ(zD#D~9|LU)Xs=V^Qm%H-Kyn8X?fK1S}M>^36$?5Bz=aGerPja$qkt0^p1J;Rwt;Nyqckkf|n3pb^~^u%7Lr}?+Kdo zx-Uni&-?S!{x{*E{XUX6z!H$h=UE&rP{c4Q?{0!!$O|^*$^t+eR>W~+T^i4qN8N%6 zK9z9kdYUNbY63?-50a>wYAM`-eKOUC96*}FVvfe>h4GxUQfRnR!uISg1@t4$gCnPA z54zl{3{-b2@*=ZWq7fT9aHQg=#{JJL?#n5aaudIQfI_588Cnv#04Bn12;X>$d2R1N z(TfXGvumW;S*0L{6 zJt^|+-&r(eaTj`eR3+F=7|CR_94NZv77gg?ym*%Nv=XepeS&fNJt$hce777qd90V` zFT4kz9rm#GSGrMjThaSNWrYlCf8GP7ujZ_~#F(OpVGbPSn%HvtjrXD6y#c0lP|R5> z++i~~%F>!jle$$we)&<>maamP{%6H(nL^>+<-GZH6(k?}EC2WIBOvV^2^_t!iK8nO zd12u6cTm3IiD>oT1swUTn#V2fK7d~NIc$rXq6erDGgQLSBV`x*DBvMT-`$eiOAZ1e z)!!I$tZHJ%K0bs!<*&faevL@Ct}jF1-`K&%g#W;G06zNTgi4#*0MCqvz0&Jul(5sTSMw%$6gw zRqmpSv4i;~#~K*YUJs|nI&kDO^aDe_?Qfu~yav+KGMPnKFOHnvXfm`@S(B|E_X@Vy zJF%8BCyoMBeF3R^0aLAg1v}$DLQ%J8;KRjrtgD+gN3S<~QB=N#@~so!LUQvrm_0&?qb)a8DDpV1N;lWN z1*1N|BCX$vJ}vYBbo2TgwlAg*wtn5q8V5fV?fz%UkmHC_xlH37e0tCXM(6Vx>YLCi z8ocBld^q?H{xztuz;ByHKkf|WXk(facO3X0jy}j?zb#`$3#8#3^{kjqV{g2Nlbv6| z>Dqw|ZGV)=(SyPW{&Z?R5Z7S&kk1!HuOCKolxQD9M>f?%&)qi}_jZya*${7zHtg`= zC5a92y6qmUbgdN7>K-Z_rHxmmjH>tmnY9(<_sBgUQuU_475=&m=9+Vw z6xZ%6mTPwz&{>zI6ovGgNvnS}!NQT-K&z=-q@t8WQRIvTyeRb}oNgTsBLbR4yOxAe zUe+J8|H1=id0eHTB$#4{8gT+pQG_ty7-tP-!nL9fqn_Ru!) zbTFhSwPOuId(>9T&prJNMqQq>Ju}TH`radvp?=d=vzuXGz^qRWnL5*!B4Lg`N3O>@ z(I(|)uvNsgRyXV^^6xa6qxVlG+2K&oQEk6ij?T3E(W#DK;p2tRvLk7Z z6wSUL&rt_WKYoCH1xLR}ur{I>Mb6!VII2u{qfHaPLDBjXEN*&FitMuNIXbVXk?Z{;jukHdWij1PD(E^BT-X znsek+6GBmW*KzdJ2PGPy*abK3YQxcJlq zNy^k?&joObbmB;$*RzA@KZNhNwjw^EFhVn@gHm)puKt zg5zC8%hf#T353##{C zE$f+)V*X~twsh8VwM}&OjD8Witp8em*hY=ccZy_9UT;OS?-m0JebNk_m#b0p@CNwe z`iP+q=0hk-eCf$oUR9%T@Ql1`=aUQ#Jr+vQl#5aHms$rp{Y(XGp0+`>wj_}vyT~M- z;nRVx-7bT@nu{5_F>x_P>5u2rF}pj^&?ZYrxYv=Pde4CrU0KqLtJHR&&5gfVcmD)A z+MHPgXkFD2DC*sju8;8s7;{#JGD(H#c-wihG`b_TNiT$|sV52Qa<_^h?UAjl_w|l6 zYgZ$C=xPDT=c|OHA@|17x0;=(u~bX`jZr{@8SagTMt0-OKrgXi8{R!04%zvVm?cO>H{VH&hY+!gsW8ykwc4VcN%pbBZDS64fN=1`uW*vnx zYaNQr=0khl^89$>_rwEesDdY ztPnSf9_tW#=(-k-bq`{n{+k47wq7Jf|5BH8S1oOt{NMxh(ZB!T1Y&T$55B_1de=OB-4x_T{>lV8ha9~s39qs1uo<0 zOIs}0Ijc+0+HPf|65fgeE(#pIuNX?#x9HN`Gq2%7jw(k^l2V3zB1+k>pY1o9qNjqZL`%c^=hP&E2&qUgoZZM=JVH`;qs9GITyN73=K z3q&mj>*#qSGx|sOESyhupyhu~72hV9(-600`IlxbiinY7=0stX z{}TFXojHvuu4RocJ5jW@Igz92ohjV2(wtsfw+7;V){7##&gJO%^rdvGi3RQGa}u^> zREnPTHs9>+WpS`{Qh`dU00v$ zqIjOq=Q-!x_xqk}FAYe(um^Js9t}Y|%W2nh5Sa|xEI~F6m68dEMnmiLFlw8;STyMM zWr`-d9VP=lkA_$Nymvsoh@zu!r!X{qjS+inH3lxP&6Nz5zD7|(R4PL?4?@dN1kG^B+ahO*RZ2Xde$B7!9E%eFdaST@|J3LUzE_7n zw#}!g#knXWBbMD@Y-y#|ac-bU8^8oOw9(A1T5!svjqXga z5m`-e0`y3pUNwB%hN13h3jtOh7$;CbHw&W8rPa9b# zJX^qfJsqy6Awk;7#(e9ZCF$Nmd-XmM36o|t3m&&!=RY=Y+8rz z73N=lND%!mo1y1e1F56~%4fRB+o|oMiXF2U>MK7DhKA^X%e`fS#9bQDe63E3ZjC=xeD43r&SmEZ>A}C` z+hj#gT|oDe$B1eNYC?gh9*pSYK(4jv07|)MLD1;$9@MW$4-BV&r14KQ0j;>TlOo6{ zpo8D(fnv@&!SJ;*pe5lJ41Mfj0TsIX5YqQ6X>%I}C`Uhqp)aqqnQgp2m}Jfs4FC28 z^g}9*p*pw4aOJc%$6HvW%3oVj2|_S)SOxfYdD^t`K{a`Xlz|JAPe0kjQAVE?%DYSo+U`o2YCsmU?a+xW8|s?%KyhbAIPA^k+#n$p0G$o7Wjj zte)JUX!Z9XhU7AX*e)9*{yhDjoN4_^QB$WZL%&^RL2jiH#3c`+o+&a6b`H%054<15(4*;Z2~x9Yq*sO;!!o=1M6*kkp^{_nfOgl+0x3UZnBaYtH0Ee9 zbmwI@plO=9OnbL6^eQN!dTG24fHT`24amPr;$>r+9{ z(Ww=5xU(s2;PtJ4+YV7Qu+0Y0lWb>jE-;1O37duS7K(| zw}wbQDIO3Tvjp;$CV>8S6*3}(PmSX)W@`fa?LUR31x$du8($OElAtQIuGEAe={IYM zU&#a*RUbxsXq=FsinKC{?xigynoSenf%|PL6F-8W3yC%isaILBr@Ce^bx;8b-4!Rg zV3)~|&9Y2b7-t5Gd8f&A-2)I~JLp8!!`%wV6w zPFl;?vFN>tIz{7zTq;a72j9DlSWW8L5G|2>92Hi$jezwtTzq-baVa;QLu~w zs8e&eW?xJ7&nN)8l9464_B@!cpC-c6Wxn)Xk|rSg+E|e~e{a^YnFyl{-jGRZT7cRG zB~g5z{!C`sM7X|ElY~Ff0i^r5O@dnG>m;{sOoX@mGxfTqAt1ScyA<8HdYYsTm;}dG z-4XOIj0JQ*)RiH}TN7A+mr1Z!@iR$oR|9mvFYoK*j&AUQr5h%J$~t{Xu!<_6A0815 zWxcm%Ee|HahVo82Q*{WSVa)>=`fK-q7>}@k9P5`>*P$1nbuTRibo{QSB*@1CJdU)J z5nlW(g)^7w64?#=OOv+qeUr;J!nzSR2=+I1hL%NfJRg}fMSp(cshUJwSR`9YsDP|*)DrPuM}It<0DeEbmIXD zy4&R?AjAH*1+RCO@LaZuR`{(wi!NjiW@sq?Y`U#!1z&6QNIokSP*OP0XyM3~6s8kl z#cStYkRjlxZe4g{JJbi>({tc$}hr7Cfj!iUY0f%|MSI}`Gnq}xQ zwBohx|8=`Uk8uQ^hVCRPzw{U)`?Ev^ddt{=c?9wwoguxKYB5y#AX;Q}J{^7@CD8Zm zKB{UunjxMgDY{*x!fv$@h)67>j$aiR;=!f@>eG-X$uR^l&nYF<$NMof)%X`d{&#!8 z@Hl|m+e(Rij~^6uCI$ggKRlPMJ_1l3c$j{^@AVZEsOVEtCg$(s* zSjrZLPl2kj#U#r^Q53|_o>BSTY4Gj8Dd3}7L09jHBq(HWjLKOKD!>FhIMr+X?b`-H*8{PJ;=}Wn|1LML@L) zhXnL5w2#p4ISo|I4wKd^YJeVlC^NK)DnL}>G&phgD4l*)ACLp@0Y;H}3)#imX`uY% zF#RR1%g?2CVbz5+hSr8Gg6{)uAnoQp@-9yskkfrrh8DQkvO$hEaQ^Xeo*kwOs8@+Q zMT=wBlAgPS&?UzdhPJJPWk1H9e@wT?CyZI3d6 zVdrMR^eM|FY`|!S;wNQ@Cd`dxGd|CNK?R-UM9Nr(ls#ibm0sQ;Kh7Qwx>Z-ThUqX= zpf*S}TBD1mMBBrGKA-8*LHZ0idlyec#_Qq*yZ!dyarHpeH!EF+X1ELj|)@FZEz(f&n3@uuh$?@g1PxLNl@3_>Q6}b8dN0?i+bb?t2Jjt6-89+YQ7c$heJQ-qkIl=8YZ^@iiIY3lMU`Wk#K3o6L3Dyr8PH$?B z0#t9Qz|fl5VX%6DGaP!~N*@Gk0kVDjx(dy*l?AENiFf0Ft?$Ci>bZjlFDghE!H^KZTgVK&=jRyHtdTF^fOJO+w;#7)EFpXsOg~v zMC-c3!O<6q9;_2NKMJJiewhv39N-F>yLOWWx^^P>w#x)9m{&`;7P`U$&An9n$^!|y zKivmV_eVd7uXcq39-a8;16ZTU+j9WjI+Ded{_tm?@@%rLq*OqBwjH2~aW=5k#0^|~ zJR!G2O)2Wwyn!Hf!)5eCxEll<)21eoOGN+N_EEIL^AH`j-3>17d{5Oq%0z~jT^I_8 zafShR+`!glon)=s6N;RB%bN-5I(wU2g0xkJjYPt^Lh0z+ky>j)a3x|&WZa_7A#()7$eb%r3y9*~BM9eCVz zhnbh^iKC1TL$%j(cn(Vrq`%H$lchYszaWIvhx6wh?)gYBK$APX;ok%gIQ9BEy){6O zA&-nR1SJo+LN`QufOL5gJ=`{yp{S~SiZs^-({I~6U|Yx@^8A1*L$(dJqLh6SFu3Kx z_tGzu*L~!eC_jh2=2}BDnCV{+sQ493W4`oZXp@|e$mzW=3^1Mrzq(&jh0He5_q-~K zt_d~tRPZdgu&7NUZ+e9y)0S+4PCav>#)Y%s7QdMY*;i)4w!|?O zl^3EY3R#{5=xK2x+x~SHEa>_~N0~~CYCOFG`5$qD+4gBLV8Skm?~SwQxsPNKuvGeP@+7mWPaLWgN705boaBg!hs zV1bXkKyO{B#4Jl4(2&JWqE*@s5YgKk_SJWgDPy$(Io&HHsDAH8YB|9hJZ|lgD4OU3 z+G28yq8?HE>GKe8zJ_n2g>ia-9#wfV6uZ_995;AFV}l1>cV{f1tmQcjE#v2^E15S$ zL{*a)DXM^S)=p#S9{;S})aDHr`t2jTJ`Mw8EvX72+V)9%wDy!RRjg@J$+W8GoVLLcZg+LF{bI*bGojiaFe>^?^sHG=)>I{RwLRGFUWFYaA{4;{%#G?eyjHW(j(-l@oXsg^hoGX|3i^+s1u;`Dbx5~yFVCC>!g?OJ`hduSx%6Sxg$BR>ksqk zQlYKpFh%}tmqiyI@N5Eif7myn$1W}G@BB0KM9HuyB4orWLAo%w>NYJ`P34o@b&jQ7$ zIq>aQCpGQ3Lr~8yo?XYSj+0}r*3JQ++^@nY`)>qI{_#*iA1&4k(WmCXrM=Hct^NQ& zN_|Wj%55}&bI<2M#*qzVOR@r>?X6i1<)>$|J3Rwnk$wrCe^Cuk>m)!jZ*;pygY_PMd|^X=3PvX^|dUzH!%Q0oH|L;5p6(+HhGCY z{Ir8>TLSq0V6*kPotl6GPiBjJW~HzrRRQ2P>LcCwLK%>O+C)*MiZyt>4FH=UFZzbp zKcTg|yCulq4d|ubfiQ&#WYLh{qCWllFf{qFA17vr?0c>!NOw#$**G-_w0K5}eO)O<|J}SMVx8B> zs<0q<;nhg)dDc-h!7PNK_${7n^3os}T#_gp82*PMnSmJ$^^1srw+DHBmqrKOb#o9y zN&f1hFJS{%+^rzEqOCypH;rUSCO~--I&^laFy>Pbyt#IpthuJndl=N&`o-#i)|&Ej zyCK1lC3lb zKQ0htdFU`LiVcSEC37TSc&!CW_T5I2YiB9lusRqXwRVu22t|g%tGz_FN`5fyNHDZr z)g=Az^<`))ujNDgd@@-@O)v;YZ&Mc4F1np+%#ia`eR%UB7_5WK=)>VRL|;d)5YTcX zbD^eh2sG5ClbXt%6#cXt0jTNMNS3G*0;lC$NbX=yijIy>1vDZh6&~A#Kyg`rA!*-h z(WCMRKq=~B?0Z-UM1N_c>V2UKm9Kh0P~_%Yrmf_xKAE)XRAVMYCr%%Vc!>EC@+Q(p(ry$-5U;p#epo&$Y^i zK@XV&^tr`%g8T|K0BKC-wH@kVFz$F3$t}Gn+V7SL=-l08o_`(&H(oXq7=BPR%wsm7 ze49S^uDH!I4=u>pnqZX zyg9W-1qZ_z+SeV$F6<72N#BnU)0sO2bk8)EiAFAjk7xMT)T<>o-dIqiePkFzuYCHk z+jn_iw^1)@MG8cI4i6=$^1K3#Yz~75e>-{oAQPQav;vgr%=aSyhJnWN??P>76GgdC za{%ckWRpoXGJ;few(5AQ4Z^oW4@#V#bSU?)ZA9vd@c-faM%n?zuL45v0LIgC*T%$LeiU@kf zX9u9>D1YX#C;~2iuB6M3)(~{id(-^ZJzA&=?JhXx+zJl840NALOMgQW#XXVdIV@reLw?~H2~G#Rbc4S z(0=S4?-3aF<|rNErOWq~b-{mGjRe`RlA!j{Tql8%VcfD(!%qDxzhVC;xUI6VJ3jhxQc4V-EHRSA+m zF;Doc843S=E}?_GdjXQuAIZ>>IU`wuX(X&mpGW#B*Nb+{$zW)cbOIDliG*)fAIVea zlOhF2KZe5F>{-4`Bn-V`D@pcUM9|%9YbY{%5JHB}iR3-)uV~`QQ3NHGyc1m-+e&<5 zBEj;=E_(US6bZ_II1kVz%LwL}5(%Xt=|ul)=p78rXB!tH8 zrh5(Fi-u26XXsW~BnzmBgzkZ%*8C5o-(z`(HmLU_C|;Qm z;~SAsV>VNwyGo6r3-4?J{j{9MiXTLRS?Du*YqJhRqZa1?TBJG;F1+Ob7Nz}ktAQRv z6_bqt<;+!NYnvlsuV*B2*3n_8!+DrBy1Hel(6=)ZOdhoJJ_>b)OokeYoM)KA_@9w5 zb?th|5v>sn#m~qQ{q{^@{iLJ7b?hUWX)42z`Jw5eh^Z4{ZT~2kzO;;Xmo$s$(ZLj% zniUHd<#_J)hMAo;U6m-$@kQR#4P>GaZog&{Qzc;62Z(4tS=zVXD%#UFA5A*Zqc(t0|XTJbP++;Tm6ZHNfi9dt)%;hhe^=GFP|wY>i9=q zOpJo+%+X}1zOHEHv;_?L{77KRBnn!ec9I)gSBkz_M>4crI|zE)M8UT=*TG8<=150k~0R- z)F-_dYUJx+_n0Us+tEZOKj*n^+|$?~f@Zac(xzCRDd@JI^zfAi^!K8tD5%;6#?Frd zr@SS!#}A%w!$qvf0JOg?o()Qff`(%sXunIx2`Xrk1Ju2-FBB(6!R5a5g!-0rf_zg| zC~8wSCeIf{!8P5-L~mh#QJKk1hJrNh8BL0UJU# z{{7~Tt0ddr-=av)F9*=+7s;$If9=}cTH=1<8%4Fh_})JkdsY=*^8eon)jfiP>p+Gy z3_=7n_i?GjhyPr%W`CsBM1>&_JBi4U|Czymp4Rtr=`gCrko^-r+kzXQnGQB_QLuB| zTB3TE_oH)(u12DDPk0S1|NUt>z9)Zp-Y_y7TWyU(ohA!6`S1P55+eCKR*Rv9u9E;+ zt6RYme!axce?qV6C^K}VDF@I)!(7(Fud~F+3ff0%07EOMnga6k84sQO`c#}}KpZQ( zDB890QYF%SKzU)L{>caawhuT$i+-i)DD3nsG9{C*hPZbH7BZK9~5jo1HkC3|>3 zgKHF|R~)BGPpm{k-cMlYx~>^Z;rG~~c~7Zh%6b9KK2UiEWk`(9U7ZmHv%A`@pLI-- zpvt~xfTqnhg-nP7&$Er>L*^LKoliM{7L3YZ8vK3Y%g*g2r*xU%PV(d6yipWH zJcyv?dnyT1RlQz`b_>g_{dJ!TJ09&>t9gIZZY_I&;b z()$_@o+G1R%b<%yOG**Yl8q(|`Qvlt&?q=Ex0bXI(f~AI#|>+AaaV-!NHz-At=J@( zBk$Pzl0VS<8G3-^>iG4^_0x-HZ@%%*xE*Wg>gi(vO^q-R9Xv1$ zeA*)6kZUgSF;WF|c1Wmzf{U9aiSHueb4@$h!Sn3Un5fAN>G!l|Mo%L_;n_XOp2(jB z{hgA-P?2H`tho~j&+@L&iW9d9azCQU(4+FcZ1rWH75w@Z9eig8L7tX3B&hT61Zr?L z5+>igfgt6N(*Yd`ae{eABB4ySm7J9-m7pPAS%B;hB{8=>k>FLgn(*nd0Vh^dvXe(gpyp=Z+s+7D%(Nzdg(FL zr2L&A>)@Ycqk1GfUgSqCU+6K^r+5oR*-!S8s$r4vmhVCM&)4GFz*;P7V7Mst!#uWB ziuW4ZXp_Z}$_%N#iWk|+ra^mW1dP92M)P@|Av$S&m!iMJ9@FkO5wObkHI;GxD(Yyy zOptEoWxD5X1l0fWuZ+KOjiQ%0ca5vEjE5E>0+z3TPP86upeVyE642yhQ9Q#j0$!}B zASY&yr|9D6T?7?36%(&*5s-dTo_Y^W5KwoYFBItqemR2DNZ z0u1`yrzb9}07|zkk|57W3rSOVIH>qckkrYJ1vGPrAwx=f6F{my9IhT}Ai-vOfKtBk z-W<-;JC9Y?gu}Dz`^hOQT|n`s#tgl^VgSQWg@b3`NxVi$9gw+QmISR|%j0Hug+pC= z2esNY0?^7vTTyC(GuyQ^9R9xaqixB(0ZrMRB`UDVgWL1Mq5NGTvD)%RD)j+*8B72lArxxo8w)3%^k?X( z`Yi#S*G-dj@ja_KuX%R#zBY=64{~P6VfS>Vn;QysZ*GwAiB%Li?@wpQR6ZSk1%-mN z;v%81@=}WCruSrMHP1SYni2}Vr!~^n3VD&E(GG&DJXX;}wNQ8vUP>o6pRYm*v!VfM z@x5Jzo}tjzTa#Qay(>W{d&K~Hv^$i~w+I29w;d#IUXVz0%}#SqL~<=Mjr@ z2Sr6DJsHwd|4B-BhCsJf8olfJlAvp!(;1o>lE^AELg2)VPI_IxH=tf8XELO;Wg0~J zhJe+8@$_c=2tYAO2L<$fM7B_79s*uF{v#e6`0O$6%1dKW%myP?AjkJqkG2rcIH@B?IO8U&}W2EoszJn1kb#Tr#hj0kdw(x%0`f`IWl_AQk!1@vyB8bhy|b=laI zAaK~zMwXYwQY1XfVJLI;5?-qj1o!%^Cx@DkQ&dzlj-hu>6WO1!{CnQ@rV)4EiSqB) zNzlgXOM=VaK=`8YncC0j!_c;={j1K~wOC=EHK$WX(CR6r&6x$M&6K+t=z zf-LCLWN7HGMuO7zbd&nLKsd3glPp-P$Ize;y#J4TGKAOBcn89c)!Jl9oi0O92QCnq zYb3H(13X{ZOXpnYeQw-dr`aOe(}D1)XCQ2de@~70S{@aI>QmIxV&;@kVNt-Qo z3xLoOfs#ViP>Pl;93rYpmZtMG10X>68f_kOM?gu_d>H!h+Z8&#&4KeJkEq0{!5TeI zOJXSR1kdTaF$bJ;l&iYkMiaD`pHU!(Z|BLS?Q`IEa~+xWbhXH~u7RND{P$#N>>R$| zbc-aXT@kH0k_zZVQxf}bJqHYn#|rn}d?hHWhYKLf0y{_1_Mf#+9*NK z#w!c!U;2YmG^4ilqX2EPpU9AIq!pWd)F0mVE|pySp$+KxjckTaZ_9v{nS5qwNfT-4 zsShaO>=1^o^p|CEj{b0V=y9^KOB>LfgcSsR3f@6mM*4$vT)U9*X%rx(QPCnbuQ>SC zJR58`e4sV;g8`}Wy+l;EIE)=UH5-gg_tA?dzY#Q6DMR#5I+V2M&j$A*MH19~MYM71 z2!^hGQifYDvmyUyD+xckO7zYxhasrXWi~3aVcXK}B-LF>bRfl;p`=P9aBuMgy%{Dn z?(PL^9#{X7?R(bEK)u(j~!I;fsYaB27y>ueD-}HnE*SX}srCNa8 zuV#y`re?6st3Bb}&18D?y&j-(+5JV6#z;ZDvnLq)b<$oLytbTk2rj1R@19fS)nHE; z_b-XYomK<%#WJ2DyJyMlP3pZ~w$5MK0hpYs-t>*QEoSE8TI>FfkVn@1?t9NSzbU`$lux$Z!ue!^yu1G8-%l%c|U9 z@8HoS^Dm!0!O8r*OwoMzlSD0*zqYE4$Q$T0q+h*Iw8%J_xtqFyx7j{&H%5n{kD*Q? zgM1HAXm^ER1zyY7If|jVOOI5cDeG1Vi3eRF+Ovhenmm}HkM(wdJ}I% z{nSan_4hUMI+w_YI5FUACY^>!+6i}Feo}I$I!QDa?o#`6D-=(N3zRI4N&Qo z9EOsXr?L4qP9VSFGToG|3#dL?ouS@;6(HuvOqep5&q%G&0~C5ZmY@aEtI5x!GXdtD z5QM*)fYP;NM6a*&I_r>`AemiGh>aqki;aPzG|ymoB|j7V_P!^IQ+fl^i5fys{I}o2 z_#2K;`g0IDwe_j!R@MZDE~fB2z)VL_oW7Gv749Y|?LZdKc*$btBJyC@I7i5f@1Pnj z5`r!i{-DTW>MwfwjRVZAvZDjnyGqcbxqSW~SA6Rs4J&Yf;=08|@Az>6r6i>R^5^wn zrPCbX_v$WUdL@XW?R%yHdb@iDTl~cytk2|-6R*lBsy-esptNI7!uP%Quxz0#O?%TU z3b^RWQ08+Vkn*&L|DJrJ$4P&Nl268qo_|PVCB5vy(7uR{t5sp>$l*eYY@&~lXB9JG z=H)@;`(kZ|?j2MF9BWiMz*QGbReO-&H>-5$$oMotIw zzqjZbKb}p&MK^dbRDIi*XN1~;)%Ks2<5J2fYMH1mpx+Bm2+fIh@KsVxzRU=q=&Z~P zK(a>&dos!nTnb;4)qV#BbbU+;ppl0bLdZ>9P*_zVxs(?!%FH}VP&=!p`N_60*z_nJ ztz}D4o>xDHcFg!gEynP^o~Iw_x`lfQ`gbUYp;fn%VZ}`wnE1komJfMNP)mOehL);~ zVu?vMF!S9iQvb0JAZ>#jf|569&<<4_*s-*WD9up<)TB30bcpZ!%3PlYQqj4@*ljGJ zNke%~2KVfU3p+V~8f@D)gEC8fKqGBZBj1$L#LXpjCV@|wZV zsJRRO4TZj^rhqr^56@dyF0x#g11NrSCbOSC1-?k2>crGgf=qb^3(}4l4(dIpzia_QFL*22`St^8J@YmqN=?k1hgPOfuVVO7P2D8$zXf3Qt1ECj-tJOZVbKh zbOY!BxZL9q`M00f>2tG;uU4YJPRuG}BS7MocJk`e8;bO=x&YE@@?iXk0-QW-Nu*X^ zhLmFy0eKx+2s~aGEW&eW)*5Ao))a3bX!Fr6^lCPNx0||Xd_Qf5z-5$Z!O>AHOpQQl zbOG(5$}v9^P%10Scf4~}Q9fu3y!S5()oh1QO^^Nzr&9H_SrM2{> z=|Pdt^BxqLw^j=0c|YvZQ7`E77xp5l*bs&~Gv~nCqT)VP7u^+b(}uPn*bJhEwsMou4re`aE2li`FtXt zL%`cCXx%|6h8Et-5k0rg1@&@M*!63*bxo!MLj&#miDYAtC>7z$}}peVW4o@ZQ{zy*sg8nbW!L#k(DMd{M>_!`Fq%7T{B8E>0K8{W-g=$yMZ zyZ^`-%vCjse>ShZ<`O(NO+;QtdRvc(GKS%G&E(5ICyM5Np9QEfX%-lE7{Lx+w`n_e zu7ExV!~&`ej$;P7Jfo}k*2@Nf@^${rQRmRBA`-b4Td)c_rM$LBk7Nsz;yeKP=+JzGeW6t8*aW~}Ggot*a&SukF1 z07rj)5lS5O09CgL2M747u_Zc0FCXN$hv&=z#ycZ z98;esin}-+(8x%>7H{S~#kXb?gIT8}=vc@N0oiIjl%y}zh3>3b)caqmfYwh5WoY=p z5O$!KE=(BJPF25ph<3*XFf_}C*W(xHfU4$6dR(eZWZ5rPK)yHag}Tu?Ap2>U|4 zcUsGlluBKOnhecF>7A2U9)A`n>0CkEHt8|+swPcTF+UT&zR-d_UR^Y@UY()mHf0oj zI$TbBMQOqNvYqsbr5r<2p~`>`@w2((U7Cwi8^HU?W7t%JqT*}aar{Gxj;|osl&0BWpwx7GJ<|9 zWCGgsHUmzSt3m3&p~Pxdo9JYoJ|O>sam>|H4K#-}kp7v20T~TmNzvzid35!~F`#zo zHZiLn!}mGHfE7t*XyDrfh@LS9c=(ItBkv7BMb?uUlFkR#cxN=Yhw>Ssqx1mH&Cnod zl&&i6={Xt-yEvr!=LoI)2#h5~Y0;3ir<(3L3$je-kT49Fjo zF3~K1WPjb!TIlOosEK@81J3V^a`RqzbGL2f z7A<7th~W&?eoqi(9#3Ga|BZx%N2hzK5r!4Jf$j$FVbUZ*0YI# zGP}$nU1}t3ZYrY}?&>hqeJKS{-J4_FT;iDLObZHYo`-DQ$DXj=5Q`4x{ z^L`A4SLuozqjX@*Vg=Z6RGkN%sRMgYh7ik6FPtr(S`CMo8*!QgHj_+v_ zy=Vla9O1cXzw{^?Ypw!l@YRu!FEs+rvT&p1Y(ok|z&=A^WLj`yhg5 z9(*J!cy^!c{x=+^{nts;atjEG+c21+UI7E)zpUXv{;s6`?mQ$&>OQ}}IJ<-l=I~1n zJU90yo;5Onj$iDcXm9QZvL#gx45z##?ZL``dcBnvy>#mZE4~hcdetW+rb-*oQTbd^ z0ne%#!}B3pZrzvo4$|lI`}E;glC&s5Ukd!%heBlYW;#S(3y@<7uh-#H%fAq-n4u8; zu#@)C8v)3IKL;ayw_J9yaR>~(w2PW|{UIp%$^eF9;|D-%&=9z!zf;n7@ghM@b6<-l zcJU#V&j-Wdarem`SSTuP&jzHz&neBk27^LjJvp`Fv;;Y%3fV-!BDNu zXh6cN(QtBKf2h^_M6OrsF*LUBEJepooFQSV{dx9tEXi1?!_edMOwpr0nXGbSKNy{+ zLv5)FLqlWLMdohmP}RR5>>2ouXD-PyG$yv3pkD)ylZgDj@a+D5+N0MK(WEJvfGW-T z^Tu~sxG?635FArT(Jn(xK+d<-;p9ACe`K_c_|t(DE%GT7rEfb%d>Z<|*0($#Z{0R) zWH~yMq4^uq**@Ps@Ml{w`SHzE^lpPDLua#iF6kW^@LjV~*q6GGAkCd+q63$X5i(5% zRQYVm@~UQn4$aI2^tB_Mtvu5kwhU{g&5nZrUE87|QY%x3e17&iyUB(YtQ!L;ZhQqr z$Bin8=59VWMT39-{?r9zbTX5nd)G5r{IFhde&u^&^n(9A*KDfB&|6P+h+ZNMLT)vw zml^{ow)-4GlSiK+1HVf_KzWqp>9YZVX3WeIxfNxxIWbaDx@|9w?5HQ`UnI{h<+@bH zfZvOryuQ4PUf;5tpiBJh4+VHrBIVo@bY!;C^Y_ORG=C7Elg4QUW-}kw1O9E?BT;y^ z(h5bJC^9tprZV^%_W%p+yJW$T(G+F%zDLlzvYTYc)PLm3>L#-7dl5w{ANf7R?Ul)8 zx77cV#eb)ep$cy)dK^C#(70tIpjqk=3UVFRf%XD|Ct4Kvtaz;F2x-tzO#i!7Yo?MkQ(+ubT}>XdZ)OM(+A!J`_+ia9^hr!r3Ao*9jc7FLR#C4h5sdrpk97BP}plEC7_KCn&;o6Dw4 zG&ymWJdsShE^^qNDp;HLN0{dO=ZdCB<{$~)GZVKpe$N_BsblxLY*gr$^Z;UT(}~@D z^p4H{wT+b+wN%`k*@u&o0e$$`LvPtu@hc zz@jS>`8WTN^gx_V?~*=(D(R%+sx$;i|C+%(-SRcNrW*;Td}v z(U^5Tr-$UmhZ0ZH#(G=sA(5*ZnDc^-7N6DRsF<}Nvpz=fyK_p}&gL)KvxrJN1N%Ng z$5tYnUHEG3qsZydTih!@WiuY!gf@lO6@h1mFmj_!INVEm!v1#NCJz#GiA2{TmXoaC zb9t|T$4tH_Itx!8lgY?P7fuG*bU{;tM=Z8g9ZM744Its&vu-!hF^?ih}rx7H}0^!g=x~D3P(;{ zvRWcpyt5S!S$&($ldiGZst%ltu1H4G5t8}LA-C99k58<{=+>OPsFQ&lQDwt7lbdYr z_ax?#E;?9*HGAzix%I>jD_&h^QD1+{#*+>)viofuC;oq9xbOY~c3k5LT&Qzqq_Ev= z#kinx(0cMU7PY<{{&^;Ok$y?uNXp0d#-NV*Y&8#ncuPCQ))~{0G-lKIk55;a(YbES zxNIK~2k&f|^dGrTHavZq{c?T7;%-&~8OuUB8S-{G?w^&%{H>p}R&#Wb)Vq%48RGiyV=BDx0b(S|5p3XLH%|W0kP_l^v47 zWj+d%?!LVD>>Oscrw9rxO^}3Ik7s14=@h2lC7U(*Q7oT`YJz0k&^S)IUQNKEH5Xa4 zltoPIa6XV*zT)3m_`K7RYo55kMp{%eGqD9v?jF3VXlQhWc}zXe?ld#$%9%bC5#4A$P;N+8-RU-wiar@pdnG!bnriOS$At z;icUDlMl0pH)-4W0D;Y-Ug<8`@+#kp3^@IC;~09$(?Tk9o|gW!;YF1927ion&L7 z6)yj_hxs}0W~a)VAn|Jc7|4>e2cUgyH(L|0A;UQnB!6#h2 z9?7u<{{gvOSOL5AcCrxhURZ63qsZ-a#CdCtIazVY2v1+z&R)FR21yZ?NLKqNaPsFz z9QTde#vYyakaQ+!BiZSa#z>gMe28$|%7UNeu+{0WfZTrH3(5Bf9JNX}v(Ws{EZJfs zkYnCck(@M}$W<#hu|DOS*ABkjdAJ0iz;b`nu zy@ADh=0bFfF^r`33*w~YX&>Hn=X&wo_!%}e&0}QRn*Kl*{0L#;{noKXqqe|{=*D7y zq%rSzBM!->*Rj~^_Znu_C_vJ0Wx|PxrWF#OF&6y%(bX))Hjj;qWvrRV!q`!>j*$!M-atY|__9tHmoV|6 z4l7@Nkw{@he@i9O3CE%RMspR7woi-24enS-S8z8?+>oWXkOX0c^&&da1_*NL3GS}JCY zH&0^^Z|h3aJvIUL!$)O|Ji|A^0f3et^7wl%~BUx~!4WG9&jOk_FV!kN$GlcKa z2}oW(OT=a6L)q=rQfch<#++PniUe}u;Z*jv<6vg+Ee6C2JR>+ckdxNdBJXKdF#FZD z5}Mr!Wu(2%SWeEr8jo@3`!f&z1T0?ZNaSS5PMJJptK`gvKxPLfaCNu7Vw>wMB>PU! z;=Nb^TgCe^^QhfGhDW*}c^2)8R`dN>|08c$(vFWn2B_yVBAvVfL$CH`4FRv&>6?0D zrce)$ifkrQ&|*F>ZRX8v?*uSULmQE&ZG+b=OBkuJeGM0V8MEDJ3OiLDk@Wdsr#SxB z7C$cXV(&jc2A6zmB&$|ND<Bw-?Ce}4ALNPT%7fGKpt@)L1_UyR7f!x*V8Y3`Q zos(;=)Vani8+OI{EO;Dj#>r31Bt;|BB)oXcibVw1!M;~!oH%SrWh6m!KD$$H&W2t* z4RggT7#XeVi=>HDUmk4Uj=6X@lC zEevO5^V~8Zt_Mrtw7U*_{9_iZ9c&;G&$;5=n&7@YkvB}!Vt+QBysaKW_-R@Dq46%{_meQ64x&&oE#sSi2s>XNp=16;QRVg#ogss z7#VH@>~ZpYNwc69imcKVhgIE>9NO;2q2aZ3)$jmpmafWV*urT@e#=ww(5mOsgnbWk z#-F|kC3tdI*Bq_U-2X!j(cQbttvwzue(mqn;nG2`;d0_nJOzCd@3+VDq%p?jQcTZJB ztBX9+`V&%!O8|^MP{l~tyMkO&FbY%$gAPj}5xQcZPTW%oZ&GF;$s9cshaA`|Y2CWV z+?>=E*;>v>YIitu%Rk$tqRdZB%Y2MXK0hdCq_DVzX${^a={v7y%{8KdB;|{J5@E2I zgKv9utrSzHC%cU=1hV9%=u;C$svlsz|E-V~2A%|)t{O<5_3Wk4&gjLr4_YjJ_)`nB z`dc8;QjJ%5d>V(Ahf<~ES92iwh$9lG{F@Sar2RlXRUaeyW^9w!PPap{_)`og9@}Gi z;-;yRNvHX2=WRnI1?ufMc@=MlS3E~czn6bt(I#Jjbj@mvlxXRcw*y$viUi|DGRXTLjmJlfVyIslr^YNl%v+0=XR{?&pO@ zdfs?CyV7gt1aWTvLIX*t-dIJX#aO=Ae3e(qk6JcT#}bLBa|=eExi(?_zuxR|hn-|T zZyk}WcAm#cid`I@Jh4C9{fVnID#;c}{&XEq8g`34*OG-fi@K#lLU#isPp9fDG`i^V zFRNeY_!@qMcgFwsr%deA3!SgVVvbGw+{F)`!Eep2igWCxOqMiyC3R5?${q4U1(jcG zWU_Zq1Sj^Is4I<(BmP=oKo?hDra| zzKT(cd~q1mWj!EfIjBuAK}doyCe7zCH4%KBb5u-Cmk zk}7L)-YaZ=HxjSzSuEeIv}V79n;}`d$ycGj%a^;2O_#sg-e;?28A#gKO~-|r~qe;v8KzUcQ9vN~78&EeVdvQQ1S zw!xN@e*vA5csn~|ym6kqdCv_tWuXBlsZFOMF^itc8$G)wCkEEC&KJdbkC17$Pa^$V zZ<0bYZp+TYjC%)mBF& zcOumkO*^XL+mxSjpLXI5<$il48Jp%QE~U-mN4@^ZZh!Mw{;_6AOox@o#ICSJUY^hd zDt^6}8vV`%GWho-PIi2mgxX=vp}S>&SSXHb$>Mq!PLADn;os}^b}!A6ljWnm6zhNXz@$ZnpxNmY>#Wg{laIF^0tp%M z2u6-IhAlmxv417joLoAVj0D}2`8Smr)Yt|vTQO5Yuw6Kimwv+`(8wILI#kIu7mFGB z{$K>*fLG_lvj^{zCPbwp4?|O5hH`JT!6k3C}TOFL*I8-7U`uRZmoX%$nhwb1^ zcs2w~GEqzuIk@DkQ3`HKbA(a#*JLC6lR)Mb#wxxwi(z9%I)TaJFjiIf7l_k?P)_bT zgz+ccTtFm0vmTAatf??O&xey$?|rbURadxt<|7;X!vRU2nhc~%m<+osy1}AP8`TifQ+T614>)n_?WLxJ43Px4P6l%ELo#S=_JRP{3>fyQO3~9Pl#|Y42k^)Y z2FtQO!r^-viciOVIMFNg;jjF>;e?n|ot1G@Ch8{u$c_u5Ca;|j)HjTT(75LkdFGIU zb1k*R{A|iH~YcJm=B_BLP)Czkk@QK zBm4BcIGOjL2Y;0j4vEu`gMmXMMw%ag0p#(#7fgMM*fnUKDp$lGR@BT)LK1D4geQB9 zhr(%dSjfmVK)MXDRD_jTuv;xB0$=o+mFIl`(mibgCu7Bqet79*=ry~N#SCqO#DAR& zC*@0AaNO}o$T42a`aQBkA~$IO!e9J^(u61&l~1xBabH)pfea+nml52T#Ys_pzWF@DhBw9af~SvE;;N zqv#~boCn<&N5b8uEffb%v_kT;x)nbaod{V*DgnP#D9cgKBw4{i&oYIC9ql?;#|Fl}+ zz0V84BdR;QBKA7TtJhXYb{KTP^q@s>@lS*N^0@;iKBpp)_*qWlk;fN9=Zy%{KA3Pa z|8$8&4$LT)rs*z)tNrTWu>Ma*!saJ%B8sfhJbD=nSat=D%-zR`gF~f4yKg01^mI7{ zeQE)FUw@Uz17}YpJIp=#)*k7wrd20)$S_AHEA>YqdHyUM$Lv@MliS{98>2ErZ&C&n z_n$5@*`~9BjiaFG-zu0hrIzh8tO1h!IE9m)yF?c9*fp?z^*J`@ZCfOkpN=r{tLqWS zy1EujH{?n=_4Y{aISy2;?mQ6fY}UhN;}Ed^VUOfrUVuVlw#c?$yaCD#pTe(qZINu; z42--pM)vppM%db>297+aRt%^}=49vRWE|IL6I?oe2zsyDsIZRh!N_{c9xU?EW_VvZ zO+NHBQ_;9S0?8QD38H6lDEgrw&|Cmc6%8(c7X$sF_!DO_}$bMoj% zGYq=69WFMlV!m&FD^BFZa&q8jEPv8rCtN?VowbZKhbbkUTSKds(CExagX0r{D8KajCmXQqzC>~R1mPpbm>T{s5zKUT6`ZLN^Bes~qgj63-ZjZVNEtpPc8RvnQXF-um2 zpGd}@vrmF?+!~nC(+bIv3kE=5Jke);Z=ZsS*%h#GkodO}y3L--Nm6(uFYRy!?z@)5 zI{iFFrjsQnopxB_kA$;Oe}6gr9qz6;6W0cbYkNc7{xB1`sj=$a9#e_@yFUX-m;E#O zHODMyH)|a$?2xLkUm;7xy+D?t=bwkO-z(UP&{v9{?unf2evpU7!>M;VHyi~CQ%dPcUsPUd8@IJ+=O0m!^i4y&e#95_Myh?Am8 zr%ur80YY}4m9Tc!If*PdH5tj!9h32$^<~iXweE3afEtj6V*ZR|Kegn)W3PZu)=Gwb zjsxjd*M^f*A%;Bt##M04D`&%IHb$Z*M{&|RA_`XI-PqP`^&NnUCqw)HNARi^s#m+!HRc!eC73GP28Wvsjhzpl??lXYGw+Wwiv ziSv_LJgK+{_B49Q(z@z%vf!DPqU??q-m!iFeS$xU^LaZ?CPF79%Qkkxv>6ZKp_rZ9 zwby}@!sM|??x&CC+b=zW@X7^}{LqM#qWXD^ytx_2OqxD{$5o>s*S4AwjrS>>7<@>< zhQOyV*x)HlYQ2V$qlf1zjnYr`}6X#W}7rY(`k_(x-rY!$g8&z~2=lB;LHdboum zQ>P=6n5iAH#OgVur`(ngM_dA8JVu9;;q|Ss+muqsI;CQlf2tvg|2>0~$vto%w|YFTZC}3<-FJ}!!mevK@TEZpH(Cs=A0PVb3EGk9i&<1fs0lv z#gKnBK<IccpKkIR}>LixDM()k~v&s~@t@tToCrmxx3-v2>;@kzFOi6bXF z8~Y&{9_q&*%>M{pU2B+Ah7Bj*b_F8o^)C=7VHF&>Q^GvN`)TrSY!M@;_ZNZR?@y52 zV>a9J@RlMtGJ%tp%@cW)M-AL*Z6d!e_7(2|eA&W7&Jyv`b(Kr!d&7kqNsZ6d! z#fpr9SbX|17T2Dvg^p7`z%8RRMVB_;fV_Awx|}}LLHqdkFcID<{+(o;cs^!4-|`FO z-&qgw^9+%M^$q64C@vU#4*v=vsn2p3m^&b;uE_(k%=j|=Ui%GxU5aPhP3)0$yO5|b z+MLM0-}nw+;!D}4czq-b!xzfrjCGpq{Oshf3peDD)=d}^`{xqxvEw(KD)E3u<>MHcFgX}W;Ld?K zqUaBJuv@U>%Tq?wO!F0=Y`&I*qocM`p zlr_dZZ$+l2**iu4;oh96t?SLZ%xi+}y=s`tiWG%;SRg0QYy+`Qrzuu9E@i8BTvidA zv(JD;;WG$4*c6Ma6Ig~S1W4@&G6fpiE_49veLQPA(bv`?^fBRoA7^Qgw7`FY-02LliGXCO*olr9;o+rx zAn9VCX#WXaJhsXT62zPZspyoTNWLA9Gu>LFb!i^F?EhGC>YTPG*?CT@$B@gdaog!y z*gtNF!q+x|laA%_Jb17kE;4xppY}gdk!ahijJ)Y7vYX!M;feh5qT6Z#BdhxkL9$0R z1goa#W6~gd>D13kM(QiNBI#e=m3!BT%x9gA>{B0OP99k5DsFev<;C#^c>Uiy*5K*L z$;~d23J>E*{MMum+V}g&KJK;==YBT)u;FkZM_@Q)EN_F7{EI?lL1MD(yv9iakuMvx9M)4ROph4_N2ffe}B|Oin60&ctQy+v38e*Ws@~ z^Svq6dzhg1`f?V0y)lxmx+#jBmMOR{#{{ihKC->V`+&SsEm5?4zl0r^OtEX(L8dn_ zM<&fgz9aEr6L~K*#rfu!B<-t4jCA^A$jK;GTMX%GhT${1z}NzrkuCL|k(eLrj4$%c zaO3N%@WihrCr0)|ksR+ll)vuT4wIkMLg-Q(PE0Ec7`ZU0fDO-Uhiuj(Xxzz>6M5}C zh4Zv|7{uG-eC?@ld9ldI5T1PLER!2ko#iaKJ#P74sTz1z>@EojOOlZ2id~cqUgj9K zXC=$9iBl~1-wvd{>2~;V(Hz&wui5DPsb1vkm~osKd5*&~-7GLAs+xUzG82gEpBX2e zADi*2GZwh;gqRoBd<*2TeJ3PUO*-*yPL?>{xDm5_D&7YOk)uQ}rH~OGin8d=wDr}3 z`z;-joG8D_NP5y$7}!DdSY0{~YmV3;SynQSlTVG~`H&r=lVx}f#Jjgd^0chKOnNL0 zkZu}wz-{kd!pFh6ic15n`&G-{S6gwisADjauLZ$8_u;GMvRl=R%zyt?CRZDOkzIS)VdF_%v+??6~f!%=)%PqIKC$%^v5DXc;2 zhrkx5LmSgF>y6I!kv4}FWzG4kc# zJWjUtj^~Y*biy`=ieSM|4Nkg^xyZ=4!izAoz7uW;sDpf08&0~Eh9gmb5su!YozP3| zE_~5*QtAl1Ai9M(TeI;$*?k zLHKQ_Gmb7_#a;!EQXF1c3S`Xp=isZ}85f;;#n%1)olDZ?Xe4j4qj~Mj&e&~z4O?_7 z9Y|WHAtU1_8M0r`I%AntHv3uf6^Qoj6i)Wmq~O?|E_l459eeH89?7t_hK$%RYQwA# zx!|txx8*%H9g#FGjaDpkjp5$fT`=wQ0g#H#kql2N2GYd77%t83f^GdOp?l^p#gq6U zoLsLPf-9bOLFW^dkWsQ;vAClnCn-jb{GykuIP*LN6))Unvgxrkl4s*=xN4Ux+Il>a zS2rHS$TFueBrom4(4-AIL?dZ z#n-xGr`&30C-&mWhW?sB?sd~*Iks+?-K~uMXJErgV8>J>(N?Kgzt|0HPHbc@qs0!r zF!GQtkT<7wSn7K>JUeTyWL|lS5ueytPIiXH^0B_%5Z?5JobFE~lJ%yL5tBQGuxVd6 zY`!)h=7bt6WZ&UP(%TM4i^lG_e0(jueRoyiC9;>uz;Ramcep#Ml1gCmC>&^begcvr_52ydQ zF%o*+NOTGt@j4G)mF2g(b(zmW$bp5r&+6T`^qYF?~2@Oy!vP=oxGM=80lo#SY~x zC!k;KfMjFJ6d)0kCxgWhZ|r1O2R~LDAn7)Fmgp9n#lJP0h3=cZ@qPb7a2Zgfm^Q4G zk^W*{Exp7W3u`BX&woye6KcazA#%4Y%z9x+LA6)kfq4?q_cKEhTV;y%BYWY5oEUcR z;weRWuqP*N+&r<_4zVLqai4kq)Zj!a@1+=Uv=<*-+6#9NsAI|VY&p4L)f!3rrmgua zliqmw-b41R$exqaXT~70-7*Fbh4x0LuZe8fYF$q5|14nS*rozFwy`%J?Y2~Ppz;bM zHMgQUF)WSd|K0D6i`tHcsEsWd8TlkYWZjDM-b4QEX-gkGQ*aALG;OXJdMg=8aSJhf z+1m$0#oXwjA$f|)+gtV^=T2!-vm4=v2~2&R%VcB-}1W;V@C`1v&cSuCJV(exQM*=2sq&K=Ui?@mODs z6SHZL>rVjr@pv33CgtP!ZZXgE_kIoA@b9!tmWH(CWaZ_Sxc81PwjWW(7LD~(9DC!B zP(GSf( zwuOvUj-14f8K6+D9Dqfe{cusIv+#C+6(@h(nj-1&y$P1x^uxm`AE8s^KSnZ3Cn9;H zHHkYmh`iM!m2hwC8b)sKJg4yblgSP^^ubGkCt!2U9u+w!vbacWRV)q(?Sr5CwS+sq ziHgzvBp~ZAd4cERJ{V_mSGreL3nV%-8HubRI^{F_;JlDs%tgx_iAMZX71@$7K(*yn zA3T2eE&D5GlgVAP6i)tRq@Y1de+-{l!_NIML83Lk9V2PY%-NN0{+Ra;SwOW*GlC z0Ba|HX3qoe1Nn9%f|D&jB6#Sx0F1l!hPiMQ;{@?vk>E>eX;q_PcVDr3Pya+wwB5D z5BgGvYkg5FxCCQg{9$BnK{6+LNy&WJtG<|B*cE0k7PH<$VXw}Nz|PK)`J*q|%^NPs z{ls&<5b<1`6$mY7$Dv2-Ky3K9j5U-PaN_=O3y_^}x3G8iftYgoDSNg4w&KsxC{BiY zM)6BL5JP?I*s-++ijQ}nGGdkY6tac{;@w3LS=aIwKvIv5L9#Gp3_hD0h;3h_vBcE{ zK&ob|BbgMU&aF}c@$@27saova5QFIhIEn5#fNxkAi2eTS2~Ij<_F4$+WyMMB=2qx< zAP}YPGAwD=0m-*CFGcSJFMNMK5ZCvthJb{BigXQ6Br~sg@Eg|yain<#tkX?be4T2; zN!w@}e(z}@w$?ZbP3~o0Bn|6>I5|H&2!Fp16wi2?aLqKGk&)}Qk<8t%js3p{Vs(Tp zb-wYBkt@X`k%XNb$@7~8p?||>*2BL8C$*nGFydxa$-;GlP+ep^W`Au$eZ<`=YH^0MfY`CJRdNl{h`|Wf1zs^CpG<60mF8C^u z^DXByGQXqf4)qMes$Yq!qDUJcmRa$f{1f+JQQkqA+a08FY)KaPMF8shPU7(?0A%- zv@8mB#|B|zy;@bTD?1q(E6x|mi?w%{+NdCWanOX`7)zE%eV#lPpYs86u*<#&bGf{~o;o-`8oiT{U59V%f(jU|$FsU;`BziIL| z0YNyR;WUip;#^xOxE8GNS{y9qmxJ(%MF(inTOY}~Hl~W1O-yl!xL!`@Crg)lUIDVR zjUOj1pZj75mmuudZaI^!KFH+eYzI!BEpgyFwn5nW_G31yjjN*JoF|fMk-KOtuIugo zbi9yQ8=Gc~~{Gm~|{S5%0lGc=sQj6xa2{I}P!3)UI?5>u4i-D1_UN zy%Y<3^x_}C1mf(Fy;8|SQ%-IgSs-y5E^<`F&uz_bT}V9hf|2qx(dj8P*%*W^#m{@q zz9Z0gXE#RLchcviW}`k{F9^ixVrF65-FGr^-!O!e+gU^So~%F|f;I4N%N50i05v2& zFVy(veSzqG<{C7+s*hy-!f=Jf(QrJvCJ=Y+9Sa?%J0e*eP|t|<`Y%wD7>J9^D{=;Z zwm_mkC4!S3sbcnivN#7@KA3%JQU@fsyhLGI^PH^<3B*0tm)XCWlY!*0sYp8Yn~FxN zKwLVensup8l1SraR~a#Go)5X!f%s+g2R7}_35Ax{43RTEgU4FW;0aoR_;&Sa#%5@9 za>wihkaYDEEVRBao@rsrb~P8X0K%hhvyq%P64@NZeX(ouSo!Y&YfeV**~Ansn_v=% z@4tXWu&jL}PO_b16`?$qZ`s=yORDd~v@MGnX&<}*$c{5uV(8kJkTP(m!u!@3Mh1@<4J846@rK2A(A%JnZ_2IQ1Mu+g6_SSdOd_?HlNDosCG(9s z0XW#p5DeSeaq{23tui_CbF1X>!5@p39)W)c)HvzdMVwm*u5l^&1N~9!(mQegEB@bv zdukC9X&N0NKhE$+Y4K+mx8t!FSvDhulec-In{Jvv#_hfZ8Ifxhx<}f}WKchI>7BPf z-uMy&7J1E(xQcsV^7mB=8X5ZIk|VluX0k1k0Wr5##CmFB?&QioSozY8mD-DU&O-Wm z(HkU8s!9<(L4EN0fOBlpLNz3x-KOM{-XCVFMz8FH#jcgC$DfTr{@xOQmJrpDg6gCC zVEYNx%;4YCY%2h_QSXLN3*q#YMdN6 zY?VV|ExLOJ-SWe}dVZ=<6FW{^&ZZ#w)jAb-WccCO5dokvMf@KL!#q3pAmh~zW*;5x zhd%l_FvO}EC$sjZD7qV`@))t};I-=`EOJ}LNQ}>|Y~t~`i`O)fzuatF6?9Nf&m{|w zr66hBE)`eHzS!f347c@nDzuxQ^CHb1|H~P@)EBKMhrpyvkxML?-c8{ozg?=xjq}By zR-1aX8D)>8s!d2PNxK)NiZ=Act>J^2eAXJt_#Y{XZ^o%;U+RO~<^roc`xnT&!IxEJ z=9;^?KX?0}(djCdK0gJBn|3NEgLG5*`v@O2!H=x7TaZN3j+w~h_J#IRjhzqn{hq^$ z&Yt)`om4Cm;(v)}r~i86f%1N=iJ1;3_k6}lWOm4SdFZj;cx~IJ9R9|E6GPE0Lo&rR zlNs3?KS@KOd%7hjtrEA%B%;$+$+=^16t$!fky68m>pXFN3KM#!V18vU+`6F(e)by7 z$b}cTC6d{2LykMt3$y-y1oZ>gWTGeL+{lWR$=pAp7aDeuq1&A+imSI90eRQuuhh+= z7aD8{fw7O;AX%|CNg;M#kw5pwr2b#Cs~Q}U%(QIJ$ox_>n7Gj!2mI*Io(wTVGR-BC zllqY&v#h^2`kl>T0L4HG8!-j!l$cfvZyYn~BWv{07)b8YcqIL<#^WmJiNV7^vGfoN zg~`z|jLh;FE3yiEVxRGs+3xwJiXIE&I8i$n$15CrVyN>N_O??yPMGxqAeC1Zu)J3s zeLk;OIX!daQY>IU25I5b0yU$%YA=7&+s(SYQ*aN?m45ISg=M7sVw4rGhCMur__s0ywTb6->cuQCeL1@EdTyfvKRi=H>& z-uR!2kMdPU@_0Us)MU86O)OZLStDssbaU` z)kF!mEwE;%CaNR(GBrYRZF~e4=}Xu!@EGfAngQgA{})F38h?Q|sKQ;Z-m)z^9aJPT zBb<{W!5~tF7lUh=PS`F*^mR2P6W6NoiEUK4y2pLCXJ<=Jyw(jtV!D3_7K0ZyzqX7S z4ieY9P`gB5F)COer-}X`@A^H`NM^;!htMEJ{oEjKrQ?NLH#dS)yK5L(qhiIwXUTQI0^JRCtW9LOhEPeJwMdRa|NV3;!;?`;1@vn9*TiU2WQU7fOCm+X;#3Ie^IG|5C zJ9WgGld`dOjAXZ{V~&U2aZcPR_Vtt?kx#=!UEAi~*0qjxwq1v5%1vg?pJ+n{GJnpr|6U zJgvyS8iOSNZVc~m(haQ|Rl)eHt&y~gi2`!?({vc;=Y}!!KLJ1Eh@`+SffL^@33%g0 zS3KP~ADUUVL-KZIYetT_w`PN*yJDpj1yR~!?nE__@}lEZPI|VRiY-KbQ$D{Z=1Rq$r7%+DUXjTe zm5}c3j9Yv@!_1I&NThDzid2Je-t(>#K6>>YstTSe9L!sBVppWiEkZ>f`r~tAPQJOK z?Ta8zyswMrt+GzI#Mlq2&-G?R$3g7t34uFoFfy_emM1RtnEhDfMF?|EJdw0=^W;zJ zJK_y>KQ{lL$P5tNhN~3YGQIe$gpQc8?Hn7aZqG?xD=URG!wOYR#N6%f_sl)FIVZbJ z2O`PRehsq=B#j@T)ohsD)YK)jY5$6%3 z)7giu7okG1yZMBXFF&6`U>gTyCVA4P&TWv)PK#0)ZivE`o9%JG`2*SSg(H&nb(?`4 z%-q8M8r$RKPphGSJ0m11GvYWY$c^LH+w3qp_5r9bzoJm{b7thkQfEjuwL{|@pGCLa zR?#iDRlXk}&JqRdW67w!%@(KKEQfjfk{Buet1FY7+uBl*u`M2$n+ZSFnsQROLEIk; z_SGr;<|Z3FtLY01BJ4Ohck7`{zFvGHeK)Ydg>jFwFQ4zgN&SZeB%7QPal~3{T>HqI zOokYoS<(S-HZ5oU+iAf7!94P+ z;)h#4d)BxEt~07-OWu|OX^|I!Y?ok#?;{_v9?Tp`pSw*t(QMHSx7AzXi`w<< z%L*}LA;hQ$b28$~Kpqlli5n9BlY;Uzv7f+?bWp55(1H7vS>V~SJ#yWQ4M6fgbw~31 zS$B*HwZOdDChjh^`Wt~n0gdJD=`XBmkR`N!m8zA<0i%N$>A5j(nV z4LC_i4n>mQOLU~27rhzR{)5n$j-1#GsRm*jQw`}3?eTjl!oDkQIoY{3QsFj5WYleI zhu%G=f*0wJkKyOIDOWOXe{>OmO9^*X&--Yany0y%?FSDL!it8ROSKM_I=sy5J-vuZiVE z=SnPU85rZ1L9XmzqL0F|(K#SS`sYASF~Wat6LOzNePLw6(TPa@zMII;{U>@Z<_3Y& zZEH^Y{MSVBwV?^G8{8JRuR8}1+S>B_f2? zXnX8!XNU_NYr$;DP)3Yaxgc@ecByjTBk0{5eU#>d()8GeE!Bo1jhP zbH%CNEjcj@Y>6Yo4e(H_rf_k;Ig-Nf;}jpRj>7@seawsj@zOyX2PD_C^MDNamB-TU z#rv9{G3-KS3q1cnmhLL9s;z4SxJgTjAR$uHf*r8NP!X)7h+-GE0%C$7X}8#oVkcr3 ztTC|=yAT5m3`9i)6m0#*-0yeszw+Yzj>6t+&H0RHungZQl%j2;u)%UuG3Mn(xHEPk zXY3b}Lx%v6cKivTn-wPF*zAwIb90#@S)}reCj0L^cQW_qjOVN}NY=TcF)+}sy_8?J z=Uo0tWAS9%4S40x^PBAQoJ5Tpe74`oz*v<0UI@b$xT9p~+KnXG&<$#Y8;L;{SxSeR zMkx8OpCP0jIWvUuJwq`q=!#l9Bo(Bqt8z3BzsaGf7KY+`?qd2HlAR?P9}h*z^Jpmg ztga`1jJ`>k6OWV1#xyn&Qawi#Y*%g|{v9o&i=)kjWMkm3F}t*rSk==&l!bmIhhm-q zXZN-*?FPD{B47<<%{D>l z$?pjujWr8{u9J0yo$-C};XM#i#~q16n)xRIUtHA|yIjhFr)yEFe9=5hy7M47>$;t` zu=r5|-|w7(pKP%UpLwvhn-hh>OfBJ`rNX-1brfl>M}LwoP47!PZ*hivY8b5c-a=BT z37^li)fcAWD#yCQczHjileUqNR&e*K6cU&Zk7DWwr%Y{Hlj<&3vpuT^qqKO@U=e+* zwlMv;fy_!Rh1AQ_R^#e%8!_3ww%E2gkG>nJ8k2Xn7Sf{Qt?|-~T4M0Aa$421sk(`M ze-?<+pYwq@gLA7Ne!L@#X&XSgoUMbB#<^-ka}$$Cq9JL z5QC?Tqv1>4Q5ur7ha{K(_Q0^2|7c28SM{rBLzHUU%+mPmFbmTx{?d=Jx^T9IspM81YG*>EL~(KrIz^r#GC$KsW>Q1c^_Vs^_rD$Xp7Q|!)>wer%K9v^G`Li zON06>&ajJ+rd9^x$~hG@d+Qo19bkge>BF4cV2gy7*wmn$9yY&6b2z6dd9|CUv8`%? zm~o(twDx?azj5X$d0br&(uF1)ppow<@>sw#I=|9EYPF5$P*^c{t*74jNIAzY(%LpZ z+Dlg5oKeyOhRdK%_L#{zJyLU+NxH0m<#D_awtg@HJlnn zzoR+7^OeK`?n7ep;-+Xs%$$P1YZlYmrAuI)vx$&?ruvOq z)hO(ZQodQR=-%KpRj>I3wJJ>%Y2WFlLeg5+RAg@}qN=D*Q2U^&al+Gq-=!Qxc#H!! z}#fl@&U%6RihpRPxMy$YGx2PFMo&9ok;$a@l(f)JNd0}HHI@vI78lMxq_v~VsR4f%N~Jb; zKx$I+4vlM=+YS&YJGzy)OrOCOh0I(yPA_^9cfNCS6`#|oKK!T z%}674bP`G%o^hv~ZZ5fSrgZe9;WU!%1`CaB9}C)%m_tWzrNf}E+-u1eY0uF3EO>|S zm&>&7V<2Z&T}35J8e0g`^V@|mXWS(^`}Mfr+{?CN4x6jT*;ZCq+*ka4e1QU7Z0XLL zYjle_kM$DLwI^O8xjWBj_@iRkn z&UHUUb=RI%8s}XiN49-Rn2@g34Hwr=o}e)qv!VAX8_|cQbLX$r)L&Or+a9M;0hgdH zxbd^Tn|N%3DDB8bo{c|B(@Wn&($U%?nXPaP)ChbOfCoPvA@2$0@TvJw`poXx))3Om z`!z(HkaWV24`Fg`OO3FyNWRyO#DRP!SA6aet@7LkyLNuo@Sffaq=a3);cTOW)H=%^ z48J?0q`M?ZNc}RB@c5kl^yo}PmdP3iG-cD(Z;CXhNtKfSb}uz=qR?&KXK;@lSrCQN z+C#iszUv<9cz-`t`(0PGlq1KFw2ZkI)07McsG z_VKYAT_27W%Ux1wSIeoS>$_LOsrf3B4lY;)#`CvO>zp-eO0|xX#Fl(WK&b^J;*FwB zR6YE*@*(^ZyknM*y;W)Sxgh0=vXMNT=fk!Zwz!q`9~CR4w)bPj-;L|(UH)Y_bjKAB zu#)6UApI!2L^HpvrEY#7pzVtq*qUkm9H23_??7zUa}9NmEC-|K0Z^MI-r}=4R?EW^ zo9|sk2}kpJFKJ6^&JI4d5t3z@jfnl5LPm4az(e;pHDzP%N1-Gpj}nIcSI}dBcZhf6 zy=yEhbt_0;nr(&8hnG=wpVpZxW;YVcnYu1P(hpUKpmGpsYZ&VqP0YTP*Pa~LOJ4BL=MoohZ;*RQTct62G}MH(9qErdqx;^@hk zdCGs|KT;1i+9wI6T$3cselnBn_Kk-{FL^$NsaZLyWK)r=G>@G@yAyaf$VYo&#B?p9 zHJpp1#1xCE^l8j%82scRjbPng6@!#eR7?v_PNF9j6&!$Fr9NWK#`HkxX+RI0);o-j z4=RGg-#5Z;w&N`bDJ=s~`8bX;^0=qF!W8?m1s&@MXnb_Sqs?NDs~=;n*I7 zsOHK=)TrAxes1}uMob$5lC$?Z2@<0MfIT@J|8Hh z!dWb5*SXhK@^>*7({zF;^GG>;NVXTnY#?XtrGyPF@b=~&q;>i+wd-)7TCioW`k}Pi zzaM&gcBPmxdnjP^B()y<8h8n$@hKOn{Bmb%vba4Z>`jAtEa`BZkPHmsgyGnZ)b;v? zth(#XQJcNY7|>pNG3m(pC2tiHj~c*=8QiPEmc+(se5(_OBLmx0$<6gJQcDM=E5ojk z)Of@dXmzDEJ@CB)8@r6vu!;{6(%C*CqVA{`^jrM|!($rLIOa3HHA-V*TZ;)*-n4Xm z8H}(0gC;RDGeD`9vjGlG@}$Gr_rN&FRhY5GJWDC{agW4lI&QS%?Pi$$(?-l=`{%SI zX|ZTY`&K%W*$sPe@03N&SgYqrD5djVq>iNn8Q!~?S>9>Q`SPx7&NsIjPm)q^Jgwc< zht3Ea1nXPpIqn8ycF^INm=v zhJ~8V&~UJtApiO&Tg3xnTEw09h%-FX~XZkWIo}&`tt_Q;y>kC zd{+B0zjLu)y=I9%qhG1k(WNlvYGWM5!WU#^N^QDc$(%W?KsCy^30*E+2Y*)Hd6tm8 zx5nb~{&}kR(6wOM{)^w^c3=F`{2zlftj1$l*Xx$LetUg5eef7%GOu4fP>LDG8M%NQ z_2An@S$ZDU!hki;@YhHV_7}T-g}P&JOZuJZDx@dIpGg`qvmQ=yQiaRQjQ*1|7wLGZi_54ho)W zeb(g@nx!2Wso9yekAnI7B#Wi9a{Lx9T&3#tzZpfhhW@RwpLXSZ6wcKhS-!D z{!@h1`IExmmCMyH6B|?h@Hz09Wjg*ODPhM?a=WuYO&!tO*LI{n*)j9(Q7By)9VLtt zl2p%eO(6146-mDhXDd?O4s(>VLYvX*!nt?hbDXs( zXO8nOfD}IU0z5bEr>@KR1n={YQW^7wV3dY74;Fhr1*(VaKZElcOQmYHrSiTG&n_^d zk091wZL99Sm0_{vBDDI5pD@6;;z}Hh z{@4qG*)DOGq{!^Eko&68H^M&?0&jPxQ0BKG0i~lm5^$P{i(mG%*I>&%CXVdu(IQo{ zc=<}v&KTjReyf1gBRreKynasBSXVJwm^v@>%kh5;l{bvVcZOAlC|&DjBd)@xY^*m;KOqF63`Ag4@i0=Z>J<5%JN-(rzy1@XoMEvf z{aZJadiVI_*Ks$hX~W!bCmTAK_kgm#PdST|YoJU_??Ii9T3|OeRHzSNvW1Gsy5 z@Ibz6Yo7`?*zx8gg=999|9iS_O5X;LsZFEv>POr2>NssrleM1R*dO7kb5Y2ldn zG@YeCFhD8sj)6EC5TMu@f1-h-TtqK6XWCSaqcx`qF|x1Hv(a7Zu*OETWeMXBtJ1-5 zhZMi~k;;>Rt@Od=C_QJU4)G|NZI4HzmRy2vRICNJ;B_hotJ&cOdd`f?}7m zEbHy+r|^pXJkV80HOsq-8b$M!V6S>$(#{$6nQ3JYjpSPYi3cB+DS}n37)eKa}tC!B{>0C{MxKEUS9%!3A?fi6L)3(Of6BQmGj>z zQ)=y0_V1|xGP^@h*wY)4C@m6^qLt18#bnk?cs0OLl(Dq0<{B4@%tfKWQDsEUGw?v) zK|EuJw*HUT6bB43KBLrHH68q4T&14u)71$m?b$Q|x0;gju}D>_CyYN|9X|g2rUp$x zT5`mT_L^N$Mm9=PZ+5>5dCdAvqL2pW@cucon@Zi;1L#6s2fQZzIRetb;0!7ZeB}+01!FC3Q-amgU@4!}H(^*%PgJlva6i=k}j6rBmEpS~}UD?+oq5!*7|Y)O;VQ zrC+O*|6ZrkzO9a88*6f5vc{K-lX3lr-^wX3?z3Ebo8s8z*5)YnOf$!j&o!ZqS7BE0 z>j7D-SnIL&DCt?-izO54f=O`=m~#ITjAD((gbB%hQ<(VhQU`RdErfyl?D0QVY0-eB z<{|YVVxR$dUC4%Z9URe}6@?~h#4Cwtc*h9tO?V4-H*UbM>o?$S)FqN48(fB*&So&Q zx&jLJul60XeYNkVknTbn^0}K>d#(XQxxay=A>+RmF~c^ zsJsVe%^8rU);$9Q(`+Gd??UL=z(Mq5FQ;>FCe!_qh<>K_aBM?O2rRfv-C2hQ?LgZ9 zvJKdBp60{;8(C9|C;Cl!H_@-H|2UKud>JeLR=Pmy`DS$Y?p=7xd?$MF45|m8&A5w~ zBR$~P`7M+a>Vyy3!u>izx?5Kl_upv>9jDx;HQ(%T4?A8NrEvzLaG+mvsCnxnc_o~K z5Y}!$iLcb^XN#=jeXYRYX*n4L`>1b%eAKI1(Ly?!!RL0S?V!T(8SU43MvGX>%DN~; zzp5kB;{2fc!g2D5ZXz19V|zVOS`_MqS6}lQ=hhLlY=@0l$Tpad)mVRJ44&`q4>{SV z)csQq&;jPKp^e6^(DoF2G!X8OPE?HQ?Ngo@>{D(|N<`_*nMCoces?%My)RsyR|@HD z`D-G{cMTE7^n{K1`=S3fR}5t3uHA$*VR<)f_p~=mx|9!}GAyuwEl&;7XlmaZKeP{l zVZ~*j;(@f}c$f|D{JP zuR%CSKKhZQ-ETPDt$P682XKcBYw9%|rCPOzDnAw{O3#IZgZ+3K)lwIy zvf3U6s${sPKwWJ#8Gbf6N|CR5?wietjSy1A^Ki@>Jq?_73aGBVHa1|^x=tFwH68gb zISOujlv7%hX7GwFN~?!b&hvW0;CBpkiTOlo=xo}>;#x!t=}qMf?sSR=gN_gAZErJC z$Y%C9m@UAe%x#*`_hfPi+Mi)YtY_UNbQyw z;v(0%u&8Rd8d930u3!(jmqdDT)Lt~bF^_wUg%V=67l7?3o`ez_aKGuK1u*^LBoJ3^ z@ED8Ren^orTb@$J8ZUyUZH`0r4QG7EtZU5@(t;kd(DV3WxM@%bU&iIZ6ILtir$+LL zAK=h;DFluzhgnS;`~7rm?03T42c=7KKBCi?WiX`sCs@1dChcHL%f|?*{h+a8>FO0w z;QRoJcJiK9_S@Zoq+)G*_~Ek>GM4X#^Z|{;L00@e9;Mga5^&k=ReZnjAJo2bh`wGv zMB@z$HMZqF10|gIF!zmAW~@G`4meSt*g)_pii7Qcs! zsvYa0fAM%abIc7dvRVxXfTV8f3*UV=!uW9+WHrJR9of*&Ja@~kU*pf#hnt}C#}jH7 z7zKTpkD9BI`|%pIp0ov~?EOsXj{<2As}bA@C66r~MP!{+I6a|^-dxug@1*U6H6lh0 z7AH4vgAJ4ODeAbph+}rwW{_n1XByP@Ndq^tgOqAlQ|x0NM#(5G?!(Vimv?}EvmxZ! zvlb0yi@k(KqpbvI2JC_*)>~B5!Y%NtU<<5{3lP$Q`<*#YyBqFpT%mLXYi!F77!A@W z@E9nj#O;OhF8yFv%O;r0ZofEn(>xS_uvOy}+c`;rG>$IgCB64Kc5N!Vx$|E{Ox zL1Kwl`^2AK?e#nfr1#lbFwyN0yxYV(6Bj(7FY_M|#C1mL-Sy6V=W`fN_ABSzY)yn7 zE3Gj|15XYVk2@WKyQ>Pp>xY%FVJ}ZkC#m<-XsEuG0lnIs1f9@L^lro^a@diGQa>dL z>kK>wi+rLXWv)KlVz0hmCaJsiW%&8>IIIhNs(g*8jsI9`Lz2H{NMuE(>Wr7$p5;Ljj`B!0Y#$Xkknf7|PlVPY}}Q z1BsaZ<1Ea0b)EFSE~lpKL+uA3jWoyuhlKM`&-y)?F0d5tEMaYXlm3CX=_1>GWP7jSdms5K==x&i4z{;orN=Wc`xN zrDpLc4X=@ahDq7*?&)$$4t@Z`nMu}rk|y>ng$=(ifH=^QY*U(`IeR;$nUGqWG!tbp z+(VUSomHkb#0qBAdAx?hzwyH8>t(3(O$%NQT?K!c!nZjKewvhA_BzxXN`Zp(xS3mwsob;+oU(&KJgXfym8M67uUp?U724SW5IXM$PR zp$?)~-gU@pQvriI)fC=Lcjy$2*s{q2y4?gTt5Uc)yG&i3T&Au(em+aO-Y?Vdebz0Q zBF%jadn6gHPL(o)~FnLZC3`%97bc~2@nuKaS=5niF+oUewHBVu3rwTf>VLtR^4;J** z2=(bj*MAhi2InGby2%0!*~|WeG^$z*!J^^MU|~y@sv5gs33J^WAf%b?199C&-odwj z5uIz62iMv5tp`YIz4$N{JH3Rk?#2|fXG+$c)G1jp&WR{R8z+m~^NZkm%NChE3SQ9r zr!T0brq-C%kTagHLnHWNdGs`$By667jd5%ODP_NlJ=J& zsFn5>!c8(^=<*5Fa@hoG(J%m{#MYh2_g68*AAbQqA5H+RM-yOL&v+sIyTC$9VD0mA z*tOLRA2Fw8RUo;x`bIs{--Dj(CzvK7mN@2)=gYa(F8Q*u4&-g|doX?U@eox67lKu&x%_tZ=nLBHk^~C8YJwHEH zoc~t_H*(J^+19Q?%f?lx{TwvcFLT+Y+5X0f$3;f`Z$1P zx(*jomHRO9YF-umH|HJcS-IlFhOYSYaTksEwt=GI?P|DPqmp{sK7od;w(lN|qcMBo zqWO0)u6Re5`c1OV>Nd$b|2A1j!}$B^>5v}~<$Impw=bepw)DegkRGN92u=G5zo%{? zH$68|tm`Ji8~CA=ROlyqzy1XuU64Ggjm6z6V=>EdoW}IvF=D^dABaCQOl{Pr7w?zr zMT3{zQ>8oiUMl0p{Dp#p2NZw*`C!p`K74YIK`HdpOkBM4AE=K8L8lT++{0!rs4t`+ z4raJuat(aow-?&qamK~0;+LV2@?(v}4}+R`Y2!Wc&A$RWSb}9NNE5nC(Zu&APZHuq$xkX~I0#n6|vaO%m|&~&rA7{^{- z>41`5|4z7IR&C7XPKpDZORITOTUf>%0Vx*_QNCFnJXdoy95vGCE?s?ce4Z$zz^h3j z=x`m(aCQebkG;^&eJ{+|L>i6zU8ZvXx@Z@!tGry!XTogawDuZVoC!Yvv@YK4dRNUn zYlnT=t&FikO3WOO`=@B(`pSvq+;Imi?XUyJMeb3hfxK%ytFAUaXmgkXu2|4V*5cy~ zlxpvvAu2a%qgAhm6jMu2#Iox(Y&Bxz?ZkgxIymM-Dd%!HSHdEEYir!hs)5&p4sP(M zAfx7=IJ@zQV(b!7dT5@2VZpj+b+w4vM{22?$7`u^JNuK=VZ#V;d!>sT^s}iG&(1#Pu;#YT->v7lvN4G%lc3DnTXm!*!>?W8GQVhi2EKyr&5 z4fRv>@qXg_tg};sq1Uuv7~C*XNKNm?W1x)zZc2HiIN&1M42$TGQ%#h-R@B7x`wg)4 zb2t>_Scz=5byOpihG^T0zb)!vo!N)MO4~`ev#ur48k?_1iA1W0+D#rpV7Jqh$yD#V ziu6zGx@ytY5LaZB!jJU@O3k$eO7z@OD7l%9#@xGxSkd5sSo5F?tmbfcH*0l?-|@y8qgLT6 z=+ddTa;JT7rS2epS7QAtp3r~~#yD-RCp3t=LpRyi?;b*OH)@LEk=!%-uaUCmvWv)N zN6tl}G$~~=uBtG>H)h%Dj|@{$>!_*dlTkyJTC}?2cXhfc<~0tbVL3hM)|DP~?a_E4 z=~0+4s4~T!?eth7WSg*;2b7SrqFw1*Y6HRJ#s?{@%f^Kvv|+g^e6^7?43S4>CjO=+i{ zDcOu`j*{h}mcl#C9MgK|lHOZAk@`kYEY}a$7&9h9oPA-AZ)YAl{lY@OUZ9AZ7Wl&>5MukfqZRA5K1su-X0qtm*^=iNx4_c1+GxTC z?7v3R-D|lt@0=xWx|a*f2A3LjY!#g}`sq;JEo`;9lV!ri|42?9CBQRo&HTE1b9zM_FJ;ZUG zn_ZPGB;Auqc&GIf)xid1zue0@>v0H{dme(uJhv=) zXuF8shi!0Si4E0CHz&hG=G1L_l#ud&au0}wEiSmRn9grC5N%n@!50*%XU0|a`D|Of zpK+eP`?!f@cI3z?lq{S>(dMHq>cl@IpAnBJa`+>1;;stmLUA|j*S8V2+xnR<%xkS2 zSkzjX>pYtzI+{!i&Nspb*`H~D`geH9E}cz4$u&P-9BFKa$(&htZ`c z>F~3Z9kyMcNo`mEg6vhl;8hzFAsruPjIZAFpLJeJzq$n}Z8`@j!@tF$R6HgQ%l>PO zS3B6#h{T74Ne`)6%t(z%C86-~NMlSMRYMJK;U;b{yZXH}v}1aSLL+)PwB`T2Xy*b z0j8Bh;6A%FJ4r}icwV#vI$~PDd+64E1s&?Pg6?#?1d{2kOGFzTu}ktD$lTCK^kEFcJUrr_VlaCUOq(+Zf&)TP`tc`JeEQ;qsZFnE{cU1_=wg9sE4mA5r_w{z>gtT1 z-5OH=X-+tuJ?S=)q=bKA@Ncs-y6Z2blnd!Fn^_H&IDAv;j3GPE(DymkbabvY zjX7c_q=pfkD^r@_&(BY(Mk^!Hjk$Z(&zdIl>5;|G%0lvKlk!}SN7km zMDe?z3F3otzGKg!AYFS#B=eQ&L2Od~y}VD_8kA%~wb^Tm0~86wkfA zyhwJz+IXY4Hi}8%8n!3G(e8o^KKs0m2EXJT_3W(wk1WZ(>Y-ntzAJKMk6Q8W@7nB} z*H|HKvlu6WLtJs~xMZ~~F-UE~g1ZKyRP#fC@Z0K&os(xPb*}xR{ki|>P0iULWyj3{ zZJrD3^2ZNm33t(qdGv_aXx%OzPq@0_(&y{oYZKnPz(OvVpwwg*hu$W+Vg8njFjc3O z-#zZVX!fWKf@f628P;u9Ta<45v_)&qeGKz2gid!4`SrPf$nR#K$wGQ@DiVJl z=R4^h=fOYW9Zh00+b&Y1xVlS~Q|0b>W$;o+O6Tq(R`DVfrE3)<_*u#Wwd0*(Ysx?J zU-^$Lqk@EFrW+(^f(Pmia#VV?YpZU=w(9<{jwDsI?g+ZOJg{0fU9DmH0$eTlJ?Z*P zl+K&RVADbmtaBlV1`Of8(ZTK*HpoFpdASbgS>Ka;;8Q8_UM=)t5sRLXH1Nn%s@202 zKV)4c&v~(m)9hHKszoA7we^z4v1Cuw3w=XoOP`P%TQlI1hNp7@wLayEL;6(Eqz3LH zh<&;5pyBA@fU8S9al(;Lv?RWc=*rqOjzMW#3eR*|d0{`Ee>UH-Ts7IYTn*mWgQVmg zJ>hl_FSPu8nw-DoL%r|$;BWe$kmB9{6X|hYXvcXmr$26($`Uq@(ijpvT7+_c>c1(C z=)cExFq7FGGgPD*>JPtnkG$~L1bub%;uVVHvK7jrKVd@p`E?@t*J+9_KTj!d*FNHV zphtAU*&n6s!cI8dyD8GLKJd?&-|N{@?YSUD?U_x{gPLM=Q7XiLsx4C4_b%}oN8I8> zk2y`TTkciZ*D^^R(Jo0nv(pNtu{RouuLqi9wf7sy>RSNM`xHP`+xHqh96vzh-KMy_ zZ3W!#h+C#x~rOEyg?b*W!1#hnKf})C5BEj~yQScA*j-FyJW!%Q0!@XpPQwM~hKa-guyT19iM! z0h4a<{?&wDLb|-Hm-ubugP|WUQdz2Q)`}?Itjf^lBt16rhB0nF==}F3ov!hn7X150 zc3Y!SIyp27H+S?wZ78QV{Mj;&8AW+(Or6^lQwRFsl~bQdefXN{vFM-^8sF1S(4a%y_YYWM;V{JUL-v>K~cc48_@4=oY_n`Vw5=z&*a__-8AN0JoM(yu?NeydxNi9mh zOj26$C76572itcHP*HDqzpc&eCE{0{<18FM_q+#_3q7>L?pg3sL3}1J-2~FNviNs z`lw`|SOGq#RzSwvDH;#2Poqw5&G5=i%nYrv#|oxDp1amq>GK#divR56h;M4$TMaOj z4V&Yl5fIH;1lMNhG9!Xwd|N;PtI=20h^t9Zw@EYn-f$n;|2|H!tVdCzkXmLY;(Ui@ zcyq!n$_R52w&5O4c**2S`o!{h~J(&9L!~3TohT zP95cSPThdK?~y&dlO!%0H^a7rKGD+ZM^MQ7Ld-`!*Z6($8HMXK!%KcoDTVjITv*_a zeu|~W+`pFi{I3s=S$K|?ef|z!W#0kZI9@8h%jO>KjHP`V!LBfdTL!FQpP)k7ifVly-Gjn)_u5-rx=^uZOa zrYZ9--lvBb?$fPf13;Q_ydV9}^1-^6&EQC2fik>DffD58kJ8ZIozeR+|IGJX4%O=n z@%(z;srn;aNF@y?q1R>~?AYrZJS=p^lh2$ntK)4&nv{M=`MSUdpA|iULZjWV)nqqh zKI@Cp`<)@8&lDg0W5RbDFqBH$4<#?hkwS{TIg;l*eeio`1?-+|BXpU^u$=Z%-O8nH z#`yW*)s639OgH{BmOLjECD-F4@rZ*D9vE>4ZWj%r70j|_h>)OOKQz_nzn`TCA;)nq z^k$Xager}lc|lF#&$>ZZqaiA&30C)Nf+zNdX*7HqF02Z@(Qbn-jCo~%hl>pGa?L;? zeUIoOPLen3PTt{nZuwc|$%3=W=HCiQ?x)*QVQt>6w>92=_nmenvQ|V z-Z(wK4;{|oE~~5VBDO_4jrj0(h$Fo5zW)}QV^>C{jmvm$W`RaK?trSTc;m6GOO)BE zm16DNN(tx}i<05r7_pkaa}1}vq<*1V=*XrRcnE3g6c17QwJG`^`Apq{TyZq>4L?NE znFR;Hon$ z?PQIESCg>IZZF)r{DWc|#~pR7^uM}7di1#tUYX&AH=mCJgNX~3mJHVXA?eHNKV;O| z3s2750qZ)JkYlG3()%wNr7=H}L=#glG-!|uZZF-%36|5SnxuOjzLL%hPaIY93T&Pf z(1xc4G=4gFGP1&NI(YV=C(fBx4&R5|F4ROU)AGd7sw=Q~$tqA5uY#0bi70(|ohTx2 zdEn`9+n`~^BKpX>8{X6CYiCApqfjh1?%e-{)joM4RQ6KB_{uK85-zE50$j{LCKB^-MAH(5ikD>lR zTOqkmv=#4Cxi8ag6s^qX*~UliXvaT8Qgz=1kvhyB4bsy{yPz16UOXgn|PEKpNz+?>)bF%znpx& zI*C(XoJ7W>qa=AZI037ByW!7C<&?N%4H>Y7mz{)kj&n!-_1tim+iO~ox)>su*4ucL zZYuGj^r9<<@?N^!wT>9YR<6q+souN{3Yq1KPf~VKcr9amR?`?8aM!(5w$KTe`M6^B zm5KEAj;i=vSCypDc$8Y|$K%GgF8FcZU)65sD>}#hw4+UqYM2bkfT&F_7}0Q8R(_eg z*zwt2Sgv){$Z6mtoc?n`-OOC2EXMmm9GujzzZK!~Q z-&}+ao7*@ZrHjc4!r9On`)_*(&3)^L8SU$cKYrOHrJue?ac7+H=;OO^`E+?^o&M#S z^8&1ebn2`Xe~vrh)|4Y)cCaR1WHa9;Xc%`-#3Ncxxa1gTh}UpVXRRyx*SJN}^C@>= z>0w9QH`ESR*{6fALppfZYapa&+v*DpcEo8nJ1IR@kEf5T##8=-B$RH{OA@!gI^Z|U z+3JrajfMTv#=`Q{bCUilFR1kf2RzuMDVI#M>kFG$KA4U~F3l%rRX|uWr9k zM?H9N}y9$yfeye~LGwm@9^2qtVJ5IUhj#+K% z2{+G4c1JzgLFp2FN7fTimLSnR=h1s1|t0rTUHG36HDYxg%L*MX+wd7!qChVHK| zcK2+Ig*@9D)y`7fWu~H>q&K_E!MMZ@Z`>)M{GB%98;hTtgi;Kjbq=0whe@1&s$H13$zu^)b>YY#0=P~)T@@OM$*(QiuPIbqVY`i}A znzE8Ui6TC*5x(wuT{R!}5rVl#YvUzrA@vTj5nT#w(Pg5e-`Kz-s%^(3>hNvnNOEa$ z7OEm`vD1qR@AkYTDun>ya>VioJNv*}}Wc z4W20zXtLh~%0I|GQmjkaI_l$SgG%emaJGGW24b8z@I-a znls+HDkSG8ZN%{o)@X9B3?}#c4n-l~A@<8~lGeQ)4w<*CFl>4Slsp-%8W#;#^OR{Q zo!6U&hXz^U(x`XPcMAWUu;H%*G#V5H;M_M2F)rvH=m$EAgY3jrJ(32@(xuLk4e>~` zqd=|V$hvJDxlIT|DdyosQC4k#%5Qg#3)7>5XH&f>mePNF3?ZtDj0%@xP7 z`_Z1N)c1q8Qmd{dKE5zhDf;&lQdnU75hzX29f6TcEbz#Sj;j05?&^#m-PLjLLxprb zG8C^GTA)=28(Kf9p6Jg!XM`)#v@@d>!_^JAV=Rek)^`*e%p67Y`oSpWbPE>#^&6n7 zeTas8Oy?qy>GYpLgpdYQgp2X(%yC`kTePxg2AuDe0oCuEG_*Q6QM|c178kvt7E!!E zm38mcLE~SW4mf*leM~-DPABVsg@fi_q49$#At_-|7;9P|J#5P<;P85N`GNK7gmFtj z((SSY#-y0x;C8Rcw124z8^*m5A+UOzt_06#H>FZ=XmVejToAfx1+_t6S~fi0o(=hn%uu?}%M8odoOro0x;c5M4P9Ts?wIq?OUhLL)TW=D~SYOYw#+sFAE;=9DA`1{-00w*@eMx|JaI$le;Ij38_A^D;lD zpU8lv(I(VtrU?zvI|fojzYN&e#t?rEy$fHO7Q!F4fcHsA2XkYw<$-$mcR?{MApT5Z z@0+&PFmP>+w;I+%ADap=-+l@1vGylIH0o^Qe#FH*E0X#dK6?gHEsr4DaD1|mbPXnp zTHp2Y7XLptztvdmzu8!PXb^2dfsqJUFj|rBnoUyRz82FRKQ8`NoZ67A85B0WCJN+%xr{h$Vp7~7Y z4jyg1@Y{vH2D);enXCBXI+vsm?dDN@H*K8%h4+iM{z;x~e$wE4K+ zRT^QxhuT7Vus~Z_71Tl4SWa8^dqBs19x!i65=vK#`MFi8gTWKZX&raKd}c@HnFy&> zGgHxNTWwr6{|()^bJ5yA{nwXXDLa+Ag z;e-Qvc%jQAjTwU?gkMw*T-$QCy5!m)-|hx~eRI6~3(37CL}YFI2kC#Dm5>oS;>B9sLuE*XKZWHt+Cb-y@o9Ea7gqD)S%E>+uT^ zD<6P4>l;2xNR4L4iQ5;xL5oRcu6`=}vno2+n2)!L?c!RcTF1 zu3~(=1o~QV&+jn@yub`|I}2&mLw^z0?H$z7KTF^1=;9R4qF=r;Q=`YtXwmq^TX;F~ zA=UdaEvw$EX;}$14wCe`(SB+<{S7R9UP3dL*AvL*&1j&p1T1iW-PbT|G4JuKwiCUX zQ@13PRy<9@g!M(x+~70a(DtHD4E{o{&8$|yy& z9nZZm6DI*pH^bNLrctbry647}q^VP_gR>Gx4=jQc1j_GN?gmcReHPq+tf{4c?Q zZG4BoHXhMK$*VvIHx}Q41qRPRtG<&+G;@w_#HI+c4(X8jZ`_R?+E!H(*+)Qh0dG9ozHW&VY^6g*3J2 zG~s>k8U%eUfP90K(7)bE$eP(3rIeFF!mn#Ce9yZ8X8ud4yweieW}oLPHJ+^cK2vib z!hAcV8oCO>EIakl2>OqA7&pHHBUgn%^73-BT~SU$vZtZsw|Xjm*nJ7wZ8Ly6I<>)9 zt2R9Nvy!9@At^Al!9|ESc2H`0+2Ty@cCCBWR!HsYG!l^uvZ2}~O8tG>2q!Z4>LiW) zGfBd+ir`|m#x&yTWIye*ll{g$Fc4CwJ_aIjlnNK^;%P;^zWBpT+Mgz=Q{owzcboTs zjM__DSM5YEHvC>RO8$v6v1PmS(0S-p(h9exQEc|803nTh9e^8l@-y~|7nB79XN6`v?{wJRQG?V<;01egyL(Nj;shz}JM`D{6aJYNp88%z??b_34t z<)46OAv}j)eS*BIPS7ydc#vE_B~lyTw@Bx6?lH&cOl)l+Jx|z~rLV^1uYFOs*&fb%$H1Om z0e+|41N>eXPeti?_o@7Ry$inj?1u0hW4wOF7$3e^N0MRxb&&CD2Sl{L0@`NQ7-njX zCCe;?G&jsr+-{c!F%OvzX*I;i8x|Tb zS6YfwZ?;0+KNavI&Pf=>J8?JdT9Td?tbuuLx4_7YrSP+;D?MkuH%&o}lT%Pxx(R~$ zz5jFTLI`hD2o}ft390X~epp<%0bD*^hPBJwu=a8{{JS?wk(PI!qRjSM4@3BD_ty5+ zP?fftXYV?p)P;9KnI^0SkDW0v`1eVw`|BhP?92Ps+3fMLV$+S)u>Eo)*i_{%K7Zw& z&jB|vBW3d??KqEY*Y5p@q(0_R?C zq7fgvl3i(6%9=h>NYM{Rh!4vbfx+S|8ur3TTxM5;B2envJWQlMTmaYk?zQmdFRFF> z7wvgGLqkWG`(kb8!`9aCX`FqvQfghTZ2i?(NI|0+nx6zk=5MH3NLTg8(5~tRn~fx0Dcwj~ z!{VXR?hbi0u@DPc58EjyrNvJXYEcZVKX#0+CH)^q_Z`+_8^r-UX_yTSq@tuHmO)1KJz2ZbfE^?{HlbXYErqeaZx%!K>c*@KO@}4h?}w!UF%2N(${%2p zmk)Fteo4Bms>WN9sPKm%IK(`}txxB{bFBeTvA-M5MReot0YM5Yor1ZVhZn>|#lRS* zj+dR)vD|qW6C7U-=PD(hkp3?PDxn#kux4oN@!eS%E1z|a89EI*Zzu$lNHaE{9KJT5 z3$LcTvZSjXFzr<(T+elY0y0YqVuH<;KsM6G4c7Jk0AcR6_?zSpy`k`=E)RAd90#M` zH-R6W`@JWpKmI`>x9e{V(;Nene$~U;+4InP?mT=mA%Y1LOv1T-25NBcIhU6s$sTz+FnxQzk!0U6q9%hS}1h>4TtZ%Q1M;cP&h_T?>DS-`bq(1QR zane%bop_b>oYIO3cfPjbGnM~?v41c-N=EuWLm2)koC~&e*1Bp@Z`uK9kVB)b*>iGf zyq!XFTRZN5*BVxInTX#$9{|g*2Vh9WCrP+qqy)3=EkJku4op_3%uKb**voDz7vAG^ zHe_FS(4do)Uau)@?iHPdv|Gl6-2+!JgI`^t=gWJT@#h5U{62v*GY=^&8IugZJq@8# z>06W+pM^fYXJIGhrV63!+tL&3PEhmkBdWf$W^p9wdzgYnP6U5zqz7H2oAAWwbKo-O z9Q-|H%Z1yI{^P&Gv_Yk$7E7#8;x!^~R8d%X`McErX?xh(t{gYg-|+^C8aaarZNsOr z-41QQzmB8f(KPIEEDb*`TFC|HSU+aDTMcr(58;O?$6(v!W6;asjKU0>scURhh7qxT zxV41twJHB)`+0SR37=K@m%Y?+(Wwh+-n{^mOD;go^++z1KM3bL#(tNI)I;U|1CP-& z^kcYbj3W~!c@5IQ(;7UrqOSHP$>c@T4RJj5;EvU8s?6Z)}!y+NWVljWqO+ zo5Y3G`)B(+W^9D$9pv zUMht~q{IG8DKPYM3b;EoqEMLq5sjA?NjvoJgWj;SG&g+~ms^A}q4^Kx=$qV-D$?IV z^<(NFCJ(lbP?+(37>{|DEm>ds2u69wa6#@doOUtKN%*ka{p$3{bm>EK6SQx*1SKCX z!OIjECcJ()j1{&{l`I$5!Q&!pmQ26T$?hRsaI*?!{KN^`r>Own#6-BbKM~UAH7RU* z_X!*)ACe{wxlWnwGM=fC(P`s#5NccH;w)Np@?k zDBsYEeMq$9LN(1Ybowtq+7hxcTmM!V)Z~T1!@p5XNb`ODX>BI0%SK58(X30Z)MxwBFeJI+r8zl`LMR`yMJaG1553DR$$b?Th z-aNM+~6(m{-mt{pipAtCfSAYvrWPYb3#8WxSl%oaYRKD{)~rHRfod#u^5=a-q-r zas14t6V45Fh1m0%A#45IkiDB3q_F*L5I@*?lk=c~sTg*8q4ea+LP<%r1_igDZxKAE zI1iP!U@mC#)?`VqJQS3^7C=adq4S3D;kb;tCaNCj@f0^dCL9m;XVt^Co>oqrEyc8lF6?K|6!vKHI1 z`G+hOCXcY<19lzA`Z%T=Sos{1`!6{pce0D%LNB`Jo4mbsc3tQyDE8{gBj$AF!-kqL zK{>fQpEb@UyJgcsV84{O_HQNL>a9HpPMdmyy?SJJzAr+`Ekj^83?V^pCKu8@XRw%O zN!dU3%OEAL2Yb4`2Qw>LrC`-*75maRGh0ok2DW{E3;jR61?L`lDEQRp!K}4q*}sb$ zVbY(aIN;w>JmFEJu%%@c-n{oEJGHqH%EGKDx5bKU?hB@8t-)-)Ll7@%*IFKsTmvOt zuH#iQuF#DOxy2KCV`@ivqxKW{N7uaxj)x&L`mrSB^?D@l8)q)Jso|6c9tHBPOuDbhGG&L`m7;K{-yMA4J4T*4 z-4P!JmPt-QWzzly4^U{+@(C2KjFqGQuEUpJZTKewG#?;riw|J+mv_nQtxsVel}>yu zky}qu*c>>O_5QkF)(N|bUoVzAr7taY8dBH|gavxtVUOKWIrPg@ObF=As{A{%EIm_& zq&cQsX~h{?zF&uZzp1k&U)9;`Thzr)s%ehJ_sj)(&)z0HcahStuKt!|XZB%&>pfeZ z^ZKe>q)C~L!_0U&aX)ZL5&{!XNk2Q~$OBxfFzN0)#Cz}1a$e_44RVaq@IyA3WB@2L}w_55gxdR{V~2^|c_F{6r>Sd_P( zx+gXG&zrRK`1_$ORAZ6k@1u^h$DM-aLml`z;=IdR!QgREKKFAQ46(ckK^^?1Q#$_A zp~?s*bZ(C155qO+n&&BePV35wNx?YkAs~N$_T)us9gw-!!O?}^pw{Obn4iv<1(TSY zlG8TI7NzgJ3KI|f*PY~!Wdd*S%1m`TW5tR_SnO}bwF9j9@Jk^Ij#EO}ihYJSeN8oF zrCdeRb62tMnhFzET~cLcUAkdK&10DS^D_MXei_^c#wnb?6^ph>)Q#uJq4fhR7FcS< zGNyWSA$r6DzN?D`7SSHmqTSOVBYqlqYA$Dj`om>>Xo5A`D1||^&v*Pm2AW<|K$@9z z*6WQ{Lwdo@rCoUu$xV2R!ol*Fuw;8*w7h>oTD#F+Ubo&}*8Z}Z35B)+?4Ei*46A(R zI6hmCrIG&Lv$zo9YnEd%4TKMyr-0dKCv3{H!V`6BXj`L( zS-!OAN7{DL;eQt}eBm2}mwKCX4f4n+N+CWaoHsolf|{X+u%YtRfuKPHW2^z14 z@y21p@y8|^yQJ<1qx1VgsdASrScHYizb=l#@@0>3*-dL!K;B#R=E6WnTh`Lp6^Hv! zzeR8q3=W9`x6ctw=>8>=wc0QNpVoiG)2Hh38u2md#f6FOda*wZ?l|F66NW~Z@C;IS zZkH_RTO`S^-KOA*^m<&`HdH>M9V*Xv7|w)ti6i*2^y#?H@&#Vrpv(G_J$lsdPUf!) z=fm`8;fbi*SfqQ4wQm0XzX1W>EtwDF|=kR^;V(hw<4D1LRy|K z?{q_#ZyXq`FnU)gTRdbNeuy{@jpgdxyF#6Bwj0lcS+6Fru@&2KLx**cbjJ!V7F)q< zB?A-=2N}ZM6+5uTQ3882E0*8girvfU%mt<42Kzr*>Z zgk9+Fc+)u+3h)PsC?3uQ&AJi1jm;ix$XPCjFE{7gi67+-3T}4_iAG4-GZhV^?R zm)gIP-Brz)a5meF`HoG%O)ovM{Z=hDoW#=*Wfhn;iM%%}3DiSQ9?AHfJ4snzQ4- zjyemTy9%_p1%58ExaaS@uc~>&iv}eNOoqgG>oyTz~Wsy&O+=0&|`a7Z(UVfx* zK;4u0XoMXOeJ@LSCeD)Sw(1)qdlPAa-*aM}Cg zI6ldWecW%wo=&#sg3TOz?yw^TuUfB1<)WitTX+;sIz%xcgTBW;tDnQjuY+)&TLs#= zSKtM|eq0!%(~sK+rDD|8H}YWFl)8gW`S+QPj>4wn1^tT}&SPZD-`N$)z2zrrz2&t> z?U=Bk(Vk^4yny>3jg$IpHDH=#t$#QdW;92#U9T_VN)J`YQl?Tg@_FfhOt3rDk9p3x zjCUH`AR#6k|E>?mhPri5LaNGbCy%@7xX~mQx|Un>iYL}wrJub*9@z0{$iQ9)&%z>S zfBfa>kB)|sOc?Ybl7FM`%f%|U;M9-bAkHPH#q{UG)fo=_O22z1@iw63zRu z&O)okg6xdwEc|({7B*jtmXBPCmNWO;GU4RdKJ0gGHop4N2*>xD@!90V*eC_3JM{c; z0^%{&1hdPEumjnjAu%D^L1K>S9IvmfgU<6az=TxvT_6kle$A0=I^|;5zt6xW(1LX* zsgAUhM=~2M`J~|M_)`BioHcnW9qam3I;lhdf23$+BxM)p;Xd#4(5;^?4McRd$A|XEA)ipe<^2*SXOprr|WOw z>mHQRv?@NfG!*sHd; z{QOmKx$NLfCYXPk%`8+O(KSv3M!%$cTaw$b6NQgQ_d?F7$LRB^iFSwT;1|(ttVZG8 z-nTewYZ+#-k2v6UB7S_8h@N}=m~f$T1^-g~1Ur_$!-pYO{27T;U#zg9{bIhpZ3X^O ze~fDPI$!~j2Iqm$xjqluj(m#e2IpW@XKmJ#c-CD7!9(LJ#H@LS{ymN(Pf}&BB&6Pl z3!|NU*vHK07_@plx?b`^k903waL}I#I#X6Lm!=oE$I%5{i|Cr2Y%u(Rf|ubJSlgo# zt;RLVXAI`!F2ng4`XOAw{lQvHneqxV$90$U7O1j$BxT(cg&sJKU)k^)Bl{Uk?5Y-1 zB~dGaxv=ea2tS_w23N;4NaLCfa3{Iup~Hl1ZyoMOGe|Z^hCsgtD{eqW-);kf&tXk4 zXj_H%x2%J*7I8R&@Q7htsN6S#CH_~9kByGOtKZ)s>(4icdmYAvqXXzHYf26F@5$k7 zNkPo$9>W^T} zOUh^?Qx*j=p>jkB^RsKhmkT%qTBM?lCFR@qn#P6w^F3+St4!B-Wjr?WZzX!g$qNcv)K_pu^`P6otCec8@B|8?aX-#WPAF|1Wjc&iRXjKEJ|G ziPz;9yRXaFX*5Ncmn-ojlm4N1&U+j@(vqjrj8a5G;5-*xBk zjd}#8w2r{%r|90Dyi#7wS3Fhb*C)r}{dKC0kqHw6xS$-rijN)BlHaVFg(+d}m>T(a zN?Bo;a|_C^Ysn`r?}(MN-7#pcJ9dm80m96H(J;N0VPrepUdy#aXJ>~aUg_N^n znSZZ;w(N0h~!U(gX`ylq#gMPM41=^j_ z=4qs+(>x})q|9f9r`z(|)(fTi`@U25&v!g&o1;)unFn6K+wucV+p<${CByCfWKel> z6on&84&w>ec6{;1Oj)ysIlFBp_Q5?BZq1m%6A!fGF{91#din|H7Z*=BLrgdqay-NM zp!e6$#$@FBYPH03_z@%y8)u);T93j3d5TCSNn>)=vEY4+EoAZcC?+KKk6`;|bl|QN&p_X0nrtuGf0@3cNzc5=47POO zzH6^TA)kZA@*KSQGYN#_qZ1(JS_gi~=rK&)V8sh#ta#}o4#Ky;Ik>E<1K)N2EmZVB zE&Km>THf($4i{k39R5RFhkt(400#oPF{8k4Y|~8I+aY(%Lb)|vSKMCP1gX)P5VR%} z#_;Z3hzvF5DxNxgLfA*pJ=%b=M;fqk|70iO>V(f3#ZfwZV0ATQ)@bu&Qmkgmgd1+A zY|Tj>ey6$uqDrQK3;FgvgbUOEg|L!4I=qTrs}3t^hQ-f{d9;|TaL@{i?wo}zqxbU$hjyS8!H!m}k?atD(1X9&eMM3MEDjRfDmpcT$ zkOwN6%k7oTBr*5w6keDQ;I_T= zcqTm`JoJMSoqi@lSCa@PtmYB?mZZmb_I-*S+-Qe~B>kAmg`fkI>2ptyn>AEpYNV~4 zA7m>#d_E0=<)mcHnXbnd`+me-+>#F@8%j=s@a}RNnEB}OAvEK;Y{*<(Ie0F1|2TyU zSF)!wNB#G^Uw2jEs~Rui^D;Yz=iJY*03`&5>o_rJ4J``>3J|EX=c z5ZtOQ-?vwf|0uD-5<64=pS>wB>z^tMl@{63MEY6m-P>~5mt)xD>oL^N>&1j}+FL!c zTaWwQ`;h&>xFy>|B5#FqA=fONZQiNJt$JBV2d1`Up=5vlEQRqmW-;|`dc1XYr8Mp6 zahyrEFV9yv_dX8{H|p_jyX~RxBNMJe0(94-FwbKn-j34aoiF->lTM!WOE*s%e3Uwt z$vIC~-Y!Uw_qn_mPI_6h&&2sa6c^?+MDnVodi>b63-BPV12|pm0BUDOGl9PvPMu78 zyrAM1_`4c$J@P#&3Wc^!i*S~Q9`Aan92T9ris>h>VrKCzg|Sf&;rDQQot>GCYO8oocul4g+l&Mmkg$F%03YIXVB zQBPrIkTn}l0y`{J=n}Mo8$HnF2|WrS{<Xr&t+WLKir?c%+%#eE?$O%ExYpf zMD4pa6V|5FXJE1}AG>Hj?4EWO2TnhWUPbqv1yvJ0$%eA{dZdPfNwYG0@Kc$U+8c7= z6P;gWETYelz6|EQQDVj=_yJ;^wRc7u<5G!(2M%VQ`aV@z1j1}RZ-}+l;kQQ0 z`0H{RM5UL(#^r;#;E*tsby3pcK8^RVHmDj`k%WDrOt`j|I)@*2;Jf=*V%*a9d=5E$ zbE3kp^B%12$qsxlou~FG*ag01XVz(jiAJg58${o?8yfNFT2rRF&Xf&2zY~O3mGQV_ zByHxoG@+k!g?x_G_885D-?6T|RmTqeV9N$vGLL5Ni8-B@3SIt0@*!`vx$Vn0cunh+ z{8jsuth|0C7vwXpyi1xkk7)B4$7=Ur1|(m1I|z?v?8coT+Pqt79-R-ZgRvy4(;0<^ zyJz6!P;K5}-#OgjOurxEoibj*h~`^ow$t@n!2?`Fl$QrFLB38o8TYmLEz4y% z%ccP|i26mwg@d{y*%|7NTKu37o_XGiZ6mrq%R$(6VLc3)uEpnkeJWqmK8B^FW-bST zHZw5HP>T=Fw~$Tu7;_U+d1SJJ-mEEn`g2Vl{P3}}?iw@jAjdj}GNEY$r&Xt!s&CJ%Elf&7jaoc35>a5@S;AhfHB!2FJyJlom}MtECsBXT(` z4+N`_Y_NZz!S713uwYwHycXLN-#gIE8mZKt%0|R$aD$B}VQ0s#ER!@{4O7^-CXy)) z*WkV@5G*R_jFU{w9?XSBFDQrgPkXMm=04P3Y|Bf@#FjxI{5ZJ=7GG-5b7xnA>aI6f zAO8k@pIimuP;>@%S=gSg#_OQFGi4AGdpCD3xN1%20bSbjFgokm{Jbq&Lk7BpC_JS3 z@{p2teA|>JhC3m^ zs5TJtRR_YS`DYchDd%tV)3$tUei^K1mduBIw;j)gfH4!_eGw?QbMIV%L_3_oqJ0?bdt~S*1E!AuoMAWk$Rb-uUj7+hr5 zhP#sqN9frRdD0Zlk`Ji!zu(v3iVhibuVw@fAh_FPx5-Djl!fBz4)v)YCLvu z1x||pAuT4Y69brFcq^FCJ)+7xud2d?!B%W9+2roc1-I@?dAEV8Jjme#jy_wLwfTHq zR`1g)Oo*v(%MadB;e~Ynr+S-ae@NrqA(Bwj@uljAD~yA@@Xqw4$Ff&)#(k|NQL0K9l^Hzft&j z`5U@iZ^0i=+K$#S*TIOay*8f-N5baw7p^V1!Ch}GKBL0#k!O2C6{g${=YyXp@edcQ z(e7C__9HjjIWgf>Ch%o*l=%5~kL5F)YaoSK4)#Vt%PySLGj8dc3@#H)xg+Uy$esy3-q`V!e?M?q%d4Qerzi9vh3A5}ko_ivr~Lko zdqavqXSW6GOrCu8QFwaNmv{dB4PQDw1!+)$+?m8@w&KFuaT@%~>#x}6Z50eLqsQb%JrLIOv)abdQh z8&90kfW|vgV3U>^k0<)W!kM7;Hj)>^d;B{j9#T3^!uuqqqX!p$Sxn;vUF&h;u@x{v zyBixse&?2e;P8R^kpI>qMD~Y`CvT(7ve?*gmbnF{3|8tq*tMt;nO7HVVCI z*YR+AH9DR5mcEwLnK|(;31Y%0x7DmFwhH@LKFRt^^QG!8`fT$#e=a20uVSk6-(jHY zHhF;c8JIx)f0!`gZtHIB-+;IHs7VzklxguH=EDl##eR6ywa>v4iBwCQpSy>u2%*PF7-qC^tM*uziIVort%y6lTNCuxR7!yn2mES z$Hd@9d~aHd%H3=6y~z?L9NWBtMYel_X7igcc;pwDMG|S(M+lqLg{9nnjLW)wKoyrJ zs2bV?uC32X!iHgIq|$YdP$R7hqaJ?1gT&}pH3-k+K41&Vka#fcDRx)>j!xvsMe2PZ z!$;5J4qr>LlTI<7*Qkd?qSGaq3B~6l`RX(G@!E`Q_@VA6ye30Ojp0JR$3)I&-ow9v zNAdHrYWzh$#b<$VrzQ_OYu-gUe>2Wc`Gs>yRg^slkIwXl^;m+-SI)-WBi}+YIq7Q6 zg`Wp{vR1yu_;hCv+>!DJj*)5IRxzO=B#l)nQTa$`?76pq`NK~K$FIL+^bRATZQ z-jTGz>nMynpO0fN(fPEu77RX9gVy9-)mSFfkDti*QO38X{unS#{(&9HcGVCr)a;Ao z8sDyCkM7Zszv4Xd6jEHJCfxl?LyJTd1TPFDHYO&@8GU^0Af}pG);6;XBp38+lWsBJ6 zKUuhW#A}#z=pFPYTUQ4#q4Y#J^Ni2LiEj0vrL08f21DCE?`jP9Y{;l zV3)|Nwba8!);zc38^Y3X#FcDFoP7ySk^IlyP&k;-4;xg@3_eQp zDE=$|EbHl-bA8f(UI-H!e@F7mo04&TxIMZuC7eqPM^53wg#$DAG3CP;cxMR)J+Wkd zBzpKq5KPoRp>fDTWEtDB--310PwGuJRMJ&AR_rL5HYQ=~?kDlYYHOZKyqnY%Jm0os zS@ZWJzRW`Fml=-McQYK5jAk*R=R|K-U6z3Nc9!5qE9!(Iy?p|?aG?!#*^b(W#_yk^ z$*S$LD>3ReiV0PVCoql7J?L|{3X}g?@MEOLI3I;ctM5VwtKFzv-++4SG(npji~A`H zHl7Xg)jjc;Ik5?Ec$=}CL?1dU{7p6BZCdWcf43WP*~=L?mz+~w#D$O>zFd7-99FD( zk2u1ZXOfP?gP34Svq4wNwqZ}dw-_3?8`cx8(?hsWym%zYHR^J956D9|*lCn1WXO&1e>!fmvp)_!SbRZ?2H&ZOT&pHlp5w zBe*la5)#Nf{gq63S+$&LK8nFjd^4V}ZG_8YZEhGBUJnUl&I8tCQqvq9FsuddN1Xc% zWkSEjF3f)4S`4hR#?&E23VVuAqp*?YbCiBW<6@uJa!D0s)RSqq2BQ#P&=(I+jzZ-v zQ{l4F1QCv7MD4Y#znv1v1isAC`9z31swI0ia@#UkK zcEW5Nv!McJK3J;ILW%m%$%WcHs0B|v7yAx6)pceMFsS0EeCPF4{HW0YUbEA1 zCeb+Ei3v&8op|Xw4?OUv5$d0`;@;Z2x0CisFF_bI`W5bL9)aH`Kcn80 zRJ0>69Q-6Pg;-DuJhI!3mP~9Kjr3Avm zLM!%&#En$uf-~jw^$D^=N2?)_D({uk$l+J7ody2fOxmMvi>oWzfPP^QF3863LFf|r z4ma$!!B!oQN_YOufkN`;w+9!hmEF0rsTJB7UUjyh-3N2hD>O=>79+U+xgOZDR6{;v zpNSWUT9hvrMz}BGH~X7na%Gl$FQg@ZK#Ct5F=6ICBi@x8=qPOIsn69(;>bZvcx47`@dRC*+I}Cl zdP?U!3lG4Z$!h3d`5gQ7%aSB=VxBz+rq2fAnMcYvw4fTh z()X_kkwcBSP!!UQe>w42-ZSC@F8&vTb4e%bMNAm^dI>*#_`AH2K9kp2cHmLO>vE_< z>Z1rgd0(Tvp{^0v4XS|6#MjP^2~}Diy#JP3IquVYdS6$889CbAfWqnZO$foS<+w}l zP+v!b>yUMQzhwxmlV0{ewUBxV|5adKa6IOcHhmjF@bBFO{?i`H+MXr&w$_vhY2PMr z;nCqqY{HllSuY_Qb%x!Ow25l>5GEWtNxSusFMpnL8hV7M>El|NOXcYW+&S^74Lp zKwU%jUgx{8lg!NvWkPUa81I&_OD@WL=3Jzw&x^^Jnz0HC?Ob_9SggFh{b?!a%WMoG zvtGOaAt~!Q=FEui z0O4QT6;RUBO5VA(9CYSsGd*&HF9f0D*h*B&HIRpRzJ;odtDuhj=xWA=<>}O^65dWe z+xk7U|76bFk;x{Dn7}tK7Mh=`Std=p!aOa8@D<%i$N(!4Q z2eXv7YK~3&wm@NrWcd!+`H|*XNzb==aQprmr>QG_z^lJ0pG^+crptm^?QVIA{Ke_T zeYzL?auS}9?$MM*OG1aX{xoAmyrw3zEeS0QE&GqI&Roi(?ZH2KEn?mzg#b0nU>6fyG z3DNbDOe4WYa@l(d*Y~=N8;Jdu8xBbgq-*e66uj!^K#cMfslP)xX86;b4yiX7i^41uUtHF8fi&mN8*HUE3tEt# zPDV@^=w-^^I;@gr#nz)^ur_lbmrwa{As}@jUv)A{vN3MNBQ~@jPg)j6Ghts{Bu_}& zAnn=Kg!c+A<3rMTb_o~4lIQWa8QY{)uRr4W@NR4zG1l#&Fq3!YedOIzm`Xi5ZP_Xb zUDSe6*rhfM!*Y_OWmc4dOI;cpN!h#cD9q1^hQql>rL37x@OI-8C?TEG4VYm3sRuil zb4DsUTZlon?O8BcA3ui+v1*Ii6#0T=a3~YMFKWiGq{rP5Cfs@!$x1S=N>gu~#IE|s z(TJR(ITb<0dmbx0&!q*^o{A3^!DG>TkdTsI%qiksu6=?C-pXl)d#r;rwS; zShuf4+H5-t{quV8RiyK`sVL}r1fc4shmxVA9-jJ=0H?{BF`b#vvLl`02U7o(cAng3 zxDpedCe7r+;@LjDdCqHT`(G>BAfhc7PHP5Izi1%4P4l0lM%PM42DZ+x)co)@DKwwO zg~9$l{6?Qfsa@}N(*BLsEQ$QNX`ry;f+-)-;ky)bxj`y@UL-#ux3|qlp|DpNmNxy7 z4r=#=^U7U$8nN;mkHXkPgQ2^RGR+fuLZfXtd>}LFnY~aPtdOwja8^HsL}ZhA^StE0Rq*)ei2xPX+xx0kQ$Ppt6t)$4Zwm11&8G zyPgBr{+iR7kvX%QX{C^p(U~~RE z`*IkcuF(@L-Rt1+rD_zOXjdq>UarLB3wne8y4O%P@FEJ8@;fKtaPLRiA2R#Gid$uH zv!w;gC)Zv*072?l0QMUFK+C%j4v#vYEzHp#%7wRy&dhtZ187~#g#ORFb0MZSmD+~=S2y}QK216XX za^bXlCxs6_I_&4RVK8*+I5=|MS3XSAeaD0FR(S~cJQ@l2KN>>gehVg?@9hmjecL4% z*Lf`b@_HaGIC&hs$+ap&E-cvEg|D13p7y^cOLeXvu%2wzT)>1CE$8qS``w@{ZqmSo z=Q=aN|G^qAOmT?h&QCnx$hL`c+lysVE0XeGFcY4e`EhNXX)yHJeL3Z=B|l3BsSi;I z_aDfk$9Te9-UVGFc7ZS_h5BYmL|q<+MbC!MIb(5^+IJ8vCXE;?m}RV@IsDe+hmtg2AfY7i4R8_YK7E&`M2lbCUyt|!R&zyK}` zj`C+K2KmCHv6PX$Z7Z6Q35%ncFmyU~<1ShbJ{GsJWA|nS@57YeN+M>?Wd3n0At?MY znm*8B!j0<&3cFl8vW=GmK-c~izT2P-Rb*zyQWV@KdO`K0AlSL47GIcJa$)%ddlZsj zFmC@63I!)WP}FEV2rsFFPw{`%s?~+_un36;JZo~yw^NUvNz{s!$8`_(*4`kq?;R-$4j^-^d zu7^i{FHv>saa1QccbXJ_w)>8695%q)r4KP;-D`z7$6QJHO8b9faU=9h%%^TVBPJYZ zu@8i0zKP&GWHT&%as>y)b(S26?Sk%HsHrt)sW-Mj_SIuJKD`GQEDXGuudK0R zGdJUKPpcBxO%@*t;sQGm$=cnd&WqeYZ2L6_+K_qU7BS&-(F)cyBo2o49*OQVEV+>N z$X=oBjuRWrcR=IgP8cM(iw^$4cTf6jSLYvV4`1iwmA-~F1`Z?E{39`dN z+LKzy?KdppbM+G7xIu|jd1nm1Bnzj9GC}iOB)8c}^L;^`;M6r$ev;fu@=>_*z?ZxI z+z$~aMu1jlO{PsGU0a2lqx$hf3l6{*??6y)-AZ9WTqX+hjBcQI$w9~{-VPBnE$FpO zdlj?RWeX;Wsu{Nj9ERN?$6$lTX@$p^3qknK^Pu2(GVC6c4vrVf6w3Dx;KHSBdsd=- z6cPvIL(U&lE_kk5#soDhUse%%3@)85g{nVR(g%`L9L0sQACb)a^>MiO;RU=ZHDHzG zQSW66=NBzye#1_}{R>qPaOE2Y66GEPxR4M$fMuRI1!MO#K;wZZY!bHK24VE|VxR#x zP!4H?izBR=pt5F0wou*fwsZ5m6lgk1dwg&F(TjLzW-F+eq~m*j7EbK?2-`3HM4_MY ze@rm=*o(I}psw$B_3*O00TZ%fmvABKvJdxMc^-PJyrn#W&XOS6M>8QNF_J$nNP}5W z0mW-fxG+0mmBQ2MD|xWdML09@4lG{$O5xA0!A!{LIE1qmmtdQ64kY{Ug`=b}ry7N_ zPxWY?dl?>XI1e?Gt+{ZsAypD8&K1a(T34V$$N|tWoS`uB;cgJD7jA=LGcy1!H^EzD zB_<5#-MC;+d5S@&u0jv%g>a<2GfyTPPRwRP#AQ#G+jI?f{uu~=4z-qlk|^a!E@V>f zQ|EzMu-&;W1SfW5!jcOi3T=~uSyV(e+<$*bYFSW+g6d{>F6fMRXN|csRQQ-k+WH$& ziyXDqWWwkqO}4ltht6FLv$MMOWP(qeCkl&a(dXxo97y@LT%J8_BYKest4$OZ=^CPU zR4!(=$b^N_{yg92CJa8c8sBH@bD{K8ltSlek-YcZd`PFyCBMhi2SS3ZC`+82-tNO= zcHe^er;g&*d{fv$YE&$Z@)WmyjCjKG^ABgjmfUc*@A_S^v1!Dr$;Mo8 zD-TkbU=_@|zq<#o_BG+;g&NW6@EQl!9OK zI~0`Y{M6s?F?8qtH&r5xtGJ&r@R?Nzw`dIcBi^j32F%nI-yACF4O_x|tbPNQn< zqBwx7G>1y{Rx+fBOqr?s>_ZYNWtLfnP!uK2gF>WGkti8L<{^Z-&pA>=GDJv}iUySi z%9wihxgUPZhnCi&;oj$*z5jn1&*f7I_XhJPUOjvd`IAGaTjfB)IXTENZfZvtHm2|c zWID~I$xjB!94;9HoPVkXo%^m7_Rbkd_twZUuKeCe;1)EGhfyEPpmjo%`0!P4!c9x) z!nj4&@+80VBgoC&FJ8JlM!bfeSKAP-a*i$O^|>6P*JesD)M_(MPGgIVd-E1z{HX$# zIzN-Nt;SAXB!44R=4f*$`S7t43gY4gpQVX1yN7!+?o*)$nO^bYq$WVUIT0{6PLFPzD$2E*(S z&{r{IoB|bq8yY>C=3c6S)~oTbDx_G(xLJ;ITZ`mbR8lSMy?F-emhFOiwBfo9;kKnr zWj`Xnfa>cE7`Yg89nkk0Pnn~CH!~HlIykf70mOIDkXd;-gm6Rg{_pOhdhm*S3BxX7 zjvV?I;mNqvZd;fdX@KEIrSRsAIpg%bYzUXt$Cmvz{tACzRKbm$Lo!3tAjUoTqzT-T7!6o2ZGwjvTVOc859RDv zG*GS%_mQNBn&C-oGyJss2yN)y2}{C#Uu#LuZES%#XR#Z8_dv#V`?f)5fr1+uIQbh$ zi)!F)RDOqx+HWAs+k|n6x8@P< zukSq4^;#CxNSW@FU#Zi~h`A`43zu><*hk6bNU( zC75w*!b4cey+5#e(tTm?=Dv*6u~|nrd#&{>AMYyOXigUjkA9SSWH*6vn;IrCVQ4#8 z&jl+tPX*$Rnw{%`GYf5?!^+yhgpCxBAMMAupI(NPOQ|%X$ua*RaZ!d?H1@B+Dd&!) z+yIpk5NX)~20vBk#tB^rH+4fBa1BlPwfo!wX6MGzkvol<1$r(ok@-BsioA&Kgv_xk zX|AI-aCT`M2&b!z47!jdfjg*A>rdeBYU9rV>T)E6gt~Ph&%F*);4Z|Q5w44k8R@@JjtB;MwBp=A z#yK?SQf@om|M{iLkzc!C(UNZ~pcpAzrU+d4*26+%qa68kr<6V(Ukr~>zj0nN2L)d` zYl1wHVn$kpWH94C?og7k9;L#H!sJPiW&=I_XD@L1udNBUv7Be4%affYO*CZ+1#a#s zcgA_QY+{|=6o_723r*Q<&bU^^V8Y1-V?M(i1rkuuObrt*f&sd@*@tmCZN5x1L4nLt zX`~9`G2kll<`XV&sxvb$#*bBD7uKV}OdXw^W-K${vI+aGk8_G?6|_L<8F2qC%#!7r6xnv0_$2S5o}1fOak$$T*w%{**g%!wW9I>Pki`+@p~$ z-(WX7cUOsUMY|Nqf*y)wPSZ8ozg-nfk?(M8#wo^5CO2m&65H)3XwR{Im^QK<>`u4< zD|hlZT#+>I*hj6OsuHfKF_>{9PN@=Rb0CEaB-xv;D#sFig-Ka!5V2|Y4 z;&t=|D&O}-CS}|wns1~`HdY4<% zB<7Yodl=kExa0Z(XLRhK_`8K==&SZBXXHmO)cgDS}>P9|4R3YSC86>?N$c`c( z_o;+ynLU*#)v6Fr^=f$N7Y>imyIOa~bym7#*A!-gjcI_7+iyYzigXDfTv=cUDekXI zR39|K&ZfbPyXzJxb21~4+!a(wf4n2|jw+T(+pwB&roUH{SqoLkw~l6bWIjZuXy*jR zCE@*TvZpHUy*GmUnm&w+uWbje(z+9l?@}e&d0!xQoF+Mde(qdPxsbsg;GC>VI;}oI zXuZ9-AE{Tl%PfC7SA2L)l_dL@K>N`y>>sjRd!n5(?pgur{dI^2`e10qxK0xZtHkqM|Auk!Lt@0*P(!Bz;TC`E%EaMn z#Kp851Q!l~?dWmdPRdnDBB|pzHQY z2*KOU5H_tQgaqK{eD`uD_4O#H{z%)ygK!0=o}|b|jbz=}N)wiulSAltkC}|?`+6p+ zouo$MzTkP{$;WgK`g_}ma2fl0lRH*w!0;lH8P~%6-wQW zh!jn+|1NNc0{;q8!_-LcN-1siHehY&^=Jd&8q#!Vw5b|7y6-WqJg*OB=+>ealq-4t zl-e7rkusIn^xxVS(2i!t^e3FwP-B+YU5$)gQAW=n8qBys%Vx`TDRW|S@@nKvw`$s7 zrwq94^;-xR_QI3>`L0U5O6%#qpA|v^s+ktXxDVAKEd8@8c^KG4rG7nG7Fu2tOt^OJ zei~e)O3DIS=$=4h5`}){ZeW~u@AYiueO2N!q=ouuY^7U}U;0$S9qVnw7G6~)7xkNH zk@{)+0%^_EVH~{DX5Eui$#l(nY8*0<^hc{r(}DZqc9rhlsY>R2{7h#pQ)EtPZ`D1K zyCKaGb39Z@;!J#IKK@)%fW9OTqMT*mFvwY;O7_lsMVrDf^BkQ$^it+gXA$he-#vbq zi5Bf+&Nw?WW0^^qKi}O%l@#{PqGegR@Bxi7aU|SlS0}PqS(Qw=eTh~GCfK890y^%S z80UE1gKVr*Arjn)+`INa7LDu-g9a|LV)R7l6Ay;Rwz4^cuwi&?MaZE3hDXHl*Y6VB+Bz!2=9LG zm-ZG0$si#O+4dJ0_efK~J$7ZX*iiwFj_As`$MG(N`*y&E9kx&= z@7WO0_+Uo5BRbZPad&6u`O*PYVGnD51<dp5rW8>j#DpdQp8e zQ`?VmV;5kSLYfkJ7rqZtcj}PSDCMM!%$@OL2ye40gGruc=RV}b!MUu>?*P(=S$Bvd}e7~!t+YEiw z`!jAzroW8ddw zE@byXL&*Krm*t?(hr(nkeM4EF*o4t=(NrI9L{WG^}ypN#*H$#_O`6fUcMhk0|FsXxwL`yi(y&qdCw z@R9Is+BbN#w}m#V6u}RaT~Q)(neWO)r-&AqsMtbt%nKw6Lkc8IGg5%le{-A`NSm=o zrIE^K*V2xAwKV)vr%XKNYHh$yXHi;5Pa0uwGJ2h7E>nmbyF<*IKpuPi3`;ec5nAct zD3hw>$h4O?LV0~Dol#>41Vt>{K)9T^^~~(RSGZhVL}OZZzz(!CCV+8TYy8>zdkxU# zc0RqH_aDnZFRzCYF10F@eQ2zQ2~Tlcv3vj-j&g4WGp@2FkVW*Whs#~k>8Jds^ealv z^CX<`ViQ|sTL*H^sq{)=i*)$Q7U>u~3*d6FlP}2g3zV21q*u3A!3C6WIe~DQM&npf zLM;sUiJ+xD%-KieuB0X7-P)bGNo$}iat-~bp-Z@=1CN0Fc|Mokd0!1wV-nS}^QG!& z*JLM|XG5@qr?m>YcNoyF>9gpM>$9kL)B`JSX|p))qfQm9I$A4M_;)AOC})~AaNS&| zK|jf7u$p~Xj8?>6b)-Hfn{ry?a=>-@CwL#$Q(WSNXLINn)gW9;P&bkuSP6}1_gYPk z$QHHGTbI#{JNJ1s>6K6c*+Yg2Nlq7N99lVGF5!0i%q6ETm%|~qbHcWhy@@}P|L(@P z@LujDCg&scecUQ^E9lSEk+f?7;qGe&koRxP;Py~su=@M}EYXE}Jg-4LszOP8T`3&y zm}xjLX*DOzhM@K=rSk@MOFhd4Sfg zSR!+J!V=K;QZ;+;@Be!%GJdbELko zK;-_Od?Z9oe*-R(*YKvd9xFzPtrtWtv-64=KJzsw;lKa=_*f`K4bojQs|zBj{Olqq zdhr=P?ooiR$oyj|?xd8`thO@ReeNq5wWkiMlmE~UsQ-CA!u1{hAG)d?994(I(t6h@)j*%r)Ir?dzf$W$aWtTqu!S8j4LT| zXI*DLhnK7w{1W9M1C)}C`{;cctXYgcFBb*X`(L<=ORw(1M-TgX%WNs~WB3)KwTYK=p5a3S4>ocOm-j zeONYg6C6zGLk^&tGjWtFJRA%1XR_hcZ9CYRZpL<@=F&>wPUTm?l>PT$1sw>1Q<@W%+CIJchPzm0yF%?Z3^*p71APMj9VcMB{6UAK;Jf;ONqTC>Yy-(K*Bj4 z4Io!;--cqUO3$n=fvf1t0Z+zV{^3E`;S6xvIGk$K8#8s(`^GZDT^+lO+}m~wl#^%E z3aJSxLps*BjFYRJN;2l%gq6p%o!8UoraLOkA018%rCduz2rR#U6;3ML z!WSf*bwFpkJrKB+qjLnOq$^OZmQ6!e8nE3cBhORdY&3mD2k*6o7xz|~K=Lw)*PgreqBnxAx@7NB;Ee=;uB9W<@& zJZwMrncl3`A$L&a{ys9_PxZxa&T|mnyN>R_{Mitsc+*m*w9|^MIF<$(T8;EnyC!Cj zYm%rfb7WS0pUWCN&%)Oo&D3pG3Y~-0=d5L%PuF!UdGZ;^leW;jz4Bsbl)SjB!;5fb zZ?`gE?bD!C+Dup2WP&ephCs#{jt*uam8amZX%qc)NuL#?*}sAb_Y|N1ZeKqM6H@Bw z@(y$2iq4D-WSp{9Ff$1|0qgHp)5^C!SSj-A;Z3+b+CJ>j%;TU(%4x-g6yUOp)-tZ| z!*%SOVG20hFQ&gF$MM|jxWv0`F5!~X=d;Jv$>7hP(}{zx&>84ciom#k_Jj>jPlDiC z59k#^o18`}$tE(74F<6HK}SL5{arex*o--$ZEi|38*V7GLfa#d9eSCXz0)R!=*)tr zc;ERHA_JaNea%Gpaq~Des<}=lpm~~6GI#R!VwP$GH0sCFdzbqRj4}_v?tnIN$jC2XiB<;U9RTtg zr$l~-?1#(UE{PF7qv(8eFB4~uP$usG*-qI9)9a^*3Cne;E4ou_h2M)-#3|5Iqdb#xTiO8o^t`@tjv zopRp7xZVMqiMG=o_*eZ<*srb0cB9UQ0K)aC^(RboH=MOnhIQSq!bWskJB)G9x?pB; z;Vuxv%%Qq+iuemH3=SjQ*lgVG#Am;Ir4HcVErN!loAN}T^hxx`U4}f^R~$u;p%Y>MfIAY_4ikI&g86dXbN-3Xq)0b4mvW1+ z|L<(ttRHe6zX!N8I9C{^>;;NzDj;s@0CE_~JL^*}``TIAp7%7<8Gw#tuJ9g)?Go+>A3_#IH+KQCv62f)R#VoP^ z0yw2w45}Xs#6?JV)dt2{FJ6zGgL9#M!E*@r%7FD~M6);Hu7CAn(dx6|bJPRq`nenH ziPRPZ%B)`(z^;Tkf&=DC%Hv*3+b#T=z&=@S8Rie3`EC#E7GD9SyVz-s-rD1wADZ_o zlxyLSld``#Aby@`kDnYr{RQrqOuxX7vg?5d*;7^Lig zU3S{A1NnJuA>5{zEo|id$q<|F2D#>q!e{g~-IZ~Dd#__>#}Y9AZ3q2QZ&59zw{a2S z{u(c4M&~84b?sotx`$`g$oAz7##z0vV+V~aA=OA3?oBae>F8Vk34~kgGLab_7!Q(7 zkA$fzW@H}nPBCSiiuOR3t}qr31%(Td8rsYc9op4{aQ}?8*m~bl@HVnuQoFDas+l>nT1a~upi)C>F{?4b`frNDXQG%A;JvlX+UP0avo zPamd65~=8irmHmr=h@K!aohEv?*3_dbZ2*Z2btg2VBCwz>g4RNp73*EI%Yd$Kn7Zj zxhUM7Q+eez1cPEkJl^QVX z&kJhNZ6q^8wmWCZyqf4l6iQSE`l#Q( zbuy==uEh9RSJ*$fnoc!;39FE6`DVhUo%SUCW?(<1MLn%Ou!!D7qhI?nZtt;eBxO&h za518hesR8;wPEhftmh>`gj;tekSq=VBh*GUQ^^JwSd4tyu=@}FWFaIzs7=_K(L$%! zV!k=@NeClcSZgR|BQ^_TI-BXF%I*Zv@2O#o%XADS(LVLUjPxd|re(%75%diqT+a_d z#C2=6ATDjd`MD9q5-t1T&t$Ink*2K`f=_TQjhH=%?MKXHE8%M1dJ!|<4}!J&Cz?}) zdr;_G)<(v;c)Anwz_-GgB_F8Xs!}=zX}(=eIQi&R(~DeSjR*A1Fsf`^k(ez&(KX$8v1T&ST(#I`)hvoXzx6#QP!@Qf)3$|CtSR3o=i+G9xx;E+{IepCOcO{@1GZh zpP$xIu;{}^pk%{`l>3PHe@A_ zrwF{OM|nvqOj=Cr7#d)Wx0_WhGcC9e~Sz068ds8FoCO&{h3e z{+E%0#h_#Gr`$rEgDi|jFfMe!aHi%vNSOZmJh)w(Yd8@MrNo*p!$-XQEEmnS`^v;=tb8Xb7R@kKwmT9sFln z2h)n?GtNaapJmp|3!wZ8{=2Qh)KTKbWrQ35dnr3Q>bvB??h+Ult4qe9oKb5S_q1v? zGfpa(tTCzp3x{587z#CaBV0^ZH?~acnWXk#H5_a;AhAeyktgHcJA1NOhq5HT^XuWy z2Q4O7s>R}Sy$NSu?ak(yotM-PZ-kTEFe?|`^!8=kpKHF%Jug8rvu6uv8GWR~P=~IKRtjXN0g3|A^$A zTr&(XZ4_>qGzz(vp^TGW3T1lfy(EPj8bDofuho;zD65v;p@e&g`Jb!Rnyj4d>%iE$ zU35Z=@b7RGGo9qVp0#qDi)TodUN8o=;@vDaBtL}38-i8e$}*_?cZF7>LztWGTj`zsA;Q0{3 zGkTJE^y`F=Ovra17Tzgl4KI;Gu3leu6ZKu-B~z8)#XM)rOJ^irhlf7~kT=LH%|oW; zl?QVPA0W;9c?Je13}X7|W|EtXZMqvvh?_38@H+xqMw=0TG-sl#jN3$4=Cs{i3JK9L zroxzwK4K+0Kr{7;h%BR*$_Oi$vc{l9so#wiux7Rf+kiYB7s^=m zSjbLfpO;>@u!f5Tf8Y?hRy3P%AvsQa#R3z!(pXHNplVYG#?8;OXMgkxq&>GN zfJyKTP(W*KYzgt9BG6Z5qDfJi*!9L}#w}bsn*I5qEPg0GZn@&&7s-qVUnE^@hT$CJ zFyg8?jICIrDX#k5E;R^p5Xu4_1UEL2aS>MrvMU+-;aMY{brPoT8E#`=0B~kRdqCDwD+M}u{w_L=16tY;{ zYkQdfd#cJ>(fRyh;GP_OPjjcP5}(sly2(J3c%n7u3MhB$5OnhUcG_W4y$^I+^s1iUE0smd(0FIknAq=ux8pQPnJ$ev0bFno;|}3&0(p zc$o(N3llFXKBeDsj7SA?TXdXq#WPOPvo$-!)2^@Sx;i7~k9O1^1TG`>FuhZ-Ta0u3 zK;s4(k?p9oD2j5E>|*G(OVQ%h~9^{KxH3TDBc*^mRlozWJYYO4T!QxbaE)=H5nX zl)aHAD>O;CTelxchpl)ies7PbFEbZH6uNXHQ_9ucKOzly^;*=8iKNF2Z0LKWskK+a z&D2;W?PL8;+`7S=79Sf4=_pN@B;~Fc^p+Z2#QetB&a}|jn0`XSyc#R+>yF1+%e$A0 zn+{mg{oXy{AiCHvDT|wQY;{(n`zJAObZ@GAUxl`1t5CO&ftj4yp68i1x2wfHQ|0Nb iD{>Hm9v$+w;y%9rc6UYd7g47@U0h%GSNvT1SNtDsY_^#I literal 0 HcmV?d00001 diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index f9e2a19d0ef..8feab6ba496 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -114587,6 +114587,28 @@ ], "uses_polling": false }, + { + "args": [ + "test/core/transport/chttp2/hpack_parser_corpus/clusterfuzz-testcase-5298216461402112" + ], + "ci_platforms": [ + "linux" + ], + "cpu_cost": 0.1, + "exclude_configs": [ + "tsan" + ], + "exclude_iomgrs": [ + "uv" + ], + "flaky": false, + "language": "c", + "name": "hpack_parser_fuzzer_test_one_entry", + "platforms": [ + "linux" + ], + "uses_polling": false + }, { "args": [ "test/core/transport/chttp2/hpack_parser_corpus/crash-5ac3e1ea7764cfb6383629574262f82dc7b3cada" From c04faa8c03f37f71cdc1ee65c3291a78a928341f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Mar 2017 14:01:51 -0800 Subject: [PATCH 021/186] Update comment --- src/core/ext/transport/chttp2/transport/hpack_parser.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index b2f364aa1a0..e26ab87ca7e 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -1620,10 +1620,6 @@ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx, grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, grpc_slice slice) { - /* TODO(ctiller): limit the distance of end from beg, and perform multiple - steps in the event of a large chunk of data to limit - stack space usage when no tail call optimization is - available */ p->current_slice_refcount = slice.refcount; uint8_t *start = GRPC_SLICE_START_PTR(slice); uint8_t *end = GRPC_SLICE_END_PTR(slice); From e9c83c566c5b193c856a14c86e5a150b2925cc86 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Mar 2017 14:12:07 -0800 Subject: [PATCH 022/186] readability --- src/core/ext/transport/chttp2/transport/hpack_parser.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index e26ab87ca7e..d94f66001d8 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -1620,12 +1620,15 @@ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx, grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, grpc_slice slice) { + /* max number of bytes to parse at a time... limits call stack depth on + * compilers without TCO */ + const size_t max_parse_length = 1024; p->current_slice_refcount = slice.refcount; uint8_t *start = GRPC_SLICE_START_PTR(slice); uint8_t *end = GRPC_SLICE_END_PTR(slice); grpc_error *error = GRPC_ERROR_NONE; while (start != end && error == GRPC_ERROR_NONE) { - uint8_t *target = start + GPR_MIN(1024, end - start); + uint8_t *target = start + GPR_MIN(max_parse_length, end - start); error = p->state(exec_ctx, p, start, target); start = target; } From e57cd90c11285c8643bbfd2fb778093129806ac9 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 2 Mar 2017 16:13:46 -0800 Subject: [PATCH 023/186] fix channel connectivity state function --- src/ruby/ext/grpc/rb_channel.c | 20 ++++++++++++-------- src/ruby/spec/channel_spec.rb | 29 +++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 84e43d3f7bf..a284852500a 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -175,19 +175,23 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { /* call-seq: - insecure_channel = Channel:new("myhost:8080", {'arg1': 'value1'}) - creds = ... - secure_channel = Channel:new("myhost:443", {'arg1': 'value1'}, creds) + ch.connectivity_state -> state + ch.connectivity_state(true) -> state - Creates channel instances. */ + Indicates the current state of the channel, whose value is one of the + constants defined in GRPC::Core::ConnectivityStates. + + It also tries to connect if the chennel is idle in the second form. */ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, VALUE self) { - VALUE try_to_connect = Qfalse; + VALUE try_to_connect_param = Qfalse; + int grpc_try_to_connect = 0; grpc_rb_channel *wrapper = NULL; grpc_channel *ch = NULL; /* "01" == 0 mandatory args, 1 (try_to_connect) is optional */ - rb_scan_args(argc, argv, "01", try_to_connect); + rb_scan_args(argc, argv, "01", &try_to_connect_param); + grpc_try_to_connect = try_to_connect_param == Qtrue? 1 : 0; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); ch = wrapper->wrapped; @@ -195,8 +199,8 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, rb_raise(rb_eRuntimeError, "closed!"); return Qnil; } - return NUM2LONG( - grpc_channel_check_connectivity_state(ch, (int)try_to_connect)); + return LONG2NUM( + grpc_channel_check_connectivity_state(ch, grpc_try_to_connect)); } /* Watch for a change in connectivity state. diff --git a/src/ruby/spec/channel_spec.rb b/src/ruby/spec/channel_spec.rb index 740eac631a3..a289a00f043 100644 --- a/src/ruby/spec/channel_spec.rb +++ b/src/ruby/spec/channel_spec.rb @@ -153,6 +153,35 @@ describe GRPC::Core::Channel do end end + describe '#connectivity_state' do + it 'returns an enum' do + ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure) + valid_states = [ + GRPC::Core::ConnectivityStates::IDLE, + GRPC::Core::ConnectivityStates::CONNECTING, + GRPC::Core::ConnectivityStates::READY, + GRPC::Core::ConnectivityStates::TRANSIENT_FAILURE, + GRPC::Core::ConnectivityStates::FATAL_FAILURE + ] + + expect(valid_states).to include(ch.connectivity_state) + end + + it 'returns an enum when trying to connect' do + ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure) + ch.connectivity_state(true) + valid_states = [ + GRPC::Core::ConnectivityStates::IDLE, + GRPC::Core::ConnectivityStates::CONNECTING, + GRPC::Core::ConnectivityStates::READY, + GRPC::Core::ConnectivityStates::TRANSIENT_FAILURE, + GRPC::Core::ConnectivityStates::FATAL_FAILURE + ] + + expect(valid_states).to include(ch.connectivity_state) + end + end + describe '::SSL_TARGET' do it 'is a symbol' do expect(GRPC::Core::Channel::SSL_TARGET).to be_a(Symbol) From 9f4986603caec7ff569158ed07d9c201dbc00ccb Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 2 Mar 2017 19:20:07 -0800 Subject: [PATCH 024/186] add in background connectivity state poller --- src/ruby/ext/grpc/rb_channel.c | 219 ++++++++++++++++++----- src/ruby/spec/channel_connection_spec.rb | 93 ++++++++++ 2 files changed, 271 insertions(+), 41 deletions(-) create mode 100644 src/ruby/spec/channel_connection_spec.rb diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index a284852500a..ccdca15c988 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -32,21 +32,21 @@ */ #include +#include -#include "rb_grpc_imports.generated.h" -#include "rb_channel.h" #include "rb_byte_buffer.h" +#include "rb_channel.h" #include #include #include #include #include -#include "rb_grpc.h" #include "rb_call.h" #include "rb_channel_args.h" #include "rb_channel_credentials.h" #include "rb_completion_queue.h" +#include "rb_grpc.h" #include "rb_server.h" /* id_channel is the name of the hidden ivar that preserves a reference to the @@ -74,8 +74,22 @@ typedef struct grpc_rb_channel { /* The actual channel */ grpc_channel *wrapped; grpc_completion_queue *queue; + int request_safe_destroy; + int safe_to_destroy; + gpr_mu safe_destroy_mu; + gpr_cv safe_destroy_cv; } grpc_rb_channel; +/* Forward declarations of functions involved in temporary fix to + * https://github.com/grpc/grpc/issues/9941 */ +static void grpc_rb_channel_try_register_connection_polling( + grpc_rb_channel *wrapper); +static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper); + +static grpc_completion_queue *channel_polling_cq; +static gpr_mu channel_polling_mu; +static int abort_channel_polling = 0; + /* Destroys Channel instances. */ static void grpc_rb_channel_free(void *p) { grpc_rb_channel *ch = NULL; @@ -85,8 +99,9 @@ static void grpc_rb_channel_free(void *p) { ch = (grpc_rb_channel *)p; if (ch->wrapped != NULL) { - grpc_channel_destroy(ch->wrapped); + grpc_rb_channel_safe_destroy(ch); grpc_rb_completion_queue_destroy(ch->queue); + ch->wrapped = NULL; } xfree(p); @@ -104,13 +119,15 @@ static void grpc_rb_channel_mark(void *p) { } } -static rb_data_type_t grpc_channel_data_type = { - "grpc_channel", - {grpc_rb_channel_mark, grpc_rb_channel_free, GRPC_RB_MEMSIZE_UNAVAILABLE, - {NULL, NULL}}, - NULL, NULL, +static rb_data_type_t grpc_channel_data_type = {"grpc_channel", + {grpc_rb_channel_mark, + grpc_rb_channel_free, + GRPC_RB_MEMSIZE_UNAVAILABLE, + {NULL, NULL}}, + NULL, + NULL, #ifdef RUBY_TYPED_FREE_IMMEDIATELY - RUBY_TYPED_FREE_IMMEDIATELY + RUBY_TYPED_FREE_IMMEDIATELY #endif }; @@ -159,6 +176,18 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { creds = grpc_rb_get_wrapped_channel_credentials(credentials); ch = grpc_secure_channel_create(creds, target_chars, &args, NULL); } + + GPR_ASSERT(ch); + + wrapper->wrapped = ch; + gpr_mu_init(&wrapper->safe_destroy_mu); + gpr_cv_init(&wrapper->safe_destroy_cv); + gpr_mu_lock(&wrapper->safe_destroy_mu); + wrapper->safe_to_destroy = 0; + wrapper->request_safe_destroy = 0; + gpr_mu_unlock(&wrapper->safe_destroy_mu); + grpc_rb_channel_try_register_connection_polling(wrapper); + if (args.args != NULL) { xfree(args.args); /* Allocated by grpc_rb_hash_convert_to_channel_args */ } @@ -191,7 +220,7 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, /* "01" == 0 mandatory args, 1 (try_to_connect) is optional */ rb_scan_args(argc, argv, "01", &try_to_connect_param); - grpc_try_to_connect = try_to_connect_param == Qtrue? 1 : 0; + grpc_try_to_connect = try_to_connect_param == Qtrue ? 1 : 0; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); ch = wrapper->wrapped; @@ -229,14 +258,11 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, return Qnil; } grpc_channel_watch_connectivity_state( - ch, - (grpc_connectivity_state)NUM2LONG(last_state), - grpc_rb_time_timeval(deadline, /* absolute time */ 0), - cq, - tag); + ch, (grpc_connectivity_state)NUM2LONG(last_state), + grpc_rb_time_timeval(deadline, /* absolute time */ 0), cq, tag); - event = rb_completion_queue_pluck(cq, tag, - gpr_inf_future(GPR_CLOCK_REALTIME), NULL); + event = rb_completion_queue_pluck(cq, tag, gpr_inf_future(GPR_CLOCK_REALTIME), + NULL); if (event.success) { return Qtrue; @@ -247,9 +273,9 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, /* Create a call given a grpc_channel, in order to call method. The request is not sent until grpc_call_invoke is called. */ -static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent, - VALUE mask, VALUE method, - VALUE host, VALUE deadline) { +static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent, VALUE mask, + VALUE method, VALUE host, + VALUE deadline) { VALUE res = Qnil; grpc_rb_channel *wrapper = NULL; grpc_call *call = NULL; @@ -260,10 +286,11 @@ static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent, grpc_slice method_slice; grpc_slice host_slice; grpc_slice *host_slice_ptr = NULL; - char* tmp_str = NULL; + char *tmp_str = NULL; if (host != Qnil) { - host_slice = grpc_slice_from_copied_buffer(RSTRING_PTR(host), RSTRING_LEN(host)); + host_slice = + grpc_slice_from_copied_buffer(RSTRING_PTR(host), RSTRING_LEN(host)); host_slice_ptr = &host_slice; } if (mask != Qnil) { @@ -281,17 +308,18 @@ static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent, return Qnil; } - method_slice = grpc_slice_from_copied_buffer(RSTRING_PTR(method), RSTRING_LEN(method)); + method_slice = + grpc_slice_from_copied_buffer(RSTRING_PTR(method), RSTRING_LEN(method)); call = grpc_channel_create_call(ch, parent_call, flags, cq, method_slice, - host_slice_ptr, grpc_rb_time_timeval( - deadline, - /* absolute time */ 0), NULL); + host_slice_ptr, + grpc_rb_time_timeval(deadline, + /* absolute time */ 0), + NULL); if (call == NULL) { tmp_str = grpc_slice_to_c_string(method_slice); - rb_raise(rb_eRuntimeError, "cannot create call with method %s", - tmp_str); + rb_raise(rb_eRuntimeError, "cannot create call with method %s", tmp_str); return Qnil; } @@ -308,7 +336,6 @@ static VALUE grpc_rb_channel_create_call(VALUE self, VALUE parent, return res; } - /* Closes the channel, calling it's destroy method */ static VALUE grpc_rb_channel_destroy(VALUE self) { grpc_rb_channel *wrapper = NULL; @@ -317,19 +344,20 @@ static VALUE grpc_rb_channel_destroy(VALUE self) { TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); ch = wrapper->wrapped; if (ch != NULL) { - grpc_channel_destroy(ch); + grpc_rb_channel_safe_destroy(wrapper); + GPR_ASSERT(wrapper->queue != NULL); + grpc_rb_completion_queue_destroy(wrapper->queue); wrapper->wrapped = NULL; } return Qnil; } - /* Called to obtain the target that this channel accesses. */ static VALUE grpc_rb_channel_get_target(VALUE self) { grpc_rb_channel *wrapper = NULL; VALUE res = Qnil; - char* target = NULL; + char *target = NULL; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); target = grpc_channel_get_target(wrapper->wrapped); @@ -339,10 +367,119 @@ static VALUE grpc_rb_channel_get_target(VALUE self) { return res; } +// Either start polling channel connection state or signal that it's free to +// destroy. +// Not safe to call while a channel's connection state is polled. +static void grpc_rb_channel_try_register_connection_polling( + grpc_rb_channel *wrapper) { + grpc_connectivity_state conn_state; + gpr_timespec sleep_time = gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); + + GPR_ASSERT(wrapper); + GPR_ASSERT(wrapper->wrapped); + gpr_mu_lock(&wrapper->safe_destroy_mu); + if (wrapper->request_safe_destroy) { + wrapper->safe_to_destroy = 1; + gpr_cv_signal(&wrapper->safe_destroy_cv); + gpr_mu_unlock(&wrapper->safe_destroy_mu); + return; + } + gpr_mu_lock(&channel_polling_mu); + conn_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); + // avoid posting work to the channel polling cq if it's been shutdown + if (!abort_channel_polling && conn_state != GRPC_CHANNEL_SHUTDOWN) { + grpc_channel_watch_connectivity_state( + wrapper->wrapped, conn_state, sleep_time, channel_polling_cq, wrapper); + } else { + wrapper->safe_to_destroy = 1; + gpr_cv_signal(&wrapper->safe_destroy_cv); + } + gpr_mu_unlock(&channel_polling_mu); + gpr_mu_unlock(&wrapper->safe_destroy_mu); +} + +// Note requires wrapper->wrapped, wrapper->safe_destroy_mu/cv initialized +static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { + gpr_mu_lock(&wrapper->safe_destroy_mu); + if (!wrapper->safe_to_destroy) { + wrapper->request_safe_destroy = 1; + gpr_cv_wait(&wrapper->safe_destroy_cv, &wrapper->safe_destroy_mu, + gpr_inf_future(GPR_CLOCK_REALTIME)); + } + GPR_ASSERT(wrapper->safe_to_destroy); + gpr_mu_unlock(&wrapper->safe_destroy_mu); + + gpr_mu_destroy(&wrapper->safe_destroy_mu); + gpr_cv_destroy(&wrapper->safe_destroy_cv); + + grpc_channel_destroy(wrapper->wrapped); +} + +// Note this loop breaks out when a single call of +// "grpc_rb_event_unblocking_func". +// TODO (apolcyn) does a ruby call to the unblocking func +// necesarily mean process shutdown? +// In the worst case, this stops polling channel connectivity +// early and falls back to current behavior. +static void *run_poll_channels_loop_no_gil(void *arg) { + grpc_event event; + grpc_rb_channel *wrapper; + (void)arg; + for (;;) { + event = grpc_completion_queue_next( + channel_polling_cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL); + if (event.type == GRPC_QUEUE_SHUTDOWN) { + // TODO (apolcyn) is it guaranteed that this cq is empty by now? + break; + } + if (event.type == GRPC_OP_COMPLETE) { + wrapper = (grpc_rb_channel *)event.tag; + grpc_rb_channel_try_register_connection_polling(wrapper); + } + } + grpc_completion_queue_destroy(channel_polling_cq); + return NULL; +} + +// Notify the channel polling loop to cleanup and shutdown. +static void grpc_rb_event_unblocking_func(void *arg) { + (void)arg; + gpr_mu_lock(&channel_polling_mu); + abort_channel_polling = 1; + grpc_completion_queue_shutdown(channel_polling_cq); + gpr_mu_unlock(&channel_polling_mu); +} + +// Poll channel connectivity states in background thread without the GIL. +static VALUE run_poll_channels_loop(VALUE arg) { + (void)arg; + rb_thread_call_without_gvl(run_poll_channels_loop_no_gil, NULL, + grpc_rb_event_unblocking_func, NULL); + return Qnil; +} + +/* Temporary fix for + * https://github.com/GoogleCloudPlatform/google-cloud-ruby/issues/899. + * Transports in idle channels can get destroyed. Normally c-core re-connects, + * but in grpc-ruby core never gets a thread until an RPC is made, because ruby + * only calls c-core's "completion_queu_pluck" API. + * This uses a global background thread that calls + * "completion_queue_next" on registered "watch_channel_connectivity_state" + * calls - so that c-core can reconnect if needed, when there aren't any RPC's. + * TODO(apolcyn) remove this when core handles new RPCs on dead connections. + */ +static void start_poll_channels_loop() { + channel_polling_cq = grpc_completion_queue_create(NULL); + gpr_mu_init(&channel_polling_mu); + abort_channel_polling = 0; + rb_thread_create(run_poll_channels_loop, NULL); +} + static void Init_grpc_propagate_masks() { /* Constants representing call propagation masks in grpc.h */ - VALUE grpc_rb_mPropagateMasks = rb_define_module_under( - grpc_rb_mGrpcCore, "PropagateMasks"); + VALUE grpc_rb_mPropagateMasks = + rb_define_module_under(grpc_rb_mGrpcCore, "PropagateMasks"); rb_define_const(grpc_rb_mPropagateMasks, "DEADLINE", UINT2NUM(GRPC_PROPAGATE_DEADLINE)); rb_define_const(grpc_rb_mPropagateMasks, "CENSUS_STATS_CONTEXT", @@ -357,8 +494,8 @@ static void Init_grpc_propagate_masks() { static void Init_grpc_connectivity_states() { /* Constants representing call propagation masks in grpc.h */ - VALUE grpc_rb_mConnectivityStates = rb_define_module_under( - grpc_rb_mGrpcCore, "ConnectivityStates"); + VALUE grpc_rb_mConnectivityStates = + rb_define_module_under(grpc_rb_mGrpcCore, "ConnectivityStates"); rb_define_const(grpc_rb_mConnectivityStates, "IDLE", LONG2NUM(GRPC_CHANNEL_IDLE)); rb_define_const(grpc_rb_mConnectivityStates, "CONNECTING", @@ -386,12 +523,11 @@ void Init_grpc_channel() { /* Add ruby analogues of the Channel methods. */ rb_define_method(grpc_rb_cChannel, "connectivity_state", - grpc_rb_channel_get_connectivity_state, - -1); + grpc_rb_channel_get_connectivity_state, -1); rb_define_method(grpc_rb_cChannel, "watch_connectivity_state", grpc_rb_channel_watch_connectivity_state, 4); - rb_define_method(grpc_rb_cChannel, "create_call", - grpc_rb_channel_create_call, 5); + rb_define_method(grpc_rb_cChannel, "create_call", grpc_rb_channel_create_call, + 5); rb_define_method(grpc_rb_cChannel, "target", grpc_rb_channel_get_target, 0); rb_define_method(grpc_rb_cChannel, "destroy", grpc_rb_channel_destroy, 0); rb_define_alias(grpc_rb_cChannel, "close", "destroy"); @@ -409,6 +545,7 @@ void Init_grpc_channel() { id_insecure_channel = rb_intern("this_channel_is_insecure"); Init_grpc_propagate_masks(); Init_grpc_connectivity_states(); + start_poll_channels_loop(); } /* Gets the wrapped channel from the ruby wrapper */ diff --git a/src/ruby/spec/channel_connection_spec.rb b/src/ruby/spec/channel_connection_spec.rb new file mode 100644 index 00000000000..58ab37d7bc7 --- /dev/null +++ b/src/ruby/spec/channel_connection_spec.rb @@ -0,0 +1,93 @@ +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +require 'grpc' + +# A test message +class EchoMsg + def self.marshal(_o) + '' + end + + def self.unmarshal(_o) + EchoMsg.new + end +end + +# A test service with an echo implementation. +class EchoService + include GRPC::GenericService + rpc :an_rpc, EchoMsg, EchoMsg + attr_reader :received_md + + def initialize(**kw) + @trailing_metadata = kw + @received_md = [] + end + + def an_rpc(req, call) + GRPC.logger.info('echo service received a request') + call.output_metadata.update(@trailing_metadata) + @received_md << call.metadata unless call.metadata.nil? + req + end +end + +EchoStub = EchoService.rpc_stub_class + +def start_server(port = 0) + @srv = GRPC::RpcServer.new + server_port = @srv.add_http2_port("0.0.0.0:#{port}", :this_port_is_insecure) + @srv.handle(EchoService) + @server_thd = Thread.new { @srv.run } + @srv.wait_till_running + server_port +end + +def stop_server + expect(@srv.stopped?).to be(false) + @srv.stop + @server_thd.join + expect(@srv.stopped?).to be(true) +end + +describe 'channel connection behavior' do + it 'the client channel handles temporary loss of a transport' do + port = start_server + stub = EchoStub.new("localhost:#{port}", :this_channel_is_insecure) + req = EchoMsg.new + expect(stub.an_rpc(req)).to be_a(EchoMsg) + stop_server + expect { stub.an_rpc(req) }.to raise_error(GRPC::Unavailable) + # TODO(apolcyn) grabbing the same port might fail, is this stable enough? + start_server(port) + expect(stub.an_rpc(req)).to be_a(EchoMsg) + stop_server + end +end From 89d62d30612433770f85ba4fafb348e0cb990d8a Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 9 Mar 2017 13:28:03 -0800 Subject: [PATCH 025/186] debug print in docker file --- third_party/rake-compiler-dock/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/third_party/rake-compiler-dock/Dockerfile b/third_party/rake-compiler-dock/Dockerfile index 475c6a8d3db..ad902dfe660 100644 --- a/third_party/rake-compiler-dock/Dockerfile +++ b/third_party/rake-compiler-dock/Dockerfile @@ -169,6 +169,8 @@ RUN bash -c " \ USER root +RUN echo "HERE IS VERSION OF LINUX KERNEL USED: $(uname -r)" + # Fix paths in rake-compiler/config.yml and add rvm and mingw-tools to the global bashrc RUN sed -i -- "s:/root/.rake-compiler:/usr/local/rake-compiler:g" /usr/local/rake-compiler/config.yml && \ echo "source /etc/profile.d/rvm.sh" >> /etc/bash.bashrc && \ From b7e1f535f3af352dfb708fd3261314f3333a70f1 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Fri, 10 Mar 2017 10:37:06 -0800 Subject: [PATCH 026/186] revert changes to rake-compiler-dock dockerfile --- third_party/rake-compiler-dock/Dockerfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/third_party/rake-compiler-dock/Dockerfile b/third_party/rake-compiler-dock/Dockerfile index ad902dfe660..475c6a8d3db 100644 --- a/third_party/rake-compiler-dock/Dockerfile +++ b/third_party/rake-compiler-dock/Dockerfile @@ -169,8 +169,6 @@ RUN bash -c " \ USER root -RUN echo "HERE IS VERSION OF LINUX KERNEL USED: $(uname -r)" - # Fix paths in rake-compiler/config.yml and add rvm and mingw-tools to the global bashrc RUN sed -i -- "s:/root/.rake-compiler:/usr/local/rake-compiler:g" /usr/local/rake-compiler/config.yml && \ echo "source /etc/profile.d/rvm.sh" >> /etc/bash.bashrc && \ From c5b90df9b2738076acf6a6972d833489f6470335 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 10 Mar 2017 16:11:08 -0800 Subject: [PATCH 027/186] debug --- src/core/lib/surface/call.c | 74 +++++++++--------------------- src/core/lib/transport/transport.c | 3 +- 2 files changed, 24 insertions(+), 53 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 01efcafceba..8b2f9fd3f53 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -143,9 +143,8 @@ struct grpc_call { grpc_channel *channel; grpc_call *parent; grpc_call *first_child; - gpr_atm has_children; gpr_timespec start_time; - /* protects first_child, setting has_children, and child next/prev links */ + /* protects first_child, and child next/prev links */ gpr_mu child_list_mu; /* client or server call */ @@ -315,7 +314,6 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, GPR_ASSERT(!args->parent_call->is_client); gpr_mu_lock(&args->parent_call->child_list_mu); - gpr_atm_rel_store(&args->parent_call->has_children, 1); if (args->propagation_mask & GRPC_PROPAGATE_DEADLINE) { send_deadline = gpr_time_min( @@ -566,45 +564,19 @@ grpc_call_error grpc_call_cancel_with_status(grpc_call *c, return GRPC_CALL_OK; } -typedef struct termination_closure { - grpc_closure closure; - grpc_call *call; - grpc_transport_stream_op op; -} termination_closure; - -static void done_termination(grpc_exec_ctx *exec_ctx, void *tcp, - grpc_error *error) { - termination_closure *tc = tcp; - GRPC_CALL_INTERNAL_UNREF(exec_ctx, tc->call, "termination"); - gpr_free(tc); -} - -static void send_termination(grpc_exec_ctx *exec_ctx, void *tcp, +static void done_termination(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { - termination_closure *tc = tcp; - memset(&tc->op, 0, sizeof(tc->op)); - tc->op.cancel_error = GRPC_ERROR_REF(error); - /* reuse closure to catch completion */ - tc->op.on_complete = grpc_closure_init(&tc->closure, done_termination, tc, - grpc_schedule_on_exec_ctx); - execute_op(exec_ctx, tc->call, &tc->op); -} - -static void terminate_with_error(grpc_exec_ctx *exec_ctx, grpc_call *c, - grpc_error *error) { - termination_closure *tc = gpr_malloc(sizeof(*tc)); - memset(tc, 0, sizeof(*tc)); - tc->call = c; - GRPC_CALL_INTERNAL_REF(tc->call, "termination"); - grpc_closure_sched(exec_ctx, grpc_closure_init(&tc->closure, send_termination, - tc, grpc_schedule_on_exec_ctx), - error); + GRPC_CALL_INTERNAL_UNREF(exec_ctx, call, "termination"); } static void cancel_with_error(grpc_exec_ctx *exec_ctx, grpc_call *c, status_source source, grpc_error *error) { + GRPC_CALL_INTERNAL_REF(c, "termination"); set_status_from_error(exec_ctx, c, source, GRPC_ERROR_REF(error)); - terminate_with_error(exec_ctx, c, error); + grpc_transport_stream_op *op = grpc_make_transport_stream_op( + grpc_closure_create(done_termination, c, grpc_schedule_on_exec_ctx)); + op->cancel_error = error; + execute_op(exec_ctx, c, op); } static grpc_error *error_from_status(grpc_status_code status, @@ -1100,23 +1072,21 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, gpr_atm_rel_store(&call->received_final_op_atm, 1); /* propagate cancellation to any interested children */ - if (gpr_atm_acq_load(&call->has_children)) { - gpr_mu_lock(&call->child_list_mu); - child_call = call->first_child; - if (child_call != NULL) { - do { - next_child_call = child_call->sibling_next; - if (child_call->cancellation_is_inherited) { - GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); - cancel_with_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, - GRPC_ERROR_CANCELLED); - GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); - } - child_call = next_child_call; - } while (child_call != call->first_child); - } - gpr_mu_unlock(&call->child_list_mu); + gpr_mu_lock(&call->child_list_mu); + child_call = call->first_child; + if (child_call != NULL) { + do { + next_child_call = child_call->sibling_next; + if (child_call->cancellation_is_inherited) { + GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); + cancel_with_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, + GRPC_ERROR_CANCELLED); + GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); + } + child_call = next_child_call; + } while (child_call != call->first_child); } + gpr_mu_unlock(&call->child_list_mu); if (call->is_client) { get_final_status(call, set_status_value_directly, diff --git a/src/core/lib/transport/transport.c b/src/core/lib/transport/transport.c index 165950e288e..3024f2ae781 100644 --- a/src/core/lib/transport/transport.c +++ b/src/core/lib/transport/transport.c @@ -254,8 +254,9 @@ typedef struct { static void destroy_made_transport_stream_op(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { made_transport_stream_op *op = arg; - grpc_closure_sched(exec_ctx, op->inner_on_complete, GRPC_ERROR_REF(error)); + grpc_closure *c = op->inner_on_complete; gpr_free(op); + grpc_closure_run(exec_ctx, c, GRPC_ERROR_REF(error)); } grpc_transport_stream_op *grpc_make_transport_stream_op( From bbb3801e480674695d5f60950724a432f264f170 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Fri, 10 Mar 2017 14:58:43 -0800 Subject: [PATCH 028/186] Change error get/set API to grpc_slice --- .../chttp2/transport/chttp2_transport.c | 91 +++++++++---------- .../transport/chttp2/transport/frame_data.c | 2 +- .../chttp2/transport/frame_rst_stream.c | 2 +- src/core/lib/channel/http_client_filter.c | 4 +- src/core/lib/channel/http_server_filter.c | 10 +- src/core/lib/http/httpcli.c | 2 +- src/core/lib/iomgr/error.c | 69 ++++++-------- src/core/lib/iomgr/error.h | 37 ++++++-- src/core/lib/iomgr/load_file.c | 2 +- src/core/lib/iomgr/resolve_address_posix.c | 10 +- src/core/lib/iomgr/resolve_address_uv.c | 4 +- .../lib/iomgr/socket_utils_common_posix.c | 2 +- src/core/lib/iomgr/tcp_client_posix.c | 14 ++- src/core/lib/iomgr/tcp_client_uv.c | 6 +- src/core/lib/iomgr/tcp_client_windows.c | 2 +- src/core/lib/iomgr/tcp_posix.c | 2 +- src/core/lib/iomgr/tcp_server_uv.c | 8 +- src/core/lib/iomgr/tcp_server_windows.c | 2 +- src/core/lib/iomgr/tcp_uv.c | 2 +- .../google_default_credentials.c | 4 +- src/core/lib/security/transport/tsi_error.c | 2 +- src/core/lib/surface/call.c | 18 ++-- src/core/lib/surface/validate_metadata.c | 3 +- src/core/lib/transport/error_utils.c | 12 +-- src/core/lib/transport/error_utils.h | 2 +- src/core/lib/transport/metadata_batch.c | 6 +- test/core/iomgr/error_test.c | 62 ++++++------- test/cpp/microbenchmarks/bm_error.cc | 8 +- 28 files changed, 189 insertions(+), 199 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index da4c7dc7b23..15039f7308c 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -897,10 +897,8 @@ void grpc_chttp2_add_incoming_goaway(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, uint32_t goaway_error, grpc_slice goaway_text) { - char *msg = grpc_dump_slice(goaway_text, GPR_DUMP_HEX | GPR_DUMP_ASCII); - GRPC_CHTTP2_IF_TRACING( - gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg)); - grpc_slice_unref_internal(exec_ctx, goaway_text); + // GRPC_CHTTP2_IF_TRACING( + // gpr_log(GPR_DEBUG, "got goaway [%d]: %s", goaway_error, msg)); t->seen_goaway = 1; /* lie: use transient failure from the transport to indicate goaway has been * received */ @@ -910,9 +908,8 @@ void grpc_chttp2_add_incoming_goaway(grpc_exec_ctx *exec_ctx, grpc_error_set_int(GRPC_ERROR_CREATE("GOAWAY received"), GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)goaway_error), - GRPC_ERROR_STR_RAW_BYTES, msg), + GRPC_ERROR_STR_RAW_BYTES, goaway_text), "got_goaway"); - gpr_free(msg); } static void maybe_start_some_streams(grpc_exec_ctx *exec_ctx, @@ -1006,7 +1003,7 @@ void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx, GRPC_ERROR_CREATE("Error in HTTP transport completing operation"); closure->error_data.error = grpc_error_set_str(closure->error_data.error, - GRPC_ERROR_STR_TARGET_ADDRESS, t->peer_string); + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(t->peer_string)); } closure->error_data.error = grpc_error_add_child(closure->error_data.error, error); @@ -1408,11 +1405,11 @@ static void send_goaway(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_error *error) { t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED; grpc_http2_error_code http_error; - const char *msg; - grpc_error_get_status(error, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL, &msg, + grpc_slice slice; + grpc_error_get_status(error, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL, &slice, &http_error); grpc_chttp2_goaway_append(t->last_new_stream_id, (uint32_t)http_error, - grpc_slice_from_copied_string(msg), &t->qbuf); + grpc_slice_ref_internal(slice), &t->qbuf); grpc_chttp2_initiate_write(exec_ctx, t, false, "goaway_sent"); GRPC_ERROR_UNREF(error); } @@ -1613,8 +1610,8 @@ void grpc_chttp2_cancel_stream(grpc_exec_ctx *exec_ctx, void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error *error) { grpc_status_code status; - const char *msg; - grpc_error_get_status(error, s->deadline, &status, &msg, NULL); + grpc_slice slice; + grpc_error_get_status(error, s->deadline, &status, &slice, NULL); if (status != GRPC_STATUS_OK) { s->seen_error = true; @@ -1633,12 +1630,10 @@ void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, exec_ctx, &s->metadata_buffer[1], grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_STATUS, grpc_slice_from_copied_string(status_string))); - if (msg != NULL) { - grpc_chttp2_incoming_metadata_buffer_replace_or_add( - exec_ctx, &s->metadata_buffer[1], - grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_MESSAGE, - grpc_slice_from_copied_string(msg))); - } + grpc_chttp2_incoming_metadata_buffer_replace_or_add( + exec_ctx, &s->metadata_buffer[1], + grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_MESSAGE, + grpc_slice_ref_internal(slice))); s->published_metadata[1] = GRPC_METADATA_SYNTHESIZED_FROM_FAKE; grpc_chttp2_maybe_complete_recv_trailing_metadata(exec_ctx, t, s); } @@ -1764,8 +1759,8 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, uint8_t *p; uint32_t len = 0; grpc_status_code grpc_status; - const char *msg; - grpc_error_get_status(error, s->deadline, &grpc_status, &msg, NULL); + grpc_slice slice; + grpc_error_get_status(error, s->deadline, &grpc_status, &slice, NULL); GPR_ASSERT(grpc_status >= 0 && (int)grpc_status < 100); @@ -1801,32 +1796,30 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, GPR_ASSERT(p == GRPC_SLICE_END_PTR(status_hdr)); len += (uint32_t)GRPC_SLICE_LENGTH(status_hdr); - if (msg != NULL) { - size_t msg_len = strlen(msg); - GPR_ASSERT(msg_len <= UINT32_MAX); - uint32_t msg_len_len = GRPC_CHTTP2_VARINT_LENGTH((uint32_t)msg_len, 0); - message_pfx = grpc_slice_malloc(14 + msg_len_len); - p = GRPC_SLICE_START_PTR(message_pfx); - *p++ = 0x00; /* literal header, not indexed */ - *p++ = 12; /* len(grpc-message) */ - *p++ = 'g'; - *p++ = 'r'; - *p++ = 'p'; - *p++ = 'c'; - *p++ = '-'; - *p++ = 'm'; - *p++ = 'e'; - *p++ = 's'; - *p++ = 's'; - *p++ = 'a'; - *p++ = 'g'; - *p++ = 'e'; - GRPC_CHTTP2_WRITE_VARINT((uint32_t)msg_len, 0, 0, p, (uint32_t)msg_len_len); - p += msg_len_len; - GPR_ASSERT(p == GRPC_SLICE_END_PTR(message_pfx)); - len += (uint32_t)GRPC_SLICE_LENGTH(message_pfx); - len += (uint32_t)msg_len; - } + size_t msg_len = GRPC_SLICE_LENGTH(slice); + GPR_ASSERT(msg_len <= UINT32_MAX); + uint32_t msg_len_len = GRPC_CHTTP2_VARINT_LENGTH((uint32_t)msg_len, 0); + message_pfx = grpc_slice_malloc(14 + msg_len_len); + p = GRPC_SLICE_START_PTR(message_pfx); + *p++ = 0x00; /* literal header, not indexed */ + *p++ = 12; /* len(grpc-message) */ + *p++ = 'g'; + *p++ = 'r'; + *p++ = 'p'; + *p++ = 'c'; + *p++ = '-'; + *p++ = 'm'; + *p++ = 'e'; + *p++ = 's'; + *p++ = 's'; + *p++ = 'a'; + *p++ = 'g'; + *p++ = 'e'; + GRPC_CHTTP2_WRITE_VARINT((uint32_t)msg_len, 0, 0, p, (uint32_t)msg_len_len); + p += msg_len_len; + GPR_ASSERT(p == GRPC_SLICE_END_PTR(message_pfx)); + len += (uint32_t)GRPC_SLICE_LENGTH(message_pfx); + len += (uint32_t)msg_len; hdr = grpc_slice_malloc(9); p = GRPC_SLICE_START_PTR(hdr); @@ -1843,10 +1836,8 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_slice_buffer_add(&t->qbuf, hdr); grpc_slice_buffer_add(&t->qbuf, status_hdr); - if (msg != NULL) { - grpc_slice_buffer_add(&t->qbuf, message_pfx); - grpc_slice_buffer_add(&t->qbuf, grpc_slice_from_copied_string(msg)); - } + grpc_slice_buffer_add(&t->qbuf, message_pfx); + grpc_slice_buffer_add(&t->qbuf, grpc_slice_ref_internal(slice)); grpc_slice_buffer_add( &t->qbuf, grpc_chttp2_rst_stream_create(s->id, GRPC_HTTP2_NO_ERROR, &s->stats.outgoing)); diff --git a/src/core/ext/transport/chttp2/transport/frame_data.c b/src/core/ext/transport/chttp2/transport/frame_data.c index f9b9e1b3092..6fc4897b822 100644 --- a/src/core/ext/transport/chttp2/transport/frame_data.c +++ b/src/core/ext/transport/chttp2/transport/frame_data.c @@ -179,7 +179,7 @@ static grpc_error *parse_inner(grpc_exec_ctx *exec_ctx, gpr_free(msg); msg = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); p->error = - grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES, msg); + grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_copied_string(msg)); gpr_free(msg); p->error = grpc_error_set_int(p->error, GRPC_ERROR_INT_OFFSET, cur - beg); diff --git a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c index cb017e75f04..e5fabd0e921 100644 --- a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +++ b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c @@ -113,7 +113,7 @@ grpc_error *grpc_chttp2_rst_stream_parser_parse(grpc_exec_ctx *exec_ctx, gpr_asprintf(&message, "Received RST_STREAM with error code %d", reason); error = grpc_error_set_int( grpc_error_set_str(GRPC_ERROR_CREATE("RST_STREAM"), - GRPC_ERROR_STR_GRPC_MESSAGE, message), + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(message)), GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)reason); gpr_free(message); } diff --git a/src/core/lib/channel/http_client_filter.c b/src/core/lib/channel/http_client_filter.c index c031533dd86..58d99e6e996 100644 --- a/src/core/lib/channel/http_client_filter.c +++ b/src/core/lib/channel/http_client_filter.c @@ -110,9 +110,9 @@ static grpc_error *client_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, grpc_error_set_str( GRPC_ERROR_CREATE( "Received http2 :status header with non-200 OK status"), - GRPC_ERROR_STR_VALUE, val), + GRPC_ERROR_STR_VALUE, grpc_slice_from_copied_string(val)), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED), - GRPC_ERROR_STR_GRPC_MESSAGE, msg); + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(msg)); gpr_free(val); gpr_free(msg); return e; diff --git a/src/core/lib/channel/http_server_filter.c b/src/core/lib/channel/http_server_filter.c index fb70de8e96c..437436b43e6 100644 --- a/src/core/lib/channel/http_server_filter.c +++ b/src/core/lib/channel/http_server_filter.c @@ -132,7 +132,7 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, } else { add_error(error_name, &error, grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, ":method")); + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":method"))); } if (b->idx.named.te != NULL) { @@ -145,7 +145,7 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, } else { add_error(error_name, &error, grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, "te")); + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te"))); } if (b->idx.named.scheme != NULL) { @@ -160,7 +160,7 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, } else { add_error(error_name, &error, grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, ":scheme")); + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":scheme"))); } if (b->idx.named.content_type != NULL) { @@ -195,7 +195,7 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, if (b->idx.named.path == NULL) { add_error(error_name, &error, grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, ":path")); + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path"))); } if (b->idx.named.host != NULL && b->idx.named.authority == NULL) { @@ -214,7 +214,7 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, if (b->idx.named.authority == NULL) { add_error(error_name, &error, grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, ":authority")); + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":authority"))); } if (b->idx.named.grpc_payload_bin != NULL) { diff --git a/src/core/lib/http/httpcli.c b/src/core/lib/http/httpcli.c index 6d7aa43b815..a541c0c6c99 100644 --- a/src/core/lib/http/httpcli.c +++ b/src/core/lib/http/httpcli.c @@ -132,7 +132,7 @@ static void append_error(internal_request *req, grpc_error *error) { char *addr_text = grpc_sockaddr_to_uri(addr); req->overall_error = grpc_error_add_child( req->overall_error, - grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, addr_text)); + grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(addr_text))); gpr_free(addr_text); } diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c index 7cdbe30198d..0edd69edccb 100644 --- a/src/core/lib/iomgr/error.c +++ b/src/core/lib/iomgr/error.c @@ -35,7 +35,6 @@ #include -#include #include #include #include @@ -283,7 +282,7 @@ static void internal_add_error(grpc_error **err, grpc_error *new) { // It is very common to include and extra int and string in an error #define SURPLUS_CAPACITY (2 * SLOTS_PER_INT + SLOTS_PER_TIME) -grpc_error *grpc_error_create(const char *file, int line, const char *desc, +grpc_error *grpc_error_create(grpc_slice file, int line, grpc_slice desc, grpc_error **referencing, size_t num_referencing) { GPR_TIMER_BEGIN("grpc_error_create", 0); @@ -309,14 +308,8 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, memset(err->times, UINT8_MAX, GRPC_ERROR_TIME_MAX); internal_set_int(&err, GRPC_ERROR_INT_FILE_LINE, line); - internal_set_str(&err, GRPC_ERROR_STR_FILE, - grpc_slice_from_static_string(file)); - internal_set_str( - &err, GRPC_ERROR_STR_DESCRIPTION, - grpc_slice_from_copied_buffer( - desc, - strlen(desc) + - 1)); // TODO, pull this up. // TODO(ncteisen), pull this up. + internal_set_str(&err, GRPC_ERROR_STR_FILE, file); + internal_set_str(&err, GRPC_ERROR_STR_DESCRIPTION, desc); for (size_t i = 0; i < num_referencing; ++i) { if (referencing[i] == GRPC_ERROR_NONE) continue; @@ -409,7 +402,7 @@ typedef struct { const char *msg; } special_error_status_map; static special_error_status_map error_status_map[] = { - {GRPC_ERROR_NONE, GRPC_STATUS_OK, NULL}, + {GRPC_ERROR_NONE, GRPC_STATUS_OK, ""}, {GRPC_ERROR_CANCELLED, GRPC_STATUS_CANCELLED, "Cancelled"}, {GRPC_ERROR_OOM, GRPC_STATUS_RESOURCE_EXHAUSTED, "Out of memory"}, }; @@ -439,34 +432,32 @@ bool grpc_error_get_int(grpc_error *err, grpc_error_ints which, intptr_t *p) { return false; } -grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, - const char *value) { +grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, grpc_slice str) { GPR_TIMER_BEGIN("grpc_error_set_str", 0); grpc_error *new = copy_error_and_unref(src); - internal_set_str(&new, which, - grpc_slice_from_copied_buffer( - value, strlen(value) + 1)); // TODO, pull this up. + internal_set_str(&new, which, str); GPR_TIMER_END("grpc_error_set_str", 0); return new; } -const char *grpc_error_get_str(grpc_error *err, grpc_error_strs which) { +bool grpc_error_get_str(grpc_error *err, grpc_error_strs which, grpc_slice *str) { if (grpc_error_is_special(err)) { if (which == GRPC_ERROR_STR_GRPC_MESSAGE) { for (size_t i = 0; i < GPR_ARRAY_SIZE(error_status_map); i++) { if (error_status_map[i].error == err) { - return error_status_map[i].msg; + *str = grpc_slice_from_static_string(error_status_map[i].msg); + return true; } } } - return NULL; + return false; } uint8_t slot = err->strs[which]; if (slot != UINT8_MAX) { - return (const char *)GRPC_SLICE_START_PTR( - *(grpc_slice *)(err->arena + slot)); + *str = *(grpc_slice *)(err->arena + slot); + return true; } else { - return NULL; + return false; } } @@ -507,13 +498,13 @@ static void append_str(const char *str, char **s, size_t *sz, size_t *cap) { } } -static void append_esc_str(const char *str, char **s, size_t *sz, size_t *cap) { +static void append_esc_str(const uint8_t *str, size_t len, char **s, size_t *sz, size_t *cap) { static const char *hex = "0123456789abcdef"; append_chr('"', s, sz, cap); - for (const uint8_t *c = (const uint8_t *)str; *c; c++) { - if (*c < 32 || *c >= 127) { + for (size_t i = 0; i < len; i++, str++) { + if (*str < 32 || *str >= 127) { append_chr('\\', s, sz, cap); - switch (*c) { + switch (*str) { case '\b': append_chr('b', s, sz, cap); break; @@ -533,12 +524,12 @@ static void append_esc_str(const char *str, char **s, size_t *sz, size_t *cap) { append_chr('u', s, sz, cap); append_chr('0', s, sz, cap); append_chr('0', s, sz, cap); - append_chr(hex[*c >> 4], s, sz, cap); - append_chr(hex[*c & 0x0f], s, sz, cap); + append_chr(hex[*str >> 4], s, sz, cap); + append_chr(hex[*str & 0x0f], s, sz, cap); break; } } else { - append_chr((char)*c, s, sz, cap); + append_chr((char)*str, s, sz, cap); } } append_chr('"', s, sz, cap); @@ -578,11 +569,11 @@ static char *key_str(grpc_error_strs which) { return gpr_strdup(error_str_name(which)); } -static char *fmt_str(void *p) { +static char *fmt_str(grpc_slice slice) { char *s = NULL; size_t sz = 0; size_t cap = 0; - append_esc_str(p, &s, &sz, &cap); + append_esc_str((const uint8_t*)GRPC_SLICE_START_PTR(slice), GRPC_SLICE_LENGTH(slice), &s, &sz, &cap); append_chr(0, &s, &sz, &cap); return s; } @@ -593,7 +584,7 @@ static void collect_strs_kvs(grpc_error *err, kv_pairs *kvs) { if (slot != UINT8_MAX) { append_kv( kvs, key_str((grpc_error_strs)which), - fmt_str(GRPC_SLICE_START_PTR(*(grpc_slice *)(err->arena + slot)))); + fmt_str(*(grpc_slice *)(err->arena + slot))); } } } @@ -673,7 +664,7 @@ static char *finish_kvs(kv_pairs *kvs) { append_chr('{', &s, &sz, &cap); for (size_t i = 0; i < kvs->num_kvs; i++) { if (i != 0) append_chr(',', &s, &sz, &cap); - append_esc_str(kvs->kvs[i].key, &s, &sz, &cap); + append_esc_str((const uint8_t*)kvs->kvs[i].key, strlen(kvs->kvs[i].key), &s, &sz, &cap); gpr_free(kvs->kvs[i].key); append_chr(':', &s, &sz, &cap); append_str(kvs->kvs[i].value, &s, &sz, &cap); @@ -725,10 +716,10 @@ grpc_error *grpc_os_error(const char *file, int line, int err, const char *call_name) { return grpc_error_set_str( grpc_error_set_str( - grpc_error_set_int(grpc_error_create(file, line, "OS Error", NULL, 0), + grpc_error_set_int(grpc_error_create(grpc_slice_from_static_string(file), line, grpc_slice_from_static_string("OS Error"), NULL, 0), GRPC_ERROR_INT_ERRNO, err), - GRPC_ERROR_STR_OS_ERROR, strerror(err)), - GRPC_ERROR_STR_SYSCALL, call_name); + GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(strerror(err))), + GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string(call_name)); } #ifdef GPR_WINDOWS @@ -737,10 +728,10 @@ grpc_error *grpc_wsa_error(const char *file, int line, int err, char *utf8_message = gpr_format_message(err); grpc_error *error = grpc_error_set_str( grpc_error_set_str( - grpc_error_set_int(grpc_error_create(file, line, "OS Error", NULL, 0), + grpc_error_set_int(grpc_error_create(grpc_slice_from_static_string(file), line, grpc_slice_from_static_string("OS Error"), NULL, 0), GRPC_ERROR_INT_WSA_ERROR, err), - GRPC_ERROR_STR_OS_ERROR, utf8_message), - GRPC_ERROR_STR_SYSCALL, call_name); + GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_copied_string(utf8_message)), + GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string(call_name)); gpr_free(utf8_message); return error; } diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index eb953947ae9..063a2435f0c 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -37,6 +37,7 @@ #include #include +#include #include #include @@ -156,7 +157,7 @@ typedef enum { const char *grpc_error_string(grpc_error *error); /// Create an error - but use GRPC_ERROR_CREATE instead -grpc_error *grpc_error_create(const char *file, int line, const char *desc, +grpc_error *grpc_error_create(grpc_slice file, int line, grpc_slice desc, grpc_error **referencing, size_t num_referencing); /// Create an error (this is the preferred way of generating an error that is /// not due to a system call - for system calls, use GRPC_OS_ERROR or @@ -166,13 +167,30 @@ grpc_error *grpc_error_create(const char *file, int line, const char *desc, /// err = grpc_error_create(x, y, z, r, nr) is equivalent to: /// err = grpc_error_create(x, y, z, NULL, 0); /// for (i=0; imu); if (error != GRPC_ERROR_NONE) { error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, "Timeout occurred"); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string("Timeout occurred")); goto finish; } @@ -252,12 +252,16 @@ finish: gpr_mu_unlock(&ac->mu); if (error != GRPC_ERROR_NONE) { char *error_descr; - gpr_asprintf(&error_descr, "Failed to connect to remote host: %s", - grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION)); - error = grpc_error_set_str(error, GRPC_ERROR_STR_DESCRIPTION, error_descr); + grpc_slice str; + bool ret = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str); + GPR_ASSERT(ret); + char* desc = grpc_slice_to_c_string(str); + gpr_asprintf(&error_descr, "Failed to connect to remote host: %s", desc); + error = grpc_error_set_str(error, GRPC_ERROR_STR_DESCRIPTION, grpc_slice_from_copied_string(error_descr)); gpr_free(error_descr); + gpr_free(desc); error = - grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, ac->addr_str); + grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(ac->addr_str)); } if (done) { gpr_mu_destroy(&ac->mu); diff --git a/src/core/lib/iomgr/tcp_client_uv.c b/src/core/lib/iomgr/tcp_client_uv.c index ae66577cafd..9727976ec28 100644 --- a/src/core/lib/iomgr/tcp_client_uv.c +++ b/src/core/lib/iomgr/tcp_client_uv.c @@ -104,14 +104,14 @@ static void uv_tc_on_connect(uv_connect_t *req, int status) { error = GRPC_ERROR_CREATE("Failed to connect to remote host"); error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, -status); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); if (status == UV_ECANCELED) { error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, - "Timeout occurred"); + grpc_slice_from_static_string("Timeout occurred")); // This should only happen if the handle is already closed } else { error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, - uv_strerror(status)); + grpc_slice_from_static_string(uv_strerror(status))); uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback); } } diff --git a/src/core/lib/iomgr/tcp_client_windows.c b/src/core/lib/iomgr/tcp_client_windows.c index c8dc9e64bdb..421d39c0466 100644 --- a/src/core/lib/iomgr/tcp_client_windows.c +++ b/src/core/lib/iomgr/tcp_client_windows.c @@ -239,7 +239,7 @@ failure: char *target_uri = grpc_sockaddr_to_uri(addr); grpc_error *final_error = grpc_error_set_str( GRPC_ERROR_CREATE_REFERENCING("Failed to connect", &error, 1), - GRPC_ERROR_STR_TARGET_ADDRESS, target_uri); + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(target_uri)); GRPC_ERROR_UNREF(error); if (socket != NULL) { grpc_winsocket_destroy(socket); diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c index a4381f8fc96..62e1f88d60d 100644 --- a/src/core/lib/iomgr/tcp_posix.c +++ b/src/core/lib/iomgr/tcp_posix.c @@ -111,7 +111,7 @@ typedef struct { static grpc_error *tcp_annotate_error(grpc_error *src_error, grpc_tcp *tcp) { return grpc_error_set_str( grpc_error_set_int(src_error, GRPC_ERROR_INT_FD, tcp->fd), - GRPC_ERROR_STR_TARGET_ADDRESS, tcp->peer_string); + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(tcp->peer_string)); } static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */, diff --git a/src/core/lib/iomgr/tcp_server_uv.c b/src/core/lib/iomgr/tcp_server_uv.c index eed2773f8a0..1e64b8e834f 100644 --- a/src/core/lib/iomgr/tcp_server_uv.c +++ b/src/core/lib/iomgr/tcp_server_uv.c @@ -246,7 +246,7 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle, if (status != 0) { error = GRPC_ERROR_CREATE("Failed to bind to port"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); return error; } @@ -254,7 +254,7 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle, if (status != 0) { error = GRPC_ERROR_CREATE("Failed to listen to port"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); return error; } @@ -264,7 +264,7 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle, if (status != 0) { error = GRPC_ERROR_CREATE("getsockname failed"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); return error; } @@ -348,7 +348,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, } else { error = GRPC_ERROR_CREATE("Failed to initialize UV tcp handle"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); } gpr_free(allocated_addr); diff --git a/src/core/lib/iomgr/tcp_server_windows.c b/src/core/lib/iomgr/tcp_server_windows.c index bd4b9b2df11..94d7a0445fd 100644 --- a/src/core/lib/iomgr/tcp_server_windows.c +++ b/src/core/lib/iomgr/tcp_server_windows.c @@ -250,7 +250,7 @@ failure: grpc_error_set_int( grpc_error_set_str(GRPC_ERROR_CREATE_REFERENCING( "Failed to prepare server socket", &error, 1), - GRPC_ERROR_STR_TARGET_ADDRESS, tgtaddr), + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(tgtaddr)), GRPC_ERROR_INT_FD, (intptr_t)sock); gpr_free(tgtaddr); GRPC_ERROR_UNREF(error); diff --git a/src/core/lib/iomgr/tcp_uv.c b/src/core/lib/iomgr/tcp_uv.c index 5541c620683..0b12d8f800b 100644 --- a/src/core/lib/iomgr/tcp_uv.c +++ b/src/core/lib/iomgr/tcp_uv.c @@ -195,7 +195,7 @@ static void uv_endpoint_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, if (status != 0) { error = GRPC_ERROR_CREATE("TCP Read failed at start"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, uv_strerror(status)); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); grpc_closure_sched(exec_ctx, cb, error); } if (grpc_tcp_trace) { diff --git a/src/core/lib/security/credentials/google_default/google_default_credentials.c b/src/core/lib/security/credentials/google_default/google_default_credentials.c index dd446213477..f09e64c5641 100644 --- a/src/core/lib/security/credentials/google_default/google_default_credentials.c +++ b/src/core/lib/security/credentials/google_default/google_default_credentials.c @@ -190,10 +190,8 @@ static grpc_error *create_default_creds_from_path( json = grpc_json_parse_string_with_len( (char *)GRPC_SLICE_START_PTR(creds_data), GRPC_SLICE_LENGTH(creds_data)); if (json == NULL) { - char *dump = grpc_dump_slice(creds_data, GPR_DUMP_HEX | GPR_DUMP_ASCII); error = grpc_error_set_str(GRPC_ERROR_CREATE("Failed to parse JSON"), - GRPC_ERROR_STR_RAW_BYTES, dump); - gpr_free(dump); + GRPC_ERROR_STR_RAW_BYTES, grpc_slice_ref_internal(creds_data)); goto end; } diff --git a/src/core/lib/security/transport/tsi_error.c b/src/core/lib/security/transport/tsi_error.c index afc17335672..f15bd7e4137 100644 --- a/src/core/lib/security/transport/tsi_error.c +++ b/src/core/lib/security/transport/tsi_error.c @@ -35,6 +35,6 @@ grpc_error *grpc_set_tsi_error_result(grpc_error *error, tsi_result result) { return grpc_error_set_int(grpc_error_set_str(error, GRPC_ERROR_STR_TSI_ERROR, - tsi_result_to_string(result)), + grpc_slice_from_static_string(tsi_result_to_string(result))), GRPC_ERROR_INT_TSI_CODE, result); } diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index c2547c5147a..e41d7a6370c 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -608,7 +608,7 @@ static grpc_error *error_from_status(grpc_status_code status, const char *description) { return grpc_error_set_int( grpc_error_set_str(GRPC_ERROR_CREATE(description), - GRPC_ERROR_STR_GRPC_MESSAGE, description), + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(description)), GRPC_ERROR_INT_GRPC_STATUS, status); } @@ -628,16 +628,15 @@ static bool get_final_status_from( void (*set_value)(grpc_status_code code, void *user_data), void *set_value_user_data, grpc_slice *details) { grpc_status_code code; - const char *msg = NULL; - grpc_error_get_status(error, call->send_deadline, &code, &msg, NULL); + grpc_slice slice; + grpc_error_get_status(error, call->send_deadline, &code, &slice, NULL); if (code == GRPC_STATUS_OK && !allow_ok_status) { return false; } set_value(code, set_value_user_data); if (details != NULL) { - *details = - msg == NULL ? grpc_empty_slice() : grpc_slice_from_copied_string(msg); + *details = grpc_slice_ref_internal(slice); } return true; } @@ -911,13 +910,10 @@ static void recv_common_filter(grpc_exec_ctx *exec_ctx, grpc_call *call, (intptr_t)status_code); if (b->idx.named.grpc_message != NULL) { - char *msg = - grpc_slice_to_c_string(GRPC_MDVALUE(b->idx.named.grpc_message->md)); - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, msg); - gpr_free(msg); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_ref_internal(GRPC_MDVALUE(b->idx.named.grpc_message->md))); grpc_metadata_batch_remove(exec_ctx, b, b->idx.named.grpc_message); } else if (error != GRPC_ERROR_NONE) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, ""); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_empty_slice()); } set_status_from_error(exec_ctx, call, STATUS_FROM_WIRE, error); @@ -1550,7 +1546,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, char *msg = grpc_slice_to_c_string( GRPC_MDVALUE(call->send_extra_metadata[1].md)); override_error = grpc_error_set_str( - override_error, GRPC_ERROR_STR_GRPC_MESSAGE, msg); + override_error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(msg)); gpr_free(msg); } set_status_from_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, diff --git a/src/core/lib/surface/validate_metadata.c b/src/core/lib/surface/validate_metadata.c index 7ec9137265d..147dd09af84 100644 --- a/src/core/lib/surface/validate_metadata.c +++ b/src/core/lib/surface/validate_metadata.c @@ -39,6 +39,7 @@ #include #include "src/core/lib/iomgr/error.h" +#include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" static grpc_error *conforms_to(grpc_slice slice, const uint8_t *legal_bits, @@ -54,7 +55,7 @@ static grpc_error *conforms_to(grpc_slice slice, const uint8_t *legal_bits, grpc_error *error = grpc_error_set_str( grpc_error_set_int(GRPC_ERROR_CREATE(err_desc), GRPC_ERROR_INT_OFFSET, p - GRPC_SLICE_START_PTR(slice)), - GRPC_ERROR_STR_RAW_BYTES, dump); + GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_copied_string(dump)); gpr_free(dump); return error; } diff --git a/src/core/lib/transport/error_utils.c b/src/core/lib/transport/error_utils.c index ef55e561fbf..4e70f8749d5 100644 --- a/src/core/lib/transport/error_utils.c +++ b/src/core/lib/transport/error_utils.c @@ -55,7 +55,7 @@ static grpc_error *recursively_find_error_with_field(grpc_error *error, } void grpc_error_get_status(grpc_error *error, gpr_timespec deadline, - grpc_status_code *code, const char **msg, + grpc_status_code *code, grpc_slice *slice, grpc_http2_error_code *http_error) { // Start with the parent error and recurse through the tree of children // until we find the first one that has a status code. @@ -97,11 +97,11 @@ void grpc_error_get_status(grpc_error *error, gpr_timespec deadline, // If the error has a status message, use it. Otherwise, fall back to // the error description. - if (msg != NULL) { - *msg = grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE); - if (*msg == NULL && error != GRPC_ERROR_NONE) { - *msg = grpc_error_get_str(found_error, GRPC_ERROR_STR_DESCRIPTION); - if (*msg == NULL) *msg = "unknown error"; // Just in case. + if (slice != NULL) { + if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_GRPC_MESSAGE, slice)) { + if (!grpc_error_get_str(found_error, GRPC_ERROR_STR_DESCRIPTION, slice)) { + *slice = grpc_slice_from_static_string("unknown error"); + } } } diff --git a/src/core/lib/transport/error_utils.h b/src/core/lib/transport/error_utils.h index 105338880ac..3b44466ab83 100644 --- a/src/core/lib/transport/error_utils.h +++ b/src/core/lib/transport/error_utils.h @@ -44,7 +44,7 @@ /// attributes (code, msg, http_status) are unneeded, they can be passed as /// NULL. void grpc_error_get_status(grpc_error *error, gpr_timespec deadline, - grpc_status_code *code, const char **msg, + grpc_status_code *code, grpc_slice *slice, grpc_http2_error_code *http_status); /// A utility function to check whether there is a clear status code that diff --git a/src/core/lib/transport/metadata_batch.c b/src/core/lib/transport/metadata_batch.c index fc2c52bd8a6..40b9e1d3309 100644 --- a/src/core/lib/transport/metadata_batch.c +++ b/src/core/lib/transport/metadata_batch.c @@ -101,12 +101,8 @@ void grpc_metadata_batch_destroy(grpc_exec_ctx *exec_ctx, } grpc_error *grpc_attach_md_to_error(grpc_error *src, grpc_mdelem md) { - char *k = grpc_slice_to_c_string(GRPC_MDKEY(md)); - char *v = grpc_slice_to_c_string(GRPC_MDVALUE(md)); grpc_error *out = grpc_error_set_str( - grpc_error_set_str(src, GRPC_ERROR_STR_KEY, k), GRPC_ERROR_STR_VALUE, v); - gpr_free(k); - gpr_free(v); + grpc_error_set_str(src, GRPC_ERROR_STR_KEY, grpc_slice_ref_internal(GRPC_MDKEY(md))), GRPC_ERROR_STR_VALUE, grpc_slice_ref_internal(GRPC_MDVALUE(md))); return out; } diff --git a/test/core/iomgr/error_test.c b/test/core/iomgr/error_test.c index 2a6b1b17fde..48a7aa0b3f5 100644 --- a/test/core/iomgr/error_test.c +++ b/test/core/iomgr/error_test.c @@ -68,24 +68,22 @@ static void test_set_get_int() { static void test_set_get_str() { grpc_error* error = GRPC_ERROR_CREATE("Test"); - GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL)); - GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_TSI_ERROR)); + grpc_slice str; + GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str)); + GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_TSI_ERROR, &str)); - const char* c = grpc_error_get_str(error, GRPC_ERROR_STR_FILE); - GPR_ASSERT(c); - GPR_ASSERT(strstr(c, "error_test.c")); // __FILE__ expands differently on + GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_FILE, &str)); + GPR_ASSERT(strstr((char*)GRPC_SLICE_START_PTR(str), "error_test.c")); // __FILE__ expands differently on // Windows. All should at least // contain error_test.c - c = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "Test")); + GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "Test", GRPC_SLICE_LENGTH(str))); error = - grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "longer message"); - c = grpc_error_get_str(error, GRPC_ERROR_STR_GRPC_MESSAGE); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "longer message")); + grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("longer message")); + GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "longer message", GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error); } @@ -93,26 +91,24 @@ static void test_set_get_str() { static void test_copy_and_unref() { // error1 has one ref grpc_error* error1 = grpc_error_set_str( - GRPC_ERROR_CREATE("Test"), GRPC_ERROR_STR_GRPC_MESSAGE, "message"); - const char* c = grpc_error_get_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "message")); + GRPC_ERROR_CREATE("Test"), GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); + grpc_slice str; + GPR_ASSERT(grpc_error_get_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", GRPC_SLICE_LENGTH(str))); // error 1 has two refs GRPC_ERROR_REF(error1); // this gives error3 a ref to the new error, and decrements error1 to one ref grpc_error* error3 = - grpc_error_set_str(error1, GRPC_ERROR_STR_SYSCALL, "syscall"); + grpc_error_set_str(error1, GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string("syscall")); GPR_ASSERT(error3 != error1); // should not be the same because of extra ref - c = grpc_error_get_str(error3, GRPC_ERROR_STR_GRPC_MESSAGE); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "message")); + GPR_ASSERT(grpc_error_get_str(error3, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", GRPC_SLICE_LENGTH(str))); // error 1 should not have a syscall but 3 should - GPR_ASSERT(!grpc_error_get_str(error1, GRPC_ERROR_STR_SYSCALL)); - c = grpc_error_get_str(error3, GRPC_ERROR_STR_SYSCALL); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, "syscall")); + GPR_ASSERT(!grpc_error_get_str(error1, GRPC_ERROR_STR_SYSCALL, &str)); + GPR_ASSERT(grpc_error_get_str(error3, GRPC_ERROR_STR_SYSCALL, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "syscall", GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error1); GRPC_ERROR_UNREF(error3); @@ -120,7 +116,7 @@ static void test_copy_and_unref() { static void test_create_referencing() { grpc_error* child = grpc_error_set_str( - GRPC_ERROR_CREATE("Child"), GRPC_ERROR_STR_GRPC_MESSAGE, "message"); + GRPC_ERROR_CREATE("Child"), GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", &child, 1); GPR_ASSERT(parent); @@ -131,11 +127,11 @@ static void test_create_referencing() { static void test_create_referencing_many() { grpc_error* children[3]; children[0] = grpc_error_set_str(GRPC_ERROR_CREATE("Child1"), - GRPC_ERROR_STR_GRPC_MESSAGE, "message"); + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); children[1] = grpc_error_set_int(GRPC_ERROR_CREATE("Child2"), GRPC_ERROR_INT_HTTP2_ERROR, 5); children[2] = grpc_error_set_str(GRPC_ERROR_CREATE("Child3"), - GRPC_ERROR_STR_GRPC_MESSAGE, "message 3"); + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message 3")); grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", children, 3); GPR_ASSERT(parent); @@ -151,7 +147,7 @@ static void print_error_string() { grpc_error_set_int(GRPC_ERROR_CREATE("Error"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED); error = grpc_error_set_int(error, GRPC_ERROR_INT_SIZE, 666); - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, "message"); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); // gpr_log(GPR_DEBUG, "%s", grpc_error_string(error)); GRPC_ERROR_UNREF(error); } @@ -161,11 +157,11 @@ static void print_error_string_reference() { children[0] = grpc_error_set_str( grpc_error_set_int(GRPC_ERROR_CREATE("1"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED), - GRPC_ERROR_STR_GRPC_MESSAGE, "message for child 1"); + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message for child 1")); children[1] = grpc_error_set_str( grpc_error_set_int(GRPC_ERROR_CREATE("2sd"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL), - GRPC_ERROR_STR_GRPC_MESSAGE, "message for child 2"); + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message for child 2")); grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", children, 2); @@ -186,9 +182,9 @@ static void test_os_error() { GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_ERRNO, &i)); GPR_ASSERT(i == fake_errno); - const char* c = grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL); - GPR_ASSERT(c); - GPR_ASSERT(!strcmp(c, syscall)); + grpc_slice str; + GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str)); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), syscall, GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error); } diff --git a/test/cpp/microbenchmarks/bm_error.cc b/test/cpp/microbenchmarks/bm_error.cc index c4f6aa19d5b..0f9e3c49db2 100644 --- a/test/cpp/microbenchmarks/bm_error.cc +++ b/test/cpp/microbenchmarks/bm_error.cc @@ -77,7 +77,7 @@ static void BM_ErrorCreateAndSetIntAndStr(benchmark::State& state) { GRPC_ERROR_UNREF(grpc_error_set_str( grpc_error_set_int(GRPC_ERROR_CREATE("GOAWAY received"), GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)0), - GRPC_ERROR_STR_RAW_BYTES, "raw bytes")); + GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_static_string("raw bytes"))); } track_counters.Finish(state); } @@ -100,7 +100,7 @@ static void BM_ErrorCreateAndSetStrLoop(benchmark::State& state) { grpc_error* error = GRPC_ERROR_CREATE("Error"); const char* str = "hello"; while (state.KeepRunning()) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, str); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string(str)); } GRPC_ERROR_UNREF(error); track_counters.Finish(state); @@ -253,8 +253,8 @@ static void BM_ErrorGetStatus(benchmark::State& state) { Fixture fixture; while (state.KeepRunning()) { grpc_status_code status; - const char* msg; - grpc_error_get_status(fixture.error(), fixture.deadline(), &status, &msg, + grpc_slice slice; + grpc_error_get_status(fixture.error(), fixture.deadline(), &status, &slice, NULL); } track_counters.Finish(state); From 9202b3fdfdaf890752d7472692296490ec55c750 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Sun, 12 Mar 2017 22:30:38 -0700 Subject: [PATCH 029/186] Arena allocator for grpc --- CMakeLists.txt | 69 +++++++ Makefile | 85 ++++++++ binding.gyp | 1 + build.yaml | 30 +++ config.m4 | 1 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + package.xml | 2 + src/core/lib/support/arena.c | 90 ++++++++ src/core/lib/support/arena.h | 54 +++++ src/python/grpcio/grpc_core_dependencies.py | 1 + test/core/support/arena_test.c | 91 +++++++++ test/cpp/microbenchmarks/bm_arena.cc | 69 +++++++ tools/doxygen/Doxyfile.core.internal | 2 + .../generated/sources_and_headers.json | 39 ++++ tools/run_tests/generated/tests.json | 44 ++++ vsprojects/buildtests_c.sln | 25 +++ vsprojects/vcxproj/gpr/gpr.vcxproj | 3 + vsprojects/vcxproj/gpr/gpr.vcxproj.filters | 6 + .../test/arena_test/arena_test.vcxproj | 193 ++++++++++++++++++ .../arena_test/arena_test.vcxproj.filters | 21 ++ 21 files changed, 831 insertions(+) create mode 100644 src/core/lib/support/arena.c create mode 100644 src/core/lib/support/arena.h create mode 100644 test/core/support/arena_test.c create mode 100644 test/cpp/microbenchmarks/bm_arena.cc create mode 100644 vsprojects/vcxproj/test/arena_test/arena_test.vcxproj create mode 100644 vsprojects/vcxproj/test/arena_test/arena_test.vcxproj.filters diff --git a/CMakeLists.txt b/CMakeLists.txt index d0a65b44932..faa7d528e8c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -332,6 +332,7 @@ add_dependencies(buildtests_c alarm_test) add_dependencies(buildtests_c algorithm_test) add_dependencies(buildtests_c alloc_test) add_dependencies(buildtests_c alpn_test) +add_dependencies(buildtests_c arena_test) add_dependencies(buildtests_c bad_server_response_test) add_dependencies(buildtests_c bdp_estimator_test) add_dependencies(buildtests_c bin_decoder_test) @@ -574,6 +575,9 @@ add_dependencies(buildtests_cxx alarm_cpp_test) add_dependencies(buildtests_cxx async_end2end_test) add_dependencies(buildtests_cxx auth_property_iterator_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) +add_dependencies(buildtests_cxx bm_arena) +endif() +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx bm_call_create) endif() if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -690,6 +694,7 @@ add_library(gpr src/core/lib/profiling/basic_timers.c src/core/lib/profiling/stap_timers.c src/core/lib/support/alloc.c + src/core/lib/support/arena.c src/core/lib/support/avl.c src/core/lib/support/backoff.c src/core/lib/support/cmdline.c @@ -4112,6 +4117,31 @@ target_link_libraries(alpn_test endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) +add_executable(arena_test + test/core/support/arena_test.c +) + + +target_include_directories(arena_test + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${BORINGSSL_ROOT_DIR}/include + PRIVATE ${PROTOBUF_ROOT_DIR}/src + PRIVATE ${BENCHMARK_ROOT_DIR}/include + PRIVATE ${ZLIB_ROOT_DIR} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include +) + +target_link_libraries(arena_test + ${_gRPC_ALLTARGETS_LIBRARIES} + gpr_test_util + gpr +) + +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) + add_executable(bad_server_response_test test/core/end2end/bad_server_response_test.c ) @@ -7626,6 +7656,45 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) +add_executable(bm_arena + test/cpp/microbenchmarks/bm_arena.cc + third_party/googletest/src/gtest-all.cc +) + + +target_include_directories(bm_arena + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${BORINGSSL_ROOT_DIR}/include + PRIVATE ${PROTOBUF_ROOT_DIR}/src + PRIVATE ${BENCHMARK_ROOT_DIR}/include + PRIVATE ${ZLIB_ROOT_DIR} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include + PRIVATE third_party/googletest/include + PRIVATE third_party/googletest + PRIVATE ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(bm_arena + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_benchmark + benchmark + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr_test_util + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + +endif() +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_executable(bm_call_create test/cpp/microbenchmarks/bm_call_create.cc third_party/googletest/src/gtest-all.cc diff --git a/Makefile b/Makefile index a9242dddbdd..c6203768adc 100644 --- a/Makefile +++ b/Makefile @@ -906,6 +906,7 @@ algorithm_test: $(BINDIR)/$(CONFIG)/algorithm_test alloc_test: $(BINDIR)/$(CONFIG)/alloc_test alpn_test: $(BINDIR)/$(CONFIG)/alpn_test api_fuzzer: $(BINDIR)/$(CONFIG)/api_fuzzer +arena_test: $(BINDIR)/$(CONFIG)/arena_test bad_server_response_test: $(BINDIR)/$(CONFIG)/bad_server_response_test bdp_estimator_test: $(BINDIR)/$(CONFIG)/bdp_estimator_test bin_decoder_test: $(BINDIR)/$(CONFIG)/bin_decoder_test @@ -1047,6 +1048,7 @@ wakeup_fd_cv_test: $(BINDIR)/$(CONFIG)/wakeup_fd_cv_test alarm_cpp_test: $(BINDIR)/$(CONFIG)/alarm_cpp_test async_end2end_test: $(BINDIR)/$(CONFIG)/async_end2end_test auth_property_iterator_test: $(BINDIR)/$(CONFIG)/auth_property_iterator_test +bm_arena: $(BINDIR)/$(CONFIG)/bm_arena bm_call_create: $(BINDIR)/$(CONFIG)/bm_call_create bm_chttp2_hpack: $(BINDIR)/$(CONFIG)/bm_chttp2_hpack bm_closure: $(BINDIR)/$(CONFIG)/bm_closure @@ -1285,6 +1287,7 @@ buildtests_c: privatelibs_c \ $(BINDIR)/$(CONFIG)/algorithm_test \ $(BINDIR)/$(CONFIG)/alloc_test \ $(BINDIR)/$(CONFIG)/alpn_test \ + $(BINDIR)/$(CONFIG)/arena_test \ $(BINDIR)/$(CONFIG)/bad_server_response_test \ $(BINDIR)/$(CONFIG)/bdp_estimator_test \ $(BINDIR)/$(CONFIG)/bin_decoder_test \ @@ -1468,6 +1471,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/alarm_cpp_test \ $(BINDIR)/$(CONFIG)/async_end2end_test \ $(BINDIR)/$(CONFIG)/auth_property_iterator_test \ + $(BINDIR)/$(CONFIG)/bm_arena \ $(BINDIR)/$(CONFIG)/bm_call_create \ $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ $(BINDIR)/$(CONFIG)/bm_closure \ @@ -1583,6 +1587,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/alarm_cpp_test \ $(BINDIR)/$(CONFIG)/async_end2end_test \ $(BINDIR)/$(CONFIG)/auth_property_iterator_test \ + $(BINDIR)/$(CONFIG)/bm_arena \ $(BINDIR)/$(CONFIG)/bm_call_create \ $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ $(BINDIR)/$(CONFIG)/bm_closure \ @@ -1663,6 +1668,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/alloc_test || ( echo test alloc_test failed ; exit 1 ) $(E) "[RUN] Testing alpn_test" $(Q) $(BINDIR)/$(CONFIG)/alpn_test || ( echo test alpn_test failed ; exit 1 ) + $(E) "[RUN] Testing arena_test" + $(Q) $(BINDIR)/$(CONFIG)/arena_test || ( echo test arena_test failed ; exit 1 ) $(E) "[RUN] Testing bad_server_response_test" $(Q) $(BINDIR)/$(CONFIG)/bad_server_response_test || ( echo test bad_server_response_test failed ; exit 1 ) $(E) "[RUN] Testing bdp_estimator_test" @@ -1923,6 +1930,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/async_end2end_test || ( echo test async_end2end_test failed ; exit 1 ) $(E) "[RUN] Testing auth_property_iterator_test" $(Q) $(BINDIR)/$(CONFIG)/auth_property_iterator_test || ( echo test auth_property_iterator_test failed ; exit 1 ) + $(E) "[RUN] Testing bm_arena" + $(Q) $(BINDIR)/$(CONFIG)/bm_arena || ( echo test bm_arena failed ; exit 1 ) $(E) "[RUN] Testing bm_call_create" $(Q) $(BINDIR)/$(CONFIG)/bm_call_create || ( echo test bm_call_create failed ; exit 1 ) $(E) "[RUN] Testing bm_chttp2_hpack" @@ -2594,6 +2603,7 @@ LIBGPR_SRC = \ src/core/lib/profiling/basic_timers.c \ src/core/lib/profiling/stap_timers.c \ src/core/lib/support/alloc.c \ + src/core/lib/support/arena.c \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/cmdline.c \ @@ -8094,6 +8104,38 @@ endif endif +ARENA_TEST_SRC = \ + test/core/support/arena_test.c \ + +ARENA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ARENA_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/arena_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/arena_test: $(ARENA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(ARENA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/arena_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/support/arena_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_arena_test: $(ARENA_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ARENA_TEST_OBJS:.o=.dep) +endif +endif + + BAD_SERVER_RESPONSE_TEST_SRC = \ test/core/end2end/bad_server_response_test.c \ @@ -12639,6 +12681,49 @@ endif endif +BM_ARENA_SRC = \ + test/cpp/microbenchmarks/bm_arena.cc \ + +BM_ARENA_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_ARENA_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_arena: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/bm_arena: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_arena: $(PROTOBUF_DEP) $(BM_ARENA_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_ARENA_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_arena + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_arena.o: $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_bm_arena: $(BM_ARENA_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_ARENA_OBJS:.o=.dep) +endif +endif + + BM_CALL_CREATE_SRC = \ test/cpp/microbenchmarks/bm_call_create.cc \ diff --git a/binding.gyp b/binding.gyp index c521a27c300..59b6b600e90 100644 --- a/binding.gyp +++ b/binding.gyp @@ -544,6 +544,7 @@ 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/arena.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', diff --git a/build.yaml b/build.yaml index a32a8a06d34..e799928c047 100644 --- a/build.yaml +++ b/build.yaml @@ -85,6 +85,7 @@ filegroups: - include/grpc/support/useful.h headers: - src/core/lib/profiling/timers.h + - src/core/lib/support/arena.h - src/core/lib/support/backoff.h - src/core/lib/support/block_annotate.h - src/core/lib/support/env.h @@ -101,6 +102,7 @@ filegroups: - src/core/lib/profiling/basic_timers.c - src/core/lib/profiling/stap_timers.c - src/core/lib/support/alloc.c + - src/core/lib/support/arena.c - src/core/lib/support/avl.c - src/core/lib/support/backoff.c - src/core/lib/support/cmdline.c @@ -1483,6 +1485,14 @@ targets: - test/core/end2end/fuzzers/api_fuzzer_corpus dict: test/core/end2end/fuzzers/api_fuzzer.dictionary maxlen: 2048 +- name: arena_test + build: test + language: c + src: + - test/core/support/arena_test.c + deps: + - gpr_test_util + - gpr - name: bad_server_response_test build: test language: c @@ -3052,6 +3062,26 @@ targets: - grpc - gpr_test_util - gpr +- name: bm_arena + build: test + language: c++ + src: + - test/cpp/microbenchmarks/bm_arena.cc + deps: + - grpc_benchmark + - benchmark + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr_test_util + - gpr + args: + - --benchmark_min_time=0 + platforms: + - mac + - linux + - posix - name: bm_call_create build: test language: c++ diff --git a/config.m4 b/config.m4 index 90536e503ed..f43a0316380 100644 --- a/config.m4 +++ b/config.m4 @@ -39,6 +39,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/profiling/basic_timers.c \ src/core/lib/profiling/stap_timers.c \ src/core/lib/support/alloc.c \ + src/core/lib/support/arena.c \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/cmdline.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 027babcda46..8a5dcbb99cb 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -196,6 +196,7 @@ Pod::Spec.new do |s| # To save you from scrolling, this is the last part of the podspec. ss.source_files = 'src/core/lib/profiling/timers.h', + 'src/core/lib/support/arena.h', 'src/core/lib/support/backoff.h', 'src/core/lib/support/block_annotate.h', 'src/core/lib/support/env.h', @@ -211,6 +212,7 @@ Pod::Spec.new do |s| 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/arena.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', @@ -675,6 +677,7 @@ Pod::Spec.new do |s| 'src/core/plugin_registry/grpc_plugin_registry.c' ss.private_header_files = 'src/core/lib/profiling/timers.h', + 'src/core/lib/support/arena.h', 'src/core/lib/support/backoff.h', 'src/core/lib/support/block_annotate.h', 'src/core/lib/support/env.h', diff --git a/grpc.gemspec b/grpc.gemspec index 8d5b7b2ab1c..825c23d7a87 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -82,6 +82,7 @@ Gem::Specification.new do |s| s.files += %w( include/grpc/impl/codegen/sync_posix.h ) s.files += %w( include/grpc/impl/codegen/sync_windows.h ) s.files += %w( src/core/lib/profiling/timers.h ) + s.files += %w( src/core/lib/support/arena.h ) s.files += %w( src/core/lib/support/backoff.h ) s.files += %w( src/core/lib/support/block_annotate.h ) s.files += %w( src/core/lib/support/env.h ) @@ -97,6 +98,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/profiling/basic_timers.c ) s.files += %w( src/core/lib/profiling/stap_timers.c ) s.files += %w( src/core/lib/support/alloc.c ) + s.files += %w( src/core/lib/support/arena.c ) s.files += %w( src/core/lib/support/avl.c ) s.files += %w( src/core/lib/support/backoff.c ) s.files += %w( src/core/lib/support/cmdline.c ) diff --git a/package.xml b/package.xml index 4167bef26e3..67669286c37 100644 --- a/package.xml +++ b/package.xml @@ -91,6 +91,7 @@ + @@ -106,6 +107,7 @@ + diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c new file mode 100644 index 00000000000..a5b0be4d48e --- /dev/null +++ b/src/core/lib/support/arena.c @@ -0,0 +1,90 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/support/arena.h" +#include +#include +#include + +typedef struct zone { + size_t size_begin; + size_t size_end; + gpr_atm next_atm; +} zone; + +struct gpr_arena { + gpr_atm size_so_far; + zone initial_zone; +}; + +gpr_arena *gpr_arena_create(size_t initial_size) { + gpr_arena *a = gpr_zalloc(sizeof(gpr_arena) + initial_size); + a->initial_zone.size_end = initial_size; + return a; +} + +size_t gpr_arena_destroy(gpr_arena *arena) { + gpr_atm size = gpr_atm_no_barrier_load(&arena->size_so_far); + zone *z = (zone *)gpr_atm_no_barrier_load(&arena->initial_zone.next_atm); + gpr_free(arena); + while (z) { + zone *next_z = (zone *)gpr_atm_no_barrier_load(&z->next_atm); + gpr_free(z); + z = next_z; + } + return (size_t)size; +} + +void *gpr_arena_alloc(gpr_arena *arena, size_t size) { + size_t start = + (size_t)gpr_atm_no_barrier_fetch_add(&arena->size_so_far, size); + zone *z = &arena->initial_zone; + while (start > z->size_begin) { + zone *next_z = (zone *)gpr_atm_acq_load(&z->next_atm); + while (next_z == NULL) { + size_t next_z_size = GPR_MAX(2 * start, size); + next_z = gpr_zalloc(sizeof(zone) + next_z_size); + next_z->size_begin = z->size_end; + next_z->size_end = z->size_end + next_z_size; + if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { + gpr_free(next_z); + next_z = NULL; + } + } + z = next_z; + } + if (start + size > z->size_end) { + return gpr_arena_alloc(arena, size); + } + return ((char *)(z + 1)) + start - z->size_begin; +} diff --git a/src/core/lib/support/arena.h b/src/core/lib/support/arena.h new file mode 100644 index 00000000000..c28033ffc35 --- /dev/null +++ b/src/core/lib/support/arena.h @@ -0,0 +1,54 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +// \file Arena based allocator +// Allows very fast allocation of memory, but that memory cannot be freed until +// the arena as a whole is freed +// Tracks the total memory allocated against it, so that future arenas can +// pre-allocate the right amount of memory + +#ifndef GRPC_CORE_LIB_SUPPORT_ARENA_H +#define GRPC_CORE_LIB_SUPPORT_ARENA_H + +#include + +typedef struct gpr_arena gpr_arena; + +// Create an arena, with \a initial_size bytes in the first allocated buffer +gpr_arena *gpr_arena_create(size_t initial_size); +// Allocate \a size bytes from the arena +void *gpr_arena_alloc(gpr_arena *arena, size_t size); +// Destroy an arena, returning the total number of bytes allocated +size_t gpr_arena_destroy(gpr_arena *arena); + +#endif /* GRPC_CORE_LIB_SUPPORT_ARENA_H */ diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index a9f20e6d2a8..52d3ffd2c43 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -33,6 +33,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/arena.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', diff --git a/test/core/support/arena_test.c b/test/core/support/arena_test.c new file mode 100644 index 00000000000..bbf6d48db35 --- /dev/null +++ b/test/core/support/arena_test.c @@ -0,0 +1,91 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/support/arena.h" + +#include +#include +#include +#include +#include + +#include "src/core/lib/support/string.h" +#include "test/core/util/test_config.h" + +static void test_noop(void) { gpr_arena_destroy(gpr_arena_create(1)); } + +static void test(const char *name, size_t init_size, const size_t *allocs, + size_t nallocs) { + gpr_strvec v; + char *s; + gpr_strvec_init(&v); + gpr_asprintf(&s, "test '%s': %" PRIdPTR " <- {", name, init_size); + gpr_strvec_add(&v, s); + for (size_t i = 0; i < nallocs; i++) { + gpr_asprintf(&s, "%" PRIdPTR ",", allocs[i]); + gpr_strvec_add(&v, s); + } + gpr_strvec_add(&v, gpr_strdup("}")); + s = gpr_strvec_flatten(&v, NULL); + gpr_strvec_destroy(&v); + gpr_log(GPR_INFO, "%s", s); + gpr_free(s); + + gpr_arena *a = gpr_arena_create(init_size); + void **ps = gpr_zalloc(sizeof(*ps) * nallocs); + for (size_t i = 0; i < nallocs; i++) { + ps[i] = gpr_arena_alloc(a, allocs[i]); + for (size_t j = 0; j < i; j++) { + GPR_ASSERT(ps[i] != ps[j]); + } + } + gpr_arena_destroy(a); +} + +#define TEST(name, init_size, ...) \ + static const size_t allocs_##name[] = {__VA_ARGS__}; \ + test(#name, init_size, allocs_##name, GPR_ARRAY_SIZE(allocs_##name)) + +int main(int argc, char *argv[]) { + grpc_test_init(argc, argv); + + test_noop(); + TEST(0_1, 0, 1); + TEST(1_1, 1, 1); + TEST(1_2, 1, 2); + TEST(1_3, 1, 3); + TEST(1_inc, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + TEST(6_123, 6, 1, 2, 3); + + return 0; +} diff --git a/test/cpp/microbenchmarks/bm_arena.cc b/test/cpp/microbenchmarks/bm_arena.cc new file mode 100644 index 00000000000..33e073f7495 --- /dev/null +++ b/test/cpp/microbenchmarks/bm_arena.cc @@ -0,0 +1,69 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* Benchmark arenas */ + +extern "C" { +#include "src/core/lib/support/arena.h" +} +#include "test/cpp/microbenchmarks/helpers.h" +#include "third_party/benchmark/include/benchmark/benchmark.h" + +static void BM_Arena_NoOp(benchmark::State& state) { + while (state.KeepRunning()) { + gpr_arena_destroy(gpr_arena_create(state.range(0))); + } +} +BENCHMARK(BM_Arena_NoOp)->Range(1, 1024 * 1024); + +static void BM_Arena_ManyAlloc(benchmark::State& state) { + gpr_arena* a = gpr_arena_create(state.range(0)); + while (state.KeepRunning()) { + gpr_arena_alloc(a, state.range(1)); + } + gpr_arena_destroy(a); +} +BENCHMARK(BM_Arena_ManyAlloc)->Ranges({{1, 1024 * 1024}, {1, 32 * 1024}}); + +static void BM_Arena_Batch(benchmark::State& state) { + while (state.KeepRunning()) { + gpr_arena* a = gpr_arena_create(state.range(0)); + for (int i = 0; i < state.range(1); i++) { + gpr_arena_alloc(a, state.range(2)); + } + gpr_arena_destroy(a); + } +} +BENCHMARK(BM_Arena_Batch)->Ranges({{1, 64 * 1024}, {1, 64}, {1, 1024}}); + +BENCHMARK_MAIN(); diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 131a0134519..e4f56f23747 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1228,6 +1228,8 @@ src/core/lib/slice/slice_internal.h \ src/core/lib/slice/slice_string_helpers.c \ src/core/lib/slice/slice_string_helpers.h \ src/core/lib/support/alloc.c \ +src/core/lib/support/arena.c \ +src/core/lib/support/arena.h \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/backoff.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 767c2b2e368..1dc86068850 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -84,6 +84,21 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "gpr", + "gpr_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c", + "name": "arena_test", + "src": [ + "test/core/support/arena_test.c" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "gpr", @@ -2429,6 +2444,27 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "benchmark", + "gpr", + "gpr_test_util", + "grpc", + "grpc++", + "grpc++_test_util", + "grpc_benchmark", + "grpc_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c++", + "name": "bm_arena", + "src": [ + "test/cpp/microbenchmarks/bm_arena.cc" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "benchmark", @@ -7243,6 +7279,7 @@ "include/grpc/support/tls_pthread.h", "include/grpc/support/useful.h", "src/core/lib/profiling/timers.h", + "src/core/lib/support/arena.h", "src/core/lib/support/backoff.h", "src/core/lib/support/block_annotate.h", "src/core/lib/support/env.h", @@ -7290,6 +7327,8 @@ "src/core/lib/profiling/stap_timers.c", "src/core/lib/profiling/timers.h", "src/core/lib/support/alloc.c", + "src/core/lib/support/arena.c", + "src/core/lib/support/arena.h", "src/core/lib/support/avl.c", "src/core/lib/support/backoff.c", "src/core/lib/support/backoff.h", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index f9e2a19d0ef..1eebc9a1d50 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -89,6 +89,28 @@ "windows" ] }, + { + "args": [], + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": false, + "language": "c", + "name": "arena_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, { "args": [], "ci_platforms": [ @@ -2605,6 +2627,28 @@ "windows" ] }, + { + "args": [ + "--benchmark_min_time=0" + ], + "ci_platforms": [ + "linux", + "mac", + "posix" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": false, + "language": "c++", + "name": "bm_arena", + "platforms": [ + "linux", + "mac", + "posix" + ] + }, { "args": [ "--benchmark_min_time=0" diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln index daafd3f3504..c5bbaed60c4 100644 --- a/vsprojects/buildtests_c.sln +++ b/vsprojects/buildtests_c.sln @@ -45,6 +45,15 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "alpn_test", "vcxproj\test\a {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "arena_test", "vcxproj\test\arena_test\arena_test.vcxproj", "{D85AC722-A88F-4280-F62E-672F571787FF}" + ProjectSection(myProperties) = preProject + lib = "False" + EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {EAB0A629-17A9-44DB-B5FF-E91A721FE037} = {EAB0A629-17A9-44DB-B5FF-E91A721FE037} + {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} + EndProjectSection +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bad_client_test", "vcxproj\test/bad_client\bad_client_test\bad_client_test.vcxproj", "{BA67B418-B699-E41A-9CC4-0279C49481A5}" ProjectSection(myProperties) = preProject lib = "True" @@ -1708,6 +1717,22 @@ Global {5BAAE7EA-A972-DD80-F190-29B9E3110BB3}.Release-DLL|Win32.Build.0 = Release|Win32 {5BAAE7EA-A972-DD80-F190-29B9E3110BB3}.Release-DLL|x64.ActiveCfg = Release|x64 {5BAAE7EA-A972-DD80-F190-29B9E3110BB3}.Release-DLL|x64.Build.0 = Release|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug|Win32.ActiveCfg = Debug|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug|x64.ActiveCfg = Debug|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release|Win32.ActiveCfg = Release|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release|x64.ActiveCfg = Release|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug|Win32.Build.0 = Debug|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug|x64.Build.0 = Debug|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release|Win32.Build.0 = Release|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release|x64.Build.0 = Release|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug-DLL|Win32.ActiveCfg = Debug|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug-DLL|Win32.Build.0 = Debug|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug-DLL|x64.ActiveCfg = Debug|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Debug-DLL|x64.Build.0 = Debug|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release-DLL|Win32.ActiveCfg = Release|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release-DLL|Win32.Build.0 = Release|Win32 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release-DLL|x64.ActiveCfg = Release|x64 + {D85AC722-A88F-4280-F62E-672F571787FF}.Release-DLL|x64.Build.0 = Release|x64 {BA67B418-B699-E41A-9CC4-0279C49481A5}.Debug|Win32.ActiveCfg = Debug|Win32 {BA67B418-B699-E41A-9CC4-0279C49481A5}.Debug|x64.ActiveCfg = Debug|x64 {BA67B418-B699-E41A-9CC4-0279C49481A5}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj b/vsprojects/vcxproj/gpr/gpr.vcxproj index 44c21ddeb31..1b37ace69ab 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj @@ -188,6 +188,7 @@ + @@ -208,6 +209,8 @@ + + diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters index a5924a624a8..fafd54cdf93 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters @@ -10,6 +10,9 @@ src\core\lib\support + + src\core\lib\support + src\core\lib\support @@ -254,6 +257,9 @@ src\core\lib\profiling + + src\core\lib\support + src\core\lib\support diff --git a/vsprojects/vcxproj/test/arena_test/arena_test.vcxproj b/vsprojects/vcxproj/test/arena_test/arena_test.vcxproj new file mode 100644 index 00000000000..5ae2f8e483c --- /dev/null +++ b/vsprojects/vcxproj/test/arena_test/arena_test.vcxproj @@ -0,0 +1,193 @@ + + + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {D85AC722-A88F-4280-F62E-672F571787FF} + true + $(SolutionDir)IntDir\$(MSBuildProjectName)\ + + + + v100 + + + v110 + + + v120 + + + v140 + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + + arena_test + static + Debug + static + Debug + + + arena_test + static + Release + static + Release + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreadedDebug + true + None + false + + + Console + true + false + + + + + + NotUsing + Level3 + Disabled + WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + MultiThreadedDebug + true + None + false + + + Console + true + false + + + + + + NotUsing + Level3 + MaxSpeed + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + true + true + MultiThreaded + true + None + false + + + Console + true + false + true + true + + + + + + NotUsing + Level3 + MaxSpeed + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + true + true + MultiThreaded + true + None + false + + + Console + true + false + true + true + + + + + + + + + + {EAB0A629-17A9-44DB-B5FF-E91A721FE037} + + + {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/test/arena_test/arena_test.vcxproj.filters b/vsprojects/vcxproj/test/arena_test/arena_test.vcxproj.filters new file mode 100644 index 00000000000..c470f175272 --- /dev/null +++ b/vsprojects/vcxproj/test/arena_test/arena_test.vcxproj.filters @@ -0,0 +1,21 @@ + + + + + test\core\support + + + + + + {130788b2-eacc-90df-a4f6-f5102a7d3370} + + + {5c3e1753-6fdb-9476-f98c-a3a394fac54a} + + + {1d3d2cc8-4e69-8b2e-6ceb-6569fcb19a86} + + + + From f134206509de8417f3f568e8b599290c1b955e1f Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Sun, 12 Mar 2017 22:39:11 -0700 Subject: [PATCH 030/186] Fix android build --- src/core/lib/iomgr/port.h | 4 ++++ src/core/lib/iomgr/tcp_server_posix.c | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h index f1897bb91f2..94a454c0b7c 100644 --- a/src/core/lib/iomgr/port.h +++ b/src/core/lib/iomgr/port.h @@ -39,6 +39,7 @@ #if defined(GRPC_UV) // Do nothing #elif defined(GPR_MANYLINUX1) +#define GRPC_HAVE_IFADDRS 1 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 #define GRPC_HAVE_IP_PKTINFO 1 #define GRPC_HAVE_MSG_NOSIGNAL 1 @@ -65,6 +66,7 @@ #define GRPC_POSIX_WAKEUP_FD 1 #define GRPC_TIMER_USE_GENERIC 1 #elif defined(GPR_LINUX) +#define GRPC_HAVE_IFADDRS 1 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 #define GRPC_HAVE_IP_PKTINFO 1 #define GRPC_HAVE_MSG_NOSIGNAL 1 @@ -90,6 +92,7 @@ #define GRPC_POSIX_SOCKETUTILS #endif #elif defined(GPR_APPLE) +#define GRPC_HAVE_IFADDRS 1 #define GRPC_HAVE_SO_NOSIGPIPE 1 #define GRPC_HAVE_UNIX_SOCKET 1 #define GRPC_MSG_IOVLEN_TYPE int @@ -100,6 +103,7 @@ #define GRPC_POSIX_WAKEUP_FD 1 #define GRPC_TIMER_USE_GENERIC 1 #elif defined(GPR_FREEBSD) +#define GRPC_HAVE_IFADDRS 1 #define GRPC_HAVE_IPV6_RECVPKTINFO 1 #define GRPC_HAVE_SO_NOSIGPIPE 1 #define GRPC_HAVE_UNIX_SOCKET 1 diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 5f286a6723c..7cc44fabe7e 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -42,9 +42,12 @@ #include "src/core/lib/iomgr/tcp_server.h" +#ifdef GRPC_HAVE_IFADDRS +#include +#endif /* GRPC_HAVE_IFADDRS */ + #include #include -#include #include #include #include @@ -598,6 +601,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, unsigned port_index, int requested_port, int *out_port) { +#ifdef GRPC_HAVE_IFADDRS struct ifaddrs *ifa = NULL; struct ifaddrs *ifa_it; unsigned fd_index = 0; @@ -685,6 +689,9 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, *out_port = sp->port; return GRPC_ERROR_NONE; } +#else /* GRPC_HAVE_IFADDRS */ + return GRPC_ERROR_NONE; +#endif /* GRPC_HAVE_IFADDRS */ } /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */ From 181085694d86fdd3ee59675a96f89283b9f942ad Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Mon, 13 Mar 2017 11:21:48 +0100 Subject: [PATCH 031/186] deprecate ChannelOptions.MaxMessageSize --- src/csharp/Grpc.Core/ChannelOptions.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/csharp/Grpc.Core/ChannelOptions.cs b/src/csharp/Grpc.Core/ChannelOptions.cs index b6eeceabc4c..46a2c6695f6 100644 --- a/src/csharp/Grpc.Core/ChannelOptions.cs +++ b/src/csharp/Grpc.Core/ChannelOptions.cs @@ -151,7 +151,14 @@ namespace Grpc.Core public const string MaxConcurrentStreams = "grpc.max_concurrent_streams"; /// Maximum message length that the channel can receive - public const string MaxMessageLength = "grpc.max_message_length"; + public const string MaxReceiveMessageLength = "grpc.max_receive_message_length"; + + /// Maximum message length that the channel can send + public const string MaxSendMessageLength = "grpc.max_send_message_length"; + + /// Obsolete, for backward compatibility only. + [Obsolete("Use MaxReceiveMessageLength instead.")] + public const string MaxMessageLength = MaxReceiveMessageLength; /// Initial sequence number for http2 transports public const string Http2InitialSequenceNumber = "grpc.http2.initial_sequence_number"; From 0dd81003b5a9601d4bc79afdd269a7e93b53c5a9 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 06:57:29 -0700 Subject: [PATCH 032/186] Concurrent test --- src/core/lib/support/arena.c | 5 ++++ test/core/support/arena_test.c | 43 ++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index a5b0be4d48e..faceb1a1eb3 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -36,6 +36,9 @@ #include #include +#define ROUND_UP_TO_ALIGNMENT_SIZE(x) \ + (((x) + GPR_MAX_ALIGNMENT - 1u) & ~(GPR_MAX_ALIGNMENT - 1u)) + typedef struct zone { size_t size_begin; size_t size_end; @@ -48,6 +51,7 @@ struct gpr_arena { }; gpr_arena *gpr_arena_create(size_t initial_size) { + initial_size = ROUND_UP_TO_ALIGNMENT_SIZE(initial_size); gpr_arena *a = gpr_zalloc(sizeof(gpr_arena) + initial_size); a->initial_zone.size_end = initial_size; return a; @@ -66,6 +70,7 @@ size_t gpr_arena_destroy(gpr_arena *arena) { } void *gpr_arena_alloc(gpr_arena *arena, size_t size) { + size = ROUND_UP_TO_ALIGNMENT_SIZE(size); size_t start = (size_t)gpr_atm_no_barrier_fetch_add(&arena->size_so_far, size); zone *z = &arena->initial_zone; diff --git a/test/core/support/arena_test.c b/test/core/support/arena_test.c index bbf6d48db35..3e21867bcff 100644 --- a/test/core/support/arena_test.c +++ b/test/core/support/arena_test.c @@ -36,8 +36,11 @@ #include #include #include +#include +#include #include #include +#include #include "src/core/lib/support/string.h" #include "test/core/util/test_config.h" @@ -65,9 +68,12 @@ static void test(const char *name, size_t init_size, const size_t *allocs, void **ps = gpr_zalloc(sizeof(*ps) * nallocs); for (size_t i = 0; i < nallocs; i++) { ps[i] = gpr_arena_alloc(a, allocs[i]); + // ensure no duplicate results for (size_t j = 0; j < i; j++) { GPR_ASSERT(ps[i] != ps[j]); } + // ensure writable + memset(ps[i], 1, allocs[i]); } gpr_arena_destroy(a); } @@ -76,6 +82,42 @@ static void test(const char *name, size_t init_size, const size_t *allocs, static const size_t allocs_##name[] = {__VA_ARGS__}; \ test(#name, init_size, allocs_##name, GPR_ARRAY_SIZE(allocs_##name)) +#define CONCURRENT_TEST_ITERATIONS 100000 +#define CONCURRENT_TEST_THREADS 100 + +typedef struct { + gpr_event ev_start; + gpr_arena *arena; +} concurrent_test_args; + +static void concurrent_test_body(void *arg) { + concurrent_test_args *a = arg; + gpr_event_wait(&a->ev_start, gpr_inf_future(GPR_CLOCK_REALTIME)); + for (size_t i = 0; i < CONCURRENT_TEST_ITERATIONS; i++) { + *(char *)gpr_arena_alloc(a->arena, 1) = (char)i; + } +} + +static void concurrent_test(void) { + concurrent_test_args args; + gpr_event_init(&args.ev_start); + args.arena = gpr_arena_create(1024); + + gpr_thd_id thds[CONCURRENT_TEST_THREADS]; + + for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { + gpr_thd_options opt = gpr_thd_options_default(); + gpr_thd_options_is_joinable(&opt); + gpr_thd_new(&thds[i], concurrent_test_body, &args, &opt); + } + + gpr_event_set(&args.ev_start, (void *)1); + + for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { + gpr_thd_join(thds[i]); + } +} + int main(int argc, char *argv[]) { grpc_test_init(argc, argv); @@ -86,6 +128,7 @@ int main(int argc, char *argv[]) { TEST(1_3, 1, 3); TEST(1_inc, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); TEST(6_123, 6, 1, 2, 3); + concurrent_test(); return 0; } From 37723c9ee07c05633b763cfd5cfe0935a20a9258 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 07:45:44 -0700 Subject: [PATCH 033/186] Fix race condition --- src/core/lib/support/arena.c | 11 +++++++---- test/core/support/arena_test.c | 7 ++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index faceb1a1eb3..b5c32b20416 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -34,6 +34,7 @@ #include "src/core/lib/support/arena.h" #include #include +#include #include #define ROUND_UP_TO_ALIGNMENT_SIZE(x) \ @@ -74,16 +75,16 @@ void *gpr_arena_alloc(gpr_arena *arena, size_t size) { size_t start = (size_t)gpr_atm_no_barrier_fetch_add(&arena->size_so_far, size); zone *z = &arena->initial_zone; - while (start > z->size_begin) { + while (start > z->size_end) { zone *next_z = (zone *)gpr_atm_acq_load(&z->next_atm); - while (next_z == NULL) { - size_t next_z_size = GPR_MAX(2 * start, size); + if (next_z == NULL) { + size_t next_z_size = GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); next_z = gpr_zalloc(sizeof(zone) + next_z_size); next_z->size_begin = z->size_end; next_z->size_end = z->size_end + next_z_size; if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { gpr_free(next_z); - next_z = NULL; + next_z = (zone*)gpr_atm_acq_load(&z->next_atm); } } z = next_z; @@ -91,5 +92,7 @@ void *gpr_arena_alloc(gpr_arena *arena, size_t size) { if (start + size > z->size_end) { return gpr_arena_alloc(arena, size); } + GPR_ASSERT(start >= z->size_begin); + GPR_ASSERT(start + size <= z->size_end); return ((char *)(z + 1)) + start - z->size_begin; } diff --git a/test/core/support/arena_test.c b/test/core/support/arena_test.c index 3e21867bcff..35b2bbd1b10 100644 --- a/test/core/support/arena_test.c +++ b/test/core/support/arena_test.c @@ -76,6 +76,7 @@ static void test(const char *name, size_t init_size, const size_t *allocs, memset(ps[i], 1, allocs[i]); } gpr_arena_destroy(a); + gpr_free(ps); } #define TEST(name, init_size, ...) \ @@ -99,6 +100,8 @@ static void concurrent_test_body(void *arg) { } static void concurrent_test(void) { + gpr_log(GPR_DEBUG, "concurrent_test"); + concurrent_test_args args; gpr_event_init(&args.ev_start); args.arena = gpr_arena_create(1024); @@ -107,7 +110,7 @@ static void concurrent_test(void) { for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { gpr_thd_options opt = gpr_thd_options_default(); - gpr_thd_options_is_joinable(&opt); + gpr_thd_options_set_joinable(&opt); gpr_thd_new(&thds[i], concurrent_test_body, &args, &opt); } @@ -116,6 +119,8 @@ static void concurrent_test(void) { for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { gpr_thd_join(thds[i]); } + + gpr_arena_destroy(args.arena); } int main(int argc, char *argv[]) { From 09acb108b7620eff840fb0428f7eb159a4f27cf4 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 07:45:59 -0700 Subject: [PATCH 034/186] clang-format --- src/core/lib/support/arena.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index b5c32b20416..6610acd3a07 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -78,13 +78,14 @@ void *gpr_arena_alloc(gpr_arena *arena, size_t size) { while (start > z->size_end) { zone *next_z = (zone *)gpr_atm_acq_load(&z->next_atm); if (next_z == NULL) { - size_t next_z_size = GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); + size_t next_z_size = + GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); next_z = gpr_zalloc(sizeof(zone) + next_z_size); next_z->size_begin = z->size_end; next_z->size_end = z->size_end + next_z_size; if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { gpr_free(next_z); - next_z = (zone*)gpr_atm_acq_load(&z->next_atm); + next_z = (zone *)gpr_atm_acq_load(&z->next_atm); } } z = next_z; From d9dd625f6080577abf31c4f8fe4f869ba0d6a233 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 08:31:35 -0700 Subject: [PATCH 035/186] Fix compile error --- src/core/ext/transport/chttp2/transport/hpack_parser.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index d94f66001d8..1865b997b7d 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -1620,15 +1620,15 @@ void grpc_chttp2_hpack_parser_destroy(grpc_exec_ctx *exec_ctx, grpc_error *grpc_chttp2_hpack_parser_parse(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, grpc_slice slice) { - /* max number of bytes to parse at a time... limits call stack depth on - * compilers without TCO */ - const size_t max_parse_length = 1024; +/* max number of bytes to parse at a time... limits call stack depth on + * compilers without TCO */ +#define MAX_PARSE_LENGTH 1024 p->current_slice_refcount = slice.refcount; uint8_t *start = GRPC_SLICE_START_PTR(slice); uint8_t *end = GRPC_SLICE_END_PTR(slice); grpc_error *error = GRPC_ERROR_NONE; while (start != end && error == GRPC_ERROR_NONE) { - uint8_t *target = start + GPR_MIN(max_parse_length, end - start); + uint8_t *target = start + GPR_MIN(MAX_PARSE_LENGTH, end - start); error = p->state(exec_ctx, p, start, target); start = target; } From e7a1702fe99ef598efd957c1f7546904298b9dba Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 10:20:38 -0700 Subject: [PATCH 036/186] Fixes --- src/core/lib/channel/channel_stack.c | 7 ++++--- src/core/lib/channel/channel_stack.h | 10 +++++----- src/core/lib/channel/compress_filter.c | 2 +- src/core/lib/channel/connected_channel.c | 4 ++-- src/core/lib/channel/deadline_filter.c | 2 +- src/core/lib/channel/http_client_filter.c | 2 +- src/core/lib/channel/http_server_filter.c | 2 +- src/core/lib/channel/message_size_filter.c | 2 +- src/core/lib/surface/call.c | 22 ++++++++++++++++++---- src/core/lib/surface/lame_client.c | 4 ++-- src/core/lib/surface/server.c | 2 +- src/core/lib/transport/transport.h | 3 ++- src/core/lib/transport/transport_impl.h | 3 ++- 13 files changed, 41 insertions(+), 24 deletions(-) diff --git a/src/core/lib/channel/channel_stack.c b/src/core/lib/channel/channel_stack.c index 3fb2a60ac71..187f2c8b343 100644 --- a/src/core/lib/channel/channel_stack.c +++ b/src/core/lib/channel/channel_stack.c @@ -241,15 +241,16 @@ void grpc_call_stack_ignore_set_pollset_or_pollset_set( void grpc_call_stack_destroy(grpc_exec_ctx *exec_ctx, grpc_call_stack *stack, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *then_schedule_closure) { grpc_call_element *elems = CALL_ELEMS_FROM_STACK(stack); size_t count = stack->count; size_t i; /* destroy per-filter data */ for (i = 0; i < count; i++) { - elems[i].filter->destroy_call_elem(exec_ctx, &elems[i], final_info, - i == count - 1 ? and_free_memory : NULL); + elems[i].filter->destroy_call_elem( + exec_ctx, &elems[i], final_info, + i == count - 1 ? then_schedule_closure : NULL); } } diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index 6d3340bcbf8..1b02f02dd61 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -139,12 +139,12 @@ typedef struct { /* Destroy per call data. The filter does not need to do any chaining. The bottom filter of a stack will be passed a non-NULL pointer to - \a and_free_memory that should be passed to gpr_free when destruction - is complete. \a final_info contains data about the completed call, mainly - for reporting purposes. */ + \a then_schedule_closure that should be passed to grpc_closure_sched when + destruction is complete. \a final_info contains data about the completed + call, mainly for reporting purposes. */ void (*destroy_call_elem)(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory); + grpc_closure *then_schedule_closure); /* sizeof(per channel data) */ size_t sizeof_channel_data; @@ -271,7 +271,7 @@ void grpc_call_stack_set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, /* Destroy a call stack */ void grpc_call_stack_destroy(grpc_exec_ctx *exec_ctx, grpc_call_stack *stack, const grpc_call_final_info *final_info, - void *and_free_memory); + grpc_closure *then_schedule_closure); /* Ignore set pollset{_set} - used by filters if they don't care about pollsets * at all. Does nothing. */ diff --git a/src/core/lib/channel/compress_filter.c b/src/core/lib/channel/compress_filter.c index aa41014a217..02dc479f3a2 100644 --- a/src/core/lib/channel/compress_filter.c +++ b/src/core/lib/channel/compress_filter.c @@ -292,7 +292,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { /* grab pointers to our data from the call element */ call_data *calld = elem->call_data; grpc_slice_buffer_destroy_internal(exec_ctx, &calld->slices); diff --git a/src/core/lib/channel/connected_channel.c b/src/core/lib/channel/connected_channel.c index 29796f7ca7e..64cf95b5a58 100644 --- a/src/core/lib/channel/connected_channel.c +++ b/src/core/lib/channel/connected_channel.c @@ -105,12 +105,12 @@ static void set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *then_schedule_closure) { call_data *calld = elem->call_data; channel_data *chand = elem->channel_data; grpc_transport_destroy_stream(exec_ctx, chand->transport, TRANSPORT_STREAM_FROM_CALL_DATA(calld), - and_free_memory); + then_schedule_closure); } /* Constructor for channel_data */ diff --git a/src/core/lib/channel/deadline_filter.c b/src/core/lib/channel/deadline_filter.c index 5a12d62f1d1..34114bbebfd 100644 --- a/src/core/lib/channel/deadline_filter.c +++ b/src/core/lib/channel/deadline_filter.c @@ -256,7 +256,7 @@ static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx, // Destructor for call_data. Used for both client and server filters. static void destroy_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem, const grpc_call_final_info* final_info, - void* and_free_memory) { + grpc_closure* ignored) { grpc_deadline_state_destroy(exec_ctx, elem); } diff --git a/src/core/lib/channel/http_client_filter.c b/src/core/lib/channel/http_client_filter.c index c031533dd86..f9d0d689acd 100644 --- a/src/core/lib/channel/http_client_filter.c +++ b/src/core/lib/channel/http_client_filter.c @@ -412,7 +412,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *calld = elem->call_data; grpc_slice_buffer_destroy_internal(exec_ctx, &calld->slices); } diff --git a/src/core/lib/channel/http_server_filter.c b/src/core/lib/channel/http_server_filter.c index fb70de8e96c..bebd3af335b 100644 --- a/src/core/lib/channel/http_server_filter.c +++ b/src/core/lib/channel/http_server_filter.c @@ -358,7 +358,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *calld = elem->call_data; grpc_slice_buffer_destroy_internal(exec_ctx, &calld->read_slice_buffer); } diff --git a/src/core/lib/channel/message_size_filter.c b/src/core/lib/channel/message_size_filter.c index b424c0d2acb..5ba13fe2514 100644 --- a/src/core/lib/channel/message_size_filter.c +++ b/src/core/lib/channel/message_size_filter.c @@ -200,7 +200,7 @@ static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx, // Destructor for call_data. static void destroy_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem, const grpc_call_final_info* final_info, - void* ignored) {} + grpc_closure* ignored) {} // Constructor for channel_data. static grpc_error* init_channel_elem(grpc_exec_ctx* exec_ctx, diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index c2547c5147a..b57dd8bd8ae 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -51,6 +51,7 @@ #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" +#include "src/core/lib/support/arena.h" #include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" @@ -138,6 +139,7 @@ typedef struct batch_control { } batch_control; struct grpc_call { + gpr_arena *arena; grpc_completion_queue *cq; grpc_polling_entity pollent; grpc_channel *channel; @@ -212,6 +214,8 @@ struct grpc_call { grpc_closure receiving_initial_metadata_ready; uint32_t test_only_last_message_flags; + grpc_closure release_call; + union { struct { grpc_status_code *status; @@ -273,7 +277,10 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, grpc_channel_get_channel_stack(args->channel); grpc_call *call; GPR_TIMER_BEGIN("grpc_call_create", 0); - call = gpr_zalloc(sizeof(grpc_call) + channel_stack->call_stack_size); + gpr_arena *arena = gpr_arena_create(8192); + call = gpr_arena_alloc(arena, + sizeof(grpc_call) + channel_stack->call_stack_size); + call->arena = arena; *out_call = call; gpr_mu_init(&call->mu); call->channel = args->channel; @@ -421,6 +428,13 @@ void grpc_call_internal_unref(grpc_exec_ctx *exec_ctx, grpc_call *c REF_ARG) { GRPC_CALL_STACK_UNREF(exec_ctx, CALL_STACK_FROM_CALL(c), REF_REASON); } +static void release_call(grpc_exec_ctx *exec_ctx, void *call, + grpc_error *error) { + grpc_call *c = call; + gpr_arena_destroy(c->arena); + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->channel, "call"); +} + static void set_status_value_directly(grpc_status_code status, void *dest); static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { @@ -447,7 +461,6 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, if (c->cq) { GRPC_CQ_INTERNAL_UNREF(c->cq, "bind"); } - grpc_channel *channel = c->channel; get_final_status(call, set_status_value_directly, &c->final_info.final_status, NULL); @@ -459,8 +472,9 @@ static void destroy_call(grpc_exec_ctx *exec_ctx, void *call, unpack_received_status(gpr_atm_no_barrier_load(&c->status[i])).error); } - grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c), &c->final_info, c); - GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, channel, "call"); + grpc_call_stack_destroy(exec_ctx, CALL_STACK_FROM_CALL(c), &c->final_info, + grpc_closure_init(&c->release_call, release_call, c, + grpc_schedule_on_exec_ctx)); GPR_TIMER_END("destroy_call", 0); } diff --git a/src/core/lib/surface/lame_client.c b/src/core/lib/surface/lame_client.c index 49bc4c114b3..9ddb88bd114 100644 --- a/src/core/lib/surface/lame_client.c +++ b/src/core/lib/surface/lame_client.c @@ -130,8 +130,8 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { - gpr_free(and_free_memory); + grpc_closure *then_schedule_closure) { + grpc_closure_sched(exec_ctx, then_schedule_closure, GRPC_ERROR_NONE); } static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/surface/server.c b/src/core/lib/surface/server.c index b3605795536..1186a4af636 100644 --- a/src/core/lib/surface/server.c +++ b/src/core/lib/surface/server.c @@ -898,7 +898,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { channel_data *chand = elem->channel_data; call_data *calld = elem->call_data; diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index cc1c277b355..11fd5d1697c 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -246,7 +246,8 @@ void grpc_transport_set_pops(grpc_exec_ctx *exec_ctx, grpc_transport *transport, caller, but any child memory must be cleaned up) */ void grpc_transport_destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *transport, - grpc_stream *stream, void *and_free_memory); + grpc_stream *stream, + grpc_closure *then_schedule_closure); void grpc_transport_stream_op_finish_with_failure(grpc_exec_ctx *exec_ctx, grpc_transport_stream_op *op, diff --git a/src/core/lib/transport/transport_impl.h b/src/core/lib/transport/transport_impl.h index 8553148c35f..9b6095f6666 100644 --- a/src/core/lib/transport/transport_impl.h +++ b/src/core/lib/transport/transport_impl.h @@ -67,7 +67,8 @@ typedef struct grpc_transport_vtable { /* implementation of grpc_transport_destroy_stream */ void (*destroy_stream)(grpc_exec_ctx *exec_ctx, grpc_transport *self, - grpc_stream *stream, void *and_free_memory); + grpc_stream *stream, + grpc_closure *then_schedule_closure); /* implementation of grpc_transport_destroy */ void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_transport *self); From 69719089da708a4630a792131e8cf1ee579e15d5 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 13 Mar 2017 12:00:42 -0700 Subject: [PATCH 037/186] remove a TODO --- src/ruby/ext/grpc/rb_channel.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index ccdca15c988..9a3f82c2b7a 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -416,10 +416,10 @@ static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { grpc_channel_destroy(wrapper->wrapped); } -// Note this loop breaks out when a single call of +// Note this loop breaks out with a single call of // "grpc_rb_event_unblocking_func". -// TODO (apolcyn) does a ruby call to the unblocking func -// necesarily mean process shutdown? +// This assumes that a ruby call the unblocking func +// indicates process shutdown. // In the worst case, this stops polling channel connectivity // early and falls back to current behavior. static void *run_poll_channels_loop_no_gil(void *arg) { @@ -430,7 +430,6 @@ static void *run_poll_channels_loop_no_gil(void *arg) { event = grpc_completion_queue_next( channel_polling_cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL); if (event.type == GRPC_QUEUE_SHUTDOWN) { - // TODO (apolcyn) is it guaranteed that this cq is empty by now? break; } if (event.type == GRPC_OP_COMPLETE) { From d426caca811823f525334ec5952995e0b887f04f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 12:30:45 -0700 Subject: [PATCH 038/186] Use an arena for call & subchannel_call allocation --- src/core/ext/census/grpc_filter.c | 4 +-- src/core/ext/client_channel/client_channel.c | 26 +++++++++++---- src/core/ext/client_channel/subchannel.c | 33 ++++++++++++++----- src/core/ext/client_channel/subchannel.h | 18 ++++++++-- .../load_reporting/load_reporting_filter.c | 2 +- .../chttp2/transport/chttp2_transport.c | 7 ++-- .../ext/transport/chttp2/transport/internal.h | 2 +- src/core/lib/channel/channel_stack.c | 29 ++++++---------- src/core/lib/channel/channel_stack.h | 13 ++++---- .../security/transport/client_auth_filter.c | 2 +- .../security/transport/server_auth_filter.c | 2 +- src/core/lib/surface/call.c | 15 ++++++--- src/core/lib/transport/transport.c | 5 +-- test/core/channel/channel_stack_test.c | 16 ++++++--- .../end2end/tests/filter_call_init_fails.c | 2 +- test/core/end2end/tests/filter_causes_close.c | 2 +- test/core/end2end/tests/filter_latency.c | 4 +-- 17 files changed, 116 insertions(+), 66 deletions(-) diff --git a/src/core/ext/census/grpc_filter.c b/src/core/ext/census/grpc_filter.c index b80d831557f..fc29dbd4545 100644 --- a/src/core/ext/census/grpc_filter.c +++ b/src/core/ext/census/grpc_filter.c @@ -138,7 +138,7 @@ static grpc_error *client_init_call_elem(grpc_exec_ctx *exec_ctx, static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *d = elem->call_data; GPR_ASSERT(d != NULL); /* TODO(hongyu): record rpc client stats and census_rpc_end_op here */ @@ -160,7 +160,7 @@ static grpc_error *server_init_call_elem(grpc_exec_ctx *exec_ctx, static void server_destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *d = elem->call_data; GPR_ASSERT(d != NULL); /* TODO(hongyu): record rpc server stats and census_tracing_end_op here */ diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index bf64f84772c..f6550292a0a 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -660,6 +660,7 @@ typedef struct client_channel_call_data { /** either 0 for no call, 1 for cancelled, or a pointer to a grpc_subchannel_call */ gpr_atm subchannel_call; + gpr_arena *arena; subchannel_creation_phase creation_phase; grpc_connected_subchannel *connected_subchannel; @@ -754,9 +755,14 @@ static void subchannel_ready_locked(grpc_exec_ctx *exec_ctx, void *arg, } else { /* Create call on subchannel. */ grpc_subchannel_call *subchannel_call = NULL; + grpc_connected_subchannel_call_args call_args = { + .pollent = calld->pollent, + .path = calld->path, + .start_time = calld->call_start_time, + .deadline = calld->deadline, + .arena = calld->arena}; grpc_error *new_error = grpc_connected_subchannel_create_call( - exec_ctx, calld->connected_subchannel, calld->pollent, calld->path, - calld->call_start_time, calld->deadline, &subchannel_call); + exec_ctx, calld->connected_subchannel, &call_args, &subchannel_call); if (new_error != GRPC_ERROR_NONE) { new_error = grpc_error_add_child(new_error, error); subchannel_call = CANCELLED_CALL; @@ -982,9 +988,14 @@ static void start_transport_stream_op_locked_inner(grpc_exec_ctx *exec_ctx, if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING && calld->connected_subchannel != NULL) { grpc_subchannel_call *subchannel_call = NULL; + grpc_connected_subchannel_call_args call_args = { + .pollent = calld->pollent, + .path = calld->path, + .start_time = calld->call_start_time, + .deadline = calld->deadline, + .arena = calld->arena}; grpc_error *error = grpc_connected_subchannel_create_call( - exec_ctx, calld->connected_subchannel, calld->pollent, calld->path, - calld->call_start_time, calld->deadline, &subchannel_call); + exec_ctx, calld->connected_subchannel, &call_args, &subchannel_call); if (error != GRPC_ERROR_NONE) { subchannel_call = CANCELLED_CALL; fail_locked(exec_ctx, calld, GRPC_ERROR_REF(error)); @@ -1161,6 +1172,7 @@ static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx, calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING; calld->owning_call = args->call_stack; calld->pollent = NULL; + calld->arena = args->arena; GRPC_CALL_STACK_REF(calld->owning_call, "initial_read_service_config"); grpc_closure_sched( exec_ctx, @@ -1175,7 +1187,7 @@ static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx, static void cc_destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *then_schedule_closure) { call_data *calld = elem->call_data; grpc_deadline_state_destroy(exec_ctx, elem); grpc_slice_unref_internal(exec_ctx, calld->path); @@ -1185,6 +1197,8 @@ static void cc_destroy_call_elem(grpc_exec_ctx *exec_ctx, GRPC_ERROR_UNREF(calld->cancel_error); grpc_subchannel_call *call = GET_CALL(calld); if (call != NULL && call != CANCELLED_CALL) { + grpc_subchannel_call_set_cleanup_closure(call, then_schedule_closure); + then_schedule_closure = NULL; GRPC_SUBCHANNEL_CALL_UNREF(exec_ctx, call, "client_channel_destroy_call"); } GPR_ASSERT(calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING); @@ -1194,7 +1208,7 @@ static void cc_destroy_call_elem(grpc_exec_ctx *exec_ctx, "picked"); } gpr_free(calld->waiting_ops); - gpr_free(and_free_memory); + grpc_closure_sched(exec_ctx, then_schedule_closure, GRPC_ERROR_NONE); } static void cc_set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, diff --git a/src/core/ext/client_channel/subchannel.c b/src/core/ext/client_channel/subchannel.c index 5df0a9060d0..e4b669c5828 100644 --- a/src/core/ext/client_channel/subchannel.c +++ b/src/core/ext/client_channel/subchannel.c @@ -148,6 +148,7 @@ struct grpc_subchannel { struct grpc_subchannel_call { grpc_connected_subchannel *connection; + grpc_closure *schedule_closure_after_destroy; }; #define SUBCHANNEL_CALL_TO_CALL_STACK(call) ((grpc_call_stack *)((call) + 1)) @@ -719,13 +720,22 @@ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *arg, static void subchannel_call_destroy(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { grpc_subchannel_call *c = call; + GPR_ASSERT(c->schedule_closure_after_destroy != NULL); GPR_TIMER_BEGIN("grpc_subchannel_call_unref.destroy", 0); grpc_connected_subchannel *connection = c->connection; - grpc_call_stack_destroy(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c), NULL, c); + grpc_call_stack_destroy(exec_ctx, SUBCHANNEL_CALL_TO_CALL_STACK(c), NULL, + c->schedule_closure_after_destroy); GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, connection, "subchannel_call"); GPR_TIMER_END("grpc_subchannel_call_unref.destroy", 0); } +void grpc_subchannel_call_set_cleanup_closure(grpc_subchannel_call *call, + grpc_closure *closure) { + GPR_ASSERT(call->schedule_closure_after_destroy == NULL); + GPR_ASSERT(closure != NULL); + call->schedule_closure_after_destroy = closure; +} + void grpc_subchannel_call_ref( grpc_subchannel_call *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { GRPC_CALL_STACK_REF(SUBCHANNEL_CALL_TO_CALL_STACK(c), REF_REASON); @@ -761,15 +771,22 @@ grpc_connected_subchannel *grpc_subchannel_get_connected_subchannel( grpc_error *grpc_connected_subchannel_create_call( grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, - grpc_polling_entity *pollent, grpc_slice path, gpr_timespec start_time, - gpr_timespec deadline, grpc_subchannel_call **call) { + const grpc_connected_subchannel_call_args *args, + grpc_subchannel_call **call) { grpc_channel_stack *chanstk = CHANNEL_STACK_FROM_CONNECTION(con); - *call = gpr_zalloc(sizeof(grpc_subchannel_call) + chanstk->call_stack_size); + *call = gpr_arena_alloc( + args->arena, sizeof(grpc_subchannel_call) + chanstk->call_stack_size); grpc_call_stack *callstk = SUBCHANNEL_CALL_TO_CALL_STACK(*call); (*call)->connection = con; // Ref is added below. - grpc_error *error = - grpc_call_stack_init(exec_ctx, chanstk, 1, subchannel_call_destroy, *call, - NULL, NULL, path, start_time, deadline, callstk); + grpc_call_element_args call_args = {.call_stack = callstk, + .server_transport_data = NULL, + .context = NULL, + .path = args->path, + .start_time = args->start_time, + .deadline = args->deadline, + .arena = args->arena}; + grpc_error *error = grpc_call_stack_init( + exec_ctx, chanstk, 1, subchannel_call_destroy, *call, &call_args); if (error != GRPC_ERROR_NONE) { const char *error_string = grpc_error_string(error); gpr_log(GPR_ERROR, "error: %s", error_string); @@ -778,7 +795,7 @@ grpc_error *grpc_connected_subchannel_create_call( return error; } GRPC_CONNECTED_SUBCHANNEL_REF(con, "subchannel_call"); - grpc_call_stack_set_pollset_or_pollset_set(exec_ctx, callstk, pollent); + grpc_call_stack_set_pollset_or_pollset_set(exec_ctx, callstk, args->pollent); return GRPC_ERROR_NONE; } diff --git a/src/core/ext/client_channel/subchannel.h b/src/core/ext/client_channel/subchannel.h index 6a70a764676..3e64a2507cf 100644 --- a/src/core/ext/client_channel/subchannel.h +++ b/src/core/ext/client_channel/subchannel.h @@ -37,6 +37,7 @@ #include "src/core/ext/client_channel/connector.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/iomgr/polling_entity.h" +#include "src/core/lib/support/arena.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata.h" @@ -112,10 +113,18 @@ void grpc_subchannel_call_unref(grpc_exec_ctx *exec_ctx, GRPC_SUBCHANNEL_REF_EXTRA_ARGS); /** construct a subchannel call */ +typedef struct { + grpc_polling_entity *pollent; + grpc_slice path; + gpr_timespec start_time; + gpr_timespec deadline; + gpr_arena *arena; +} grpc_connected_subchannel_call_args; + grpc_error *grpc_connected_subchannel_create_call( grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *connected_subchannel, - grpc_polling_entity *pollent, grpc_slice path, gpr_timespec start_time, - gpr_timespec deadline, grpc_subchannel_call **subchannel_call); + const grpc_connected_subchannel_call_args *args, + grpc_subchannel_call **subchannel_call); /** process a transport level op */ void grpc_connected_subchannel_process_transport_op( @@ -154,6 +163,11 @@ void grpc_subchannel_call_process_op(grpc_exec_ctx *exec_ctx, char *grpc_subchannel_call_get_peer(grpc_exec_ctx *exec_ctx, grpc_subchannel_call *subchannel_call); +/** Must be called once per call. Sets the 'then_schedule_closure' argument for + call stack destruction. */ +void grpc_subchannel_call_set_cleanup_closure( + grpc_subchannel_call *subchannel_call, grpc_closure *closure); + grpc_call_stack *grpc_subchannel_call_get_call_stack( grpc_subchannel_call *subchannel_call); diff --git a/src/core/ext/load_reporting/load_reporting_filter.c b/src/core/ext/load_reporting/load_reporting_filter.c index c2750634a50..4ed832671d9 100644 --- a/src/core/ext/load_reporting/load_reporting_filter.c +++ b/src/core/ext/load_reporting/load_reporting_filter.c @@ -123,7 +123,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *calld = elem->call_data; /* TODO(dgq): do something with the data diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index da4c7dc7b23..8024dd47020 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -665,16 +665,17 @@ static void destroy_stream_locked(grpc_exec_ctx *exec_ctx, void *sp, GPR_TIMER_END("destroy_stream", 0); - gpr_free(s->destroy_stream_arg); + grpc_closure_sched(exec_ctx, s->destroy_stream_arg, GRPC_ERROR_NONE); } static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, - grpc_stream *gs, void *and_free_memory) { + grpc_stream *gs, + grpc_closure *then_schedule_closure) { GPR_TIMER_BEGIN("destroy_stream", 0); grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt; grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs; - s->destroy_stream_arg = and_free_memory; + s->destroy_stream_arg = then_schedule_closure; grpc_closure_sched( exec_ctx, grpc_closure_init(&s->destroy_stream, destroy_stream_locked, s, grpc_combiner_scheduler(t->combiner, false)), diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index d26812ad6be..3c56c215991 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -425,7 +425,7 @@ struct grpc_chttp2_stream { grpc_stream_refcount *refcount; grpc_closure destroy_stream; - void *destroy_stream_arg; + grpc_closure *destroy_stream_arg; grpc_chttp2_stream_link links[STREAM_LIST_COUNT]; uint8_t included[STREAM_LIST_COUNT]; diff --git a/src/core/lib/channel/channel_stack.c b/src/core/lib/channel/channel_stack.c index 187f2c8b343..6d53b0576e7 100644 --- a/src/core/lib/channel/channel_stack.c +++ b/src/core/lib/channel/channel_stack.c @@ -166,41 +166,32 @@ void grpc_channel_stack_destroy(grpc_exec_ctx *exec_ctx, } } -grpc_error *grpc_call_stack_init( - grpc_exec_ctx *exec_ctx, grpc_channel_stack *channel_stack, - int initial_refs, grpc_iomgr_cb_func destroy, void *destroy_arg, - grpc_call_context_element *context, const void *transport_server_data, - grpc_slice path, gpr_timespec start_time, gpr_timespec deadline, - grpc_call_stack *call_stack) { +grpc_error *grpc_call_stack_init(grpc_exec_ctx *exec_ctx, + grpc_channel_stack *channel_stack, + int initial_refs, grpc_iomgr_cb_func destroy, + void *destroy_arg, + const grpc_call_element_args *elem_args) { grpc_channel_element *channel_elems = CHANNEL_ELEMS_FROM_STACK(channel_stack); size_t count = channel_stack->count; grpc_call_element *call_elems; char *user_data; size_t i; - call_stack->count = count; - GRPC_STREAM_REF_INIT(&call_stack->refcount, initial_refs, destroy, + elem_args->call_stack->count = count; + GRPC_STREAM_REF_INIT(&elem_args->call_stack->refcount, initial_refs, destroy, destroy_arg, "CALL_STACK"); - call_elems = CALL_ELEMS_FROM_STACK(call_stack); + call_elems = CALL_ELEMS_FROM_STACK(elem_args->call_stack); user_data = ((char *)call_elems) + ROUND_UP_TO_ALIGNMENT_SIZE(count * sizeof(grpc_call_element)); /* init per-filter data */ grpc_error *first_error = GRPC_ERROR_NONE; - const grpc_call_element_args args = { - .start_time = start_time, - .call_stack = call_stack, - .server_transport_data = transport_server_data, - .context = context, - .path = path, - .deadline = deadline, - }; for (i = 0; i < count; i++) { call_elems[i].filter = channel_elems[i].filter; call_elems[i].channel_data = channel_elems[i].channel_data; call_elems[i].call_data = user_data; - grpc_error *error = - call_elems[i].filter->init_call_elem(exec_ctx, &call_elems[i], &args); + grpc_error *error = call_elems[i].filter->init_call_elem( + exec_ctx, &call_elems[i], elem_args); if (error != GRPC_ERROR_NONE) { if (first_error == GRPC_ERROR_NONE) { first_error = error; diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index 1b02f02dd61..80e3603e8d8 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -56,6 +56,7 @@ #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/polling_entity.h" +#include "src/core/lib/support/arena.h" #include "src/core/lib/transport/transport.h" #ifdef __cplusplus @@ -84,6 +85,7 @@ typedef struct { grpc_slice path; gpr_timespec start_time; gpr_timespec deadline; + gpr_arena *arena; } grpc_call_element_args; typedef struct { @@ -236,12 +238,11 @@ void grpc_channel_stack_destroy(grpc_exec_ctx *exec_ctx, /* Initialize a call stack given a channel stack. transport_server_data is expected to be NULL on a client, or an opaque transport owned pointer on the server. */ -grpc_error *grpc_call_stack_init( - grpc_exec_ctx *exec_ctx, grpc_channel_stack *channel_stack, - int initial_refs, grpc_iomgr_cb_func destroy, void *destroy_arg, - grpc_call_context_element *context, const void *transport_server_data, - grpc_slice path, gpr_timespec start_time, gpr_timespec deadline, - grpc_call_stack *call_stack); +grpc_error *grpc_call_stack_init(grpc_exec_ctx *exec_ctx, + grpc_channel_stack *channel_stack, + int initial_refs, grpc_iomgr_cb_func destroy, + void *destroy_arg, + const grpc_call_element_args *elem_args); /* Set a pollset or a pollset_set for a call stack: must occur before the first * op is started */ void grpc_call_stack_set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/security/transport/client_auth_filter.c b/src/core/lib/security/transport/client_auth_filter.c index a23082a8667..8dea1d98fff 100644 --- a/src/core/lib/security/transport/client_auth_filter.c +++ b/src/core/lib/security/transport/client_auth_filter.c @@ -318,7 +318,7 @@ static void set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { call_data *calld = elem->call_data; grpc_call_credentials_unref(exec_ctx, calld->creds); if (calld->have_host) { diff --git a/src/core/lib/security/transport/server_auth_filter.c b/src/core/lib/security/transport/server_auth_filter.c index 14619d97caf..01cb4731773 100644 --- a/src/core/lib/security/transport/server_auth_filter.c +++ b/src/core/lib/security/transport/server_auth_filter.c @@ -227,7 +227,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, /* Destructor for call_data */ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) {} + grpc_closure *ignored) {} /* Constructor for channel_data */ static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index b57dd8bd8ae..84c401db35a 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -367,11 +367,16 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, GRPC_CHANNEL_INTERNAL_REF(args->channel, "call"); /* initial refcount dropped by grpc_call_destroy */ + grpc_call_element_args call_args = { + .call_stack = CALL_STACK_FROM_CALL(call), + .server_transport_data = args->server_transport_data, + .context = call->context, + .path = path, + .start_time = call->start_time, + .deadline = send_deadline, + .arena = call->arena}; add_init_error(&error, grpc_call_stack_init(exec_ctx, channel_stack, 1, - destroy_call, call, call->context, - args->server_transport_data, path, - call->start_time, send_deadline, - CALL_STACK_FROM_CALL(call))); + destroy_call, call, &call_args)); if (error != GRPC_ERROR_NONE) { cancel_with_error(exec_ctx, call, STATUS_FROM_SURFACE, GRPC_ERROR_REF(error)); @@ -431,8 +436,8 @@ void grpc_call_internal_unref(grpc_exec_ctx *exec_ctx, grpc_call *c REF_ARG) { static void release_call(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { grpc_call *c = call; - gpr_arena_destroy(c->arena); GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->channel, "call"); + gpr_arena_destroy(c->arena); } static void set_status_value_directly(grpc_status_code status, void *dest); diff --git a/src/core/lib/transport/transport.c b/src/core/lib/transport/transport.c index 165950e288e..7635fc730d2 100644 --- a/src/core/lib/transport/transport.c +++ b/src/core/lib/transport/transport.c @@ -197,9 +197,10 @@ void grpc_transport_set_pops(grpc_exec_ctx *exec_ctx, grpc_transport *transport, void grpc_transport_destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *transport, - grpc_stream *stream, void *and_free_memory) { + grpc_stream *stream, + grpc_closure *then_schedule_closure) { transport->vtable->destroy_stream(exec_ctx, transport, stream, - and_free_memory); + then_schedule_closure); } char *grpc_transport_get_peer(grpc_exec_ctx *exec_ctx, diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c index 76bb57346c0..0c424c1ec48 100644 --- a/test/core/channel/channel_stack_test.c +++ b/test/core/channel/channel_stack_test.c @@ -68,7 +68,7 @@ static void channel_destroy_func(grpc_exec_ctx *exec_ctx, static void call_destroy_func(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *ignored) { + grpc_closure *ignored) { ++*(int *)(elem->channel_data); } @@ -139,10 +139,16 @@ static void test_create_channel_stack(void) { GPR_ASSERT(*channel_data == 0); call_stack = gpr_malloc(channel_stack->call_stack_size); - grpc_error *error = - grpc_call_stack_init(&exec_ctx, channel_stack, 1, free_call, call_stack, - NULL, NULL, path, gpr_now(GPR_CLOCK_MONOTONIC), - gpr_inf_future(GPR_CLOCK_MONOTONIC), call_stack); + grpc_call_element_args args = { + .call_stack = call_stack, + .server_transport_data = NULL, + .context = NULL, + .path = path, + .start_time = gpr_now(GPR_CLOCK_MONOTONIC), + .deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC), + .arena = NULL}; + grpc_error *error = grpc_call_stack_init(&exec_ctx, channel_stack, 1, + free_call, call_stack, &args); GPR_ASSERT(error == GRPC_ERROR_NONE); GPR_ASSERT(call_stack->count == 1); call_elem = grpc_call_stack_element(call_stack, 0); diff --git a/test/core/end2end/tests/filter_call_init_fails.c b/test/core/end2end/tests/filter_call_init_fails.c index d2d6e82d574..65216cf19dc 100644 --- a/test/core/end2end/tests/filter_call_init_fails.c +++ b/test/core/end2end/tests/filter_call_init_fails.c @@ -213,7 +213,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) {} + grpc_closure *ignored) {} static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, diff --git a/test/core/end2end/tests/filter_causes_close.c b/test/core/end2end/tests/filter_causes_close.c index 25e606556da..c968f30b3b8 100644 --- a/test/core/end2end/tests/filter_causes_close.c +++ b/test/core/end2end/tests/filter_causes_close.c @@ -236,7 +236,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) {} + grpc_closure *ignored) {} static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, diff --git a/test/core/end2end/tests/filter_latency.c b/test/core/end2end/tests/filter_latency.c index d05e9e79a11..2428c92a42b 100644 --- a/test/core/end2end/tests/filter_latency.c +++ b/test/core/end2end/tests/filter_latency.c @@ -267,7 +267,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *ignored) { gpr_mu_lock(&g_mu); g_client_latency = final_info->stats.latency; gpr_mu_unlock(&g_mu); @@ -276,7 +276,7 @@ static void client_destroy_call_elem(grpc_exec_ctx *exec_ctx, static void server_destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *ignored) { gpr_mu_lock(&g_mu); g_server_latency = final_info->stats.latency; gpr_mu_unlock(&g_mu); From 7d2c39827688026ca54b6a8a4d36c36d79aa282a Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 12:58:29 -0700 Subject: [PATCH 039/186] Additionally use arena for incoming metadata allocation --- .../chttp2/transport/chttp2_transport.c | 26 ++++---- .../chttp2/transport/incoming_metadata.c | 65 +++++++------------ .../chttp2/transport/incoming_metadata.h | 18 +++-- .../ext/transport/chttp2/transport/parsing.c | 18 ++++- src/core/lib/channel/connected_channel.c | 2 +- src/core/lib/transport/transport.c | 4 +- src/core/lib/transport/transport.h | 3 +- src/core/lib/transport/transport_impl.h | 2 +- 8 files changed, 67 insertions(+), 71 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index 8024dd47020..114b14e8845 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -575,7 +575,7 @@ void grpc_chttp2_stream_unref(grpc_exec_ctx *exec_ctx, grpc_chttp2_stream *s) { static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, grpc_stream *gs, grpc_stream_refcount *refcount, - const void *server_data) { + const void *server_data, gpr_arena *arena) { GPR_TIMER_BEGIN("init_stream", 0); grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt; grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs; @@ -588,8 +588,8 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, gpr_ref_init(&s->active_streams, 1); GRPC_CHTTP2_STREAM_REF(s, "chttp2"); - grpc_chttp2_incoming_metadata_buffer_init(&s->metadata_buffer[0]); - grpc_chttp2_incoming_metadata_buffer_init(&s->metadata_buffer[1]); + grpc_chttp2_incoming_metadata_buffer_init(&s->metadata_buffer[0], arena); + grpc_chttp2_incoming_metadata_buffer_init(&s->metadata_buffer[1], arena); grpc_chttp2_data_parser_init(&s->data_parser); grpc_slice_buffer_init(&s->flow_controlled_buffer); s->deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); @@ -1630,15 +1630,19 @@ void grpc_chttp2_fake_status(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, s->recv_trailing_metadata_finished != NULL) { char status_string[GPR_LTOA_MIN_BUFSIZE]; gpr_ltoa(status, status_string); - grpc_chttp2_incoming_metadata_buffer_replace_or_add( - exec_ctx, &s->metadata_buffer[1], - grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_STATUS, - grpc_slice_from_copied_string(status_string))); + GRPC_LOG_IF_ERROR("add_status", + grpc_chttp2_incoming_metadata_buffer_replace_or_add( + exec_ctx, &s->metadata_buffer[1], + grpc_mdelem_from_slices( + exec_ctx, GRPC_MDSTR_GRPC_STATUS, + grpc_slice_from_copied_string(status_string)))); if (msg != NULL) { - grpc_chttp2_incoming_metadata_buffer_replace_or_add( - exec_ctx, &s->metadata_buffer[1], - grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_MESSAGE, - grpc_slice_from_copied_string(msg))); + GRPC_LOG_IF_ERROR( + "add_status_message", + grpc_chttp2_incoming_metadata_buffer_replace_or_add( + exec_ctx, &s->metadata_buffer[1], + grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_GRPC_MESSAGE, + grpc_slice_from_copied_string(msg)))); } s->published_metadata[1] = GRPC_METADATA_SYNTHESIZED_FROM_FAKE; grpc_chttp2_maybe_complete_recv_trailing_metadata(exec_ctx, t, s); diff --git a/src/core/ext/transport/chttp2/transport/incoming_metadata.c b/src/core/ext/transport/chttp2/transport/incoming_metadata.c index c91b019aa05..ab900fdff26 100644 --- a/src/core/ext/transport/chttp2/transport/incoming_metadata.c +++ b/src/core/ext/transport/chttp2/transport/incoming_metadata.c @@ -41,69 +41,48 @@ #include void grpc_chttp2_incoming_metadata_buffer_init( - grpc_chttp2_incoming_metadata_buffer *buffer) { - buffer->deadline = gpr_inf_future(GPR_CLOCK_REALTIME); + grpc_chttp2_incoming_metadata_buffer *buffer, gpr_arena *arena) { + grpc_metadata_batch_init(&buffer->batch); + buffer->arena = arena; + buffer->batch.deadline = gpr_inf_future(GPR_CLOCK_REALTIME); } void grpc_chttp2_incoming_metadata_buffer_destroy( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer) { - size_t i; - if (!buffer->published) { - for (i = 0; i < buffer->count; i++) { - GRPC_MDELEM_UNREF(exec_ctx, buffer->elems[i].md); - } - } - gpr_free(buffer->elems); + grpc_metadata_batch_destroy(exec_ctx, &buffer->batch); } -void grpc_chttp2_incoming_metadata_buffer_add( - grpc_chttp2_incoming_metadata_buffer *buffer, grpc_mdelem elem) { - GPR_ASSERT(!buffer->published); - if (buffer->capacity == buffer->count) { - buffer->capacity = GPR_MAX(8, 2 * buffer->capacity); - buffer->elems = - gpr_realloc(buffer->elems, sizeof(*buffer->elems) * buffer->capacity); - } - buffer->elems[buffer->count++].md = elem; +grpc_error *grpc_chttp2_incoming_metadata_buffer_add( + grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, + grpc_mdelem elem) { buffer->size += GRPC_MDELEM_LENGTH(elem); + return grpc_metadata_batch_add_tail( + exec_ctx, &buffer->batch, + gpr_arena_alloc(buffer->arena, sizeof(grpc_linked_mdelem)), elem); } -void grpc_chttp2_incoming_metadata_buffer_replace_or_add( +grpc_error *grpc_chttp2_incoming_metadata_buffer_replace_or_add( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, grpc_mdelem elem) { - for (size_t i = 0; i < buffer->count; i++) { - if (grpc_slice_eq(GRPC_MDKEY(buffer->elems[i].md), GRPC_MDKEY(elem))) { - GRPC_MDELEM_UNREF(exec_ctx, buffer->elems[i].md); - buffer->elems[i].md = elem; - return; + for (grpc_linked_mdelem *l = buffer->batch.list.head; l != NULL; + l = l->next) { + if (grpc_slice_eq(GRPC_MDKEY(l->md), GRPC_MDKEY(elem))) { + GRPC_MDELEM_UNREF(exec_ctx, l->md); + l->md = elem; + return GRPC_ERROR_NONE; } } - grpc_chttp2_incoming_metadata_buffer_add(buffer, elem); + return grpc_chttp2_incoming_metadata_buffer_add(exec_ctx, buffer, elem); } void grpc_chttp2_incoming_metadata_buffer_set_deadline( grpc_chttp2_incoming_metadata_buffer *buffer, gpr_timespec deadline) { - GPR_ASSERT(!buffer->published); - buffer->deadline = deadline; + buffer->batch.deadline = deadline; } void grpc_chttp2_incoming_metadata_buffer_publish( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, grpc_metadata_batch *batch) { - GPR_ASSERT(!buffer->published); - buffer->published = 1; - if (buffer->count > 0) { - size_t i; - for (i = 0; i < buffer->count; i++) { - /* TODO(ctiller): do something better here */ - if (!GRPC_LOG_IF_ERROR("grpc_chttp2_incoming_metadata_buffer_publish", - grpc_metadata_batch_link_tail( - exec_ctx, batch, &buffer->elems[i]))) { - GRPC_MDELEM_UNREF(exec_ctx, buffer->elems[i].md); - } - } - } else { - batch->list.head = batch->list.tail = NULL; - } - batch->deadline = buffer->deadline; + *batch = buffer->batch; + grpc_metadata_batch_init(&buffer->batch); } diff --git a/src/core/ext/transport/chttp2/transport/incoming_metadata.h b/src/core/ext/transport/chttp2/transport/incoming_metadata.h index 1eac6fc1504..288c917e65a 100644 --- a/src/core/ext/transport/chttp2/transport/incoming_metadata.h +++ b/src/core/ext/transport/chttp2/transport/incoming_metadata.h @@ -37,28 +37,26 @@ #include "src/core/lib/transport/transport.h" typedef struct { - grpc_linked_mdelem *elems; - size_t count; - size_t capacity; - gpr_timespec deadline; - int published; + gpr_arena *arena; + grpc_metadata_batch batch; size_t size; // total size of metadata } grpc_chttp2_incoming_metadata_buffer; /** assumes everything initially zeroed */ void grpc_chttp2_incoming_metadata_buffer_init( - grpc_chttp2_incoming_metadata_buffer *buffer); + grpc_chttp2_incoming_metadata_buffer *buffer, gpr_arena *arena); void grpc_chttp2_incoming_metadata_buffer_destroy( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer); void grpc_chttp2_incoming_metadata_buffer_publish( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, grpc_metadata_batch *batch); -void grpc_chttp2_incoming_metadata_buffer_add( - grpc_chttp2_incoming_metadata_buffer *buffer, grpc_mdelem elem); -void grpc_chttp2_incoming_metadata_buffer_replace_or_add( +grpc_error *grpc_chttp2_incoming_metadata_buffer_add( grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, - grpc_mdelem elem); + grpc_mdelem elem) GRPC_MUST_USE_RESULT; +grpc_error *grpc_chttp2_incoming_metadata_buffer_replace_or_add( + grpc_exec_ctx *exec_ctx, grpc_chttp2_incoming_metadata_buffer *buffer, + grpc_mdelem elem) GRPC_MUST_USE_RESULT; void grpc_chttp2_incoming_metadata_buffer_set_deadline( grpc_chttp2_incoming_metadata_buffer *buffer, gpr_timespec deadline); diff --git a/src/core/ext/transport/chttp2/transport/parsing.c b/src/core/ext/transport/chttp2/transport/parsing.c index e7f2597f89c..7efc8c63c91 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.c +++ b/src/core/ext/transport/chttp2/transport/parsing.c @@ -548,7 +548,14 @@ static void on_initial_header(grpc_exec_ctx *exec_ctx, void *tp, s->seen_error = true; GRPC_MDELEM_UNREF(exec_ctx, md); } else { - grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[0], md); + grpc_error *error = grpc_chttp2_incoming_metadata_buffer_add( + exec_ctx, &s->metadata_buffer[0], md); + if (error != GRPC_ERROR_NONE) { + grpc_chttp2_cancel_stream(exec_ctx, t, s, error); + grpc_chttp2_parsing_become_skip_parser(exec_ctx, t); + s->seen_error = true; + GRPC_MDELEM_UNREF(exec_ctx, md); + } } } @@ -598,7 +605,14 @@ static void on_trailing_header(grpc_exec_ctx *exec_ctx, void *tp, s->seen_error = true; GRPC_MDELEM_UNREF(exec_ctx, md); } else { - grpc_chttp2_incoming_metadata_buffer_add(&s->metadata_buffer[1], md); + grpc_error *error = grpc_chttp2_incoming_metadata_buffer_add( + exec_ctx, &s->metadata_buffer[1], md); + if (error != GRPC_ERROR_NONE) { + grpc_chttp2_cancel_stream(exec_ctx, t, s, error); + grpc_chttp2_parsing_become_skip_parser(exec_ctx, t); + s->seen_error = true; + GRPC_MDELEM_UNREF(exec_ctx, md); + } } GPR_TIMER_END("on_trailing_header", 0); diff --git a/src/core/lib/channel/connected_channel.c b/src/core/lib/channel/connected_channel.c index 64cf95b5a58..42ef7b78063 100644 --- a/src/core/lib/channel/connected_channel.c +++ b/src/core/lib/channel/connected_channel.c @@ -88,7 +88,7 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, channel_data *chand = elem->channel_data; int r = grpc_transport_init_stream( exec_ctx, chand->transport, TRANSPORT_STREAM_FROM_CALL_DATA(calld), - &args->call_stack->refcount, args->server_transport_data); + &args->call_stack->refcount, args->server_transport_data, args->arena); return r == 0 ? GRPC_ERROR_NONE : GRPC_ERROR_CREATE("transport stream initialization failed"); } diff --git a/src/core/lib/transport/transport.c b/src/core/lib/transport/transport.c index 7635fc730d2..c1a364cbbf2 100644 --- a/src/core/lib/transport/transport.c +++ b/src/core/lib/transport/transport.c @@ -162,9 +162,9 @@ void grpc_transport_destroy(grpc_exec_ctx *exec_ctx, int grpc_transport_init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *transport, grpc_stream *stream, grpc_stream_refcount *refcount, - const void *server_data) { + const void *server_data, gpr_arena *arena) { return transport->vtable->init_stream(exec_ctx, transport, stream, refcount, - server_data); + server_data, arena); } void grpc_transport_perform_stream_op(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 11fd5d1697c..950b18aeda2 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -41,6 +41,7 @@ #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/pollset_set.h" +#include "src/core/lib/support/arena.h" #include "src/core/lib/transport/byte_stream.h" #include "src/core/lib/transport/metadata_batch.h" @@ -229,7 +230,7 @@ size_t grpc_transport_stream_size(grpc_transport *transport); int grpc_transport_init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *transport, grpc_stream *stream, grpc_stream_refcount *refcount, - const void *server_data); + const void *server_data, gpr_arena *arena); void grpc_transport_set_pops(grpc_exec_ctx *exec_ctx, grpc_transport *transport, grpc_stream *stream, grpc_polling_entity *pollent); diff --git a/src/core/lib/transport/transport_impl.h b/src/core/lib/transport/transport_impl.h index 9b6095f6666..6f688bf8d28 100644 --- a/src/core/lib/transport/transport_impl.h +++ b/src/core/lib/transport/transport_impl.h @@ -47,7 +47,7 @@ typedef struct grpc_transport_vtable { /* implementation of grpc_transport_init_stream */ int (*init_stream)(grpc_exec_ctx *exec_ctx, grpc_transport *self, grpc_stream *stream, grpc_stream_refcount *refcount, - const void *server_data); + const void *server_data, gpr_arena *arena); /* implementation of grpc_transport_set_pollset */ void (*set_pollset)(grpc_exec_ctx *exec_ctx, grpc_transport *self, From 55bff48335809baaab083bbf1189c3ab69a65f2b Mon Sep 17 00:00:00 2001 From: Stanley Cheung Date: Mon, 13 Mar 2017 13:09:43 -0700 Subject: [PATCH 040/186] PHP: proto3 API change --- src/php/lib/Grpc/AbstractCall.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/php/lib/Grpc/AbstractCall.php b/src/php/lib/Grpc/AbstractCall.php index 40387abdc07..4833fdc7b6f 100644 --- a/src/php/lib/Grpc/AbstractCall.php +++ b/src/php/lib/Grpc/AbstractCall.php @@ -131,6 +131,8 @@ abstract class AbstractCall // Proto3 implementation if (method_exists($data, 'encode')) { return $data->encode(); + } else if (method_exists($data, 'serializeToString')) { + return $data->serializeToString(); } // Protobuf-PHP implementation @@ -154,7 +156,11 @@ abstract class AbstractCall if (is_array($this->deserialize)) { list($className, $deserializeFunc) = $this->deserialize; $obj = new $className(); - $obj->$deserializeFunc($value); + if (method_exists($obj, $deserializeFunc)) { + $obj->$deserializeFunc($value); + } else { + $obj->mergeFromString($value); + } return $obj; } From ca294650ba9613044c89635b91d6d5ed603d14c5 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Mon, 13 Mar 2017 14:50:34 -0700 Subject: [PATCH 041/186] Change macros --- src/core/lib/iomgr/tcp_server_posix.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 7cc44fabe7e..61ffb02a716 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -601,7 +601,9 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, unsigned port_index, int requested_port, int *out_port) { -#ifdef GRPC_HAVE_IFADDRS +#ifndef GRPC_HAVE_IFADDRS + return GRPC_ERROR_CREATE("no ifaddrs available"); +#else /* ifndef GRPC_HAVE_IFADDRS */ struct ifaddrs *ifa = NULL; struct ifaddrs *ifa_it; unsigned fd_index = 0; @@ -689,9 +691,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, *out_port = sp->port; return GRPC_ERROR_NONE; } -#else /* GRPC_HAVE_IFADDRS */ - return GRPC_ERROR_NONE; -#endif /* GRPC_HAVE_IFADDRS */ +#endif /* ifndef GRPC_HAVE_IFADDRS */ } /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */ @@ -708,10 +708,14 @@ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, grpc_error *v6_err = GRPC_ERROR_NONE; grpc_error *v4_err = GRPC_ERROR_NONE; *out_port = -1; + +#ifdef GRPC_HAVE_IFADDRS if (s->expand_wildcard_addrs) { return add_all_local_addrs_to_server(s, port_index, requested_port, out_port); } +#endif /* GRPC_HAVE_IFADDRS */ + grpc_sockaddr_make_wildcards(requested_port, &wild4, &wild6); /* Try listening on IPv6 first. */ if ((v6_err = add_addr_to_server(s, &wild6, port_index, fd_index, &dsmode, From b18c8ba0b6bbc2317dd92353288f2b1c0ff353d5 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 13 Mar 2017 15:51:37 -0700 Subject: [PATCH 042/186] Fix cancellation --- src/core/lib/surface/call.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 8b2f9fd3f53..47f36be5fda 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -1070,8 +1070,8 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, &call->metadata_batch[1 /* is_receiving */][1 /* is_trailing */]; recv_trailing_filter(exec_ctx, call, md); - gpr_atm_rel_store(&call->received_final_op_atm, 1); /* propagate cancellation to any interested children */ + gpr_atm_rel_store(&call->received_final_op_atm, 1); gpr_mu_lock(&call->child_list_mu); child_call = call->first_child; if (child_call != NULL) { @@ -1079,7 +1079,7 @@ static void post_batch_completion(grpc_exec_ctx *exec_ctx, next_child_call = child_call->sibling_next; if (child_call->cancellation_is_inherited) { GRPC_CALL_INTERNAL_REF(child_call, "propagate_cancel"); - cancel_with_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, + cancel_with_error(exec_ctx, child_call, STATUS_FROM_API_OVERRIDE, GRPC_ERROR_CANCELLED); GRPC_CALL_INTERNAL_UNREF(exec_ctx, child_call, "propagate_cancel"); } From 47155ed254e7d798cd42797eea1533d5264c565c Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Mon, 13 Mar 2017 17:18:07 -0700 Subject: [PATCH 043/186] Split ifaddr related functions out into a separate file --- BUILD | 3 + CMakeLists.txt | 10 + Makefile | 10 + binding.gyp | 2 + build.yaml | 3 + config.m4 | 2 + gRPC-Core.podspec | 4 + grpc.gemspec | 3 + package.xml | 3 + src/core/lib/iomgr/tcp_server_posix.c | 192 ++---------------- src/core/lib/iomgr/tcp_server_utils_posix.h | 89 ++++++++ .../iomgr/tcp_server_utils_posix_ifaddrs.c | 178 ++++++++++++++++ .../iomgr/tcp_server_utils_posix_noifaddrs.c | 49 +++++ src/python/grpcio/grpc_core_dependencies.py | 2 + tools/doxygen/Doxyfile.core.internal | 3 + .../generated/sources_and_headers.json | 4 + vsprojects/vcxproj/grpc/grpc.vcxproj | 5 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 9 + .../grpc_test_util/grpc_test_util.vcxproj | 5 + .../grpc_test_util.vcxproj.filters | 9 + .../grpc_unsecure/grpc_unsecure.vcxproj | 5 + .../grpc_unsecure.vcxproj.filters | 9 + 22 files changed, 423 insertions(+), 176 deletions(-) create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix.h create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c diff --git a/BUILD b/BUILD index ca0a1c56076..dc6431484e3 100644 --- a/BUILD +++ b/BUILD @@ -481,6 +481,8 @@ grpc_cc_library( "src/core/lib/iomgr/tcp_client_windows.c", "src/core/lib/iomgr/tcp_posix.c", "src/core/lib/iomgr/tcp_server_posix.c", + "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c", + "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c", "src/core/lib/iomgr/tcp_server_uv.c", "src/core/lib/iomgr/tcp_server_windows.c", "src/core/lib/iomgr/tcp_uv.c", @@ -599,6 +601,7 @@ grpc_cc_library( "src/core/lib/iomgr/tcp_client_posix.h", "src/core/lib/iomgr/tcp_posix.h", "src/core/lib/iomgr/tcp_server.h", + "src/core/lib/iomgr/tcp_server_utils_posix.h", "src/core/lib/iomgr/tcp_uv.h", "src/core/lib/iomgr/tcp_windows.h", "src/core/lib/iomgr/time_averaged_stats.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index d0a65b44932..cfc4555834a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -914,6 +914,8 @@ add_library(grpc src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c src/core/lib/iomgr/tcp_server_windows.c src/core/lib/iomgr/tcp_uv.c @@ -1223,6 +1225,8 @@ add_library(grpc_cronet src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c src/core/lib/iomgr/tcp_server_windows.c src/core/lib/iomgr/tcp_uv.c @@ -1523,6 +1527,8 @@ add_library(grpc_test_util src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c src/core/lib/iomgr/tcp_server_windows.c src/core/lib/iomgr/tcp_uv.c @@ -1769,6 +1775,8 @@ add_library(grpc_unsecure src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c src/core/lib/iomgr/tcp_server_windows.c src/core/lib/iomgr/tcp_uv.c @@ -2376,6 +2384,8 @@ add_library(grpc++_cronet src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c src/core/lib/iomgr/tcp_server_windows.c src/core/lib/iomgr/tcp_uv.c diff --git a/Makefile b/Makefile index a9242dddbdd..14c5a36c957 100644 --- a/Makefile +++ b/Makefile @@ -2799,6 +2799,8 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ @@ -3111,6 +3113,8 @@ LIBGRPC_CRONET_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ @@ -3414,6 +3418,8 @@ LIBGRPC_TEST_UTIL_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ @@ -3640,6 +3646,8 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ @@ -4249,6 +4257,8 @@ LIBGRPC++_CRONET_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ diff --git a/binding.gyp b/binding.gyp index c521a27c300..ec21a97806f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -667,6 +667,8 @@ 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', 'src/core/lib/iomgr/tcp_server_windows.c', 'src/core/lib/iomgr/tcp_uv.c', diff --git a/build.yaml b/build.yaml index a32a8a06d34..36817a55067 100644 --- a/build.yaml +++ b/build.yaml @@ -228,6 +228,7 @@ filegroups: - src/core/lib/iomgr/tcp_client_posix.h - src/core/lib/iomgr/tcp_posix.h - src/core/lib/iomgr/tcp_server.h + - src/core/lib/iomgr/tcp_server_utils_posix.h - src/core/lib/iomgr/tcp_uv.h - src/core/lib/iomgr/tcp_windows.h - src/core/lib/iomgr/time_averaged_stats.h @@ -337,6 +338,8 @@ filegroups: - src/core/lib/iomgr/tcp_client_windows.c - src/core/lib/iomgr/tcp_posix.c - src/core/lib/iomgr/tcp_server_posix.c + - src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c + - src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c - src/core/lib/iomgr/tcp_server_uv.c - src/core/lib/iomgr/tcp_server_windows.c - src/core/lib/iomgr/tcp_uv.c diff --git a/config.m4 b/config.m4 index 90536e503ed..181e44c52c8 100644 --- a/config.m4 +++ b/config.m4 @@ -140,6 +140,8 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ + src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 027babcda46..1d002247d4b 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -309,6 +309,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/tcp_client_posix.h', 'src/core/lib/iomgr/tcp_posix.h', 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', 'src/core/lib/iomgr/tcp_uv.h', 'src/core/lib/iomgr/tcp_windows.h', 'src/core/lib/iomgr/time_averaged_stats.h', @@ -508,6 +509,8 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', 'src/core/lib/iomgr/tcp_server_windows.c', 'src/core/lib/iomgr/tcp_uv.c', @@ -744,6 +747,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/tcp_client_posix.h', 'src/core/lib/iomgr/tcp_posix.h', 'src/core/lib/iomgr/tcp_server.h', + 'src/core/lib/iomgr/tcp_server_utils_posix.h', 'src/core/lib/iomgr/tcp_uv.h', 'src/core/lib/iomgr/tcp_windows.h', 'src/core/lib/iomgr/time_averaged_stats.h', diff --git a/grpc.gemspec b/grpc.gemspec index 8d5b7b2ab1c..edc08cb9b9a 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -226,6 +226,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/tcp_client_posix.h ) s.files += %w( src/core/lib/iomgr/tcp_posix.h ) s.files += %w( src/core/lib/iomgr/tcp_server.h ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix.h ) s.files += %w( src/core/lib/iomgr/tcp_uv.h ) s.files += %w( src/core/lib/iomgr/tcp_windows.h ) s.files += %w( src/core/lib/iomgr/time_averaged_stats.h ) @@ -425,6 +426,8 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/tcp_client_windows.c ) s.files += %w( src/core/lib/iomgr/tcp_posix.c ) s.files += %w( src/core/lib/iomgr/tcp_server_posix.c ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c ) s.files += %w( src/core/lib/iomgr/tcp_server_uv.c ) s.files += %w( src/core/lib/iomgr/tcp_server_windows.c ) s.files += %w( src/core/lib/iomgr/tcp_uv.c ) diff --git a/package.xml b/package.xml index 4167bef26e3..21eeee4d3ef 100644 --- a/package.xml +++ b/package.xml @@ -235,6 +235,7 @@ + @@ -434,6 +435,8 @@ + + diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 61ffb02a716..1e9e854d6b5 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -42,10 +42,6 @@ #include "src/core/lib/iomgr/tcp_server.h" -#ifdef GRPC_HAVE_IFADDRS -#include -#endif /* GRPC_HAVE_IFADDRS */ - #include #include #include @@ -70,6 +66,7 @@ #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/socket_utils_posix.h" #include "src/core/lib/iomgr/tcp_posix.h" +#include "src/core/lib/iomgr/tcp_server_utils_posix.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/support/string.h" @@ -78,29 +75,6 @@ static gpr_once s_init_max_accept_queue_size; static int s_max_accept_queue_size; -/* one listening port */ -typedef struct grpc_tcp_listener grpc_tcp_listener; -struct grpc_tcp_listener { - int fd; - grpc_fd *emfd; - grpc_tcp_server *server; - grpc_resolved_address addr; - int port; - unsigned port_index; - unsigned fd_index; - grpc_closure read_closure; - grpc_closure destroyed_closure; - struct grpc_tcp_listener *next; - /* sibling is a linked list of all listeners for a given port. add_port and - clone_port place all new listeners in the same sibling list. A member of - the 'sibling' list is also a member of the 'next' list. The head of each - sibling list has is_sibling==0, and subsequent members of sibling lists - have is_sibling==1. is_sibling allows separate sibling lists to be - identified while iterating through 'next'. */ - struct grpc_tcp_listener *sibling; - int is_sibling; -}; - /* the overall server */ struct grpc_tcp_server { gpr_refcount refs; @@ -526,11 +500,11 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd, /* If successful, add a listener to s for addr, set *dsmode for the socket, and return the *listener. */ -static grpc_error *add_addr_to_server(grpc_tcp_server *s, - const grpc_resolved_address *addr, - unsigned port_index, unsigned fd_index, - grpc_dualstack_mode *dsmode, - grpc_tcp_listener **listener) { +grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, + const grpc_resolved_address *addr, + unsigned port_index, unsigned fd_index, + grpc_dualstack_mode *dsmode, + grpc_tcp_listener **listener) { grpc_resolved_address addr4_copy; int fd; grpc_error *err = @@ -545,39 +519,9 @@ static grpc_error *add_addr_to_server(grpc_tcp_server *s, return add_socket_to_server(s, fd, addr, port_index, fd_index, listener); } -/* Bind to "::" to get a port number not used by any address. */ -static grpc_error *get_unused_port(int *port) { - grpc_resolved_address wild; - grpc_sockaddr_make_wildcard6(0, &wild); - grpc_dualstack_mode dsmode; - int fd; - grpc_error *err = - grpc_create_dualstack_socket(&wild, SOCK_STREAM, 0, &dsmode, &fd); - if (err != GRPC_ERROR_NONE) { - return err; - } - if (dsmode == GRPC_DSMODE_IPV4) { - grpc_sockaddr_make_wildcard4(0, &wild); - } - if (bind(fd, (const struct sockaddr *)wild.addr, (socklen_t)wild.len) != 0) { - err = GRPC_OS_ERROR(errno, "bind"); - close(fd); - return err; - } - if (getsockname(fd, (struct sockaddr *)wild.addr, (socklen_t *)&wild.len) != - 0) { - err = GRPC_OS_ERROR(errno, "getsockname"); - close(fd); - return err; - } - close(fd); - *port = grpc_sockaddr_get_port(&wild); - return *port <= 0 ? GRPC_ERROR_CREATE("Bad port") : GRPC_ERROR_NONE; -} - /* Return the listener in s with address addr or NULL. */ -static grpc_tcp_listener *find_listener_with_addr(grpc_tcp_server *s, - grpc_resolved_address *addr) { +grpc_tcp_listener *grpc_tcp_server_find_listener_with_addr( + grpc_tcp_server *s, grpc_resolved_address *addr) { grpc_tcp_listener *l; gpr_mu_lock(&s->mu); for (l = s->head; l != NULL; l = l->next) { @@ -592,108 +536,6 @@ static grpc_tcp_listener *find_listener_with_addr(grpc_tcp_server *s, return l; } -/* Get all addresses assigned to network interfaces on the machine and create a - listener for each. requested_port is the port to use for every listener, or 0 - to select one random port that will be used for every listener. Set *out_port - to the port selected. Return GRPC_ERROR_NONE only if all listeners were - added. */ -static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, - unsigned port_index, - int requested_port, - int *out_port) { -#ifndef GRPC_HAVE_IFADDRS - return GRPC_ERROR_CREATE("no ifaddrs available"); -#else /* ifndef GRPC_HAVE_IFADDRS */ - struct ifaddrs *ifa = NULL; - struct ifaddrs *ifa_it; - unsigned fd_index = 0; - grpc_tcp_listener *sp = NULL; - grpc_error *err = GRPC_ERROR_NONE; - if (requested_port == 0) { - /* Note: There could be a race where some local addrs can listen on the - selected port and some can't. The sane way to handle this would be to - retry by recreating the whole grpc_tcp_server. Backing out individual - listeners and orphaning the FDs looks like too much trouble. */ - if ((err = get_unused_port(&requested_port)) != GRPC_ERROR_NONE) { - return err; - } else if (requested_port <= 0) { - return GRPC_ERROR_CREATE("Bad get_unused_port()"); - } - gpr_log(GPR_DEBUG, "Picked unused port %d", requested_port); - } - if (getifaddrs(&ifa) != 0 || ifa == NULL) { - return GRPC_OS_ERROR(errno, "getifaddrs"); - } - for (ifa_it = ifa; ifa_it != NULL; ifa_it = ifa_it->ifa_next) { - grpc_resolved_address addr; - char *addr_str = NULL; - grpc_dualstack_mode dsmode; - grpc_tcp_listener *new_sp = NULL; - const char *ifa_name = (ifa_it->ifa_name ? ifa_it->ifa_name : ""); - if (ifa_it->ifa_addr == NULL) { - continue; - } else if (ifa_it->ifa_addr->sa_family == AF_INET) { - addr.len = sizeof(struct sockaddr_in); - } else if (ifa_it->ifa_addr->sa_family == AF_INET6) { - addr.len = sizeof(struct sockaddr_in6); - } else { - continue; - } - memcpy(addr.addr, ifa_it->ifa_addr, addr.len); - if (!grpc_sockaddr_set_port(&addr, requested_port)) { - /* Should never happen, because we check sa_family above. */ - err = GRPC_ERROR_CREATE("Failed to set port"); - break; - } - if (grpc_sockaddr_to_string(&addr_str, &addr, 0) < 0) { - addr_str = gpr_strdup(""); - } - gpr_log(GPR_DEBUG, - "Adding local addr from interface %s flags 0x%x to server: %s", - ifa_name, ifa_it->ifa_flags, addr_str); - /* We could have multiple interfaces with the same address (e.g., bonding), - so look for duplicates. */ - if (find_listener_with_addr(s, &addr) != NULL) { - gpr_log(GPR_DEBUG, "Skipping duplicate addr %s on interface %s", addr_str, - ifa_name); - gpr_free(addr_str); - continue; - } - if ((err = add_addr_to_server(s, &addr, port_index, fd_index, &dsmode, - &new_sp)) != GRPC_ERROR_NONE) { - char *err_str = NULL; - grpc_error *root_err; - if (gpr_asprintf(&err_str, "Failed to add listener: %s", addr_str) < 0) { - err_str = gpr_strdup("Failed to add listener"); - } - root_err = GRPC_ERROR_CREATE(err_str); - gpr_free(err_str); - gpr_free(addr_str); - err = grpc_error_add_child(root_err, err); - break; - } else { - GPR_ASSERT(requested_port == new_sp->port); - ++fd_index; - if (sp != NULL) { - new_sp->is_sibling = 1; - sp->sibling = new_sp; - } - sp = new_sp; - } - gpr_free(addr_str); - } - freeifaddrs(ifa); - if (err != GRPC_ERROR_NONE) { - return err; - } else if (sp == NULL) { - return GRPC_ERROR_CREATE("No local addresses"); - } else { - *out_port = sp->port; - return GRPC_ERROR_NONE; - } -#endif /* ifndef GRPC_HAVE_IFADDRS */ -} - /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, unsigned port_index, @@ -709,17 +551,15 @@ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, grpc_error *v4_err = GRPC_ERROR_NONE; *out_port = -1; -#ifdef GRPC_HAVE_IFADDRS - if (s->expand_wildcard_addrs) { - return add_all_local_addrs_to_server(s, port_index, requested_port, - out_port); + if (grpc_tcp_server_have_ifaddrs() && s->expand_wildcard_addrs) { + return grpc_tcp_server_add_all_local_addrs(s, port_index, requested_port, + out_port); } -#endif /* GRPC_HAVE_IFADDRS */ grpc_sockaddr_make_wildcards(requested_port, &wild4, &wild6); /* Try listening on IPv6 first. */ - if ((v6_err = add_addr_to_server(s, &wild6, port_index, fd_index, &dsmode, - &sp)) == GRPC_ERROR_NONE) { + if ((v6_err = grpc_tcp_server_add_addr(s, &wild6, port_index, fd_index, + &dsmode, &sp)) == GRPC_ERROR_NONE) { ++fd_index; requested_port = *out_port = sp->port; if (dsmode == GRPC_DSMODE_DUALSTACK || dsmode == GRPC_DSMODE_IPV4) { @@ -728,8 +568,8 @@ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, } /* If we got a v6-only socket or nothing, try adding 0.0.0.0. */ grpc_sockaddr_set_port(&wild4, requested_port); - if ((v4_err = add_addr_to_server(s, &wild4, port_index, fd_index, &dsmode, - &sp2)) == GRPC_ERROR_NONE) { + if ((v4_err = grpc_tcp_server_add_addr(s, &wild4, port_index, fd_index, + &dsmode, &sp2)) == GRPC_ERROR_NONE) { *out_port = sp2->port; if (sp != NULL) { sp2->is_sibling = 1; @@ -839,7 +679,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, if (grpc_sockaddr_to_v4mapped(addr, &addr6_v4mapped)) { addr = &addr6_v4mapped; } - if ((err = add_addr_to_server(s, addr, port_index, 0, &dsmode, &sp)) == + if ((err = grpc_tcp_server_add_addr(s, addr, port_index, 0, &dsmode, &sp)) == GRPC_ERROR_NONE) { *out_port = sp->port; } diff --git a/src/core/lib/iomgr/tcp_server_utils_posix.h b/src/core/lib/iomgr/tcp_server_utils_posix.h new file mode 100644 index 00000000000..d39f9085fda --- /dev/null +++ b/src/core/lib/iomgr/tcp_server_utils_posix.h @@ -0,0 +1,89 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_LIB_IOMGR_TCP_SERVER_UTILS_POSIX_H +#define GRPC_CORE_LIB_IOMGR_TCP_SERVER_UTILS_POSIX_H + +#include "src/core/lib/iomgr/ev_posix.h" +#include "src/core/lib/iomgr/resolve_address.h" +#include "src/core/lib/iomgr/socket_utils_posix.h" +#include "src/core/lib/iomgr/tcp_server.h" + +/* one listening port */ +typedef struct grpc_tcp_listener { + int fd; + grpc_fd *emfd; + grpc_tcp_server *server; + grpc_resolved_address addr; + int port; + unsigned port_index; + unsigned fd_index; + grpc_closure read_closure; + grpc_closure destroyed_closure; + struct grpc_tcp_listener *next; + /* sibling is a linked list of all listeners for a given port. add_port and + clone_port place all new listeners in the same sibling list. A member of + the 'sibling' list is also a member of the 'next' list. The head of each + sibling list has is_sibling==0, and subsequent members of sibling lists + have is_sibling==1. is_sibling allows separate sibling lists to be + identified while iterating through 'next'. */ + struct grpc_tcp_listener *sibling; + int is_sibling; +} grpc_tcp_listener; + +/* If successful, add a listener to \a s for \a addr, set \a dsmode for the + socket, and return the \a listener. */ +grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, + const grpc_resolved_address *addr, + unsigned port_index, unsigned fd_index, + grpc_dualstack_mode *dsmode, + grpc_tcp_listener **listener); + +/* Return the listener in \a s with address \a addr or NULL. */ +grpc_tcp_listener *grpc_tcp_server_find_listener_with_addr( + grpc_tcp_server *s, grpc_resolved_address *addr); + +/* Get all addresses assigned to network interfaces on the machine and create a + listener for each. requested_port is the port to use for every listener, or 0 + to select one random port that will be used for every listener. Set *out_port + to the port selected. Return GRPC_ERROR_NONE only if all listeners were + added. */ +grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, + unsigned port_index, + int requested_port, + int *out_port); + +/* Ruturn true if the platform supports ifaddrs */ +bool grpc_tcp_server_have_ifaddrs(void); + +#endif /* GRPC_CORE_LIB_IOMGR_TCP_SERVER_UTILS_POSIX_H */ diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c new file mode 100644 index 00000000000..05eb96f73ed --- /dev/null +++ b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c @@ -0,0 +1,178 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_HAVE_IFADDRS + +#include "src/core/lib/iomgr/tcp_server_utils_posix.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/iomgr/error.h" +#include "src/core/lib/iomgr/sockaddr.h" +#include "src/core/lib/iomgr/sockaddr_utils.h" + +/* Bind to "::" to get a port number not used by any address. */ +static grpc_error *get_unused_port(int *port) { + grpc_resolved_address wild; + grpc_sockaddr_make_wildcard6(0, &wild); + grpc_dualstack_mode dsmode; + int fd; + grpc_error *err = + grpc_create_dualstack_socket(&wild, SOCK_STREAM, 0, &dsmode, &fd); + if (err != GRPC_ERROR_NONE) { + return err; + } + if (dsmode == GRPC_DSMODE_IPV4) { + grpc_sockaddr_make_wildcard4(0, &wild); + } + if (bind(fd, (const struct sockaddr *)wild.addr, (socklen_t)wild.len) != 0) { + err = GRPC_OS_ERROR(errno, "bind"); + close(fd); + return err; + } + if (getsockname(fd, (struct sockaddr *)wild.addr, (socklen_t *)&wild.len) != + 0) { + err = GRPC_OS_ERROR(errno, "getsockname"); + close(fd); + return err; + } + close(fd); + *port = grpc_sockaddr_get_port(&wild); + return *port <= 0 ? GRPC_ERROR_CREATE("Bad port") : GRPC_ERROR_NONE; +} + +grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, + unsigned port_index, + int requested_port, + int *out_port) { + struct ifaddrs *ifa = NULL; + struct ifaddrs *ifa_it; + unsigned fd_index = 0; + grpc_tcp_listener *sp = NULL; + grpc_error *err = GRPC_ERROR_NONE; + if (requested_port == 0) { + /* Note: There could be a race where some local addrs can listen on the + selected port and some can't. The sane way to handle this would be to + retry by recreating the whole grpc_tcp_server. Backing out individual + listeners and orphaning the FDs looks like too much trouble. */ + if ((err = get_unused_port(&requested_port)) != GRPC_ERROR_NONE) { + return err; + } else if (requested_port <= 0) { + return GRPC_ERROR_CREATE("Bad get_unused_port()"); + } + gpr_log(GPR_DEBUG, "Picked unused port %d", requested_port); + } + if (getifaddrs(&ifa) != 0 || ifa == NULL) { + return GRPC_OS_ERROR(errno, "getifaddrs"); + } + for (ifa_it = ifa; ifa_it != NULL; ifa_it = ifa_it->ifa_next) { + grpc_resolved_address addr; + char *addr_str = NULL; + grpc_dualstack_mode dsmode; + grpc_tcp_listener *new_sp = NULL; + const char *ifa_name = (ifa_it->ifa_name ? ifa_it->ifa_name : ""); + if (ifa_it->ifa_addr == NULL) { + continue; + } else if (ifa_it->ifa_addr->sa_family == AF_INET) { + addr.len = sizeof(struct sockaddr_in); + } else if (ifa_it->ifa_addr->sa_family == AF_INET6) { + addr.len = sizeof(struct sockaddr_in6); + } else { + continue; + } + memcpy(addr.addr, ifa_it->ifa_addr, addr.len); + if (!grpc_sockaddr_set_port(&addr, requested_port)) { + /* Should never happen, because we check sa_family above. */ + err = GRPC_ERROR_CREATE("Failed to set port"); + break; + } + if (grpc_sockaddr_to_string(&addr_str, &addr, 0) < 0) { + addr_str = gpr_strdup(""); + } + gpr_log(GPR_DEBUG, + "Adding local addr from interface %s flags 0x%x to server: %s", + ifa_name, ifa_it->ifa_flags, addr_str); + /* We could have multiple interfaces with the same address (e.g., bonding), + so look for duplicates. */ + if (grpc_tcp_server_find_listener_with_addr(s, &addr) != NULL) { + gpr_log(GPR_DEBUG, "Skipping duplicate addr %s on interface %s", addr_str, + ifa_name); + gpr_free(addr_str); + continue; + } + if ((err = grpc_tcp_server_add_addr(s, &addr, port_index, fd_index, &dsmode, + &new_sp)) != GRPC_ERROR_NONE) { + char *err_str = NULL; + grpc_error *root_err; + if (gpr_asprintf(&err_str, "Failed to add listener: %s", addr_str) < 0) { + err_str = gpr_strdup("Failed to add listener"); + } + root_err = GRPC_ERROR_CREATE(err_str); + gpr_free(err_str); + gpr_free(addr_str); + err = grpc_error_add_child(root_err, err); + break; + } else { + GPR_ASSERT(requested_port == new_sp->port); + ++fd_index; + if (sp != NULL) { + new_sp->is_sibling = 1; + sp->sibling = new_sp; + } + sp = new_sp; + } + gpr_free(addr_str); + } + freeifaddrs(ifa); + if (err != GRPC_ERROR_NONE) { + return err; + } else if (sp == NULL) { + return GRPC_ERROR_CREATE("No local addresses"); + } else { + *out_port = sp->port; + return GRPC_ERROR_NONE; + } +} + +bool grpc_tcp_server_have_ifaddrs(void) { return true; } + +#endif /* GRPC_HAVE_IFADDRS */ diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c b/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c new file mode 100644 index 00000000000..fb21d62d053 --- /dev/null +++ b/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c @@ -0,0 +1,49 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/iomgr/port.h" + +#ifndef GRPC_HAVE_IFADDRS + +#include "src/core/lib/iomgr/tcp_server_utils_posix.h" + +grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, + unsigned port_index, + int requested_port, + int *out_port) { + return GRPC_ERROR_CREATE("no ifaddrs available"); +} + +bool grpc_tcp_server_have_ifaddrs(void) { return false; } + +#endif /* ifndef GRPC_HAVE_IFADDRS */ diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index a9f20e6d2a8..00b2b8f9026 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -134,6 +134,8 @@ CORE_SOURCE_FILES = [ 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', 'src/core/lib/iomgr/tcp_server_windows.c', 'src/core/lib/iomgr/tcp_uv.c', diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 131a0134519..f9e4775b738 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1130,6 +1130,9 @@ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_posix.h \ src/core/lib/iomgr/tcp_server.h \ src/core/lib/iomgr/tcp_server_posix.c \ +src/core/lib/iomgr/tcp_server_utils_posix.h \ +src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ +src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ src/core/lib/iomgr/tcp_server_windows.c \ src/core/lib/iomgr/tcp_uv.c \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 767c2b2e368..38fe87ac463 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7456,6 +7456,7 @@ "src/core/lib/iomgr/tcp_client_posix.h", "src/core/lib/iomgr/tcp_posix.h", "src/core/lib/iomgr/tcp_server.h", + "src/core/lib/iomgr/tcp_server_utils_posix.h", "src/core/lib/iomgr/tcp_uv.h", "src/core/lib/iomgr/tcp_windows.h", "src/core/lib/iomgr/time_averaged_stats.h", @@ -7636,6 +7637,9 @@ "src/core/lib/iomgr/tcp_posix.h", "src/core/lib/iomgr/tcp_server.h", "src/core/lib/iomgr/tcp_server_posix.c", + "src/core/lib/iomgr/tcp_server_utils_posix.h", + "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c", + "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c", "src/core/lib/iomgr/tcp_server_uv.c", "src/core/lib/iomgr/tcp_server_windows.c", "src/core/lib/iomgr/tcp_uv.c", diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index fde60be3e20..7b48dfbf597 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -357,6 +357,7 @@ + @@ -618,6 +619,10 @@ + + + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index 8edbbc22bed..8ba8a4f8fb9 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -181,6 +181,12 @@ src\core\lib\iomgr + + src\core\lib\iomgr + + + src\core\lib\iomgr + src\core\lib\iomgr @@ -944,6 +950,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj index e7c9fb71f33..d078db1c3c7 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj @@ -252,6 +252,7 @@ + @@ -461,6 +462,10 @@ + + + + diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters index 3d36948aaef..9e2d817143e 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters @@ -238,6 +238,12 @@ src\core\lib\iomgr + + src\core\lib\iomgr + + + src\core\lib\iomgr + src\core\lib\iomgr @@ -728,6 +734,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 22f4740b8fa..b6f10b3d7c1 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -347,6 +347,7 @@ + @@ -585,6 +586,10 @@ + + + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 5021cb47d8d..03662d4044c 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -184,6 +184,12 @@ src\core\lib\iomgr + + src\core\lib\iomgr + + + src\core\lib\iomgr + src\core\lib\iomgr @@ -854,6 +860,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr From 427ec5e433e006b7095e68029f5e99a6b11ce962 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 13 Mar 2017 17:57:47 -0700 Subject: [PATCH 044/186] change if to while to avoid unsafe wakeup --- src/ruby/ext/grpc/rb_channel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 9a3f82c2b7a..2489ec2fefc 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -402,7 +402,7 @@ static void grpc_rb_channel_try_register_connection_polling( // Note requires wrapper->wrapped, wrapper->safe_destroy_mu/cv initialized static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { gpr_mu_lock(&wrapper->safe_destroy_mu); - if (!wrapper->safe_to_destroy) { + while (!wrapper->safe_to_destroy) { wrapper->request_safe_destroy = 1; gpr_cv_wait(&wrapper->safe_destroy_cv, &wrapper->safe_destroy_mu, gpr_inf_future(GPR_CLOCK_REALTIME)); From 4b36a3d9eaaab2f39dcebfcd47f48185be158b49 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Mon, 13 Mar 2017 19:08:06 -0700 Subject: [PATCH 045/186] Change error_create API to slice --- .../ext/client_channel/channel_connectivity.c | 4 +- src/core/ext/client_channel/client_channel.c | 39 +++--- .../client_channel/http_connect_handshaker.c | 4 +- src/core/ext/client_channel/subchannel.c | 14 +- src/core/ext/lb_policy/grpclb/grpclb.c | 22 +-- .../ext/lb_policy/pick_first/pick_first.c | 21 +-- .../ext/lb_policy/round_robin/round_robin.c | 23 ++-- .../load_reporting/load_reporting_filter.c | 4 +- .../ext/resolver/dns/native/dns_resolver.c | 5 +- .../chttp2/client/chttp2_connector.c | 6 +- .../transport/chttp2/server/chttp2_server.c | 4 +- .../server/secure/server_secure_chttp2.c | 4 +- .../chttp2/transport/chttp2_transport.c | 126 ++++++++++-------- .../transport/chttp2/transport/frame_data.c | 17 ++- .../transport/chttp2/transport/frame_goaway.c | 5 +- .../transport/chttp2/transport/frame_ping.c | 2 +- .../chttp2/transport/frame_rst_stream.c | 7 +- .../chttp2/transport/frame_settings.c | 11 +- .../chttp2/transport/frame_window_update.c | 4 +- .../transport/chttp2/transport/hpack_parser.c | 56 ++++---- .../transport/chttp2/transport/hpack_table.c | 4 +- .../ext/transport/chttp2/transport/parsing.c | 30 +++-- .../cronet/transport/cronet_transport.c | 2 +- src/core/lib/channel/connected_channel.c | 3 +- src/core/lib/channel/deadline_filter.c | 6 +- src/core/lib/channel/handshaker.c | 5 +- src/core/lib/channel/http_client_filter.c | 2 +- src/core/lib/channel/http_server_filter.c | 51 ++++--- src/core/lib/channel/message_size_filter.c | 11 +- src/core/lib/http/httpcli.c | 14 +- .../lib/http/httpcli_security_connector.c | 2 +- src/core/lib/http/parser.c | 88 +++++++----- src/core/lib/iomgr/error.c | 39 ++++-- src/core/lib/iomgr/error.h | 23 ++-- src/core/lib/iomgr/ev_epoll_linux.c | 14 +- src/core/lib/iomgr/ev_poll_posix.c | 10 +- src/core/lib/iomgr/load_file.c | 9 +- src/core/lib/iomgr/resolve_address_posix.c | 22 +-- src/core/lib/iomgr/resolve_address_uv.c | 14 +- src/core/lib/iomgr/resolve_address_windows.c | 4 +- .../lib/iomgr/socket_utils_common_posix.c | 16 ++- src/core/lib/iomgr/tcp_client_posix.c | 16 ++- src/core/lib/iomgr/tcp_client_uv.c | 16 ++- src/core/lib/iomgr/tcp_client_windows.c | 5 +- src/core/lib/iomgr/tcp_posix.c | 19 ++- src/core/lib/iomgr/tcp_server_posix.c | 40 +++--- src/core/lib/iomgr/tcp_server_uv.c | 27 ++-- src/core/lib/iomgr/tcp_server_windows.c | 11 +- src/core/lib/iomgr/tcp_uv.c | 15 ++- src/core/lib/iomgr/tcp_windows.c | 22 +-- src/core/lib/iomgr/timer_generic.c | 13 +- src/core/lib/iomgr/udp_server.c | 4 +- src/core/lib/iomgr/unix_sockets_posix.c | 2 +- src/core/lib/iomgr/unix_sockets_posix_noop.c | 3 +- .../google_default_credentials.c | 17 ++- .../security/transport/client_auth_filter.c | 19 +-- .../lib/security/transport/secure_endpoint.c | 11 +- .../security/transport/security_connector.c | 21 +-- .../security/transport/security_handshaker.c | 27 ++-- .../security/transport/server_auth_filter.c | 7 +- src/core/lib/security/transport/tsi_error.c | 8 +- src/core/lib/surface/call.c | 41 +++--- src/core/lib/surface/channel.c | 3 +- src/core/lib/surface/lame_client.c | 8 +- src/core/lib/surface/server.c | 38 +++--- src/core/lib/surface/validate_metadata.c | 9 +- src/core/lib/transport/connectivity_state.c | 3 +- src/core/lib/transport/metadata_batch.c | 9 +- test/core/bad_client/bad_client.c | 10 +- .../dns_resolver_connectivity_test.c | 2 +- .../set_initial_connect_string_test.c | 3 +- test/core/end2end/bad_server_response_test.c | 2 +- .../end2end/fixtures/http_proxy_fixture.c | 2 +- test/core/end2end/fuzzers/api_fuzzer.c | 10 +- test/core/end2end/goaway_server_test.c | 2 +- .../end2end/tests/filter_call_init_fails.c | 6 +- test/core/end2end/tests/filter_causes_close.c | 2 +- test/core/iomgr/endpoint_tests.c | 14 +- test/core/iomgr/error_test.c | 93 ++++++++----- test/core/iomgr/ev_epoll_linux_test.c | 2 +- test/core/iomgr/fd_posix_test.c | 2 +- test/core/iomgr/pollset_set_test.c | 3 +- test/core/iomgr/tcp_client_posix_test.c | 5 +- test/core/iomgr/tcp_server_posix_test.c | 5 +- test/core/security/secure_endpoint_test.c | 10 +- test/core/security/ssl_server_fuzzer.c | 5 +- .../surface/concurrent_connectivity_test.c | 3 +- test/core/util/mock_endpoint.c | 5 +- test/core/util/passthru_endpoint.c | 15 ++- test/core/util/reconnect_server.c | 3 +- test/cpp/microbenchmarks/bm_error.cc | 53 ++++---- 91 files changed, 812 insertions(+), 606 deletions(-) diff --git a/src/core/ext/client_channel/channel_connectivity.c b/src/core/ext/client_channel/channel_connectivity.c index dd70bc2c6c8..f6cb3b9115a 100644 --- a/src/core/ext/client_channel/channel_connectivity.c +++ b/src/core/ext/client_channel/channel_connectivity.c @@ -139,8 +139,8 @@ static void partly_done(grpc_exec_ctx *exec_ctx, state_watcher *w, error = GRPC_ERROR_NONE; } else { if (error == GRPC_ERROR_NONE) { - error = - GRPC_ERROR_CREATE("Timed out waiting for connection state change"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Timed out waiting for connection state change"); } else if (error == GRPC_ERROR_CANCELLED) { error = GRPC_ERROR_NONE; } diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index bf64f84772c..f424f833351 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -292,7 +292,8 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, grpc_slice_hash_table *method_params_table = NULL; grpc_connectivity_state state = GRPC_CHANNEL_TRANSIENT_FAILURE; bool exit_idle = false; - grpc_error *state_error = GRPC_ERROR_CREATE("No load balancing policy"); + grpc_error *state_error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("No load balancing policy"); char *service_config_json = NULL; if (chand->resolver_result != NULL) { @@ -392,9 +393,9 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, if (lb_policy != NULL) { grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures); } else if (chand->resolver == NULL /* disconnected */) { - grpc_closure_list_fail_all( - &chand->waiting_for_config_closures, - GRPC_ERROR_CREATE_REFERENCING("Channel disconnected", &error, 1)); + grpc_closure_list_fail_all(&chand->waiting_for_config_closures, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Channel disconnected", &error, 1)); grpc_closure_list_sched(exec_ctx, &chand->waiting_for_config_closures); } if (lb_policy != NULL && chand->exit_idle_when_lb_policy_arrives) { @@ -422,8 +423,8 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, grpc_error *refs[] = {error, state_error}; set_channel_connectivity_state_locked( exec_ctx, chand, GRPC_CHANNEL_SHUTDOWN, - GRPC_ERROR_CREATE_REFERENCING("Got config after disconnection", refs, - GPR_ARRAY_SIZE(refs)), + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Got config after disconnection", refs, GPR_ARRAY_SIZE(refs)), "resolver_gone"); } @@ -462,8 +463,9 @@ static void start_transport_op_locked(grpc_exec_ctx *exec_ctx, void *arg, if (op->send_ping != NULL) { if (chand->lb_policy == NULL) { - grpc_closure_sched(exec_ctx, op->send_ping, - GRPC_ERROR_CREATE("Ping with no load balancing")); + grpc_closure_sched( + exec_ctx, op->send_ping, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Ping with no load balancing")); } else { grpc_lb_policy_ping_one_locked(exec_ctx, chand->lb_policy, op->send_ping); op->bind_pollset = NULL; @@ -578,7 +580,7 @@ static grpc_error *cc_init_channel_elem(grpc_exec_ctx *exec_ctx, if (proxy_name != NULL) gpr_free(proxy_name); if (new_args != NULL) grpc_channel_args_destroy(exec_ctx, new_args); if (chand->resolver == NULL) { - return GRPC_ERROR_CREATE("resolver creation failed"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("resolver creation failed"); } return GRPC_ERROR_NONE; } @@ -738,12 +740,14 @@ static void subchannel_ready_locked(grpc_exec_ctx *exec_ctx, void *arg, calld->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING; if (calld->connected_subchannel == NULL) { gpr_atm_no_barrier_store(&calld->subchannel_call, 1); - fail_locked(exec_ctx, calld, GRPC_ERROR_CREATE_REFERENCING( - "Failed to create subchannel", &error, 1)); + fail_locked(exec_ctx, calld, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Failed to create subchannel", &error, 1)); } else if (GET_CALL(calld) == CANCELLED_CALL) { /* already cancelled before subchannel became ready */ - grpc_error *cancellation_error = GRPC_ERROR_CREATE_REFERENCING( - "Cancelled before creating subchannel", &error, 1); + grpc_error *cancellation_error = + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Cancelled before creating subchannel", &error, 1); /* if due to deadline, attach the deadline exceeded status to the error */ if (gpr_time_cmp(calld->deadline, gpr_now(GPR_CLOCK_MONOTONIC)) < 0) { cancellation_error = @@ -840,9 +844,9 @@ static bool pick_subchannel_locked( cpa = closure->cb_arg; if (cpa->connected_subchannel == connected_subchannel) { cpa->connected_subchannel = NULL; - grpc_closure_sched( - exec_ctx, cpa->on_ready, - GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, cpa->on_ready, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick cancelled", &error, 1)); } } GPR_TIMER_END("pick_subchannel", 0); @@ -898,7 +902,8 @@ static bool pick_subchannel_locked( grpc_closure_list_append(&chand->waiting_for_config_closures, &cpa->closure, GRPC_ERROR_NONE); } else { - grpc_closure_sched(exec_ctx, on_ready, GRPC_ERROR_CREATE("Disconnected")); + grpc_closure_sched(exec_ctx, on_ready, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Disconnected")); } GPR_TIMER_END("pick_subchannel", 0); diff --git a/src/core/ext/client_channel/http_connect_handshaker.c b/src/core/ext/client_channel/http_connect_handshaker.c index 58ab233f1b8..778d76c39fd 100644 --- a/src/core/ext/client_channel/http_connect_handshaker.c +++ b/src/core/ext/client_channel/http_connect_handshaker.c @@ -116,7 +116,7 @@ static void handshake_failed_locked(grpc_exec_ctx* exec_ctx, // If we were shut down after an endpoint operation succeeded but // before the endpoint callback was invoked, we need to generate our // own error. - error = GRPC_ERROR_CREATE("Handshaker shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown"); } if (!handshaker->shutdown) { // TODO(ctiller): It is currently necessary to shutdown endpoints @@ -226,7 +226,7 @@ static void on_read_done(grpc_exec_ctx* exec_ctx, void* arg, char* msg; gpr_asprintf(&msg, "HTTP proxy returned response code %d", handshaker->http_response.status); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); handshake_failed_locked(exec_ctx, handshaker, error); goto done; diff --git a/src/core/ext/client_channel/subchannel.c b/src/core/ext/client_channel/subchannel.c index 5df0a9060d0..ed1903f33eb 100644 --- a/src/core/ext/client_channel/subchannel.c +++ b/src/core/ext/client_channel/subchannel.c @@ -273,8 +273,9 @@ static void disconnect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) { gpr_mu_lock(&c->mu); GPR_ASSERT(!c->disconnected); c->disconnected = true; - grpc_connector_shutdown(exec_ctx, c->connector, - GRPC_ERROR_CREATE("Subchannel disconnected")); + grpc_connector_shutdown( + exec_ctx, c->connector, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Subchannel disconnected")); con = GET_CONNECTED_SUBCHANNEL(c, no_barrier); if (con != NULL) { GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, con, "connection"); @@ -445,7 +446,8 @@ static void on_alarm(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { gpr_mu_lock(&c->mu); c->have_alarm = false; if (c->disconnected) { - error = GRPC_ERROR_CREATE_REFERENCING("Disconnected", &error, 1); + error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Disconnected", + &error, 1); } else { GRPC_ERROR_REF(error); } @@ -696,9 +698,9 @@ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *arg, } else { grpc_connectivity_state_set( exec_ctx, &c->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE, - grpc_error_set_int( - GRPC_ERROR_CREATE_REFERENCING("Connect Failed", &error, 1), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE), + grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Connect Failed", &error, 1), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE), "connect_failed"); const char *errmsg = grpc_error_string(error); diff --git a/src/core/ext/lb_policy/grpclb/grpclb.c b/src/core/ext/lb_policy/grpclb/grpclb.c index d612591f2eb..601b0e643bd 100644 --- a/src/core/ext/lb_policy/grpclb/grpclb.c +++ b/src/core/ext/lb_policy/grpclb/grpclb.c @@ -925,7 +925,7 @@ static void glb_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { } grpc_connectivity_state_set( exec_ctx, &glb_policy->state_tracker, GRPC_CHANNEL_SHUTDOWN, - GRPC_ERROR_CREATE("Channel Shutdown"), "glb_shutdown"); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Shutdown"), "glb_shutdown"); /* We need a copy of the lb_call pointer because we can't cancell the call * while holding glb_policy->mu: lb_on_server_status_received, invoked due to * the cancel, needs to acquire that same lock */ @@ -965,9 +965,9 @@ static void glb_cancel_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pending_pick *next = pp->next; if (pp->target == target) { *target = NULL; - grpc_closure_sched( - exec_ctx, &pp->wrapped_on_complete_arg.wrapper_closure, - GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, &pp->wrapped_on_complete_arg.wrapper_closure, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick Cancelled", &error, 1)); } else { pp->next = glb_policy->pending_picks; glb_policy->pending_picks = pp; @@ -989,9 +989,9 @@ static void glb_cancel_picks_locked(grpc_exec_ctx *exec_ctx, pending_pick *next = pp->next; if ((pp->pick_args.initial_metadata_flags & initial_metadata_flags_mask) == initial_metadata_flags_eq) { - grpc_closure_sched( - exec_ctx, &pp->wrapped_on_complete_arg.wrapper_closure, - GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, &pp->wrapped_on_complete_arg.wrapper_closure, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick Cancelled", &error, 1)); } else { pp->next = glb_policy->pending_picks; glb_policy->pending_picks = pp; @@ -1023,10 +1023,10 @@ static int glb_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, grpc_closure *on_complete) { if (pick_args->lb_token_mdelem_storage == NULL) { *target = NULL; - grpc_closure_sched( - exec_ctx, on_complete, - GRPC_ERROR_CREATE("No mdelem storage for the LB token. Load reporting " - "won't work without it. Failing")); + grpc_closure_sched(exec_ctx, on_complete, + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "No mdelem storage for the LB token. Load reporting " + "won't work without it. Failing")); return 0; } diff --git a/src/core/ext/lb_policy/pick_first/pick_first.c b/src/core/ext/lb_policy/pick_first/pick_first.c index e2a66d16bd7..d582d8bacc5 100644 --- a/src/core/ext/lb_policy/pick_first/pick_first.c +++ b/src/core/ext/lb_policy/pick_first/pick_first.c @@ -101,7 +101,7 @@ static void pf_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { p->pending_picks = NULL; grpc_connectivity_state_set( exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN, - GRPC_ERROR_CREATE("Channel shutdown"), "shutdown"); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel shutdown"), "shutdown"); /* cancel subscription */ if (p->selected != NULL) { grpc_connected_subchannel_notify_on_state_change( @@ -131,9 +131,9 @@ static void pf_cancel_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pending_pick *next = pp->next; if (pp->target == target) { *target = NULL; - grpc_closure_sched( - exec_ctx, pp->on_complete, - GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, pp->on_complete, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick Cancelled", &error, 1)); gpr_free(pp); } else { pp->next = p->pending_picks; @@ -156,9 +156,9 @@ static void pf_cancel_picks_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pending_pick *next = pp->next; if ((pp->initial_metadata_flags & initial_metadata_flags_mask) == initial_metadata_flags_eq) { - grpc_closure_sched( - exec_ctx, pp->on_complete, - GRPC_ERROR_CREATE_REFERENCING("Pick Cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, pp->on_complete, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick Cancelled", &error, 1)); gpr_free(pp); } else { pp->next = p->pending_picks; @@ -325,8 +325,8 @@ static void pf_connectivity_changed_locked(grpc_exec_ctx *exec_ctx, void *arg, if (p->num_subchannels == 0) { grpc_connectivity_state_set( exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN, - GRPC_ERROR_CREATE_REFERENCING("Pick first exhausted channels", - &error, 1), + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick first exhausted channels", &error, 1), "no_more_channels"); while ((pp = p->pending_picks)) { p->pending_picks = pp->next; @@ -373,7 +373,8 @@ static void pf_ping_one_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, if (p->selected) { grpc_connected_subchannel_ping(exec_ctx, p->selected, closure); } else { - grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE("Not connected")); + grpc_closure_sched(exec_ctx, closure, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Not connected")); } } diff --git a/src/core/ext/lb_policy/round_robin/round_robin.c b/src/core/ext/lb_policy/round_robin/round_robin.c index f2d1d46179a..9b3ace5c949 100644 --- a/src/core/ext/lb_policy/round_robin/round_robin.c +++ b/src/core/ext/lb_policy/round_robin/round_robin.c @@ -320,13 +320,14 @@ static void rr_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { while ((pp = p->pending_picks)) { p->pending_picks = pp->next; *pp->target = NULL; - grpc_closure_sched(exec_ctx, pp->on_complete, - GRPC_ERROR_CREATE("Channel Shutdown")); + grpc_closure_sched( + exec_ctx, pp->on_complete, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Shutdown")); gpr_free(pp); } grpc_connectivity_state_set( exec_ctx, &p->state_tracker, GRPC_CHANNEL_SHUTDOWN, - GRPC_ERROR_CREATE("Channel Shutdown"), "rr_shutdown"); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Shutdown"), "rr_shutdown"); for (i = 0; i < p->num_subchannels; i++) { subchannel_data *sd = p->subchannels[i]; grpc_subchannel_notify_on_state_change(exec_ctx, sd->subchannel, NULL, NULL, @@ -345,9 +346,9 @@ static void rr_cancel_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pending_pick *next = pp->next; if (pp->target == target) { *target = NULL; - grpc_closure_sched( - exec_ctx, pp->on_complete, - GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, pp->on_complete, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick cancelled", &error, 1)); gpr_free(pp); } else { pp->next = p->pending_picks; @@ -371,9 +372,9 @@ static void rr_cancel_picks_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, if ((pp->initial_metadata_flags & initial_metadata_flags_mask) == initial_metadata_flags_eq) { *pp->target = NULL; - grpc_closure_sched( - exec_ctx, pp->on_complete, - GRPC_ERROR_CREATE_REFERENCING("Pick cancelled", &error, 1)); + grpc_closure_sched(exec_ctx, pp->on_complete, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Pick cancelled", &error, 1)); gpr_free(pp); } else { pp->next = p->pending_picks; @@ -661,8 +662,8 @@ static void rr_ping_one_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, grpc_connected_subchannel_ping(exec_ctx, target, closure); GRPC_CONNECTED_SUBCHANNEL_UNREF(exec_ctx, target, "rr_picked"); } else { - grpc_closure_sched(exec_ctx, closure, - GRPC_ERROR_CREATE("Round Robin not connected")); + grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Round Robin not connected")); } } diff --git a/src/core/ext/load_reporting/load_reporting_filter.c b/src/core/ext/load_reporting/load_reporting_filter.c index c2750634a50..631484e3fe9 100644 --- a/src/core/ext/load_reporting/load_reporting_filter.c +++ b/src/core/ext/load_reporting/load_reporting_filter.c @@ -78,8 +78,8 @@ static void on_initial_md_ready(grpc_exec_ctx *exec_ctx, void *user_data, GRPC_MDVALUE(calld->recv_initial_metadata->idx.named.path->md)); calld->have_service_method = true; } else { - err = - grpc_error_add_child(err, GRPC_ERROR_CREATE("Missing :path header")); + err = grpc_error_add_child( + err, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing :path header")); } if (calld->recv_initial_metadata->idx.named.lb_token != NULL) { calld->initial_md_string = grpc_slice_ref_internal( diff --git a/src/core/ext/resolver/dns/native/dns_resolver.c b/src/core/ext/resolver/dns/native/dns_resolver.c index d227c19c43c..d6cb6a95a29 100644 --- a/src/core/ext/resolver/dns/native/dns_resolver.c +++ b/src/core/ext/resolver/dns/native/dns_resolver.c @@ -113,8 +113,9 @@ static void dns_shutdown_locked(grpc_exec_ctx *exec_ctx, } if (r->next_completion != NULL) { *r->target_result = NULL; - grpc_closure_sched(exec_ctx, r->next_completion, - GRPC_ERROR_CREATE("Resolver Shutdown")); + grpc_closure_sched( + exec_ctx, r->next_completion, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resolver Shutdown")); r->next_completion = NULL; } } diff --git a/src/core/ext/transport/chttp2/client/chttp2_connector.c b/src/core/ext/transport/chttp2/client/chttp2_connector.c index eae0145ecc7..68e9d7e3926 100644 --- a/src/core/ext/transport/chttp2/client/chttp2_connector.c +++ b/src/core/ext/transport/chttp2/client/chttp2_connector.c @@ -116,7 +116,7 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg, gpr_mu_lock(&c->mu); if (error != GRPC_ERROR_NONE || c->shutdown) { if (error == GRPC_ERROR_NONE) { - error = GRPC_ERROR_CREATE("connector shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("connector shutdown"); // We were shut down after handshaking completed successfully, so // destroy the endpoint here. // TODO(ctiller): It is currently necessary to shutdown endpoints @@ -166,7 +166,7 @@ static void on_initial_connect_string_sent(grpc_exec_ctx *exec_ctx, void *arg, gpr_mu_lock(&c->mu); if (error != GRPC_ERROR_NONE || c->shutdown) { if (error == GRPC_ERROR_NONE) { - error = GRPC_ERROR_CREATE("connector shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("connector shutdown"); } else { error = GRPC_ERROR_REF(error); } @@ -189,7 +189,7 @@ static void connected(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { c->connecting = false; if (error != GRPC_ERROR_NONE || c->shutdown) { if (error == GRPC_ERROR_NONE) { - error = GRPC_ERROR_CREATE("connector shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("connector shutdown"); } else { error = GRPC_ERROR_REF(error); } diff --git a/src/core/ext/transport/chttp2/server/chttp2_server.c b/src/core/ext/transport/chttp2/server/chttp2_server.c index 837b9fd03d8..6433968ca59 100644 --- a/src/core/ext/transport/chttp2/server/chttp2_server.c +++ b/src/core/ext/transport/chttp2/server/chttp2_server.c @@ -256,7 +256,7 @@ grpc_error *grpc_chttp2_server_add_port(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "No address added out of total %" PRIuPTR " resolved", naddrs); - err = GRPC_ERROR_CREATE_REFERENCING(msg, errors, naddrs); + err = GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(msg, errors, naddrs); gpr_free(msg); goto error; } else if (count != naddrs) { @@ -264,7 +264,7 @@ grpc_error *grpc_chttp2_server_add_port(grpc_exec_ctx *exec_ctx, gpr_asprintf(&msg, "Only %" PRIuPTR " addresses added out of total %" PRIuPTR " resolved", count, naddrs); - err = GRPC_ERROR_CREATE_REFERENCING(msg, errors, naddrs); + err = GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(msg, errors, naddrs); gpr_free(msg); const char *warning_message = grpc_error_string(err); diff --git a/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c b/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c index cb2b3f5502c..88c813f3bee 100644 --- a/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +++ b/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c @@ -61,7 +61,7 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, 3, (server, addr, creds)); // Create security context. if (creds == NULL) { - err = GRPC_ERROR_CREATE( + err = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "No credentials specified for secure server port (creds==NULL)"); goto done; } @@ -72,7 +72,7 @@ int grpc_server_add_secure_http2_port(grpc_server *server, const char *addr, gpr_asprintf(&msg, "Unable to create secure server with credentials of type %s.", creds->type); - err = grpc_error_set_int(GRPC_ERROR_CREATE(msg), + err = grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg), GRPC_ERROR_INT_SECURITY_STATUS, status); gpr_free(msg); goto done; diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index 15039f7308c..dab7bc80f36 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -187,7 +187,8 @@ static void destruct_transport(grpc_exec_ctx *exec_ctx, GRPC_COMBINER_UNREF(exec_ctx, t->combiner, "chttp2_transport"); - cancel_pings(exec_ctx, t, GRPC_ERROR_CREATE("Transport destroyed")); + cancel_pings(exec_ctx, t, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed")); while (t->write_cb_pool) { grpc_chttp2_write_cb *next = t->write_cb_pool->next; @@ -494,8 +495,9 @@ static void destroy_transport_locked(grpc_exec_ctx *exec_ctx, void *tp, t->destroying = 1; close_transport_locked( exec_ctx, t, - grpc_error_set_int(GRPC_ERROR_CREATE("Transport destroyed"), - GRPC_ERROR_INT_OCCURRED_DURING_WRITE, t->write_state)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport destroyed"), + GRPC_ERROR_INT_OCCURRED_DURING_WRITE, t->write_state)); GRPC_CHTTP2_UNREF_TRANSPORT(exec_ctx, t, "destroy"); } @@ -514,7 +516,8 @@ static void close_transport_locked(grpc_exec_ctx *exec_ctx, if (t->write_state != GRPC_CHTTP2_WRITE_STATE_IDLE) { if (t->close_transport_on_writes_finished == NULL) { t->close_transport_on_writes_finished = - GRPC_ERROR_CREATE("Delayed close due to in-progress write"); + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Delayed close due to in-progress write"); } t->close_transport_on_writes_finished = grpc_error_add_child(t->close_transport_on_writes_finished, error); @@ -833,7 +836,8 @@ static void write_action_end_locked(grpc_exec_ctx *exec_ctx, void *tp, if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED) { t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SENT; if (grpc_chttp2_stream_map_size(&t->stream_map) == 0) { - close_transport_locked(exec_ctx, t, GRPC_ERROR_CREATE("goaway sent")); + close_transport_locked( + exec_ctx, t, GRPC_ERROR_CREATE_FROM_STATIC_STRING("goaway sent")); } } @@ -905,9 +909,9 @@ void grpc_chttp2_add_incoming_goaway(grpc_exec_ctx *exec_ctx, connectivity_state_set( exec_ctx, t, GRPC_CHANNEL_TRANSIENT_FAILURE, grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE("GOAWAY received"), - GRPC_ERROR_INT_HTTP2_ERROR, - (intptr_t)goaway_error), + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("GOAWAY received"), + GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)goaway_error), GRPC_ERROR_STR_RAW_BYTES, goaway_text), "got_goaway"); } @@ -932,9 +936,10 @@ static void maybe_start_some_streams(grpc_exec_ctx *exec_ctx, t->next_stream_id += 2; if (t->next_stream_id >= MAX_CLIENT_STREAM_ID) { - connectivity_state_set(exec_ctx, t, GRPC_CHANNEL_TRANSIENT_FAILURE, - GRPC_ERROR_CREATE("Stream IDs exhausted"), - "no_more_stream_ids"); + connectivity_state_set( + exec_ctx, t, GRPC_CHANNEL_TRANSIENT_FAILURE, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Stream IDs exhausted"), + "no_more_stream_ids"); } grpc_chttp2_stream_map_add(&t->stream_map, s->id, s); @@ -948,9 +953,9 @@ static void maybe_start_some_streams(grpc_exec_ctx *exec_ctx, grpc_chttp2_list_pop_waiting_for_concurrency(t, &s)) { grpc_chttp2_cancel_stream( exec_ctx, t, s, - grpc_error_set_int(GRPC_ERROR_CREATE("Stream IDs exhausted"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNAVAILABLE)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Stream IDs exhausted"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); } } @@ -999,11 +1004,11 @@ void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx, } if (error != GRPC_ERROR_NONE) { if (closure->error_data.error == GRPC_ERROR_NONE) { - closure->error_data.error = - GRPC_ERROR_CREATE("Error in HTTP transport completing operation"); - closure->error_data.error = - grpc_error_set_str(closure->error_data.error, - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(t->peer_string)); + closure->error_data.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Error in HTTP transport completing operation"); + closure->error_data.error = grpc_error_set_str( + closure->error_data.error, GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(t->peer_string)); } closure->error_data.error = grpc_error_add_child(closure->error_data.error, error); @@ -1178,10 +1183,11 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, exec_ctx, t, s, grpc_error_set_int( grpc_error_set_int( - grpc_error_set_int( - GRPC_ERROR_CREATE("to-be-sent initial metadata size " - "exceeds peer limit"), - GRPC_ERROR_INT_SIZE, (intptr_t)metadata_size), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "to-be-sent initial metadata size " + "exceeds peer limit"), + GRPC_ERROR_INT_SIZE, + (intptr_t)metadata_size), GRPC_ERROR_INT_LIMIT, (intptr_t)metadata_peer_limit), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED)); } else { @@ -1197,9 +1203,9 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, } else { grpc_chttp2_cancel_stream( exec_ctx, t, s, - grpc_error_set_int(GRPC_ERROR_CREATE("Transport closed"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNAVAILABLE)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport closed"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE)); } } else { GPR_ASSERT(s->id != 0); @@ -1211,7 +1217,7 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, s->send_initial_metadata = NULL; grpc_chttp2_complete_closure_step( exec_ctx, t, s, &s->send_initial_metadata_finished, - GRPC_ERROR_CREATE_REFERENCING( + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Attempt to send initial metadata after stream was closed", &s->write_closed_error, 1), "send_initial_metadata_finished"); @@ -1225,7 +1231,7 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, if (s->write_closed) { grpc_chttp2_complete_closure_step( exec_ctx, t, s, &s->fetching_send_message_finished, - GRPC_ERROR_CREATE_REFERENCING( + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Attempt to send message after stream was closed", &s->write_closed_error, 1), "fetching_send_message_finished"); @@ -1273,10 +1279,11 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, exec_ctx, t, s, grpc_error_set_int( grpc_error_set_int( - grpc_error_set_int( - GRPC_ERROR_CREATE("to-be-sent trailing metadata size " - "exceeds peer limit"), - GRPC_ERROR_INT_SIZE, (intptr_t)metadata_size), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "to-be-sent trailing metadata size " + "exceeds peer limit"), + GRPC_ERROR_INT_SIZE, + (intptr_t)metadata_size), GRPC_ERROR_INT_LIMIT, (intptr_t)metadata_peer_limit), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED)); } else { @@ -1289,8 +1296,9 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op, exec_ctx, t, s, &s->send_trailing_metadata_finished, grpc_metadata_batch_is_empty(op->send_trailing_metadata) ? GRPC_ERROR_NONE - : GRPC_ERROR_CREATE("Attempt to send trailing metadata after " - "stream was closed"), + : GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Attempt to send trailing metadata after " + "stream was closed"), "send_trailing_metadata_finished"); } else if (s->id != 0) { /* TODO(ctiller): check if there's flow control for any outstanding @@ -1406,8 +1414,8 @@ static void send_goaway(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, t->sent_goaway_state = GRPC_CHTTP2_GOAWAY_SEND_SCHEDULED; grpc_http2_error_code http_error; grpc_slice slice; - grpc_error_get_status(error, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL, &slice, - &http_error); + grpc_error_get_status(error, gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL, + &slice, &http_error); grpc_chttp2_goaway_append(t->last_new_stream_id, (uint32_t)http_error, grpc_slice_ref_internal(slice), &t->qbuf); grpc_chttp2_initiate_write(exec_ctx, t, false, "goaway_sent"); @@ -1569,7 +1577,7 @@ static void remove_stream(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, if (t->sent_goaway_state == GRPC_CHTTP2_GOAWAY_SENT) { close_transport_locked( exec_ctx, t, - GRPC_ERROR_CREATE_REFERENCING( + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Last stream closed after sending GOAWAY", &error, 1)); } } @@ -1661,7 +1669,8 @@ static grpc_error *removal_error(grpc_error *extra_error, grpc_chttp2_stream *s, add_error(extra_error, refs, &nrefs); grpc_error *error = GRPC_ERROR_NONE; if (nrefs > 0) { - error = GRPC_ERROR_CREATE_REFERENCING(master_error_msg, refs, nrefs); + error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(master_error_msg, + refs, nrefs); } GRPC_ERROR_UNREF(extra_error); return error; @@ -1912,9 +1921,9 @@ static grpc_error *try_http_parsing(grpc_exec_ctx *exec_ctx, if (parse_error == GRPC_ERROR_NONE && (parse_error = grpc_http_parser_eof(&parser)) == GRPC_ERROR_NONE) { error = grpc_error_set_int( - grpc_error_set_int( - GRPC_ERROR_CREATE("Trying to connect an http1.x server"), - GRPC_ERROR_INT_HTTP_STATUS, response.status), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Trying to connect an http1.x server"), + GRPC_ERROR_INT_HTTP_STATUS, response.status), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE); } GRPC_ERROR_UNREF(parse_error); @@ -1935,9 +1944,10 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *tp, grpc_error *err = error; if (err != GRPC_ERROR_NONE) { - err = grpc_error_set_int( - GRPC_ERROR_CREATE_REFERENCING("Endpoint read failed", &err, 1), - GRPC_ERROR_INT_OCCURRED_DURING_WRITE, t->write_state); + err = grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Endpoint read failed", &err, 1), + GRPC_ERROR_INT_OCCURRED_DURING_WRITE, + t->write_state); } GPR_SWAP(grpc_error *, err, error); GRPC_ERROR_UNREF(err); @@ -1958,8 +1968,8 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *tp, if (errors[1] != GRPC_ERROR_NONE) { errors[2] = try_http_parsing(exec_ctx, t); GRPC_ERROR_UNREF(error); - error = GRPC_ERROR_CREATE_REFERENCING("Failed parsing HTTP/2", errors, - GPR_ARRAY_SIZE(errors)); + error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Failed parsing HTTP/2", errors, GPR_ARRAY_SIZE(errors)); } for (i = 0; i < GPR_ARRAY_SIZE(errors); i++) { GRPC_ERROR_UNREF(errors[i]); @@ -1984,7 +1994,7 @@ static void read_action_locked(grpc_exec_ctx *exec_ctx, void *tp, GPR_TIMER_BEGIN("post_reading_action_locked", 0); bool keep_reading = false; if (error == GRPC_ERROR_NONE && t->closed) { - error = GRPC_ERROR_CREATE("Transport closed"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Transport closed"); } if (error != GRPC_ERROR_NONE) { close_transport_locked(exec_ctx, t, GRPC_ERROR_REF(error)); @@ -2119,8 +2129,8 @@ static void keepalive_watchdog_fired_locked(grpc_exec_ctx *exec_ctx, void *arg, if (t->keepalive_state == GRPC_CHTTP2_KEEPALIVE_STATE_PINGING) { if (error == GRPC_ERROR_NONE) { t->keepalive_state = GRPC_CHTTP2_KEEPALIVE_STATE_DYING; - close_transport_locked(exec_ctx, t, - GRPC_ERROR_CREATE("keepalive watchdog timeout")); + close_transport_locked(exec_ctx, t, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "keepalive watchdog timeout")); } } else { /** The watchdog timer should have been cancelled by @@ -2319,7 +2329,8 @@ void grpc_chttp2_incoming_byte_stream_push(grpc_exec_ctx *exec_ctx, gpr_mu_lock(&bs->slice_mu); if (bs->remaining_bytes < GRPC_SLICE_LENGTH(slice)) { incoming_byte_stream_publish_error( - exec_ctx, bs, GRPC_ERROR_CREATE("Too many bytes in stream")); + exec_ctx, bs, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Too many bytes in stream")); } else { bs->remaining_bytes -= (uint32_t)GRPC_SLICE_LENGTH(slice); if (bs->on_next != NULL) { @@ -2339,7 +2350,7 @@ void grpc_chttp2_incoming_byte_stream_finished( if (error == GRPC_ERROR_NONE) { gpr_mu_lock(&bs->slice_mu); if (bs->remaining_bytes != 0) { - error = GRPC_ERROR_CREATE("Truncated message"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message"); } gpr_mu_unlock(&bs->slice_mu); } @@ -2419,9 +2430,9 @@ static void benign_reclaimer_locked(grpc_exec_ctx *exec_ctx, void *arg, t->peer_string); } send_goaway(exec_ctx, t, - grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"), - GRPC_ERROR_INT_HTTP2_ERROR, - GRPC_HTTP2_ENHANCE_YOUR_CALM)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Buffers full"), + GRPC_ERROR_INT_HTTP2_ERROR, GRPC_HTTP2_ENHANCE_YOUR_CALM)); } else if (error == GRPC_ERROR_NONE && grpc_resource_quota_trace) { gpr_log(GPR_DEBUG, "HTTP2: %s - skip benign reclamation, there are still %" PRIdPTR @@ -2448,9 +2459,10 @@ static void destructive_reclaimer_locked(grpc_exec_ctx *exec_ctx, void *arg, s->id); } grpc_chttp2_cancel_stream( - exec_ctx, t, s, grpc_error_set_int(GRPC_ERROR_CREATE("Buffers full"), - GRPC_ERROR_INT_HTTP2_ERROR, - GRPC_HTTP2_ENHANCE_YOUR_CALM)); + exec_ctx, t, s, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Buffers full"), + GRPC_ERROR_INT_HTTP2_ERROR, + GRPC_HTTP2_ENHANCE_YOUR_CALM)); if (n > 1) { /* Since we cancel one stream per destructive reclamation, if there are more streams left, we can immediately post a new diff --git a/src/core/ext/transport/chttp2/transport/frame_data.c b/src/core/ext/transport/chttp2/transport/frame_data.c index 6fc4897b822..6e9258ee7ee 100644 --- a/src/core/ext/transport/chttp2/transport/frame_data.c +++ b/src/core/ext/transport/chttp2/transport/frame_data.c @@ -54,7 +54,8 @@ void grpc_chttp2_data_parser_destroy(grpc_exec_ctx *exec_ctx, grpc_chttp2_data_parser *parser) { if (parser->parsing_frame != NULL) { grpc_chttp2_incoming_byte_stream_finished( - exec_ctx, parser->parsing_frame, GRPC_ERROR_CREATE("Parser destroyed")); + exec_ctx, parser->parsing_frame, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Parser destroyed")); } GRPC_ERROR_UNREF(parser->error); } @@ -65,8 +66,9 @@ grpc_error *grpc_chttp2_data_parser_begin_frame(grpc_chttp2_data_parser *parser, if (flags & ~GRPC_CHTTP2_DATA_FLAG_END_STREAM) { char *msg; gpr_asprintf(&msg, "unsupported data flags: 0x%02x", flags); - grpc_error *err = grpc_error_set_int( - GRPC_ERROR_CREATE(msg), GRPC_ERROR_INT_STREAM_ID, (intptr_t)stream_id); + grpc_error *err = + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg), + GRPC_ERROR_INT_STREAM_ID, (intptr_t)stream_id); gpr_free(msg); return err; } @@ -173,13 +175,13 @@ static grpc_error *parse_inner(grpc_exec_ctx *exec_ctx, break; default: gpr_asprintf(&msg, "Bad GRPC frame type 0x%02x", p->frame_type); - p->error = GRPC_ERROR_CREATE(msg); + p->error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); p->error = grpc_error_set_int(p->error, GRPC_ERROR_INT_STREAM_ID, (intptr_t)s->id); gpr_free(msg); msg = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); - p->error = - grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_copied_string(msg)); + p->error = grpc_error_set_str(p->error, GRPC_ERROR_STR_RAW_BYTES, + grpc_slice_from_copied_string(msg)); gpr_free(msg); p->error = grpc_error_set_int(p->error, GRPC_ERROR_INT_OFFSET, cur - beg); @@ -265,7 +267,8 @@ static grpc_error *parse_inner(grpc_exec_ctx *exec_ctx, } } - GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); + GPR_UNREACHABLE_CODE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")); } grpc_error *grpc_chttp2_data_parser_parse(grpc_exec_ctx *exec_ctx, void *parser, diff --git a/src/core/ext/transport/chttp2/transport/frame_goaway.c b/src/core/ext/transport/chttp2/transport/frame_goaway.c index d99d486c1bd..001271dd228 100644 --- a/src/core/ext/transport/chttp2/transport/frame_goaway.c +++ b/src/core/ext/transport/chttp2/transport/frame_goaway.c @@ -54,7 +54,7 @@ grpc_error *grpc_chttp2_goaway_parser_begin_frame(grpc_chttp2_goaway_parser *p, if (length < 8) { char *msg; gpr_asprintf(&msg, "goaway frame too short (%d bytes)", length); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -156,7 +156,8 @@ grpc_error *grpc_chttp2_goaway_parser_parse(grpc_exec_ctx *exec_ctx, } return GRPC_ERROR_NONE; } - GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); + GPR_UNREACHABLE_CODE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")); } void grpc_chttp2_goaway_append(uint32_t last_stream_id, uint32_t error_code, diff --git a/src/core/ext/transport/chttp2/transport/frame_ping.c b/src/core/ext/transport/chttp2/transport/frame_ping.c index f487533c414..efbb7b33f5e 100644 --- a/src/core/ext/transport/chttp2/transport/frame_ping.c +++ b/src/core/ext/transport/chttp2/transport/frame_ping.c @@ -71,7 +71,7 @@ grpc_error *grpc_chttp2_ping_parser_begin_frame(grpc_chttp2_ping_parser *parser, if (flags & 0xfe || length != 8) { char *msg; gpr_asprintf(&msg, "invalid ping: length=%d, flags=%02x", length, flags); - grpc_error *error = GRPC_ERROR_CREATE(msg); + grpc_error *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return error; } diff --git a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c index e5fabd0e921..225f15c77c9 100644 --- a/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +++ b/src/core/ext/transport/chttp2/transport/frame_rst_stream.c @@ -76,7 +76,7 @@ grpc_error *grpc_chttp2_rst_stream_parser_begin_frame( char *msg; gpr_asprintf(&msg, "invalid rst_stream: length=%d, flags=%02x", length, flags); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -112,8 +112,9 @@ grpc_error *grpc_chttp2_rst_stream_parser_parse(grpc_exec_ctx *exec_ctx, char *message; gpr_asprintf(&message, "Received RST_STREAM with error code %d", reason); error = grpc_error_set_int( - grpc_error_set_str(GRPC_ERROR_CREATE("RST_STREAM"), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(message)), + grpc_error_set_str(GRPC_ERROR_CREATE_FROM_STATIC_STRING("RST_STREAM"), + GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_copied_string(message)), GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)reason); gpr_free(message); } diff --git a/src/core/ext/transport/chttp2/transport/frame_settings.c b/src/core/ext/transport/chttp2/transport/frame_settings.c index 82290e34cde..16881c0707a 100644 --- a/src/core/ext/transport/chttp2/transport/frame_settings.c +++ b/src/core/ext/transport/chttp2/transport/frame_settings.c @@ -131,13 +131,16 @@ grpc_error *grpc_chttp2_settings_parser_begin_frame( if (flags == GRPC_CHTTP2_FLAG_ACK) { parser->is_ack = 1; if (length != 0) { - return GRPC_ERROR_CREATE("non-empty settings ack frame received"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "non-empty settings ack frame received"); } return GRPC_ERROR_NONE; } else if (flags != 0) { - return GRPC_ERROR_CREATE("invalid flags on settings frame"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "invalid flags on settings frame"); } else if (length % 6 != 0) { - return GRPC_ERROR_CREATE("settings frames must be a multiple of six bytes"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "settings frames must be a multiple of six bytes"); } else { return GRPC_ERROR_NONE; } @@ -229,7 +232,7 @@ grpc_error *grpc_chttp2_settings_parser_parse(grpc_exec_ctx *exec_ctx, void *p, &t->qbuf); gpr_asprintf(&msg, "invalid value %u passed for %s", parser->value, sp->name); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } diff --git a/src/core/ext/transport/chttp2/transport/frame_window_update.c b/src/core/ext/transport/chttp2/transport/frame_window_update.c index 8fa0bb471ae..b76b6f6f477 100644 --- a/src/core/ext/transport/chttp2/transport/frame_window_update.c +++ b/src/core/ext/transport/chttp2/transport/frame_window_update.c @@ -70,7 +70,7 @@ grpc_error *grpc_chttp2_window_update_parser_begin_frame( char *msg; gpr_asprintf(&msg, "invalid window update: length=%d, flags=%02x", length, flags); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -102,7 +102,7 @@ grpc_error *grpc_chttp2_window_update_parser_parse( if (received_update == 0 || (received_update & 0x80000000u)) { char *msg; gpr_asprintf(&msg, "invalid window update bytes: %d", p->amount); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.c b/src/core/ext/transport/chttp2/transport/hpack_parser.c index 40f5120308c..a99ed0e7f31 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.c +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.c @@ -693,7 +693,7 @@ static grpc_error *on_hdr(grpc_exec_ctx *exec_ctx, grpc_chttp2_hpack_parser *p, } if (p->on_header == NULL) { GRPC_MDELEM_UNREF(exec_ctx, md); - return GRPC_ERROR_CREATE("on_header callback not set"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("on_header callback not set"); } p->on_header(exec_ctx, p->on_header_user_data, md); return GRPC_ERROR_NONE; @@ -810,7 +810,8 @@ static grpc_error *finish_indexed_field(grpc_exec_ctx *exec_ctx, grpc_mdelem md = grpc_chttp2_hptbl_lookup(&p->table, p->index); if (GRPC_MDISNULL(md)) { return grpc_error_set_int( - grpc_error_set_int(GRPC_ERROR_CREATE("Invalid HPACK index received"), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Invalid HPACK index received"), GRPC_ERROR_INT_INDEX, (intptr_t)p->index), GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents); } @@ -1074,7 +1075,7 @@ static grpc_error *parse_max_tbl_size(grpc_exec_ctx *exec_ctx, if (p->dynamic_table_update_allowed == 0) { return parse_error( exec_ctx, p, cur, end, - GRPC_ERROR_CREATE( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( "More than two max table size changes in a single frame")); } p->dynamic_table_update_allowed--; @@ -1092,7 +1093,7 @@ static grpc_error *parse_max_tbl_size_x(grpc_exec_ctx *exec_ctx, if (p->dynamic_table_update_allowed == 0) { return parse_error( exec_ctx, p, cur, end, - GRPC_ERROR_CREATE( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( "More than two max table size changes in a single frame")); } p->dynamic_table_update_allowed--; @@ -1126,7 +1127,7 @@ static grpc_error *parse_illegal_op(grpc_exec_ctx *exec_ctx, GPR_ASSERT(cur != end); char *msg; gpr_asprintf(&msg, "Illegal hpack op code %d", *cur); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return parse_error(exec_ctx, p, cur, end, err); } @@ -1246,7 +1247,7 @@ error: "integer overflow in hpack integer decoding: have 0x%08x, " "got byte 0x%02x on byte 5", *p->parsing.value, *cur); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return parse_error(exec_ctx, p, cur, end, err); } @@ -1275,7 +1276,7 @@ static grpc_error *parse_value5up(grpc_exec_ctx *exec_ctx, "integer overflow in hpack integer decoding: have 0x%08x, " "got byte 0x%02x sometime after byte 5", *p->parsing.value, *cur); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return parse_error(exec_ctx, p, cur, end, err); } @@ -1333,8 +1334,9 @@ static grpc_error *append_string(grpc_exec_ctx *exec_ctx, bits = inverse_base64[*cur]; ++cur; if (bits == 255) - return parse_error(exec_ctx, p, cur, end, - GRPC_ERROR_CREATE("Illegal base64 character")); + return parse_error( + exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character")); else if (bits == 64) goto b64_byte0; p->base64_buffer = bits << 18; @@ -1348,8 +1350,9 @@ static grpc_error *append_string(grpc_exec_ctx *exec_ctx, bits = inverse_base64[*cur]; ++cur; if (bits == 255) - return parse_error(exec_ctx, p, cur, end, - GRPC_ERROR_CREATE("Illegal base64 character")); + return parse_error( + exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character")); else if (bits == 64) goto b64_byte1; p->base64_buffer |= bits << 12; @@ -1363,8 +1366,9 @@ static grpc_error *append_string(grpc_exec_ctx *exec_ctx, bits = inverse_base64[*cur]; ++cur; if (bits == 255) - return parse_error(exec_ctx, p, cur, end, - GRPC_ERROR_CREATE("Illegal base64 character")); + return parse_error( + exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character")); else if (bits == 64) goto b64_byte2; p->base64_buffer |= bits << 6; @@ -1378,8 +1382,9 @@ static grpc_error *append_string(grpc_exec_ctx *exec_ctx, bits = inverse_base64[*cur]; ++cur; if (bits == 255) - return parse_error(exec_ctx, p, cur, end, - GRPC_ERROR_CREATE("Illegal base64 character")); + return parse_error( + exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Illegal base64 character")); else if (bits == 64) goto b64_byte3; p->base64_buffer |= bits; @@ -1391,7 +1396,8 @@ static grpc_error *append_string(grpc_exec_ctx *exec_ctx, goto b64_byte0; } GPR_UNREACHABLE_CODE(return parse_error( - exec_ctx, p, cur, end, GRPC_ERROR_CREATE("Should never reach here"))); + exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here"))); } static grpc_error *finish_str(grpc_exec_ctx *exec_ctx, @@ -1406,16 +1412,16 @@ static grpc_error *finish_str(grpc_exec_ctx *exec_ctx, case B64_BYTE0: break; case B64_BYTE1: - return parse_error( - exec_ctx, p, cur, end, - GRPC_ERROR_CREATE("illegal base64 encoding")); /* illegal encoding */ + return parse_error(exec_ctx, p, cur, end, + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "illegal base64 encoding")); /* illegal encoding */ case B64_BYTE2: bits = p->base64_buffer; if (bits & 0xffff) { char *msg; gpr_asprintf(&msg, "trailing bits in base64 encoding: 0x%04x", bits & 0xffff); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return parse_error(exec_ctx, p, cur, end, err); } @@ -1428,7 +1434,7 @@ static grpc_error *finish_str(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "trailing bits in base64 encoding: 0x%02x", bits & 0xff); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return parse_error(exec_ctx, p, cur, end, err); } @@ -1550,7 +1556,8 @@ static grpc_error *is_binary_indexed_header(grpc_chttp2_hpack_parser *p, grpc_mdelem elem = grpc_chttp2_hptbl_lookup(&p->table, p->index); if (GRPC_MDISNULL(elem)) { return grpc_error_set_int( - grpc_error_set_int(GRPC_ERROR_CREATE("Invalid HPACK index received"), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Invalid HPACK index received"), GRPC_ERROR_INT_INDEX, (intptr_t)p->index), GRPC_ERROR_INT_SIZE, (intptr_t)p->table.num_ents); } @@ -1670,7 +1677,7 @@ grpc_error *grpc_chttp2_header_parser_parse(grpc_exec_ctx *exec_ctx, if (is_last) { if (parser->is_boundary && parser->state != parse_begin) { GPR_TIMER_END("grpc_chttp2_hpack_parser_parse", 0); - return GRPC_ERROR_CREATE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "end of header frame not aligned with a hpack record boundary"); } /* need to check for null stream: this can occur if we receive an invalid @@ -1678,7 +1685,8 @@ grpc_error *grpc_chttp2_header_parser_parse(grpc_exec_ctx *exec_ctx, if (s != NULL) { if (parser->is_boundary) { if (s->header_frames_received == GPR_ARRAY_SIZE(s->metadata_buffer)) { - return GRPC_ERROR_CREATE("Too many trailer frames"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Too many trailer frames"); } s->published_metadata[s->header_frames_received] = GRPC_METADATA_PUBLISHED_FROM_WIRE; diff --git a/src/core/ext/transport/chttp2/transport/hpack_table.c b/src/core/ext/transport/chttp2/transport/hpack_table.c index 62dd1b8cab4..9dd41fdbe16 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_table.c +++ b/src/core/ext/transport/chttp2/transport/hpack_table.c @@ -280,7 +280,7 @@ grpc_error *grpc_chttp2_hptbl_set_current_table_size(grpc_exec_ctx *exec_ctx, gpr_asprintf(&msg, "Attempt to make hpack table %d bytes when max is %d bytes", bytes, tbl->max_bytes); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -317,7 +317,7 @@ grpc_error *grpc_chttp2_hptbl_add(grpc_exec_ctx *exec_ctx, "HPACK max table size reduced to %d but not reflected by hpack " "stream (still at %d)", tbl->max_bytes, tbl->current_table_bytes); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } diff --git a/src/core/ext/transport/chttp2/transport/parsing.c b/src/core/ext/transport/chttp2/transport/parsing.c index e7f2597f89c..65cb6133b2e 100644 --- a/src/core/ext/transport/chttp2/transport/parsing.c +++ b/src/core/ext/transport/chttp2/transport/parsing.c @@ -116,7 +116,7 @@ grpc_error *grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx, GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state], (int)(uint8_t)GRPC_CHTTP2_CLIENT_CONNECT_STRING[t->deframe_state], *cur, (int)*cur, t->deframe_state); - err = GRPC_ERROR_CREATE(msg); + err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -219,7 +219,7 @@ grpc_error *grpc_chttp2_perform_read(grpc_exec_ctx *exec_ctx, t->incoming_frame_size, t->settings[GRPC_ACKED_SETTINGS] [GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE]); - err = GRPC_ERROR_CREATE(msg); + err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -278,7 +278,7 @@ static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx, gpr_asprintf( &msg, "Expected SETTINGS frame as the first frame, got frame type %d", t->incoming_frame_type); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -288,7 +288,7 @@ static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "Expected CONTINUATION frame, got frame type %02x", t->incoming_frame_type); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -299,7 +299,7 @@ static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx, "Expected CONTINUATION frame for grpc_chttp2_stream %08x, got " "grpc_chttp2_stream %08x", t->expect_continuation_stream_id, t->incoming_stream_id); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -311,7 +311,8 @@ static grpc_error *init_frame_parser(grpc_exec_ctx *exec_ctx, case GRPC_CHTTP2_FRAME_HEADER: return init_header_frame_parser(exec_ctx, t, 0); case GRPC_CHTTP2_FRAME_CONTINUATION: - return GRPC_ERROR_CREATE("Unexpected CONTINUATION frame"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Unexpected CONTINUATION frame"); case GRPC_CHTTP2_FRAME_RST_STREAM: return init_rst_stream_parser(exec_ctx, t); case GRPC_CHTTP2_FRAME_SETTINGS: @@ -371,7 +372,7 @@ static grpc_error *update_incoming_window(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "frame of size %d overflows incoming window of %" PRId64, t->incoming_frame_size, t->incoming_window); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -409,7 +410,7 @@ static grpc_error *update_incoming_window(grpc_exec_ctx *exec_ctx, s->incoming_window_delta + t->settings[GRPC_ACKED_SETTINGS] [GRPC_CHTTP2_SETTINGS_INITIAL_WINDOW_SIZE]); - grpc_error *err = GRPC_ERROR_CREATE(msg); + grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return err; } @@ -542,7 +543,8 @@ static void on_initial_header(grpc_exec_ctx *exec_ctx, void *tp, grpc_chttp2_cancel_stream( exec_ctx, t, s, grpc_error_set_int( - GRPC_ERROR_CREATE("received initial metadata size exceeds limit"), + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "received initial metadata size exceeds limit"), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED)); grpc_chttp2_parsing_become_skip_parser(exec_ctx, t); s->seen_error = true; @@ -591,9 +593,10 @@ static void on_trailing_header(grpc_exec_ctx *exec_ctx, void *tp, new_size, metadata_size_limit); grpc_chttp2_cancel_stream( exec_ctx, t, s, - grpc_error_set_int( - GRPC_ERROR_CREATE("received trailing metadata size exceeds limit"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_RESOURCE_EXHAUSTED)); + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "received trailing metadata size exceeds limit"), + GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_RESOURCE_EXHAUSTED)); grpc_chttp2_parsing_become_skip_parser(exec_ctx, t); s->seen_error = true; GRPC_MDELEM_UNREF(exec_ctx, md); @@ -757,7 +760,8 @@ static grpc_error *init_goaway_parser(grpc_exec_ctx *exec_ctx, static grpc_error *init_settings_frame_parser(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t) { if (t->incoming_stream_id != 0) { - return GRPC_ERROR_CREATE("Settings frame received for grpc_chttp2_stream"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Settings frame received for grpc_chttp2_stream"); } grpc_error *err = grpc_chttp2_settings_parser_begin_frame( diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 01a03533daf..80c210dc0c5 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -257,7 +257,7 @@ static void free_read_buffer(stream_obj *s) { } static grpc_error *make_error_with_desc(int error_code, const char *desc) { - grpc_error *error = GRPC_ERROR_CREATE(desc); + grpc_error *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc); error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS, error_code); return error; } diff --git a/src/core/lib/channel/connected_channel.c b/src/core/lib/channel/connected_channel.c index 29796f7ca7e..e7859baf180 100644 --- a/src/core/lib/channel/connected_channel.c +++ b/src/core/lib/channel/connected_channel.c @@ -90,7 +90,8 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, exec_ctx, chand->transport, TRANSPORT_STREAM_FROM_CALL_DATA(calld), &args->call_stack->refcount, args->server_transport_data); return r == 0 ? GRPC_ERROR_NONE - : GRPC_ERROR_CREATE("transport stream initialization failed"); + : GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "transport stream initialization failed"); } static void set_pollset_or_pollset_set(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/channel/deadline_filter.c b/src/core/lib/channel/deadline_filter.c index 5a12d62f1d1..1b68e730348 100644 --- a/src/core/lib/channel/deadline_filter.c +++ b/src/core/lib/channel/deadline_filter.c @@ -55,9 +55,9 @@ static void timer_callback(grpc_exec_ctx* exec_ctx, void* arg, if (error != GRPC_ERROR_CANCELLED) { grpc_call_element_signal_error( exec_ctx, elem, - grpc_error_set_int(GRPC_ERROR_CREATE("Deadline Exceeded"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_DEADLINE_EXCEEDED)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Deadline Exceeded"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_DEADLINE_EXCEEDED)); } GRPC_CALL_STACK_UNREF(exec_ctx, deadline_state->call_stack, "deadline_timer"); } diff --git a/src/core/lib/channel/handshaker.c b/src/core/lib/channel/handshaker.c index 1b4240bb10f..5861fa6f54c 100644 --- a/src/core/lib/channel/handshaker.c +++ b/src/core/lib/channel/handshaker.c @@ -236,8 +236,9 @@ static void call_next_handshaker(grpc_exec_ctx* exec_ctx, void* arg, static void on_timeout(grpc_exec_ctx* exec_ctx, void* arg, grpc_error* error) { grpc_handshake_manager* mgr = arg; if (error == GRPC_ERROR_NONE) { // Timer fired, rather than being cancelled. - grpc_handshake_manager_shutdown(exec_ctx, mgr, - GRPC_ERROR_CREATE("Handshake timed out")); + grpc_handshake_manager_shutdown( + exec_ctx, mgr, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshake timed out")); } grpc_handshake_manager_unref(exec_ctx, mgr); } diff --git a/src/core/lib/channel/http_client_filter.c b/src/core/lib/channel/http_client_filter.c index 58d99e6e996..8b181e57a41 100644 --- a/src/core/lib/channel/http_client_filter.c +++ b/src/core/lib/channel/http_client_filter.c @@ -108,7 +108,7 @@ static grpc_error *client_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, grpc_error *e = grpc_error_set_str( grpc_error_set_int( grpc_error_set_str( - GRPC_ERROR_CREATE( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Received http2 :status header with non-200 OK status"), GRPC_ERROR_STR_VALUE, grpc_slice_from_copied_string(val)), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_CANCELLED), diff --git a/src/core/lib/channel/http_server_filter.c b/src/core/lib/channel/http_server_filter.c index 437436b43e6..910ba965363 100644 --- a/src/core/lib/channel/http_server_filter.c +++ b/src/core/lib/channel/http_server_filter.c @@ -101,7 +101,7 @@ static void add_error(const char *error_name, grpc_error **cumulative, grpc_error *new) { if (new == GRPC_ERROR_NONE) return; if (*cumulative == GRPC_ERROR_NONE) { - *cumulative = GRPC_ERROR_CREATE(error_name); + *cumulative = GRPC_ERROR_CREATE_FROM_STATIC_STRING(error_name); } *cumulative = grpc_error_add_child(*cumulative, new); } @@ -125,27 +125,32 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, *calld->recv_cacheable_request = true; } else { add_error(error_name, &error, - grpc_attach_md_to_error(GRPC_ERROR_CREATE("Bad header"), - b->idx.named.method->md)); + grpc_attach_md_to_error( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"), + b->idx.named.method->md)); } grpc_metadata_batch_remove(exec_ctx, b, b->idx.named.method); } else { - add_error(error_name, &error, - grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":method"))); + add_error( + error_name, &error, + grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"), + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":method"))); } if (b->idx.named.te != NULL) { if (!grpc_mdelem_eq(b->idx.named.te->md, GRPC_MDELEM_TE_TRAILERS)) { add_error(error_name, &error, - grpc_attach_md_to_error(GRPC_ERROR_CREATE("Bad header"), - b->idx.named.te->md)); + grpc_attach_md_to_error( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"), + b->idx.named.te->md)); } grpc_metadata_batch_remove(exec_ctx, b, b->idx.named.te); } else { add_error(error_name, &error, - grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te"))); + grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"), + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te"))); } if (b->idx.named.scheme != NULL) { @@ -153,14 +158,17 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, !grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_HTTPS) && !grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_GRPC)) { add_error(error_name, &error, - grpc_attach_md_to_error(GRPC_ERROR_CREATE("Bad header"), - b->idx.named.scheme->md)); + grpc_attach_md_to_error( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"), + b->idx.named.scheme->md)); } grpc_metadata_batch_remove(exec_ctx, b, b->idx.named.scheme); } else { - add_error(error_name, &error, - grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":scheme"))); + add_error( + error_name, &error, + grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"), + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":scheme"))); } if (b->idx.named.content_type != NULL) { @@ -194,8 +202,9 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, if (b->idx.named.path == NULL) { add_error(error_name, &error, - grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path"))); + grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"), + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path"))); } if (b->idx.named.host != NULL && b->idx.named.authority == NULL) { @@ -212,9 +221,11 @@ static grpc_error *server_filter_incoming_metadata(grpc_exec_ctx *exec_ctx, } if (b->idx.named.authority == NULL) { - add_error(error_name, &error, - grpc_error_set_str(GRPC_ERROR_CREATE("Missing header"), - GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":authority"))); + add_error( + error_name, &error, + grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"), + GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":authority"))); } if (b->idx.named.grpc_payload_bin != NULL) { diff --git a/src/core/lib/channel/message_size_filter.c b/src/core/lib/channel/message_size_filter.c index b424c0d2acb..e52c9f63736 100644 --- a/src/core/lib/channel/message_size_filter.c +++ b/src/core/lib/channel/message_size_filter.c @@ -121,8 +121,8 @@ static void recv_message_ready(grpc_exec_ctx* exec_ctx, void* user_data, "Received message larger than max (%u vs. %d)", (*calld->recv_message)->length, calld->max_recv_size); grpc_error* new_error = grpc_error_set_int( - GRPC_ERROR_CREATE(message_string), GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_INVALID_ARGUMENT); + GRPC_ERROR_CREATE_FROM_COPIED_STRING(message_string), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INVALID_ARGUMENT); if (error == GRPC_ERROR_NONE) { error = new_error; } else { @@ -147,9 +147,10 @@ static void start_transport_stream_op(grpc_exec_ctx* exec_ctx, gpr_asprintf(&message_string, "Sent message larger than max (%u vs. %d)", op->send_message->length, calld->max_send_size); grpc_transport_stream_op_finish_with_failure( - exec_ctx, op, grpc_error_set_int(GRPC_ERROR_CREATE(message_string), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_INVALID_ARGUMENT)); + exec_ctx, op, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(message_string), + GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_INVALID_ARGUMENT)); gpr_free(message_string); return; } diff --git a/src/core/lib/http/httpcli.c b/src/core/lib/http/httpcli.c index a541c0c6c99..453a64b0495 100644 --- a/src/core/lib/http/httpcli.c +++ b/src/core/lib/http/httpcli.c @@ -126,13 +126,15 @@ static void finish(grpc_exec_ctx *exec_ctx, internal_request *req, static void append_error(internal_request *req, grpc_error *error) { if (req->overall_error == GRPC_ERROR_NONE) { - req->overall_error = GRPC_ERROR_CREATE("Failed HTTP/1 client request"); + req->overall_error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed HTTP/1 client request"); } grpc_resolved_address *addr = &req->addresses->addrs[req->next_address - 1]; char *addr_text = grpc_sockaddr_to_uri(addr); req->overall_error = grpc_error_add_child( req->overall_error, - grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(addr_text))); + grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(addr_text))); gpr_free(addr_text); } @@ -190,8 +192,8 @@ static void on_handshake_done(grpc_exec_ctx *exec_ctx, void *arg, internal_request *req = arg; if (!ep) { - next_address(exec_ctx, req, - GRPC_ERROR_CREATE("Unexplained handshake failure")); + next_address(exec_ctx, req, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Unexplained handshake failure")); return; } @@ -221,8 +223,8 @@ static void next_address(grpc_exec_ctx *exec_ctx, internal_request *req, } if (req->next_address == req->addresses->naddrs) { finish(exec_ctx, req, - GRPC_ERROR_CREATE_REFERENCING("Failed HTTP requests to all targets", - &req->overall_error, 1)); + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Failed HTTP requests to all targets", &req->overall_error, 1)); return; } addr = &req->addresses->addrs[req->next_address++]; diff --git a/src/core/lib/http/httpcli_security_connector.c b/src/core/lib/http/httpcli_security_connector.c index 354d2f4a095..be6a6d618a1 100644 --- a/src/core/lib/http/httpcli_security_connector.c +++ b/src/core/lib/http/httpcli_security_connector.c @@ -95,7 +95,7 @@ static void httpcli_ssl_check_peer(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "Peer name %s is not in peer certificate", c->secure_peer_name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); } grpc_closure_sched(exec_ctx, on_peer_checked, error); diff --git a/src/core/lib/http/parser.c b/src/core/lib/http/parser.c index b9c56c103c7..aac506b800d 100644 --- a/src/core/lib/http/parser.c +++ b/src/core/lib/http/parser.c @@ -54,26 +54,36 @@ static grpc_error *handle_response_line(grpc_http_parser *parser) { uint8_t *cur = beg; uint8_t *end = beg + parser->cur_line_length; - if (cur == end || *cur++ != 'H') return GRPC_ERROR_CREATE("Expected 'H'"); - if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); - if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); - if (cur == end || *cur++ != 'P') return GRPC_ERROR_CREATE("Expected 'P'"); - if (cur == end || *cur++ != '/') return GRPC_ERROR_CREATE("Expected '/'"); - if (cur == end || *cur++ != '1') return GRPC_ERROR_CREATE("Expected '1'"); - if (cur == end || *cur++ != '.') return GRPC_ERROR_CREATE("Expected '.'"); + if (cur == end || *cur++ != 'H') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'H'"); + if (cur == end || *cur++ != 'T') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'"); + if (cur == end || *cur++ != 'T') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'"); + if (cur == end || *cur++ != 'P') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'P'"); + if (cur == end || *cur++ != '/') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '/'"); + if (cur == end || *cur++ != '1') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '1'"); + if (cur == end || *cur++ != '.') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '.'"); if (cur == end || *cur < '0' || *cur++ > '1') { - return GRPC_ERROR_CREATE("Expected HTTP/1.0 or HTTP/1.1"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Expected HTTP/1.0 or HTTP/1.1"); } - if (cur == end || *cur++ != ' ') return GRPC_ERROR_CREATE("Expected ' '"); + if (cur == end || *cur++ != ' ') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected ' '"); if (cur == end || *cur < '1' || *cur++ > '9') - return GRPC_ERROR_CREATE("Expected status code"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code"); if (cur == end || *cur < '0' || *cur++ > '9') - return GRPC_ERROR_CREATE("Expected status code"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code"); if (cur == end || *cur < '0' || *cur++ > '9') - return GRPC_ERROR_CREATE("Expected status code"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected status code"); parser->http.response->status = (cur[-3] - '0') * 100 + (cur[-2] - '0') * 10 + (cur[-1] - '0'); - if (cur == end || *cur++ != ' ') return GRPC_ERROR_CREATE("Expected ' '"); + if (cur == end || *cur++ != ' ') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected ' '"); /* we don't really care about the status code message */ @@ -89,24 +99,33 @@ static grpc_error *handle_request_line(grpc_http_parser *parser) { while (cur != end && *cur++ != ' ') ; - if (cur == end) return GRPC_ERROR_CREATE("No method on HTTP request line"); + if (cur == end) + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "No method on HTTP request line"); parser->http.request->method = buf2str(beg, (size_t)(cur - beg - 1)); beg = cur; while (cur != end && *cur++ != ' ') ; - if (cur == end) return GRPC_ERROR_CREATE("No path on HTTP request line"); + if (cur == end) + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No path on HTTP request line"); parser->http.request->path = buf2str(beg, (size_t)(cur - beg - 1)); - if (cur == end || *cur++ != 'H') return GRPC_ERROR_CREATE("Expected 'H'"); - if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); - if (cur == end || *cur++ != 'T') return GRPC_ERROR_CREATE("Expected 'T'"); - if (cur == end || *cur++ != 'P') return GRPC_ERROR_CREATE("Expected 'P'"); - if (cur == end || *cur++ != '/') return GRPC_ERROR_CREATE("Expected '/'"); + if (cur == end || *cur++ != 'H') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'H'"); + if (cur == end || *cur++ != 'T') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'"); + if (cur == end || *cur++ != 'T') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'T'"); + if (cur == end || *cur++ != 'P') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected 'P'"); + if (cur == end || *cur++ != '/') + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Expected '/'"); vers_major = (uint8_t)(*cur++ - '1' + 1); ++cur; if (cur == end) - return GRPC_ERROR_CREATE("End of line in HTTP version string"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "End of line in HTTP version string"); vers_minor = (uint8_t)(*cur++ - '1' + 1); if (vers_major == 1) { @@ -115,18 +134,19 @@ static grpc_error *handle_request_line(grpc_http_parser *parser) { } else if (vers_minor == 1) { parser->http.request->version = GRPC_HTTP_HTTP11; } else { - return GRPC_ERROR_CREATE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); } } else if (vers_major == 2) { if (vers_minor == 0) { parser->http.request->version = GRPC_HTTP_HTTP20; } else { - return GRPC_ERROR_CREATE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); } } else { - return GRPC_ERROR_CREATE("Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Expected one of HTTP/1.0, HTTP/1.1, or HTTP/2.0"); } return GRPC_ERROR_NONE; @@ -139,7 +159,8 @@ static grpc_error *handle_first_line(grpc_http_parser *parser) { case GRPC_HTTP_RESPONSE: return handle_response_line(parser); } - GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); + GPR_UNREACHABLE_CODE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")); } static grpc_error *add_header(grpc_http_parser *parser) { @@ -154,7 +175,8 @@ static grpc_error *add_header(grpc_http_parser *parser) { GPR_ASSERT(cur != end); if (*cur == ' ' || *cur == '\t') { - error = GRPC_ERROR_CREATE("Continued header lines not supported yet"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Continued header lines not supported yet"); goto done; } @@ -162,7 +184,8 @@ static grpc_error *add_header(grpc_http_parser *parser) { cur++; } if (cur == end) { - error = GRPC_ERROR_CREATE("Didn't find ':' in header string"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Didn't find ':' in header string"); goto done; } GPR_ASSERT(cur >= beg); @@ -222,7 +245,8 @@ static grpc_error *finish_line(grpc_http_parser *parser, } break; case GRPC_HTTP_BODY: - GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); + GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Should never reach here")); } parser->cur_line_length = 0; @@ -240,7 +264,8 @@ static grpc_error *addbyte_body(grpc_http_parser *parser, uint8_t byte) { body_length = &parser->http.request->body_length; body = &parser->http.request->body; } else { - GPR_UNREACHABLE_CODE(return GRPC_ERROR_CREATE("Should never reach here")); + GPR_UNREACHABLE_CODE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Should never reach here")); } if (*body_length == parser->body_capacity) { @@ -286,7 +311,8 @@ static grpc_error *addbyte(grpc_http_parser *parser, uint8_t byte, if (grpc_http1_trace) gpr_log(GPR_ERROR, "HTTP header max line length (%d) exceeded", GRPC_HTTP_PARSER_MAX_HEADER_LENGTH); - return GRPC_ERROR_CREATE("HTTP header max line length exceeded"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "HTTP header max line length exceeded"); } parser->cur_line[parser->cur_line_length] = byte; parser->cur_line_length++; @@ -347,7 +373,7 @@ grpc_error *grpc_http_parser_parse(grpc_http_parser *parser, grpc_slice slice, grpc_error *grpc_http_parser_eof(grpc_http_parser *parser) { if (parser->state != GRPC_HTTP_BODY) { - return GRPC_ERROR_CREATE("Did not finish headers"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Did not finish headers"); } return GRPC_ERROR_NONE; } diff --git a/src/core/lib/iomgr/error.c b/src/core/lib/iomgr/error.c index 0edd69edccb..20d50809804 100644 --- a/src/core/lib/iomgr/error.c +++ b/src/core/lib/iomgr/error.c @@ -349,7 +349,7 @@ static grpc_error *copy_error_and_unref(grpc_error *in) { GPR_TIMER_BEGIN("copy_error_and_unref", 0); grpc_error *out; if (grpc_error_is_special(in)) { - out = GRPC_ERROR_CREATE("unknown"); + out = GRPC_ERROR_CREATE_FROM_STATIC_STRING("unknown"); if (in == GRPC_ERROR_NONE) { internal_set_str(&out, GRPC_ERROR_STR_DESCRIPTION, grpc_slice_from_static_string("no error")); @@ -432,7 +432,8 @@ bool grpc_error_get_int(grpc_error *err, grpc_error_ints which, intptr_t *p) { return false; } -grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, grpc_slice str) { +grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, + grpc_slice str) { GPR_TIMER_BEGIN("grpc_error_set_str", 0); grpc_error *new = copy_error_and_unref(src); internal_set_str(&new, which, str); @@ -440,7 +441,8 @@ grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, grpc_slic return new; } -bool grpc_error_get_str(grpc_error *err, grpc_error_strs which, grpc_slice *str) { +bool grpc_error_get_str(grpc_error *err, grpc_error_strs which, + grpc_slice *str) { if (grpc_error_is_special(err)) { if (which == GRPC_ERROR_STR_GRPC_MESSAGE) { for (size_t i = 0; i < GPR_ARRAY_SIZE(error_status_map); i++) { @@ -498,7 +500,8 @@ static void append_str(const char *str, char **s, size_t *sz, size_t *cap) { } } -static void append_esc_str(const uint8_t *str, size_t len, char **s, size_t *sz, size_t *cap) { +static void append_esc_str(const uint8_t *str, size_t len, char **s, size_t *sz, + size_t *cap) { static const char *hex = "0123456789abcdef"; append_chr('"', s, sz, cap); for (size_t i = 0; i < len; i++, str++) { @@ -573,7 +576,8 @@ static char *fmt_str(grpc_slice slice) { char *s = NULL; size_t sz = 0; size_t cap = 0; - append_esc_str((const uint8_t*)GRPC_SLICE_START_PTR(slice), GRPC_SLICE_LENGTH(slice), &s, &sz, &cap); + append_esc_str((const uint8_t *)GRPC_SLICE_START_PTR(slice), + GRPC_SLICE_LENGTH(slice), &s, &sz, &cap); append_chr(0, &s, &sz, &cap); return s; } @@ -582,9 +586,8 @@ static void collect_strs_kvs(grpc_error *err, kv_pairs *kvs) { for (size_t which = 0; which < GRPC_ERROR_STR_MAX; ++which) { uint8_t slot = err->strs[which]; if (slot != UINT8_MAX) { - append_kv( - kvs, key_str((grpc_error_strs)which), - fmt_str(*(grpc_slice *)(err->arena + slot))); + append_kv(kvs, key_str((grpc_error_strs)which), + fmt_str(*(grpc_slice *)(err->arena + slot))); } } } @@ -664,7 +667,8 @@ static char *finish_kvs(kv_pairs *kvs) { append_chr('{', &s, &sz, &cap); for (size_t i = 0; i < kvs->num_kvs; i++) { if (i != 0) append_chr(',', &s, &sz, &cap); - append_esc_str((const uint8_t*)kvs->kvs[i].key, strlen(kvs->kvs[i].key), &s, &sz, &cap); + append_esc_str((const uint8_t *)kvs->kvs[i].key, strlen(kvs->kvs[i].key), + &s, &sz, &cap); gpr_free(kvs->kvs[i].key); append_chr(':', &s, &sz, &cap); append_str(kvs->kvs[i].value, &s, &sz, &cap); @@ -716,9 +720,13 @@ grpc_error *grpc_os_error(const char *file, int line, int err, const char *call_name) { return grpc_error_set_str( grpc_error_set_str( - grpc_error_set_int(grpc_error_create(grpc_slice_from_static_string(file), line, grpc_slice_from_static_string("OS Error"), NULL, 0), - GRPC_ERROR_INT_ERRNO, err), - GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(strerror(err))), + grpc_error_set_int( + grpc_error_create(grpc_slice_from_static_string(file), line, + grpc_slice_from_static_string("OS Error"), NULL, + 0), + GRPC_ERROR_INT_ERRNO, err), + GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(strerror(err))), GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string(call_name)); } @@ -728,8 +736,11 @@ grpc_error *grpc_wsa_error(const char *file, int line, int err, char *utf8_message = gpr_format_message(err); grpc_error *error = grpc_error_set_str( grpc_error_set_str( - grpc_error_set_int(grpc_error_create(grpc_slice_from_static_string(file), line, grpc_slice_from_static_string("OS Error"), NULL, 0), - GRPC_ERROR_INT_WSA_ERROR, err), + grpc_error_set_int( + grpc_error_create(grpc_slice_from_static_string(file), line, + grpc_slice_from_static_string("OS Error"), NULL, + 0), + GRPC_ERROR_INT_WSA_ERROR, err), GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_copied_string(utf8_message)), GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string(call_name)); gpr_free(utf8_message); diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index 063a2435f0c..605b0e14d81 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -174,22 +174,13 @@ grpc_error *grpc_error_create(grpc_slice file, int line, grpc_slice desc, grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ grpc_slice_from_copied_string(desc), NULL, 0) -// MOCKED... -#define GRPC_ERROR_CREATE(desc) \ - grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ - grpc_slice_from_copied_string(desc), NULL, 0) -#define GRPC_ERROR_CREATE_REFERENCING(desc, errs, count) \ - grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ - grpc_slice_from_copied_string(desc), errs, count) - - // Create an error that references some other errors. This function adds a // reference to each error in errs - it does not consume an existing reference -#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count) \ - grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ +#define GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING(desc, errs, count) \ + grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ grpc_slice_from_static_string(desc), errs, count) -#define GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(desc, errs, count) \ - grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ +#define GRPC_ERROR_CREATE_REFERENCING_FROM_COPIED_STRING(desc, errs, count) \ + grpc_error_create(grpc_slice_from_static_string(__FILE__), __LINE__, \ grpc_slice_from_copied_string(desc), errs, count) //#define GRPC_ERROR_REFCOUNT_DEBUG @@ -211,10 +202,12 @@ void grpc_error_unref(grpc_error *err); grpc_error *grpc_error_set_int(grpc_error *src, grpc_error_ints which, intptr_t value) GRPC_MUST_USE_RESULT; bool grpc_error_get_int(grpc_error *error, grpc_error_ints which, intptr_t *p); -grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, grpc_slice str) GRPC_MUST_USE_RESULT; +grpc_error *grpc_error_set_str(grpc_error *src, grpc_error_strs which, + grpc_slice str) GRPC_MUST_USE_RESULT; /// Returns false if the specified string is not set. /// Caller does NOT own the slice. -bool grpc_error_get_str(grpc_error *error, grpc_error_strs which, grpc_slice *s); +bool grpc_error_get_str(grpc_error *error, grpc_error_strs which, + grpc_slice *s); /// Add a child error: an error that is believed to have contributed to this /// error occurring. Allows root causing high level errors from lower level diff --git a/src/core/lib/iomgr/ev_epoll_linux.c b/src/core/lib/iomgr/ev_epoll_linux.c index 11208b9ad13..93a1e44670b 100644 --- a/src/core/lib/iomgr/ev_epoll_linux.c +++ b/src/core/lib/iomgr/ev_epoll_linux.c @@ -321,7 +321,7 @@ static bool append_error(grpc_error **composite, grpc_error *error, const char *desc) { if (error == GRPC_ERROR_NONE) return true; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE(desc); + *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc); } *composite = grpc_error_add_child(*composite, error); return false; @@ -1146,9 +1146,9 @@ static void notify_on(grpc_exec_ctx *exec_ctx, grpc_fd *fd, gpr_atm *state, schedule the closure with the shutdown error */ if ((curr & FD_SHUTDOWN_BIT) > 0) { grpc_error *shutdown_err = (grpc_error *)(curr & ~FD_SHUTDOWN_BIT); - grpc_closure_sched( - exec_ctx, closure, - GRPC_ERROR_CREATE_REFERENCING("FD Shutdown", &shutdown_err, 1)); + grpc_closure_sched(exec_ctx, closure, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "FD Shutdown", &shutdown_err, 1)); return; } @@ -1203,9 +1203,9 @@ static void set_shutdown(grpc_exec_ctx *exec_ctx, grpc_fd *fd, gpr_atm *state, notify_on to ensure that the closure it schedules 'happens-after' the set_shutdown is called on the fd */ if (gpr_atm_rel_cas(state, curr, new_state)) { - grpc_closure_sched( - exec_ctx, (grpc_closure *)curr, - GRPC_ERROR_CREATE_REFERENCING("FD Shutdown", &shutdown_err, 1)); + grpc_closure_sched(exec_ctx, (grpc_closure *)curr, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "FD Shutdown", &shutdown_err, 1)); return; } diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c index 5ddd5313e2b..582a45d988d 100644 --- a/src/core/lib/iomgr/ev_poll_posix.c +++ b/src/core/lib/iomgr/ev_poll_posix.c @@ -451,14 +451,16 @@ static grpc_error *fd_shutdown_error(grpc_fd *fd) { if (!fd->shutdown) { return GRPC_ERROR_NONE; } else { - return GRPC_ERROR_CREATE_REFERENCING("FD shutdown", &fd->shutdown_error, 1); + return GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "FD shutdown", &fd->shutdown_error, 1); } } static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure **st, grpc_closure *closure) { if (fd->shutdown) { - grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE("FD shutdown")); + grpc_closure_sched(exec_ctx, closure, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("FD shutdown")); } else if (*st == CLOSURE_NOT_READY) { /* not ready ==> switch to a waiting state by setting the closure */ *st = closure; @@ -696,7 +698,7 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) { static void kick_append_error(grpc_error **composite, grpc_error *error) { if (error == GRPC_ERROR_NONE) return; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE("Kick Failure"); + *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Kick Failure"); } *composite = grpc_error_add_child(*composite, error); } @@ -859,7 +861,7 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) { static void work_combine_error(grpc_error **composite, grpc_error *error) { if (error == GRPC_ERROR_NONE) return; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE("pollset_work"); + *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING("pollset_work"); } *composite = grpc_error_add_child(*composite, error); } diff --git a/src/core/lib/iomgr/load_file.c b/src/core/lib/iomgr/load_file.c index 78f613e5843..208f74e20cf 100644 --- a/src/core/lib/iomgr/load_file.c +++ b/src/core/lib/iomgr/load_file.c @@ -78,9 +78,12 @@ end: *output = result; if (file != NULL) fclose(file); if (error != GRPC_ERROR_NONE) { - grpc_error *error_out = grpc_error_set_str( - GRPC_ERROR_CREATE_REFERENCING("Failed to load file", &error, 1), - GRPC_ERROR_STR_FILENAME, grpc_slice_from_copied_string(filename)); // TODO(ncteisen), always static? + grpc_error *error_out = + grpc_error_set_str(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Failed to load file", &error, 1), + GRPC_ERROR_STR_FILENAME, + grpc_slice_from_copied_string( + filename)); // TODO(ncteisen), always static? GRPC_ERROR_UNREF(error); error = error_out; } diff --git a/src/core/lib/iomgr/resolve_address_posix.c b/src/core/lib/iomgr/resolve_address_posix.c index 2cc59f6ceb7..d0ede0f2d5e 100644 --- a/src/core/lib/iomgr/resolve_address_posix.c +++ b/src/core/lib/iomgr/resolve_address_posix.c @@ -73,14 +73,16 @@ static grpc_error *blocking_resolve_address_impl( /* parse name, splitting it into host and port parts */ gpr_split_host_port(name, &host, &port); if (host == NULL) { - err = grpc_error_set_str(GRPC_ERROR_CREATE("unparseable host:port"), - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); + err = grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("unparseable host:port"), + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto done; } if (port == NULL) { if (default_port == NULL) { - err = grpc_error_set_str(GRPC_ERROR_CREATE("no port in name"), - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); + err = grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("no port in name"), + GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto done; } port = gpr_strdup(default_port); @@ -112,10 +114,14 @@ static grpc_error *blocking_resolve_address_impl( if (s != 0) { err = grpc_error_set_str( grpc_error_set_str( - grpc_error_set_str(grpc_error_set_int(GRPC_ERROR_CREATE("OS Error"), - GRPC_ERROR_INT_ERRNO, s), - GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(gai_strerror(s))), - GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string("getaddrinfo")), + grpc_error_set_str( + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("OS Error"), + GRPC_ERROR_INT_ERRNO, s), + GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(gai_strerror(s))), + GRPC_ERROR_STR_SYSCALL, + grpc_slice_from_static_string("getaddrinfo")), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(name)); goto done; } diff --git a/src/core/lib/iomgr/resolve_address_uv.c b/src/core/lib/iomgr/resolve_address_uv.c index 78f232780fa..fde34e49ebc 100644 --- a/src/core/lib/iomgr/resolve_address_uv.c +++ b/src/core/lib/iomgr/resolve_address_uv.c @@ -63,9 +63,10 @@ static grpc_error *handle_addrinfo_result(int status, struct addrinfo *result, if (status != 0) { grpc_error *error; *addresses = NULL; - error = GRPC_ERROR_CREATE("getaddrinfo failed"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("getaddrinfo failed"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); return error; } (*addresses) = gpr_malloc(sizeof(grpc_resolved_addresses)); @@ -116,7 +117,7 @@ static grpc_error *try_split_host_port(const char *name, if (*host == NULL) { char *msg; gpr_asprintf(&msg, "unparseable host:port: '%s'", name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return error; } @@ -125,7 +126,7 @@ static grpc_error *try_split_host_port(const char *name, if (default_port == NULL) { char *msg; gpr_asprintf(&msg, "no port in name '%s'", name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return error; } @@ -216,8 +217,9 @@ static void resolve_address_impl(grpc_exec_ctx *exec_ctx, const char *name, if (s != 0) { *addrs = NULL; - err = GRPC_ERROR_CREATE("getaddrinfo failed"); - err = grpc_error_set_str(err, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(s))); + err = GRPC_ERROR_CREATE_FROM_STATIC_STRING("getaddrinfo failed"); + err = grpc_error_set_str(err, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(s))); grpc_closure_sched(exec_ctx, on_done, err); gpr_free(r); gpr_free(req); diff --git a/src/core/lib/iomgr/resolve_address_windows.c b/src/core/lib/iomgr/resolve_address_windows.c index 2439ce3cb79..22eca1fd3b8 100644 --- a/src/core/lib/iomgr/resolve_address_windows.c +++ b/src/core/lib/iomgr/resolve_address_windows.c @@ -78,7 +78,7 @@ static grpc_error *blocking_resolve_address_impl( if (host == NULL) { char *msg; gpr_asprintf(&msg, "unparseable host:port: '%s'", name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); goto done; } @@ -86,7 +86,7 @@ static grpc_error *blocking_resolve_address_impl( if (default_port == NULL) { char *msg; gpr_asprintf(&msg, "no port in name '%s'", name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); goto done; } diff --git a/src/core/lib/iomgr/socket_utils_common_posix.c b/src/core/lib/iomgr/socket_utils_common_posix.c index 4619dec1a0c..b69c924d4ac 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.c +++ b/src/core/lib/iomgr/socket_utils_common_posix.c @@ -90,7 +90,7 @@ grpc_error *grpc_set_socket_no_sigpipe_if_possible(int fd) { return GRPC_OS_ERROR(errno, "getsockopt(SO_NOSIGPIPE)"); } if ((newval != 0) != (val != 0)) { - return GRPC_ERROR_CREATE("Failed to set SO_NOSIGPIPE"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_NOSIGPIPE"); } #endif return GRPC_ERROR_NONE; @@ -164,7 +164,7 @@ grpc_error *grpc_set_socket_reuse_addr(int fd, int reuse) { return GRPC_OS_ERROR(errno, "getsockopt(SO_REUSEADDR)"); } if ((newval != 0) != val) { - return GRPC_ERROR_CREATE("Failed to set SO_REUSEADDR"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_REUSEADDR"); } return GRPC_ERROR_NONE; @@ -173,7 +173,8 @@ grpc_error *grpc_set_socket_reuse_addr(int fd, int reuse) { /* set a socket to reuse old addresses */ grpc_error *grpc_set_socket_reuse_port(int fd, int reuse) { #ifndef SO_REUSEPORT - return GRPC_ERROR_CREATE("SO_REUSEPORT unavailable on compiling system"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "SO_REUSEPORT unavailable on compiling system"); #else int val = (reuse != 0); int newval; @@ -185,7 +186,7 @@ grpc_error *grpc_set_socket_reuse_port(int fd, int reuse) { return GRPC_OS_ERROR(errno, "getsockopt(SO_REUSEPORT)"); } if ((newval != 0) != val) { - return GRPC_ERROR_CREATE("Failed to set SO_REUSEPORT"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set SO_REUSEPORT"); } return GRPC_ERROR_NONE; @@ -204,7 +205,7 @@ grpc_error *grpc_set_socket_low_latency(int fd, int low_latency) { return GRPC_OS_ERROR(errno, "getsockopt(TCP_NODELAY)"); } if ((newval != 0) != val) { - return GRPC_ERROR_CREATE("Failed to set TCP_NODELAY"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set TCP_NODELAY"); } return GRPC_ERROR_NONE; } @@ -213,7 +214,7 @@ grpc_error *grpc_set_socket_low_latency(int fd, int low_latency) { grpc_error *grpc_set_socket_with_mutator(int fd, grpc_socket_mutator *mutator) { GPR_ASSERT(mutator); if (!grpc_socket_mutator_mutate_fd(mutator, fd)) { - return GRPC_ERROR_CREATE("grpc_socket_mutator failed."); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("grpc_socket_mutator failed."); } return GRPC_ERROR_NONE; } @@ -268,7 +269,8 @@ static grpc_error *error_for_fd(int fd, const grpc_resolved_address *addr) { char *addr_str; grpc_sockaddr_to_string(&addr_str, addr, 0); grpc_error *err = grpc_error_set_str(GRPC_OS_ERROR(errno, "socket"), - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(addr_str)); + GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(addr_str)); gpr_free(addr_str); return err; } diff --git a/src/core/lib/iomgr/tcp_client_posix.c b/src/core/lib/iomgr/tcp_client_posix.c index a98d9a62174..a108b10da6f 100644 --- a/src/core/lib/iomgr/tcp_client_posix.c +++ b/src/core/lib/iomgr/tcp_client_posix.c @@ -121,8 +121,8 @@ static void tc_on_alarm(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) { } gpr_mu_lock(&ac->mu); if (ac->fd != NULL) { - grpc_fd_shutdown(exec_ctx, ac->fd, - GRPC_ERROR_CREATE("connect() timed out")); + grpc_fd_shutdown(exec_ctx, ac->fd, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "connect() timed out")); } done = (--ac->refs == 0); gpr_mu_unlock(&ac->mu); @@ -191,7 +191,8 @@ static void on_writable(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) { gpr_mu_lock(&ac->mu); if (error != GRPC_ERROR_NONE) { error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string("Timeout occurred")); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string("Timeout occurred")); goto finish; } @@ -255,13 +256,14 @@ finish: grpc_slice str; bool ret = grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str); GPR_ASSERT(ret); - char* desc = grpc_slice_to_c_string(str); + char *desc = grpc_slice_to_c_string(str); gpr_asprintf(&error_descr, "Failed to connect to remote host: %s", desc); - error = grpc_error_set_str(error, GRPC_ERROR_STR_DESCRIPTION, grpc_slice_from_copied_string(error_descr)); + error = grpc_error_set_str(error, GRPC_ERROR_STR_DESCRIPTION, + grpc_slice_from_copied_string(error_descr)); gpr_free(error_descr); gpr_free(desc); - error = - grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(ac->addr_str)); + error = grpc_error_set_str(error, GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(ac->addr_str)); } if (done) { gpr_mu_destroy(&ac->mu); diff --git a/src/core/lib/iomgr/tcp_client_uv.c b/src/core/lib/iomgr/tcp_client_uv.c index 9727976ec28..b632b611702 100644 --- a/src/core/lib/iomgr/tcp_client_uv.c +++ b/src/core/lib/iomgr/tcp_client_uv.c @@ -101,17 +101,21 @@ static void uv_tc_on_connect(uv_connect_t *req, int status) { *connect->endpoint = grpc_tcp_create( connect->tcp_handle, connect->resource_quota, connect->addr_name); } else { - error = GRPC_ERROR_CREATE("Failed to connect to remote host"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to connect to remote host"); error = grpc_error_set_int(error, GRPC_ERROR_INT_ERRNO, -status); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); if (status == UV_ECANCELED) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, - grpc_slice_from_static_string("Timeout occurred")); + error = + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string("Timeout occurred")); // This should only happen if the handle is already closed } else { - error = grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, - grpc_slice_from_static_string(uv_strerror(status))); + error = grpc_error_set_str( + error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); uv_close((uv_handle_t *)connect->tcp_handle, tcp_close_callback); } } diff --git a/src/core/lib/iomgr/tcp_client_windows.c b/src/core/lib/iomgr/tcp_client_windows.c index 421d39c0466..a356564766a 100644 --- a/src/core/lib/iomgr/tcp_client_windows.c +++ b/src/core/lib/iomgr/tcp_client_windows.c @@ -123,7 +123,7 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, grpc_error *error) { socket = NULL; } } else { - error = GRPC_ERROR_CREATE("socket is null"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("socket is null"); } } @@ -238,7 +238,8 @@ failure: GPR_ASSERT(error != GRPC_ERROR_NONE); char *target_uri = grpc_sockaddr_to_uri(addr); grpc_error *final_error = grpc_error_set_str( - GRPC_ERROR_CREATE_REFERENCING("Failed to connect", &error, 1), + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Failed to connect", + &error, 1), GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(target_uri)); GRPC_ERROR_UNREF(error); if (socket != NULL) { diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c index 62e1f88d60d..4d7cf3ff51e 100644 --- a/src/core/lib/iomgr/tcp_posix.c +++ b/src/core/lib/iomgr/tcp_posix.c @@ -111,7 +111,8 @@ typedef struct { static grpc_error *tcp_annotate_error(grpc_error *src_error, grpc_tcp *tcp) { return grpc_error_set_str( grpc_error_set_int(src_error, GRPC_ERROR_INT_FD, tcp->fd), - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(tcp->peer_string)); + GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(tcp->peer_string)); } static void tcp_handle_read(grpc_exec_ctx *exec_ctx, void *arg /* grpc_tcp */, @@ -246,8 +247,10 @@ static void tcp_do_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) { } else if (read_bytes == 0) { /* 0 read size ==> end of stream */ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, tcp->incoming_buffer); - call_read_cb(exec_ctx, tcp, - tcp_annotate_error(GRPC_ERROR_CREATE("Socket closed"), tcp)); + call_read_cb( + exec_ctx, tcp, + tcp_annotate_error( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Socket closed"), tcp)); TCP_UNREF(exec_ctx, tcp, "read"); } else { GPR_ASSERT((size_t)read_bytes <= tcp->incoming_buffer->length); @@ -464,10 +467,12 @@ static void tcp_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, if (buf->length == 0) { GPR_TIMER_END("tcp_write", 0); - grpc_closure_sched(exec_ctx, cb, - grpc_fd_is_shutdown(tcp->em_fd) - ? tcp_annotate_error(GRPC_ERROR_CREATE("EOF"), tcp) - : GRPC_ERROR_NONE); + grpc_closure_sched( + exec_ctx, cb, + grpc_fd_is_shutdown(tcp->em_fd) + ? tcp_annotate_error(GRPC_ERROR_CREATE_FROM_STATIC_STRING("EOF"), + tcp) + : GRPC_ERROR_NONE); return; } tcp->outgoing_buffer = buf; diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 5f286a6723c..4861752f484 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -175,8 +175,8 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx, } else { grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota); gpr_free(s); - return GRPC_ERROR_CREATE(GRPC_ARG_ALLOW_REUSEPORT - " must be an integer"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING(GRPC_ARG_ALLOW_REUSEPORT + " must be an integer"); } } else if (0 == strcmp(GRPC_ARG_RESOURCE_QUOTA, args->args[i].key)) { if (args->args[i].type == GRPC_ARG_POINTER) { @@ -186,8 +186,8 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx, } else { grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota); gpr_free(s); - return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA - " must be a pointer to a buffer pool"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + GRPC_ARG_RESOURCE_QUOTA " must be a pointer to a buffer pool"); } } else if (0 == strcmp(GRPC_ARG_EXPAND_WILDCARD_ADDRS, args->args[i].key)) { if (args->args[i].type == GRPC_ARG_INTEGER) { @@ -195,8 +195,8 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx, } else { grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota); gpr_free(s); - return GRPC_ERROR_CREATE(GRPC_ARG_EXPAND_WILDCARD_ADDRS - " must be an integer"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + GRPC_ARG_EXPAND_WILDCARD_ADDRS " must be an integer"); } } } @@ -291,8 +291,8 @@ static void tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { if (s->active_ports) { grpc_tcp_listener *sp; for (sp = s->head; sp; sp = sp->next) { - grpc_fd_shutdown(exec_ctx, sp->emfd, - GRPC_ERROR_CREATE("Server destroyed")); + grpc_fd_shutdown(exec_ctx, sp->emfd, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Server destroyed")); } gpr_mu_unlock(&s->mu); } else { @@ -387,9 +387,10 @@ error: if (fd >= 0) { close(fd); } - grpc_error *ret = grpc_error_set_int( - GRPC_ERROR_CREATE_REFERENCING("Unable to configure socket", &err, 1), - GRPC_ERROR_INT_FD, fd); + grpc_error *ret = + grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Unable to configure socket", &err, 1), + GRPC_ERROR_INT_FD, fd); GRPC_ERROR_UNREF(err); return ret; } @@ -569,7 +570,8 @@ static grpc_error *get_unused_port(int *port) { } close(fd); *port = grpc_sockaddr_get_port(&wild); - return *port <= 0 ? GRPC_ERROR_CREATE("Bad port") : GRPC_ERROR_NONE; + return *port <= 0 ? GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad port") + : GRPC_ERROR_NONE; } /* Return the listener in s with address addr or NULL. */ @@ -611,7 +613,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, if ((err = get_unused_port(&requested_port)) != GRPC_ERROR_NONE) { return err; } else if (requested_port <= 0) { - return GRPC_ERROR_CREATE("Bad get_unused_port()"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad get_unused_port()"); } gpr_log(GPR_DEBUG, "Picked unused port %d", requested_port); } @@ -636,7 +638,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, memcpy(addr.addr, ifa_it->ifa_addr, addr.len); if (!grpc_sockaddr_set_port(&addr, requested_port)) { /* Should never happen, because we check sa_family above. */ - err = GRPC_ERROR_CREATE("Failed to set port"); + err = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to set port"); break; } if (grpc_sockaddr_to_string(&addr_str, &addr, 0) < 0) { @@ -660,7 +662,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, if (gpr_asprintf(&err_str, "Failed to add listener: %s", addr_str) < 0) { err_str = gpr_strdup("Failed to add listener"); } - root_err = GRPC_ERROR_CREATE(err_str); + root_err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_str); gpr_free(err_str); gpr_free(addr_str); err = grpc_error_add_child(root_err, err); @@ -680,7 +682,7 @@ static grpc_error *add_all_local_addrs_to_server(grpc_tcp_server *s, if (err != GRPC_ERROR_NONE) { return err; } else if (sp == NULL) { - return GRPC_ERROR_CREATE("No local addresses"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No local addresses"); } else { *out_port = sp->port; return GRPC_ERROR_NONE; @@ -730,8 +732,8 @@ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, GRPC_LOG_IF_ERROR("Failed to add 0.0.0.0 listener", v4_err); return GRPC_ERROR_NONE; } else { - grpc_error *root_err = - GRPC_ERROR_CREATE("Failed to add any wildcard listeners"); + grpc_error *root_err = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to add any wildcard listeners"); GPR_ASSERT(v6_err != GRPC_ERROR_NONE && v4_err != GRPC_ERROR_NONE); root_err = grpc_error_add_child(root_err, v6_err); root_err = grpc_error_add_child(root_err, v4_err); @@ -951,7 +953,7 @@ void grpc_tcp_server_shutdown_listeners(grpc_exec_ctx *exec_ctx, grpc_tcp_listener *sp; for (sp = s->head; sp; sp = sp->next) { grpc_fd_shutdown(exec_ctx, sp->emfd, - GRPC_ERROR_CREATE("Server shutdown")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown")); } } gpr_mu_unlock(&s->mu); diff --git a/src/core/lib/iomgr/tcp_server_uv.c b/src/core/lib/iomgr/tcp_server_uv.c index 1e64b8e834f..e9246948f5b 100644 --- a/src/core/lib/iomgr/tcp_server_uv.c +++ b/src/core/lib/iomgr/tcp_server_uv.c @@ -95,8 +95,8 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx, } else { grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota); gpr_free(s); - return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA - " must be a pointer to a buffer pool"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + GRPC_ARG_RESOURCE_QUOTA " must be a pointer to a buffer pool"); } } } @@ -244,17 +244,19 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle, // The last argument to uv_tcp_bind is flags status = uv_tcp_bind(handle, (struct sockaddr *)addr->addr, 0); if (status != 0) { - error = GRPC_ERROR_CREATE("Failed to bind to port"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to bind to port"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); return error; } status = uv_listen((uv_stream_t *)handle, SOMAXCONN, on_connect); if (status != 0) { - error = GRPC_ERROR_CREATE("Failed to listen to port"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to listen to port"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); return error; } @@ -262,9 +264,10 @@ static grpc_error *add_socket_to_server(grpc_tcp_server *s, uv_tcp_t *handle, status = uv_tcp_getsockname(handle, (struct sockaddr *)&sockname_temp.addr, (int *)&sockname_temp.len); if (status != 0) { - error = GRPC_ERROR_CREATE("getsockname failed"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("getsockname failed"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); return error; } @@ -346,15 +349,17 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, if (status == 0) { error = add_socket_to_server(s, handle, addr, port_index, &sp); } else { - error = GRPC_ERROR_CREATE("Failed to initialize UV tcp handle"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to initialize UV tcp handle"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); } gpr_free(allocated_addr); if (error != GRPC_ERROR_NONE) { - grpc_error *error_out = GRPC_ERROR_CREATE_REFERENCING( + grpc_error *error_out = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Failed to add port to server", &error, 1); GRPC_ERROR_UNREF(error); error = error_out; diff --git a/src/core/lib/iomgr/tcp_server_windows.c b/src/core/lib/iomgr/tcp_server_windows.c index 94d7a0445fd..12ce7d3fdd5 100644 --- a/src/core/lib/iomgr/tcp_server_windows.c +++ b/src/core/lib/iomgr/tcp_server_windows.c @@ -122,8 +122,8 @@ grpc_error *grpc_tcp_server_create(grpc_exec_ctx *exec_ctx, } else { grpc_resource_quota_unref_internal(exec_ctx, s->resource_quota); gpr_free(s); - return GRPC_ERROR_CREATE(GRPC_ARG_RESOURCE_QUOTA - " must be a pointer to a buffer pool"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + GRPC_ARG_RESOURCE_QUOTA " must be a pointer to a buffer pool"); } } } @@ -248,9 +248,10 @@ failure: GPR_ASSERT(error != GRPC_ERROR_NONE); char *tgtaddr = grpc_sockaddr_to_uri(addr); grpc_error_set_int( - grpc_error_set_str(GRPC_ERROR_CREATE_REFERENCING( + grpc_error_set_str(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Failed to prepare server socket", &error, 1), - GRPC_ERROR_STR_TARGET_ADDRESS, grpc_slice_from_copied_string(tgtaddr)), + GRPC_ERROR_STR_TARGET_ADDRESS, + grpc_slice_from_copied_string(tgtaddr)), GRPC_ERROR_INT_FD, (intptr_t)sock); gpr_free(tgtaddr); GRPC_ERROR_UNREF(error); @@ -533,7 +534,7 @@ done: gpr_free(allocated_addr); if (error != GRPC_ERROR_NONE) { - grpc_error *error_out = GRPC_ERROR_CREATE_REFERENCING( + grpc_error *error_out = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Failed to add port to server", &error, 1); GRPC_ERROR_UNREF(error); error = error_out; diff --git a/src/core/lib/iomgr/tcp_uv.c b/src/core/lib/iomgr/tcp_uv.c index 0b12d8f800b..8e8db9f7b45 100644 --- a/src/core/lib/iomgr/tcp_uv.c +++ b/src/core/lib/iomgr/tcp_uv.c @@ -152,7 +152,7 @@ static void read_callback(uv_stream_t *stream, ssize_t nread, // TODO(murgatroid99): figure out what the return value here means uv_read_stop(stream); if (nread == UV_EOF) { - error = GRPC_ERROR_CREATE("EOF"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("EOF"); } else if (nread > 0) { // Successful read sub = grpc_slice_sub_no_ref(tcp->read_slice, 0, (size_t)nread); @@ -173,7 +173,7 @@ static void read_callback(uv_stream_t *stream, ssize_t nread, } } else { // nread < 0: Error - error = GRPC_ERROR_CREATE("TCP Read failed"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed"); } grpc_closure_sched(&exec_ctx, cb, error); grpc_exec_ctx_finish(&exec_ctx); @@ -193,9 +193,10 @@ static void uv_endpoint_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, status = uv_read_start((uv_stream_t *)tcp->handle, alloc_uv_buf, read_callback); if (status != 0) { - error = GRPC_ERROR_CREATE("TCP Read failed at start"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Read failed at start"); error = - grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, grpc_slice_from_static_string(uv_strerror(status))); + grpc_error_set_str(error, GRPC_ERROR_STR_OS_ERROR, + grpc_slice_from_static_string(uv_strerror(status))); grpc_closure_sched(exec_ctx, cb, error); } if (grpc_tcp_trace) { @@ -214,7 +215,7 @@ static void write_callback(uv_write_t *req, int status) { if (status == 0) { error = GRPC_ERROR_NONE; } else { - error = GRPC_ERROR_CREATE("TCP Write failed"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("TCP Write failed"); } if (grpc_tcp_trace) { const char *str = grpc_error_string(error); @@ -249,8 +250,8 @@ static void uv_endpoint_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, } if (tcp->shutting_down) { - grpc_closure_sched(exec_ctx, cb, - GRPC_ERROR_CREATE("TCP socket is shutting down")); + grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "TCP socket is shutting down")); return; } diff --git a/src/core/lib/iomgr/tcp_windows.c b/src/core/lib/iomgr/tcp_windows.c index 6c413971e33..91348832268 100644 --- a/src/core/lib/iomgr/tcp_windows.c +++ b/src/core/lib/iomgr/tcp_windows.c @@ -175,7 +175,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *tcpp, grpc_error *error) { if (error == GRPC_ERROR_NONE) { if (info->wsa_error != 0 && !tcp->shutting_down) { char *utf8_message = gpr_format_message(info->wsa_error); - error = GRPC_ERROR_CREATE(utf8_message); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(utf8_message); gpr_free(utf8_message); grpc_slice_unref_internal(exec_ctx, tcp->read_slice); } else { @@ -185,9 +185,9 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *tcpp, grpc_error *error) { } else { grpc_slice_unref_internal(exec_ctx, tcp->read_slice); error = tcp->shutting_down - ? GRPC_ERROR_CREATE_REFERENCING("TCP stream shutting down", - &tcp->shutdown_error, 1) - : GRPC_ERROR_CREATE("End of TCP stream"); + ? GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "TCP stream shutting down", &tcp->shutdown_error, 1) + : GRPC_ERROR_CREATE_FROM_STATIC_STRING("End of TCP stream"); } } } @@ -208,9 +208,10 @@ static void win_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, WSABUF buffer; if (tcp->shutting_down) { - grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_CREATE_REFERENCING( - "TCP socket is shutting down", - &tcp->shutdown_error, 1)); + grpc_closure_sched( + exec_ctx, cb, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "TCP socket is shutting down", &tcp->shutdown_error, 1)); return; } @@ -297,9 +298,10 @@ static void win_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, size_t len; if (tcp->shutting_down) { - grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_CREATE_REFERENCING( - "TCP socket is shutting down", - &tcp->shutdown_error, 1)); + grpc_closure_sched( + exec_ctx, cb, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "TCP socket is shutting down", &tcp->shutdown_error, 1)); return; } diff --git a/src/core/lib/iomgr/timer_generic.c b/src/core/lib/iomgr/timer_generic.c index d4df96c214d..e53c8019299 100644 --- a/src/core/lib/iomgr/timer_generic.c +++ b/src/core/lib/iomgr/timer_generic.c @@ -109,8 +109,9 @@ void grpc_timer_list_init(gpr_timespec now) { void grpc_timer_list_shutdown(grpc_exec_ctx *exec_ctx) { int i; - run_some_expired_timers(exec_ctx, gpr_inf_future(g_clock_type), NULL, - GRPC_ERROR_CREATE("Timer list shutdown")); + run_some_expired_timers( + exec_ctx, gpr_inf_future(g_clock_type), NULL, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Timer list shutdown")); for (i = 0; i < NUM_SHARDS; i++) { shard_type *shard = &g_shards[i]; gpr_mu_destroy(&shard->mu); @@ -182,9 +183,9 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer, if (!g_initialized) { timer->pending = false; - grpc_closure_sched( - exec_ctx, timer->closure, - GRPC_ERROR_CREATE("Attempt to create timer before initialization")); + grpc_closure_sched(exec_ctx, timer->closure, + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Attempt to create timer before initialization")); return; } @@ -376,7 +377,7 @@ bool grpc_timer_check(grpc_exec_ctx *exec_ctx, gpr_timespec now, exec_ctx, now, next, gpr_time_cmp(now, gpr_inf_future(now.clock_type)) != 0 ? GRPC_ERROR_NONE - : GRPC_ERROR_CREATE("Shutting down timer system")); + : GRPC_ERROR_CREATE_FROM_STATIC_STRING("Shutting down timer system")); } #endif /* GRPC_TIMER_USE_GENERIC */ diff --git a/src/core/lib/iomgr/udp_server.c b/src/core/lib/iomgr/udp_server.c index d1bcd89af1f..c833d868665 100644 --- a/src/core/lib/iomgr/udp_server.c +++ b/src/core/lib/iomgr/udp_server.c @@ -205,8 +205,8 @@ void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *s, for (sp = s->head; sp; sp = sp->next) { GPR_ASSERT(sp->orphan_cb); sp->orphan_cb(exec_ctx, sp->emfd); - grpc_fd_shutdown(exec_ctx, sp->emfd, - GRPC_ERROR_CREATE("Server destroyed")); + grpc_fd_shutdown(exec_ctx, sp->emfd, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Server destroyed")); } gpr_mu_unlock(&s->mu); } else { diff --git a/src/core/lib/iomgr/unix_sockets_posix.c b/src/core/lib/iomgr/unix_sockets_posix.c index 1233cec04e5..281865aecee 100644 --- a/src/core/lib/iomgr/unix_sockets_posix.c +++ b/src/core/lib/iomgr/unix_sockets_posix.c @@ -60,7 +60,7 @@ grpc_error *grpc_resolve_unix_domain_address(const char *name, gpr_asprintf(&err_msg, "Path name should not have more than %" PRIuPTR " characters.", GPR_ARRAY_SIZE(un->sun_path) - 1); - err = GRPC_ERROR_CREATE(err_msg); + err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_msg); gpr_free(err_msg); return err; } diff --git a/src/core/lib/iomgr/unix_sockets_posix_noop.c b/src/core/lib/iomgr/unix_sockets_posix_noop.c index 1daf5152c17..b9602cbf8b2 100644 --- a/src/core/lib/iomgr/unix_sockets_posix_noop.c +++ b/src/core/lib/iomgr/unix_sockets_posix_noop.c @@ -47,7 +47,8 @@ void grpc_create_socketpair_if_unix(int sv[2]) { grpc_error *grpc_resolve_unix_domain_address( const char *name, grpc_resolved_addresses **addresses) { *addresses = NULL; - return GRPC_ERROR_CREATE("Unix domain sockets are not supported on Windows"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Unix domain sockets are not supported on Windows"); } int grpc_is_unix_socket(const grpc_resolved_address *addr) { return false; } diff --git a/src/core/lib/security/credentials/google_default/google_default_credentials.c b/src/core/lib/security/credentials/google_default/google_default_credentials.c index f09e64c5641..97501e6788c 100644 --- a/src/core/lib/security/credentials/google_default/google_default_credentials.c +++ b/src/core/lib/security/credentials/google_default/google_default_credentials.c @@ -180,7 +180,7 @@ static grpc_error *create_default_creds_from_path( grpc_slice creds_data = grpc_empty_slice(); grpc_error *error = GRPC_ERROR_NONE; if (creds_path == NULL) { - error = GRPC_ERROR_CREATE("creds_path unset"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("creds_path unset"); goto end; } error = grpc_load_file(creds_path, 0, &creds_data); @@ -190,8 +190,9 @@ static grpc_error *create_default_creds_from_path( json = grpc_json_parse_string_with_len( (char *)GRPC_SLICE_START_PTR(creds_data), GRPC_SLICE_LENGTH(creds_data)); if (json == NULL) { - error = grpc_error_set_str(GRPC_ERROR_CREATE("Failed to parse JSON"), - GRPC_ERROR_STR_RAW_BYTES, grpc_slice_ref_internal(creds_data)); + error = grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Failed to parse JSON"), + GRPC_ERROR_STR_RAW_BYTES, grpc_slice_ref_internal(creds_data)); goto end; } @@ -202,7 +203,7 @@ static grpc_error *create_default_creds_from_path( grpc_service_account_jwt_access_credentials_create_from_auth_json_key( exec_ctx, key, grpc_max_auth_token_lifetime()); if (result == NULL) { - error = GRPC_ERROR_CREATE( + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "grpc_service_account_jwt_access_credentials_create_from_auth_json_" "key failed"); } @@ -215,7 +216,7 @@ static grpc_error *create_default_creds_from_path( result = grpc_refresh_token_credentials_create_from_auth_refresh_token(token); if (result == NULL) { - error = GRPC_ERROR_CREATE( + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( "grpc_refresh_token_credentials_create_from_auth_refresh_token " "failed"); } @@ -234,7 +235,8 @@ end: grpc_channel_credentials *grpc_google_default_credentials_create(void) { grpc_channel_credentials *result = NULL; grpc_call_credentials *call_creds = NULL; - grpc_error *error = GRPC_ERROR_CREATE("Failed to create Google credentials"); + grpc_error *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to create Google credentials"); grpc_error *err; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; @@ -272,7 +274,8 @@ grpc_channel_credentials *grpc_google_default_credentials_create(void) { call_creds = grpc_google_compute_engine_credentials_create(NULL); if (call_creds == NULL) { error = grpc_error_add_child( - error, GRPC_ERROR_CREATE("Failed to get credentials from network")); + error, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to get credentials from network")); } } } diff --git a/src/core/lib/security/transport/client_auth_filter.c b/src/core/lib/security/transport/client_auth_filter.c index a23082a8667..44c16f9dbd1 100644 --- a/src/core/lib/security/transport/client_auth_filter.c +++ b/src/core/lib/security/transport/client_auth_filter.c @@ -95,7 +95,8 @@ static void reset_auth_metadata_context( static void add_error(grpc_error **combined, grpc_error *error) { if (error == GRPC_ERROR_NONE) return; if (*combined == GRPC_ERROR_NONE) { - *combined = GRPC_ERROR_CREATE("Client auth metadata plugin error"); + *combined = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Client auth metadata plugin error"); } *combined = grpc_error_add_child(*combined, error); } @@ -114,9 +115,10 @@ static void on_credentials_metadata(grpc_exec_ctx *exec_ctx, void *user_data, grpc_error *error = GRPC_ERROR_NONE; if (status != GRPC_CREDENTIALS_OK) { error = grpc_error_set_int( - GRPC_ERROR_CREATE(error_details != NULL && strlen(error_details) > 0 - ? error_details - : "Credentials failed to get metadata."), + GRPC_ERROR_CREATE_FROM_COPIED_STRING( + error_details != NULL && strlen(error_details) > 0 + ? error_details + : "Credentials failed to get metadata."), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAUTHENTICATED); } else { GPR_ASSERT(num_md <= MAX_CREDENTIALS_METADATA_COUNT); @@ -192,7 +194,7 @@ static void send_security_metadata(grpc_exec_ctx *exec_ctx, grpc_transport_stream_op_finish_with_failure( exec_ctx, op, grpc_error_set_int( - GRPC_ERROR_CREATE( + GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Incompatible credentials set on channel and call."), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAUTHENTICATED)); return; @@ -225,9 +227,10 @@ static void on_host_checked(grpc_exec_ctx *exec_ctx, void *user_data, host); gpr_free(host); grpc_call_element_signal_error( - exec_ctx, elem, grpc_error_set_int(GRPC_ERROR_CREATE(error_msg), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNAUTHENTICATED)); + exec_ctx, elem, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_msg), + GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_UNAUTHENTICATED)); gpr_free(error_msg); } } diff --git a/src/core/lib/security/transport/secure_endpoint.c b/src/core/lib/security/transport/secure_endpoint.c index 7d58843d690..568d70fa38a 100644 --- a/src/core/lib/security/transport/secure_endpoint.c +++ b/src/core/lib/security/transport/secure_endpoint.c @@ -162,7 +162,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *user_data, if (error != GRPC_ERROR_NONE) { grpc_slice_buffer_reset_and_unref_internal(exec_ctx, ep->read_buffer); - call_read_cb(exec_ctx, ep, GRPC_ERROR_CREATE_REFERENCING( + call_read_cb(exec_ctx, ep, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Secure read failed", &error, 1)); return; } @@ -220,8 +220,10 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *user_data, if (result != TSI_OK) { grpc_slice_buffer_reset_and_unref_internal(exec_ctx, ep->read_buffer); - call_read_cb(exec_ctx, ep, grpc_set_tsi_error_result( - GRPC_ERROR_CREATE("Unwrap failed"), result)); + call_read_cb( + exec_ctx, ep, + grpc_set_tsi_error_result( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unwrap failed"), result)); return; } @@ -332,7 +334,8 @@ static void endpoint_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *secure_ep, grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &ep->output_buffer); grpc_closure_sched( exec_ctx, cb, - grpc_set_tsi_error_result(GRPC_ERROR_CREATE("Wrap failed"), result)); + grpc_set_tsi_error_result( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Wrap failed"), result)); GPR_TIMER_END("secure_endpoint.endpoint_write", 0); return; } diff --git a/src/core/lib/security/transport/security_connector.c b/src/core/lib/security/transport/security_connector.c index ad083a730fb..b0cbc83639c 100644 --- a/src/core/lib/security/transport/security_connector.c +++ b/src/core/lib/security/transport/security_connector.c @@ -137,9 +137,9 @@ void grpc_security_connector_check_peer(grpc_exec_ctx *exec_ctx, grpc_auth_context **auth_context, grpc_closure *on_peer_checked) { if (sc == NULL) { - grpc_closure_sched( - exec_ctx, on_peer_checked, - GRPC_ERROR_CREATE("cannot check peer -- no security connector")); + grpc_closure_sched(exec_ctx, on_peer_checked, + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "cannot check peer -- no security connector")); tsi_peer_destruct(&peer); } else { sc->vtable->check_peer(exec_ctx, sc, peer, auth_context, on_peer_checked); @@ -330,7 +330,8 @@ static void fake_check_peer(grpc_exec_ctx *exec_ctx, grpc_error *error = GRPC_ERROR_NONE; *auth_context = NULL; if (peer.property_count != 1) { - error = GRPC_ERROR_CREATE("Fake peers should only have 1 property."); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Fake peers should only have 1 property."); goto end; } prop_name = peer.properties[0].name; @@ -339,13 +340,14 @@ static void fake_check_peer(grpc_exec_ctx *exec_ctx, char *msg; gpr_asprintf(&msg, "Unexpected property in fake peer: %s.", prop_name == NULL ? "" : prop_name); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); goto end; } if (strncmp(peer.properties[0].value.data, TSI_FAKE_CERTIFICATE_TYPE, peer.properties[0].value.length)) { - error = GRPC_ERROR_CREATE("Invalid value for cert type property."); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Invalid value for cert type property."); goto end; } *auth_context = grpc_auth_context_create(NULL); @@ -586,18 +588,19 @@ static grpc_error *ssl_check_peer(grpc_security_connector *sc, const tsi_peer_property *p = tsi_peer_get_property_by_name(peer, TSI_SSL_ALPN_SELECTED_PROTOCOL); if (p == NULL) { - return GRPC_ERROR_CREATE( + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( "Cannot check peer: missing selected ALPN property."); } if (!grpc_chttp2_is_alpn_version_supported(p->value.data, p->value.length)) { - return GRPC_ERROR_CREATE("Cannot check peer: invalid ALPN value."); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Cannot check peer: invalid ALPN value."); } /* Check the peer name if specified. */ if (peer_name != NULL && !ssl_host_matches_name(peer, peer_name)) { char *msg; gpr_asprintf(&msg, "Peer name %s is not in peer certificate", peer_name); - grpc_error *error = GRPC_ERROR_CREATE(msg); + grpc_error *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); return error; } diff --git a/src/core/lib/security/transport/security_handshaker.c b/src/core/lib/security/transport/security_handshaker.c index 7065d261ba2..2f393276707 100644 --- a/src/core/lib/security/transport/security_handshaker.c +++ b/src/core/lib/security/transport/security_handshaker.c @@ -120,7 +120,7 @@ static void security_handshake_failed_locked(grpc_exec_ctx *exec_ctx, if (error == GRPC_ERROR_NONE) { // If we were shut down after the handshake succeeded but before an // endpoint callback was invoked, we need to generate our own error. - error = GRPC_ERROR_CREATE("Handshaker shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshaker shutdown"); } const char *msg = grpc_error_string(error); gpr_log(GPR_DEBUG, "Security handshake failed: %s", msg); @@ -156,7 +156,8 @@ static void on_peer_checked(grpc_exec_ctx *exec_ctx, void *arg, tsi_handshaker_create_frame_protector(h->handshaker, NULL, &protector); if (result != TSI_OK) { error = grpc_set_tsi_error_result( - GRPC_ERROR_CREATE("Frame protector creation failed"), result); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Frame protector creation failed"), + result); security_handshake_failed_locked(exec_ctx, h, error); goto done; } @@ -191,7 +192,7 @@ static grpc_error *check_peer_locked(grpc_exec_ctx *exec_ctx, tsi_result result = tsi_handshaker_extract_peer(h->handshaker, &peer); if (result != TSI_OK) { return grpc_set_tsi_error_result( - GRPC_ERROR_CREATE("Peer extraction failed"), result); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Peer extraction failed"), result); } grpc_security_connector_check_peer(exec_ctx, h->connector, peer, &h->auth_context, &h->on_peer_checked); @@ -215,8 +216,8 @@ static grpc_error *send_handshake_bytes_to_peer_locked(grpc_exec_ctx *exec_ctx, } } while (result == TSI_INCOMPLETE_DATA); if (result != TSI_OK) { - return grpc_set_tsi_error_result(GRPC_ERROR_CREATE("Handshake failed"), - result); + return grpc_set_tsi_error_result( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshake failed"), result); } // Send data. grpc_slice to_send = @@ -234,8 +235,8 @@ static void on_handshake_data_received_from_peer(grpc_exec_ctx *exec_ctx, gpr_mu_lock(&h->mu); if (error != GRPC_ERROR_NONE || h->shutdown) { security_handshake_failed_locked( - exec_ctx, h, - GRPC_ERROR_CREATE_REFERENCING("Handshake read failed", &error, 1)); + exec_ctx, h, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Handshake read failed", &error, 1)); gpr_mu_unlock(&h->mu); security_handshaker_unref(exec_ctx, h); return; @@ -270,8 +271,9 @@ static void on_handshake_data_received_from_peer(grpc_exec_ctx *exec_ctx, } if (result != TSI_OK) { security_handshake_failed_locked( - exec_ctx, h, grpc_set_tsi_error_result( - GRPC_ERROR_CREATE("Handshake failed"), result)); + exec_ctx, h, + grpc_set_tsi_error_result( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Handshake failed"), result)); gpr_mu_unlock(&h->mu); security_handshaker_unref(exec_ctx, h); return; @@ -314,8 +316,8 @@ static void on_handshake_data_sent_to_peer(grpc_exec_ctx *exec_ctx, void *arg, gpr_mu_lock(&h->mu); if (error != GRPC_ERROR_NONE || h->shutdown) { security_handshake_failed_locked( - exec_ctx, h, - GRPC_ERROR_CREATE_REFERENCING("Handshake write failed", &error, 1)); + exec_ctx, h, GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Handshake write failed", &error, 1)); gpr_mu_unlock(&h->mu); security_handshaker_unref(exec_ctx, h); return; @@ -429,7 +431,8 @@ static void fail_handshaker_do_handshake(grpc_exec_ctx *exec_ctx, grpc_closure *on_handshake_done, grpc_handshaker_args *args) { grpc_closure_sched(exec_ctx, on_handshake_done, - GRPC_ERROR_CREATE("Failed to create security handshaker")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Failed to create security handshaker")); } static const grpc_handshaker_vtable fail_handshaker_vtable = { diff --git a/src/core/lib/security/transport/server_auth_filter.c b/src/core/lib/security/transport/server_auth_filter.c index 14619d97caf..63ae46c41d5 100644 --- a/src/core/lib/security/transport/server_auth_filter.c +++ b/src/core/lib/security/transport/server_auth_filter.c @@ -144,9 +144,10 @@ static void on_md_processing_done( calld->transport_op->send_message = NULL; } calld->transport_op->send_trailing_metadata = NULL; - grpc_closure_sched(&exec_ctx, calld->on_done_recv, - grpc_error_set_int(GRPC_ERROR_CREATE(error_details), - GRPC_ERROR_INT_GRPC_STATUS, status)); + grpc_closure_sched( + &exec_ctx, calld->on_done_recv, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(error_details), + GRPC_ERROR_INT_GRPC_STATUS, status)); } grpc_exec_ctx_finish(&exec_ctx); diff --git a/src/core/lib/security/transport/tsi_error.c b/src/core/lib/security/transport/tsi_error.c index f15bd7e4137..eae0a676b0e 100644 --- a/src/core/lib/security/transport/tsi_error.c +++ b/src/core/lib/security/transport/tsi_error.c @@ -34,7 +34,9 @@ #include "src/core/lib/security/transport/tsi_error.h" grpc_error *grpc_set_tsi_error_result(grpc_error *error, tsi_result result) { - return grpc_error_set_int(grpc_error_set_str(error, GRPC_ERROR_STR_TSI_ERROR, - grpc_slice_from_static_string(tsi_result_to_string(result))), - GRPC_ERROR_INT_TSI_CODE, result); + return grpc_error_set_int( + grpc_error_set_str( + error, GRPC_ERROR_STR_TSI_ERROR, + grpc_slice_from_static_string(tsi_result_to_string(result))), + GRPC_ERROR_INT_TSI_CODE, result); } diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index e41d7a6370c..87ba352a2e9 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -260,7 +260,7 @@ static void add_batch_error(grpc_exec_ctx *exec_ctx, batch_control *bctl, static void add_init_error(grpc_error **composite, grpc_error *new) { if (new == GRPC_ERROR_NONE) return; if (*composite == GRPC_ERROR_NONE) - *composite = GRPC_ERROR_CREATE("Call creation failed"); + *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Call creation failed"); *composite = grpc_error_add_child(*composite, new); } @@ -327,17 +327,17 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, * call. */ if (args->propagation_mask & GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT) { if (0 == (args->propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT)) { - add_init_error(&error, - GRPC_ERROR_CREATE("Census tracing propagation requested " - "without Census context propagation")); + add_init_error(&error, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Census tracing propagation requested " + "without Census context propagation")); } grpc_call_context_set( call, GRPC_CONTEXT_TRACING, args->parent_call->context[GRPC_CONTEXT_TRACING].value, NULL); } else if (args->propagation_mask & GRPC_PROPAGATE_CENSUS_STATS_CONTEXT) { - add_init_error(&error, - GRPC_ERROR_CREATE("Census context propagation requested " - "without Census tracing propagation")); + add_init_error(&error, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Census context propagation requested " + "without Census tracing propagation")); } if (args->propagation_mask & GRPC_PROPAGATE_CANCELLATION) { call->cancellation_is_inherited = 1; @@ -607,8 +607,9 @@ static void cancel_with_error(grpc_exec_ctx *exec_ctx, grpc_call *c, static grpc_error *error_from_status(grpc_status_code status, const char *description) { return grpc_error_set_int( - grpc_error_set_str(GRPC_ERROR_CREATE(description), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(description)), + grpc_error_set_str(GRPC_ERROR_CREATE_FROM_COPIED_STRING(description), + GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_copied_string(description)), GRPC_ERROR_INT_GRPC_STATUS, status); } @@ -905,15 +906,19 @@ static void recv_common_filter(grpc_exec_ctx *exec_ctx, grpc_call *call, grpc_error *error = status_code == GRPC_STATUS_OK ? GRPC_ERROR_NONE - : grpc_error_set_int(GRPC_ERROR_CREATE("Error received from peer"), + : grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Error received from peer"), GRPC_ERROR_INT_GRPC_STATUS, (intptr_t)status_code); if (b->idx.named.grpc_message != NULL) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_ref_internal(GRPC_MDVALUE(b->idx.named.grpc_message->md))); + error = grpc_error_set_str( + error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_ref_internal(GRPC_MDVALUE(b->idx.named.grpc_message->md))); grpc_metadata_batch_remove(exec_ctx, b, b->idx.named.grpc_message); } else if (error != GRPC_ERROR_NONE) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_empty_slice()); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_empty_slice()); } set_status_from_error(exec_ctx, call, STATUS_FROM_WIRE, error); @@ -1062,8 +1067,8 @@ static grpc_error *consolidate_batch_errors(batch_control *bctl) { bctl->errors[0] = NULL; return e; } else { - grpc_error *error = - GRPC_ERROR_CREATE_REFERENCING("Call batch failed", bctl->errors, n); + grpc_error *error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Call batch failed", bctl->errors, n); for (size_t i = 0; i < n; i++) { GRPC_ERROR_UNREF(bctl->errors[i]); bctl->errors[i] = NULL; @@ -1535,7 +1540,8 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, { grpc_error *override_error = GRPC_ERROR_NONE; if (op->data.send_status_from_server.status != GRPC_STATUS_OK) { - override_error = GRPC_ERROR_CREATE("Error from server send status"); + override_error = GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Error from server send status"); } if (op->data.send_status_from_server.status_details != NULL) { call->send_extra_metadata[1].md = grpc_mdelem_from_slices( @@ -1545,8 +1551,9 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, call->send_extra_metadata_count++; char *msg = grpc_slice_to_c_string( GRPC_MDVALUE(call->send_extra_metadata[1].md)); - override_error = grpc_error_set_str( - override_error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_copied_string(msg)); + override_error = + grpc_error_set_str(override_error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_copied_string(msg)); gpr_free(msg); } set_status_from_error(exec_ctx, call, STATUS_FROM_API_OVERRIDE, diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c index d6acd392c1a..8778345d06d 100644 --- a/src/core/lib/surface/channel.c +++ b/src/core/lib/surface/channel.c @@ -348,7 +348,8 @@ void grpc_channel_destroy(grpc_channel *channel) { grpc_channel_element *elem; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; GRPC_API_TRACE("grpc_channel_destroy(channel=%p)", 1, (channel)); - op->disconnect_with_error = GRPC_ERROR_CREATE("Channel Destroyed"); + op->disconnect_with_error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Channel Destroyed"); elem = grpc_channel_stack_element(CHANNEL_STACK_FROM_CHANNEL(channel), 0); elem->filter->start_transport_op(&exec_ctx, elem, op); diff --git a/src/core/lib/surface/lame_client.c b/src/core/lib/surface/lame_client.c index 49bc4c114b3..7de68b535cd 100644 --- a/src/core/lib/surface/lame_client.c +++ b/src/core/lib/surface/lame_client.c @@ -90,7 +90,8 @@ static void lame_start_transport_stream_op(grpc_exec_ctx *exec_ctx, fill_metadata(exec_ctx, elem, op->recv_trailing_metadata); } grpc_transport_stream_op_finish_with_failure( - exec_ctx, op, GRPC_ERROR_CREATE("lame client channel")); + exec_ctx, op, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel")); } static char *lame_get_peer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { @@ -111,8 +112,9 @@ static void lame_start_transport_op(grpc_exec_ctx *exec_ctx, GRPC_ERROR_NONE); } if (op->send_ping != NULL) { - grpc_closure_sched(exec_ctx, op->send_ping, - GRPC_ERROR_CREATE("lame client channel")); + grpc_closure_sched( + exec_ctx, op->send_ping, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("lame client channel")); } GRPC_ERROR_UNREF(op->disconnect_with_error); if (op->on_consumed != NULL) { diff --git a/src/core/lib/surface/server.c b/src/core/lib/surface/server.c index b3605795536..22a13ee48bd 100644 --- a/src/core/lib/surface/server.c +++ b/src/core/lib/surface/server.c @@ -288,10 +288,10 @@ static void send_shutdown(grpc_exec_ctx *exec_ctx, grpc_channel *channel, grpc_channel_element *elem; op->goaway_error = - send_goaway - ? grpc_error_set_int(GRPC_ERROR_CREATE("Server shutdown"), - GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK) - : GRPC_ERROR_NONE; + send_goaway ? grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_OK) + : GRPC_ERROR_NONE; op->set_accept_stream = true; sc->slice = grpc_slice_from_copied_string("Server shutdown"); op->disconnect_with_error = send_disconnect; @@ -712,8 +712,9 @@ static void maybe_finish_shutdown(grpc_exec_ctx *exec_ctx, return; } - kill_pending_work_locked(exec_ctx, server, - GRPC_ERROR_CREATE("Server Shutdown")); + kill_pending_work_locked( + exec_ctx, server, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); if (server->root_channel_data.next != &server->root_channel_data || server->listeners_destroyed < num_listeners(server)) { @@ -771,8 +772,8 @@ static void server_on_recv_initial_metadata(grpc_exec_ctx *exec_ctx, void *ptr, /* do nothing */ } else { grpc_error *src_error = error; - error = - GRPC_ERROR_CREATE_REFERENCING("Missing :authority or :path", &error, 1); + error = GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Missing :authority or :path", &error, 1); GRPC_ERROR_UNREF(src_error); } @@ -1219,7 +1220,8 @@ void grpc_server_setup_transport(grpc_exec_ctx *exec_ctx, grpc_server *s, op->on_connectivity_state_change = &chand->channel_connectivity_changed; op->connectivity_state = &chand->connectivity_state; if (gpr_atm_acq_load(&s->shutdown_flag) != 0) { - op->disconnect_with_error = GRPC_ERROR_CREATE("Server shutdown"); + op->disconnect_with_error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server shutdown"); } grpc_transport_perform_op(exec_ctx, transport, op); } @@ -1277,8 +1279,9 @@ void grpc_server_shutdown_and_notify(grpc_server *server, /* collect all unregistered then registered calls */ gpr_mu_lock(&server->mu_call); - kill_pending_work_locked(&exec_ctx, server, - GRPC_ERROR_CREATE("Server Shutdown")); + kill_pending_work_locked( + &exec_ctx, server, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); gpr_mu_unlock(&server->mu_call); maybe_finish_shutdown(&exec_ctx, server); @@ -1308,8 +1311,9 @@ void grpc_server_cancel_all_calls(grpc_server *server) { channel_broadcaster_init(server, &broadcaster); gpr_mu_unlock(&server->mu_global); - channel_broadcaster_shutdown(&exec_ctx, &broadcaster, false /* send_goaway */, - GRPC_ERROR_CREATE("Cancelling all calls")); + channel_broadcaster_shutdown( + &exec_ctx, &broadcaster, false /* send_goaway */, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Cancelling all calls")); grpc_exec_ctx_finish(&exec_ctx); } @@ -1357,16 +1361,16 @@ static grpc_call_error queue_call_request(grpc_exec_ctx *exec_ctx, int request_id; if (gpr_atm_acq_load(&server->shutdown_flag)) { fail_call(exec_ctx, server, cq_idx, rc, - GRPC_ERROR_CREATE("Server Shutdown")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Server Shutdown")); return GRPC_CALL_OK; } request_id = gpr_stack_lockfree_pop(server->request_freelist_per_cq[cq_idx]); if (request_id == -1) { /* out of request ids: just fail this one */ fail_call(exec_ctx, server, cq_idx, rc, - grpc_error_set_int(GRPC_ERROR_CREATE("Out of request ids"), - GRPC_ERROR_INT_LIMIT, - server->max_requested_calls_per_cq)); + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Out of request ids"), + GRPC_ERROR_INT_LIMIT, server->max_requested_calls_per_cq)); return GRPC_CALL_OK; } switch (rc->type) { diff --git a/src/core/lib/surface/validate_metadata.c b/src/core/lib/surface/validate_metadata.c index 147dd09af84..9995510e48a 100644 --- a/src/core/lib/surface/validate_metadata.c +++ b/src/core/lib/surface/validate_metadata.c @@ -53,7 +53,8 @@ static grpc_error *conforms_to(grpc_slice slice, const uint8_t *legal_bits, if ((legal_bits[byte] & (1 << bit)) == 0) { char *dump = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); grpc_error *error = grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE(err_desc), GRPC_ERROR_INT_OFFSET, + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(err_desc), + GRPC_ERROR_INT_OFFSET, p - GRPC_SLICE_START_PTR(slice)), GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_copied_string(dump)); gpr_free(dump); @@ -75,10 +76,12 @@ grpc_error *grpc_validate_header_key_is_legal(grpc_slice slice) { 0x80, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; if (GRPC_SLICE_LENGTH(slice) == 0) { - return GRPC_ERROR_CREATE("Metadata keys cannot be zero length"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Metadata keys cannot be zero length"); } if (GRPC_SLICE_START_PTR(slice)[0] == ':') { - return GRPC_ERROR_CREATE("Metadata keys cannot start with :"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Metadata keys cannot start with :"); } return conforms_to(slice, legal_header_bits, "Illegal header key"); } diff --git a/src/core/lib/transport/connectivity_state.c b/src/core/lib/transport/connectivity_state.c index afe1f6164d7..3757b252676 100644 --- a/src/core/lib/transport/connectivity_state.c +++ b/src/core/lib/transport/connectivity_state.c @@ -79,7 +79,8 @@ void grpc_connectivity_state_destroy(grpc_exec_ctx *exec_ctx, *w->current = GRPC_CHANNEL_SHUTDOWN; error = GRPC_ERROR_NONE; } else { - error = GRPC_ERROR_CREATE("Shutdown connectivity owner"); + error = + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Shutdown connectivity owner"); } grpc_closure_sched(exec_ctx, w->notify, error); gpr_free(w); diff --git a/src/core/lib/transport/metadata_batch.c b/src/core/lib/transport/metadata_batch.c index 40b9e1d3309..e04ce72e891 100644 --- a/src/core/lib/transport/metadata_batch.c +++ b/src/core/lib/transport/metadata_batch.c @@ -102,7 +102,9 @@ void grpc_metadata_batch_destroy(grpc_exec_ctx *exec_ctx, grpc_error *grpc_attach_md_to_error(grpc_error *src, grpc_mdelem md) { grpc_error *out = grpc_error_set_str( - grpc_error_set_str(src, GRPC_ERROR_STR_KEY, grpc_slice_ref_internal(GRPC_MDKEY(md))), GRPC_ERROR_STR_VALUE, grpc_slice_ref_internal(GRPC_MDVALUE(md))); + grpc_error_set_str(src, GRPC_ERROR_STR_KEY, + grpc_slice_ref_internal(GRPC_MDKEY(md))), + GRPC_ERROR_STR_VALUE, grpc_slice_ref_internal(GRPC_MDVALUE(md))); return out; } @@ -122,7 +124,8 @@ static grpc_error *maybe_link_callout(grpc_metadata_batch *batch, return GRPC_ERROR_NONE; } return grpc_attach_md_to_error( - GRPC_ERROR_CREATE("Unallowed duplicate metadata"), storage->md); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Unallowed duplicate metadata"), + storage->md); } static void maybe_unlink_callout(grpc_metadata_batch *batch, @@ -298,7 +301,7 @@ static void add_error(grpc_error **composite, grpc_error *error, const char *composite_error_string) { if (error == GRPC_ERROR_NONE) return; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE(composite_error_string); + *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING(composite_error_string); } *composite = grpc_error_add_child(*composite, error); } diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c index fdedfe284e2..4870dc1a536 100644 --- a/test/core/bad_client/bad_client.c +++ b/test/core/bad_client/bad_client.c @@ -163,8 +163,9 @@ void grpc_run_bad_client_test( gpr_event_wait(&a.done_write, grpc_timeout_seconds_to_deadline(5))); if (flags & GRPC_BAD_CLIENT_DISCONNECT) { - grpc_endpoint_shutdown(&exec_ctx, sfd.client, - GRPC_ERROR_CREATE("Forced Disconnect")); + grpc_endpoint_shutdown( + &exec_ctx, sfd.client, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Disconnect")); grpc_endpoint_destroy(&exec_ctx, sfd.client); grpc_exec_ctx_finish(&exec_ctx); sfd.client = NULL; @@ -190,8 +191,9 @@ void grpc_run_bad_client_test( grpc_slice_buffer_destroy_internal(&exec_ctx, &args.incoming); } // Shutdown. - grpc_endpoint_shutdown(&exec_ctx, sfd.client, - GRPC_ERROR_CREATE("Test Shutdown")); + grpc_endpoint_shutdown( + &exec_ctx, sfd.client, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); grpc_endpoint_destroy(&exec_ctx, sfd.client); grpc_exec_ctx_finish(&exec_ctx); } diff --git a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c index 187757d5b31..b85ca89337d 100644 --- a/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c +++ b/test/core/client_channel/resolvers/dns_resolver_connectivity_test.c @@ -55,7 +55,7 @@ static grpc_error *my_resolve_address(const char *name, const char *addr, if (g_fail_resolution) { g_fail_resolution = false; gpr_mu_unlock(&g_mu); - return GRPC_ERROR_CREATE("Forced Failure"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure"); } else { gpr_mu_unlock(&g_mu); *addrs = gpr_malloc(sizeof(**addrs)); diff --git a/test/core/client_channel/set_initial_connect_string_test.c b/test/core/client_channel/set_initial_connect_string_test.c index a0a33667cc8..7bed80f7262 100644 --- a/test/core/client_channel/set_initial_connect_string_test.c +++ b/test/core/client_channel/set_initial_connect_string_test.c @@ -83,7 +83,8 @@ static void handle_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { gpr_atm_rel_store(&state.done_atm, 1); grpc_endpoint_shutdown( exec_ctx, state.tcp, - GRPC_ERROR_CREATE("Incoming buffer longer than magic_connect_string")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Incoming buffer longer than magic_connect_string")); grpc_endpoint_destroy(exec_ctx, state.tcp); } else { grpc_endpoint_read(exec_ctx, state.tcp, &state.temp_incoming_buffer, diff --git a/test/core/end2end/bad_server_response_test.c b/test/core/end2end/bad_server_response_test.c index 39a98e84ca9..c37a292af97 100644 --- a/test/core/end2end/bad_server_response_test.c +++ b/test/core/end2end/bad_server_response_test.c @@ -303,7 +303,7 @@ static void run_test(const char *response_payload, /* clean up */ grpc_endpoint_shutdown(&exec_ctx, state.tcp, - GRPC_ERROR_CREATE("Test Shutdown")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); grpc_endpoint_destroy(&exec_ctx, state.tcp); cleanup_rpc(&exec_ctx); grpc_exec_ctx_finish(&exec_ctx); diff --git a/test/core/end2end/fixtures/http_proxy_fixture.c b/test/core/end2end/fixtures/http_proxy_fixture.c index bcd1c9914b2..451ed268d30 100644 --- a/test/core/end2end/fixtures/http_proxy_fixture.c +++ b/test/core/end2end/fixtures/http_proxy_fixture.c @@ -342,7 +342,7 @@ static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg, char* msg; gpr_asprintf(&msg, "HTTP proxy got request method %s", conn->http_request.method); - error = GRPC_ERROR_CREATE(msg); + error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg); gpr_free(msg); proxy_connection_failed(exec_ctx, conn, true /* is_client */, "HTTP proxy read request", error); diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c index 0de8b9459ab..9cc3f564377 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.c +++ b/test/core/end2end/fuzzers/api_fuzzer.c @@ -390,9 +390,9 @@ static void finish_resolve(grpc_exec_ctx *exec_ctx, void *arg, *r->addrs = addrs; grpc_closure_sched(exec_ctx, r->on_done, GRPC_ERROR_NONE); } else { - grpc_closure_sched( - exec_ctx, r->on_done, - GRPC_ERROR_CREATE_REFERENCING("Resolution failed", &error, 1)); + grpc_closure_sched(exec_ctx, r->on_done, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Resolution failed", &error, 1)); } gpr_free(r->addr); @@ -461,8 +461,8 @@ static void sched_connect(grpc_exec_ctx *exec_ctx, grpc_closure *closure, grpc_endpoint **ep, gpr_timespec deadline) { if (gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) < 0) { *ep = NULL; - grpc_closure_sched(exec_ctx, closure, - GRPC_ERROR_CREATE("Connect deadline exceeded")); + grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_CREATE_FROM_STATIC_STRING( + "Connect deadline exceeded")); return; } diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c index a9634bfbaec..4bb258e3ed7 100644 --- a/test/core/end2end/goaway_server_test.c +++ b/test/core/end2end/goaway_server_test.c @@ -71,7 +71,7 @@ static grpc_error *my_resolve_address(const char *name, const char *addr, gpr_mu_lock(&g_mu); if (g_resolve_port < 0) { gpr_mu_unlock(&g_mu); - return GRPC_ERROR_CREATE("Forced Failure"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Forced Failure"); } else { *addrs = gpr_malloc(sizeof(**addrs)); (*addrs)->naddrs = 1; diff --git a/test/core/end2end/tests/filter_call_init_fails.c b/test/core/end2end/tests/filter_call_init_fails.c index d2d6e82d574..e2df272bab1 100644 --- a/test/core/end2end/tests/filter_call_init_fails.c +++ b/test/core/end2end/tests/filter_call_init_fails.c @@ -206,9 +206,9 @@ static void test_request(grpc_end2end_test_config config) { static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_element_args *args) { - return grpc_error_set_int(GRPC_ERROR_CREATE("access denied"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_PERMISSION_DENIED); + return grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("access denied"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_PERMISSION_DENIED); } static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, diff --git a/test/core/end2end/tests/filter_causes_close.c b/test/core/end2end/tests/filter_causes_close.c index 25e606556da..f4bfb5c804b 100644 --- a/test/core/end2end/tests/filter_causes_close.c +++ b/test/core/end2end/tests/filter_causes_close.c @@ -210,7 +210,7 @@ static void recv_im_ready(grpc_exec_ctx *exec_ctx, void *arg, call_data *calld = elem->call_data; grpc_closure_sched( exec_ctx, calld->recv_im_ready, - grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING( + grpc_error_set_int(GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( "Failure that's not preventable.", &error, 1), GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_PERMISSION_DENIED)); diff --git a/test/core/iomgr/endpoint_tests.c b/test/core/iomgr/endpoint_tests.c index 94067a8ca4d..e274796e237 100644 --- a/test/core/iomgr/endpoint_tests.c +++ b/test/core/iomgr/endpoint_tests.c @@ -233,11 +233,13 @@ static void read_and_write_test(grpc_endpoint_test_config config, if (shutdown) { gpr_log(GPR_DEBUG, "shutdown read"); - grpc_endpoint_shutdown(&exec_ctx, state.read_ep, - GRPC_ERROR_CREATE("Test Shutdown")); + grpc_endpoint_shutdown( + &exec_ctx, state.read_ep, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); gpr_log(GPR_DEBUG, "shutdown write"); - grpc_endpoint_shutdown(&exec_ctx, state.write_ep, - GRPC_ERROR_CREATE("Test Shutdown")); + grpc_endpoint_shutdown( + &exec_ctx, state.write_ep, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); } grpc_exec_ctx_flush(&exec_ctx); @@ -299,7 +301,7 @@ static void multiple_shutdown_test(grpc_endpoint_test_config config) { grpc_schedule_on_exec_ctx)); wait_for_fail_count(&exec_ctx, &fail_count, 0); grpc_endpoint_shutdown(&exec_ctx, f.client_ep, - GRPC_ERROR_CREATE("Test Shutdown")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); wait_for_fail_count(&exec_ctx, &fail_count, 1); grpc_endpoint_read(&exec_ctx, f.client_ep, &slice_buffer, grpc_closure_create(inc_on_failure, &fail_count, @@ -311,7 +313,7 @@ static void multiple_shutdown_test(grpc_endpoint_test_config config) { grpc_schedule_on_exec_ctx)); wait_for_fail_count(&exec_ctx, &fail_count, 3); grpc_endpoint_shutdown(&exec_ctx, f.client_ep, - GRPC_ERROR_CREATE("Test Shutdown")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test Shutdown")); wait_for_fail_count(&exec_ctx, &fail_count, 3); grpc_slice_buffer_destroy_internal(&exec_ctx, &slice_buffer); diff --git a/test/core/iomgr/error_test.c b/test/core/iomgr/error_test.c index 48a7aa0b3f5..5c60a4ddb85 100644 --- a/test/core/iomgr/error_test.c +++ b/test/core/iomgr/error_test.c @@ -44,7 +44,7 @@ #include "test/core/util/test_config.h" static void test_set_get_int() { - grpc_error* error = GRPC_ERROR_CREATE("Test"); + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test"); GPR_ASSERT(error); intptr_t i = 0; GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_FILE_LINE, &i)); @@ -66,24 +66,27 @@ static void test_set_get_int() { } static void test_set_get_str() { - grpc_error* error = GRPC_ERROR_CREATE("Test"); + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test"); grpc_slice str; GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str)); GPR_ASSERT(!grpc_error_get_str(error, GRPC_ERROR_STR_TSI_ERROR, &str)); GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_FILE, &str)); - GPR_ASSERT(strstr((char*)GRPC_SLICE_START_PTR(str), "error_test.c")); // __FILE__ expands differently on - // Windows. All should at least - // contain error_test.c + GPR_ASSERT(strstr((char*)GRPC_SLICE_START_PTR(str), + "error_test.c")); // __FILE__ expands differently on + // Windows. All should at least + // contain error_test.c GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "Test", GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "Test", + GRPC_SLICE_LENGTH(str))); - error = - grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("longer message")); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string("longer message")); GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "longer message", GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "longer message", + GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error); } @@ -91,24 +94,28 @@ static void test_set_get_str() { static void test_copy_and_unref() { // error1 has one ref grpc_error* error1 = grpc_error_set_str( - GRPC_ERROR_CREATE("Test"), GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Test"), GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string("message")); grpc_slice str; GPR_ASSERT(grpc_error_get_str(error1, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", + GRPC_SLICE_LENGTH(str))); // error 1 has two refs GRPC_ERROR_REF(error1); // this gives error3 a ref to the new error, and decrements error1 to one ref - grpc_error* error3 = - grpc_error_set_str(error1, GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string("syscall")); + grpc_error* error3 = grpc_error_set_str( + error1, GRPC_ERROR_STR_SYSCALL, grpc_slice_from_static_string("syscall")); GPR_ASSERT(error3 != error1); // should not be the same because of extra ref GPR_ASSERT(grpc_error_get_str(error3, GRPC_ERROR_STR_GRPC_MESSAGE, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "message", + GRPC_SLICE_LENGTH(str))); // error 1 should not have a syscall but 3 should GPR_ASSERT(!grpc_error_get_str(error1, GRPC_ERROR_STR_SYSCALL, &str)); GPR_ASSERT(grpc_error_get_str(error3, GRPC_ERROR_STR_SYSCALL, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "syscall", GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), "syscall", + GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error1); GRPC_ERROR_UNREF(error3); @@ -116,8 +123,10 @@ static void test_copy_and_unref() { static void test_create_referencing() { grpc_error* child = grpc_error_set_str( - GRPC_ERROR_CREATE("Child"), GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); - grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", &child, 1); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child"), + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); + grpc_error* parent = + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", &child, 1); GPR_ASSERT(parent); GRPC_ERROR_UNREF(child); @@ -126,14 +135,18 @@ static void test_create_referencing() { static void test_create_referencing_many() { grpc_error* children[3]; - children[0] = grpc_error_set_str(GRPC_ERROR_CREATE("Child1"), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); - children[1] = grpc_error_set_int(GRPC_ERROR_CREATE("Child2"), - GRPC_ERROR_INT_HTTP2_ERROR, 5); - children[2] = grpc_error_set_str(GRPC_ERROR_CREATE("Child3"), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message 3")); - - grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", children, 3); + children[0] = grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child1"), + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); + children[1] = + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child2"), + GRPC_ERROR_INT_HTTP2_ERROR, 5); + children[2] = grpc_error_set_str( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Child3"), + GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message 3")); + + grpc_error* parent = + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", children, 3); GPR_ASSERT(parent); for (size_t i = 0; i < 3; ++i) { @@ -144,10 +157,11 @@ static void test_create_referencing_many() { static void print_error_string() { grpc_error* error = - grpc_error_set_int(GRPC_ERROR_CREATE("Error"), GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNIMPLEMENTED); + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED); error = grpc_error_set_int(error, GRPC_ERROR_INT_SIZE, 666); - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message")); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string("message")); // gpr_log(GPR_DEBUG, "%s", grpc_error_string(error)); GRPC_ERROR_UNREF(error); } @@ -155,15 +169,18 @@ static void print_error_string() { static void print_error_string_reference() { grpc_error* children[2]; children[0] = grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE("1"), GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNIMPLEMENTED), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message for child 1")); + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("1"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNIMPLEMENTED), + GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string("message for child 1")); children[1] = grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE("2sd"), GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_INTERNAL), - GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string("message for child 2")); + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("2sd"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_INTERNAL), + GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string("message for child 2")); - grpc_error* parent = GRPC_ERROR_CREATE_REFERENCING("Parent", children, 2); + grpc_error* parent = + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Parent", children, 2); gpr_log(GPR_DEBUG, "%s", grpc_error_string(parent)); @@ -184,13 +201,15 @@ static void test_os_error() { grpc_slice str; GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_SYSCALL, &str)); - GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), syscall, GRPC_SLICE_LENGTH(str))); + GPR_ASSERT(!strncmp((char*)GRPC_SLICE_START_PTR(str), syscall, + GRPC_SLICE_LENGTH(str))); GRPC_ERROR_UNREF(error); } static void test_special() { grpc_error* error = GRPC_ERROR_NONE; - error = grpc_error_add_child(error, GRPC_ERROR_CREATE("test child")); + error = grpc_error_add_child( + error, GRPC_ERROR_CREATE_FROM_STATIC_STRING("test child")); intptr_t i; GPR_ASSERT(grpc_error_get_int(error, GRPC_ERROR_INT_GRPC_STATUS, &i)); GPR_ASSERT(i == GRPC_STATUS_OK); diff --git a/test/core/iomgr/ev_epoll_linux_test.c b/test/core/iomgr/ev_epoll_linux_test.c index 4ec959995b2..d69f9a9d15c 100644 --- a/test/core/iomgr/ev_epoll_linux_test.c +++ b/test/core/iomgr/ev_epoll_linux_test.c @@ -90,7 +90,7 @@ static void test_fd_cleanup(grpc_exec_ctx *exec_ctx, test_fd *tfds, for (i = 0; i < num_fds; i++) { grpc_fd_shutdown(exec_ctx, tfds[i].fd, - GRPC_ERROR_CREATE("test_fd_cleanup")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("test_fd_cleanup")); grpc_exec_ctx_flush(exec_ctx); grpc_fd_orphan(exec_ctx, tfds[i].fd, NULL, &release_fd, "test_fd_cleanup"); diff --git a/test/core/iomgr/fd_posix_test.c b/test/core/iomgr/fd_posix_test.c index c1a0ef54d32..81d2692a084 100644 --- a/test/core/iomgr/fd_posix_test.c +++ b/test/core/iomgr/fd_posix_test.c @@ -133,7 +133,7 @@ static void session_shutdown_cb(grpc_exec_ctx *exec_ctx, void *arg, /*session */ gpr_free(se); /* Start to shutdown listen fd. */ grpc_fd_shutdown(exec_ctx, sv->em_fd, - GRPC_ERROR_CREATE("session_shutdown_cb")); + GRPC_ERROR_CREATE_FROM_STATIC_STRING("session_shutdown_cb")); } /* Called when data become readable in a session. */ diff --git a/test/core/iomgr/pollset_set_test.c b/test/core/iomgr/pollset_set_test.c index f27e9db8c9a..3a9d459579f 100644 --- a/test/core/iomgr/pollset_set_test.c +++ b/test/core/iomgr/pollset_set_test.c @@ -143,7 +143,8 @@ static void cleanup_test_fds(grpc_exec_ctx *exec_ctx, test_fd *tfds, int release_fd; for (int i = 0; i < num_fds; i++) { - grpc_fd_shutdown(exec_ctx, tfds[i].fd, GRPC_ERROR_CREATE("fd cleanup")); + grpc_fd_shutdown(exec_ctx, tfds[i].fd, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("fd cleanup")); grpc_exec_ctx_flush(exec_ctx); /* grpc_fd_orphan frees the memory allocated for grpc_fd. Normally it also diff --git a/test/core/iomgr/tcp_client_posix_test.c b/test/core/iomgr/tcp_client_posix_test.c index b324b5a65ed..2fae6774e86 100644 --- a/test/core/iomgr/tcp_client_posix_test.c +++ b/test/core/iomgr/tcp_client_posix_test.c @@ -77,8 +77,9 @@ static void must_succeed(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { GPR_ASSERT(g_connecting != NULL); GPR_ASSERT(error == GRPC_ERROR_NONE); - grpc_endpoint_shutdown(exec_ctx, g_connecting, - GRPC_ERROR_CREATE("must_succeed called")); + grpc_endpoint_shutdown( + exec_ctx, g_connecting, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("must_succeed called")); grpc_endpoint_destroy(exec_ctx, g_connecting); g_connecting = NULL; finish_connection(); diff --git a/test/core/iomgr/tcp_server_posix_test.c b/test/core/iomgr/tcp_server_posix_test.c index 6e514324a5f..112743b95b7 100644 --- a/test/core/iomgr/tcp_server_posix_test.c +++ b/test/core/iomgr/tcp_server_posix_test.c @@ -163,7 +163,8 @@ static void test_addr_init_str(test_addr *addr) { static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp, grpc_pollset *pollset, grpc_tcp_server_acceptor *acceptor) { - grpc_endpoint_shutdown(exec_ctx, tcp, GRPC_ERROR_CREATE("Connected")); + grpc_endpoint_shutdown(exec_ctx, tcp, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected")); grpc_endpoint_destroy(exec_ctx, tcp); on_connect_result temp_result; @@ -285,7 +286,7 @@ static grpc_error *tcp_connect(grpc_exec_ctx *exec_ctx, const test_addr *remote, if (g_nconnects != nconnects_before + 1) { gpr_mu_unlock(g_mu); close(clifd); - return GRPC_ERROR_CREATE("Didn't connect"); + return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Didn't connect"); } close(clifd); *result = g_result; diff --git a/test/core/security/secure_endpoint_test.c b/test/core/security/secure_endpoint_test.c index d2b76bae39c..b3775e91a72 100644 --- a/test/core/security/secure_endpoint_test.c +++ b/test/core/security/secure_endpoint_test.c @@ -166,10 +166,12 @@ static void test_leftover(grpc_endpoint_test_config config, size_t slice_size) { GPR_ASSERT(incoming.count == 1); GPR_ASSERT(grpc_slice_eq(s, incoming.slices[0])); - grpc_endpoint_shutdown(&exec_ctx, f.client_ep, - GRPC_ERROR_CREATE("test_leftover end")); - grpc_endpoint_shutdown(&exec_ctx, f.server_ep, - GRPC_ERROR_CREATE("test_leftover end")); + grpc_endpoint_shutdown( + &exec_ctx, f.client_ep, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("test_leftover end")); + grpc_endpoint_shutdown( + &exec_ctx, f.server_ep, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("test_leftover end")); grpc_endpoint_destroy(&exec_ctx, f.client_ep); grpc_endpoint_destroy(&exec_ctx, f.server_ep); grpc_exec_ctx_finish(&exec_ctx); diff --git a/test/core/security/ssl_server_fuzzer.c b/test/core/security/ssl_server_fuzzer.c index f789278add8..02193856432 100644 --- a/test/core/security/ssl_server_fuzzer.c +++ b/test/core/security/ssl_server_fuzzer.c @@ -121,8 +121,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { // server will wait for more data. Explicitly fail the server by shutting down // the endpoint. if (!state.done_callback_called) { - grpc_endpoint_shutdown(&exec_ctx, mock_endpoint, - GRPC_ERROR_CREATE("Explicit close")); + grpc_endpoint_shutdown( + &exec_ctx, mock_endpoint, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Explicit close")); grpc_exec_ctx_flush(&exec_ctx); } diff --git a/test/core/surface/concurrent_connectivity_test.c b/test/core/surface/concurrent_connectivity_test.c index ff927385d47..2f7c3dfb856 100644 --- a/test/core/surface/concurrent_connectivity_test.c +++ b/test/core/surface/concurrent_connectivity_test.c @@ -109,7 +109,8 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *vargs, grpc_endpoint *tcp, grpc_tcp_server_acceptor *acceptor) { gpr_free(acceptor); struct server_thread_args *args = (struct server_thread_args *)vargs; - grpc_endpoint_shutdown(exec_ctx, tcp, GRPC_ERROR_CREATE("Connected")); + grpc_endpoint_shutdown(exec_ctx, tcp, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected")); grpc_endpoint_destroy(exec_ctx, tcp); GRPC_LOG_IF_ERROR("pollset_kick", grpc_pollset_kick(args->pollset, NULL)); } diff --git a/test/core/util/mock_endpoint.c b/test/core/util/mock_endpoint.c index b8fed7e14b3..c747297984b 100644 --- a/test/core/util/mock_endpoint.c +++ b/test/core/util/mock_endpoint.c @@ -89,8 +89,9 @@ static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, grpc_mock_endpoint *m = (grpc_mock_endpoint *)ep; gpr_mu_lock(&m->mu); if (m->on_read) { - grpc_closure_sched(exec_ctx, m->on_read, GRPC_ERROR_CREATE_REFERENCING( - "Endpoint Shutdown", &why, 1)); + grpc_closure_sched(exec_ctx, m->on_read, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Endpoint Shutdown", &why, 1)); m->on_read = NULL; } gpr_mu_unlock(&m->mu); diff --git a/test/core/util/passthru_endpoint.c b/test/core/util/passthru_endpoint.c index 5f27f9ae733..121567fc0d2 100644 --- a/test/core/util/passthru_endpoint.c +++ b/test/core/util/passthru_endpoint.c @@ -75,7 +75,8 @@ static void me_read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, half *m = (half *)ep; gpr_mu_lock(&m->parent->mu); if (m->parent->shutdown) { - grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_CREATE("Already shutdown")); + grpc_closure_sched( + exec_ctx, cb, GRPC_ERROR_CREATE_FROM_STATIC_STRING("Already shutdown")); } else if (m->read_buffer.count > 0) { grpc_slice_buffer_swap(&m->read_buffer, slices); grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_NONE); @@ -98,7 +99,7 @@ static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, grpc_error *error = GRPC_ERROR_NONE; m->parent->stats->num_writes++; if (m->parent->shutdown) { - error = GRPC_ERROR_CREATE("Endpoint already shutdown"); + error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Endpoint already shutdown"); } else if (m->on_read != NULL) { for (size_t i = 0; i < slices->count; i++) { grpc_slice_buffer_add(m->on_read_out, grpc_slice_ref(slices->slices[i])); @@ -126,14 +127,16 @@ static void me_shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, gpr_mu_lock(&m->parent->mu); m->parent->shutdown = true; if (m->on_read) { - grpc_closure_sched(exec_ctx, m->on_read, - GRPC_ERROR_CREATE_REFERENCING("Shutdown", &why, 1)); + grpc_closure_sched( + exec_ctx, m->on_read, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Shutdown", &why, 1)); m->on_read = NULL; } m = other_half(m); if (m->on_read) { - grpc_closure_sched(exec_ctx, m->on_read, - GRPC_ERROR_CREATE_REFERENCING("Shutdown", &why, 1)); + grpc_closure_sched( + exec_ctx, m->on_read, + GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING("Shutdown", &why, 1)); m->on_read = NULL; } gpr_mu_unlock(&m->parent->mu); diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c index 7fbd0ca6aaa..90af1c107bb 100644 --- a/test/core/util/reconnect_server.c +++ b/test/core/util/reconnect_server.c @@ -80,7 +80,8 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp, gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); timestamp_list *new_tail; peer = grpc_endpoint_get_peer(tcp); - grpc_endpoint_shutdown(exec_ctx, tcp, GRPC_ERROR_CREATE("Connected")); + grpc_endpoint_shutdown(exec_ctx, tcp, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected")); grpc_endpoint_destroy(exec_ctx, tcp); if (peer) { last_colon = strrchr(peer, ':'); diff --git a/test/cpp/microbenchmarks/bm_error.cc b/test/cpp/microbenchmarks/bm_error.cc index 0f9e3c49db2..cd7644c75d0 100644 --- a/test/cpp/microbenchmarks/bm_error.cc +++ b/test/cpp/microbenchmarks/bm_error.cc @@ -54,7 +54,7 @@ typedef std::unique_ptr ErrorPtr; static void BM_ErrorCreate(benchmark::State& state) { TrackCounters track_counters; while (state.KeepRunning()) { - GRPC_ERROR_UNREF(GRPC_ERROR_CREATE("Error")); + GRPC_ERROR_UNREF(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error")); } track_counters.Finish(state); } @@ -63,9 +63,9 @@ BENCHMARK(BM_ErrorCreate); static void BM_ErrorCreateAndSetStatus(benchmark::State& state) { TrackCounters track_counters; while (state.KeepRunning()) { - GRPC_ERROR_UNREF(grpc_error_set_int(GRPC_ERROR_CREATE("Error"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_ABORTED)); + GRPC_ERROR_UNREF( + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), + GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_ABORTED)); } track_counters.Finish(state); } @@ -75,8 +75,9 @@ static void BM_ErrorCreateAndSetIntAndStr(benchmark::State& state) { TrackCounters track_counters; while (state.KeepRunning()) { GRPC_ERROR_UNREF(grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE("GOAWAY received"), - GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)0), + grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("GOAWAY received"), + GRPC_ERROR_INT_HTTP2_ERROR, (intptr_t)0), GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_static_string("raw bytes"))); } track_counters.Finish(state); @@ -85,7 +86,7 @@ BENCHMARK(BM_ErrorCreateAndSetIntAndStr); static void BM_ErrorCreateAndSetIntLoop(benchmark::State& state) { TrackCounters track_counters; - grpc_error* error = GRPC_ERROR_CREATE("Error"); + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"); int n = 0; while (state.KeepRunning()) { error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS, n++); @@ -97,10 +98,11 @@ BENCHMARK(BM_ErrorCreateAndSetIntLoop); static void BM_ErrorCreateAndSetStrLoop(benchmark::State& state) { TrackCounters track_counters; - grpc_error* error = GRPC_ERROR_CREATE("Error"); + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"); const char* str = "hello"; while (state.KeepRunning()) { - error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, grpc_slice_from_static_string(str)); + error = grpc_error_set_str(error, GRPC_ERROR_STR_GRPC_MESSAGE, + grpc_slice_from_static_string(str)); } GRPC_ERROR_UNREF(error); track_counters.Finish(state); @@ -109,7 +111,7 @@ BENCHMARK(BM_ErrorCreateAndSetStrLoop); static void BM_ErrorRefUnref(benchmark::State& state) { TrackCounters track_counters; - grpc_error* error = GRPC_ERROR_CREATE("Error"); + grpc_error* error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"); while (state.KeepRunning()) { GRPC_ERROR_UNREF(GRPC_ERROR_REF(error)); } @@ -138,8 +140,8 @@ BENCHMARK(BM_ErrorGetIntFromNoError); static void BM_ErrorGetMissingInt(benchmark::State& state) { TrackCounters track_counters; - ErrorPtr error( - grpc_error_set_int(GRPC_ERROR_CREATE("Error"), GRPC_ERROR_INT_INDEX, 1)); + ErrorPtr error(grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), GRPC_ERROR_INT_INDEX, 1)); while (state.KeepRunning()) { intptr_t value; grpc_error_get_int(error.get(), GRPC_ERROR_INT_OFFSET, &value); @@ -150,8 +152,8 @@ BENCHMARK(BM_ErrorGetMissingInt); static void BM_ErrorGetPresentInt(benchmark::State& state) { TrackCounters track_counters; - ErrorPtr error( - grpc_error_set_int(GRPC_ERROR_CREATE("Error"), GRPC_ERROR_INT_OFFSET, 1)); + ErrorPtr error(grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), GRPC_ERROR_INT_OFFSET, 1)); while (state.KeepRunning()) { intptr_t value; grpc_error_get_int(error.get(), GRPC_ERROR_INT_OFFSET, &value); @@ -186,7 +188,7 @@ class SimpleError { private: const gpr_timespec deadline_ = gpr_inf_future(GPR_CLOCK_MONOTONIC); - ErrorPtr error_{GRPC_ERROR_CREATE("Error")}; + ErrorPtr error_{GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error")}; }; class ErrorWithGrpcStatus { @@ -196,9 +198,9 @@ class ErrorWithGrpcStatus { private: const gpr_timespec deadline_ = gpr_inf_future(GPR_CLOCK_MONOTONIC); - ErrorPtr error_{grpc_error_set_int(GRPC_ERROR_CREATE("Error"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNIMPLEMENTED)}; + ErrorPtr error_{grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_UNIMPLEMENTED)}; }; class ErrorWithHttpError { @@ -208,9 +210,9 @@ class ErrorWithHttpError { private: const gpr_timespec deadline_ = gpr_inf_future(GPR_CLOCK_MONOTONIC); - ErrorPtr error_{grpc_error_set_int(GRPC_ERROR_CREATE("Error"), - GRPC_ERROR_INT_HTTP2_ERROR, - GRPC_HTTP2_COMPRESSION_ERROR)}; + ErrorPtr error_{grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), GRPC_ERROR_INT_HTTP2_ERROR, + GRPC_HTTP2_COMPRESSION_ERROR)}; }; class ErrorWithNestedGrpcStatus { @@ -220,11 +222,12 @@ class ErrorWithNestedGrpcStatus { private: const gpr_timespec deadline_ = gpr_inf_future(GPR_CLOCK_MONOTONIC); - ErrorPtr nested_error_{grpc_error_set_int(GRPC_ERROR_CREATE("Error"), - GRPC_ERROR_INT_GRPC_STATUS, - GRPC_STATUS_UNIMPLEMENTED)}; + ErrorPtr nested_error_{grpc_error_set_int( + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error"), GRPC_ERROR_INT_GRPC_STATUS, + GRPC_STATUS_UNIMPLEMENTED)}; grpc_error* nested_errors_[1] = {nested_error_.get()}; - ErrorPtr error_{GRPC_ERROR_CREATE_REFERENCING("Error", nested_errors_, 1)}; + ErrorPtr error_{GRPC_ERROR_CREATE_REFERENCING_FROM_STATIC_STRING( + "Error", nested_errors_, 1)}; }; template From 91220dc7932ab4e7f3e924e736b61911d3c420e3 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Mon, 13 Mar 2017 21:18:58 -0700 Subject: [PATCH 046/186] Added benchmark to show static vs copied --- test/cpp/microbenchmarks/bm_error.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_error.cc b/test/cpp/microbenchmarks/bm_error.cc index cd7644c75d0..00e1a08cabe 100644 --- a/test/cpp/microbenchmarks/bm_error.cc +++ b/test/cpp/microbenchmarks/bm_error.cc @@ -51,14 +51,23 @@ class ErrorDeleter { }; typedef std::unique_ptr ErrorPtr; -static void BM_ErrorCreate(benchmark::State& state) { +static void BM_ErrorCreateFromStatic(benchmark::State& state) { TrackCounters track_counters; while (state.KeepRunning()) { GRPC_ERROR_UNREF(GRPC_ERROR_CREATE_FROM_STATIC_STRING("Error")); } track_counters.Finish(state); } -BENCHMARK(BM_ErrorCreate); +BENCHMARK(BM_ErrorCreateFromStatic); + +static void BM_ErrorCreateFromCopied(benchmark::State& state) { + TrackCounters track_counters; + while (state.KeepRunning()) { + GRPC_ERROR_UNREF(GRPC_ERROR_CREATE_FROM_COPIED_STRING("Error not inline")); + } + track_counters.Finish(state); +} +BENCHMARK(BM_ErrorCreateFromCopied); static void BM_ErrorCreateAndSetStatus(benchmark::State& state) { TrackCounters track_counters; From 820e0834aa658d53eface1d2f93b7538d95c065b Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 14 Mar 2017 01:16:09 -0700 Subject: [PATCH 047/186] Fix SetSocketMutator --- src/cpp/common/channel_arguments.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc index 65f32774999..33a10c0b8e1 100644 --- a/src/cpp/common/channel_arguments.cc +++ b/src/cpp/common/channel_arguments.cc @@ -101,8 +101,10 @@ void ChannelArguments::SetSocketMutator(grpc_socket_mutator* mutator) { for (auto it = args_.begin(); it != args_.end(); ++it) { if (it->type == mutator_arg.type && grpc::string(it->key) == grpc::string(mutator_arg.key)) { + GPR_ASSERT(!replaced); it->value.pointer.vtable->destroy(&exec_ctx, it->value.pointer.p); it->value.pointer = mutator_arg.value.pointer; + replaced = true; } } grpc_exec_ctx_finish(&exec_ctx); From 482e2d2010628d34e114639aef1205fc00ea3e06 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 14 Mar 2017 09:25:11 +0100 Subject: [PATCH 048/186] prevent name clashes in C# generated code --- src/compiler/csharp_generator.cc | 77 ++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc index cc7a7a96aea..ce1e6b94c3f 100644 --- a/src/compiler/csharp_generator.cc +++ b/src/compiler/csharp_generator.cc @@ -203,13 +203,13 @@ std::string GetServerClassName(const ServiceDescriptor *service) { std::string GetCSharpMethodType(MethodType method_type) { switch (method_type) { case METHODTYPE_NO_STREAMING: - return "MethodType.Unary"; + return "grpc::MethodType.Unary"; case METHODTYPE_CLIENT_STREAMING: - return "MethodType.ClientStreaming"; + return "grpc::MethodType.ClientStreaming"; case METHODTYPE_SERVER_STREAMING: - return "MethodType.ServerStreaming"; + return "grpc::MethodType.ServerStreaming"; case METHODTYPE_BIDI_STREAMING: - return "MethodType.DuplexStreaming"; + return "grpc::MethodType.DuplexStreaming"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; @@ -243,16 +243,19 @@ std::string GetAccessLevel(bool internal_access) { std::string GetMethodReturnTypeClient(const MethodDescriptor *method) { switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: - return "AsyncUnaryCall<" + GetClassName(method->output_type()) + ">"; + return "grpc::AsyncUnaryCall<" + GetClassName(method->output_type()) + + ">"; case METHODTYPE_CLIENT_STREAMING: - return "AsyncClientStreamingCall<" + GetClassName(method->input_type()) + - ", " + GetClassName(method->output_type()) + ">"; + return "grpc::AsyncClientStreamingCall<" + + GetClassName(method->input_type()) + ", " + + GetClassName(method->output_type()) + ">"; case METHODTYPE_SERVER_STREAMING: - return "AsyncServerStreamingCall<" + GetClassName(method->output_type()) + - ">"; + return "grpc::AsyncServerStreamingCall<" + + GetClassName(method->output_type()) + ">"; case METHODTYPE_BIDI_STREAMING: - return "AsyncDuplexStreamingCall<" + GetClassName(method->input_type()) + - ", " + GetClassName(method->output_type()) + ">"; + return "grpc::AsyncDuplexStreamingCall<" + + GetClassName(method->input_type()) + ", " + + GetClassName(method->output_type()) + ">"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; @@ -265,7 +268,7 @@ std::string GetMethodRequestParamServer(const MethodDescriptor *method) { return GetClassName(method->input_type()) + " request"; case METHODTYPE_CLIENT_STREAMING: case METHODTYPE_BIDI_STREAMING: - return "IAsyncStreamReader<" + GetClassName(method->input_type()) + + return "grpc::IAsyncStreamReader<" + GetClassName(method->input_type()) + "> requestStream"; } GOOGLE_LOG(FATAL) << "Can't get here."; @@ -293,8 +296,8 @@ std::string GetMethodResponseStreamMaybe(const MethodDescriptor *method) { return ""; case METHODTYPE_SERVER_STREAMING: case METHODTYPE_BIDI_STREAMING: - return ", IServerStreamWriter<" + GetClassName(method->output_type()) + - "> responseStream"; + return ", grpc::IServerStreamWriter<" + + GetClassName(method->output_type()) + "> responseStream"; } GOOGLE_LOG(FATAL) << "Can't get here."; return ""; @@ -325,8 +328,8 @@ void GenerateMarshallerFields(Printer *out, const ServiceDescriptor *service) { for (size_t i = 0; i < used_messages.size(); i++) { const Descriptor *message = used_messages[i]; out->Print( - "static readonly Marshaller<$type$> $fieldname$ = " - "Marshallers.Create((arg) => " + "static readonly grpc::Marshaller<$type$> $fieldname$ = " + "grpc::Marshallers.Create((arg) => " "global::Google.Protobuf.MessageExtensions.ToByteArray(arg), " "$type$.Parser.ParseFrom);\n", "fieldname", GetMarshallerFieldName(message), "type", @@ -337,8 +340,8 @@ void GenerateMarshallerFields(Printer *out, const ServiceDescriptor *service) { void GenerateStaticMethodField(Printer *out, const MethodDescriptor *method) { out->Print( - "static readonly Method<$request$, $response$> $fieldname$ = new " - "Method<$request$, $response$>(\n", + "static readonly grpc::Method<$request$, $response$> $fieldname$ = new " + "grpc::Method<$request$, $response$>(\n", "fieldname", GetMethodFieldName(method), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); @@ -389,7 +392,7 @@ void GenerateServerClass(Printer *out, const ServiceDescriptor *service) { out->Print( "public virtual $returntype$ " "$methodname$($request$$response_stream_maybe$, " - "ServerCallContext context)\n", + "grpc::ServerCallContext context)\n", "methodname", method->name(), "returntype", GetMethodReturnTypeServer(method), "request", GetMethodRequestParamServer(method), "response_stream_maybe", @@ -397,8 +400,8 @@ void GenerateServerClass(Printer *out, const ServiceDescriptor *service) { out->Print("{\n"); out->Indent(); out->Print( - "throw new RpcException(" - "new Status(StatusCode.Unimplemented, \"\"));\n"); + "throw new grpc::RpcException(" + "new grpc::Status(grpc::StatusCode.Unimplemented, \"\"));\n"); out->Outdent(); out->Print("}\n\n"); } @@ -410,7 +413,7 @@ void GenerateServerClass(Printer *out, const ServiceDescriptor *service) { void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { out->Print("/// Client for $servicename$\n", "servicename", GetServiceClassName(service)); - out->Print("public partial class $name$ : ClientBase<$name$>\n", "name", + out->Print("public partial class $name$ : grpc::ClientBase<$name$>\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Indent(); @@ -421,7 +424,7 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { "/// The channel to use to make remote " "calls.\n", "servicename", GetServiceClassName(service)); - out->Print("public $name$(Channel channel) : base(channel)\n", "name", + out->Print("public $name$(grpc::Channel channel) : base(channel)\n", "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); @@ -431,8 +434,9 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { "/// The callInvoker to use to make remote " "calls.\n", "servicename", GetServiceClassName(service)); - out->Print("public $name$(CallInvoker callInvoker) : base(callInvoker)\n", - "name", GetClientClassName(service)); + out->Print( + "public $name$(grpc::CallInvoker callInvoker) : base(callInvoker)\n", + "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); out->Print( @@ -461,7 +465,8 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { // unary calls have an extra synchronous stub method GenerateDocCommentClientMethod(out, method, true, false); out->Print( - "public virtual $response$ $methodname$($request$ request, Metadata " + "public virtual $response$ $methodname$($request$ request, " + "grpc::Metadata " "headers = null, DateTime? deadline = null, CancellationToken " "cancellationToken = default(CancellationToken))\n", "methodname", method->name(), "request", @@ -470,7 +475,8 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { out->Print("{\n"); out->Indent(); out->Print( - "return $methodname$(request, new CallOptions(headers, deadline, " + "return $methodname$(request, new grpc::CallOptions(headers, " + "deadline, " "cancellationToken));\n", "methodname", method->name()); out->Outdent(); @@ -480,7 +486,7 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { GenerateDocCommentClientMethod(out, method, true, true); out->Print( "public virtual $response$ $methodname$($request$ request, " - "CallOptions options)\n", + "grpc::CallOptions options)\n", "methodname", method->name(), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); @@ -500,7 +506,8 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { } GenerateDocCommentClientMethod(out, method, false, false); out->Print( - "public virtual $returntype$ $methodname$($request_maybe$Metadata " + "public virtual $returntype$ " + "$methodname$($request_maybe$grpc::Metadata " "headers = null, DateTime? deadline = null, CancellationToken " "cancellationToken = default(CancellationToken))\n", "methodname", method_name, "request_maybe", @@ -510,7 +517,8 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { out->Indent(); out->Print( - "return $methodname$($request_maybe$new CallOptions(headers, deadline, " + "return $methodname$($request_maybe$new grpc::CallOptions(headers, " + "deadline, " "cancellationToken));\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method, true)); @@ -520,7 +528,8 @@ void GenerateClientStub(Printer *out, const ServiceDescriptor *service) { // overload taking CallOptions as a param GenerateDocCommentClientMethod(out, method, false, true); out->Print( - "public virtual $returntype$ $methodname$($request_maybe$CallOptions " + "public virtual $returntype$ " + "$methodname$($request_maybe$grpc::CallOptions " "options)\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method), "returntype", @@ -587,13 +596,13 @@ void GenerateBindServiceMethod(Printer *out, const ServiceDescriptor *service) { "/// An object implementing the server-side" " handling logic.\n"); out->Print( - "public static ServerServiceDefinition BindService($implclass$ " + "public static grpc::ServerServiceDefinition BindService($implclass$ " "serviceImpl)\n", "implclass", GetServerClassName(service)); out->Print("{\n"); out->Indent(); - out->Print("return ServerServiceDefinition.CreateBuilder()\n"); + out->Print("return grpc::ServerServiceDefinition.CreateBuilder()\n"); out->Indent(); out->Indent(); for (int i = 0; i < service->method_count(); i++) { @@ -681,7 +690,7 @@ grpc::string GetServices(const FileDescriptor *file, bool generate_client, out.Print("using System;\n"); out.Print("using System.Threading;\n"); out.Print("using System.Threading.Tasks;\n"); - out.Print("using Grpc.Core;\n"); + out.Print("using grpc = global::Grpc.Core;\n"); out.Print("\n"); out.Print("namespace $namespace$ {\n", "namespace", GetFileNamespace(file)); From ff4fc13bd2994cee363ae7569052e6b9aea2a7d5 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Tue, 14 Mar 2017 09:27:50 +0100 Subject: [PATCH 049/186] regenerate code --- src/csharp/Grpc.Examples/MathGrpc.cs | 82 +++--- src/csharp/Grpc.HealthCheck/HealthGrpc.cs | 36 +-- .../Grpc.IntegrationTesting/MetricsGrpc.cs | 52 ++-- .../Grpc.IntegrationTesting/ServicesGrpc.cs | 142 +++++----- .../Grpc.IntegrationTesting/TestGrpc.cs | 250 +++++++++--------- src/csharp/Grpc.Reflection/ReflectionGrpc.cs | 30 +-- 6 files changed, 296 insertions(+), 296 deletions(-) diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs index 3364b8ce8ec..1f2e67d916d 100644 --- a/src/csharp/Grpc.Examples/MathGrpc.cs +++ b/src/csharp/Grpc.Examples/MathGrpc.cs @@ -35,41 +35,41 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Math { public static partial class Math { static readonly string __ServiceName = "math.Math"; - static readonly Marshaller __Marshaller_DivArgs = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.DivArgs.Parser.ParseFrom); - static readonly Marshaller __Marshaller_DivReply = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.DivReply.Parser.ParseFrom); - static readonly Marshaller __Marshaller_FibArgs = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.FibArgs.Parser.ParseFrom); - static readonly Marshaller __Marshaller_Num = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.Num.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_DivArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.DivArgs.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_DivReply = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.DivReply.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_FibArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.FibArgs.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_Num = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Math.Num.Parser.ParseFrom); - static readonly Method __Method_Div = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_Div = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "Div", __Marshaller_DivArgs, __Marshaller_DivReply); - static readonly Method __Method_DivMany = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_DivMany = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "DivMany", __Marshaller_DivArgs, __Marshaller_DivReply); - static readonly Method __Method_Fib = new Method( - MethodType.ServerStreaming, + static readonly grpc::Method __Method_Fib = new grpc::Method( + grpc::MethodType.ServerStreaming, __ServiceName, "Fib", __Marshaller_FibArgs, __Marshaller_Num); - static readonly Method __Method_Sum = new Method( - MethodType.ClientStreaming, + static readonly grpc::Method __Method_Sum = new grpc::Method( + grpc::MethodType.ClientStreaming, __ServiceName, "Sum", __Marshaller_Num, @@ -91,9 +91,9 @@ namespace Math { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task Div(global::Math.DivArgs request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Div(global::Math.DivArgs request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -106,9 +106,9 @@ namespace Math { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task DivMany(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task DivMany(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -120,9 +120,9 @@ namespace Math { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task Fib(global::Math.FibArgs request, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Fib(global::Math.FibArgs request, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -132,24 +132,24 @@ namespace Math { /// Used for reading requests from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task Sum(IAsyncStreamReader requestStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Sum(grpc::IAsyncStreamReader requestStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for Math - public partial class MathClient : ClientBase + public partial class MathClient : grpc::ClientBase { /// Creates a new client for Math /// The channel to use to make remote calls. - public MathClient(Channel channel) : base(channel) + public MathClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for Math that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public MathClient(CallInvoker callInvoker) : base(callInvoker) + public MathClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -171,9 +171,9 @@ namespace Math { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Math.DivReply Div(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Math.DivReply Div(global::Math.DivArgs request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Div(request, new CallOptions(headers, deadline, cancellationToken)); + return Div(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient @@ -182,7 +182,7 @@ namespace Math { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Math.DivReply Div(global::Math.DivArgs request, CallOptions options) + public virtual global::Math.DivReply Div(global::Math.DivArgs request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_Div, null, options, request); } @@ -195,9 +195,9 @@ namespace Math { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall DivAsync(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall DivAsync(global::Math.DivArgs request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return DivAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return DivAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Div divides DivArgs.dividend by DivArgs.divisor and returns the quotient @@ -206,7 +206,7 @@ namespace Math { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall DivAsync(global::Math.DivArgs request, CallOptions options) + public virtual grpc::AsyncUnaryCall DivAsync(global::Math.DivArgs request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_Div, null, options, request); } @@ -220,9 +220,9 @@ namespace Math { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall DivMany(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall DivMany(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return DivMany(new CallOptions(headers, deadline, cancellationToken)); + return DivMany(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// DivMany accepts an arbitrary number of division args from the client stream @@ -232,7 +232,7 @@ namespace Math { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall DivMany(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall DivMany(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_DivMany, null, options); } @@ -246,9 +246,9 @@ namespace Math { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncServerStreamingCall Fib(global::Math.FibArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncServerStreamingCall Fib(global::Math.FibArgs request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Fib(request, new CallOptions(headers, deadline, cancellationToken)); + return Fib(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Fib generates numbers in the Fibonacci sequence. If FibArgs.limit > 0, Fib @@ -258,7 +258,7 @@ namespace Math { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncServerStreamingCall Fib(global::Math.FibArgs request, CallOptions options) + public virtual grpc::AsyncServerStreamingCall Fib(global::Math.FibArgs request, grpc::CallOptions options) { return CallInvoker.AsyncServerStreamingCall(__Method_Fib, null, options, request); } @@ -270,9 +270,9 @@ namespace Math { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncClientStreamingCall Sum(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncClientStreamingCall Sum(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Sum(new CallOptions(headers, deadline, cancellationToken)); + return Sum(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Sum sums a stream of numbers, returning the final result once the stream @@ -280,7 +280,7 @@ namespace Math { /// /// The options for the call. /// The call object. - public virtual AsyncClientStreamingCall Sum(CallOptions options) + public virtual grpc::AsyncClientStreamingCall Sum(grpc::CallOptions options) { return CallInvoker.AsyncClientStreamingCall(__Method_Sum, null, options); } @@ -293,9 +293,9 @@ namespace Math { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(MathBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(MathBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_Div, serviceImpl.Div) .AddMethod(__Method_DivMany, serviceImpl.DivMany) .AddMethod(__Method_Fib, serviceImpl.Fib) diff --git a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs index 020c2df5657..d3115f3da16 100644 --- a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs +++ b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs @@ -35,18 +35,18 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Grpc.Health.V1 { public static partial class Health { static readonly string __ServiceName = "grpc.health.v1.Health"; - static readonly Marshaller __Marshaller_HealthCheckRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Health.V1.HealthCheckRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_HealthCheckResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Health.V1.HealthCheckResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_HealthCheckRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Health.V1.HealthCheckRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_HealthCheckResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Health.V1.HealthCheckResponse.Parser.ParseFrom); - static readonly Method __Method_Check = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_Check = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "Check", __Marshaller_HealthCheckRequest, @@ -61,24 +61,24 @@ namespace Grpc.Health.V1 { /// Base class for server-side implementations of Health public abstract partial class HealthBase { - public virtual global::System.Threading.Tasks.Task Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Check(global::Grpc.Health.V1.HealthCheckRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for Health - public partial class HealthClient : ClientBase + public partial class HealthClient : grpc::ClientBase { /// Creates a new client for Health /// The channel to use to make remote calls. - public HealthClient(Channel channel) : base(channel) + public HealthClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for Health that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public HealthClient(CallInvoker callInvoker) : base(callInvoker) + public HealthClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -91,19 +91,19 @@ namespace Grpc.Health.V1 { { } - public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Check(request, new CallOptions(headers, deadline, cancellationToken)); + return Check(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) + public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_Check, null, options, request); } - public virtual AsyncUnaryCall CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return CheckAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return CheckAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual AsyncUnaryCall CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_Check, null, options, request); } @@ -116,9 +116,9 @@ namespace Grpc.Health.V1 { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(HealthBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(HealthBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_Check, serviceImpl.Check).Build(); } diff --git a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs index 8b58622d530..c80ffa8cf67 100644 --- a/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/MetricsGrpc.cs @@ -41,26 +41,26 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Grpc.Testing { public static partial class MetricsService { static readonly string __ServiceName = "grpc.testing.MetricsService"; - static readonly Marshaller __Marshaller_EmptyMessage = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.EmptyMessage.Parser.ParseFrom); - static readonly Marshaller __Marshaller_GaugeResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.GaugeResponse.Parser.ParseFrom); - static readonly Marshaller __Marshaller_GaugeRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.GaugeRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_EmptyMessage = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.EmptyMessage.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_GaugeResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.GaugeResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_GaugeRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.GaugeRequest.Parser.ParseFrom); - static readonly Method __Method_GetAllGauges = new Method( - MethodType.ServerStreaming, + static readonly grpc::Method __Method_GetAllGauges = new grpc::Method( + grpc::MethodType.ServerStreaming, __ServiceName, "GetAllGauges", __Marshaller_EmptyMessage, __Marshaller_GaugeResponse); - static readonly Method __Method_GetGauge = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_GetGauge = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "GetGauge", __Marshaller_GaugeRequest, @@ -83,9 +83,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task GetAllGauges(global::Grpc.Testing.EmptyMessage request, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -94,24 +94,24 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task GetGauge(global::Grpc.Testing.GaugeRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task GetGauge(global::Grpc.Testing.GaugeRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for MetricsService - public partial class MetricsServiceClient : ClientBase + public partial class MetricsServiceClient : grpc::ClientBase { /// Creates a new client for MetricsService /// The channel to use to make remote calls. - public MetricsServiceClient(Channel channel) : base(channel) + public MetricsServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for MetricsService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public MetricsServiceClient(CallInvoker callInvoker) : base(callInvoker) + public MetricsServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -133,9 +133,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncServerStreamingCall GetAllGauges(global::Grpc.Testing.EmptyMessage request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncServerStreamingCall GetAllGauges(global::Grpc.Testing.EmptyMessage request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return GetAllGauges(request, new CallOptions(headers, deadline, cancellationToken)); + return GetAllGauges(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Returns the values of all the gauges that are currently being maintained by @@ -144,7 +144,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncServerStreamingCall GetAllGauges(global::Grpc.Testing.EmptyMessage request, CallOptions options) + public virtual grpc::AsyncServerStreamingCall GetAllGauges(global::Grpc.Testing.EmptyMessage request, grpc::CallOptions options) { return CallInvoker.AsyncServerStreamingCall(__Method_GetAllGauges, null, options, request); } @@ -156,9 +156,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.GaugeResponse GetGauge(global::Grpc.Testing.GaugeRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.GaugeResponse GetGauge(global::Grpc.Testing.GaugeRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return GetGauge(request, new CallOptions(headers, deadline, cancellationToken)); + return GetGauge(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Returns the value of one gauge @@ -166,7 +166,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.GaugeResponse GetGauge(global::Grpc.Testing.GaugeRequest request, CallOptions options) + public virtual global::Grpc.Testing.GaugeResponse GetGauge(global::Grpc.Testing.GaugeRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_GetGauge, null, options, request); } @@ -178,9 +178,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall GetGaugeAsync(global::Grpc.Testing.GaugeRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall GetGaugeAsync(global::Grpc.Testing.GaugeRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return GetGaugeAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return GetGaugeAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Returns the value of one gauge @@ -188,7 +188,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall GetGaugeAsync(global::Grpc.Testing.GaugeRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall GetGaugeAsync(global::Grpc.Testing.GaugeRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_GetGauge, null, options, request); } @@ -201,9 +201,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(MetricsServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(MetricsServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_GetAllGauges, serviceImpl.GetAllGauges) .AddMethod(__Method_GetGauge, serviceImpl.GetGauge).Build(); } diff --git a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs index 5135d9ab66d..bb95c8a549f 100644 --- a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs @@ -37,25 +37,25 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Grpc.Testing { public static partial class BenchmarkService { static readonly string __ServiceName = "grpc.testing.BenchmarkService"; - static readonly Marshaller __Marshaller_SimpleRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_SimpleResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_SimpleRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_SimpleResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleResponse.Parser.ParseFrom); - static readonly Method __Method_UnaryCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_UnaryCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "UnaryCall", __Marshaller_SimpleRequest, __Marshaller_SimpleResponse); - static readonly Method __Method_StreamingCall = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_StreamingCall = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "StreamingCall", __Marshaller_SimpleRequest, @@ -77,9 +77,9 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -90,24 +90,24 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task StreamingCall(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task StreamingCall(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for BenchmarkService - public partial class BenchmarkServiceClient : ClientBase + public partial class BenchmarkServiceClient : grpc::ClientBase { /// Creates a new client for BenchmarkService /// The channel to use to make remote calls. - public BenchmarkServiceClient(Channel channel) : base(channel) + public BenchmarkServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for BenchmarkService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public BenchmarkServiceClient(CallInvoker callInvoker) : base(callInvoker) + public BenchmarkServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -129,9 +129,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnaryCall(request, new CallOptions(headers, deadline, cancellationToken)); + return UnaryCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. @@ -140,7 +140,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_UnaryCall, null, options, request); } @@ -153,9 +153,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnaryCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return UnaryCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. @@ -164,7 +164,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_UnaryCall, null, options, request); } @@ -176,9 +176,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall StreamingCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall StreamingCall(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return StreamingCall(new CallOptions(headers, deadline, cancellationToken)); + return StreamingCall(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. @@ -186,7 +186,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall StreamingCall(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall StreamingCall(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_StreamingCall, null, options); } @@ -199,9 +199,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(BenchmarkServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(BenchmarkServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_UnaryCall, serviceImpl.UnaryCall) .AddMethod(__Method_StreamingCall, serviceImpl.StreamingCall).Build(); } @@ -211,37 +211,37 @@ namespace Grpc.Testing { { static readonly string __ServiceName = "grpc.testing.WorkerService"; - static readonly Marshaller __Marshaller_ServerArgs = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ServerArgs.Parser.ParseFrom); - static readonly Marshaller __Marshaller_ServerStatus = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ServerStatus.Parser.ParseFrom); - static readonly Marshaller __Marshaller_ClientArgs = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientArgs.Parser.ParseFrom); - static readonly Marshaller __Marshaller_ClientStatus = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientStatus.Parser.ParseFrom); - static readonly Marshaller __Marshaller_CoreRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_CoreResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreResponse.Parser.ParseFrom); - static readonly Marshaller __Marshaller_Void = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Void.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ServerArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ServerArgs.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ServerStatus = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ServerStatus.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ClientArgs = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientArgs.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ClientStatus = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientStatus.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_CoreRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_CoreResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_Void = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Void.Parser.ParseFrom); - static readonly Method __Method_RunServer = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_RunServer = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "RunServer", __Marshaller_ServerArgs, __Marshaller_ServerStatus); - static readonly Method __Method_RunClient = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_RunClient = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "RunClient", __Marshaller_ClientArgs, __Marshaller_ClientStatus); - static readonly Method __Method_CoreCount = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_CoreCount = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "CoreCount", __Marshaller_CoreRequest, __Marshaller_CoreResponse); - static readonly Method __Method_QuitWorker = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_QuitWorker = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "QuitWorker", __Marshaller_Void, @@ -268,9 +268,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task RunServer(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task RunServer(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -285,9 +285,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task RunClient(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task RunClient(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -296,9 +296,9 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task CoreCount(global::Grpc.Testing.CoreRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -307,24 +307,24 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task QuitWorker(global::Grpc.Testing.Void request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for WorkerService - public partial class WorkerServiceClient : ClientBase + public partial class WorkerServiceClient : grpc::ClientBase { /// Creates a new client for WorkerService /// The channel to use to make remote calls. - public WorkerServiceClient(Channel channel) : base(channel) + public WorkerServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for WorkerService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public WorkerServiceClient(CallInvoker callInvoker) : base(callInvoker) + public WorkerServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -349,9 +349,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall RunServer(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall RunServer(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return RunServer(new CallOptions(headers, deadline, cancellationToken)); + return RunServer(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Start server with specified workload. @@ -363,7 +363,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall RunServer(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall RunServer(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_RunServer, null, options); } @@ -379,9 +379,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall RunClient(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall RunClient(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return RunClient(new CallOptions(headers, deadline, cancellationToken)); + return RunClient(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Start client with specified workload. @@ -393,7 +393,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall RunClient(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall RunClient(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_RunClient, null, options); } @@ -405,9 +405,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return CoreCount(request, new CallOptions(headers, deadline, cancellationToken)); + return CoreCount(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Just return the core count - unary call @@ -415,7 +415,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, CallOptions options) + public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_CoreCount, null, options, request); } @@ -427,9 +427,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall CoreCountAsync(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall CoreCountAsync(global::Grpc.Testing.CoreRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return CoreCountAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return CoreCountAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Just return the core count - unary call @@ -437,7 +437,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall CoreCountAsync(global::Grpc.Testing.CoreRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall CoreCountAsync(global::Grpc.Testing.CoreRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_CoreCount, null, options, request); } @@ -449,9 +449,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return QuitWorker(request, new CallOptions(headers, deadline, cancellationToken)); + return QuitWorker(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Quit this worker @@ -459,7 +459,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, CallOptions options) + public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_QuitWorker, null, options, request); } @@ -471,9 +471,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall QuitWorkerAsync(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall QuitWorkerAsync(global::Grpc.Testing.Void request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return QuitWorkerAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return QuitWorkerAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// Quit this worker @@ -481,7 +481,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall QuitWorkerAsync(global::Grpc.Testing.Void request, CallOptions options) + public virtual grpc::AsyncUnaryCall QuitWorkerAsync(global::Grpc.Testing.Void request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_QuitWorker, null, options, request); } @@ -494,9 +494,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(WorkerServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(WorkerServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_RunServer, serviceImpl.RunServer) .AddMethod(__Method_RunClient, serviceImpl.RunClient) .AddMethod(__Method_CoreCount, serviceImpl.CoreCount) diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs index 0265f8e821e..77f76ebbe9c 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs @@ -38,7 +38,7 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Grpc.Testing { /// @@ -49,65 +49,65 @@ namespace Grpc.Testing { { static readonly string __ServiceName = "grpc.testing.TestService"; - static readonly Marshaller __Marshaller_Empty = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); - static readonly Marshaller __Marshaller_SimpleRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_SimpleResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleResponse.Parser.ParseFrom); - static readonly Marshaller __Marshaller_StreamingOutputCallRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingOutputCallRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_StreamingOutputCallResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingOutputCallResponse.Parser.ParseFrom); - static readonly Marshaller __Marshaller_StreamingInputCallRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingInputCallRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_StreamingInputCallResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingInputCallResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_Empty = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_SimpleRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_SimpleResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.SimpleResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_StreamingOutputCallRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingOutputCallRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_StreamingOutputCallResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingOutputCallResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_StreamingInputCallRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingInputCallRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_StreamingInputCallResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.StreamingInputCallResponse.Parser.ParseFrom); - static readonly Method __Method_EmptyCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_EmptyCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "EmptyCall", __Marshaller_Empty, __Marshaller_Empty); - static readonly Method __Method_UnaryCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_UnaryCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "UnaryCall", __Marshaller_SimpleRequest, __Marshaller_SimpleResponse); - static readonly Method __Method_CacheableUnaryCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_CacheableUnaryCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "CacheableUnaryCall", __Marshaller_SimpleRequest, __Marshaller_SimpleResponse); - static readonly Method __Method_StreamingOutputCall = new Method( - MethodType.ServerStreaming, + static readonly grpc::Method __Method_StreamingOutputCall = new grpc::Method( + grpc::MethodType.ServerStreaming, __ServiceName, "StreamingOutputCall", __Marshaller_StreamingOutputCallRequest, __Marshaller_StreamingOutputCallResponse); - static readonly Method __Method_StreamingInputCall = new Method( - MethodType.ClientStreaming, + static readonly grpc::Method __Method_StreamingInputCall = new grpc::Method( + grpc::MethodType.ClientStreaming, __ServiceName, "StreamingInputCall", __Marshaller_StreamingInputCallRequest, __Marshaller_StreamingInputCallResponse); - static readonly Method __Method_FullDuplexCall = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_FullDuplexCall = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "FullDuplexCall", __Marshaller_StreamingOutputCallRequest, __Marshaller_StreamingOutputCallResponse); - static readonly Method __Method_HalfDuplexCall = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_HalfDuplexCall = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "HalfDuplexCall", __Marshaller_StreamingOutputCallRequest, __Marshaller_StreamingOutputCallResponse); - static readonly Method __Method_UnimplementedCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_UnimplementedCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "UnimplementedCall", __Marshaller_Empty, @@ -128,9 +128,9 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task EmptyCall(global::Grpc.Testing.Empty request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -139,9 +139,9 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -152,9 +152,9 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -165,9 +165,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -177,9 +177,9 @@ namespace Grpc.Testing { /// Used for reading requests from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task StreamingInputCall(IAsyncStreamReader requestStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task StreamingInputCall(grpc::IAsyncStreamReader requestStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -191,9 +191,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task FullDuplexCall(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task FullDuplexCall(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -206,9 +206,9 @@ namespace Grpc.Testing { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task HalfDuplexCall(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task HalfDuplexCall(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } /// @@ -218,24 +218,24 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task UnimplementedCall(global::Grpc.Testing.Empty request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for TestService - public partial class TestServiceClient : ClientBase + public partial class TestServiceClient : grpc::ClientBase { /// Creates a new client for TestService /// The channel to use to make remote calls. - public TestServiceClient(Channel channel) : base(channel) + public TestServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for TestService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public TestServiceClient(CallInvoker callInvoker) : base(callInvoker) + public TestServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -256,9 +256,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return EmptyCall(request, new CallOptions(headers, deadline, cancellationToken)); + return EmptyCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One empty request followed by one empty response. @@ -266,7 +266,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_EmptyCall, null, options, request); } @@ -278,9 +278,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall EmptyCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall EmptyCallAsync(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return EmptyCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return EmptyCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One empty request followed by one empty response. @@ -288,7 +288,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall EmptyCallAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual grpc::AsyncUnaryCall EmptyCallAsync(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_EmptyCall, null, options, request); } @@ -300,9 +300,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnaryCall(request, new CallOptions(headers, deadline, cancellationToken)); + return UnaryCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. @@ -310,7 +310,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_UnaryCall, null, options, request); } @@ -322,9 +322,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnaryCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return UnaryCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. @@ -332,7 +332,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_UnaryCall, null, options, request); } @@ -346,9 +346,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.SimpleResponse CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return CacheableUnaryCall(request, new CallOptions(headers, deadline, cancellationToken)); + return CacheableUnaryCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. Response has cache control @@ -358,7 +358,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.SimpleResponse CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual global::Grpc.Testing.SimpleResponse CacheableUnaryCall(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_CacheableUnaryCall, null, options, request); } @@ -372,9 +372,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall CacheableUnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall CacheableUnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return CacheableUnaryCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return CacheableUnaryCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by one response. Response has cache control @@ -384,7 +384,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall CacheableUnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual grpc::AsyncUnaryCall CacheableUnaryCallAsync(global::Grpc.Testing.SimpleRequest request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_CacheableUnaryCall, null, options, request); } @@ -397,9 +397,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncServerStreamingCall StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncServerStreamingCall StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return StreamingOutputCall(request, new CallOptions(headers, deadline, cancellationToken)); + return StreamingOutputCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// One request followed by a sequence of responses (streamed download). @@ -408,7 +408,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncServerStreamingCall StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, CallOptions options) + public virtual grpc::AsyncServerStreamingCall StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, grpc::CallOptions options) { return CallInvoker.AsyncServerStreamingCall(__Method_StreamingOutputCall, null, options, request); } @@ -420,9 +420,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncClientStreamingCall StreamingInputCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncClientStreamingCall StreamingInputCall(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return StreamingInputCall(new CallOptions(headers, deadline, cancellationToken)); + return StreamingInputCall(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// A sequence of requests followed by one response (streamed upload). @@ -430,7 +430,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncClientStreamingCall StreamingInputCall(CallOptions options) + public virtual grpc::AsyncClientStreamingCall StreamingInputCall(grpc::CallOptions options) { return CallInvoker.AsyncClientStreamingCall(__Method_StreamingInputCall, null, options); } @@ -443,9 +443,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall FullDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall FullDuplexCall(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return FullDuplexCall(new CallOptions(headers, deadline, cancellationToken)); + return FullDuplexCall(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// A sequence of requests with each request served by the server immediately. @@ -454,7 +454,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall FullDuplexCall(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall FullDuplexCall(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_FullDuplexCall, null, options); } @@ -468,9 +468,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall HalfDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall HalfDuplexCall(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return HalfDuplexCall(new CallOptions(headers, deadline, cancellationToken)); + return HalfDuplexCall(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// A sequence of requests followed by a sequence of responses. @@ -480,7 +480,7 @@ namespace Grpc.Testing { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall HalfDuplexCall(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall HalfDuplexCall(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_HalfDuplexCall, null, options); } @@ -493,9 +493,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnimplementedCall(request, new CallOptions(headers, deadline, cancellationToken)); + return UnimplementedCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// The test server will not implement this method. It will be used @@ -504,7 +504,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_UnimplementedCall, null, options, request); } @@ -517,9 +517,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnimplementedCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return UnimplementedCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// The test server will not implement this method. It will be used @@ -528,7 +528,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual grpc::AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_UnimplementedCall, null, options, request); } @@ -541,9 +541,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(TestServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(TestServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_EmptyCall, serviceImpl.EmptyCall) .AddMethod(__Method_UnaryCall, serviceImpl.UnaryCall) .AddMethod(__Method_CacheableUnaryCall, serviceImpl.CacheableUnaryCall) @@ -563,10 +563,10 @@ namespace Grpc.Testing { { static readonly string __ServiceName = "grpc.testing.UnimplementedService"; - static readonly Marshaller __Marshaller_Empty = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_Empty = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); - static readonly Method __Method_UnimplementedCall = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_UnimplementedCall = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "UnimplementedCall", __Marshaller_Empty, @@ -587,24 +587,24 @@ namespace Grpc.Testing { /// The request received from the client. /// The context of the server-side call handler being invoked. /// The response to send back to the client (wrapped by a task). - public virtual global::System.Threading.Tasks.Task UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task UnimplementedCall(global::Grpc.Testing.Empty request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for UnimplementedService - public partial class UnimplementedServiceClient : ClientBase + public partial class UnimplementedServiceClient : grpc::ClientBase { /// Creates a new client for UnimplementedService /// The channel to use to make remote calls. - public UnimplementedServiceClient(Channel channel) : base(channel) + public UnimplementedServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for UnimplementedService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public UnimplementedServiceClient(CallInvoker callInvoker) : base(callInvoker) + public UnimplementedServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -625,9 +625,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnimplementedCall(request, new CallOptions(headers, deadline, cancellationToken)); + return UnimplementedCall(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// A call that no server should implement @@ -635,7 +635,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The response received from the server. - public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_UnimplementedCall, null, options, request); } @@ -647,9 +647,9 @@ namespace Grpc.Testing { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return UnimplementedCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return UnimplementedCallAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// A call that no server should implement @@ -657,7 +657,7 @@ namespace Grpc.Testing { /// The request to send to the server. /// The options for the call. /// The call object. - public virtual AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual grpc::AsyncUnaryCall UnimplementedCallAsync(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_UnimplementedCall, null, options, request); } @@ -670,9 +670,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(UnimplementedServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(UnimplementedServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_UnimplementedCall, serviceImpl.UnimplementedCall).Build(); } @@ -684,19 +684,19 @@ namespace Grpc.Testing { { static readonly string __ServiceName = "grpc.testing.ReconnectService"; - static readonly Marshaller __Marshaller_ReconnectParams = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ReconnectParams.Parser.ParseFrom); - static readonly Marshaller __Marshaller_Empty = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); - static readonly Marshaller __Marshaller_ReconnectInfo = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ReconnectInfo.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ReconnectParams = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ReconnectParams.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_Empty = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Empty.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ReconnectInfo = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ReconnectInfo.Parser.ParseFrom); - static readonly Method __Method_Start = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_Start = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "Start", __Marshaller_ReconnectParams, __Marshaller_Empty); - static readonly Method __Method_Stop = new Method( - MethodType.Unary, + static readonly grpc::Method __Method_Stop = new grpc::Method( + grpc::MethodType.Unary, __ServiceName, "Stop", __Marshaller_Empty, @@ -711,29 +711,29 @@ namespace Grpc.Testing { /// Base class for server-side implementations of ReconnectService public abstract partial class ReconnectServiceBase { - public virtual global::System.Threading.Tasks.Task Start(global::Grpc.Testing.ReconnectParams request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Start(global::Grpc.Testing.ReconnectParams request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } - public virtual global::System.Threading.Tasks.Task Stop(global::Grpc.Testing.Empty request, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task Stop(global::Grpc.Testing.Empty request, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for ReconnectService - public partial class ReconnectServiceClient : ClientBase + public partial class ReconnectServiceClient : grpc::ClientBase { /// Creates a new client for ReconnectService /// The channel to use to make remote calls. - public ReconnectServiceClient(Channel channel) : base(channel) + public ReconnectServiceClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for ReconnectService that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public ReconnectServiceClient(CallInvoker callInvoker) : base(callInvoker) + public ReconnectServiceClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -746,35 +746,35 @@ namespace Grpc.Testing { { } - public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.ReconnectParams request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.ReconnectParams request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Start(request, new CallOptions(headers, deadline, cancellationToken)); + return Start(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.ReconnectParams request, CallOptions options) + public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.ReconnectParams request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_Start, null, options, request); } - public virtual AsyncUnaryCall StartAsync(global::Grpc.Testing.ReconnectParams request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall StartAsync(global::Grpc.Testing.ReconnectParams request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return StartAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return StartAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual AsyncUnaryCall StartAsync(global::Grpc.Testing.ReconnectParams request, CallOptions options) + public virtual grpc::AsyncUnaryCall StartAsync(global::Grpc.Testing.ReconnectParams request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_Start, null, options, request); } - public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return Stop(request, new CallOptions(headers, deadline, cancellationToken)); + return Stop(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.BlockingUnaryCall(__Method_Stop, null, options, request); } - public virtual AsyncUnaryCall StopAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncUnaryCall StopAsync(global::Grpc.Testing.Empty request, grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return StopAsync(request, new CallOptions(headers, deadline, cancellationToken)); + return StopAsync(request, new grpc::CallOptions(headers, deadline, cancellationToken)); } - public virtual AsyncUnaryCall StopAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual grpc::AsyncUnaryCall StopAsync(global::Grpc.Testing.Empty request, grpc::CallOptions options) { return CallInvoker.AsyncUnaryCall(__Method_Stop, null, options, request); } @@ -787,9 +787,9 @@ namespace Grpc.Testing { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(ReconnectServiceBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(ReconnectServiceBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_Start, serviceImpl.Start) .AddMethod(__Method_Stop, serviceImpl.Stop).Build(); } diff --git a/src/csharp/Grpc.Reflection/ReflectionGrpc.cs b/src/csharp/Grpc.Reflection/ReflectionGrpc.cs index 5bd7558be58..45321587f58 100644 --- a/src/csharp/Grpc.Reflection/ReflectionGrpc.cs +++ b/src/csharp/Grpc.Reflection/ReflectionGrpc.cs @@ -37,18 +37,18 @@ using System; using System.Threading; using System.Threading.Tasks; -using Grpc.Core; +using grpc = global::Grpc.Core; namespace Grpc.Reflection.V1Alpha { public static partial class ServerReflection { static readonly string __ServiceName = "grpc.reflection.v1alpha.ServerReflection"; - static readonly Marshaller __Marshaller_ServerReflectionRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Reflection.V1Alpha.ServerReflectionRequest.Parser.ParseFrom); - static readonly Marshaller __Marshaller_ServerReflectionResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Reflection.V1Alpha.ServerReflectionResponse.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ServerReflectionRequest = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Reflection.V1Alpha.ServerReflectionRequest.Parser.ParseFrom); + static readonly grpc::Marshaller __Marshaller_ServerReflectionResponse = grpc::Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Reflection.V1Alpha.ServerReflectionResponse.Parser.ParseFrom); - static readonly Method __Method_ServerReflectionInfo = new Method( - MethodType.DuplexStreaming, + static readonly grpc::Method __Method_ServerReflectionInfo = new grpc::Method( + grpc::MethodType.DuplexStreaming, __ServiceName, "ServerReflectionInfo", __Marshaller_ServerReflectionRequest, @@ -71,24 +71,24 @@ namespace Grpc.Reflection.V1Alpha { /// Used for sending responses back to the client. /// The context of the server-side call handler being invoked. /// A task indicating completion of the handler. - public virtual global::System.Threading.Tasks.Task ServerReflectionInfo(IAsyncStreamReader requestStream, IServerStreamWriter responseStream, ServerCallContext context) + public virtual global::System.Threading.Tasks.Task ServerReflectionInfo(grpc::IAsyncStreamReader requestStream, grpc::IServerStreamWriter responseStream, grpc::ServerCallContext context) { - throw new RpcException(new Status(StatusCode.Unimplemented, "")); + throw new grpc::RpcException(new grpc::Status(grpc::StatusCode.Unimplemented, "")); } } /// Client for ServerReflection - public partial class ServerReflectionClient : ClientBase + public partial class ServerReflectionClient : grpc::ClientBase { /// Creates a new client for ServerReflection /// The channel to use to make remote calls. - public ServerReflectionClient(Channel channel) : base(channel) + public ServerReflectionClient(grpc::Channel channel) : base(channel) { } /// Creates a new client for ServerReflection that uses a custom CallInvoker. /// The callInvoker to use to make remote calls. - public ServerReflectionClient(CallInvoker callInvoker) : base(callInvoker) + public ServerReflectionClient(grpc::CallInvoker callInvoker) : base(callInvoker) { } /// Protected parameterless constructor to allow creation of test doubles. @@ -109,9 +109,9 @@ namespace Grpc.Reflection.V1Alpha { /// An optional deadline for the call. The call will be cancelled if deadline is hit. /// An optional token for canceling the call. /// The call object. - public virtual AsyncDuplexStreamingCall ServerReflectionInfo(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual grpc::AsyncDuplexStreamingCall ServerReflectionInfo(grpc::Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - return ServerReflectionInfo(new CallOptions(headers, deadline, cancellationToken)); + return ServerReflectionInfo(new grpc::CallOptions(headers, deadline, cancellationToken)); } /// /// The reflection service is structured as a bidirectional stream, ensuring @@ -119,7 +119,7 @@ namespace Grpc.Reflection.V1Alpha { /// /// The options for the call. /// The call object. - public virtual AsyncDuplexStreamingCall ServerReflectionInfo(CallOptions options) + public virtual grpc::AsyncDuplexStreamingCall ServerReflectionInfo(grpc::CallOptions options) { return CallInvoker.AsyncDuplexStreamingCall(__Method_ServerReflectionInfo, null, options); } @@ -132,9 +132,9 @@ namespace Grpc.Reflection.V1Alpha { /// Creates service definition that can be registered with a server /// An object implementing the server-side handling logic. - public static ServerServiceDefinition BindService(ServerReflectionBase serviceImpl) + public static grpc::ServerServiceDefinition BindService(ServerReflectionBase serviceImpl) { - return ServerServiceDefinition.CreateBuilder() + return grpc::ServerServiceDefinition.CreateBuilder() .AddMethod(__Method_ServerReflectionInfo, serviceImpl.ServerReflectionInfo).Build(); } From dd9b597bd7ba13b135bf0e5ae292a9ad38d7d856 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Mar 2017 07:39:45 -0700 Subject: [PATCH 050/186] UBSAN cleanup --- Makefile | 2 +- build.yaml | 6 +++--- tools/run_tests/generated/configs.json | 2 +- tools/ubsan_suppressions.txt | 7 +++++++ 4 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 tools/ubsan_suppressions.txt diff --git a/Makefile b/Makefile index 57e877beb01..addcc914b13 100644 --- a/Makefile +++ b/Makefile @@ -189,7 +189,7 @@ CC_ubsan = clang CXX_ubsan = clang++ LD_ubsan = clang LDXX_ubsan = clang++ -CPPFLAGS_ubsan = -O0 -fsanitize-coverage=edge -fsanitize=undefined,unsigned-integer-overflow -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs +CPPFLAGS_ubsan = -O0 -fsanitize-coverage=edge -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs LDFLAGS_ubsan = -fsanitize=undefined,unsigned-integer-overflow DEFINES_ubsan = NDEBUG diff --git a/build.yaml b/build.yaml index 9ff37d59e17..321a8ac381d 100644 --- a/build.yaml +++ b/build.yaml @@ -4090,8 +4090,8 @@ configs: TSAN_OPTIONS: suppressions=tools/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1 ubsan: CC: clang - CPPFLAGS: -O0 -fsanitize-coverage=edge -fsanitize=undefined,unsigned-integer-overflow - -fno-omit-frame-pointer -Wno-unused-command-line-argument -Wvarargs + CPPFLAGS: -O0 -fsanitize-coverage=edge -fsanitize=undefined -fno-omit-frame-pointer + -Wno-unused-command-line-argument -Wvarargs CXX: clang++ DEFINES: NDEBUG LD: clang @@ -4099,7 +4099,7 @@ configs: LDXX: clang++ compile_the_world: true test_environ: - UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1 + UBSAN_OPTIONS: halt_on_error=1:print_stacktrace=1:suppressions=tools/ubsan_suppressions.txt defaults: benchmark: CPPFLAGS: -Ithird_party/benchmark/include -DHAVE_POSIX_REGEX diff --git a/tools/run_tests/generated/configs.json b/tools/run_tests/generated/configs.json index 9173bd7c19c..69e0f447743 100644 --- a/tools/run_tests/generated/configs.json +++ b/tools/run_tests/generated/configs.json @@ -58,7 +58,7 @@ { "config": "ubsan", "environ": { - "UBSAN_OPTIONS": "halt_on_error=1:print_stacktrace=1" + "UBSAN_OPTIONS": "halt_on_error=1:print_stacktrace=1:suppressions=tools/ubsan_suppressions.txt" } }, { diff --git a/tools/ubsan_suppressions.txt b/tools/ubsan_suppressions.txt new file mode 100644 index 00000000000..9869f98a22e --- /dev/null +++ b/tools/ubsan_suppressions.txt @@ -0,0 +1,7 @@ +# boringssl stuff +nonnull-attribute:bn_wexpand +nonnull-attribute:CBB_add_bytes +nonnull-attribute:rsa_blinding_get +nonnull-attribute:ssl_copy_key_material +alignment:CRYPTO_cbc128_encrypt + From ff23f801c5fbb67d42b70c4ba0ba28ae2a7d31ae Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Mar 2017 07:50:56 -0700 Subject: [PATCH 051/186] Fix crash --- test/cpp/microbenchmarks/bm_arena.cc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/cpp/microbenchmarks/bm_arena.cc b/test/cpp/microbenchmarks/bm_arena.cc index 33e073f7495..770c0b6d474 100644 --- a/test/cpp/microbenchmarks/bm_arena.cc +++ b/test/cpp/microbenchmarks/bm_arena.cc @@ -48,8 +48,15 @@ BENCHMARK(BM_Arena_NoOp)->Range(1, 1024 * 1024); static void BM_Arena_ManyAlloc(benchmark::State& state) { gpr_arena* a = gpr_arena_create(state.range(0)); + const size_t realloc_after = + 1024 * 1024 * 1024 / ((state.range(1) + 15) & 0xffffff0u); while (state.KeepRunning()) { gpr_arena_alloc(a, state.range(1)); + // periodically recreate arena to avoid OOM + if (state.iterations() % realloc_after == 0) { + gpr_arena_destroy(a); + a = gpr_arena_create(state.range(0)); + } } gpr_arena_destroy(a); } From a6bec8fc3159b54fc447a029b6260b3d6c478e6b Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Mar 2017 08:26:04 -0700 Subject: [PATCH 052/186] Auto-call-arena-sizing --- src/core/lib/support/arena.c | 1 + src/core/lib/surface/call.c | 6 ++++-- src/core/lib/surface/channel.c | 32 ++++++++++++++++++++++++++++++++ src/core/lib/surface/channel.h | 3 +++ 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index 6610acd3a07..8ce29aaab34 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -53,6 +53,7 @@ struct gpr_arena { gpr_arena *gpr_arena_create(size_t initial_size) { initial_size = ROUND_UP_TO_ALIGNMENT_SIZE(initial_size); + gpr_log(GPR_DEBUG, "arena create: %" PRIdPTR, initial_size); gpr_arena *a = gpr_zalloc(sizeof(gpr_arena) + initial_size); a->initial_zone.size_end = initial_size; return a; diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 84c401db35a..00719be9abc 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -277,7 +277,8 @@ grpc_error *grpc_call_create(grpc_exec_ctx *exec_ctx, grpc_channel_get_channel_stack(args->channel); grpc_call *call; GPR_TIMER_BEGIN("grpc_call_create", 0); - gpr_arena *arena = gpr_arena_create(8192); + gpr_arena *arena = + gpr_arena_create(grpc_channel_get_call_size_estimate(args->channel)); call = gpr_arena_alloc(arena, sizeof(grpc_call) + channel_stack->call_stack_size); call->arena = arena; @@ -436,8 +437,9 @@ void grpc_call_internal_unref(grpc_exec_ctx *exec_ctx, grpc_call *c REF_ARG) { static void release_call(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { grpc_call *c = call; + grpc_channel_update_call_size_estimate(c->channel, + gpr_arena_destroy(c->arena)); GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->channel, "call"); - gpr_arena_destroy(c->arena); } static void set_status_value_directly(grpc_status_code status, void *dest); diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c index d6acd392c1a..56beb7d96e6 100644 --- a/src/core/lib/surface/channel.c +++ b/src/core/lib/surface/channel.c @@ -68,6 +68,8 @@ struct grpc_channel { grpc_compression_options compression_options; grpc_mdelem default_authority; + gpr_atm call_size_estimate; + gpr_mu registered_call_mu; registered_call *registered_calls; @@ -115,6 +117,10 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, gpr_mu_init(&channel->registered_call_mu); channel->registered_calls = NULL; + gpr_atm_no_barrier_store( + &channel->call_size_estimate, + CHANNEL_STACK_FROM_CHANNEL(channel)->call_stack_size); + grpc_compression_options_init(&channel->compression_options); for (size_t i = 0; i < args->num_args; i++) { if (0 == strcmp(args->args[i].key, GRPC_ARG_DEFAULT_AUTHORITY)) { @@ -177,6 +183,32 @@ done: return channel; } +size_t grpc_channel_get_call_size_estimate(grpc_channel *channel) { +#define ROUND_UP_SIZE 256 + return ((size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate) + + ROUND_UP_SIZE) & + ~(size_t)(ROUND_UP_SIZE - 1); +} + +void grpc_channel_update_call_size_estimate(grpc_channel *channel, + size_t size) { + size_t cur = (size_t)gpr_atm_no_barrier_load(&channel->call_size_estimate); + if (cur < size) { + /* size grew: update estimate */ + gpr_atm_no_barrier_cas(&channel->call_size_estimate, (gpr_atm)cur, + (gpr_atm)size); + /* if we lose: never mind, something else will likely update soon enough */ + } else if (cur == size) { + /* no change: holding pattern */ + } else if (cur > 0) { + /* size shrank: decrease estimate */ + gpr_atm_no_barrier_cas( + &channel->call_size_estimate, (gpr_atm)cur, + (gpr_atm)(GPR_MIN(cur - 1, (255 * cur + size) / 256))); + /* if we lose: never mind, something else will likely update soon enough */ + } +} + char *grpc_channel_get_target(grpc_channel *channel) { GRPC_API_TRACE("grpc_channel_get_target(channel=%p)", 1, (channel)); return gpr_strdup(channel->target); diff --git a/src/core/lib/surface/channel.h b/src/core/lib/surface/channel.h index 3a441d7adde..c4aebd8b9be 100644 --- a/src/core/lib/surface/channel.h +++ b/src/core/lib/surface/channel.h @@ -66,6 +66,9 @@ grpc_mdelem grpc_channel_get_reffed_status_elem(grpc_exec_ctx *exec_ctx, grpc_channel *channel, int status_code); +size_t grpc_channel_get_call_size_estimate(grpc_channel *channel); +void grpc_channel_update_call_size_estimate(grpc_channel *channel, size_t size); + #ifdef GRPC_STREAM_REFCOUNT_DEBUG void grpc_channel_internal_ref(grpc_channel *channel, const char *reason); void grpc_channel_internal_unref(grpc_exec_ctx *exec_ctx, grpc_channel *channel, From fb9d11204388b524b942950b47fef24116eab243 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Mar 2017 09:26:27 -0700 Subject: [PATCH 053/186] Review comments --- src/core/ext/client_channel/client_channel.c | 4 ++-- src/core/ext/client_channel/subchannel.c | 14 +++++++------- .../transport/chttp2/transport/incoming_metadata.c | 2 +- src/core/lib/support/arena.c | 1 - test/core/channel/channel_stack_test.c | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index f6550292a0a..ba842c79162 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -755,7 +755,7 @@ static void subchannel_ready_locked(grpc_exec_ctx *exec_ctx, void *arg, } else { /* Create call on subchannel. */ grpc_subchannel_call *subchannel_call = NULL; - grpc_connected_subchannel_call_args call_args = { + const grpc_connected_subchannel_call_args call_args = { .pollent = calld->pollent, .path = calld->path, .start_time = calld->call_start_time, @@ -988,7 +988,7 @@ static void start_transport_stream_op_locked_inner(grpc_exec_ctx *exec_ctx, if (calld->creation_phase == GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING && calld->connected_subchannel != NULL) { grpc_subchannel_call *subchannel_call = NULL; - grpc_connected_subchannel_call_args call_args = { + const grpc_connected_subchannel_call_args call_args = { .pollent = calld->pollent, .path = calld->path, .start_time = calld->call_start_time, diff --git a/src/core/ext/client_channel/subchannel.c b/src/core/ext/client_channel/subchannel.c index e4b669c5828..cef08a04ea9 100644 --- a/src/core/ext/client_channel/subchannel.c +++ b/src/core/ext/client_channel/subchannel.c @@ -778,13 +778,13 @@ grpc_error *grpc_connected_subchannel_create_call( args->arena, sizeof(grpc_subchannel_call) + chanstk->call_stack_size); grpc_call_stack *callstk = SUBCHANNEL_CALL_TO_CALL_STACK(*call); (*call)->connection = con; // Ref is added below. - grpc_call_element_args call_args = {.call_stack = callstk, - .server_transport_data = NULL, - .context = NULL, - .path = args->path, - .start_time = args->start_time, - .deadline = args->deadline, - .arena = args->arena}; + const grpc_call_element_args call_args = {.call_stack = callstk, + .server_transport_data = NULL, + .context = NULL, + .path = args->path, + .start_time = args->start_time, + .deadline = args->deadline, + .arena = args->arena}; grpc_error *error = grpc_call_stack_init( exec_ctx, chanstk, 1, subchannel_call_destroy, *call, &call_args); if (error != GRPC_ERROR_NONE) { diff --git a/src/core/ext/transport/chttp2/transport/incoming_metadata.c b/src/core/ext/transport/chttp2/transport/incoming_metadata.c index ab900fdff26..da0a34d32a0 100644 --- a/src/core/ext/transport/chttp2/transport/incoming_metadata.c +++ b/src/core/ext/transport/chttp2/transport/incoming_metadata.c @@ -42,8 +42,8 @@ void grpc_chttp2_incoming_metadata_buffer_init( grpc_chttp2_incoming_metadata_buffer *buffer, gpr_arena *arena) { - grpc_metadata_batch_init(&buffer->batch); buffer->arena = arena; + grpc_metadata_batch_init(&buffer->batch); buffer->batch.deadline = gpr_inf_future(GPR_CLOCK_REALTIME); } diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index 8ce29aaab34..6610acd3a07 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -53,7 +53,6 @@ struct gpr_arena { gpr_arena *gpr_arena_create(size_t initial_size) { initial_size = ROUND_UP_TO_ALIGNMENT_SIZE(initial_size); - gpr_log(GPR_DEBUG, "arena create: %" PRIdPTR, initial_size); gpr_arena *a = gpr_zalloc(sizeof(gpr_arena) + initial_size); a->initial_zone.size_end = initial_size; return a; diff --git a/test/core/channel/channel_stack_test.c b/test/core/channel/channel_stack_test.c index 0c424c1ec48..af551c4928e 100644 --- a/test/core/channel/channel_stack_test.c +++ b/test/core/channel/channel_stack_test.c @@ -139,7 +139,7 @@ static void test_create_channel_stack(void) { GPR_ASSERT(*channel_data == 0); call_stack = gpr_malloc(channel_stack->call_stack_size); - grpc_call_element_args args = { + const grpc_call_element_args args = { .call_stack = call_stack, .server_transport_data = NULL, .context = NULL, From d26250be35a0e0921cb97f43b13ce14343ee4c7d Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 14 Mar 2017 11:01:52 -0700 Subject: [PATCH 054/186] Get growth right --- src/core/lib/support/arena.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/lib/support/arena.c b/src/core/lib/support/arena.c index 6610acd3a07..7bcb983f245 100644 --- a/src/core/lib/support/arena.c +++ b/src/core/lib/support/arena.c @@ -78,8 +78,7 @@ void *gpr_arena_alloc(gpr_arena *arena, size_t size) { while (start > z->size_end) { zone *next_z = (zone *)gpr_atm_acq_load(&z->next_atm); if (next_z == NULL) { - size_t next_z_size = - GPR_MAX((size_t)gpr_atm_no_barrier_load(&arena->size_so_far), size); + size_t next_z_size = (size_t)gpr_atm_no_barrier_load(&arena->size_so_far); next_z = gpr_zalloc(sizeof(zone) + next_z_size); next_z->size_begin = z->size_end; next_z->size_end = z->size_end + next_z_size; From d8cbead37b049d5bfd583dd8e0b36a708e5fe405 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Tue, 14 Mar 2017 11:05:24 -0700 Subject: [PATCH 055/186] Updated version number in BUILD --- BUILD | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/BUILD b/BUILD index ca0a1c56076..585c26ad1c5 100644 --- a/BUILD +++ b/BUILD @@ -37,11 +37,11 @@ package(default_visibility = ["//visibility:public"]) load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_proto_plugin") -g_stands_for = "good" +g_stands_for = "green" -core_version = "2.0.0-dev" +core_version = "3.0.0-dev" -version = "1.1.0-dev" +version = "1.2.0-pre1" grpc_cc_library( name = "gpr", From aaef11aa298c9b760fa7a634ce6a1be1ed8d6595 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Tue, 14 Mar 2017 11:19:25 -0700 Subject: [PATCH 056/186] Drop support for io.js, fix minor issue with node extension --- package.json | 2 +- src/node/ext/server_uv.cc | 2 +- templates/package.json.template | 2 +- tools/run_tests/artifacts/build_artifact_node.bat | 2 +- tools/run_tests/artifacts/build_artifact_node.sh | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 2228884816f..588425d0e04 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "poisson-process": "^0.2.1" }, "engines": { - "node": ">=1.1.0" + "node": ">=4" }, "binary": { "module_name": "grpc_node", diff --git a/src/node/ext/server_uv.cc b/src/node/ext/server_uv.cc index bf8b609a63f..c5e5ca9f42d 100644 --- a/src/node/ext/server_uv.cc +++ b/src/node/ext/server_uv.cc @@ -47,12 +47,12 @@ namespace grpc { namespace node { using Nan::Callback; +using Nan::MaybeLocal; using v8::External; using v8::Function; using v8::FunctionTemplate; using v8::Local; -using v8::MaybeLocal; using v8::Object; using v8::Value; diff --git a/templates/package.json.template b/templates/package.json.template index 316c28e478e..272a17562fb 100644 --- a/templates/package.json.template +++ b/templates/package.json.template @@ -54,7 +54,7 @@ "poisson-process": "^0.2.1" }, "engines": { - "node": ">=1.1.0" + "node": ">=4" }, "binary": { "module_name": "grpc_node", diff --git a/tools/run_tests/artifacts/build_artifact_node.bat b/tools/run_tests/artifacts/build_artifact_node.bat index 0a2bc4b9d7d..336a63b9f56 100644 --- a/tools/run_tests/artifacts/build_artifact_node.bat +++ b/tools/run_tests/artifacts/build_artifact_node.bat @@ -27,7 +27,7 @@ @rem (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE @rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -set node_versions=1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 6.0.0 7.0.0 +set node_versions=4.0.0 5.0.0 6.0.0 7.0.0 set electron_versions=1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 diff --git a/tools/run_tests/artifacts/build_artifact_node.sh b/tools/run_tests/artifacts/build_artifact_node.sh index 47b1f339fb8..a33ab45ac21 100755 --- a/tools/run_tests/artifacts/build_artifact_node.sh +++ b/tools/run_tests/artifacts/build_artifact_node.sh @@ -42,7 +42,7 @@ mkdir -p artifacts npm update -node_versions=( 1.1.0 2.0.0 3.0.0 4.0.0 5.0.0 6.0.0 7.0.0 ) +node_versions=( 4.0.0 5.0.0 6.0.0 7.0.0 ) electron_versions=( 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 ) From 4564b8cde72f74b88ec2ddf4943768e809dff94b Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 14 Mar 2017 01:21:57 -0700 Subject: [PATCH 057/186] Copy value at SetPointerWithVtable --- src/cpp/common/channel_arguments.cc | 4 +++- test/cpp/common/channel_arguments_test.cc | 7 ------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc index 34fd4491d0a..eddcacc3325 100644 --- a/src/cpp/common/channel_arguments.cc +++ b/src/cpp/common/channel_arguments.cc @@ -111,8 +111,10 @@ void ChannelArguments::SetSocketMutator(grpc_socket_mutator* mutator) { for (auto it = args_.begin(); it != args_.end(); ++it) { if (it->type == mutator_arg.type && grpc::string(it->key) == grpc::string(mutator_arg.key)) { + GPR_ASSERT(!replaced); it->value.pointer.vtable->destroy(&exec_ctx, it->value.pointer.p); it->value.pointer = mutator_arg.value.pointer; + replaced = true; } } grpc_exec_ctx_finish(&exec_ctx); @@ -195,7 +197,7 @@ void ChannelArguments::SetPointerWithVtable( arg.type = GRPC_ARG_POINTER; strings_.push_back(key); arg.key = const_cast(strings_.back().c_str()); - arg.value.pointer.p = value; + arg.value.pointer.p = vtable->copy(value); arg.value.pointer.vtable = vtable; args_.push_back(arg); } diff --git a/test/cpp/common/channel_arguments_test.cc b/test/cpp/common/channel_arguments_test.cc index 190d32ce060..9bcc9f99f68 100644 --- a/test/cpp/common/channel_arguments_test.cc +++ b/test/cpp/common/channel_arguments_test.cc @@ -230,13 +230,6 @@ TEST_F(ChannelArgumentsTest, SetSocketMutator) { EXPECT_TRUE(HasArg(arg1)); // arg0 is replaced by arg1 EXPECT_FALSE(HasArg(arg0)); - - // arg0 is destroyed by grpc_socket_mutator_to_arg(mutator1) - { - grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - arg1.value.pointer.vtable->destroy(&exec_ctx, arg1.value.pointer.p); - grpc_exec_ctx_finish(&exec_ctx); - } } TEST_F(ChannelArgumentsTest, SetUserAgentPrefix) { From fcad5799b4c785d428ed30340d79581a5d97026c Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 14 Mar 2017 12:26:17 -0700 Subject: [PATCH 058/186] in the middle of fixing watch and get connectivity state to work with new changes --- src/ruby/ext/grpc/rb_channel.c | 113 +++++++++++++++-------- src/ruby/spec/channel_connection_spec.rb | 49 ++++++++++ 2 files changed, 121 insertions(+), 41 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 2489ec2fefc..8cd489345dd 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -76,8 +76,10 @@ typedef struct grpc_rb_channel { grpc_completion_queue *queue; int request_safe_destroy; int safe_to_destroy; - gpr_mu safe_destroy_mu; - gpr_cv safe_destroy_cv; + grpc_connectivity_state current_connectivity_state; + + gpr_mu channel_mu; + gpr_cv channel_cv; } grpc_rb_channel; /* Forward declarations of functions involved in temporary fix to @@ -180,12 +182,19 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { GPR_ASSERT(ch); wrapper->wrapped = ch; - gpr_mu_init(&wrapper->safe_destroy_mu); - gpr_cv_init(&wrapper->safe_destroy_cv); - gpr_mu_lock(&wrapper->safe_destroy_mu); + + gpr_mu_init(&wrapper->channel_mu); + gpr_cv_init(&wrapper->channel_cv); + + gpr_mu_lock(&wrapper->channel_mu); + wrapper->current_connectivity_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); + gpr_cv_signal(&wrapper->channel_cv); + gpr_mu_unlock(&wrapper->channel_mu); + + gpr_mu_lock(&wrapper->channel_mu); wrapper->safe_to_destroy = 0; wrapper->request_safe_destroy = 0; - gpr_mu_unlock(&wrapper->safe_destroy_mu); + gpr_mu_unlock(&wrapper->channel_mu); grpc_rb_channel_try_register_connection_polling(wrapper); if (args.args != NULL) { @@ -232,43 +241,57 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, grpc_channel_check_connectivity_state(ch, grpc_try_to_connect)); } -/* Watch for a change in connectivity state. - - Once the channel connectivity state is different from the last observed - state, tag will be enqueued on cq with success=1 - - If deadline expires BEFORE the state is changed, tag will be enqueued on - the completion queue with success=0 */ +/* Wait until the channel's connectivity state becomes different from + * "last_state", or "deadline" expires. + * Returns true if the the channel's connectivity state becomes + * different from "last_state" within "deadline". + * Returns false if "deadline" expires before the channel's connectivity + * state changes from "last_state". + * */ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, VALUE last_state, VALUE deadline) { grpc_rb_channel *wrapper = NULL; - grpc_channel *ch = NULL; - grpc_completion_queue *cq = NULL; - - void *tag = wrapper; - - grpc_event event; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); - ch = wrapper->wrapped; - cq = wrapper->queue; - if (ch == NULL) { + + if (wrapper->wrapped == NULL) { rb_raise(rb_eRuntimeError, "closed!"); return Qnil; } - grpc_channel_watch_connectivity_state( - ch, (grpc_connectivity_state)NUM2LONG(last_state), - grpc_rb_time_timeval(deadline, /* absolute time */ 0), cq, tag); - event = rb_completion_queue_pluck(cq, tag, gpr_inf_future(GPR_CLOCK_REALTIME), - NULL); + if (!FIXNUM_P(last_state)) { + rb_raise(rb_eTypeError, "bad type for last_state. want a GRPC::Core::ChannelState constant"); + return Qnil; + } - if (event.success) { + gpr_mu_lock(&wrapper->channel_mu); + if (wrapper->current_connectivity_state != NUM2LONG(last_state)) { + gpr_mu_unlock(&wrapper->channel_mu); return Qtrue; - } else { + } + if (wrapper->request_safe_destroy) { + gpr_mu_unlock(&wrapper->channel_mu); + rb_raise(rb_eRuntimeError, "watch_connectivity_state called on closed channel"); + return Qfalse; + } + if (wrapper->safe_to_destroy) { + gpr_mu_unlock(&wrapper->channel_mu); + gpr_log(GPR_DEBUG, "GRPC_RUBY_RB_CHANNEL: attempt to watch_connectivity_state on a non-state-polled channel"); + return Qfalse; + } + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, grpc_rb_time_timeval(deadline, /* absolute time */ 0)); + if (wrapper->request_safe_destroy) { + gpr_mu_unlock(&wrapper->channel_mu); + rb_raise(rb_eRuntimeError, "channel closed during call to watch_connectivity_state"); return Qfalse; } + if (wrapper->current_connectivity_state != NUM2LONG(last_state)) { + gpr_mu_unlock(&wrapper->channel_mu); + return Qtrue; + } + gpr_mu_unlock(&wrapper->channel_mu); + return Qfalse; } /* Create a call given a grpc_channel, in order to call method. The request @@ -378,40 +401,47 @@ static void grpc_rb_channel_try_register_connection_polling( GPR_ASSERT(wrapper); GPR_ASSERT(wrapper->wrapped); - gpr_mu_lock(&wrapper->safe_destroy_mu); + gpr_mu_lock(&wrapper->channel_mu); if (wrapper->request_safe_destroy) { wrapper->safe_to_destroy = 1; - gpr_cv_signal(&wrapper->safe_destroy_cv); - gpr_mu_unlock(&wrapper->safe_destroy_mu); + gpr_cv_signal(&wrapper->channel_cv); + gpr_mu_unlock(&wrapper->channel_mu); return; } gpr_mu_lock(&channel_polling_mu); + + gpr_mu_lock(&wrapper->channel_mu); conn_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); + if (conn_state != wrapper->current_connectivity_state) { + wrapper->current_connectivity_state = conn_state; + gpr_cv_signal(&wrapper->channel_cv); + } // avoid posting work to the channel polling cq if it's been shutdown if (!abort_channel_polling && conn_state != GRPC_CHANNEL_SHUTDOWN) { grpc_channel_watch_connectivity_state( wrapper->wrapped, conn_state, sleep_time, channel_polling_cq, wrapper); } else { wrapper->safe_to_destroy = 1; - gpr_cv_signal(&wrapper->safe_destroy_cv); + gpr_cv_signal(&wrapper->channel_cv); } + gpr_mu_unlock(&wrapper->channel_mu); gpr_mu_unlock(&channel_polling_mu); - gpr_mu_unlock(&wrapper->safe_destroy_mu); + gpr_mu_unlock(&wrapper->channel_mu); } -// Note requires wrapper->wrapped, wrapper->safe_destroy_mu/cv initialized +// Note requires wrapper->wrapped, wrapper->channel_mu/cv initialized static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { - gpr_mu_lock(&wrapper->safe_destroy_mu); + gpr_mu_lock(&wrapper->channel_mu); while (!wrapper->safe_to_destroy) { wrapper->request_safe_destroy = 1; - gpr_cv_wait(&wrapper->safe_destroy_cv, &wrapper->safe_destroy_mu, + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, gpr_inf_future(GPR_CLOCK_REALTIME)); } GPR_ASSERT(wrapper->safe_to_destroy); - gpr_mu_unlock(&wrapper->safe_destroy_mu); + gpr_mu_unlock(&wrapper->channel_mu); - gpr_mu_destroy(&wrapper->safe_destroy_mu); - gpr_cv_destroy(&wrapper->safe_destroy_cv); + gpr_mu_destroy(&wrapper->channel_mu); + gpr_cv_destroy(&wrapper->channel_cv); grpc_channel_destroy(wrapper->wrapped); } @@ -434,6 +464,7 @@ static void *run_poll_channels_loop_no_gil(void *arg) { } if (event.type == GRPC_OP_COMPLETE) { wrapper = (grpc_rb_channel *)event.tag; + grpc_rb_channel_try_register_connection_polling(wrapper); } } @@ -524,7 +555,7 @@ void Init_grpc_channel() { rb_define_method(grpc_rb_cChannel, "connectivity_state", grpc_rb_channel_get_connectivity_state, -1); rb_define_method(grpc_rb_cChannel, "watch_connectivity_state", - grpc_rb_channel_watch_connectivity_state, 4); + grpc_rb_channel_watch_connectivity_state, 2); rb_define_method(grpc_rb_cChannel, "create_call", grpc_rb_channel_create_call, 5); rb_define_method(grpc_rb_cChannel, "target", grpc_rb_channel_get_target, 0); diff --git a/src/ruby/spec/channel_connection_spec.rb b/src/ruby/spec/channel_connection_spec.rb index 58ab37d7bc7..d8e10f7b761 100644 --- a/src/ruby/spec/channel_connection_spec.rb +++ b/src/ruby/spec/channel_connection_spec.rb @@ -90,4 +90,53 @@ describe 'channel connection behavior' do expect(stub.an_rpc(req)).to be_a(EchoMsg) stop_server end + + it 'observably connects and reconnects to transient server when using the channel state API', trial: true do + port = start_server + ch = GRPC::Core::Channel.new("localhost:#{port}", {}, :this_channel_is_insecure) + + expect(ch.connectivity_state).to be(GRPC::Core::ConnectivityStates::IDLE) + + state = ch.connectivity_state(true) + + count = 0 + while count < 20 and state != GRPC::Core::ConnectivityStates::READY do + STDERR.puts "first round of waiting for state to become READY" + ch.watch_connectivity_state(state, Time.now + 60) + state = ch.connectivity_state(true) + count += 1 + end + + expect(state).to be(GRPC::Core::ConnectivityStates::READY) + + stop_server + + state = ch.connectivity_state + + count = 0 + while count < 20 and state == GRPC::Core::ConnectivityStates::READY do + STDERR.puts "server shut down. waiting for state to not be READY" + ch.watch_connectivity_state(state, Time.now + 60) + state = ch.connectivity_state + count += 1 + end + + expect(state).to_not be(GRPC::Core::ConnectivityStates::READY) + + start_server(port) + + state = ch.connectivity_state(true) + + count = 0 + while count < 20 and state != GRPC::Core::ConnectivityStates::READY do + STDERR.puts "second round of waiting for state to become READY" + ch.watch_connectivity_state(state, Time.now + 60) + state = ch.connectivity_state(true) + count += 1 + end + + expect(state).to be(GRPC::Core::ConnectivityStates::READY) + + stop_server + end end From 58796c8589d3a805032599ab8bf40a48360be091 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Tue, 14 Mar 2017 20:58:24 +0100 Subject: [PATCH 059/186] G stands for... --- build.yaml | 2 +- src/core/lib/surface/version.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.yaml b/build.yaml index 7c43df32502..2c0f6db1adb 100644 --- a/build.yaml +++ b/build.yaml @@ -13,7 +13,7 @@ settings: '#09': Per-language overrides are possible with (eg) ruby_version tag here '#10': See the expand_version.py for all the quirks here core_version: 3.0.0-dev - g_stands_for: green + g_stands_for: gentle version: 1.3.0-dev filegroups: - name: census diff --git a/src/core/lib/surface/version.c b/src/core/lib/surface/version.c index 1143a9e044e..ba80bd801ee 100644 --- a/src/core/lib/surface/version.c +++ b/src/core/lib/surface/version.c @@ -38,4 +38,4 @@ const char *grpc_version_string(void) { return "3.0.0-dev"; } -const char *grpc_g_stands_for(void) { return "green"; } +const char *grpc_g_stands_for(void) { return "gentle"; } From 62e9596c614b5570d6a8811851aec12faf6a30fc Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 14 Mar 2017 13:00:11 -0700 Subject: [PATCH 060/186] Advance ProtoCompiler version --- src/objective-c/!ProtoCompiler.podspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/objective-c/!ProtoCompiler.podspec b/src/objective-c/!ProtoCompiler.podspec index dc4d8e964e6..2e9b944f33d 100644 --- a/src/objective-c/!ProtoCompiler.podspec +++ b/src/objective-c/!ProtoCompiler.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler' - v = '3.1.0' + v = '3.2.0' s.version = v s.summary = 'The Protobuf Compiler (protoc) generates Objective-C files from .proto files' s.description = <<-DESC @@ -110,7 +110,7 @@ Pod::Spec.new do |s| # Restrict the protobuf runtime version to the one supported by this version of protoc. s.dependency 'Protobuf', '~> 3.0' # For the Protobuf dependency not to complain: - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' # This is only for local development of protoc: If the Podfile brings this pod from a local From 008c1f09115b23196d192d9ddd92b431a824edd7 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Tue, 14 Mar 2017 21:12:44 +0100 Subject: [PATCH 061/186] Updating g_stands_for.md --- doc/g_stands_for.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md index 53a1fdf193c..d2fc7a50f95 100644 --- a/doc/g_stands_for.md +++ b/doc/g_stands_for.md @@ -7,3 +7,4 @@ future), and the corresponding version numbers that used them: - 1.0 'g' stands for 'gRPC' - 1.1 'g' stands for 'good' - 1.2 'g' stands for 'green' +- 1.3 'g' stands for 'gentle' From c6f3a00b1364961d9f9f9beea7eba6756fee954a Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 14 Mar 2017 01:16:09 -0700 Subject: [PATCH 062/186] Fix SetSocketMutator --- src/cpp/common/channel_arguments.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc index 65f32774999..33a10c0b8e1 100644 --- a/src/cpp/common/channel_arguments.cc +++ b/src/cpp/common/channel_arguments.cc @@ -101,8 +101,10 @@ void ChannelArguments::SetSocketMutator(grpc_socket_mutator* mutator) { for (auto it = args_.begin(); it != args_.end(); ++it) { if (it->type == mutator_arg.type && grpc::string(it->key) == grpc::string(mutator_arg.key)) { + GPR_ASSERT(!replaced); it->value.pointer.vtable->destroy(&exec_ctx, it->value.pointer.p); it->value.pointer = mutator_arg.value.pointer; + replaced = true; } } grpc_exec_ctx_finish(&exec_ctx); From be30114a3b95b6dc843f8338d2b8a5470bec2553 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 14 Mar 2017 16:33:44 -0700 Subject: [PATCH 063/186] fix up tests and remove two unlocks in a row bug --- examples/ruby/greeter_client.rb | 32 +++++++++++++++++++++-- src/ruby/ext/grpc/rb_channel.c | 33 +++++++++++------------- src/ruby/spec/channel_connection_spec.rb | 19 +++++++------- 3 files changed, 54 insertions(+), 30 deletions(-) diff --git a/examples/ruby/greeter_client.rb b/examples/ruby/greeter_client.rb index 1cdf79ebf40..379f41536ee 100755 --- a/examples/ruby/greeter_client.rb +++ b/examples/ruby/greeter_client.rb @@ -40,11 +40,39 @@ $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) require 'grpc' require 'helloworld_services_pb' +$int_count = 0 + +def shut_down_term + puts "term sig" + $int_count += 1 + if $int_count > 4 + exit + end +end + +def shut_down_kill + puts "kill sig" + $int_count += 1 + if $int_count > 4 + exit + end +end + + def main stub = Helloworld::Greeter::Stub.new('localhost:50051', :this_channel_is_insecure) user = ARGV.size > 0 ? ARGV[0] : 'world' - message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message - p "Greeting: #{message}" + Signal.trap("TERM") do + shut_down_term + end + Signal.trap("INT") do + shut_down_kill + end + loop do + message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message + p "Greeting: #{message}" + sleep 4 + end end main diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 8cd489345dd..d143c54d21b 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -89,7 +89,7 @@ static void grpc_rb_channel_try_register_connection_polling( static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper); static grpc_completion_queue *channel_polling_cq; -static gpr_mu channel_polling_mu; +static gpr_mu global_connection_polling_mu; static int abort_channel_polling = 0; /* Destroys Channel instances. */ @@ -188,13 +188,13 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { gpr_mu_lock(&wrapper->channel_mu); wrapper->current_connectivity_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); - gpr_cv_signal(&wrapper->channel_cv); - gpr_mu_unlock(&wrapper->channel_mu); - - gpr_mu_lock(&wrapper->channel_mu); wrapper->safe_to_destroy = 0; wrapper->request_safe_destroy = 0; + + gpr_cv_signal(&wrapper->channel_cv); gpr_mu_unlock(&wrapper->channel_mu); + + grpc_rb_channel_try_register_connection_polling(wrapper); if (args.args != NULL) { @@ -277,7 +277,6 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, } if (wrapper->safe_to_destroy) { gpr_mu_unlock(&wrapper->channel_mu); - gpr_log(GPR_DEBUG, "GRPC_RUBY_RB_CHANNEL: attempt to watch_connectivity_state on a non-state-polled channel"); return Qfalse; } gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, grpc_rb_time_timeval(deadline, /* absolute time */ 0)); @@ -394,7 +393,7 @@ static VALUE grpc_rb_channel_get_target(VALUE self) { // destroy. // Not safe to call while a channel's connection state is polled. static void grpc_rb_channel_try_register_connection_polling( - grpc_rb_channel *wrapper) { + grpc_rb_channel *wrapper) { grpc_connectivity_state conn_state; gpr_timespec sleep_time = gpr_time_add( gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); @@ -408,9 +407,8 @@ static void grpc_rb_channel_try_register_connection_polling( gpr_mu_unlock(&wrapper->channel_mu); return; } - gpr_mu_lock(&channel_polling_mu); + gpr_mu_lock(&global_connection_polling_mu); - gpr_mu_lock(&wrapper->channel_mu); conn_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); if (conn_state != wrapper->current_connectivity_state) { wrapper->current_connectivity_state = conn_state; @@ -424,8 +422,7 @@ static void grpc_rb_channel_try_register_connection_polling( wrapper->safe_to_destroy = 1; gpr_cv_signal(&wrapper->channel_cv); } - gpr_mu_unlock(&wrapper->channel_mu); - gpr_mu_unlock(&channel_polling_mu); + gpr_mu_unlock(&global_connection_polling_mu); gpr_mu_unlock(&wrapper->channel_mu); } @@ -454,7 +451,6 @@ static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { // early and falls back to current behavior. static void *run_poll_channels_loop_no_gil(void *arg) { grpc_event event; - grpc_rb_channel *wrapper; (void)arg; for (;;) { event = grpc_completion_queue_next( @@ -463,27 +459,28 @@ static void *run_poll_channels_loop_no_gil(void *arg) { break; } if (event.type == GRPC_OP_COMPLETE) { - wrapper = (grpc_rb_channel *)event.tag; - - grpc_rb_channel_try_register_connection_polling(wrapper); + grpc_rb_channel_try_register_connection_polling((grpc_rb_channel *)event.tag); } } grpc_completion_queue_destroy(channel_polling_cq); + gpr_log(GPR_DEBUG, "GRPC_RUBY: run_poll_channels_loop_no_gil - exit connection polling loop"); return NULL; } // Notify the channel polling loop to cleanup and shutdown. static void grpc_rb_event_unblocking_func(void *arg) { (void)arg; - gpr_mu_lock(&channel_polling_mu); + gpr_mu_lock(&global_connection_polling_mu); + gpr_log(GPR_DEBUG, "GRPC_RUBY: grpc_rb_event_unblocking_func - begin aborting connection polling"); abort_channel_polling = 1; grpc_completion_queue_shutdown(channel_polling_cq); - gpr_mu_unlock(&channel_polling_mu); + gpr_mu_unlock(&global_connection_polling_mu); } // Poll channel connectivity states in background thread without the GIL. static VALUE run_poll_channels_loop(VALUE arg) { (void)arg; + gpr_log(GPR_DEBUG, "GRPC_RUBY: run_poll_channels_loop - create connection polling thread"); rb_thread_call_without_gvl(run_poll_channels_loop_no_gil, NULL, grpc_rb_event_unblocking_func, NULL); return Qnil; @@ -501,7 +498,7 @@ static VALUE run_poll_channels_loop(VALUE arg) { */ static void start_poll_channels_loop() { channel_polling_cq = grpc_completion_queue_create(NULL); - gpr_mu_init(&channel_polling_mu); + gpr_mu_init(&global_connection_polling_mu); abort_channel_polling = 0; rb_thread_create(run_poll_channels_loop, NULL); } diff --git a/src/ruby/spec/channel_connection_spec.rb b/src/ruby/spec/channel_connection_spec.rb index d8e10f7b761..b344052a215 100644 --- a/src/ruby/spec/channel_connection_spec.rb +++ b/src/ruby/spec/channel_connection_spec.rb @@ -63,7 +63,7 @@ EchoStub = EchoService.rpc_stub_class def start_server(port = 0) @srv = GRPC::RpcServer.new - server_port = @srv.add_http2_port("0.0.0.0:#{port}", :this_port_is_insecure) + server_port = @srv.add_http2_port("localhost:#{port}", :this_port_is_insecure) @srv.handle(EchoService) @server_thd = Thread.new { @srv.run } @srv.wait_till_running @@ -84,24 +84,25 @@ describe 'channel connection behavior' do req = EchoMsg.new expect(stub.an_rpc(req)).to be_a(EchoMsg) stop_server - expect { stub.an_rpc(req) }.to raise_error(GRPC::Unavailable) + sleep 1 # TODO(apolcyn) grabbing the same port might fail, is this stable enough? start_server(port) expect(stub.an_rpc(req)).to be_a(EchoMsg) stop_server end - it 'observably connects and reconnects to transient server when using the channel state API', trial: true do + it 'observably connects and reconnects to transient server' \ + 'when using the channel state API' do port = start_server - ch = GRPC::Core::Channel.new("localhost:#{port}", {}, :this_channel_is_insecure) + ch = GRPC::Core::Channel.new("localhost:#{port}", {}, + :this_channel_is_insecure) expect(ch.connectivity_state).to be(GRPC::Core::ConnectivityStates::IDLE) state = ch.connectivity_state(true) count = 0 - while count < 20 and state != GRPC::Core::ConnectivityStates::READY do - STDERR.puts "first round of waiting for state to become READY" + while count < 20 && state != GRPC::Core::ConnectivityStates::READY ch.watch_connectivity_state(state, Time.now + 60) state = ch.connectivity_state(true) count += 1 @@ -114,8 +115,7 @@ describe 'channel connection behavior' do state = ch.connectivity_state count = 0 - while count < 20 and state == GRPC::Core::ConnectivityStates::READY do - STDERR.puts "server shut down. waiting for state to not be READY" + while count < 20 && state == GRPC::Core::ConnectivityStates::READY ch.watch_connectivity_state(state, Time.now + 60) state = ch.connectivity_state count += 1 @@ -128,8 +128,7 @@ describe 'channel connection behavior' do state = ch.connectivity_state(true) count = 0 - while count < 20 and state != GRPC::Core::ConnectivityStates::READY do - STDERR.puts "second round of waiting for state to become READY" + while count < 20 && state != GRPC::Core::ConnectivityStates::READY ch.watch_connectivity_state(state, Time.now + 60) state = ch.connectivity_state(true) count += 1 From 68745bbf8a0193a8a2c2691281365a1e9d488863 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 14 Mar 2017 17:51:07 -0700 Subject: [PATCH 064/186] Resolve dependency issues --- BUILD | 1 + CMakeLists.txt | 5 + Makefile | 5 + binding.gyp | 1 + build.yaml | 1 + config.m4 | 1 + gRPC-Core.podspec | 1 + grpc.gemspec | 1 + package.xml | 1 + src/core/lib/iomgr/tcp_server_posix.c | 229 +----------------- src/core/lib/iomgr/tcp_server_utils_posix.h | 53 +++- .../lib/iomgr/tcp_server_utils_posix_common.c | 220 +++++++++++++++++ .../iomgr/tcp_server_utils_posix_ifaddrs.c | 19 +- .../iomgr/tcp_server_utils_posix_noifaddrs.c | 4 +- src/python/grpcio/grpc_core_dependencies.py | 1 + tools/doxygen/Doxyfile.core.internal | 1 + .../generated/sources_and_headers.json | 1 + vsprojects/vcxproj/grpc/grpc.vcxproj | 2 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 3 + .../grpc_test_util/grpc_test_util.vcxproj | 2 + .../grpc_test_util.vcxproj.filters | 3 + .../grpc_unsecure/grpc_unsecure.vcxproj | 2 + .../grpc_unsecure.vcxproj.filters | 3 + 23 files changed, 325 insertions(+), 235 deletions(-) create mode 100644 src/core/lib/iomgr/tcp_server_utils_posix_common.c diff --git a/BUILD b/BUILD index dc6431484e3..371ab200d22 100644 --- a/BUILD +++ b/BUILD @@ -481,6 +481,7 @@ grpc_cc_library( "src/core/lib/iomgr/tcp_client_windows.c", "src/core/lib/iomgr/tcp_posix.c", "src/core/lib/iomgr/tcp_server_posix.c", + "src/core/lib/iomgr/tcp_server_utils_posix_common.c", "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c", "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c", "src/core/lib/iomgr/tcp_server_uv.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index cfc4555834a..c7001aa721c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -914,6 +914,7 @@ add_library(grpc src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_common.c src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c @@ -1225,6 +1226,7 @@ add_library(grpc_cronet src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_common.c src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c @@ -1527,6 +1529,7 @@ add_library(grpc_test_util src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_common.c src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c @@ -1775,6 +1778,7 @@ add_library(grpc_unsecure src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_common.c src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c @@ -2384,6 +2388,7 @@ add_library(grpc++_cronet src/core/lib/iomgr/tcp_client_windows.c src/core/lib/iomgr/tcp_posix.c src/core/lib/iomgr/tcp_server_posix.c + src/core/lib/iomgr/tcp_server_utils_posix_common.c src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c src/core/lib/iomgr/tcp_server_uv.c diff --git a/Makefile b/Makefile index 14c5a36c957..e31b7514e1d 100644 --- a/Makefile +++ b/Makefile @@ -2799,6 +2799,7 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ @@ -3113,6 +3114,7 @@ LIBGRPC_CRONET_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ @@ -3418,6 +3420,7 @@ LIBGRPC_TEST_UTIL_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ @@ -3646,6 +3649,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ @@ -4257,6 +4261,7 @@ LIBGRPC++_CRONET_SRC = \ src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ diff --git a/binding.gyp b/binding.gyp index ec21a97806f..96843c0d6b7 100644 --- a/binding.gyp +++ b/binding.gyp @@ -667,6 +667,7 @@ 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.c', 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', diff --git a/build.yaml b/build.yaml index 36817a55067..75bacbde632 100644 --- a/build.yaml +++ b/build.yaml @@ -338,6 +338,7 @@ filegroups: - src/core/lib/iomgr/tcp_client_windows.c - src/core/lib/iomgr/tcp_posix.c - src/core/lib/iomgr/tcp_server_posix.c + - src/core/lib/iomgr/tcp_server_utils_posix_common.c - src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c - src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c - src/core/lib/iomgr/tcp_server_uv.c diff --git a/config.m4 b/config.m4 index 181e44c52c8..6d6f9419cd1 100644 --- a/config.m4 +++ b/config.m4 @@ -140,6 +140,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/tcp_client_windows.c \ src/core/lib/iomgr/tcp_posix.c \ src/core/lib/iomgr/tcp_server_posix.c \ + src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 1d002247d4b..16c17c2bf6e 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -509,6 +509,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.c', 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', diff --git a/grpc.gemspec b/grpc.gemspec index edc08cb9b9a..da9535ff469 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -426,6 +426,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/tcp_client_windows.c ) s.files += %w( src/core/lib/iomgr/tcp_posix.c ) s.files += %w( src/core/lib/iomgr/tcp_server_posix.c ) + s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_common.c ) s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c ) s.files += %w( src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c ) s.files += %w( src/core/lib/iomgr/tcp_server_uv.c ) diff --git a/package.xml b/package.xml index 21eeee4d3ef..aeeb0d59867 100644 --- a/package.xml +++ b/package.xml @@ -435,6 +435,7 @@ + diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index 1e9e854d6b5..b3644518f54 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -44,10 +44,8 @@ #include #include -#include #include #include -#include #include #include #include @@ -70,56 +68,6 @@ #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/support/string.h" -#define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 - -static gpr_once s_init_max_accept_queue_size; -static int s_max_accept_queue_size; - -/* the overall server */ -struct grpc_tcp_server { - gpr_refcount refs; - /* Called whenever accept() succeeds on a server port. */ - grpc_tcp_server_cb on_accept_cb; - void *on_accept_cb_arg; - - gpr_mu mu; - - /* active port count: how many ports are actually still listening */ - size_t active_ports; - /* destroyed port count: how many ports are completely destroyed */ - size_t destroyed_ports; - - /* is this server shutting down? */ - bool shutdown; - /* have listeners been shutdown? */ - bool shutdown_listeners; - /* use SO_REUSEPORT */ - bool so_reuseport; - /* expand wildcard addresses to a list of all local addresses */ - bool expand_wildcard_addrs; - - /* linked list of server ports */ - grpc_tcp_listener *head; - grpc_tcp_listener *tail; - unsigned nports; - - /* List of closures passed to shutdown_starting_add(). */ - grpc_closure_list shutdown_starting; - - /* shutdown callback */ - grpc_closure *shutdown_complete; - - /* all pollsets interested in new connections */ - grpc_pollset **pollsets; - /* number of pollsets in the pollsets array */ - size_t pollset_count; - - /* next pollset to assign a channel to */ - gpr_atm next_pollset_to_assign; - - grpc_resource_quota *resource_quota; -}; - static gpr_once check_init = GPR_ONCE_INIT; static bool has_so_reuseport = false; @@ -278,99 +226,6 @@ static void tcp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_tcp_server *s) { } } -/* get max listen queue size on linux */ -static void init_max_accept_queue_size(void) { - int n = SOMAXCONN; - char buf[64]; - FILE *fp = fopen("/proc/sys/net/core/somaxconn", "r"); - if (fp == NULL) { - /* 2.4 kernel. */ - s_max_accept_queue_size = SOMAXCONN; - return; - } - if (fgets(buf, sizeof buf, fp)) { - char *end; - long i = strtol(buf, &end, 10); - if (i > 0 && i <= INT_MAX && end && *end == 0) { - n = (int)i; - } - } - fclose(fp); - s_max_accept_queue_size = n; - - if (s_max_accept_queue_size < MIN_SAFE_ACCEPT_QUEUE_SIZE) { - gpr_log(GPR_INFO, - "Suspiciously small accept queue (%d) will probably lead to " - "connection drops", - s_max_accept_queue_size); - } -} - -static int get_max_accept_queue_size(void) { - gpr_once_init(&s_init_max_accept_queue_size, init_max_accept_queue_size); - return s_max_accept_queue_size; -} - -/* Prepare a recently-created socket for listening. */ -static grpc_error *prepare_socket(int fd, const grpc_resolved_address *addr, - bool so_reuseport, int *port) { - grpc_resolved_address sockname_temp; - grpc_error *err = GRPC_ERROR_NONE; - - GPR_ASSERT(fd >= 0); - - if (so_reuseport && !grpc_is_unix_socket(addr)) { - err = grpc_set_socket_reuse_port(fd, 1); - if (err != GRPC_ERROR_NONE) goto error; - } - - err = grpc_set_socket_nonblocking(fd, 1); - if (err != GRPC_ERROR_NONE) goto error; - err = grpc_set_socket_cloexec(fd, 1); - if (err != GRPC_ERROR_NONE) goto error; - if (!grpc_is_unix_socket(addr)) { - err = grpc_set_socket_low_latency(fd, 1); - if (err != GRPC_ERROR_NONE) goto error; - err = grpc_set_socket_reuse_addr(fd, 1); - if (err != GRPC_ERROR_NONE) goto error; - } - err = grpc_set_socket_no_sigpipe_if_possible(fd); - if (err != GRPC_ERROR_NONE) goto error; - - GPR_ASSERT(addr->len < ~(socklen_t)0); - if (bind(fd, (struct sockaddr *)addr->addr, (socklen_t)addr->len) < 0) { - err = GRPC_OS_ERROR(errno, "bind"); - goto error; - } - - if (listen(fd, get_max_accept_queue_size()) < 0) { - err = GRPC_OS_ERROR(errno, "listen"); - goto error; - } - - sockname_temp.len = sizeof(struct sockaddr_storage); - - if (getsockname(fd, (struct sockaddr *)sockname_temp.addr, - (socklen_t *)&sockname_temp.len) < 0) { - err = GRPC_OS_ERROR(errno, "getsockname"); - goto error; - } - - *port = grpc_sockaddr_get_port(&sockname_temp); - return GRPC_ERROR_NONE; - -error: - GPR_ASSERT(err != GRPC_ERROR_NONE); - if (fd >= 0) { - close(fd); - } - grpc_error *ret = grpc_error_set_int( - GRPC_ERROR_CREATE_REFERENCING("Unable to configure socket", &err, 1), - GRPC_ERROR_INT_FD, fd); - GRPC_ERROR_UNREF(err); - return ret; -} - /* event manager callback when reads are ready */ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *err) { grpc_tcp_listener *sp = arg; @@ -454,88 +309,6 @@ error: } } -static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd, - const grpc_resolved_address *addr, - unsigned port_index, unsigned fd_index, - grpc_tcp_listener **listener) { - grpc_tcp_listener *sp = NULL; - int port = -1; - char *addr_str; - char *name; - - grpc_error *err = prepare_socket(fd, addr, s->so_reuseport, &port); - if (err == GRPC_ERROR_NONE) { - GPR_ASSERT(port > 0); - grpc_sockaddr_to_string(&addr_str, addr, 1); - gpr_asprintf(&name, "tcp-server-listener:%s", addr_str); - gpr_mu_lock(&s->mu); - s->nports++; - GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); - sp = gpr_malloc(sizeof(grpc_tcp_listener)); - sp->next = NULL; - if (s->head == NULL) { - s->head = sp; - } else { - s->tail->next = sp; - } - s->tail = sp; - sp->server = s; - sp->fd = fd; - sp->emfd = grpc_fd_create(fd, name); - memcpy(&sp->addr, addr, sizeof(grpc_resolved_address)); - sp->port = port; - sp->port_index = port_index; - sp->fd_index = fd_index; - sp->is_sibling = 0; - sp->sibling = NULL; - GPR_ASSERT(sp->emfd); - gpr_mu_unlock(&s->mu); - gpr_free(addr_str); - gpr_free(name); - } - - *listener = sp; - return err; -} - -/* If successful, add a listener to s for addr, set *dsmode for the socket, and - return the *listener. */ -grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, - const grpc_resolved_address *addr, - unsigned port_index, unsigned fd_index, - grpc_dualstack_mode *dsmode, - grpc_tcp_listener **listener) { - grpc_resolved_address addr4_copy; - int fd; - grpc_error *err = - grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, dsmode, &fd); - if (err != GRPC_ERROR_NONE) { - return err; - } - if (*dsmode == GRPC_DSMODE_IPV4 && - grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) { - addr = &addr4_copy; - } - return add_socket_to_server(s, fd, addr, port_index, fd_index, listener); -} - -/* Return the listener in s with address addr or NULL. */ -grpc_tcp_listener *grpc_tcp_server_find_listener_with_addr( - grpc_tcp_server *s, grpc_resolved_address *addr) { - grpc_tcp_listener *l; - gpr_mu_lock(&s->mu); - for (l = s->head; l != NULL; l = l->next) { - if (l->addr.len != addr->len) { - continue; - } - if (memcmp(l->addr.addr, addr->addr, addr->len) == 0) { - break; - } - } - gpr_mu_unlock(&s->mu); - return l; -} - /* Treat :: or 0.0.0.0 as a family-agnostic wildcard. */ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, unsigned port_index, @@ -607,7 +380,7 @@ static grpc_error *clone_port(grpc_tcp_listener *listener, unsigned count) { err = grpc_create_dualstack_socket(&listener->addr, SOCK_STREAM, 0, &dsmode, &fd); if (err != GRPC_ERROR_NONE) return err; - err = prepare_socket(fd, &listener->addr, true, &port); + err = grpc_tcp_server_prepare_socket(fd, &listener->addr, true, &port); if (err != GRPC_ERROR_NONE) return err; listener->server->nports++; grpc_sockaddr_to_string(&addr_str, &listener->addr, 1); diff --git a/src/core/lib/iomgr/tcp_server_utils_posix.h b/src/core/lib/iomgr/tcp_server_utils_posix.h index d39f9085fda..f5dc8532f9f 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix.h +++ b/src/core/lib/iomgr/tcp_server_utils_posix.h @@ -61,6 +61,51 @@ typedef struct grpc_tcp_listener { int is_sibling; } grpc_tcp_listener; +/* the overall server */ +struct grpc_tcp_server { + gpr_refcount refs; + /* Called whenever accept() succeeds on a server port. */ + grpc_tcp_server_cb on_accept_cb; + void *on_accept_cb_arg; + + gpr_mu mu; + + /* active port count: how many ports are actually still listening */ + size_t active_ports; + /* destroyed port count: how many ports are completely destroyed */ + size_t destroyed_ports; + + /* is this server shutting down? */ + bool shutdown; + /* have listeners been shutdown? */ + bool shutdown_listeners; + /* use SO_REUSEPORT */ + bool so_reuseport; + /* expand wildcard addresses to a list of all local addresses */ + bool expand_wildcard_addrs; + + /* linked list of server ports */ + grpc_tcp_listener *head; + grpc_tcp_listener *tail; + unsigned nports; + + /* List of closures passed to shutdown_starting_add(). */ + grpc_closure_list shutdown_starting; + + /* shutdown callback */ + grpc_closure *shutdown_complete; + + /* all pollsets interested in new connections */ + grpc_pollset **pollsets; + /* number of pollsets in the pollsets array */ + size_t pollset_count; + + /* next pollset to assign a channel to */ + gpr_atm next_pollset_to_assign; + + grpc_resource_quota *resource_quota; +}; + /* If successful, add a listener to \a s for \a addr, set \a dsmode for the socket, and return the \a listener. */ grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, @@ -69,10 +114,6 @@ grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, grpc_dualstack_mode *dsmode, grpc_tcp_listener **listener); -/* Return the listener in \a s with address \a addr or NULL. */ -grpc_tcp_listener *grpc_tcp_server_find_listener_with_addr( - grpc_tcp_server *s, grpc_resolved_address *addr); - /* Get all addresses assigned to network interfaces on the machine and create a listener for each. requested_port is the port to use for every listener, or 0 to select one random port that will be used for every listener. Set *out_port @@ -83,6 +124,10 @@ grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, int requested_port, int *out_port); +/* Prepare a recently-created socket for listening. */ +grpc_error *grpc_tcp_server_prepare_socket(int fd, + const grpc_resolved_address *addr, + bool so_reuseport, int *port); /* Ruturn true if the platform supports ifaddrs */ bool grpc_tcp_server_have_ifaddrs(void); diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_common.c b/src/core/lib/iomgr/tcp_server_utils_posix_common.c new file mode 100644 index 00000000000..e45e27d5ab6 --- /dev/null +++ b/src/core/lib/iomgr/tcp_server_utils_posix_common.c @@ -0,0 +1,220 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_HAVE_IFADDRS + +#include "src/core/lib/iomgr/tcp_server_utils_posix.h" + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "src/core/lib/iomgr/error.h" +#include "src/core/lib/iomgr/sockaddr.h" +#include "src/core/lib/iomgr/sockaddr_utils.h" +#include "src/core/lib/iomgr/unix_sockets_posix.h" + +#define MIN_SAFE_ACCEPT_QUEUE_SIZE 100 + +static gpr_once s_init_max_accept_queue_size; +static int s_max_accept_queue_size; + +/* get max listen queue size on linux */ +static void init_max_accept_queue_size(void) { + int n = SOMAXCONN; + char buf[64]; + FILE *fp = fopen("/proc/sys/net/core/somaxconn", "r"); + if (fp == NULL) { + /* 2.4 kernel. */ + s_max_accept_queue_size = SOMAXCONN; + return; + } + if (fgets(buf, sizeof buf, fp)) { + char *end; + long i = strtol(buf, &end, 10); + if (i > 0 && i <= INT_MAX && end && *end == 0) { + n = (int)i; + } + } + fclose(fp); + s_max_accept_queue_size = n; + + if (s_max_accept_queue_size < MIN_SAFE_ACCEPT_QUEUE_SIZE) { + gpr_log(GPR_INFO, + "Suspiciously small accept queue (%d) will probably lead to " + "connection drops", + s_max_accept_queue_size); + } +} + +static int get_max_accept_queue_size(void) { + gpr_once_init(&s_init_max_accept_queue_size, init_max_accept_queue_size); + return s_max_accept_queue_size; +} + +static grpc_error *add_socket_to_server(grpc_tcp_server *s, int fd, + const grpc_resolved_address *addr, + unsigned port_index, unsigned fd_index, + grpc_tcp_listener **listener) { + grpc_tcp_listener *sp = NULL; + int port = -1; + char *addr_str; + char *name; + + grpc_error *err = + grpc_tcp_server_prepare_socket(fd, addr, s->so_reuseport, &port); + if (err == GRPC_ERROR_NONE) { + GPR_ASSERT(port > 0); + grpc_sockaddr_to_string(&addr_str, addr, 1); + gpr_asprintf(&name, "tcp-server-listener:%s", addr_str); + gpr_mu_lock(&s->mu); + s->nports++; + GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server"); + sp = gpr_malloc(sizeof(grpc_tcp_listener)); + sp->next = NULL; + if (s->head == NULL) { + s->head = sp; + } else { + s->tail->next = sp; + } + s->tail = sp; + sp->server = s; + sp->fd = fd; + sp->emfd = grpc_fd_create(fd, name); + memcpy(&sp->addr, addr, sizeof(grpc_resolved_address)); + sp->port = port; + sp->port_index = port_index; + sp->fd_index = fd_index; + sp->is_sibling = 0; + sp->sibling = NULL; + GPR_ASSERT(sp->emfd); + gpr_mu_unlock(&s->mu); + gpr_free(addr_str); + gpr_free(name); + } + + *listener = sp; + return err; +} + +/* If successful, add a listener to s for addr, set *dsmode for the socket, and + return the *listener. */ +grpc_error *grpc_tcp_server_add_addr(grpc_tcp_server *s, + const grpc_resolved_address *addr, + unsigned port_index, unsigned fd_index, + grpc_dualstack_mode *dsmode, + grpc_tcp_listener **listener) { + grpc_resolved_address addr4_copy; + int fd; + grpc_error *err = + grpc_create_dualstack_socket(addr, SOCK_STREAM, 0, dsmode, &fd); + if (err != GRPC_ERROR_NONE) { + return err; + } + if (*dsmode == GRPC_DSMODE_IPV4 && + grpc_sockaddr_is_v4mapped(addr, &addr4_copy)) { + addr = &addr4_copy; + } + return add_socket_to_server(s, fd, addr, port_index, fd_index, listener); +} + +/* Prepare a recently-created socket for listening. */ +grpc_error *grpc_tcp_server_prepare_socket(int fd, + const grpc_resolved_address *addr, + bool so_reuseport, int *port) { + grpc_resolved_address sockname_temp; + grpc_error *err = GRPC_ERROR_NONE; + + GPR_ASSERT(fd >= 0); + + if (so_reuseport && !grpc_is_unix_socket(addr)) { + err = grpc_set_socket_reuse_port(fd, 1); + if (err != GRPC_ERROR_NONE) goto error; + } + + err = grpc_set_socket_nonblocking(fd, 1); + if (err != GRPC_ERROR_NONE) goto error; + err = grpc_set_socket_cloexec(fd, 1); + if (err != GRPC_ERROR_NONE) goto error; + if (!grpc_is_unix_socket(addr)) { + err = grpc_set_socket_low_latency(fd, 1); + if (err != GRPC_ERROR_NONE) goto error; + err = grpc_set_socket_reuse_addr(fd, 1); + if (err != GRPC_ERROR_NONE) goto error; + } + err = grpc_set_socket_no_sigpipe_if_possible(fd); + if (err != GRPC_ERROR_NONE) goto error; + + GPR_ASSERT(addr->len < ~(socklen_t)0); + if (bind(fd, (struct sockaddr *)addr->addr, (socklen_t)addr->len) < 0) { + err = GRPC_OS_ERROR(errno, "bind"); + goto error; + } + + if (listen(fd, get_max_accept_queue_size()) < 0) { + err = GRPC_OS_ERROR(errno, "listen"); + goto error; + } + + sockname_temp.len = sizeof(struct sockaddr_storage); + + if (getsockname(fd, (struct sockaddr *)sockname_temp.addr, + (socklen_t *)&sockname_temp.len) < 0) { + err = GRPC_OS_ERROR(errno, "getsockname"); + goto error; + } + + *port = grpc_sockaddr_get_port(&sockname_temp); + return GRPC_ERROR_NONE; + +error: + GPR_ASSERT(err != GRPC_ERROR_NONE); + if (fd >= 0) { + close(fd); + } + grpc_error *ret = grpc_error_set_int( + GRPC_ERROR_CREATE_REFERENCING("Unable to configure socket", &err, 1), + GRPC_ERROR_INT_FD, fd); + GRPC_ERROR_UNREF(err); + return ret; +} + +#endif /* GRPC_HAVE_IFADDRS */ diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c index 05eb96f73ed..6354a6bdc10 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c +++ b/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c @@ -50,6 +50,23 @@ #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" +/* Return the listener in s with address addr or NULL. */ +static grpc_tcp_listener *find_listener_with_addr(grpc_tcp_server *s, + grpc_resolved_address *addr) { + grpc_tcp_listener *l; + gpr_mu_lock(&s->mu); + for (l = s->head; l != NULL; l = l->next) { + if (l->addr.len != addr->len) { + continue; + } + if (memcmp(l->addr.addr, addr->addr, addr->len) == 0) { + break; + } + } + gpr_mu_unlock(&s->mu); + return l; +} + /* Bind to "::" to get a port number not used by any address. */ static grpc_error *get_unused_port(int *port) { grpc_resolved_address wild; @@ -133,7 +150,7 @@ grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, ifa_name, ifa_it->ifa_flags, addr_str); /* We could have multiple interfaces with the same address (e.g., bonding), so look for duplicates. */ - if (grpc_tcp_server_find_listener_with_addr(s, &addr) != NULL) { + if (find_listener_with_addr(s, &addr) != NULL) { gpr_log(GPR_DEBUG, "Skipping duplicate addr %s on interface %s", addr_str, ifa_name); gpr_free(addr_str); diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c b/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c index fb21d62d053..95c3198be6f 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c +++ b/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c @@ -33,7 +33,7 @@ #include "src/core/lib/iomgr/port.h" -#ifndef GRPC_HAVE_IFADDRS +#if defined(GRPC_POSIX_SOCKET) && !defined(GRPC_HAVE_IFADDRS) #include "src/core/lib/iomgr/tcp_server_utils_posix.h" @@ -46,4 +46,4 @@ grpc_error *grpc_tcp_server_add_all_local_addrs(grpc_tcp_server *s, bool grpc_tcp_server_have_ifaddrs(void) { return false; } -#endif /* ifndef GRPC_HAVE_IFADDRS */ +#endif /* defined(GRPC_POSIX_SOCKET) && !defined(GRPC_HAVE_IFADDRS) */ diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 00b2b8f9026..ea3a51be13d 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -134,6 +134,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/iomgr/tcp_client_windows.c', 'src/core/lib/iomgr/tcp_posix.c', 'src/core/lib/iomgr/tcp_server_posix.c', + 'src/core/lib/iomgr/tcp_server_utils_posix_common.c', 'src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c', 'src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c', 'src/core/lib/iomgr/tcp_server_uv.c', diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index f9e4775b738..a1287cd8942 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1131,6 +1131,7 @@ src/core/lib/iomgr/tcp_posix.h \ src/core/lib/iomgr/tcp_server.h \ src/core/lib/iomgr/tcp_server_posix.c \ src/core/lib/iomgr/tcp_server_utils_posix.h \ +src/core/lib/iomgr/tcp_server_utils_posix_common.c \ src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c \ src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c \ src/core/lib/iomgr/tcp_server_uv.c \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 38fe87ac463..9ab9836c4bb 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7638,6 +7638,7 @@ "src/core/lib/iomgr/tcp_server.h", "src/core/lib/iomgr/tcp_server_posix.c", "src/core/lib/iomgr/tcp_server_utils_posix.h", + "src/core/lib/iomgr/tcp_server_utils_posix_common.c", "src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.c", "src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.c", "src/core/lib/iomgr/tcp_server_uv.c", diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index 7b48dfbf597..5e3b027663d 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -619,6 +619,8 @@ + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index 8ba8a4f8fb9..d75ca766c0d 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -181,6 +181,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj index d078db1c3c7..62969e31acf 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj @@ -462,6 +462,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters index 9e2d817143e..30088101f5f 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters @@ -238,6 +238,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index b6f10b3d7c1..11ac8bd4b2b 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -586,6 +586,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 03662d4044c..414e2a50b89 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -184,6 +184,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr From 3005ce8ddab1090c49184e244e46810240ce8245 Mon Sep 17 00:00:00 2001 From: Noah Eisen Date: Tue, 14 Mar 2017 13:38:41 -0700 Subject: [PATCH 065/186] Only use static on string literals --- src/core/ext/transport/cronet/transport/cronet_transport.c | 2 +- src/core/lib/channel/http_server_filter.c | 2 +- src/core/lib/iomgr/ev_epoll_linux.c | 2 +- src/core/lib/security/transport/server_auth_filter.c | 2 +- src/core/lib/surface/validate_metadata.c | 2 +- src/core/lib/transport/metadata_batch.c | 2 +- test/core/iomgr/tcp_client_uv_test.c | 5 +++-- test/core/iomgr/tcp_server_uv_test.c | 3 ++- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 40ee5253659..fe98f48bbb0 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -288,7 +288,7 @@ static void maybe_flush_read(stream_obj *s) { } static grpc_error *make_error_with_desc(int error_code, const char *desc) { - grpc_error *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc); + grpc_error *error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(desc); error = grpc_error_set_int(error, GRPC_ERROR_INT_GRPC_STATUS, error_code); return error; } diff --git a/src/core/lib/channel/http_server_filter.c b/src/core/lib/channel/http_server_filter.c index 910ba965363..0c110fd3cb8 100644 --- a/src/core/lib/channel/http_server_filter.c +++ b/src/core/lib/channel/http_server_filter.c @@ -101,7 +101,7 @@ static void add_error(const char *error_name, grpc_error **cumulative, grpc_error *new) { if (new == GRPC_ERROR_NONE) return; if (*cumulative == GRPC_ERROR_NONE) { - *cumulative = GRPC_ERROR_CREATE_FROM_STATIC_STRING(error_name); + *cumulative = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_name); } *cumulative = grpc_error_add_child(*cumulative, new); } diff --git a/src/core/lib/iomgr/ev_epoll_linux.c b/src/core/lib/iomgr/ev_epoll_linux.c index 93a1e44670b..1924e76f13a 100644 --- a/src/core/lib/iomgr/ev_epoll_linux.c +++ b/src/core/lib/iomgr/ev_epoll_linux.c @@ -321,7 +321,7 @@ static bool append_error(grpc_error **composite, grpc_error *error, const char *desc) { if (error == GRPC_ERROR_NONE) return true; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING(desc); + *composite = GRPC_ERROR_CREATE_FROM_COPIED_STRING(desc); } *composite = grpc_error_add_child(*composite, error); return false; diff --git a/src/core/lib/security/transport/server_auth_filter.c b/src/core/lib/security/transport/server_auth_filter.c index 63ae46c41d5..cf35c56437d 100644 --- a/src/core/lib/security/transport/server_auth_filter.c +++ b/src/core/lib/security/transport/server_auth_filter.c @@ -146,7 +146,7 @@ static void on_md_processing_done( calld->transport_op->send_trailing_metadata = NULL; grpc_closure_sched( &exec_ctx, calld->on_done_recv, - grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(error_details), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_details), GRPC_ERROR_INT_GRPC_STATUS, status)); } diff --git a/src/core/lib/surface/validate_metadata.c b/src/core/lib/surface/validate_metadata.c index 9995510e48a..6e76c4efe70 100644 --- a/src/core/lib/surface/validate_metadata.c +++ b/src/core/lib/surface/validate_metadata.c @@ -53,7 +53,7 @@ static grpc_error *conforms_to(grpc_slice slice, const uint8_t *legal_bits, if ((legal_bits[byte] & (1 << bit)) == 0) { char *dump = grpc_dump_slice(slice, GPR_DUMP_HEX | GPR_DUMP_ASCII); grpc_error *error = grpc_error_set_str( - grpc_error_set_int(GRPC_ERROR_CREATE_FROM_STATIC_STRING(err_desc), + grpc_error_set_int(GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_desc), GRPC_ERROR_INT_OFFSET, p - GRPC_SLICE_START_PTR(slice)), GRPC_ERROR_STR_RAW_BYTES, grpc_slice_from_copied_string(dump)); diff --git a/src/core/lib/transport/metadata_batch.c b/src/core/lib/transport/metadata_batch.c index e04ce72e891..fa73244aa43 100644 --- a/src/core/lib/transport/metadata_batch.c +++ b/src/core/lib/transport/metadata_batch.c @@ -301,7 +301,7 @@ static void add_error(grpc_error **composite, grpc_error *error, const char *composite_error_string) { if (error == GRPC_ERROR_NONE) return; if (*composite == GRPC_ERROR_NONE) { - *composite = GRPC_ERROR_CREATE_FROM_STATIC_STRING(composite_error_string); + *composite = GRPC_ERROR_CREATE_FROM_COPIED_STRING(composite_error_string); } *composite = grpc_error_add_child(*composite, error); } diff --git a/test/core/iomgr/tcp_client_uv_test.c b/test/core/iomgr/tcp_client_uv_test.c index 064119f11b9..92fc3934226 100644 --- a/test/core/iomgr/tcp_client_uv_test.c +++ b/test/core/iomgr/tcp_client_uv_test.c @@ -73,8 +73,9 @@ static void must_succeed(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { GPR_ASSERT(g_connecting != NULL); GPR_ASSERT(error == GRPC_ERROR_NONE); - grpc_endpoint_shutdown(exec_ctx, g_connecting, - GRPC_ERROR_CREATE("must_succeed called")); + grpc_endpoint_shutdown( + exec_ctx, g_connecting, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("must_succeed called")); grpc_endpoint_destroy(exec_ctx, g_connecting); g_connecting = NULL; finish_connection(); diff --git a/test/core/iomgr/tcp_server_uv_test.c b/test/core/iomgr/tcp_server_uv_test.c index 0fc74599ea5..1e039585c1e 100644 --- a/test/core/iomgr/tcp_server_uv_test.c +++ b/test/core/iomgr/tcp_server_uv_test.c @@ -115,7 +115,8 @@ static void server_weak_ref_set(server_weak_ref *weak_ref, static void on_connect(grpc_exec_ctx *exec_ctx, void *arg, grpc_endpoint *tcp, grpc_pollset *pollset, grpc_tcp_server_acceptor *acceptor) { - grpc_endpoint_shutdown(exec_ctx, tcp, GRPC_ERROR_CREATE("Connected")); + grpc_endpoint_shutdown(exec_ctx, tcp, + GRPC_ERROR_CREATE_FROM_STATIC_STRING("Connected")); grpc_endpoint_destroy(exec_ctx, tcp); on_connect_result temp_result; From c44c16e330a8532c8c917c2aa64ffd1aeafe0126 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 14 Mar 2017 17:44:21 -0700 Subject: [PATCH 066/186] add initial framework for full end2end tests outside of rspec --- src/ruby/end2end/echo_server.rb | 68 ++++++++++++++ src/ruby/end2end/gen_protos.sh | 2 + src/ruby/end2end/lib/client_control_pb.rb | 21 +++++ .../end2end/lib/client_control_services_pb.rb | 54 +++++++++++ src/ruby/end2end/lib/echo_pb.rb | 18 ++++ src/ruby/end2end/lib/echo_services_pb.rb | 52 +++++++++++ src/ruby/end2end/protos/client_control.proto | 48 ++++++++++ src/ruby/end2end/protos/echo.proto | 46 ++++++++++ src/ruby/end2end/sig_handling_client.rb | 91 +++++++++++++++++++ src/ruby/end2end/sig_handling_driver.rb | 88 ++++++++++++++++++ src/ruby/qps/worker.rb | 2 + .../helper_scripts/run_ruby_end2end_tests.sh | 36 ++++++++ tools/run_tests/run_tests.py | 11 ++- 13 files changed, 534 insertions(+), 3 deletions(-) create mode 100755 src/ruby/end2end/echo_server.rb create mode 100644 src/ruby/end2end/gen_protos.sh create mode 100644 src/ruby/end2end/lib/client_control_pb.rb create mode 100644 src/ruby/end2end/lib/client_control_services_pb.rb create mode 100644 src/ruby/end2end/lib/echo_pb.rb create mode 100644 src/ruby/end2end/lib/echo_services_pb.rb create mode 100644 src/ruby/end2end/protos/client_control.proto create mode 100644 src/ruby/end2end/protos/echo.proto create mode 100755 src/ruby/end2end/sig_handling_client.rb create mode 100755 src/ruby/end2end/sig_handling_driver.rb create mode 100755 tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh diff --git a/src/ruby/end2end/echo_server.rb b/src/ruby/end2end/echo_server.rb new file mode 100755 index 00000000000..5e80740aa0a --- /dev/null +++ b/src/ruby/end2end/echo_server.rb @@ -0,0 +1,68 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +this_dir = File.expand_path(File.dirname(__FILE__)) +protos_lib_dir = File.join(this_dir, 'lib') +grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) +$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_services_pb' + +# GreeterServer is simple server that implements the Helloworld Greeter server. +class EchoServerImpl < Echo::EchoServer::Service + # say_hello implements the SayHello rpc method. + def echo(echo_req, _) + Echo::EchoReply.new(response: echo_req.request) + end +end + +class ServerRunner + def initialize(port) + @port = port + end + def run + @srv = GRPC::RpcServer.new + @thd = Thread.new do + @srv.add_http2_port("localhost:#{@port}", :this_port_is_insecure) + @srv.handle(EchoServerImpl) + @srv.run + end + @srv.wait_till_running + end + def stop + @srv.stop + @thd.join + raise "server not stopped" unless @srv.stopped? + end +end diff --git a/src/ruby/end2end/gen_protos.sh b/src/ruby/end2end/gen_protos.sh new file mode 100644 index 00000000000..c26b5572da1 --- /dev/null +++ b/src/ruby/end2end/gen_protos.sh @@ -0,0 +1,2 @@ +#!/bin/bash +grpc_tools_ruby_protoc -I protos --ruby_out=lib --grpc_out=lib protos/echo.proto protos/client_control.proto diff --git a/src/ruby/end2end/lib/client_control_pb.rb b/src/ruby/end2end/lib/client_control_pb.rb new file mode 100644 index 00000000000..866095a80ac --- /dev/null +++ b/src/ruby/end2end/lib/client_control_pb.rb @@ -0,0 +1,21 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: client_control.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "client_control.DoEchoRpcRequest" do + optional :request, :string, 1 + end + add_message "client_control.CreateClientStubRequest" do + optional :server_address, :string, 1 + end + add_message "client_control.Void" do + end +end + +module ClientControl + DoEchoRpcRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.DoEchoRpcRequest").msgclass + CreateClientStubRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.CreateClientStubRequest").msgclass + Void = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.Void").msgclass +end diff --git a/src/ruby/end2end/lib/client_control_services_pb.rb b/src/ruby/end2end/lib/client_control_services_pb.rb new file mode 100644 index 00000000000..4c31f3e5900 --- /dev/null +++ b/src/ruby/end2end/lib/client_control_services_pb.rb @@ -0,0 +1,54 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: client_control.proto for package 'client_control' +# Original file comments: +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'grpc' +require 'client_control_pb' + +module ClientControl + module ClientController + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'client_control.ClientController' + + rpc :DoEchoRpc, DoEchoRpcRequest, Void + rpc :CreateClientStub, CreateClientStubRequest, Void + rpc :Shutdown, Void, Void + end + + Stub = Service.rpc_stub_class + end +end diff --git a/src/ruby/end2end/lib/echo_pb.rb b/src/ruby/end2end/lib/echo_pb.rb new file mode 100644 index 00000000000..c62adc07534 --- /dev/null +++ b/src/ruby/end2end/lib/echo_pb.rb @@ -0,0 +1,18 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: echo.proto + +require 'google/protobuf' + +Google::Protobuf::DescriptorPool.generated_pool.build do + add_message "echo.EchoRequest" do + optional :request, :string, 1 + end + add_message "echo.EchoReply" do + optional :response, :string, 1 + end +end + +module Echo + EchoRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("echo.EchoRequest").msgclass + EchoReply = Google::Protobuf::DescriptorPool.generated_pool.lookup("echo.EchoReply").msgclass +end diff --git a/src/ruby/end2end/lib/echo_services_pb.rb b/src/ruby/end2end/lib/echo_services_pb.rb new file mode 100644 index 00000000000..c66e975bf32 --- /dev/null +++ b/src/ruby/end2end/lib/echo_services_pb.rb @@ -0,0 +1,52 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# Source: echo.proto for package 'echo' +# Original file comments: +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +require 'grpc' +require 'echo_pb' + +module Echo + module EchoServer + class Service + + include GRPC::GenericService + + self.marshal_class_method = :encode + self.unmarshal_class_method = :decode + self.service_name = 'echo.EchoServer' + + rpc :Echo, EchoRequest, EchoReply + end + + Stub = Service.rpc_stub_class + end +end diff --git a/src/ruby/end2end/protos/client_control.proto b/src/ruby/end2end/protos/client_control.proto new file mode 100644 index 00000000000..5e11876cb40 --- /dev/null +++ b/src/ruby/end2end/protos/client_control.proto @@ -0,0 +1,48 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package client_control; + +service ClientController { + rpc DoEchoRpc (DoEchoRpcRequest) returns (Void) {} + rpc CreateClientStub(CreateClientStubRequest) returns (Void) {} + rpc Shutdown(Void) returns (Void) {} +} + +message DoEchoRpcRequest { + string request = 1; +} + +message CreateClientStubRequest { + string server_address = 1; +} + +message Void{} diff --git a/src/ruby/end2end/protos/echo.proto b/src/ruby/end2end/protos/echo.proto new file mode 100644 index 00000000000..d47afef70f1 --- /dev/null +++ b/src/ruby/end2end/protos/echo.proto @@ -0,0 +1,46 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +syntax = "proto3"; + +package echo; + +service EchoServer { + rpc Echo (EchoRequest) returns (EchoReply) {} +} + +// The request message containing the user's name. +message EchoRequest { + string request = 1; +} + +// The response message containing the greetings +message EchoReply { + string response = 1; +} diff --git a/src/ruby/end2end/sig_handling_client.rb b/src/ruby/end2end/sig_handling_client.rb new file mode 100755 index 00000000000..860c6b5f0d3 --- /dev/null +++ b/src/ruby/end2end/sig_handling_client.rb @@ -0,0 +1,91 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +this_dir = File.expand_path(File.dirname(__FILE__)) +protos_lib_dir = File.join(this_dir, 'lib') +grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) +$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_services_pb' +require 'client_control_services_pb' +require 'optparse' +require 'thread' + +class SigHandlingClientController < ClientControl::ClientController::Service + def initialize(srv) + @srv = srv + end + def do_echo_rpc(req, _) + response = @stub.echo(Echo::EchoRequest.new(request: req.request)) + raise "bad response" unless response.response == req.request + ClientControl::Void.new + end + def create_client_stub(req, _) + @stub = Echo::EchoServer::Stub.new(req.server_address, :this_channel_is_insecure) + ClientControl::Void.new + end + def shutdown(_, _) + Thread.new do + #TODO(apolcyn) There is a race between stopping the server and the "shutdown" rpc completing, + # See if stop method on server can end active RPC cleanly, to avoid this sleep. + sleep 3 + @srv.stop + end + ClientControl::Void.new + end +end + +def main + client_control_port = '' + OptionParser.new do |opts| + opts.on('--client_control_port=P', String) do |p| + client_control_port = p + end + end.parse! + + Signal.trap("TERM") do + STDERR.puts "SIGTERM received" + end + + Signal.trap("INT") do + STDERR.puts "SIGINT received" + end + + srv = GRPC::RpcServer.new + srv.add_http2_port("localhost:#{client_control_port}", :this_port_is_insecure) + srv.handle(SigHandlingClientController.new(srv)) + srv.run +end + +main diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb new file mode 100755 index 00000000000..524f0cebe8d --- /dev/null +++ b/src/ruby/end2end/sig_handling_driver.rb @@ -0,0 +1,88 @@ +#!/usr/bin/env ruby + +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# smoke test for a grpc-using app that receives and +# handles process-ending signals + +this_dir = File.expand_path(File.dirname(__FILE__)) +protos_lib_dir = File.join(this_dir, 'lib') +grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') +$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) +$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) +$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) + +require 'grpc' +require 'echo_server' +require 'client_control_services_pb' + +def main + this_dir = File.expand_path(File.dirname(__FILE__)) + lib_dir = File.join(File.dirname(this_dir), 'lib') + + server_port = '50051' + STDERR.puts "start server" + server_runner = ServerRunner.new(server_port) + server_runner.run + + sleep 1 + + client_control_port = '50052' + + STDERR.puts "start client" + client_path = File.join(this_dir, "sig_handling_client.rb") + client_pid = Process.spawn(RbConfig.ruby, client_path, "--client_control_port=#{client_control_port}") + control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) + + sleep 1 + + control_stub.create_client_stub(ClientControl::CreateClientStubRequest.new(server_address: "localhost:#{server_port}")) + + count = 0 + while count < 5 + control_stub.do_echo_rpc(ClientControl::DoEchoRpcRequest.new(request: 'hello')) + Process.kill('SIGTERM', client_pid) + Process.kill('SIGINT', client_pid) + count += 1 + end + + control_stub.shutdown(ClientControl::Void.new) + Process.wait(client_pid) + + client_exit_code = $?.exitstatus + + if client_exit_code != 0 + raise "term sig test failure: client exit code: #{client_exit_code}" + end + + server_runner.stop +end + +main diff --git a/src/ruby/qps/worker.rb b/src/ruby/qps/worker.rb index 61a0b723a3f..318c1f9e22c 100755 --- a/src/ruby/qps/worker.rb +++ b/src/ruby/qps/worker.rb @@ -36,6 +36,8 @@ lib_dir = File.join(File.dirname(this_dir), 'lib') $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) $LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) +puts $LOAD_PATH + require 'grpc' require 'optparse' require 'histogram' diff --git a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh new file mode 100755 index 00000000000..7ccbcfca70d --- /dev/null +++ b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +set -ex + +# change to grpc repo root +cd $(dirname $0)/../../.. + +ruby src/ruby/end2end/sig_handling_driver.rb diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index 43b8f8184e2..dc17e738e6e 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -692,9 +692,14 @@ class RubyLanguage(object): _check_compiler(self.args.compiler, ['default']) def test_specs(self): - return [self.config.job_spec(['tools/run_tests/helper_scripts/run_ruby.sh'], - timeout_seconds=10*60, - environ=_FORCE_ENVIRON_FOR_WRAPPERS)] + tests = [self.config.job_spec(['tools/run_tests/helper_scripts/run_ruby.sh'], + timeout_seconds=10*60, + environ=_FORCE_ENVIRON_FOR_WRAPPERS)] + # note these aren't getting ran on windows since no workers + tests.append(self.config.job_spec(['tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh'], + timeout_seconds=10*60, + environ=_FORCE_ENVIRON_FOR_WRAPPERS)) + return tests def pre_build_steps(self): return [['tools/run_tests/helper_scripts/pre_build_ruby.sh']] From 7a32e8a499e94efb5dab6e19459f9b9968382000 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 14 Mar 2017 23:35:29 -0700 Subject: [PATCH 067/186] Revert changes to example greeter client --- examples/ruby/greeter_client.rb | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/examples/ruby/greeter_client.rb b/examples/ruby/greeter_client.rb index 379f41536ee..1cdf79ebf40 100755 --- a/examples/ruby/greeter_client.rb +++ b/examples/ruby/greeter_client.rb @@ -40,39 +40,11 @@ $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) require 'grpc' require 'helloworld_services_pb' -$int_count = 0 - -def shut_down_term - puts "term sig" - $int_count += 1 - if $int_count > 4 - exit - end -end - -def shut_down_kill - puts "kill sig" - $int_count += 1 - if $int_count > 4 - exit - end -end - - def main stub = Helloworld::Greeter::Stub.new('localhost:50051', :this_channel_is_insecure) user = ARGV.size > 0 ? ARGV[0] : 'world' - Signal.trap("TERM") do - shut_down_term - end - Signal.trap("INT") do - shut_down_kill - end - loop do - message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message - p "Greeting: #{message}" - sleep 4 - end + message = stub.say_hello(Helloworld::HelloRequest.new(name: user)).message + p "Greeting: #{message}" end main From f8dc32e9e2153b2ea97091b611d8c83cbc37c05e Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 00:04:33 -0700 Subject: [PATCH 068/186] make end2end test ports dynamic and slight refactor --- .../{echo_server.rb => end2end_common.rb} | 42 +++++++++++++++++-- src/ruby/end2end/lib/client_control_pb.rb | 4 -- .../end2end/lib/client_control_services_pb.rb | 1 - src/ruby/end2end/protos/client_control.proto | 5 --- src/ruby/end2end/sig_handling_client.rb | 29 +++++-------- src/ruby/end2end/sig_handling_driver.rb | 38 +++-------------- 6 files changed, 53 insertions(+), 66 deletions(-) rename src/ruby/end2end/{echo_server.rb => end2end_common.rb} (69%) diff --git a/src/ruby/end2end/echo_server.rb b/src/ruby/end2end/end2end_common.rb similarity index 69% rename from src/ruby/end2end/echo_server.rb rename to src/ruby/end2end/end2end_common.rb index 5e80740aa0a..67961cdf972 100755 --- a/src/ruby/end2end/echo_server.rb +++ b/src/ruby/end2end/end2end_common.rb @@ -38,6 +38,10 @@ $LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) require 'grpc' require 'echo_services_pb' +require 'client_control_services_pb' +require 'socket' +require 'optparse' +require 'thread' # GreeterServer is simple server that implements the Helloworld Greeter server. class EchoServerImpl < Echo::EchoServer::Service @@ -48,17 +52,18 @@ class EchoServerImpl < Echo::EchoServer::Service end class ServerRunner - def initialize(port) - @port = port + def initialize end def run @srv = GRPC::RpcServer.new + port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure) + @srv.handle(EchoServerImpl) + @thd = Thread.new do - @srv.add_http2_port("localhost:#{@port}", :this_port_is_insecure) - @srv.handle(EchoServerImpl) @srv.run end @srv.wait_till_running + port end def stop @srv.stop @@ -66,3 +71,32 @@ class ServerRunner raise "server not stopped" unless @srv.stopped? end end + +def start_client(client_main, server_port) + this_dir = File.expand_path(File.dirname(__FILE__)) + + tmp_server = TCPServer.new(0) + client_control_port = tmp_server.local_address.ip_port + tmp_server.close + + client_path = File.join(this_dir, client_main) + client_pid = Process.spawn(RbConfig.ruby, client_path, + "--client_control_port=#{client_control_port}", + "--server_port=#{server_port}") + sleep 1 + control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) + return control_stub, client_pid +end + +def cleanup(control_stub, server_runner) + control_stub.shutdown(ClientControl::Void.new) + Process.wait(client_pid) + + client_exit_code = $?.exitstatus + + if client_exit_code != 0 + raise "term sig test failure: client exit code: #{client_exit_code}" + end + + server_runner.stop +end diff --git a/src/ruby/end2end/lib/client_control_pb.rb b/src/ruby/end2end/lib/client_control_pb.rb index 866095a80ac..1a938f1b5ae 100644 --- a/src/ruby/end2end/lib/client_control_pb.rb +++ b/src/ruby/end2end/lib/client_control_pb.rb @@ -7,15 +7,11 @@ Google::Protobuf::DescriptorPool.generated_pool.build do add_message "client_control.DoEchoRpcRequest" do optional :request, :string, 1 end - add_message "client_control.CreateClientStubRequest" do - optional :server_address, :string, 1 - end add_message "client_control.Void" do end end module ClientControl DoEchoRpcRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.DoEchoRpcRequest").msgclass - CreateClientStubRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.CreateClientStubRequest").msgclass Void = Google::Protobuf::DescriptorPool.generated_pool.lookup("client_control.Void").msgclass end diff --git a/src/ruby/end2end/lib/client_control_services_pb.rb b/src/ruby/end2end/lib/client_control_services_pb.rb index 4c31f3e5900..04b2291bc78 100644 --- a/src/ruby/end2end/lib/client_control_services_pb.rb +++ b/src/ruby/end2end/lib/client_control_services_pb.rb @@ -45,7 +45,6 @@ module ClientControl self.service_name = 'client_control.ClientController' rpc :DoEchoRpc, DoEchoRpcRequest, Void - rpc :CreateClientStub, CreateClientStubRequest, Void rpc :Shutdown, Void, Void end diff --git a/src/ruby/end2end/protos/client_control.proto b/src/ruby/end2end/protos/client_control.proto index 5e11876cb40..f985bb486dc 100644 --- a/src/ruby/end2end/protos/client_control.proto +++ b/src/ruby/end2end/protos/client_control.proto @@ -33,7 +33,6 @@ package client_control; service ClientController { rpc DoEchoRpc (DoEchoRpcRequest) returns (Void) {} - rpc CreateClientStub(CreateClientStubRequest) returns (Void) {} rpc Shutdown(Void) returns (Void) {} } @@ -41,8 +40,4 @@ message DoEchoRpcRequest { string request = 1; } -message CreateClientStubRequest { - string server_address = 1; -} - message Void{} diff --git a/src/ruby/end2end/sig_handling_client.rb b/src/ruby/end2end/sig_handling_client.rb index 860c6b5f0d3..f0b2ba61caf 100755 --- a/src/ruby/end2end/sig_handling_client.rb +++ b/src/ruby/end2end/sig_handling_client.rb @@ -29,32 +29,18 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -this_dir = File.expand_path(File.dirname(__FILE__)) -protos_lib_dir = File.join(this_dir, 'lib') -grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') -$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) -$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) -$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) - -require 'grpc' -require 'echo_services_pb' -require 'client_control_services_pb' -require 'optparse' -require 'thread' +require_relative './end2end_common' class SigHandlingClientController < ClientControl::ClientController::Service - def initialize(srv) + def initialize(srv, stub) @srv = srv + @stub = stub end def do_echo_rpc(req, _) response = @stub.echo(Echo::EchoRequest.new(request: req.request)) raise "bad response" unless response.response == req.request ClientControl::Void.new end - def create_client_stub(req, _) - @stub = Echo::EchoServer::Stub.new(req.server_address, :this_channel_is_insecure) - ClientControl::Void.new - end def shutdown(_, _) Thread.new do #TODO(apolcyn) There is a race between stopping the server and the "shutdown" rpc completing, @@ -68,10 +54,14 @@ end def main client_control_port = '' + server_port = '' OptionParser.new do |opts| opts.on('--client_control_port=P', String) do |p| client_control_port = p end + opts.on('--server_port=P', String) do |p| + server_port = p + end end.parse! Signal.trap("TERM") do @@ -83,8 +73,9 @@ def main end srv = GRPC::RpcServer.new - srv.add_http2_port("localhost:#{client_control_port}", :this_port_is_insecure) - srv.handle(SigHandlingClientController.new(srv)) + srv.add_http2_port("0.0.0.0:#{client_control_port}", :this_port_is_insecure) + stub = Echo::EchoServer::Stub.new("localhost:#{server_port}", :this_channel_is_insecure) + srv.handle(SigHandlingClientController.new(srv, stub)) srv.run end diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb index 524f0cebe8d..bda5c03c168 100755 --- a/src/ruby/end2end/sig_handling_driver.rb +++ b/src/ruby/end2end/sig_handling_driver.rb @@ -32,39 +32,20 @@ # smoke test for a grpc-using app that receives and # handles process-ending signals -this_dir = File.expand_path(File.dirname(__FILE__)) -protos_lib_dir = File.join(this_dir, 'lib') -grpc_lib_dir = File.join(File.dirname(this_dir), 'lib') -$LOAD_PATH.unshift(grpc_lib_dir) unless $LOAD_PATH.include?(grpc_lib_dir) -$LOAD_PATH.unshift(protos_lib_dir) unless $LOAD_PATH.include?(protos_lib_dir) -$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) - -require 'grpc' -require 'echo_server' -require 'client_control_services_pb' +require_relative './end2end_common' def main - this_dir = File.expand_path(File.dirname(__FILE__)) - lib_dir = File.join(File.dirname(this_dir), 'lib') - - server_port = '50051' STDERR.puts "start server" - server_runner = ServerRunner.new(server_port) - server_runner.run + server_runner = ServerRunner.new + server_port = server_runner.run sleep 1 - client_control_port = '50052' - STDERR.puts "start client" - client_path = File.join(this_dir, "sig_handling_client.rb") - client_pid = Process.spawn(RbConfig.ruby, client_path, "--client_control_port=#{client_control_port}") - control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) + control_stub, client_pid = start_client("sig_handling_client.rb", server_port) sleep 1 - control_stub.create_client_stub(ClientControl::CreateClientStubRequest.new(server_address: "localhost:#{server_port}")) - count = 0 while count < 5 control_stub.do_echo_rpc(ClientControl::DoEchoRpcRequest.new(request: 'hello')) @@ -73,16 +54,7 @@ def main count += 1 end - control_stub.shutdown(ClientControl::Void.new) - Process.wait(client_pid) - - client_exit_code = $?.exitstatus - - if client_exit_code != 0 - raise "term sig test failure: client exit code: #{client_exit_code}" - end - - server_runner.stop + cleanup(control_stub, server_runner) end main From 51006fea710ef7e4faefae653432f55947639b76 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 15 Mar 2017 08:07:02 -0700 Subject: [PATCH 069/186] Fix use-after-free --- src/core/lib/surface/call.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 00719be9abc..9a8870b86a4 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -437,9 +437,10 @@ void grpc_call_internal_unref(grpc_exec_ctx *exec_ctx, grpc_call *c REF_ARG) { static void release_call(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { grpc_call *c = call; - grpc_channel_update_call_size_estimate(c->channel, + grpc_channel *channel = c->channel; + grpc_channel_update_call_size_estimate(channel, gpr_arena_destroy(c->arena)); - GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, c->channel, "call"); + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, channel, "call"); } static void set_status_value_directly(grpc_status_code status, void *dest); From dbad370aa5a5480824388d77207d3d0b2aa94a1c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 15 Mar 2017 08:21:19 -0700 Subject: [PATCH 070/186] Fix use-after-free, cronet compiles --- .../cronet/transport/cronet_transport.c | 46 +++++++++++-------- src/core/lib/surface/call.c | 3 +- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 01a03533daf..e827423a2af 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -177,6 +177,7 @@ struct op_storage { }; struct stream_obj { + gpr_arena *arena; struct op_and_state *oas; grpc_transport_stream_op *curr_op; grpc_cronet_transport *curr_ct; @@ -451,15 +452,18 @@ static void on_response_headers_received( gpr_mu_lock(&s->mu); memset(&s->state.rs.initial_metadata, 0, sizeof(s->state.rs.initial_metadata)); - grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.initial_metadata); + grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.initial_metadata, + s->arena); for (size_t i = 0; i < headers->count; i++) { - grpc_chttp2_incoming_metadata_buffer_add( - &s->state.rs.initial_metadata, - grpc_mdelem_from_slices( - &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( - headers->headers[i].key)), - grpc_slice_intern( - grpc_slice_from_static_string(headers->headers[i].value)))); + GRPC_LOG_IF_ERROR( + "on_response_headers_received", + grpc_chttp2_incoming_metadata_buffer_add( + &exec_ctx, &s->state.rs.initial_metadata, + grpc_mdelem_from_slices( + &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( + headers->headers[i].key)), + grpc_slice_intern(grpc_slice_from_static_string( + headers->headers[i].value))))); } s->state.state_callback_received[OP_RECV_INITIAL_METADATA] = true; if (!(s->state.state_op_done[OP_CANCEL_ERROR] || @@ -549,17 +553,20 @@ static void on_response_trailers_received( memset(&s->state.rs.trailing_metadata, 0, sizeof(s->state.rs.trailing_metadata)); s->state.rs.trailing_metadata_valid = false; - grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.trailing_metadata); + grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.trailing_metadata, + s->arena); for (size_t i = 0; i < trailers->count; i++) { CRONET_LOG(GPR_DEBUG, "trailer key=%s, value=%s", trailers->headers[i].key, trailers->headers[i].value); - grpc_chttp2_incoming_metadata_buffer_add( - &s->state.rs.trailing_metadata, - grpc_mdelem_from_slices( - &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( - trailers->headers[i].key)), - grpc_slice_intern( - grpc_slice_from_static_string(trailers->headers[i].value)))); + GRPC_LOG_IF_ERROR( + "on_response_trailers_received", + grpc_chttp2_incoming_metadata_buffer_add( + &exec_ctx, &s->state.rs.trailing_metadata, + grpc_mdelem_from_slices( + &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( + trailers->headers[i].key)), + grpc_slice_intern(grpc_slice_from_static_string( + trailers->headers[i].value))))); s->state.rs.trailing_metadata_valid = true; if (0 == strcmp(trailers->headers[i].key, "grpc-status") && 0 != strcmp(trailers->headers[i].value, "0")) { @@ -1174,7 +1181,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, grpc_stream *gs, grpc_stream_refcount *refcount, - const void *server_data) { + const void *server_data, gpr_arena *arena) { stream_obj *s = (stream_obj *)gs; memset(&s->storage, 0, sizeof(s->storage)); s->storage.head = NULL; @@ -1194,6 +1201,7 @@ static int init_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, s->curr_gs = gs; s->curr_ct = (grpc_cronet_transport *)gt; + s->arena = arena; gpr_mu_init(&s->mu); return 0; @@ -1238,9 +1246,11 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt, } static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt, - grpc_stream *gs, void *and_free_memory) { + grpc_stream *gs, + grpc_closure *then_schedule_closure) { stream_obj *s = (stream_obj *)gs; GRPC_ERROR_UNREF(s->state.cancel_error); + grpc_closure_sched(exec_ctx, then_schedule_closure, GRPC_ERROR_NONE); } static void destroy_transport(grpc_exec_ctx *exec_ctx, grpc_transport *gt) {} diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 9a8870b86a4..f1285b923d0 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -438,8 +438,7 @@ static void release_call(grpc_exec_ctx *exec_ctx, void *call, grpc_error *error) { grpc_call *c = call; grpc_channel *channel = c->channel; - grpc_channel_update_call_size_estimate(channel, - gpr_arena_destroy(c->arena)); + grpc_channel_update_call_size_estimate(channel, gpr_arena_destroy(c->arena)); GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, channel, "call"); } From 9ccbc4d5e51bcaa0adc3ca6837d93b7c162b3ca6 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 15 Mar 2017 08:30:04 -0700 Subject: [PATCH 071/186] Don't use combiner lock for on_complete callback. --- src/core/ext/client_channel/client_channel.c | 20 ++++++---- src/core/ext/client_channel/retry_throttle.c | 42 ++++++++------------ src/core/ext/client_channel/retry_throttle.h | 10 ++--- 3 files changed, 32 insertions(+), 40 deletions(-) diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index ef273669e84..e0b84ddd660 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -423,7 +423,8 @@ static void on_resolver_result_changed_locked(grpc_exec_ctx *exec_ctx, grpc_channel_args_find(chand->resolver_result, GRPC_ARG_SERVER_URI); GPR_ASSERT(channel_arg != NULL); GPR_ASSERT(channel_arg->type == GRPC_ARG_STRING); - grpc_uri *uri = grpc_uri_parse(channel_arg->value.string, true); + grpc_uri *uri = + grpc_uri_parse(exec_ctx, channel_arg->value.string, true); GPR_ASSERT(uri->path[0] != '\0'); parsing_state.server_name = uri->path[0] == '/' ? uri->path + 1 : uri->path; @@ -738,6 +739,7 @@ typedef struct client_channel_call_data { grpc_slice path; // Request path. gpr_timespec call_start_time; gpr_timespec deadline; + grpc_server_retry_throttle_data *retry_throttle_data; method_parameters *method_params; grpc_error *cancel_error; @@ -814,7 +816,7 @@ static void retry_waiting_locked(grpc_exec_ctx *exec_ctx, call_data *calld) { gpr_free(ops); } -// Sets calld->method_params. +// Sets calld->method_params and calld->retry_throttle_data. // If the method params specify a timeout, populates // *per_method_deadline and returns true. static bool set_call_method_params_from_service_config_locked( @@ -822,6 +824,10 @@ static bool set_call_method_params_from_service_config_locked( gpr_timespec *per_method_deadline) { channel_data *chand = elem->channel_data; call_data *calld = elem->call_data; + if (chand->retry_throttle_data != NULL) { + calld->retry_throttle_data = + grpc_server_retry_throttle_data_ref(chand->retry_throttle_data); + } if (chand->method_params_table != NULL) { calld->method_params = grpc_method_config_table_get( exec_ctx, chand->method_params_table, calld->path); @@ -1135,19 +1141,18 @@ static void start_transport_stream_op_locked_inner(grpc_exec_ctx *exec_ctx, static void on_complete_locked(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { grpc_call_element *elem = arg; - channel_data *chand = elem->channel_data; call_data *calld = elem->call_data; - if (chand->retry_throttle_data != NULL) { + if (calld->retry_throttle_data != NULL) { if (error == GRPC_ERROR_NONE) { grpc_server_retry_throttle_data_record_success( - &chand->retry_throttle_data); + calld->retry_throttle_data); } else { // TODO(roth): In a subsequent PR, check the return value here and // decide whether or not to retry. Note that we should only // record failures whose statuses match the configured retryable // or non-fatal status codes. grpc_server_retry_throttle_data_record_failure( - &chand->retry_throttle_data); + calld->retry_throttle_data); } } grpc_closure_run(exec_ctx, calld->original_on_complete, @@ -1160,14 +1165,13 @@ static void start_transport_stream_op_locked(grpc_exec_ctx *exec_ctx, void *arg, grpc_transport_stream_op *op = arg; grpc_call_element *elem = op->handler_private.args[0]; - channel_data *chand = elem->channel_data; call_data *calld = elem->call_data; if (op->recv_trailing_metadata != NULL) { GPR_ASSERT(op->on_complete != NULL); calld->original_on_complete = op->on_complete; grpc_closure_init(&calld->on_complete, on_complete_locked, elem, - grpc_combiner_scheduler(chand->combiner, false)); + grpc_schedule_on_exec_ctx); op->on_complete = &calld->on_complete; } diff --git a/src/core/ext/client_channel/retry_throttle.c b/src/core/ext/client_channel/retry_throttle.c index 2aa52e49033..7b813c33df4 100644 --- a/src/core/ext/client_channel/retry_throttle.c +++ b/src/core/ext/client_channel/retry_throttle.c @@ -64,26 +64,18 @@ static void get_replacement_throttle_data_if_needed( (grpc_server_retry_throttle_data*)gpr_atm_acq_load( &(*throttle_data)->replacement); if (new_throttle_data == NULL) return; - // Reset *throttle_data to its replacement, updating refcounts as - // appropriate. - // Note: It's safe to do this here, because the caller ensures that - // this will only be called with a given value of throttle_data from - // one thread at a time. - grpc_server_retry_throttle_data_ref(new_throttle_data); - grpc_server_retry_throttle_data* old_throttle_data = *throttle_data; *throttle_data = new_throttle_data; - grpc_server_retry_throttle_data_unref(old_throttle_data); } } bool grpc_server_retry_throttle_data_record_failure( - grpc_server_retry_throttle_data** throttle_data) { + grpc_server_retry_throttle_data* throttle_data) { // First, check if we are stale and need to be replaced. - get_replacement_throttle_data_if_needed(throttle_data); + get_replacement_throttle_data_if_needed(&throttle_data); // We decrement milli_tokens by 1000 (1 token) for each failure. const int delta = -1000; const int old_value = (int)gpr_atm_full_fetch_add( - &(*throttle_data)->milli_tokens, (gpr_atm)delta); + &throttle_data->milli_tokens, (gpr_atm)delta); // If the above change takes us below 0, then re-add the excess. Note // that between these two atomic operations, the value will be // artificially low by as much as 1000, but this window should be @@ -91,41 +83,42 @@ bool grpc_server_retry_throttle_data_record_failure( int new_value = old_value - 1000; if (new_value < 0) { const int excess_value = new_value - (old_value < 0 ? old_value : 0); - gpr_atm_full_fetch_add(&(*throttle_data)->milli_tokens, + gpr_atm_full_fetch_add(&throttle_data->milli_tokens, (gpr_atm)-excess_value); new_value = 0; } // Retries are allowed as long as the new value is above the threshold // (max_milli_tokens / 2). - return new_value > (*throttle_data)->max_milli_tokens / 2; + return new_value > throttle_data->max_milli_tokens / 2; } void grpc_server_retry_throttle_data_record_success( - grpc_server_retry_throttle_data** throttle_data) { + grpc_server_retry_throttle_data* throttle_data) { // First, check if we are stale and need to be replaced. - get_replacement_throttle_data_if_needed(throttle_data); + get_replacement_throttle_data_if_needed(&throttle_data); // We increment milli_tokens by milli_token_ratio for each success. - const int delta = (*throttle_data)->milli_token_ratio; + const int delta = throttle_data->milli_token_ratio; const int old_value = (int)gpr_atm_full_fetch_add( - &(*throttle_data)->milli_tokens, (gpr_atm)delta); + &throttle_data->milli_tokens, (gpr_atm)delta); // If the above change takes us over max_milli_tokens, then subtract // the excess. Note that between these two atomic operations, the // value will be artificially high by as much as milli_token_ratio, // but this window should be brief. - const int new_value = old_value + (*throttle_data)->milli_token_ratio; - if (new_value > (*throttle_data)->max_milli_tokens) { + const int new_value = old_value + throttle_data->milli_token_ratio; + if (new_value > throttle_data->max_milli_tokens) { const int excess_value = - new_value - (old_value > (*throttle_data)->max_milli_tokens + new_value - (old_value > throttle_data->max_milli_tokens ? old_value - : (*throttle_data)->max_milli_tokens); - gpr_atm_full_fetch_add(&(*throttle_data)->milli_tokens, + : throttle_data->max_milli_tokens); + gpr_atm_full_fetch_add(&throttle_data->milli_tokens, (gpr_atm)-excess_value); } } -void grpc_server_retry_throttle_data_ref( +grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_ref( grpc_server_retry_throttle_data* throttle_data) { gpr_ref(&throttle_data->refs); + return throttle_data; } void grpc_server_retry_throttle_data_unref( @@ -189,8 +182,7 @@ static void destroy_server_retry_throttle_data(void* value) { static void* copy_server_retry_throttle_data(void* value) { grpc_server_retry_throttle_data* throttle_data = value; - grpc_server_retry_throttle_data_ref(throttle_data); - return value; + return grpc_server_retry_throttle_data_ref(throttle_data); } static const gpr_avl_vtable avl_vtable = { diff --git a/src/core/ext/client_channel/retry_throttle.h b/src/core/ext/client_channel/retry_throttle.h index 4209bb7fb66..f9971faf651 100644 --- a/src/core/ext/client_channel/retry_throttle.h +++ b/src/core/ext/client_channel/retry_throttle.h @@ -40,17 +40,13 @@ typedef struct grpc_server_retry_throttle_data grpc_server_retry_throttle_data; /// Records a failure. Returns true if it's okay to send a retry. -/// Updates \a throttle_data if the original value is stale and has been -/// replaced. Not thread safe; caller must synchronize. bool grpc_server_retry_throttle_data_record_failure( - grpc_server_retry_throttle_data** throttle_data); + grpc_server_retry_throttle_data* throttle_data); /// Records a success. -/// Updates \a throttle_data if the original value is stale and has been -/// replaced. Not thread safe; caller must synchronize. void grpc_server_retry_throttle_data_record_success( - grpc_server_retry_throttle_data** throttle_data); + grpc_server_retry_throttle_data* throttle_data); -void grpc_server_retry_throttle_data_ref( +grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_ref( grpc_server_retry_throttle_data* throttle_data); void grpc_server_retry_throttle_data_unref( grpc_server_retry_throttle_data* throttle_data); From 527937031495287be5c301614055d1eb6a078241 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 15 Mar 2017 08:38:24 -0700 Subject: [PATCH 072/186] Fix compilation --- src/cpp/common/channel_filter.h | 3 ++- test/cpp/microbenchmarks/bm_call_create.cc | 26 +++++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/cpp/common/channel_filter.h b/src/cpp/common/channel_filter.h index 79c4bab985b..494d5d64d7f 100644 --- a/src/cpp/common/channel_filter.h +++ b/src/cpp/common/channel_filter.h @@ -318,7 +318,8 @@ class ChannelFilter final { static void DestroyCallElement(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { + grpc_closure *then_call_closure) { + GPR_ASSERT(then_call_closure == NULL); reinterpret_cast(elem->call_data)->~CallDataType(); } diff --git a/test/cpp/microbenchmarks/bm_call_create.cc b/test/cpp/microbenchmarks/bm_call_create.cc index 014e2b96b55..5ef40abb970 100644 --- a/test/cpp/microbenchmarks/bm_call_create.cc +++ b/test/cpp/microbenchmarks/bm_call_create.cc @@ -232,7 +232,7 @@ static void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx, static void DestroyCallElem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) {} + grpc_closure *then_sched_closure) {} grpc_error *InitChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, grpc_channel_element_args *args) { @@ -275,7 +275,7 @@ const char *name; /* implementation of grpc_transport_init_stream */ int InitStream(grpc_exec_ctx *exec_ctx, grpc_transport *self, grpc_stream *stream, grpc_stream_refcount *refcount, - const void *server_data) { + const void *server_data, gpr_arena *arena) { return 0; } @@ -299,7 +299,7 @@ void PerformOp(grpc_exec_ctx *exec_ctx, grpc_transport *self, /* implementation of grpc_transport_destroy_stream */ void DestroyStream(grpc_exec_ctx *exec_ctx, grpc_transport *self, - grpc_stream *stream, void *and_free_memory) {} + grpc_stream *stream, grpc_closure *then_sched_closure) {} /* implementation of grpc_transport_destroy */ void Destroy(grpc_exec_ctx *exec_ctx, grpc_transport *self) {} @@ -394,7 +394,7 @@ static void BM_IsolatedFilter(benchmark::State &state) { grpc_channel_stack *channel_stack = static_cast(gpr_zalloc(channel_size)); GPR_ASSERT(GRPC_LOG_IF_ERROR( - "call_stack_init", + "channel_stack_init", grpc_channel_stack_init(&exec_ctx, 1, FilterDestroy, channel_stack, &filters[0], filters.size(), &channel_args, fixture.flags & REQUIRES_TRANSPORT @@ -409,15 +409,29 @@ static void BM_IsolatedFilter(benchmark::State &state) { grpc_slice method = grpc_slice_from_static_string("/foo/bar"); grpc_call_final_info final_info; TestOp test_op_data; + grpc_call_element_args call_args; + call_args.call_stack = call_stack; + call_args.server_transport_data = NULL; + call_args.context = NULL; + call_args.path = method; + call_args.start_time = start_time; + call_args.deadline = deadline; + const int kArenaSize = 4096; + call_args.arena = gpr_arena_create(kArenaSize); while (state.KeepRunning()) { GRPC_ERROR_UNREF(grpc_call_stack_init(&exec_ctx, channel_stack, 1, - DoNothing, NULL, NULL, NULL, method, - start_time, deadline, call_stack)); + DoNothing, NULL, &call_args)); typename TestOp::Op op(&exec_ctx, &test_op_data, call_stack); grpc_call_stack_destroy(&exec_ctx, call_stack, &final_info, NULL); op.Finish(&exec_ctx); grpc_exec_ctx_flush(&exec_ctx); + // recreate arena every 64k iterations to avoid oom + if (0 == (state.iterations() & 0xffff)) { + gpr_arena_destroy(call_args.arena); + call_args.arena = gpr_arena_create(kArenaSize); + } } + gpr_arena_destroy(call_args.arena); grpc_channel_stack_destroy(&exec_ctx, channel_stack); grpc_exec_ctx_finish(&exec_ctx); gpr_free(channel_stack); From 16d97edf56b036c28dbe60d1184ef89b71bf8a90 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 10:01:13 -0700 Subject: [PATCH 073/186] add failing test revealing bug in channel state api --- src/ruby/end2end/channel_state_client.rb | 53 ++++++++++++++++ src/ruby/end2end/channel_state_driver.rb | 63 +++++++++++++++++++ src/ruby/end2end/end2end_common.rb | 3 +- src/ruby/end2end/sig_handling_driver.rb | 2 +- .../helper_scripts/run_ruby_end2end_tests.sh | 5 +- 5 files changed, 123 insertions(+), 3 deletions(-) create mode 100755 src/ruby/end2end/channel_state_client.rb create mode 100755 src/ruby/end2end/channel_state_driver.rb diff --git a/src/ruby/end2end/channel_state_client.rb b/src/ruby/end2end/channel_state_client.rb new file mode 100755 index 00000000000..476329ff73a --- /dev/null +++ b/src/ruby/end2end/channel_state_client.rb @@ -0,0 +1,53 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +require_relative './end2end_common' + +def main + server_port = '' + OptionParser.new do |opts| + opts.on('--client_control_port=P', String) do |p| + STDERR.puts "client_control_port ignored" + end + opts.on('--server_port=P', String) do |p| + server_port = p + end + end.parse! + + ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, :this_channel_is_insecure) + + loop do + state = ch.connectivity_state + ch.watch_connectivity_state(state, Time.now + 360) + end +end + +main diff --git a/src/ruby/end2end/channel_state_driver.rb b/src/ruby/end2end/channel_state_driver.rb new file mode 100755 index 00000000000..cab0147e1f9 --- /dev/null +++ b/src/ruby/end2end/channel_state_driver.rb @@ -0,0 +1,63 @@ +#!/usr/bin/env ruby + +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# smoke test for a grpc-using app that receives and +# handles process-ending signals + +require_relative './end2end_common' + +def main + STDERR.puts "start server" + server_runner = ServerRunner.new + server_port = server_runner.run + + sleep 1 + + STDERR.puts "start client" + _, client_pid = start_client("channel_state_client.rb", server_port) + + sleep 3 + + Process.kill('SIGTERM', client_pid) + + begin + Timeout.timeout(10) { Process.wait(client_pid) } + rescue Timeout::Error + STDERR.puts "timeout wait for client pid #{client_pid}" + Process.kill('SIGKILL', client_pid) + Process.wait(client_pid) + raise 'Timed out waiting for client process. It likely hangs' + end + + server_runner.stop +end + +main diff --git a/src/ruby/end2end/end2end_common.rb b/src/ruby/end2end/end2end_common.rb index 67961cdf972..d98e41f6421 100755 --- a/src/ruby/end2end/end2end_common.rb +++ b/src/ruby/end2end/end2end_common.rb @@ -42,6 +42,7 @@ require 'client_control_services_pb' require 'socket' require 'optparse' require 'thread' +require 'timeout' # GreeterServer is simple server that implements the Helloworld Greeter server. class EchoServerImpl < Echo::EchoServer::Service @@ -88,7 +89,7 @@ def start_client(client_main, server_port) return control_stub, client_pid end -def cleanup(control_stub, server_runner) +def cleanup(control_stub, client_pid, server_runner) control_stub.shutdown(ClientControl::Void.new) Process.wait(client_pid) diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb index bda5c03c168..4d205da9ae3 100755 --- a/src/ruby/end2end/sig_handling_driver.rb +++ b/src/ruby/end2end/sig_handling_driver.rb @@ -54,7 +54,7 @@ def main count += 1 end - cleanup(control_stub, server_runner) + cleanup(control_stub, client_pid, server_runner) end main diff --git a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh index 7ccbcfca70d..518848b9508 100755 --- a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh +++ b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh @@ -33,4 +33,7 @@ set -ex # change to grpc repo root cd $(dirname $0)/../../.. -ruby src/ruby/end2end/sig_handling_driver.rb +EXIT_CODE=0 +ruby src/ruby/end2end/sig_handling_driver.rb || EXIT_CODE=1 +ruby src/ruby/end2end/channel_state_driver.rb || EXIT_CODE=1 +exit $EXIT_CODE From 2ac189e60626b6dbcec48feca8d79614db00baee Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 15 Mar 2017 10:02:57 -0700 Subject: [PATCH 074/186] Fix proxy mapper initialization to work with third-party plugins. --- src/core/ext/client_channel/proxy_mapper_registry.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/core/ext/client_channel/proxy_mapper_registry.c b/src/core/ext/client_channel/proxy_mapper_registry.c index 2c44b9d4903..0935ddbdbd1 100644 --- a/src/core/ext/client_channel/proxy_mapper_registry.c +++ b/src/core/ext/client_channel/proxy_mapper_registry.c @@ -94,6 +94,14 @@ static void grpc_proxy_mapper_list_destroy(grpc_proxy_mapper_list* list) { grpc_proxy_mapper_destroy(list->list[i]); } gpr_free(list->list); + // Clean up in case we re-initialze later. + // TODO(ctiller): This should ideally live in + // grpc_proxy_mapper_registry_init(). However, if we did this there, + // then we would do it AFTER we start registering proxy mappers from + // third-party plugins, so they'd never show up (and would leak memory). + // We probably need some sort of dependency system for plugins to fix + // this. + memset(list, 0, sizeof(*list)); } // @@ -102,9 +110,7 @@ static void grpc_proxy_mapper_list_destroy(grpc_proxy_mapper_list* list) { static grpc_proxy_mapper_list g_proxy_mapper_list; -void grpc_proxy_mapper_registry_init() { - memset(&g_proxy_mapper_list, 0, sizeof(g_proxy_mapper_list)); -} +void grpc_proxy_mapper_registry_init() {} void grpc_proxy_mapper_registry_shutdown() { grpc_proxy_mapper_list_destroy(&g_proxy_mapper_list); From 39e2e09f20dcd55339a01cef4b7b95b2d6ff30c9 Mon Sep 17 00:00:00 2001 From: Yong Ni Date: Tue, 14 Mar 2017 13:50:57 -0700 Subject: [PATCH 075/186] created gcr upload script for version compatiblity tests. --- tools/gcp/utils/gcr_upload.py | 119 ++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 tools/gcp/utils/gcr_upload.py diff --git a/tools/gcp/utils/gcr_upload.py b/tools/gcp/utils/gcr_upload.py new file mode 100755 index 00000000000..b22f8731f68 --- /dev/null +++ b/tools/gcp/utils/gcr_upload.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python2.7 +# Copyright 2017, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Upload docker images to Google Container Registry.""" + +from __future__ import print_function + +import argparse +import atexit +import os +import shutil +import subprocess +import tempfile + +argp = argparse.ArgumentParser(description='Run interop tests.') +argp.add_argument('--gcr_path', + default='gcr.io/grpc-testing', + help='Path of docker images in Google Container Registry') + +argp.add_argument('--gcr_tag', + default='latest', + help='the tag string for the images to upload') + +argp.add_argument('--with_files', + default=[], + nargs='+', + help='additional files to include in the docker image') + +argp.add_argument('--with_file_dest', + default='/var/local/image_info', + help='Destination directory for with_files inside docker image') + +argp.add_argument('--images', + default=[], + nargs='+', + help='local docker images in the form of repo:tag ' + + '(i.e. grpc_interop_java:26328ad8) to upload') + +argp.add_argument('--keep', + action='store_true', + help='keep the created local images after uploading to GCR') + + +args = argp.parse_args() + +def upload_to_gcr(image): + """Tags and Pushes a docker image in Google Containger Registry. + + image: docker image name, i.e. grpc_interop_java:26328ad8 + + A docker image image_foo:tag_old will be uploaded as + /image_foo: + after inserting extra with_files under with_file_dest in the image. The + original image name will be stored as label original_name:"image_foo:tag_old". + """ + tag_idx = image.find(':') + if tag_idx == -1: + print('Failed to parse docker image name %s' % image) + return False + new_tag = '%s/%s:%s' % (args.gcr_path, image[:tag_idx], args.gcr_tag) + + lines = ['FROM ' + image] + lines.append('LABEL original_name="%s"' % image) + + temp_dir = tempfile.mkdtemp() + atexit.register(lambda: subprocess.call(['rm', '-rf', temp_dir])) + + # Copy with_files inside the tmp directory, which will be the docker build + # context. + for f in args.with_files: + shutil.copy(f, temp_dir) + lines.append('COPY %s %s/' % (os.path.basename(f), args.with_file_dest)) + + # Create a Dockerfile. + with open(os.path.join(temp_dir, 'Dockerfile'), 'w') as f: + f.write('\n'.join(lines)) + + build_cmd = ['docker', 'build', '--rm', '--tag', new_tag, temp_dir] + subprocess.check_output(build_cmd) + + if not args.keep: + atexit.register(lambda: subprocess.call(['docker', 'rmi', new_tag])) + + # Upload to GCR. + if args.gcr_path: + subprocess.call(['gcloud', 'docker', '--', 'push', new_tag]) + + return True + + +for image in args.images: + upload_to_gcr(image) From de14410b43cfbed4c1e0b777aa18a764d92d56ad Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Wed, 15 Mar 2017 10:11:03 -0700 Subject: [PATCH 076/186] Rename on_complete_locked() to on_complete(). --- src/core/ext/client_channel/client_channel.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/core/ext/client_channel/client_channel.c b/src/core/ext/client_channel/client_channel.c index e0b84ddd660..937ebfcb55d 100644 --- a/src/core/ext/client_channel/client_channel.c +++ b/src/core/ext/client_channel/client_channel.c @@ -1138,8 +1138,7 @@ static void start_transport_stream_op_locked_inner(grpc_exec_ctx *exec_ctx, add_waiting_locked(calld, op); } -static void on_complete_locked(grpc_exec_ctx *exec_ctx, void *arg, - grpc_error *error) { +static void on_complete(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { grpc_call_element *elem = arg; call_data *calld = elem->call_data; if (calld->retry_throttle_data != NULL) { @@ -1170,7 +1169,7 @@ static void start_transport_stream_op_locked(grpc_exec_ctx *exec_ctx, void *arg, if (op->recv_trailing_metadata != NULL) { GPR_ASSERT(op->on_complete != NULL); calld->original_on_complete = op->on_complete; - grpc_closure_init(&calld->on_complete, on_complete_locked, elem, + grpc_closure_init(&calld->on_complete, on_complete, elem, grpc_schedule_on_exec_ctx); op->on_complete = &calld->on_complete; } From 1f8342933f17fab652cb00b38c3186ca57227a9d Mon Sep 17 00:00:00 2001 From: Robbie Shade Date: Fri, 10 Mar 2017 09:22:22 -0500 Subject: [PATCH 077/186] Add test feature flags --- test/core/end2end/end2end_tests.h | 7 +++++++ test/core/end2end/tests/network_status_change.c | 4 ++++ test/core/end2end/tests/resource_quota_server.c | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/test/core/end2end/end2end_tests.h b/test/core/end2end/end2end_tests.h index cb0afd9cd99..cdb26a67e9d 100644 --- a/test/core/end2end/end2end_tests.h +++ b/test/core/end2end/end2end_tests.h @@ -39,12 +39,15 @@ typedef struct grpc_end2end_test_fixture grpc_end2end_test_fixture; typedef struct grpc_end2end_test_config grpc_end2end_test_config; +/* Test feature flags. */ #define FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION 1 #define FEATURE_MASK_SUPPORTS_HOSTNAME_VERIFICATION 2 #define FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS 4 #define FEATURE_MASK_SUPPORTS_REQUEST_PROXYING 8 #define FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL 16 #define FEATURE_MASK_SUPPORTS_AUTHORITY_HEADER 32 +#define FEATURE_MASK_DOES_NOT_SUPPORT_RESOURCE_QUOTA_SERVER 64 +#define FEATURE_MASK_DOES_NOT_SUPPORT_NETWORK_STATUS_CHANGE 128 #define FAIL_AUTH_CHECK_SERVER_ARG_NAME "fail_auth_check" @@ -56,8 +59,12 @@ struct grpc_end2end_test_fixture { }; struct grpc_end2end_test_config { + /* A descriptive name for this test fixture. */ const char *name; + + /* Which features are supported by this fixture. See feature flags above. */ uint32_t feature_mask; + grpc_end2end_test_fixture (*create_fixture)(grpc_channel_args *client_args, grpc_channel_args *server_args); void (*init_client)(grpc_end2end_test_fixture *f, diff --git a/test/core/end2end/tests/network_status_change.c b/test/core/end2end/tests/network_status_change.c index 7540ce93a1b..d7a4106459d 100644 --- a/test/core/end2end/tests/network_status_change.c +++ b/test/core/end2end/tests/network_status_change.c @@ -240,6 +240,10 @@ static void test_invoke_network_status_change(grpc_end2end_test_config config) { } void network_status_change(grpc_end2end_test_config config) { + if (config.feature_mask & + FEATURE_MASK_DOES_NOT_SUPPORT_NETWORK_STATUS_CHANGE) { + return; + } test_invoke_network_status_change(config); } diff --git a/test/core/end2end/tests/resource_quota_server.c b/test/core/end2end/tests/resource_quota_server.c index 4f9ed7a3a17..db26b4480e0 100644 --- a/test/core/end2end/tests/resource_quota_server.c +++ b/test/core/end2end/tests/resource_quota_server.c @@ -113,6 +113,10 @@ static grpc_slice generate_random_slice() { } void resource_quota_server(grpc_end2end_test_config config) { + if (config.feature_mask & + FEATURE_MASK_DOES_NOT_SUPPORT_RESOURCE_QUOTA_SERVER) { + return; + } grpc_resource_quota *resource_quota = grpc_resource_quota_create("test_server"); grpc_resource_quota_resize(resource_quota, 5 * 1024 * 1024); From 30ddc63fdf668f37d9e5c104eb9def44170dc883 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 21 Feb 2017 12:28:28 -0800 Subject: [PATCH 078/186] Suppress race caused by cached_size tracking in protobuf --- tools/tsan_suppressions.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/tsan_suppressions.txt b/tools/tsan_suppressions.txt index 765fa098f92..e0c79072288 100644 --- a/tools/tsan_suppressions.txt +++ b/tools/tsan_suppressions.txt @@ -6,6 +6,8 @@ race:cleanse_ctr race:ssleay_rand_add race:ssleay_rand_bytes race:__sleep_for -# protobuf has an idempotent write race in ByteSize +# protobuf has an idempotent write race in ByteSize/GetCachedSize # https://github.com/google/protobuf/issues/2169 race:ByteSize +race:ByteSizeLong +race:GetCachedSize From f3147b3a7c92212ca6e2289222d9a7d52e0e0f78 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 11:34:08 -0700 Subject: [PATCH 079/186] watch channel state without the gil to fix deadlock on abrupt SIGTERM --- src/ruby/end2end/channel_state_driver.rb | 6 ++--- src/ruby/ext/grpc/rb_channel.c | 33 ++++++++++++++++++++---- src/ruby/qps/worker.rb | 2 -- tools/run_tests/run_tests.py | 1 - 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/src/ruby/end2end/channel_state_driver.rb b/src/ruby/end2end/channel_state_driver.rb index cab0147e1f9..8ef32acfffe 100755 --- a/src/ruby/end2end/channel_state_driver.rb +++ b/src/ruby/end2end/channel_state_driver.rb @@ -29,8 +29,7 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# smoke test for a grpc-using app that receives and -# handles process-ending signals +# make sure that the client doesn't hang when process ended abruptly require_relative './end2end_common' @@ -54,7 +53,8 @@ def main STDERR.puts "timeout wait for client pid #{client_pid}" Process.kill('SIGKILL', client_pid) Process.wait(client_pid) - raise 'Timed out waiting for client process. It likely hangs' + STDERR.puts "killed client child" + raise 'Timed out waiting for client process. It likely hangs when ended abruptly' end server_runner.stop diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index d143c54d21b..08d48f2a047 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -191,7 +191,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { wrapper->safe_to_destroy = 0; wrapper->request_safe_destroy = 0; - gpr_cv_signal(&wrapper->channel_cv); + gpr_cv_broadcast(&wrapper->channel_cv); gpr_mu_unlock(&wrapper->channel_mu); @@ -241,6 +241,26 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, grpc_channel_check_connectivity_state(ch, grpc_try_to_connect)); } +typedef struct watch_state_stack { + grpc_rb_channel *wrapper; + gpr_timespec deadline; +} watch_state_stack; + +static void *watch_channel_state_without_gvl(void *arg) { + gpr_timespec deadline = ((watch_state_stack*)arg)->deadline; + grpc_rb_channel *wrapper = ((watch_state_stack*)arg)->wrapper; + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, deadline); + return NULL; +} + +static void watch_channel_state_unblocking_func(void *arg) { + grpc_rb_channel *wrapper = (grpc_rb_channel*)arg; + gpr_log(GPR_DEBUG, "GRPC_RUBY: watch channel state unblocking func called"); + gpr_mu_lock(&wrapper->channel_mu); + gpr_cv_broadcast(&wrapper->channel_cv); + gpr_mu_unlock(&wrapper->channel_mu); +} + /* Wait until the channel's connectivity state becomes different from * "last_state", or "deadline" expires. * Returns true if the the channel's connectivity state becomes @@ -252,6 +272,7 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, VALUE last_state, VALUE deadline) { grpc_rb_channel *wrapper = NULL; + watch_state_stack stack; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); @@ -279,7 +300,9 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, gpr_mu_unlock(&wrapper->channel_mu); return Qfalse; } - gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, grpc_rb_time_timeval(deadline, /* absolute time */ 0)); + stack.wrapper = wrapper; + stack.deadline = grpc_rb_time_timeval(deadline, 0); + rb_thread_call_without_gvl(watch_channel_state_without_gvl, &stack, watch_channel_state_unblocking_func, wrapper); if (wrapper->request_safe_destroy) { gpr_mu_unlock(&wrapper->channel_mu); rb_raise(rb_eRuntimeError, "channel closed during call to watch_connectivity_state"); @@ -403,7 +426,7 @@ static void grpc_rb_channel_try_register_connection_polling( gpr_mu_lock(&wrapper->channel_mu); if (wrapper->request_safe_destroy) { wrapper->safe_to_destroy = 1; - gpr_cv_signal(&wrapper->channel_cv); + gpr_cv_broadcast(&wrapper->channel_cv); gpr_mu_unlock(&wrapper->channel_mu); return; } @@ -412,7 +435,7 @@ static void grpc_rb_channel_try_register_connection_polling( conn_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); if (conn_state != wrapper->current_connectivity_state) { wrapper->current_connectivity_state = conn_state; - gpr_cv_signal(&wrapper->channel_cv); + gpr_cv_broadcast(&wrapper->channel_cv); } // avoid posting work to the channel polling cq if it's been shutdown if (!abort_channel_polling && conn_state != GRPC_CHANNEL_SHUTDOWN) { @@ -420,7 +443,7 @@ static void grpc_rb_channel_try_register_connection_polling( wrapper->wrapped, conn_state, sleep_time, channel_polling_cq, wrapper); } else { wrapper->safe_to_destroy = 1; - gpr_cv_signal(&wrapper->channel_cv); + gpr_cv_broadcast(&wrapper->channel_cv); } gpr_mu_unlock(&global_connection_polling_mu); gpr_mu_unlock(&wrapper->channel_mu); diff --git a/src/ruby/qps/worker.rb b/src/ruby/qps/worker.rb index 318c1f9e22c..61a0b723a3f 100755 --- a/src/ruby/qps/worker.rb +++ b/src/ruby/qps/worker.rb @@ -36,8 +36,6 @@ lib_dir = File.join(File.dirname(this_dir), 'lib') $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir) $LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir) -puts $LOAD_PATH - require 'grpc' require 'optparse' require 'histogram' diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py index dc17e738e6e..573196fbb7d 100755 --- a/tools/run_tests/run_tests.py +++ b/tools/run_tests/run_tests.py @@ -695,7 +695,6 @@ class RubyLanguage(object): tests = [self.config.job_spec(['tools/run_tests/helper_scripts/run_ruby.sh'], timeout_seconds=10*60, environ=_FORCE_ENVIRON_FOR_WRAPPERS)] - # note these aren't getting ran on windows since no workers tests.append(self.config.job_spec(['tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh'], timeout_seconds=10*60, environ=_FORCE_ENVIRON_FOR_WRAPPERS)) From 70bc4921e15f813c118477e26ea4bc5267b5c7e0 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 14:00:46 -0700 Subject: [PATCH 080/186] add another currently failing test related to channels and deadlock --- src/ruby/end2end/channel_closing_client.rb | 80 +++++++++++++++++++ src/ruby/end2end/channel_closing_driver.rb | 65 +++++++++++++++ .../helper_scripts/run_ruby_end2end_tests.sh | 1 + 3 files changed, 146 insertions(+) create mode 100755 src/ruby/end2end/channel_closing_client.rb create mode 100755 src/ruby/end2end/channel_closing_driver.rb diff --git a/src/ruby/end2end/channel_closing_client.rb b/src/ruby/end2end/channel_closing_client.rb new file mode 100755 index 00000000000..88fa9ae5e66 --- /dev/null +++ b/src/ruby/end2end/channel_closing_client.rb @@ -0,0 +1,80 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +require_relative './end2end_common' + +class ChannelClosingClientController < ClientControl::ClientController::Service + def initialize(ch) + @ch = ch + end + def shutdown(_, _) + STDERR.puts "about to close channel" + @ch.close + STDERR.puts "just closed channel" + end +end + +def main + client_control_port = '' + server_port = '' + OptionParser.new do |opts| + opts.on('--client_control_port=P', String) do |p| + client_control_port = p + end + opts.on('--server_port=P', String) do |p| + server_port = p + end + end.parse! + + ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, :this_channel_is_insecure) + + srv = GRPC::RpcServer.new + thd = Thread.new do + srv.add_http2_port("0.0.0.0:#{client_control_port}", :this_port_is_insecure) + srv.handle(ChannelClosingClientController.new(ch)) + srv.run + end + + # this should break out once the channel is closed + loop do + state = ch.connectivity_state(true) + begin + ch.watch_connectivity_state(state, Time.now + 360) + rescue RuntimeException => e + break + end + end + + srv.stop + thd.join +end + +main diff --git a/src/ruby/end2end/channel_closing_driver.rb b/src/ruby/end2end/channel_closing_driver.rb new file mode 100755 index 00000000000..924fbe3bee2 --- /dev/null +++ b/src/ruby/end2end/channel_closing_driver.rb @@ -0,0 +1,65 @@ +#!/usr/bin/env ruby + +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# make sure that the client doesn't hang when process ended abruptly + +require_relative './end2end_common' + +def main + STDERR.puts "start server" + server_runner = ServerRunner.new + server_port = server_runner.run + + sleep 1 + + STDERR.puts "start client" + control_stub, client_pid = start_client("channel_closing_client.rb", server_port) + + sleep 3 + + + begin + Timeout.timeout(10) do + control_stub.shutdown(ClientControl::Void.new) + Process.wait(client_pid) + end + rescue Timeout::Error + STDERR.puts "timeout wait for client pid #{client_pid}" + Process.kill('SIGKILL', client_pid) + Process.wait(client_pid) + STDERR.puts "killed client child" + raise 'Timed out waiting for client process. It likely hangs when a channel is closed while connectivity is watched' + end + + server_runner.stop +end + +main diff --git a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh index 518848b9508..eb75878caf9 100755 --- a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh +++ b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh @@ -36,4 +36,5 @@ cd $(dirname $0)/../../.. EXIT_CODE=0 ruby src/ruby/end2end/sig_handling_driver.rb || EXIT_CODE=1 ruby src/ruby/end2end/channel_state_driver.rb || EXIT_CODE=1 +ruby src/ruby/end2end/channel_closing_driver.rb || EXIT_CODE=1 exit $EXIT_CODE From c7f0d6ac5ad1405f0094a4251a6320ae97eabfa0 Mon Sep 17 00:00:00 2001 From: Matt Kwong Date: Wed, 15 Mar 2017 15:05:34 -0700 Subject: [PATCH 081/186] Increase test timeout for Linux portability --- tools/internal_ci/linux/grpc_portability.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/internal_ci/linux/grpc_portability.cfg b/tools/internal_ci/linux/grpc_portability.cfg index 0c25661d624..5cc49f10462 100644 --- a/tools/internal_ci/linux/grpc_portability.cfg +++ b/tools/internal_ci/linux/grpc_portability.cfg @@ -31,7 +31,7 @@ # Location of the continuous shell script in repository. build_file: "grpc/tools/internal_ci/linux/grpc_portability.sh" -timeout_mins: 360 +timeout_mins: 720 action { define_artifacts { regex: "**/*sponge_log.xml" From 563ec5324f60b8ea521b41a1a440735b8bf6d2a6 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 15:54:49 -0700 Subject: [PATCH 082/186] stop mixing gpr mutexes and the ruby gil to fix channel closing deadlock --- src/ruby/end2end/channel_closing_client.rb | 10 ++-- src/ruby/ext/grpc/rb_channel.c | 69 +++++++++++++--------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/ruby/end2end/channel_closing_client.rb b/src/ruby/end2end/channel_closing_client.rb index 88fa9ae5e66..a9df0784217 100755 --- a/src/ruby/end2end/channel_closing_client.rb +++ b/src/ruby/end2end/channel_closing_client.rb @@ -36,9 +36,8 @@ class ChannelClosingClientController < ClientControl::ClientController::Service @ch = ch end def shutdown(_, _) - STDERR.puts "about to close channel" @ch.close - STDERR.puts "just closed channel" + ClientControl::Void.new end end @@ -63,12 +62,13 @@ def main srv.run end - # this should break out once the channel is closed + # this should break out with an exception once the channel is closed loop do - state = ch.connectivity_state(true) begin + state = ch.connectivity_state(true) ch.watch_connectivity_state(state, Time.now + 360) - rescue RuntimeException => e + rescue RuntimeError => e + STDERR.puts "(expected) error occurred: #{e.inspect}" break end end diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 08d48f2a047..94a10faf3fd 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -78,6 +78,7 @@ typedef struct grpc_rb_channel { int safe_to_destroy; grpc_connectivity_state current_connectivity_state; + int mu_init_done; gpr_mu channel_mu; gpr_cv channel_cv; } grpc_rb_channel; @@ -106,6 +107,11 @@ static void grpc_rb_channel_free(void *p) { ch->wrapped = NULL; } + if (ch->mu_init_done) { + gpr_mu_destroy(&ch->channel_mu); + gpr_cv_destroy(&ch->channel_cv); + } + xfree(p); } @@ -164,6 +170,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { rb_scan_args(argc, argv, "3", &target, &channel_args, &credentials); TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); + wrapper->mu_init_done = 0; target_chars = StringValueCStr(target); grpc_rb_hash_convert_to_channel_args(channel_args, &args); if (TYPE(credentials) == T_SYMBOL) { @@ -185,6 +192,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { gpr_mu_init(&wrapper->channel_mu); gpr_cv_init(&wrapper->channel_cv); + wrapper->mu_init_done = 1; gpr_mu_lock(&wrapper->channel_mu); wrapper->current_connectivity_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); @@ -244,13 +252,38 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, typedef struct watch_state_stack { grpc_rb_channel *wrapper; gpr_timespec deadline; + int last_state; } watch_state_stack; static void *watch_channel_state_without_gvl(void *arg) { - gpr_timespec deadline = ((watch_state_stack*)arg)->deadline; - grpc_rb_channel *wrapper = ((watch_state_stack*)arg)->wrapper; + watch_state_stack *stack = (watch_state_stack*)arg; + + gpr_timespec deadline = stack->deadline; + grpc_rb_channel *wrapper = stack->wrapper; + int last_state = stack->last_state; + + gpr_mu_lock(&wrapper->channel_mu); + if (wrapper->current_connectivity_state != last_state) { + gpr_mu_unlock(&wrapper->channel_mu); + return (void*)0; + } + if (wrapper->request_safe_destroy) { + gpr_mu_unlock(&wrapper->channel_mu); + return (void*)0; + } + if (wrapper->safe_to_destroy) { + gpr_mu_unlock(&wrapper->channel_mu); + return (void*)0; + } + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, deadline); - return NULL; + + if (wrapper->current_connectivity_state != last_state) { + gpr_mu_unlock(&wrapper->channel_mu); + return (void*)1; + } + gpr_mu_unlock(&wrapper->channel_mu); + return (void*)0; } static void watch_channel_state_unblocking_func(void *arg) { @@ -273,6 +306,7 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, VALUE deadline) { grpc_rb_channel *wrapper = NULL; watch_state_stack stack; + void* out; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); @@ -286,33 +320,13 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, return Qnil; } - gpr_mu_lock(&wrapper->channel_mu); - if (wrapper->current_connectivity_state != NUM2LONG(last_state)) { - gpr_mu_unlock(&wrapper->channel_mu); - return Qtrue; - } - if (wrapper->request_safe_destroy) { - gpr_mu_unlock(&wrapper->channel_mu); - rb_raise(rb_eRuntimeError, "watch_connectivity_state called on closed channel"); - return Qfalse; - } - if (wrapper->safe_to_destroy) { - gpr_mu_unlock(&wrapper->channel_mu); - return Qfalse; - } stack.wrapper = wrapper; stack.deadline = grpc_rb_time_timeval(deadline, 0); - rb_thread_call_without_gvl(watch_channel_state_without_gvl, &stack, watch_channel_state_unblocking_func, wrapper); - if (wrapper->request_safe_destroy) { - gpr_mu_unlock(&wrapper->channel_mu); - rb_raise(rb_eRuntimeError, "channel closed during call to watch_connectivity_state"); - return Qfalse; - } - if (wrapper->current_connectivity_state != NUM2LONG(last_state)) { - gpr_mu_unlock(&wrapper->channel_mu); + stack.last_state = NUM2LONG(last_state); + out = rb_thread_call_without_gvl(watch_channel_state_without_gvl, &stack, watch_channel_state_unblocking_func, wrapper); + if (out) { return Qtrue; } - gpr_mu_unlock(&wrapper->channel_mu); return Qfalse; } @@ -460,9 +474,6 @@ static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { GPR_ASSERT(wrapper->safe_to_destroy); gpr_mu_unlock(&wrapper->channel_mu); - gpr_mu_destroy(&wrapper->channel_mu); - gpr_cv_destroy(&wrapper->channel_cv); - grpc_channel_destroy(wrapper->wrapped); } From 4109c23734d572cc19cd7e54571757c854db27f7 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 16:07:03 -0700 Subject: [PATCH 083/186] add a README for new test directory --- src/ruby/end2end/README | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/ruby/end2end/README diff --git a/src/ruby/end2end/README b/src/ruby/end2end/README new file mode 100644 index 00000000000..f0dc14fe9b6 --- /dev/null +++ b/src/ruby/end2end/README @@ -0,0 +1,18 @@ +This directory contains some grpc-ruby end to end tests. + +Each test here involves two files: a "driver" and a "client". For example, +the "channel_closing" test involves channel_closing_driver.rb +and channel_closing_client.rb. + +Typically, the "driver will start up a simple "echo" server, and then +spawn a client. It gives the client the address of the "echo" server as +well as an address to listen on for control rpcs. Depending on the test, the +client usually starts up a "ClientControl" grpc server for the driver to +interact with (the driver can tell the client process to do strange things at +different times, depending on the test). + +So far these tests are mostly useful for testing process-shutdown related +situations, since the client's run in separate processes. + +These tests are invoked through the "tools/run_tests/run_tests.py" script (the +Rakefile doesn't start these). From 488d41912567708ad4934ad35b41ac7275d65ec9 Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Wed, 15 Mar 2017 23:09:52 +0000 Subject: [PATCH 084/186] Update health to current gRPC code elements --- src/python/grpcio_health_checking/grpc_health/v1/health.py | 3 ++- .../grpcio_tests/tests/health_check/_health_servicer_test.py | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/python/grpcio_health_checking/grpc_health/v1/health.py b/src/python/grpcio_health_checking/grpc_health/v1/health.py index f0f11cf84b0..e92c2659b7e 100644 --- a/src/python/grpcio_health_checking/grpc_health/v1/health.py +++ b/src/python/grpcio_health_checking/grpc_health/v1/health.py @@ -33,9 +33,10 @@ import threading import grpc from grpc_health.v1 import health_pb2 +from grpc_health.v1 import health_pb2_grpc -class HealthServicer(health_pb2.HealthServicer): +class HealthServicer(health_pb2_grpc.HealthServicer): """Servicer handling RPCs for service statuses.""" def __init__(self): diff --git a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py index 363b4c5f994..1bc8669dad9 100644 --- a/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py +++ b/src/python/grpcio_tests/tests/health_check/_health_servicer_test.py @@ -34,6 +34,7 @@ import grpc from grpc.framework.foundation import logging_pool from grpc_health.v1 import health from grpc_health.v1 import health_pb2 +from grpc_health.v1 import health_pb2_grpc from tests.unit.framework.common import test_constants @@ -52,11 +53,11 @@ class HealthServicerTest(unittest.TestCase): server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY) self._server = grpc.server(server_pool) port = self._server.add_insecure_port('[::]:0') - health_pb2.add_HealthServicer_to_server(servicer, self._server) + health_pb2_grpc.add_HealthServicer_to_server(servicer, self._server) self._server.start() channel = grpc.insecure_channel('localhost:%d' % port) - self._stub = health_pb2.HealthStub(channel) + self._stub = health_pb2_grpc.HealthStub(channel) def test_empty_service(self): request = health_pb2.HealthCheckRequest() From 8b371e23c0091b838807b0bc0e9a3026c6f02fc9 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Wed, 15 Mar 2017 16:15:13 -0700 Subject: [PATCH 085/186] Change GIL aquire functions to make it c-core thread safe --- .../grpc/_cython/_cygrpc/security.pxd.pxi | 2 +- .../grpc/_cython/_cygrpc/security.pyx.pxi | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/security.pxd.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/security.pxd.pxi index 3a952ca309a..9915b0ed1ab 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/security.pxd.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/security.pxd.pxi @@ -29,4 +29,4 @@ cdef grpc_ssl_roots_override_result ssl_roots_override_callback( - char **pem_root_certs) with gil + char **pem_root_certs) nogil diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi b/src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi index 20fc1c5fce7..357b0330d5c 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi +++ b/src/python/grpcio/grpc/_cython/_cygrpc/security.pyx.pxi @@ -33,12 +33,14 @@ import pkg_resources cdef grpc_ssl_roots_override_result ssl_roots_override_callback( - char **pem_root_certs) with gil: - temporary_pem_root_certs = pkg_resources.resource_string( - __name__.rstrip('.cygrpc'), '_credentials/roots.pem') - pem_root_certs[0] = gpr_malloc(len(temporary_pem_root_certs) + 1) - memcpy( - pem_root_certs[0], temporary_pem_root_certs, - len(temporary_pem_root_certs)) - pem_root_certs[0][len(temporary_pem_root_certs)] = '\0' + char **pem_root_certs) nogil: + with gil: + temporary_pem_root_certs = pkg_resources.resource_string( + __name__.rstrip('.cygrpc'), '_credentials/roots.pem') + pem_root_certs[0] = gpr_malloc(len(temporary_pem_root_certs) + 1) + memcpy( + pem_root_certs[0], temporary_pem_root_certs, + len(temporary_pem_root_certs)) + pem_root_certs[0][len(temporary_pem_root_certs)] = '\0' + return GRPC_SSL_ROOTS_OVERRIDE_OK From 38901585d43a7bb04b7f9696b358e04882be1351 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Wed, 15 Mar 2017 16:23:36 -0700 Subject: [PATCH 086/186] Workaround new wget SSL failure --- tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile | 2 +- tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile index 71098629112..06be7bec184 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile @@ -39,7 +39,7 @@ RUN yum update -y RUN yum remove -y git RUN yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc RUN cd /usr/src && \ - wget https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ + curl -O -L https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ tar xzf git-2.0.5.tar.gz RUN cd /usr/src/git-2.0.5 && \ make prefix=/usr/local/git all && \ diff --git a/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile index 36286bca53d..8693e30cb4a 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile @@ -39,7 +39,7 @@ RUN yum update -y RUN yum remove -y git RUN yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc RUN cd /usr/src && \ - wget https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ + curl -O -L https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ tar xzf git-2.0.5.tar.gz RUN cd /usr/src/git-2.0.5 && \ make prefix=/usr/local/git all && \ From af3213f38bb5c3737c94a685ee508d289552b5a1 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 16:44:52 -0700 Subject: [PATCH 087/186] remove now-unused channel completion queues --- src/ruby/ext/grpc/rb_channel.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 94a10faf3fd..3b1111e5e2c 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -73,7 +73,6 @@ typedef struct grpc_rb_channel { /* The actual channel */ grpc_channel *wrapped; - grpc_completion_queue *queue; int request_safe_destroy; int safe_to_destroy; grpc_connectivity_state current_connectivity_state; @@ -103,7 +102,6 @@ static void grpc_rb_channel_free(void *p) { if (ch->wrapped != NULL) { grpc_rb_channel_safe_destroy(ch); - grpc_rb_completion_queue_destroy(ch->queue); ch->wrapped = NULL; } @@ -215,7 +213,6 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { } rb_ivar_set(self, id_target, target); wrapper->wrapped = ch; - wrapper->queue = grpc_completion_queue_create(NULL); return self; } @@ -404,8 +401,6 @@ static VALUE grpc_rb_channel_destroy(VALUE self) { ch = wrapper->wrapped; if (ch != NULL) { grpc_rb_channel_safe_destroy(wrapper); - GPR_ASSERT(wrapper->queue != NULL); - grpc_rb_completion_queue_destroy(wrapper->queue); wrapper->wrapped = NULL; } From 42053039ff6515cdbb6192134266411e35a73823 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Wed, 15 Mar 2017 17:08:32 -0700 Subject: [PATCH 088/186] Changes --- tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile | 2 +- tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile index 71098629112..06be7bec184 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux_x64/Dockerfile @@ -39,7 +39,7 @@ RUN yum update -y RUN yum remove -y git RUN yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc RUN cd /usr/src && \ - wget https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ + curl -O -L https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ tar xzf git-2.0.5.tar.gz RUN cd /usr/src/git-2.0.5 && \ make prefix=/usr/local/git all && \ diff --git a/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile index 36286bca53d..8693e30cb4a 100644 --- a/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile +++ b/tools/dockerfile/grpc_artifact_python_manylinux_x86/Dockerfile @@ -39,7 +39,7 @@ RUN yum update -y RUN yum remove -y git RUN yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc RUN cd /usr/src && \ - wget https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ + curl -O -L https://kernel.org/pub/software/scm/git/git-2.0.5.tar.gz && \ tar xzf git-2.0.5.tar.gz RUN cd /usr/src/git-2.0.5 && \ make prefix=/usr/local/git all && \ From 94a4ed93a1bd88a29886bcc377e1eba48013c7ae Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 15 Mar 2017 17:15:39 -0700 Subject: [PATCH 089/186] Fix the error in flush read that was causing jenkins timeout --- src/core/ext/transport/cronet/transport/cronet_transport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index fabfaf8a270..6499eff3e93 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -62,7 +62,7 @@ } while (0) /* TODO (makdharma): Hook up into the wider tracing mechanism */ -int grpc_cronet_trace = 0; +int grpc_cronet_trace = 1; enum e_op_result { ACTION_TAKEN_WITH_CALLBACK, @@ -272,7 +272,7 @@ static void maybe_flush_read(stream_obj *s) { /* Whenever the evaluation of any of the two condition is changed, we check * whether we should enter the flush read state. */ if (s->state.pending_recv_trailing_metadata && s->state.fail_state) { - if (!s->state.flush_read) { + if (!s->state.flush_read && !s->state.rs.read_stream_closed) { CRONET_LOG(GPR_DEBUG, "%p: Flush read", s); s->state.flush_read = true; null_and_maybe_free_read_buffer(s); From 071f74f6f13bc806169e0d3c5ca947e3b9b0605d Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 15 Mar 2017 17:32:40 -0700 Subject: [PATCH 090/186] add copyright header to fix failing sanity tests --- src/ruby/end2end/{README => README.md} | 2 +- src/ruby/end2end/channel_closing_driver.rb | 2 +- src/ruby/end2end/gen_protos.sh | 30 ++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) rename src/ruby/end2end/{README => README.md} (91%) diff --git a/src/ruby/end2end/README b/src/ruby/end2end/README.md similarity index 91% rename from src/ruby/end2end/README rename to src/ruby/end2end/README.md index f0dc14fe9b6..ea5ab6d4bcb 100644 --- a/src/ruby/end2end/README +++ b/src/ruby/end2end/README.md @@ -4,7 +4,7 @@ Each test here involves two files: a "driver" and a "client". For example, the "channel_closing" test involves channel_closing_driver.rb and channel_closing_client.rb. -Typically, the "driver will start up a simple "echo" server, and then +Typically, the "driver" will start up a simple "echo" server, and then spawn a client. It gives the client the address of the "echo" server as well as an address to listen on for control rpcs. Depending on the test, the client usually starts up a "ClientControl" grpc server for the driver to diff --git a/src/ruby/end2end/channel_closing_driver.rb b/src/ruby/end2end/channel_closing_driver.rb index 924fbe3bee2..98c8eaa1cdf 100755 --- a/src/ruby/end2end/channel_closing_driver.rb +++ b/src/ruby/end2end/channel_closing_driver.rb @@ -29,7 +29,7 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# make sure that the client doesn't hang when process ended abruptly +# make sure that the client doesn't hang when channel is closed explictly while it's used require_relative './end2end_common' diff --git a/src/ruby/end2end/gen_protos.sh b/src/ruby/end2end/gen_protos.sh index c26b5572da1..f78d9ad394a 100644 --- a/src/ruby/end2end/gen_protos.sh +++ b/src/ruby/end2end/gen_protos.sh @@ -1,2 +1,32 @@ #!/bin/bash + +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + grpc_tools_ruby_protoc -I protos --ruby_out=lib --grpc_out=lib protos/echo.proto protos/client_control.proto From 98e282a58519e3854973a1486aaba3d90f15a866 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 17 Feb 2017 18:05:23 -0800 Subject: [PATCH 091/186] Eliminate std::placeholders --- test/cpp/qps/server_async.cc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/cpp/qps/server_async.cc b/test/cpp/qps/server_async.cc index b3a06aeaf53..b58d91eea63 100644 --- a/test/cpp/qps/server_async.cc +++ b/test/cpp/qps/server_async.cc @@ -103,24 +103,25 @@ class AsyncQpsServerTest final : public grpc::testing::Server { server_ = builder.BuildAndStart(); - using namespace std::placeholders; - auto process_rpc_bound = - std::bind(process_rpc, config.payload_config(), _1, _2); + std::bind(process_rpc, config.payload_config(), std::placeholders::_1, + std::placeholders::_2); for (int i = 0; i < 15000; i++) { for (int j = 0; j < num_threads; j++) { if (request_unary_function) { - auto request_unary = - std::bind(request_unary_function, &async_service_, _1, _2, _3, - srv_cqs_[j].get(), srv_cqs_[j].get(), _4); + auto request_unary = std::bind( + request_unary_function, &async_service_, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, srv_cqs_[j].get(), + srv_cqs_[j].get(), std::placeholders::_4); contexts_.emplace_back( new ServerRpcContextUnaryImpl(request_unary, process_rpc_bound)); } if (request_streaming_function) { - auto request_streaming = - std::bind(request_streaming_function, &async_service_, _1, _2, - srv_cqs_[j].get(), srv_cqs_[j].get(), _3); + auto request_streaming = std::bind( + request_streaming_function, &async_service_, + std::placeholders::_1, std::placeholders::_2, srv_cqs_[j].get(), + srv_cqs_[j].get(), std::placeholders::_3); contexts_.emplace_back(new ServerRpcContextStreamingImpl( request_streaming, process_rpc_bound)); } From 364fa33576bc09407b37b3ecca43f7b26d4f7c21 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 16 Mar 2017 08:00:36 -0700 Subject: [PATCH 092/186] Override subchannel address in channel args when proxy mapper is used. --- src/core/ext/client_channel/subchannel.c | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/core/ext/client_channel/subchannel.c b/src/core/ext/client_channel/subchannel.c index 5df0a9060d0..2528941981e 100644 --- a/src/core/ext/client_channel/subchannel.c +++ b/src/core/ext/client_channel/subchannel.c @@ -340,17 +340,15 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx, GPR_ASSERT(new_address != NULL); gpr_free(addr); addr = new_address; - if (new_args != NULL) c->args = new_args; - } - if (c->args == NULL) { - static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS}; - grpc_arg new_arg = grpc_create_subchannel_address_arg(addr); - c->args = grpc_channel_args_copy_and_add_and_remove( - args->args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &new_arg, - 1); - gpr_free(new_arg.value.string); } + static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS}; + grpc_arg new_arg = grpc_create_subchannel_address_arg(addr); gpr_free(addr); + c->args = grpc_channel_args_copy_and_add_and_remove( + new_args != NULL ? new_args : args->args, keys_to_remove, + GPR_ARRAY_SIZE(keys_to_remove), &new_arg, 1); + gpr_free(new_arg.value.string); + if (new_args != NULL) grpc_channel_args_destroy(exec_ctx, new_args); c->root_external_state_watcher.next = c->root_external_state_watcher.prev = &c->root_external_state_watcher; grpc_closure_init(&c->connected, subchannel_connected, c, From 1292906a7cbbc21748d356e9317bdc83817ab043 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Mar 2017 09:36:58 -0700 Subject: [PATCH 093/186] Disable cronet trace --- src/core/ext/transport/cronet/transport/cronet_transport.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 6499eff3e93..e1873603306 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -62,7 +62,7 @@ } while (0) /* TODO (makdharma): Hook up into the wider tracing mechanism */ -int grpc_cronet_trace = 1; +int grpc_cronet_trace = 0; enum e_op_result { ACTION_TAKEN_WITH_CALLBACK, From 2ccd502ed4e3fffa2cccf7d3e0aa7103caf37bf0 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 16 Mar 2017 09:57:46 -0700 Subject: [PATCH 094/186] Add cast --- src/core/lib/surface/channel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c index 56beb7d96e6..2b700b2f675 100644 --- a/src/core/lib/surface/channel.c +++ b/src/core/lib/surface/channel.c @@ -119,7 +119,7 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, gpr_atm_no_barrier_store( &channel->call_size_estimate, - CHANNEL_STACK_FROM_CHANNEL(channel)->call_stack_size); + (gpr_atm)CHANNEL_STACK_FROM_CHANNEL(channel)->call_stack_size); grpc_compression_options_init(&channel->compression_options); for (size_t i = 0; i < args->num_args; i++) { From 3f2413d15ed545f4d5902af067fbe285499e11c0 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 8 Mar 2017 10:58:48 -0800 Subject: [PATCH 095/186] Use the right encoding overhead number in remote interop test with Cronet --- src/objective-c/tests/InteropTests.m | 6 ------ .../InteropTestsRemoteWithCronet.m | 4 ++++ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/objective-c/tests/InteropTests.m b/src/objective-c/tests/InteropTests.m index 5584246ad94..766fa19d857 100644 --- a/src/objective-c/tests/InteropTests.m +++ b/src/objective-c/tests/InteropTests.m @@ -169,8 +169,6 @@ [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; } -#ifndef GRPC_COMPILE_WITH_CRONET -// TODO (mxyan): Fix this test - (void)testResponsesOverMaxSizeFailWithActionableMessage { XCTAssertNotNil(self.class.host); __weak XCTestExpectation *expectation = [self expectationWithDescription:@"ResponseOverMaxSize"]; @@ -191,7 +189,6 @@ [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; } -#endif - (void)testResponsesOver4MBAreAcceptedIfOptedIn { XCTAssertNotNil(self.class.host); @@ -327,8 +324,6 @@ [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; } -#ifndef GRPC_COMPILE_WITH_CRONET -// TODO(makdharma@): Fix this test - (void)testEmptyStreamRPC { XCTAssertNotNil(self.class.host); __weak XCTestExpectation *expectation = [self expectationWithDescription:@"EmptyStream"]; @@ -342,7 +337,6 @@ }]; [self waitForExpectationsWithTimeout:TEST_TIMEOUT handler:nil]; } -#endif - (void)testCancelAfterBeginRPC { XCTAssertNotNil(self.class.host); diff --git a/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m b/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m index fab8ad8d25f..7bc303ac10d 100644 --- a/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m +++ b/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m @@ -47,4 +47,8 @@ static NSString * const kRemoteSSLHost = @"grpc-test.sandbox.googleapis.com"; return kRemoteSSLHost; } +- (int32_t)encodingOverhead { + return 12; // bytes +} + @end From f69a885f176c1bac9b15d7b270a9dc50fbf3a4f6 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 8 Mar 2017 14:54:11 -0800 Subject: [PATCH 096/186] Add comment to encodingOverhead --- src/objective-c/tests/InteropTests.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/objective-c/tests/InteropTests.m b/src/objective-c/tests/InteropTests.m index 766fa19d857..d964f53e8e2 100644 --- a/src/objective-c/tests/InteropTests.m +++ b/src/objective-c/tests/InteropTests.m @@ -90,6 +90,9 @@ return nil; } +// This number indicates how many bytes of overhead does Protocol Buffers encoding add onto the +// message. The number varies as different message.proto is used on different servers. The actual +// number for each interop server is overridden in corresponding derived test classes. - (int32_t)encodingOverhead { return 0; } From 10112e50defa8b4ea10a153fd206ae8a1f1665a6 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 10 Mar 2017 11:41:53 -0800 Subject: [PATCH 097/186] Use k-contant and add comment for encoding overhead --- src/objective-c/tests/InteropTestsLocalCleartext.m | 6 +++++- src/objective-c/tests/InteropTestsLocalSSL.m | 6 +++++- src/objective-c/tests/InteropTestsRemote.m | 6 +++++- .../InteropTestsRemoteWithCronet.m | 6 +++++- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/objective-c/tests/InteropTestsLocalCleartext.m b/src/objective-c/tests/InteropTestsLocalCleartext.m index b41210f50f8..49876608087 100644 --- a/src/objective-c/tests/InteropTestsLocalCleartext.m +++ b/src/objective-c/tests/InteropTestsLocalCleartext.m @@ -37,6 +37,10 @@ static NSString * const kLocalCleartextHost = @"localhost:5050"; +// The Protocol Buffers encoding overhead of local interop server. Acquired +// by experiment. Adjust this when server's proto file changes. +static int32_t kLocalInteropServerOverhead = 10; + /** Tests in InteropTests.m, sending the RPCs to a local cleartext server. */ @interface InteropTestsLocalCleartext : InteropTests @end @@ -48,7 +52,7 @@ static NSString * const kLocalCleartextHost = @"localhost:5050"; } - (int32_t)encodingOverhead { - return 10; // bytes + return kLocalInteropServerOverhead; // bytes } - (void)setUp { diff --git a/src/objective-c/tests/InteropTestsLocalSSL.m b/src/objective-c/tests/InteropTestsLocalSSL.m index 1479c5896c3..934d500abc0 100644 --- a/src/objective-c/tests/InteropTestsLocalSSL.m +++ b/src/objective-c/tests/InteropTestsLocalSSL.m @@ -37,6 +37,10 @@ static NSString * const kLocalSSLHost = @"localhost:5051"; +// The Protocol Buffers encoding overhead of local interop server. Acquired +// by experiment. Adjust this when server's proto file changes. +static int32_t kLocalInteropServerOverhead = 10; + /** Tests in InteropTests.m, sending the RPCs to a local SSL server. */ @interface InteropTestsLocalSSL : InteropTests @end @@ -48,7 +52,7 @@ static NSString * const kLocalSSLHost = @"localhost:5051"; } - (int32_t)encodingOverhead { - return 10; // bytes + return kLocalInteropServerOverhead; // bytes } - (void)setUp { diff --git a/src/objective-c/tests/InteropTestsRemote.m b/src/objective-c/tests/InteropTestsRemote.m index 70f84753bb6..9fb30aa43d0 100644 --- a/src/objective-c/tests/InteropTestsRemote.m +++ b/src/objective-c/tests/InteropTestsRemote.m @@ -37,6 +37,10 @@ static NSString * const kRemoteSSLHost = @"grpc-test.sandbox.googleapis.com"; +// The Protocol Buffers encoding overhead of remote interop server. Acquired +// by experiment. Adjust this when server's proto file changes. +static int32_t kRemoteInteropServerOverhead = 12; + /** Tests in InteropTests.m, sending the RPCs to a remote SSL server. */ @interface InteropTestsRemote : InteropTests @end @@ -48,7 +52,7 @@ static NSString * const kRemoteSSLHost = @"grpc-test.sandbox.googleapis.com"; } - (int32_t)encodingOverhead { - return 12; // bytes + return kRemoteInteropServerOverhead; // bytes } @end diff --git a/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m b/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m index 7bc303ac10d..005bac0a0d4 100644 --- a/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m +++ b/src/objective-c/tests/InteropTestsRemoteWithCronet/InteropTestsRemoteWithCronet.m @@ -37,6 +37,10 @@ static NSString * const kRemoteSSLHost = @"grpc-test.sandbox.googleapis.com"; +// The Protocol Buffers encoding overhead of remote interop server. Acquired +// by experiment. Adjust this when server's proto file changes. +static int32_t kRemoteInteropServerOverhead = 12; + /** Tests in InteropTests.m, sending the RPCs to a remote SSL server. */ @interface InteropTestsRemoteWithCronet : InteropTests @end @@ -48,7 +52,7 @@ static NSString * const kRemoteSSLHost = @"grpc-test.sandbox.googleapis.com"; } - (int32_t)encodingOverhead { - return 12; // bytes + return kRemoteInteropServerOverhead; // bytes } @end From 0e0149d3f3fecd7d899700647221fbe30a99f77c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 16 Mar 2017 10:20:28 -0700 Subject: [PATCH 098/186] Restore missing benchmarks --- .../bm_fullstack_streaming_ping_pong.cc | 229 ++++++++++++------ 1 file changed, 156 insertions(+), 73 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc b/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc index dc0e7d769ab..513974fde19 100644 --- a/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc +++ b/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc @@ -54,86 +54,144 @@ auto& force_library_initialization = Library::get(); static void* tag(intptr_t x) { return reinterpret_cast(x); } -template -static void BM_PumpStreamClientToServer(benchmark::State& state) { +// Repeatedly makes Streaming Bidi calls (exchanging a configurable number of +// messages in each call) in a loop on a single channel +// +// First parmeter (i.e state.range(0)): Message size (in bytes) to use +// Second parameter (i.e state.range(1)): Number of ping pong messages. +// Note: One ping-pong means two messages (one from client to server and +// the other from server to client): +template +static void BM_StreamingPingPong(benchmark::State& state) { + TrackCounters track_counters; + const int msg_size = state.range(0); + const int max_ping_pongs = state.range(1); + EchoTestService::AsyncService service; std::unique_ptr fixture(new Fixture(&service)); { + EchoResponse send_response; + EchoResponse recv_response; EchoRequest send_request; EchoRequest recv_request; - if (state.range(0) > 0) { - send_request.set_message(std::string(state.range(0), 'a')); + + if (msg_size > 0) { + send_request.set_message(std::string(msg_size, 'a')); + send_response.set_message(std::string(msg_size, 'b')); } - Status recv_status; - ServerContext svr_ctx; - ServerAsyncReaderWriter response_rw(&svr_ctx); - service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(), - fixture->cq(), tag(0)); + std::unique_ptr stub( EchoTestService::NewStub(fixture->channel())); - ClientContext cli_ctx; - auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1)); - int need_tags = (1 << 0) | (1 << 1); - void* t; - bool ok; - while (need_tags) { - GPR_ASSERT(fixture->cq()->Next(&t, &ok)); - GPR_ASSERT(ok); - int i = (int)(intptr_t)t; - GPR_ASSERT(need_tags & (1 << i)); - need_tags &= ~(1 << i); - } - response_rw.Read(&recv_request, tag(0)); + while (state.KeepRunning()) { - GPR_TIMER_SCOPE("BenchmarkCycle", 0); - request_rw->Write(send_request, tag(1)); - while (true) { + ServerContext svr_ctx; + ServerContextMutator svr_ctx_mut(&svr_ctx); + ServerAsyncReaderWriter response_rw(&svr_ctx); + service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(), + fixture->cq(), tag(0)); + + ClientContext cli_ctx; + ClientContextMutator cli_ctx_mut(&cli_ctx); + auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1)); + + // Establish async stream between client side and server side + void* t; + bool ok; + int need_tags = (1 << 0) | (1 << 1); + while (need_tags) { GPR_ASSERT(fixture->cq()->Next(&t, &ok)); - if (t == tag(0)) { - response_rw.Read(&recv_request, tag(0)); - } else if (t == tag(1)) { - break; - } else { - GPR_ASSERT(false); + GPR_ASSERT(ok); + int i = (int)(intptr_t)t; + GPR_ASSERT(need_tags & (1 << i)); + need_tags &= ~(1 << i); + } + + // Send 'max_ping_pongs' number of ping pong messages + int ping_pong_cnt = 0; + while (ping_pong_cnt < max_ping_pongs) { + request_rw->Write(send_request, tag(0)); // Start client send + response_rw.Read(&recv_request, tag(1)); // Start server recv + request_rw->Read(&recv_response, tag(2)); // Start client recv + + need_tags = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3); + while (need_tags) { + GPR_ASSERT(fixture->cq()->Next(&t, &ok)); + GPR_ASSERT(ok); + int i = (int)(intptr_t)t; + + // If server recv is complete, start the server send operation + if (i == 1) { + response_rw.Write(send_response, tag(3)); + } + + GPR_ASSERT(need_tags & (1 << i)); + need_tags &= ~(1 << i); } + + ping_pong_cnt++; } - } - request_rw->WritesDone(tag(1)); - need_tags = (1 << 0) | (1 << 1); - while (need_tags) { - GPR_ASSERT(fixture->cq()->Next(&t, &ok)); - int i = (int)(intptr_t)t; - GPR_ASSERT(need_tags & (1 << i)); - need_tags &= ~(1 << i); + + request_rw->WritesDone(tag(0)); + response_rw.Finish(Status::OK, tag(1)); + + Status recv_status; + request_rw->Finish(&recv_status, tag(2)); + + need_tags = (1 << 0) | (1 << 1) | (1 << 2); + while (need_tags) { + GPR_ASSERT(fixture->cq()->Next(&t, &ok)); + int i = (int)(intptr_t)t; + GPR_ASSERT(need_tags & (1 << i)); + need_tags &= ~(1 << i); + } + + GPR_ASSERT(recv_status.ok()); } } + fixture->Finish(state); fixture.reset(); - state.SetBytesProcessed(state.range(0) * state.iterations()); + state.SetBytesProcessed(msg_size * state.iterations() * max_ping_pongs * 2); + track_counters.Finish(state); } -template -static void BM_PumpStreamServerToClient(benchmark::State& state) { +// Repeatedly sends ping pong messages in a single streaming Bidi call in a loop +// First parmeter (i.e state.range(0)): Message size (in bytes) to use +template +static void BM_StreamingPingPongMsgs(benchmark::State& state) { + TrackCounters track_counters; + const int msg_size = state.range(0); + EchoTestService::AsyncService service; std::unique_ptr fixture(new Fixture(&service)); { EchoResponse send_response; EchoResponse recv_response; - if (state.range(0) > 0) { - send_response.set_message(std::string(state.range(0), 'a')); + EchoRequest send_request; + EchoRequest recv_request; + + if (msg_size > 0) { + send_request.set_message(std::string(msg_size, 'a')); + send_response.set_message(std::string(msg_size, 'b')); } - Status recv_status; + + std::unique_ptr stub( + EchoTestService::NewStub(fixture->channel())); + ServerContext svr_ctx; + ServerContextMutator svr_ctx_mut(&svr_ctx); ServerAsyncReaderWriter response_rw(&svr_ctx); service.RequestBidiStream(&svr_ctx, &response_rw, fixture->cq(), fixture->cq(), tag(0)); - std::unique_ptr stub( - EchoTestService::NewStub(fixture->channel())); + ClientContext cli_ctx; + ClientContextMutator cli_ctx_mut(&cli_ctx); auto request_rw = stub->AsyncBidiStream(&cli_ctx, fixture->cq(), tag(1)); - int need_tags = (1 << 0) | (1 << 1); + + // Establish async stream between client side and server side void* t; bool ok; + int need_tags = (1 << 0) | (1 << 1); while (need_tags) { GPR_ASSERT(fixture->cq()->Next(&t, &ok)); GPR_ASSERT(ok); @@ -141,54 +199,79 @@ static void BM_PumpStreamServerToClient(benchmark::State& state) { GPR_ASSERT(need_tags & (1 << i)); need_tags &= ~(1 << i); } - request_rw->Read(&recv_response, tag(0)); + while (state.KeepRunning()) { GPR_TIMER_SCOPE("BenchmarkCycle", 0); - response_rw.Write(send_response, tag(1)); - while (true) { + request_rw->Write(send_request, tag(0)); // Start client send + response_rw.Read(&recv_request, tag(1)); // Start server recv + request_rw->Read(&recv_response, tag(2)); // Start client recv + + need_tags = (1 << 0) | (1 << 1) | (1 << 2) | (1 << 3); + while (need_tags) { GPR_ASSERT(fixture->cq()->Next(&t, &ok)); - if (t == tag(0)) { - request_rw->Read(&recv_response, tag(0)); - } else if (t == tag(1)) { - break; - } else { - GPR_ASSERT(false); + GPR_ASSERT(ok); + int i = (int)(intptr_t)t; + + // If server recv is complete, start the server send operation + if (i == 1) { + response_rw.Write(send_response, tag(3)); } + + GPR_ASSERT(need_tags & (1 << i)); + need_tags &= ~(1 << i); } } + + request_rw->WritesDone(tag(0)); response_rw.Finish(Status::OK, tag(1)); - need_tags = (1 << 0) | (1 << 1); + Status recv_status; + request_rw->Finish(&recv_status, tag(2)); + + need_tags = (1 << 0) | (1 << 1) | (1 << 2); while (need_tags) { GPR_ASSERT(fixture->cq()->Next(&t, &ok)); int i = (int)(intptr_t)t; GPR_ASSERT(need_tags & (1 << i)); need_tags &= ~(1 << i); } + + GPR_ASSERT(recv_status.ok()); } + fixture->Finish(state); fixture.reset(); - state.SetBytesProcessed(state.range(0) * state.iterations()); + state.SetBytesProcessed(msg_size * state.iterations() * 2); + track_counters.Finish(state); } /******************************************************************************* * CONFIGURATIONS */ -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, TCP) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, UDS) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, SockPair) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamClientToServer, InProcessCHTTP2) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, TCP) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, UDS) - ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, SockPair) +// Generate Args for StreamingPingPong benchmarks. Currently generates args for +// only "small streams" (i.e streams with 0, 1 or 2 messages) +static void StreamingPingPongArgs(benchmark::internal::Benchmark* b) { + int msg_size = 0; + + b->Args({0, 0}); // spl case: 0 ping-pong msgs (msg_size doesn't matter here) + + for (msg_size = 0; msg_size <= 128 * 1024 * 1024; + msg_size == 0 ? msg_size++ : msg_size *= 8) { + b->Args({msg_size, 1}); + b->Args({msg_size, 2}); + } +} + +BENCHMARK_TEMPLATE(BM_StreamingPingPong, InProcessCHTTP2, NoOpMutator, + NoOpMutator) + ->Apply(StreamingPingPongArgs); +BENCHMARK_TEMPLATE(BM_StreamingPingPong, TCP, NoOpMutator, NoOpMutator) + ->Apply(StreamingPingPongArgs); + +BENCHMARK_TEMPLATE(BM_StreamingPingPongMsgs, InProcessCHTTP2, NoOpMutator, + NoOpMutator) ->Range(0, 128 * 1024 * 1024); -BENCHMARK_TEMPLATE(BM_PumpStreamServerToClient, InProcessCHTTP2) +BENCHMARK_TEMPLATE(BM_StreamingPingPongMsgs, TCP, NoOpMutator, NoOpMutator) ->Range(0, 128 * 1024 * 1024); } // namespace testing From 12ca7d319c2ef2ff2e15ea0ed02ccb5c84198aa7 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Thu, 16 Mar 2017 11:01:06 -0700 Subject: [PATCH 099/186] Bump 1.2.x version to pre-2 --- CMakeLists.txt | 2 +- Makefile | 4 ++-- build.yaml | 2 +- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- package.json | 2 +- package.xml | 4 ++-- src/cpp/common/version_cc.cc | 2 +- src/csharp/Grpc.Auth/project.json | 4 ++-- src/csharp/Grpc.Core.Testing/project.json | 4 ++-- src/csharp/Grpc.Core/VersionInfo.cs | 2 +- src/csharp/Grpc.Core/project.json | 2 +- src/csharp/Grpc.HealthCheck/project.json | 4 ++-- src/csharp/Grpc.Reflection/project.json | 4 ++-- src/csharp/build_packages_dotnetcli.bat | 2 +- src/csharp/build_packages_dotnetcli.sh | 4 ++-- src/node/health_check/package.json | 4 ++-- src/node/tools/package.json | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/GRPCClient/private/version.h | 2 +- src/python/grpcio/grpc_version.py | 2 +- src/python/grpcio_health_checking/grpc_version.py | 2 +- src/python/grpcio_reflection/grpc_version.py | 2 +- src/python/grpcio_tests/grpc_version.py | 2 +- src/ruby/lib/grpc/version.rb | 2 +- src/ruby/tools/version.rb | 2 +- tools/distrib/python/grpcio_tools/grpc_version.py | 2 +- tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- 31 files changed, 39 insertions(+), 39 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 89a983ca4dd..28bff0d2318 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ cmake_minimum_required(VERSION 2.8) set(PACKAGE_NAME "grpc") -set(PACKAGE_VERSION "1.2.0-pre1") +set(PACKAGE_VERSION "1.2.0-pre2") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") diff --git a/Makefile b/Makefile index c35fe90a17f..331523ed7d7 100644 --- a/Makefile +++ b/Makefile @@ -412,8 +412,8 @@ Q = @ endif CORE_VERSION = 3.0.0-dev -CPP_VERSION = 1.2.0-pre1 -CSHARP_VERSION = 1.2.0-pre1 +CPP_VERSION = 1.2.0-pre2 +CSHARP_VERSION = 1.2.0-pre2 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) diff --git a/build.yaml b/build.yaml index c71e98c5227..ce88586b92b 100644 --- a/build.yaml +++ b/build.yaml @@ -14,7 +14,7 @@ settings: '#10': See the expand_version.py for all the quirks here core_version: 3.0.0-dev g_stands_for: green - version: 1.2.0-pre1 + version: 1.2.0-pre2 filegroups: - name: census public_headers: diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8b67a5dcdd2..6e65f681b86 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-Core' - version = '1.2.0-pre1' + version = '1.2.0-pre2' s.version = version s.summary = 'Core cross-platform gRPC library, written in C' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index 8fbdf7ad55d..2b6908b8b9a 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-ProtoRPC' - version = '1.2.0-pre1' + version = '1.2.0-pre2' s.version = version s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index e302e6482e3..7293a189ed1 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-RxLibrary' - version = '1.2.0-pre1' + version = '1.2.0-pre2' s.version = version s.summary = 'Reactive Extensions library for iOS/OSX.' s.homepage = 'http://www.grpc.io' diff --git a/gRPC.podspec b/gRPC.podspec index 64a6f0aba47..149847e9933 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.name = 'gRPC' - version = '1.2.0-pre1' + version = '1.2.0-pre2' s.version = version s.summary = 'gRPC client library for iOS/OSX' s.homepage = 'http://www.grpc.io' diff --git a/package.json b/package.json index 588425d0e04..36f7d35a7e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", diff --git a/package.xml b/package.xml index 94305025b5c..7b3e6b129f9 100644 --- a/package.xml +++ b/package.xml @@ -13,8 +13,8 @@ 2017-03-01 - 1.2.0RC1 - 1.2.0RC1 + 1.2.0RC2 + 1.2.0RC2 beta diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc index 30395fbac53..9b30223f475 100644 --- a/src/cpp/common/version_cc.cc +++ b/src/cpp/common/version_cc.cc @@ -37,5 +37,5 @@ #include namespace grpc { -grpc::string Version() { return "1.2.0-pre1"; } +grpc::string Version() { return "1.2.0-pre2"; } } diff --git a/src/csharp/Grpc.Auth/project.json b/src/csharp/Grpc.Auth/project.json index d4fbdc1d56d..fc0a8ba0def 100644 --- a/src/csharp/Grpc.Auth/project.json +++ b/src/csharp/Grpc.Auth/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "title": "gRPC C# Auth", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre1", + "Grpc.Core": "1.2.0-pre2", "Google.Apis.Auth": "1.21.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Core.Testing/project.json b/src/csharp/Grpc.Core.Testing/project.json index 9d1180d0549..0070b74cc38 100644 --- a/src/csharp/Grpc.Core.Testing/project.json +++ b/src/csharp/Grpc.Core.Testing/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "title": "gRPC C# Core Testing", "authors": [ "Google Inc." ], "copyright": "Copyright 2017, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre1" + "Grpc.Core": "1.2.0-pre2" }, "frameworks": { "net45": { diff --git a/src/csharp/Grpc.Core/VersionInfo.cs b/src/csharp/Grpc.Core/VersionInfo.cs index b6e3bc5f8d2..8773183aaf0 100644 --- a/src/csharp/Grpc.Core/VersionInfo.cs +++ b/src/csharp/Grpc.Core/VersionInfo.cs @@ -53,6 +53,6 @@ namespace Grpc.Core /// /// Current version of gRPC C# /// - public const string CurrentVersion = "1.2.0-pre1"; + public const string CurrentVersion = "1.2.0-pre2"; } } diff --git a/src/csharp/Grpc.Core/project.json b/src/csharp/Grpc.Core/project.json index 51311010cd5..0f9f1e819e7 100644 --- a/src/csharp/Grpc.Core/project.json +++ b/src/csharp/Grpc.Core/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "title": "gRPC C# Core", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", diff --git a/src/csharp/Grpc.HealthCheck/project.json b/src/csharp/Grpc.HealthCheck/project.json index 330002f3ad6..ae3094b903d 100644 --- a/src/csharp/Grpc.HealthCheck/project.json +++ b/src/csharp/Grpc.HealthCheck/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "title": "gRPC C# Healthchecking", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre1", + "Grpc.Core": "1.2.0-pre2", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Reflection/project.json b/src/csharp/Grpc.Reflection/project.json index 1a77a854c2d..8daa9e47ddb 100644 --- a/src/csharp/Grpc.Reflection/project.json +++ b/src/csharp/Grpc.Reflection/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "title": "gRPC C# Reflection", "authors": [ "Google Inc." ], "copyright": "Copyright 2016, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre1", + "Grpc.Core": "1.2.0-pre2", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/build_packages_dotnetcli.bat b/src/csharp/build_packages_dotnetcli.bat index fee896d883f..9e1074833fb 100755 --- a/src/csharp/build_packages_dotnetcli.bat +++ b/src/csharp/build_packages_dotnetcli.bat @@ -28,7 +28,7 @@ @rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @rem Current package versions -set VERSION=1.2.0-pre1 +set VERSION=1.2.0-pre2 set PROTOBUF_VERSION=3.0.0 @rem Adjust the location of nuget.exe diff --git a/src/csharp/build_packages_dotnetcli.sh b/src/csharp/build_packages_dotnetcli.sh index bc7350f3afc..a283dc76f17 100755 --- a/src/csharp/build_packages_dotnetcli.sh +++ b/src/csharp/build_packages_dotnetcli.sh @@ -66,7 +66,7 @@ dotnet pack --configuration Release Grpc.Auth/project.json --output ../../artifa dotnet pack --configuration Release Grpc.HealthCheck/project.json --output ../../artifacts dotnet pack --configuration Release Grpc.Reflection/project.json --output ../../artifacts -nuget pack Grpc.nuspec -Version "1.2.0-pre1" -OutputDirectory ../../artifacts -nuget pack Grpc.Tools.nuspec -Version "1.2.0-pre1" -OutputDirectory ../../artifacts +nuget pack Grpc.nuspec -Version "1.2.0-pre2" -OutputDirectory ../../artifacts +nuget pack Grpc.Tools.nuspec -Version "1.2.0-pre2" -OutputDirectory ../../artifacts (cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg) diff --git a/src/node/health_check/package.json b/src/node/health_check/package.json index 302f2606c6b..d03d5a4d625 100644 --- a/src/node/health_check/package.json +++ b/src/node/health_check/package.json @@ -1,6 +1,6 @@ { "name": "grpc-health-check", - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "author": "Google Inc.", "description": "Health check service for use with gRPC", "repository": { @@ -15,7 +15,7 @@ } ], "dependencies": { - "grpc": "^1.2.0-pre1", + "grpc": "^1.2.0-pre2", "lodash": "^3.9.3", "google-protobuf": "^3.0.0" }, diff --git a/src/node/tools/package.json b/src/node/tools/package.json index 78071ad55af..e3b53bcdf54 100644 --- a/src/node/tools/package.json +++ b/src/node/tools/package.json @@ -1,6 +1,6 @@ { "name": "grpc-tools", - "version": "1.2.0-pre1", + "version": "1.2.0-pre2", "author": "Google Inc.", "description": "Tools for developing with gRPC on Node.js", "homepage": "http://www.grpc.io/", diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index ccad095f17d..2a2f4de5022 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCPlugin' - v = '1.2.0-pre1' + v = '1.2.0-pre2' s.version = v s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/GRPCClient/private/version.h b/src/objective-c/GRPCClient/private/version.h index 2d9ecc6c308..289a55d083b 100644 --- a/src/objective-c/GRPCClient/private/version.h +++ b/src/objective-c/GRPCClient/private/version.h @@ -38,4 +38,4 @@ // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.2.0-pre1" +#define GRPC_OBJC_VERSION_STRING @"1.2.0-pre2" diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py index 12c80fdbef3..ff72fde5838 100644 --- a/src/python/grpcio/grpc_version.py +++ b/src/python/grpcio/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!! -VERSION='1.2.0rc1' +VERSION='1.2.0rc2' diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py index 6d7907d3778..6e098452a8f 100644 --- a/src/python/grpcio_health_checking/grpc_version.py +++ b/src/python/grpcio_health_checking/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!! -VERSION='1.2.0rc1' +VERSION='1.2.0rc2' diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py index 0372478401c..3fe4779e154 100644 --- a/src/python/grpcio_reflection/grpc_version.py +++ b/src/python/grpcio_reflection/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!! -VERSION='1.2.0rc1' +VERSION='1.2.0rc2' diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py index 5be5ecf254e..ca78d14ad92 100644 --- a/src/python/grpcio_tests/grpc_version.py +++ b/src/python/grpcio_tests/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!! -VERSION='1.2.0rc1' +VERSION='1.2.0rc2' diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index c5169e6ae3f..2cc0a950d02 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -29,5 +29,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '1.2.0.pre1' + VERSION = '1.2.0.pre2' end diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb index 2970518f916..22a2a72e4c2 100644 --- a/src/ruby/tools/version.rb +++ b/src/ruby/tools/version.rb @@ -29,6 +29,6 @@ module GRPC module Tools - VERSION = '1.2.0.pre1' + VERSION = '1.2.0.pre2' end end diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py index 72c929889bb..b784a80bf58 100644 --- a/tools/distrib/python/grpcio_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION='1.2.0rc1' +VERSION='1.2.0rc2' diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 1588755fde6..7af9246beef 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0-pre1 +PROJECT_NUMBER = 1.2.0-pre2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 62d801054dc..5ca65127dca 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0-pre1 +PROJECT_NUMBER = 1.2.0-pre2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From b7f35a658b00ae57d0341261d0944c26066dda04 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 16 Mar 2017 13:29:05 -0700 Subject: [PATCH 100/186] Expand benchmark coverage to isolated grpc_call scenarios against a dummy filter stack --- src/core/lib/surface/channel.c | 37 ++-- src/core/lib/surface/channel.h | 5 + test/cpp/microbenchmarks/bm_call_create.cc | 208 +++++++++++++++++++++ 3 files changed, 236 insertions(+), 14 deletions(-) diff --git a/src/core/lib/surface/channel.c b/src/core/lib/surface/channel.c index d6acd392c1a..a00572c0070 100644 --- a/src/core/lib/surface/channel.c +++ b/src/core/lib/surface/channel.c @@ -83,19 +83,10 @@ struct grpc_channel { static void destroy_channel(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error); -grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, - const grpc_channel_args *input_args, - grpc_channel_stack_type channel_stack_type, - grpc_transport *optional_transport) { - grpc_channel_stack_builder *builder = grpc_channel_stack_builder_create(); - grpc_channel_stack_builder_set_channel_arguments(exec_ctx, builder, - input_args); - grpc_channel_stack_builder_set_target(builder, target); - grpc_channel_stack_builder_set_transport(builder, optional_transport); - if (!grpc_channel_init_create_stack(exec_ctx, builder, channel_stack_type)) { - grpc_channel_stack_builder_destroy(exec_ctx, builder); - return NULL; - } +grpc_channel *grpc_channel_create_with_builder( + grpc_exec_ctx *exec_ctx, grpc_channel_stack_builder *builder, + grpc_channel_stack_type channel_stack_type) { + char *target = gpr_strdup(grpc_channel_stack_builder_get_target(builder)); grpc_channel_args *args = grpc_channel_args_copy( grpc_channel_stack_builder_get_channel_arguments(builder)); grpc_channel *channel; @@ -106,11 +97,12 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, gpr_log(GPR_ERROR, "channel stack builder failed: %s", grpc_error_string(error)); GRPC_ERROR_UNREF(error); + gpr_free(target); goto done; } memset(channel, 0, sizeof(*channel)); - channel->target = gpr_strdup(target); + channel->target = target; channel->is_client = grpc_channel_stack_type_is_client(channel_stack_type); gpr_mu_init(&channel->registered_call_mu); channel->registered_calls = NULL; @@ -177,6 +169,23 @@ done: return channel; } +grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, + const grpc_channel_args *input_args, + grpc_channel_stack_type channel_stack_type, + grpc_transport *optional_transport) { + grpc_channel_stack_builder *builder = grpc_channel_stack_builder_create(); + grpc_channel_stack_builder_set_channel_arguments(exec_ctx, builder, + input_args); + grpc_channel_stack_builder_set_target(builder, target); + grpc_channel_stack_builder_set_transport(builder, optional_transport); + if (!grpc_channel_init_create_stack(exec_ctx, builder, channel_stack_type)) { + grpc_channel_stack_builder_destroy(exec_ctx, builder); + return NULL; + } + return grpc_channel_create_with_builder(exec_ctx, builder, + channel_stack_type); +} + char *grpc_channel_get_target(grpc_channel *channel) { GRPC_API_TRACE("grpc_channel_get_target(channel=%p)", 1, (channel)); return gpr_strdup(channel->target); diff --git a/src/core/lib/surface/channel.h b/src/core/lib/surface/channel.h index 3a441d7adde..609c9357e0b 100644 --- a/src/core/lib/surface/channel.h +++ b/src/core/lib/surface/channel.h @@ -35,6 +35,7 @@ #define GRPC_CORE_LIB_SURFACE_CHANNEL_H #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/channel/channel_stack_builder.h" #include "src/core/lib/surface/channel_stack_type.h" grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, @@ -42,6 +43,10 @@ grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, grpc_channel_stack_type channel_stack_type, grpc_transport *optional_transport); +grpc_channel *grpc_channel_create_with_builder( + grpc_exec_ctx *exec_ctx, grpc_channel_stack_builder *builder, + grpc_channel_stack_type channel_stack_type); + /** Create a call given a grpc_channel, in order to call \a method. Progress is tied to activity on \a pollset_set. The returned call object is meant to be used with \a grpc_call_start_batch_and_execute, which relies on diff --git a/test/cpp/microbenchmarks/bm_call_create.cc b/test/cpp/microbenchmarks/bm_call_create.cc index 014e2b96b55..948dc8ec25a 100644 --- a/test/cpp/microbenchmarks/bm_call_create.cc +++ b/test/cpp/microbenchmarks/bm_call_create.cc @@ -53,6 +53,7 @@ extern "C" { #include "src/core/lib/channel/http_client_filter.h" #include "src/core/lib/channel/http_server_filter.h" #include "src/core/lib/channel/message_size_filter.h" +#include "src/core/lib/surface/channel.h" #include "src/core/lib/transport/transport_impl.h" } @@ -85,6 +86,9 @@ BENCHMARK(BM_Zalloc) ->Arg(6144) ->Arg(7168); +//////////////////////////////////////////////////////////////////////////////// +// Benchmarks creating full stacks + class BaseChannelFixture { public: BaseChannelFixture(grpc_channel *channel) : channel_(channel) {} @@ -130,6 +134,9 @@ static void BM_CallCreateDestroy(benchmark::State &state) { BENCHMARK_TEMPLATE(BM_CallCreateDestroy, InsecureChannel); BENCHMARK_TEMPLATE(BM_CallCreateDestroy, LameChannel); +//////////////////////////////////////////////////////////////////////////////// +// Benchmarks isolating individual filters + static void *tag(int i) { return reinterpret_cast(static_cast(i)); } @@ -460,4 +467,205 @@ typedef Fixture<&grpc_load_reporting_filter, CHECKS_NOT_LAST> BENCHMARK_TEMPLATE(BM_IsolatedFilter, LoadReportingFilter, NoOp); BENCHMARK_TEMPLATE(BM_IsolatedFilter, LoadReportingFilter, SendEmptyMetadata); +//////////////////////////////////////////////////////////////////////////////// +// Benchmarks isolating grpc_call + +namespace isolated_call_filter { + +static void StartTransportStreamOp(grpc_exec_ctx *exec_ctx, + grpc_call_element *elem, + grpc_transport_stream_op *op) { + if (op->recv_initial_metadata) { + grpc_closure_sched(exec_ctx, op->recv_initial_metadata_ready, + GRPC_ERROR_NONE); + } + if (op->recv_message) { + grpc_closure_sched(exec_ctx, op->recv_message_ready, GRPC_ERROR_NONE); + } + grpc_closure_sched(exec_ctx, op->on_complete, GRPC_ERROR_NONE); +} + +static void StartTransportOp(grpc_exec_ctx *exec_ctx, + grpc_channel_element *elem, + grpc_transport_op *op) { + if (op->disconnect_with_error != GRPC_ERROR_NONE) { + GRPC_ERROR_UNREF(op->disconnect_with_error); + } + grpc_closure_sched(exec_ctx, op->on_consumed, GRPC_ERROR_NONE); +} + +static grpc_error *InitCallElem(grpc_exec_ctx *exec_ctx, + grpc_call_element *elem, + const grpc_call_element_args *args) { + return GRPC_ERROR_NONE; +} + +static void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx, + grpc_call_element *elem, + grpc_polling_entity *pollent) {} + +static void DestroyCallElem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, + const grpc_call_final_info *final_info, + void *and_free_memory) { + gpr_free(and_free_memory); +} + +grpc_error *InitChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, + grpc_channel_element_args *args) { + return GRPC_ERROR_NONE; +} + +void DestroyChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem) {} + +char *GetPeer(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { + return gpr_strdup("peer"); +} + +void GetChannelInfo(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, + const grpc_channel_info *channel_info) {} + +static const grpc_channel_filter isolated_call_filter = { + StartTransportStreamOp, + StartTransportOp, + 0, + InitCallElem, + SetPollsetOrPollsetSet, + DestroyCallElem, + 0, + InitChannelElem, + DestroyChannelElem, + GetPeer, + GetChannelInfo, + "isolated_call_filter"}; +} + +class IsolatedCallFixture : public TrackCounters { + public: + IsolatedCallFixture() { + grpc_channel_stack_builder *builder = grpc_channel_stack_builder_create(); + grpc_channel_stack_builder_set_name(builder, "dummy"); + grpc_channel_stack_builder_set_target(builder, "dummy_target"); + GPR_ASSERT(grpc_channel_stack_builder_append_filter( + builder, &isolated_call_filter::isolated_call_filter, NULL, NULL)); + { + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + channel_ = grpc_channel_create_with_builder(&exec_ctx, builder, + GRPC_CLIENT_CHANNEL); + grpc_exec_ctx_finish(&exec_ctx); + } + cq_ = grpc_completion_queue_create(NULL); + } + + void Finish(benchmark::State &state) { + grpc_completion_queue_destroy(cq_); + grpc_channel_destroy(channel_); + TrackCounters::Finish(state); + } + + grpc_channel *channel() const { return channel_; } + grpc_completion_queue *cq() const { return cq_; } + + private: + grpc_completion_queue *cq_; + grpc_channel *channel_; +}; + +static void BM_IsolatedCall_NoOp(benchmark::State &state) { + IsolatedCallFixture fixture; + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + void *method_hdl = + grpc_channel_register_call(fixture.channel(), "/foo/bar", NULL, NULL); + while (state.KeepRunning()) { + grpc_call_destroy(grpc_channel_create_registered_call( + fixture.channel(), nullptr, GRPC_PROPAGATE_DEFAULTS, fixture.cq(), + method_hdl, deadline, NULL)); + } + fixture.Finish(state); +} +BENCHMARK(BM_IsolatedCall_NoOp); + +static void BM_IsolatedCall_Unary(benchmark::State &state) { + IsolatedCallFixture fixture; + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + void *method_hdl = + grpc_channel_register_call(fixture.channel(), "/foo/bar", NULL, NULL); + grpc_slice slice = grpc_slice_from_static_string("hello world"); + grpc_byte_buffer *send_message = grpc_raw_byte_buffer_create(&slice, 1); + grpc_byte_buffer *recv_message = NULL; + grpc_status_code status_code; + grpc_slice status_details = grpc_empty_slice(); + grpc_metadata_array recv_initial_metadata; + grpc_metadata_array_init(&recv_initial_metadata); + grpc_metadata_array recv_trailing_metadata; + grpc_metadata_array_init(&recv_trailing_metadata); + grpc_op ops[6]; + memset(ops, 0, sizeof(ops)); + ops[0].op = GRPC_OP_SEND_INITIAL_METADATA; + ops[1].op = GRPC_OP_SEND_MESSAGE; + ops[1].data.send_message.send_message = send_message; + ops[2].op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; + ops[3].op = GRPC_OP_RECV_INITIAL_METADATA; + ops[3].data.recv_initial_metadata.recv_initial_metadata = + &recv_initial_metadata; + ops[4].op = GRPC_OP_RECV_MESSAGE; + ops[4].data.recv_message.recv_message = &recv_message; + ops[5].op = GRPC_OP_RECV_STATUS_ON_CLIENT; + ops[5].data.recv_status_on_client.status = &status_code; + ops[5].data.recv_status_on_client.status_details = &status_details; + ops[5].data.recv_status_on_client.trailing_metadata = &recv_trailing_metadata; + while (state.KeepRunning()) { + grpc_call *call = grpc_channel_create_registered_call( + fixture.channel(), nullptr, GRPC_PROPAGATE_DEFAULTS, fixture.cq(), + method_hdl, deadline, NULL); + grpc_call_start_batch(call, ops, 6, tag(1), NULL); + grpc_completion_queue_next(fixture.cq(), + gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL); + grpc_call_destroy(call); + } + fixture.Finish(state); + grpc_metadata_array_destroy(&recv_initial_metadata); + grpc_metadata_array_destroy(&recv_trailing_metadata); + grpc_byte_buffer_destroy(send_message); +} +BENCHMARK(BM_IsolatedCall_Unary); + +static void BM_IsolatedCall_StreamingSend(benchmark::State &state) { + IsolatedCallFixture fixture; + gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + void *method_hdl = + grpc_channel_register_call(fixture.channel(), "/foo/bar", NULL, NULL); + grpc_slice slice = grpc_slice_from_static_string("hello world"); + grpc_byte_buffer *send_message = grpc_raw_byte_buffer_create(&slice, 1); + grpc_metadata_array recv_initial_metadata; + grpc_metadata_array_init(&recv_initial_metadata); + grpc_metadata_array recv_trailing_metadata; + grpc_metadata_array_init(&recv_trailing_metadata); + grpc_op ops[2]; + memset(ops, 0, sizeof(ops)); + ops[0].op = GRPC_OP_SEND_INITIAL_METADATA; + ops[1].op = GRPC_OP_RECV_INITIAL_METADATA; + ops[1].data.recv_initial_metadata.recv_initial_metadata = + &recv_initial_metadata; + grpc_call *call = grpc_channel_create_registered_call( + fixture.channel(), nullptr, GRPC_PROPAGATE_DEFAULTS, fixture.cq(), + method_hdl, deadline, NULL); + grpc_call_start_batch(call, ops, 2, tag(1), NULL); + grpc_completion_queue_next(fixture.cq(), gpr_inf_future(GPR_CLOCK_MONOTONIC), + NULL); + memset(ops, 0, sizeof(ops)); + ops[0].op = GRPC_OP_SEND_MESSAGE; + ops[0].data.send_message.send_message = send_message; + while (state.KeepRunning()) { + grpc_call_start_batch(call, ops, 1, tag(2), NULL); + grpc_completion_queue_next(fixture.cq(), + gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL); + } + grpc_call_destroy(call); + fixture.Finish(state); + grpc_metadata_array_destroy(&recv_initial_metadata); + grpc_metadata_array_destroy(&recv_trailing_metadata); + grpc_byte_buffer_destroy(send_message); +} +BENCHMARK(BM_IsolatedCall_StreamingSend); + BENCHMARK_MAIN(); From 06d4cbce2d8127e9942910830f78472cce13881e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 16 Mar 2017 13:35:58 -0700 Subject: [PATCH 101/186] Fix BUILD --- BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BUILD b/BUILD index ca0a1c56076..47017bf8f0c 100644 --- a/BUILD +++ b/BUILD @@ -308,6 +308,7 @@ grpc_cc_library( srcs = [ "src/core/lib/profiling/basic_timers.c", "src/core/lib/profiling/stap_timers.c", + "src/core/lib/support/arena.c", "src/core/lib/support/alloc.c", "src/core/lib/support/avl.c", "src/core/lib/support/backoff.c", @@ -352,6 +353,7 @@ grpc_cc_library( "src/core/lib/support/wrap_memcpy.c", ], hdrs = [ + "src/core/lib/support/arena.h", "src/core/lib/profiling/timers.h", "src/core/lib/support/backoff.h", "src/core/lib/support/block_annotate.h", From 867e35a458c717f463e156a116897a38ffb0ef8f Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Thu, 16 Mar 2017 11:28:14 -0700 Subject: [PATCH 102/186] Initialize GIL at startup --- src/python/grpcio/grpc/_cython/cygrpc.pyx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/cygrpc.pyx b/src/python/grpcio/grpc/_cython/cygrpc.pyx index e1bd046a1a5..274b5f1b8ac 100644 --- a/src/python/grpcio/grpc/_cython/cygrpc.pyx +++ b/src/python/grpcio/grpc/_cython/cygrpc.pyx @@ -47,14 +47,14 @@ include "_cygrpc/server.pyx.pxi" # # initialize gRPC # - - cdef extern from "Python.h": - int Py_AtExit(void(*func)()) - + int PyEval_InitThreads() -def _initialize(): +cdef _initialize(): + # We have Python callbacks called by c-core threads, this ensures the GIL + # is initialized. + PyEval_InitThreads() grpc_set_ssl_roots_override_callback( ssl_roots_override_callback) From 9df13b26d2ce0f14b0499b45e5aa01c48108e3f5 Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 16 Mar 2017 14:14:18 -0700 Subject: [PATCH 103/186] Add missing files --- BUILD | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BUILD b/BUILD index ca0a1c56076..5a2e7a72e9e 100644 --- a/BUILD +++ b/BUILD @@ -1132,6 +1132,7 @@ grpc_cc_library( "src/cpp/common/rpc_method.cc", "src/cpp/common/version_cc.cc", "src/cpp/server/async_generic_service.cc", + "src/cpp/server/channel_argument_option.cc", "src/cpp/server/create_default_thread_pool.cc", "src/cpp/server/dynamic_thread_pool.cc", "src/cpp/server/health/default_health_check_service.cc", @@ -1173,6 +1174,7 @@ grpc_cc_library( "include/grpc++/grpc++.h", "include/grpc++/health_check_service_interface.h", "include/grpc++/impl/call.h", + "include/grpc++/impl/channel_argument_option.h", "include/grpc++/impl/client_unary_call.h", "include/grpc++/impl/codegen/core_codegen.h", "include/grpc++/impl/grpc_library.h", From 411b63b92f0cdcf6bcd6b83fb1a9549bb68f4c36 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Mar 2017 17:13:05 -0700 Subject: [PATCH 104/186] Advance dependency version --- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index ccad095f17d..392a86106b3 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -101,7 +101,7 @@ Pod::Spec.new do |s| s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.1.0' + s.dependency '!ProtoCompiler', '3.2.0' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.1' s.osx.deployment_target = '10.9' From 37d3fba39188d0efce113582a06d20e011b7c1ef Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 28 Feb 2017 16:14:40 -0800 Subject: [PATCH 105/186] Relieve ios deployment version to 7.0 --- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- templates/gRPC-Core.podspec.template | 2 +- templates/gRPC-ProtoRPC.podspec.template | 2 +- templates/gRPC-RxLibrary.podspec.template | 2 +- templates/gRPC.podspec.template | 2 +- .../src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 8b67a5dcdd2..9cb5552bac5 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -51,7 +51,7 @@ Pod::Spec.new do |s| :submodules => true, } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' s.requires_arc = false diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index 8fbdf7ad55d..e46440339e1 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -48,7 +48,7 @@ Pod::Spec.new do |s| :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'ProtoRPC' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index e302e6482e3..5c8a4c8a760 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -48,7 +48,7 @@ Pod::Spec.new do |s| :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'RxLibrary' diff --git a/gRPC.podspec b/gRPC.podspec index 64a6f0aba47..109e0e08c1c 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -47,7 +47,7 @@ Pod::Spec.new do |s| :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'GRPCClient' diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index 392a86106b3..5f9ea2e8405 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -103,7 +103,7 @@ Pod::Spec.new do |s| # Restrict the protoc version to the one supported by this plugin. s.dependency '!ProtoCompiler', '3.2.0' # For the Protobuf dependency not to complain: - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' # Restrict the gRPC runtime version to the one supported by this plugin. s.dependency 'gRPC-ProtoRPC', v diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 9ed32e31cff..11146a490b8 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -78,7 +78,7 @@ :submodules => true, } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' s.requires_arc = false diff --git a/templates/gRPC-ProtoRPC.podspec.template b/templates/gRPC-ProtoRPC.podspec.template index 5d7d90d2318..47b22dd2a52 100644 --- a/templates/gRPC-ProtoRPC.podspec.template +++ b/templates/gRPC-ProtoRPC.podspec.template @@ -50,7 +50,7 @@ :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'ProtoRPC' diff --git a/templates/gRPC-RxLibrary.podspec.template b/templates/gRPC-RxLibrary.podspec.template index 35a06c8a856..48f0df8f9e6 100644 --- a/templates/gRPC-RxLibrary.podspec.template +++ b/templates/gRPC-RxLibrary.podspec.template @@ -50,7 +50,7 @@ :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'RxLibrary' diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template index d33ce277dc3..ce473608dd8 100644 --- a/templates/gRPC.podspec.template +++ b/templates/gRPC.podspec.template @@ -49,7 +49,7 @@ :tag => "v#{version}", } - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' name = 'GRPCClient' diff --git a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template index 3a10cfab3cc..b100fa7cfe1 100644 --- a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template +++ b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template @@ -105,7 +105,7 @@ # Restrict the protoc version to the one supported by this plugin. s.dependency '!ProtoCompiler', '3.1.0' # For the Protobuf dependency not to complain: - s.ios.deployment_target = '7.1' + s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' # Restrict the gRPC runtime version to the one supported by this plugin. s.dependency 'gRPC-ProtoRPC', v From e38b01293ba231d00802c3016505d1eb73330a50 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Thu, 16 Mar 2017 20:53:41 -0700 Subject: [PATCH 106/186] Changes to podspecs --- gRPC-Core.podspec | 7 +++---- templates/gRPC-Core.podspec.template | 7 +++---- .../objective-c/!ProtoCompiler-gRPCPlugin.podspec.template | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 9cb5552bac5..77cf1125904 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -887,8 +887,7 @@ Pod::Spec.new do |s| s.subspec 'Cronet-Interface' do |ss| ss.header_mappings_dir = 'include/grpc' - ss.source_files = 'include/grpc/grpc_cronet.h', - 'src/core/ext/transport/cronet/transport/cronet_transport.h' + ss.source_files = 'include/grpc/grpc_cronet.h' end s.subspec 'Cronet-Implementation' do |ss| @@ -899,7 +898,7 @@ Pod::Spec.new do |s| ss.dependency "#{s.name}/Cronet-Interface", version ss.source_files = 'src/core/ext/transport/cronet/client/secure/cronet_channel_create.c', - 'src/core/ext/transport/cronet/transport/cronet_transport.c', + 'src/core/ext/transport/cronet/transport/cronet_transport.{c,h}', 'third_party/objective_c/Cronet/bidirectional_stream_c.h' end @@ -914,7 +913,7 @@ Pod::Spec.new do |s| 'test/core/end2end/end2end_test_utils.c', 'test/core/end2end/tests/*.{c,h}', 'test/core/end2end/data/*.{c,h}', - 'test/core/util/debugger_macros.c', + 'test/core/util/debugger_macros.{c,h}', 'test/core/util/test_config.{c,h}', 'test/core/util/port.h', 'test/core/util/port.c', diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 11146a490b8..e7289111b24 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -161,8 +161,7 @@ s.subspec 'Cronet-Interface' do |ss| ss.header_mappings_dir = 'include/grpc' - ss.source_files = 'include/grpc/grpc_cronet.h', - 'src/core/ext/transport/cronet/transport/cronet_transport.h' + ss.source_files = 'include/grpc/grpc_cronet.h' end s.subspec 'Cronet-Implementation' do |ss| @@ -173,7 +172,7 @@ ss.dependency "#{s.name}/Cronet-Interface", version ss.source_files = 'src/core/ext/transport/cronet/client/secure/cronet_channel_create.c', - 'src/core/ext/transport/cronet/transport/cronet_transport.c', + 'src/core/ext/transport/cronet/transport/cronet_transport.{c,h}', 'third_party/objective_c/Cronet/bidirectional_stream_c.h' end @@ -188,7 +187,7 @@ 'test/core/end2end/end2end_test_utils.c', 'test/core/end2end/tests/*.{c,h}', 'test/core/end2end/data/*.{c,h}', - 'test/core/util/debugger_macros.c', + 'test/core/util/debugger_macros.{c,h}', 'test/core/util/test_config.{c,h}', 'test/core/util/port.h', 'test/core/util/port.c', diff --git a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template index b100fa7cfe1..d7d84f3c774 100644 --- a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template +++ b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template @@ -103,7 +103,7 @@ s.preserve_paths = plugin # Restrict the protoc version to the one supported by this plugin. - s.dependency '!ProtoCompiler', '3.1.0' + s.dependency '!ProtoCompiler', '3.2.0' # For the Protobuf dependency not to complain: s.ios.deployment_target = '7.0' s.osx.deployment_target = '10.9' From 5ae42a15cfe0c99711da4865541eb6e6e45dbd48 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Mar 2017 12:04:49 -0800 Subject: [PATCH 107/186] stop http2 test server with error code when failures occur --- test/http2_test/http2_test_server.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py index abde3433ad2..81ee1df9f61 100644 --- a/test/http2_test/http2_test_server.py +++ b/test/http2_test/http2_test_server.py @@ -31,6 +31,7 @@ import argparse import logging +import sys import twisted import twisted.internet import twisted.internet.endpoints @@ -55,7 +56,7 @@ _TEST_CASE_MAPPING = { class H2Factory(twisted.internet.protocol.Factory): def __init__(self, testcase): - logging.info('Creating H2Factory for new connection.') + logging.info('Creating H2Factory for new connection (%s)', testcase) self._num_streams = 0 self._testcase = testcase @@ -83,6 +84,19 @@ def parse_arguments(): ) return parser.parse_args() +exit_code = 0 + +def listen(endpoint, test_case): + deferred = endpoint.listen(H2Factory(test_case)) + def listen_error(reason): + # If listening fails, we stop the reactor and exit the program + # with exit_code = 1. + global exit_code + exit_code = 1 + logging.error('Listening failed: %s' % reason.value) + twisted.internet.reactor.stop() + deferred.addErrback(listen_error) + def start_test_servers(base_port): """ Start one server per test case on incrementing port numbers beginning with base_port """ @@ -92,7 +106,9 @@ def start_test_servers(base_port): logging.warning('serving on port %d : %s'%(portnum, test_case)) endpoint = twisted.internet.endpoints.TCP4ServerEndpoint( twisted.internet.reactor, portnum, backlog=128) - endpoint.listen(H2Factory(test_case)) + # Wait until the reactor is running before calling endpoint.listen(). + twisted.internet.reactor.callWhenRunning(listen, endpoint, test_case) + index += 1 if __name__ == '__main__': @@ -102,3 +118,4 @@ if __name__ == '__main__': args = parse_arguments() start_test_servers(args.base_port) twisted.internet.reactor.run() + sys.exit(exit_code) From 69e2f8216978c4a9293cd5e9f0dbda91e404599e Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Mar 2017 12:21:05 -0800 Subject: [PATCH 108/186] add _ --- test/http2_test/http2_test_server.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py index 81ee1df9f61..85c356b5ef1 100644 --- a/test/http2_test/http2_test_server.py +++ b/test/http2_test/http2_test_server.py @@ -54,6 +54,8 @@ _TEST_CASE_MAPPING = { 'max_streams': test_max_streams.TestcaseSettingsMaxStreams, } +_exit_code = 0 + class H2Factory(twisted.internet.protocol.Factory): def __init__(self, testcase): logging.info('Creating H2Factory for new connection (%s)', testcase) @@ -84,14 +86,12 @@ def parse_arguments(): ) return parser.parse_args() -exit_code = 0 - def listen(endpoint, test_case): deferred = endpoint.listen(H2Factory(test_case)) def listen_error(reason): # If listening fails, we stop the reactor and exit the program # with exit_code = 1. - global exit_code + global _exit_code exit_code = 1 logging.error('Listening failed: %s' % reason.value) twisted.internet.reactor.stop() @@ -118,4 +118,4 @@ if __name__ == '__main__': args = parse_arguments() start_test_servers(args.base_port) twisted.internet.reactor.run() - sys.exit(exit_code) + sys.exit(_exit_code) From 95f48c154b1073393fae4d412f4c905194e7f96c Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 10 Mar 2017 14:01:11 -0800 Subject: [PATCH 109/186] really add _ --- test/http2_test/http2_test_server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py index 85c356b5ef1..46c3e00d18f 100644 --- a/test/http2_test/http2_test_server.py +++ b/test/http2_test/http2_test_server.py @@ -90,9 +90,9 @@ def listen(endpoint, test_case): deferred = endpoint.listen(H2Factory(test_case)) def listen_error(reason): # If listening fails, we stop the reactor and exit the program - # with exit_code = 1. + # with exit code 1. global _exit_code - exit_code = 1 + _exit_code = 1 logging.error('Listening failed: %s' % reason.value) twisted.internet.reactor.stop() deferred.addErrback(listen_error) From 61335ec086b9c40c5c0d099f53dde1b602db5955 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 13 Mar 2017 13:13:30 -0700 Subject: [PATCH 110/186] use docker port mapping for http2 server --- tools/run_tests/run_interop_tests.py | 30 ++++++++++++---------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 29d5a9aaa00..f51088e237b 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -636,10 +636,7 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host, '--server_host=%s' % server_host, ] if test_case in _HTTP2_BADSERVER_TEST_CASES: - # We are running the http2_badserver_interop test. Adjust command line accordingly. - offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) - client_options = common_options + ['--server_port=%s' % - (int(server_port)+offset)] + client_options = common_options + ['--server_port=%s' % server_port] cmdline = bash_cmdline(language.client_cmd_http2interop(client_options)) cwd = language.http2_cwd else: @@ -685,18 +682,11 @@ def server_jobspec(language, docker_image, insecure=False, manual_cmd_log=None): if language.safename == 'http2': # we are running the http2 interop server. Open next N ports beginning # with the server port. These ports are used for http2 interop test - # (one test case per port). We also attach the docker container running - # the server to local network, so we don't have to mess with port mapping - port_args = [ - '-p', str(_DEFAULT_SERVER_PORT+0), - '-p', str(_DEFAULT_SERVER_PORT+1), - '-p', str(_DEFAULT_SERVER_PORT+2), - '-p', str(_DEFAULT_SERVER_PORT+3), - '-p', str(_DEFAULT_SERVER_PORT+4), - '-p', str(_DEFAULT_SERVER_PORT+5), - '-p', str(_DEFAULT_SERVER_PORT+6), - '--net=host', - ] + # (one test case per port). + port_args = list( + itertools.chain.from_iterable(('-p', str(_DEFAULT_SERVER_PORT + i)) + for i in range( + len(_HTTP2_BADSERVER_TEST_CASES)))) else: port_args = ['-p', str(_DEFAULT_SERVER_PORT)] @@ -936,6 +926,7 @@ client_manual_cmd_log = [] if args.manual_run else None # Start interop servers. server_jobs = {} server_addresses = {} +http2_badserver_ports = () try: for s in servers: lang = str(s) @@ -957,6 +948,10 @@ try: if not args.manual_run: job = dockerjob.DockerJob(spec) server_jobs[lang] = job + http2_badserver_ports = tuple([ + job.mapped_port(_DEFAULT_SERVER_PORT + i) + for i in range(len(_HTTP2_BADSERVER_TEST_CASES)) + ]) else: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') @@ -1043,11 +1038,12 @@ try: if args.http2_badserver_interop: for language in languages_http2_badserver_interop: for test_case in _HTTP2_BADSERVER_TEST_CASES: + offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) test_job = cloud_to_cloud_jobspec(language, test_case, str(http2InteropServer), 'localhost', - _DEFAULT_SERVER_PORT, + http2_badserver_ports[offset], docker_image=docker_images.get(str(language)), manual_cmd_log=client_manual_cmd_log) jobs.append(test_job) From bee6ec2473f56227faef3cd7559a19137ad5b15e Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Mon, 13 Mar 2017 15:40:51 -0700 Subject: [PATCH 111/186] refactor common_options, correct output for manual run --- tools/run_tests/run_interop_tests.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index f51088e237b..ac57e5a9c50 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -634,14 +634,13 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host, common_options = [ '--test_case=%s' % test_case, '--server_host=%s' % server_host, + '--server_port=%s' % server_port, ] if test_case in _HTTP2_BADSERVER_TEST_CASES: - client_options = common_options + ['--server_port=%s' % server_port] - cmdline = bash_cmdline(language.client_cmd_http2interop(client_options)) + cmdline = bash_cmdline(language.client_cmd_http2interop(common_options)) cwd = language.http2_cwd else: - client_options = interop_only_options + common_options + ['--server_port=%s' % server_port] - cmdline = bash_cmdline(language.client_cmd(client_options)) + cmdline = bash_cmdline(language.client_cmd(common_options+interop_only_options)) cwd = language.client_cwd environ = language.global_env() @@ -1039,11 +1038,15 @@ try: for language in languages_http2_badserver_interop: for test_case in _HTTP2_BADSERVER_TEST_CASES: offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) + if not args.manual_run: + server_port = http2_badserver_ports[offset] + else: + server_port = _DEFAULT_SERVER_PORT+offset test_job = cloud_to_cloud_jobspec(language, test_case, str(http2InteropServer), 'localhost', - http2_badserver_ports[offset], + server_port, docker_image=docker_images.get(str(language)), manual_cmd_log=client_manual_cmd_log) jobs.append(test_job) From 22afddf53c1de182082a022ee108f27db117d2d9 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Wed, 15 Mar 2017 15:43:43 -0700 Subject: [PATCH 112/186] add health check for http2 server --- test/http2_test/http2_server_health_check.py | 49 +++++++++++++++++++ .../interoptest/grpc_interop_http2/Dockerfile | 2 +- tools/run_tests/python_utils/dockerjob.py | 19 +++++++ tools/run_tests/run_interop_tests.py | 21 ++++++-- 4 files changed, 85 insertions(+), 6 deletions(-) create mode 100644 test/http2_test/http2_server_health_check.py diff --git a/test/http2_test/http2_server_health_check.py b/test/http2_test/http2_server_health_check.py new file mode 100644 index 00000000000..dd9402b8557 --- /dev/null +++ b/test/http2_test/http2_server_health_check.py @@ -0,0 +1,49 @@ +# Copyright 2017, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import argparse +import hyper +import sys + +# Utility to healthcheck the http2 server. Used when starting the server to +# verify that the server is live before tests begin. +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--server_host', type=str, default='localhost') + parser.add_argument('--server_port', type=int, default=8080) + args = parser.parse_args() + server_host = args.server_host + server_port = args.server_port + conn = hyper.HTTP20Connection('%s:%d' % (server_host, server_port)) + conn.request('POST', '/grpc.testing.TestService/UnaryCall') + resp = conn.get_response() + if resp.headers.get('grpc-encoding') is None: + sys.exit(1) + else: + sys.exit(0) diff --git a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile index 66d9b4f6403..acc984acb0d 100644 --- a/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile +++ b/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile @@ -47,7 +47,7 @@ RUN pip install pip --upgrade RUN pip install virtualenv RUN pip install futures==2.2.0 enum34==1.0.4 protobuf==3.2.0 six==1.10.0 -RUN pip install twisted h2 +RUN pip install twisted h2 hyper # Define the default command. CMD ["bash"] diff --git a/tools/run_tests/python_utils/dockerjob.py b/tools/run_tests/python_utils/dockerjob.py index 0869c5cee9b..82466d3a93f 100755 --- a/tools/run_tests/python_utils/dockerjob.py +++ b/tools/run_tests/python_utils/dockerjob.py @@ -70,6 +70,22 @@ def docker_mapped_port(cid, port, timeout_seconds=15): (port, cid)) +def wait_for_healthy(cid, shortname, timeout_seconds): + """Wait timeout_seconds for the container to become healthy""" + started = time.time() + while time.time() - started < timeout_seconds: + try: + output = subprocess.check_output( + ['docker', 'inspect', '--format="{{.State.Health.Status}}"', cid], + stderr=_DEVNULL) + if output.strip('\n') == 'healthy': + return + except subprocess.CalledProcessError as e: + pass + raise Exception('Timed out waiting for %s (%s) to pass health check' % + (shortname, cid)) + + def finish_jobs(jobs): """Kills given docker containers and waits for corresponding jobs to finish""" for job in jobs: @@ -113,6 +129,9 @@ class DockerJob: def mapped_port(self, port): return docker_mapped_port(self._container_name, port) + def wait_for_healthy(self, timeout_seconds=15): + wait_for_healthy(self._container_name, self._spec.shortname, timeout_seconds) + def kill(self, suppress_failure=False): """Sends kill signal to the container.""" if suppress_failure: diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index ac57e5a9c50..fb10a442d0b 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -678,23 +678,32 @@ def server_jobspec(language, docker_image, insecure=False, manual_cmd_log=None): language.server_cmd(['--port=%s' % _DEFAULT_SERVER_PORT, '--use_tls=%s' % ('false' if insecure else 'true')])) environ = language.global_env() + docker_args = ['--name=%s' % container_name] if language.safename == 'http2': # we are running the http2 interop server. Open next N ports beginning # with the server port. These ports are used for http2 interop test # (one test case per port). - port_args = list( + docker_args += list( itertools.chain.from_iterable(('-p', str(_DEFAULT_SERVER_PORT + i)) for i in range( len(_HTTP2_BADSERVER_TEST_CASES)))) + docker_args += [ + '--health-cmd=python test/http2_test/http2_server_health_check.py ' + '--server_host=%s --server_port=%d' + % ('localhost', _DEFAULT_SERVER_PORT), + '--health-interval=1s', + '--health-retries=5', + '--health-timeout=1s', + ] + else: - port_args = ['-p', str(_DEFAULT_SERVER_PORT)] + docker_args += ['-p', str(_DEFAULT_SERVER_PORT)] docker_cmdline = docker_run_cmdline(cmdline, image=docker_image, cwd=language.server_cwd, environ=environ, - docker_args=port_args + - ['--name=%s' % container_name]) + docker_args=docker_args) if manual_cmd_log is not None: manual_cmd_log.append(manual_cmdline(docker_cmdline)) server_job = jobset.JobSpec( @@ -881,7 +890,8 @@ languages = set(_LANGUAGES[l] languages_http2_badserver_interop = set() if args.http2_badserver_interop: languages_http2_badserver_interop = set( - _LANGUAGES[l] for l in _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS) + _LANGUAGES[l] for l in _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS + if 'all' in args.language or l in args.language) http2Interop = Http2Client() if args.http2_interop else None http2InteropServer = Http2Server() if args.http2_badserver_interop else None @@ -946,6 +956,7 @@ try: manual_cmd_log=server_manual_cmd_log) if not args.manual_run: job = dockerjob.DockerJob(spec) + job.wait_for_healthy(timeout_seconds=15) server_jobs[lang] = job http2_badserver_ports = tuple([ job.mapped_port(_DEFAULT_SERVER_PORT + i) From d3b160010e220e7c95dde1f81428ed1654ff4570 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 07:28:25 -0700 Subject: [PATCH 113/186] add comments for health check docker flags --- tools/run_tests/run_interop_tests.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index fb10a442d0b..48f297804c1 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -687,6 +687,14 @@ def server_jobspec(language, docker_image, insecure=False, manual_cmd_log=None): itertools.chain.from_iterable(('-p', str(_DEFAULT_SERVER_PORT + i)) for i in range( len(_HTTP2_BADSERVER_TEST_CASES)))) + # Enable docker's healthcheck mechanism. + # This runs a Python script inside the container every second. The script + # pings the http2 server to verify it is ready. The 'health-retries' flag + # specifies the number of consecutive failures before docker will report + # the container's status as 'unhealthy'. Prior to the first 'health_retries' + # failures or the first success, the status will be 'starting'. 'docker ps' + # or 'docker inspect' can be used to see the health of the container on the + # command line. docker_args += [ '--health-cmd=python test/http2_test/http2_server_health_check.py ' '--server_host=%s --server_port=%d' From d86a19efd0bb011fbadc304434c2512c4607f8b4 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 07:34:39 -0700 Subject: [PATCH 114/186] check error for docker inspect --- tools/run_tests/python_utils/dockerjob.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/python_utils/dockerjob.py b/tools/run_tests/python_utils/dockerjob.py index 82466d3a93f..cdf5759f8c9 100755 --- a/tools/run_tests/python_utils/dockerjob.py +++ b/tools/run_tests/python_utils/dockerjob.py @@ -76,8 +76,9 @@ def wait_for_healthy(cid, shortname, timeout_seconds): while time.time() - started < timeout_seconds: try: output = subprocess.check_output( - ['docker', 'inspect', '--format="{{.State.Health.Status}}"', cid], - stderr=_DEVNULL) + ['docker', 'inspect', '--format="{{.State.Health.Status}}"', cid]) + #stderr=_DEVNULL) + print(output) if output.strip('\n') == 'healthy': return except subprocess.CalledProcessError as e: From 92a5d28a4c0afc4cfd1f7eaba5d876a53a314986 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 07:53:50 -0700 Subject: [PATCH 115/186] increase wait for healthy timeout --- tools/run_tests/python_utils/dockerjob.py | 4 +++- tools/run_tests/run_interop_tests.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/python_utils/dockerjob.py b/tools/run_tests/python_utils/dockerjob.py index cdf5759f8c9..a29555428bc 100755 --- a/tools/run_tests/python_utils/dockerjob.py +++ b/tools/run_tests/python_utils/dockerjob.py @@ -83,6 +83,8 @@ def wait_for_healthy(cid, shortname, timeout_seconds): return except subprocess.CalledProcessError as e: pass + time.sleep(1) + print(subprocess.check_output(['docker', 'ps'])) raise Exception('Timed out waiting for %s (%s) to pass health check' % (shortname, cid)) @@ -130,7 +132,7 @@ class DockerJob: def mapped_port(self, port): return docker_mapped_port(self._container_name, port) - def wait_for_healthy(self, timeout_seconds=15): + def wait_for_healthy(self, timeout_seconds): wait_for_healthy(self._container_name, self._spec.shortname, timeout_seconds) def kill(self, suppress_failure=False): diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 48f297804c1..b5977bf4f3a 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -964,7 +964,7 @@ try: manual_cmd_log=server_manual_cmd_log) if not args.manual_run: job = dockerjob.DockerJob(spec) - job.wait_for_healthy(timeout_seconds=15) + job.wait_for_healthy(timeout_seconds=240) server_jobs[lang] = job http2_badserver_ports = tuple([ job.mapped_port(_DEFAULT_SERVER_PORT + i) From f9d0804daadf3cc22d406eaf6d603a3dda9e0460 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 09:06:49 -0700 Subject: [PATCH 116/186] disable wait for healthy --- tools/run_tests/run_interop_tests.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index b5977bf4f3a..55e729ace3c 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -964,7 +964,8 @@ try: manual_cmd_log=server_manual_cmd_log) if not args.manual_run: job = dockerjob.DockerJob(spec) - job.wait_for_healthy(timeout_seconds=240) + #job.wait_for_healthy(timeout_seconds=240) + print(subprocess.check_output(['docker', 'version'])) server_jobs[lang] = job http2_badserver_ports = tuple([ job.mapped_port(_DEFAULT_SERVER_PORT + i) From 6ce6166bd0451db14893b896384517bb95fbfea3 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 10:27:00 -0700 Subject: [PATCH 117/186] reenable health check, disable other interop tests --- tools/jenkins/run_interop.sh | 2 +- tools/run_tests/run_interop_tests.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/jenkins/run_interop.sh b/tools/jenkins/run_interop.sh index 2a9fc662a9e..18e8b644381 100755 --- a/tools/jenkins/run_interop.sh +++ b/tools/jenkins/run_interop.sh @@ -36,4 +36,4 @@ export LANG=en_US.UTF-8 # Enter the gRPC repo root cd $(dirname $0)/../.. -tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --cloud_to_prod_auth --use_docker --http2_interop --http2_badserver_interop -t -j 12 $@ || true +tools/run_tests/run_interop_tests.py -l c++ --use_docker --http2_badserver_interop -t -j 12 $@ || true diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 55e729ace3c..a5164727597 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -964,7 +964,7 @@ try: manual_cmd_log=server_manual_cmd_log) if not args.manual_run: job = dockerjob.DockerJob(spec) - #job.wait_for_healthy(timeout_seconds=240) + job.wait_for_healthy(timeout_seconds=240) print(subprocess.check_output(['docker', 'version'])) server_jobs[lang] = job http2_badserver_ports = tuple([ From 246c0eee336fd657f82c9f4503295164efbdf9a6 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 12:42:10 -0700 Subject: [PATCH 118/186] delay health check, increase timeout --- tools/run_tests/run_interop_tests.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index a5164727597..579114939f0 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -957,6 +957,7 @@ try: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') + http2_server_job = None if args.http2_badserver_interop: # launch a HTTP2 server emulator that creates edge cases lang = str(http2InteropServer) @@ -964,8 +965,8 @@ try: manual_cmd_log=server_manual_cmd_log) if not args.manual_run: job = dockerjob.DockerJob(spec) - job.wait_for_healthy(timeout_seconds=240) - print(subprocess.check_output(['docker', 'version'])) + #job.wait_for_healthy(timeout_seconds=240) + http2_server_job = job server_jobs[lang] = job http2_badserver_ports = tuple([ job.mapped_port(_DEFAULT_SERVER_PORT + i) @@ -1055,6 +1056,8 @@ try: jobs.append(test_job) if args.http2_badserver_interop: + print(subprocess.check_output(['docker', 'ps'])) + http2_server_job.wait_for_healthy(timeout_seconds=600) for language in languages_http2_badserver_interop: for test_case in _HTTP2_BADSERVER_TEST_CASES: offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) From 2f59cf2dc361e274bf97550447d5a72c8f239704 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 13:44:09 -0700 Subject: [PATCH 119/186] move health check to just before running test cases --- tools/jenkins/run_interop.sh | 2 +- tools/run_tests/python_utils/dockerjob.py | 6 ++---- tools/run_tests/run_interop_tests.py | 23 ++++++++--------------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/tools/jenkins/run_interop.sh b/tools/jenkins/run_interop.sh index 18e8b644381..2a9fc662a9e 100755 --- a/tools/jenkins/run_interop.sh +++ b/tools/jenkins/run_interop.sh @@ -36,4 +36,4 @@ export LANG=en_US.UTF-8 # Enter the gRPC repo root cd $(dirname $0)/../.. -tools/run_tests/run_interop_tests.py -l c++ --use_docker --http2_badserver_interop -t -j 12 $@ || true +tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --cloud_to_prod_auth --use_docker --http2_interop --http2_badserver_interop -t -j 12 $@ || true diff --git a/tools/run_tests/python_utils/dockerjob.py b/tools/run_tests/python_utils/dockerjob.py index a29555428bc..709fc121a9b 100755 --- a/tools/run_tests/python_utils/dockerjob.py +++ b/tools/run_tests/python_utils/dockerjob.py @@ -76,15 +76,13 @@ def wait_for_healthy(cid, shortname, timeout_seconds): while time.time() - started < timeout_seconds: try: output = subprocess.check_output( - ['docker', 'inspect', '--format="{{.State.Health.Status}}"', cid]) - #stderr=_DEVNULL) - print(output) + ['docker', 'inspect', '--format="{{.State.Health.Status}}"', cid], + stderr=_DEVNULL) if output.strip('\n') == 'healthy': return except subprocess.CalledProcessError as e: pass time.sleep(1) - print(subprocess.check_output(['docker', 'ps'])) raise Exception('Timed out waiting for %s (%s) to pass health check' % (shortname, cid)) diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index 579114939f0..ce4dfb863ea 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -701,7 +701,7 @@ def server_jobspec(language, docker_image, insecure=False, manual_cmd_log=None): % ('localhost', _DEFAULT_SERVER_PORT), '--health-interval=1s', '--health-retries=5', - '--health-timeout=1s', + '--health-timeout=10s', ] else: @@ -957,21 +957,15 @@ try: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') - http2_server_job = None + http2_badserver_job = None if args.http2_badserver_interop: # launch a HTTP2 server emulator that creates edge cases lang = str(http2InteropServer) spec = server_jobspec(http2InteropServer, docker_images.get(lang), manual_cmd_log=server_manual_cmd_log) if not args.manual_run: - job = dockerjob.DockerJob(spec) - #job.wait_for_healthy(timeout_seconds=240) - http2_server_job = job - server_jobs[lang] = job - http2_badserver_ports = tuple([ - job.mapped_port(_DEFAULT_SERVER_PORT + i) - for i in range(len(_HTTP2_BADSERVER_TEST_CASES)) - ]) + http2_badserver_job = dockerjob.DockerJob(spec) + server_jobs[lang] = http2_badserver_job else: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') @@ -1056,15 +1050,14 @@ try: jobs.append(test_job) if args.http2_badserver_interop: - print(subprocess.check_output(['docker', 'ps'])) - http2_server_job.wait_for_healthy(timeout_seconds=600) + if not args.manual_run: + http2_badserver_job.wait_for_healthy(timeout_seconds=600) for language in languages_http2_badserver_interop: for test_case in _HTTP2_BADSERVER_TEST_CASES: offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) + server_port = _DEFAULT_SERVER_PORT+offset if not args.manual_run: - server_port = http2_badserver_ports[offset] - else: - server_port = _DEFAULT_SERVER_PORT+offset + server_port = http2_badserver_job.mapped_port(server_port) test_job = cloud_to_cloud_jobspec(language, test_case, str(http2InteropServer), From 01deb9d748db3fc7d04b7d511bec5aec594a8610 Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Mar 2017 15:53:55 -0700 Subject: [PATCH 120/186] add hyper to Dockerfile.template --- .../interoptest/grpc_interop_http2/Dockerfile.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template b/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template index 6204c3e2cb2..12b99844253 100644 --- a/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template +++ b/templates/tools/dockerfile/interoptest/grpc_interop_http2/Dockerfile.template @@ -33,7 +33,7 @@ <%include file="../../go_path.include"/> <%include file="../../python_deps.include"/> - RUN pip install twisted h2 + RUN pip install twisted h2 hyper # Define the default command. CMD ["bash"] From fecba535d99ec2c819a0d26707047bf2f2f323fa Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 17 Mar 2017 09:50:48 -0700 Subject: [PATCH 121/186] Switch to using a CAS loop to update the token value. --- BUILD | 1 + CMakeLists.txt | 1 + Makefile | 1 + binding.gyp | 1 + build.yaml | 1 + config.m4 | 1 + gRPC-Core.podspec | 1 + grpc.gemspec | 1 + include/grpc/impl/codegen/atm.h | 5 ++ package.xml | 1 + src/core/ext/client_channel/retry_throttle.c | 36 +++----------- src/core/lib/support/atm.c | 47 +++++++++++++++++++ src/python/grpcio/grpc_core_dependencies.py | 1 + tools/doxygen/Doxyfile.core.internal | 1 + .../generated/sources_and_headers.json | 1 + vsprojects/vcxproj/gpr/gpr.vcxproj | 2 + vsprojects/vcxproj/gpr/gpr.vcxproj.filters | 3 ++ 17 files changed, 75 insertions(+), 30 deletions(-) create mode 100644 src/core/lib/support/atm.c diff --git a/BUILD b/BUILD index 4e1f20c3b21..1fe72c02db1 100644 --- a/BUILD +++ b/BUILD @@ -309,6 +309,7 @@ grpc_cc_library( "src/core/lib/profiling/basic_timers.c", "src/core/lib/profiling/stap_timers.c", "src/core/lib/support/alloc.c", + "src/core/lib/support/atm.c", "src/core/lib/support/avl.c", "src/core/lib/support/backoff.c", "src/core/lib/support/cmdline.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index 8bc07255f15..9e99062f581 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -693,6 +693,7 @@ add_library(gpr src/core/lib/profiling/basic_timers.c src/core/lib/profiling/stap_timers.c src/core/lib/support/alloc.c + src/core/lib/support/atm.c src/core/lib/support/avl.c src/core/lib/support/backoff.c src/core/lib/support/cmdline.c diff --git a/Makefile b/Makefile index 11bac54c796..2f7120987ab 100644 --- a/Makefile +++ b/Makefile @@ -2599,6 +2599,7 @@ LIBGPR_SRC = \ src/core/lib/profiling/basic_timers.c \ src/core/lib/profiling/stap_timers.c \ src/core/lib/support/alloc.c \ + src/core/lib/support/atm.c \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/cmdline.c \ diff --git a/binding.gyp b/binding.gyp index f6a04b27f9f..1107f318891 100644 --- a/binding.gyp +++ b/binding.gyp @@ -544,6 +544,7 @@ 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/atm.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', diff --git a/build.yaml b/build.yaml index ae546cbb308..7b27968c61d 100644 --- a/build.yaml +++ b/build.yaml @@ -101,6 +101,7 @@ filegroups: - src/core/lib/profiling/basic_timers.c - src/core/lib/profiling/stap_timers.c - src/core/lib/support/alloc.c + - src/core/lib/support/atm.c - src/core/lib/support/avl.c - src/core/lib/support/backoff.c - src/core/lib/support/cmdline.c diff --git a/config.m4 b/config.m4 index 5eaf161f096..010401f2fb6 100644 --- a/config.m4 +++ b/config.m4 @@ -39,6 +39,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/profiling/basic_timers.c \ src/core/lib/profiling/stap_timers.c \ src/core/lib/support/alloc.c \ + src/core/lib/support/atm.c \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/cmdline.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 2fb00a3afe0..c78e4a70233 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -211,6 +211,7 @@ Pod::Spec.new do |s| 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/atm.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', diff --git a/grpc.gemspec b/grpc.gemspec index 1ca2446e65c..95aba00fd7c 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -97,6 +97,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/profiling/basic_timers.c ) s.files += %w( src/core/lib/profiling/stap_timers.c ) s.files += %w( src/core/lib/support/alloc.c ) + s.files += %w( src/core/lib/support/atm.c ) s.files += %w( src/core/lib/support/avl.c ) s.files += %w( src/core/lib/support/backoff.c ) s.files += %w( src/core/lib/support/cmdline.c ) diff --git a/include/grpc/impl/codegen/atm.h b/include/grpc/impl/codegen/atm.h index ae00fb0f169..4bd572d6d18 100644 --- a/include/grpc/impl/codegen/atm.h +++ b/include/grpc/impl/codegen/atm.h @@ -92,4 +92,9 @@ #error could not determine platform for atm #endif +/** Adds \a delta to \a *value, clamping the result to the range specified + by \a min and \a max. Returns the new value. */ +gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm *value, gpr_atm delta, + gpr_atm min, gpr_atm max); + #endif /* GRPC_IMPL_CODEGEN_ATM_H */ diff --git a/package.xml b/package.xml index e29f462d333..83ad2d21298 100644 --- a/package.xml +++ b/package.xml @@ -106,6 +106,7 @@ + diff --git a/src/core/ext/client_channel/retry_throttle.c b/src/core/ext/client_channel/retry_throttle.c index 7b813c33df4..8926c3d7822 100644 --- a/src/core/ext/client_channel/retry_throttle.c +++ b/src/core/ext/client_channel/retry_throttle.c @@ -73,20 +73,9 @@ bool grpc_server_retry_throttle_data_record_failure( // First, check if we are stale and need to be replaced. get_replacement_throttle_data_if_needed(&throttle_data); // We decrement milli_tokens by 1000 (1 token) for each failure. - const int delta = -1000; - const int old_value = (int)gpr_atm_full_fetch_add( - &throttle_data->milli_tokens, (gpr_atm)delta); - // If the above change takes us below 0, then re-add the excess. Note - // that between these two atomic operations, the value will be - // artificially low by as much as 1000, but this window should be - // brief. - int new_value = old_value - 1000; - if (new_value < 0) { - const int excess_value = new_value - (old_value < 0 ? old_value : 0); - gpr_atm_full_fetch_add(&throttle_data->milli_tokens, - (gpr_atm)-excess_value); - new_value = 0; - } + const int new_value = (int)gpr_atm_no_barrier_clamped_add( + &throttle_data->milli_tokens, (gpr_atm)-1000, (gpr_atm)0, + (gpr_atm)throttle_data->max_milli_tokens); // Retries are allowed as long as the new value is above the threshold // (max_milli_tokens / 2). return new_value > throttle_data->max_milli_tokens / 2; @@ -97,22 +86,9 @@ void grpc_server_retry_throttle_data_record_success( // First, check if we are stale and need to be replaced. get_replacement_throttle_data_if_needed(&throttle_data); // We increment milli_tokens by milli_token_ratio for each success. - const int delta = throttle_data->milli_token_ratio; - const int old_value = (int)gpr_atm_full_fetch_add( - &throttle_data->milli_tokens, (gpr_atm)delta); - // If the above change takes us over max_milli_tokens, then subtract - // the excess. Note that between these two atomic operations, the - // value will be artificially high by as much as milli_token_ratio, - // but this window should be brief. - const int new_value = old_value + throttle_data->milli_token_ratio; - if (new_value > throttle_data->max_milli_tokens) { - const int excess_value = - new_value - (old_value > throttle_data->max_milli_tokens - ? old_value - : throttle_data->max_milli_tokens); - gpr_atm_full_fetch_add(&throttle_data->milli_tokens, - (gpr_atm)-excess_value); - } + gpr_atm_no_barrier_clamped_add( + &throttle_data->milli_tokens, (gpr_atm)throttle_data->milli_token_ratio, + (gpr_atm)0, (gpr_atm)throttle_data->max_milli_tokens); } grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_ref( diff --git a/src/core/lib/support/atm.c b/src/core/lib/support/atm.c new file mode 100644 index 00000000000..06e8432caf8 --- /dev/null +++ b/src/core/lib/support/atm.c @@ -0,0 +1,47 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include +#include + +gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm *value, gpr_atm delta, + gpr_atm min, gpr_atm max) { + gpr_atm current; + gpr_atm new; + do { + current = gpr_atm_no_barrier_load(value); + new = GPR_CLAMP(current + delta, min, max); + if (new == current) break; + } while (!gpr_atm_no_barrier_cas(value, current, new)); + return new; +} diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 94d6e46cae8..da0dba7dfee 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -33,6 +33,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/profiling/basic_timers.c', 'src/core/lib/profiling/stap_timers.c', 'src/core/lib/support/alloc.c', + 'src/core/lib/support/atm.c', 'src/core/lib/support/avl.c', 'src/core/lib/support/backoff.c', 'src/core/lib/support/cmdline.c', diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index fbe1f7f78e1..7147d152ef2 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1230,6 +1230,7 @@ src/core/lib/slice/slice_internal.h \ src/core/lib/slice/slice_string_helpers.c \ src/core/lib/slice/slice_string_helpers.h \ src/core/lib/support/alloc.c \ +src/core/lib/support/atm.c \ src/core/lib/support/avl.c \ src/core/lib/support/backoff.c \ src/core/lib/support/backoff.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index b2f9078c054..7a6295cf72f 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7311,6 +7311,7 @@ "src/core/lib/profiling/stap_timers.c", "src/core/lib/profiling/timers.h", "src/core/lib/support/alloc.c", + "src/core/lib/support/atm.c", "src/core/lib/support/avl.c", "src/core/lib/support/backoff.c", "src/core/lib/support/backoff.h", diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj b/vsprojects/vcxproj/gpr/gpr.vcxproj index 44c21ddeb31..67ac3b98c5e 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj @@ -208,6 +208,8 @@ + + diff --git a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters index a5924a624a8..c49c87ed603 100644 --- a/vsprojects/vcxproj/gpr/gpr.vcxproj.filters +++ b/vsprojects/vcxproj/gpr/gpr.vcxproj.filters @@ -10,6 +10,9 @@ src\core\lib\support + + src\core\lib\support + src\core\lib\support From 8c7444576fdcaa317a43694a603aa0ee50ff1798 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 17 Mar 2017 09:57:31 -0700 Subject: [PATCH 122/186] Fix tracking of writes: we dont need TrackCounters for bm_fullstack since the fixture does it --- test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc b/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc index 513974fde19..00e37f79121 100644 --- a/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc +++ b/test/cpp/microbenchmarks/bm_fullstack_streaming_ping_pong.cc @@ -63,7 +63,6 @@ static void* tag(intptr_t x) { return reinterpret_cast(x); } // the other from server to client): template static void BM_StreamingPingPong(benchmark::State& state) { - TrackCounters track_counters; const int msg_size = state.range(0); const int max_ping_pongs = state.range(1); @@ -152,14 +151,12 @@ static void BM_StreamingPingPong(benchmark::State& state) { fixture->Finish(state); fixture.reset(); state.SetBytesProcessed(msg_size * state.iterations() * max_ping_pongs * 2); - track_counters.Finish(state); } // Repeatedly sends ping pong messages in a single streaming Bidi call in a loop // First parmeter (i.e state.range(0)): Message size (in bytes) to use template static void BM_StreamingPingPongMsgs(benchmark::State& state) { - TrackCounters track_counters; const int msg_size = state.range(0); EchoTestService::AsyncService service; @@ -241,7 +238,6 @@ static void BM_StreamingPingPongMsgs(benchmark::State& state) { fixture->Finish(state); fixture.reset(); state.SetBytesProcessed(msg_size * state.iterations() * 2); - track_counters.Finish(state); } /******************************************************************************* From 14ea772bfddf7bc9a93be8e4bbbcd0c911ab86f0 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 17 Mar 2017 10:29:20 -0700 Subject: [PATCH 123/186] Explain combiner --- doc/combiner-explainer.md | 158 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 doc/combiner-explainer.md diff --git a/doc/combiner-explainer.md b/doc/combiner-explainer.md new file mode 100644 index 00000000000..9d0a4f30f22 --- /dev/null +++ b/doc/combiner-explainer.md @@ -0,0 +1,158 @@ +# Combiner Explanation +## Talk by ctiller, notes by vjpai + +Typical way of doing critical section + +``` +mu.lock() +do_stuff() +mu.unlock() +``` + +An alternative way of doing it is + +``` +class combiner { + run(f) { + mu.lock() + f() + mu.unlock() + } + mutex mu; +} + +combiner.run(do_stuff) +``` + +If you have two threads calling combiner, there will be some kind of +queuing in place. It's called `combiner` because you can pass in more +than one do_stuff at once and they will run under a common `mu`. + +The implementation described above has the issue that you're blocking a thread +for a period of time, and this is considered harmful because it's an application thread that you're blocking. + +Instead, get a new property: +* Keep things running in serial execution +* Don't ever sleep the thread +* But maybe allow things to end up running on a different thread from where they were started +* This means that `do_stuff` doesn't necessarily run to completion when `combiner.run` is invoked + +``` +class combiner { + mpscq q; // multi-producer single-consumer queue can be made non-blocking + state s; // is it empty or executing + + run(f) { + if (q.push(f)) { + // q.push returns true if it's the first thing + while (q.pop(&f)) { // modulo some extra work to avoid races + f(); + } + } + } +} +``` + +The basic idea is that the first one to push onto the combiner +executes the work and then keeps executing functions from the queue +until the combiner is drained. + +Our combiner does some additional work, with the motivation of write-batching. + +We have a second tier of `run` called `run_finally`. Anything queued +onto `run_finally` runs after we have drained the queue. That means +that there is essentially a finally-queue. This is not guaranteed to +be final, but it's best-effort. In the process of running the finally +item, we might put something onto the main combiner queue and so we'll +need to re-enter. + +`chttp2` runs all ops in the run state except if it sees a write it puts that into a finally. That way anything else that gets put into the combiner can add to that write. + +``` +class combiner { + mpscq q; // multi-producer single-consumer queue can be made non-blocking + state s; // is it empty or executing + queue finally; // you can only do run_finally when you are already running something from the combiner + + run(f) { + if (q.push(f)) { + // q.push returns true if it's the first thing + loop: + while (q.pop(&f)) { // modulo some extra work to avoid races + f(); + } + while (finally.pop(&f)) { + f(); + } + goto loop; + } + } +} +``` + +So that explains how combiners work in general. In gRPC, there is +`start_batch(..., tag)` and then work only gets activated by somebody +calling `cq::next` which returns a tag. This gives and API-level +guarantee that there will be a thread doing polling to actually make +work happen. However, some operations are not covered by a poller +thread, such as cancellation that doesn't have a completion. Other +callbacks that don't have a completion are the internal work that gets +done before the batch gets completed. We need a condition called +`covered_by_poller` that means that the item will definitely need some +thread at some point to call `cq::next` . This includes those +callbacks that directly cause a completion but also those that are +indirectly required before getting a completion. If we can't tell for +sure for a specific path, we have to assumed it is not covered by +poller. + +The above combiner has the problem that it keeps draining for a +potentially infinite amount of time and that can lead to a huge tail +latency for some operations. So we can tweak it by returning to the application +if we know that it is valid to do so: + +``` +while (q.pop(&f)) { + f(); + if (control_can_be_returned && some_still_queued_thing_is_covered_by_poller) { + offload_combiner_work_to_some_other_thread(); + } +} +``` + +`offload` is more than `break`; it does `break` but also causes some +other thread that is currently waiting on a poll to break out of its +poll. This is done by setting up a per-polling-island work-queue +(distributor) wakeup FD. The work-queue is the converse of the combiner; it +tries to spray events onto as many threads as possible to get as much concurrency as possible. + +So `offload` really does: + +``` + distributor.run(continue_from_while_loop); + break; +``` + +This needs us to add another class variable for a `distributor` +(called a `workqueue` in the code). + +``` +workqueue::run(f) { + q.push(f) + eventfd.wakeup() +} + +workqueue::readable() { + eventfd.consume(); + q.pop(&f); + f(); + if (!q.empty()) { + eventfd.wakeup(); // spray across as many threads as are waiting on this workqueue + } +} +``` + +In principle, `run_finally` could get starved, but this hasn't +happened in practice. If we were concerned about this, we could put a +limit on how many things come off the regular `q` before the `finally` +queue gets processed. + From 39a5932097b5a2ed9481cd9660522658ee96fc65 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Tue, 7 Mar 2017 11:48:35 -0800 Subject: [PATCH 124/186] Add max_requests argument to server If the server is already serving max requests, return RESOURCE_EXHAUSTED --- src/python/grpcio/grpc/__init__.py | 11 +- src/python/grpcio/grpc/_server.py | 94 +++--- src/python/grpcio_tests/tests/tests.json | 1 + .../tests/unit/_resource_exhausted_test.py | 270 ++++++++++++++++++ 4 files changed, 337 insertions(+), 39 deletions(-) create mode 100644 src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py diff --git a/src/python/grpcio/grpc/__init__.py b/src/python/grpcio/grpc/__init__.py index a4481b2ac35..4960df3be9f 100644 --- a/src/python/grpcio/grpc/__init__.py +++ b/src/python/grpcio/grpc/__init__.py @@ -1273,7 +1273,10 @@ def secure_channel(target, credentials, options=None): credentials._credentials) -def server(thread_pool, handlers=None, options=None): +def server(thread_pool, + handlers=None, + options=None, + maximum_concurrent_rpcs=None): """Creates a Server with which RPCs can be serviced. Args: @@ -1286,13 +1289,17 @@ def server(thread_pool, handlers=None, options=None): returned Server is started. options: A sequence of string-value pairs according to which to configure the created server. + maximum_concurrent_rpcs: The maximum number of concurrent RPCs this server + will service before returning status RESOURCE_EXHAUSTED, or None to + indicate no limit. Returns: A Server with which RPCs can be serviced. """ from grpc import _server # pylint: disable=cyclic-import return _server.Server(thread_pool, () if handlers is None else handlers, () - if options is None else options) + if options is None else options, + maximum_concurrent_rpcs) ################################### __all__ ################################# diff --git a/src/python/grpcio/grpc/_server.py b/src/python/grpcio/grpc/_server.py index 84e096d4c04..47838c2c986 100644 --- a/src/python/grpcio/grpc/_server.py +++ b/src/python/grpcio/grpc/_server.py @@ -504,37 +504,37 @@ def _stream_response_in_pool(rpc_event, state, behavior, argument_thunk, def _handle_unary_unary(rpc_event, state, method_handler, thread_pool): unary_request = _unary_request(rpc_event, state, method_handler.request_deserializer) - thread_pool.submit(_unary_response_in_pool, rpc_event, state, - method_handler.unary_unary, unary_request, - method_handler.request_deserializer, - method_handler.response_serializer) + return thread_pool.submit(_unary_response_in_pool, rpc_event, state, + method_handler.unary_unary, unary_request, + method_handler.request_deserializer, + method_handler.response_serializer) def _handle_unary_stream(rpc_event, state, method_handler, thread_pool): unary_request = _unary_request(rpc_event, state, method_handler.request_deserializer) - thread_pool.submit(_stream_response_in_pool, rpc_event, state, - method_handler.unary_stream, unary_request, - method_handler.request_deserializer, - method_handler.response_serializer) + return thread_pool.submit(_stream_response_in_pool, rpc_event, state, + method_handler.unary_stream, unary_request, + method_handler.request_deserializer, + method_handler.response_serializer) def _handle_stream_unary(rpc_event, state, method_handler, thread_pool): request_iterator = _RequestIterator(state, rpc_event.operation_call, method_handler.request_deserializer) - thread_pool.submit(_unary_response_in_pool, rpc_event, state, - method_handler.stream_unary, lambda: request_iterator, - method_handler.request_deserializer, - method_handler.response_serializer) + return thread_pool.submit( + _unary_response_in_pool, rpc_event, state, method_handler.stream_unary, + lambda: request_iterator, method_handler.request_deserializer, + method_handler.response_serializer) def _handle_stream_stream(rpc_event, state, method_handler, thread_pool): request_iterator = _RequestIterator(state, rpc_event.operation_call, method_handler.request_deserializer) - thread_pool.submit(_stream_response_in_pool, rpc_event, state, - method_handler.stream_stream, lambda: request_iterator, - method_handler.request_deserializer, - method_handler.response_serializer) + return thread_pool.submit( + _stream_response_in_pool, rpc_event, state, + method_handler.stream_stream, lambda: request_iterator, + method_handler.request_deserializer, method_handler.response_serializer) def _find_method_handler(rpc_event, generic_handlers): @@ -549,13 +549,12 @@ def _find_method_handler(rpc_event, generic_handlers): return None -def _handle_unrecognized_method(rpc_event): +def _reject_rpc(rpc_event, status, details): operations = (cygrpc.operation_send_initial_metadata(_common.EMPTY_METADATA, _EMPTY_FLAGS), cygrpc.operation_receive_close_on_server(_EMPTY_FLAGS), cygrpc.operation_send_status_from_server( - _common.EMPTY_METADATA, cygrpc.StatusCode.unimplemented, - b'Method not found!', _EMPTY_FLAGS),) + _common.EMPTY_METADATA, status, details, _EMPTY_FLAGS),) rpc_state = _RPCState() rpc_event.operation_call.start_server_batch( operations, lambda ignored_event: (rpc_state, (),)) @@ -572,33 +571,37 @@ def _handle_with_method_handler(rpc_event, method_handler, thread_pool): state.due.add(_RECEIVE_CLOSE_ON_SERVER_TOKEN) if method_handler.request_streaming: if method_handler.response_streaming: - _handle_stream_stream(rpc_event, state, method_handler, - thread_pool) + return state, _handle_stream_stream(rpc_event, state, + method_handler, thread_pool) else: - _handle_stream_unary(rpc_event, state, method_handler, - thread_pool) + return state, _handle_stream_unary(rpc_event, state, + method_handler, thread_pool) else: if method_handler.response_streaming: - _handle_unary_stream(rpc_event, state, method_handler, - thread_pool) + return state, _handle_unary_stream(rpc_event, state, + method_handler, thread_pool) else: - _handle_unary_unary(rpc_event, state, method_handler, - thread_pool) - return state + return state, _handle_unary_unary(rpc_event, state, + method_handler, thread_pool) -def _handle_call(rpc_event, generic_handlers, thread_pool): +def _handle_call(rpc_event, generic_handlers, thread_pool, + concurrency_exceeded): if not rpc_event.success: - return None + return None, None if rpc_event.request_call_details.method is not None: method_handler = _find_method_handler(rpc_event, generic_handlers) if method_handler is None: - return _handle_unrecognized_method(rpc_event) + return _reject_rpc(rpc_event, cygrpc.StatusCode.unimplemented, + b'Method not found!'), None + elif concurrency_exceeded: + return _reject_rpc(rpc_event, cygrpc.StatusCode.resource_exhausted, + b'Concurrent RPC limit exceeded!'), None else: return _handle_with_method_handler(rpc_event, method_handler, thread_pool) else: - return None + return None, None @enum.unique @@ -610,7 +613,8 @@ class _ServerStage(enum.Enum): class _ServerState(object): - def __init__(self, completion_queue, server, generic_handlers, thread_pool): + def __init__(self, completion_queue, server, generic_handlers, thread_pool, + maximum_concurrent_rpcs): self.lock = threading.Lock() self.completion_queue = completion_queue self.server = server @@ -618,6 +622,8 @@ class _ServerState(object): self.thread_pool = thread_pool self.stage = _ServerStage.STOPPED self.shutdown_events = None + self.maximum_concurrent_rpcs = maximum_concurrent_rpcs + self.active_rpc_count = 0 # TODO(https://github.com/grpc/grpc/issues/6597): eliminate these fields. self.rpc_states = set() @@ -657,6 +663,11 @@ def _stop_serving(state): return False +def _on_call_completed(state): + with state.lock: + state.active_rpc_count -= 1 + + def _serve(state): while True: event = state.completion_queue.poll() @@ -668,10 +679,18 @@ def _serve(state): elif event.tag is _REQUEST_CALL_TAG: with state.lock: state.due.remove(_REQUEST_CALL_TAG) - rpc_state = _handle_call(event, state.generic_handlers, - state.thread_pool) + concurrency_exceeded = ( + state.maximum_concurrent_rpcs is not None and + state.active_rpc_count >= state.maximum_concurrent_rpcs) + rpc_state, rpc_future = _handle_call( + event, state.generic_handlers, state.thread_pool, + concurrency_exceeded) if rpc_state is not None: state.rpc_states.add(rpc_state) + if rpc_future is not None: + state.active_rpc_count += 1 + rpc_future.add_done_callback( + lambda unused_future: _on_call_completed(state)) if state.stage is _ServerStage.STARTED: _request_call(state) elif _stop_serving(state): @@ -749,12 +768,13 @@ def _start(state): class Server(grpc.Server): - def __init__(self, thread_pool, generic_handlers, options): + def __init__(self, thread_pool, generic_handlers, options, + maximum_concurrent_rpcs): completion_queue = cygrpc.CompletionQueue() server = cygrpc.Server(_common.channel_args(options)) server.register_completion_queue(completion_queue) self._state = _ServerState(completion_queue, server, generic_handlers, - thread_pool) + thread_pool, maximum_concurrent_rpcs) def add_generic_rpc_handlers(self, generic_rpc_handlers): _add_generic_handlers(self._state, generic_rpc_handlers) diff --git a/src/python/grpcio_tests/tests/tests.json b/src/python/grpcio_tests/tests/tests.json index 70d965d3ca8..f750b051022 100644 --- a/src/python/grpcio_tests/tests/tests.json +++ b/src/python/grpcio_tests/tests/tests.json @@ -31,6 +31,7 @@ "unit._invocation_defects_test.InvocationDefectsTest", "unit._metadata_code_details_test.MetadataCodeDetailsTest", "unit._metadata_test.MetadataTest", + "unit._resource_exhausted_test.ResourceExhaustedTest", "unit._rpc_test.RPCTest", "unit._sanity._sanity_test.Sanity", "unit._thread_cleanup_test.CleanupThreadTest", diff --git a/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py b/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py new file mode 100644 index 00000000000..88c82b55414 --- /dev/null +++ b/src/python/grpcio_tests/tests/unit/_resource_exhausted_test.py @@ -0,0 +1,270 @@ +# Copyright 2017, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +"""Tests server responding with RESOURCE_EXHAUSTED.""" + +import threading +import unittest + +import grpc +from grpc import _channel +from grpc.framework.foundation import logging_pool + +from tests.unit import test_common +from tests.unit.framework.common import test_constants + +_REQUEST = b'\x00\x00\x00' +_RESPONSE = b'\x00\x00\x00' + +_UNARY_UNARY = '/test/UnaryUnary' +_UNARY_STREAM = '/test/UnaryStream' +_STREAM_UNARY = '/test/StreamUnary' +_STREAM_STREAM = '/test/StreamStream' + + +class _TestTrigger(object): + + def __init__(self, total_call_count): + self._total_call_count = total_call_count + self._pending_calls = 0 + self._triggered = False + self._finish_condition = threading.Condition() + self._start_condition = threading.Condition() + + # Wait for all calls be be blocked in their handler + def await_calls(self): + with self._start_condition: + while self._pending_calls < self._total_call_count: + self._start_condition.wait() + + # Block in a response handler and wait for a trigger + def await_trigger(self): + with self._start_condition: + self._pending_calls += 1 + self._start_condition.notify() + + with self._finish_condition: + if not self._triggered: + self._finish_condition.wait() + + # Finish all response handlers + def trigger(self): + with self._finish_condition: + self._triggered = True + self._finish_condition.notify_all() + + +def handle_unary_unary(trigger, request, servicer_context): + trigger.await_trigger() + return _RESPONSE + + +def handle_unary_stream(trigger, request, servicer_context): + trigger.await_trigger() + for _ in range(test_constants.STREAM_LENGTH): + yield _RESPONSE + + +def handle_stream_unary(trigger, request_iterator, servicer_context): + trigger.await_trigger() + # TODO(issue:#6891) We should be able to remove this loop + for request in request_iterator: + pass + return _RESPONSE + + +def handle_stream_stream(trigger, request_iterator, servicer_context): + trigger.await_trigger() + # TODO(issue:#6891) We should be able to remove this loop, + # and replace with return; yield + for request in request_iterator: + yield _RESPONSE + + +class _MethodHandler(grpc.RpcMethodHandler): + + def __init__(self, trigger, request_streaming, response_streaming): + self.request_streaming = request_streaming + self.response_streaming = response_streaming + self.request_deserializer = None + self.response_serializer = None + self.unary_unary = None + self.unary_stream = None + self.stream_unary = None + self.stream_stream = None + if self.request_streaming and self.response_streaming: + self.stream_stream = ( + lambda x, y: handle_stream_stream(trigger, x, y)) + elif self.request_streaming: + self.stream_unary = lambda x, y: handle_stream_unary(trigger, x, y) + elif self.response_streaming: + self.unary_stream = lambda x, y: handle_unary_stream(trigger, x, y) + else: + self.unary_unary = lambda x, y: handle_unary_unary(trigger, x, y) + + +class _GenericHandler(grpc.GenericRpcHandler): + + def __init__(self, trigger): + self._trigger = trigger + + def service(self, handler_call_details): + if handler_call_details.method == _UNARY_UNARY: + return _MethodHandler(self._trigger, False, False) + elif handler_call_details.method == _UNARY_STREAM: + return _MethodHandler(self._trigger, False, True) + elif handler_call_details.method == _STREAM_UNARY: + return _MethodHandler(self._trigger, True, False) + elif handler_call_details.method == _STREAM_STREAM: + return _MethodHandler(self._trigger, True, True) + else: + return None + + +class ResourceExhaustedTest(unittest.TestCase): + + def setUp(self): + self._server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY) + self._trigger = _TestTrigger(test_constants.THREAD_CONCURRENCY) + self._server = grpc.server( + self._server_pool, + handlers=(_GenericHandler(self._trigger),), + maximum_concurrent_rpcs=test_constants.THREAD_CONCURRENCY) + port = self._server.add_insecure_port('[::]:0') + self._server.start() + self._channel = grpc.insecure_channel('localhost:%d' % port) + + def tearDown(self): + self._server.stop(0) + + def testUnaryUnary(self): + multi_callable = self._channel.unary_unary(_UNARY_UNARY) + futures = [] + for _ in range(test_constants.THREAD_CONCURRENCY): + futures.append(multi_callable.future(_REQUEST)) + + self._trigger.await_calls() + + with self.assertRaises(grpc.RpcError) as exception_context: + multi_callable(_REQUEST) + + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + exception_context.exception.code()) + + future_exception = multi_callable.future(_REQUEST) + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + future_exception.exception().code()) + + self._trigger.trigger() + for future in futures: + self.assertEqual(_RESPONSE, future.result()) + + # Ensure a new request can be handled + self.assertEqual(_RESPONSE, multi_callable(_REQUEST)) + + def testUnaryStream(self): + multi_callable = self._channel.unary_stream(_UNARY_STREAM) + calls = [] + for _ in range(test_constants.THREAD_CONCURRENCY): + calls.append(multi_callable(_REQUEST)) + + self._trigger.await_calls() + + with self.assertRaises(grpc.RpcError) as exception_context: + next(multi_callable(_REQUEST)) + + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + exception_context.exception.code()) + + self._trigger.trigger() + + for call in calls: + for response in call: + self.assertEqual(_RESPONSE, response) + + # Ensure a new request can be handled + new_call = multi_callable(_REQUEST) + for response in new_call: + self.assertEqual(_RESPONSE, response) + + def testStreamUnary(self): + multi_callable = self._channel.stream_unary(_STREAM_UNARY) + futures = [] + request = iter([_REQUEST] * test_constants.STREAM_LENGTH) + for _ in range(test_constants.THREAD_CONCURRENCY): + futures.append(multi_callable.future(request)) + + self._trigger.await_calls() + + with self.assertRaises(grpc.RpcError) as exception_context: + multi_callable(request) + + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + exception_context.exception.code()) + + future_exception = multi_callable.future(request) + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + future_exception.exception().code()) + + self._trigger.trigger() + + for future in futures: + self.assertEqual(_RESPONSE, future.result()) + + # Ensure a new request can be handled + self.assertEqual(_RESPONSE, multi_callable(request)) + + def testStreamStream(self): + multi_callable = self._channel.stream_stream(_STREAM_STREAM) + calls = [] + request = iter([_REQUEST] * test_constants.STREAM_LENGTH) + for _ in range(test_constants.THREAD_CONCURRENCY): + calls.append(multi_callable(request)) + + self._trigger.await_calls() + + with self.assertRaises(grpc.RpcError) as exception_context: + next(multi_callable(request)) + + self.assertEqual(grpc.StatusCode.RESOURCE_EXHAUSTED, + exception_context.exception.code()) + + self._trigger.trigger() + + for call in calls: + for response in call: + self.assertEqual(_RESPONSE, response) + + # Ensure a new request can be handled + new_call = multi_callable(request) + for response in new_call: + self.assertEqual(_RESPONSE, response) + + +if __name__ == '__main__': + unittest.main(verbosity=2) From 0d11361820df25f8c611411137d1f0482b8372e6 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Fri, 17 Mar 2017 14:33:45 -0500 Subject: [PATCH 125/186] Add error ownership doc --- doc/core/error-ownership-rules.md | 117 ++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 doc/core/error-ownership-rules.md diff --git a/doc/core/error-ownership-rules.md b/doc/core/error-ownership-rules.md new file mode 100644 index 00000000000..a8ae072ae02 --- /dev/null +++ b/doc/core/error-ownership-rules.md @@ -0,0 +1,117 @@ +gRPC Error Ownership Rules +===================== + +## Background + +`grpc_error` is the c-core's opaque representation of an error. It holds a collection of integers, strings, timestamps, and child errors that related to the final error. + +grpc_errors are refcounted objects, which means they need strict ownership semantics. An extra ref on an error can cause a memory leak, and a missing ref can cause a crash. + +This document serves as a detailed overview of grpc_error's ownership rules. It should help people use the errors, as well as help people debug refcount related errors. + +## Clarification of Ownership + +If a particular function is said to "own" an error, that means it has the responsibility of calling unref on the error. A function may have access to an error without ownership of it. + +This means the function may use the error, but must not call unref on it, since that will be done elsewhere in the code. A function that does not own an error may explicitly take ownership of it by manually calling GRPC_ERROR_REF. + +## Ownership Rules + +There are three rules of error ownership, which we will go over in detail. +* If `grpc_error` is returned by a function, the caller owns a ref to that instance. +* If a `grpc_error` is passed to a `grpc_closure` callback function, then that function does not own a ref to the error. +* if a `grpc_error` is passed to *any other function*, then that function takes ownership of the error. + +### Rule 1 + +> If `grpc_error` is returned by a function, the caller owns a ref to that instance.* + +For example, in the following code block, error1 and error2 are owned by the current function. + +```C +grpc_error* error1 = GRPC_ERROR_CREATE("Some error occured"); +grpc_error* error2 = some_operation_that_might_fail(...); +``` + +The current function would have to explicitly call GRPC_ERROR_UNREF on the errors, or pass them along to a function that would take over the ownership. + +### Rule 2 + +> If a `grpc_error` is passed to a `grpc_closure` callback function, then that function does not own a ref to the error. + +A `grpc_closure` callback function is any function that has the signature: + +```C +void (*cb)(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error); +``` + +This means that the error ownership is NOT transferred when a functions calls: + +```C +c->cb(exec_ctx, c->cb_arg, err); +``` + +The caller is still responsible for unref-ing the error. + +However, the above line is currently being phased out! It is safer to invoke callbacks with `grpc_closure_run` and `grpc_closure_sched`. These functions are not callbacks, so they will take ownership of the error passed to them. + +```C +grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); +grpc_closure_run(exec_ctx, cb, error); +// current function no longer has ownership of the error +``` + +If you schedule or run a closure, but still need ownership of the error, then you must explicitly take a reference. + +```C +grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); +grpc_closure_run(exec_ctx, cb, GRPC_ERROR_REF(error)); +// do some other things with the error +GRPC_ERROR_UNREF(error); +``` + +Rule 2 is more important to keep in mind when **implementing** `grpc_closure` callback functions. You must keep in mind that you do not own the error, and must not unref it. More importantly, you cannot pass it to any function that would take ownership of the error, without explicitly taking ownership yourself. For example: + +```C +void on_some_action(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { + // this would cause a crash, because some_function will unref the error, + // and the caller of this callback will also unref it. + some_function(error); + + // this callback function must take ownership, so it can give that + // ownership to the function it is calling. + some_function(GRPC_ERROR_REF(error)); +} +``` + +### Rule 3 + +> if a `grpc_error` is passed to *any other function*, then that function takes ownership of the error. + +Take the following example: + +```C +grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); +// do some things +some_function(error); +// can't use error anymore! might be gone. +``` + +When some_function is called, it takes over the ownership of the error, and it will eventually unref it. So the caller can no longer safely use the error. + +If the caller needed to keep using the error (or passing it to other functions), if would have to take on a reference to it. This is a common pattern seen. + +```C +void func() { + grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); + some_function(GRPC_ERROR_REF(error)); + // do things + some_other_function(GRPC_ERROR_REF(error)); + // do more things + some_last_function(error); +} +``` + +The last call takes ownership and will eventually give the error its final unref. + +When **implementing** a function that takes an error (and is not a `grpc_closure` callback function), you must ensure the error is unref-ed either by doing it explicitly with GRPC_ERROR_UNREF, or by passing the error to a function that takes over the ownership. From 257d4d68387b25d7ab31e9675e2634835d363c48 Mon Sep 17 00:00:00 2001 From: ncteisen Date: Fri, 17 Mar 2017 14:40:27 -0500 Subject: [PATCH 126/186] Regenerate project --- tools/doxygen/Doxyfile.core | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 2 files changed, 2 insertions(+) diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index cd3f2af44c8..6c235cacf9b 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -770,6 +770,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ +doc/core/error-ownership-rules.md \ doc/core/pending_api_cleanups.md \ doc/cpp-style-guide.md \ doc/environment_variables.md \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index e4f56f23747..ee34ec8a4b3 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -770,6 +770,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ +doc/core/error-ownership-rules.md \ doc/core/pending_api_cleanups.md \ doc/cpp-style-guide.md \ doc/environment_variables.md \ From 0aea92057932578e57cc1d2918ada3df8282fe1a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Wed, 15 Mar 2017 15:36:44 -0700 Subject: [PATCH 127/186] Add compression support to cronet transport --- .../cronet/transport/cronet_transport.c | 60 +++++++++++++------ 1 file changed, 42 insertions(+), 18 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index fabfaf8a270..fa2bdb8cf29 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -128,6 +128,7 @@ struct read_state { int received_bytes; int remaining_bytes; int length_field; + bool compressed; char grpc_header_bytes[GRPC_HEADER_SIZE_IN_BYTES]; char *payload_field; bool read_stream_closed; @@ -503,6 +504,7 @@ static void on_response_headers_received( is closed */ GPR_ASSERT(s->state.rs.length_field_received == false); s->state.rs.read_buffer = s->state.rs.grpc_header_bytes; + s->state.rs.compressed = false; s->state.rs.received_bytes = 0; s->state.rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); @@ -634,7 +636,7 @@ static void on_response_trailers_received( */ static void create_grpc_frame(grpc_slice_buffer *write_slice_buffer, char **pp_write_buffer, - size_t *p_write_buffer_size) { + size_t *p_write_buffer_size, uint32_t flags) { grpc_slice slice = grpc_slice_buffer_take_first(write_slice_buffer); size_t length = GRPC_SLICE_LENGTH(slice); *p_write_buffer_size = length + GRPC_HEADER_SIZE_IN_BYTES; @@ -643,7 +645,7 @@ static void create_grpc_frame(grpc_slice_buffer *write_slice_buffer, *pp_write_buffer = write_buffer; uint8_t *p = (uint8_t *)write_buffer; /* Append 5 byte header */ - *p++ = 0; + *p++ = (flags & GRPC_WRITE_INTERNAL_COMPRESS) ? 1 : 0; *p++ = (uint8_t)(length >> 24); *p++ = (uint8_t)(length >> 16); *p++ = (uint8_t)(length >> 8); @@ -721,14 +723,26 @@ static void convert_metadata_to_cronet_headers( *p_num_headers = (size_t)num_headers; } -static int parse_grpc_header(const uint8_t *data) { +static bool parse_grpc_header(const uint8_t *data, + int *length, + bool *compressed) { + const uint8_t c = *data; const uint8_t *p = data + 1; - int length = 0; - length |= ((uint8_t)*p++) << 24; - length |= ((uint8_t)*p++) << 16; - length |= ((uint8_t)*p++) << 8; - length |= ((uint8_t)*p++); - return length; + *length = 0; + *length |= ((uint8_t)*p++) << 24; + *length |= ((uint8_t)*p++) << 16; + *length |= ((uint8_t)*p++) << 8; + *length |= ((uint8_t)*p++); + switch (c) { + case 0: + *compressed = false; + return true; + case 1: + *compressed = true; + return true; + default: + return false; + } } static bool header_has_authority(grpc_linked_mdelem *head) { @@ -948,12 +962,6 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, grpc_slice_buffer_init(&write_slice_buffer); grpc_byte_stream_next(NULL, stream_op->send_message, &slice, stream_op->send_message->length, NULL); - /* Check that compression flag is OFF. We don't support compression yet. - */ - if (stream_op->send_message->flags != 0) { - gpr_log(GPR_ERROR, "Compression is not supported"); - GPR_ASSERT(stream_op->send_message->flags == 0); - } grpc_slice_buffer_add(&write_slice_buffer, slice); if (write_slice_buffer.count != 1) { /* Empty request not handled yet */ @@ -963,7 +971,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, if (write_slice_buffer.count > 0) { size_t write_buffer_size; create_grpc_frame(&write_slice_buffer, &stream_state->ws.write_buffer, - &write_buffer_size); + &write_buffer_size, stream_op->send_message->flags); CRONET_LOG(GPR_DEBUG, "bidirectional_stream_write (%p, %p)", s->cbs, stream_state->ws.write_buffer); stream_state->state_callback_received[OP_SEND_MESSAGE] = false; @@ -1059,8 +1067,15 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, stream_state->rs.remaining_bytes == 0) { /* Start a read operation for data */ stream_state->rs.length_field_received = true; - stream_state->rs.length_field = stream_state->rs.remaining_bytes = - parse_grpc_header((const uint8_t *)stream_state->rs.read_buffer); + if (parse_grpc_header((const uint8_t *)stream_state->rs.read_buffer, + &stream_state->rs.length_field, + &stream_state->rs.compressed)) { + stream_state->rs.remaining_bytes = stream_state->rs.length_field; + } else { + /* Error deframing the data frame. */ + CRONET_LOG(GPR_DEBUG, "stream deframing error"); + GPR_ASSERT(false); + } CRONET_LOG(GPR_DEBUG, "length field = %d", stream_state->rs.length_field); if (stream_state->rs.length_field > 0) { @@ -1082,6 +1097,9 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, grpc_slice_buffer_init(&stream_state->rs.read_slice_buffer); grpc_slice_buffer_stream_init(&stream_state->rs.sbs, &stream_state->rs.read_slice_buffer, 0); + if (stream_state->rs.compressed) { + stream_state->rs.sbs.base.flags |= GRPC_WRITE_INTERNAL_COMPRESS; + } *((grpc_byte_buffer **)stream_op->recv_message) = (grpc_byte_buffer *)&stream_state->rs.sbs; grpc_closure_sched(exec_ctx, stream_op->recv_message_ready, @@ -1093,6 +1111,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes; stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; stream_state->rs.received_bytes = 0; + stream_state->rs.compressed = false; stream_state->rs.length_field_received = false; CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); stream_state->state_op_done[OP_READ_REQ_MADE] = @@ -1107,6 +1126,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes; stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; stream_state->rs.received_bytes = 0; + stream_state->rs.compressed = false; CRONET_LOG(GPR_DEBUG, "bidirectional_stream_read(%p)", s->cbs); stream_state->state_op_done[OP_READ_REQ_MADE] = true; /* Indicates that at least one read request has been made */ @@ -1130,6 +1150,9 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, read_data_slice); grpc_slice_buffer_stream_init(&stream_state->rs.sbs, &stream_state->rs.read_slice_buffer, 0); + if (stream_state->rs.compressed) { + stream_state->rs.sbs.base.flags = GRPC_WRITE_INTERNAL_COMPRESS; + } *((grpc_byte_buffer **)stream_op->recv_message) = (grpc_byte_buffer *)&stream_state->rs.sbs; grpc_closure_sched(exec_ctx, stream_op->recv_message_ready, @@ -1139,6 +1162,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, /* Do an extra read to trigger on_succeeded() callback in case connection is closed */ stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes; + stream_state->rs.compressed = false; stream_state->rs.received_bytes = 0; stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES; stream_state->rs.length_field_received = false; From 3c3093cbed08efac9e73cd0bb1a062e75fab3e0a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 17 Mar 2017 14:36:01 -0700 Subject: [PATCH 128/186] Fix that there is no :status header in the case of trailer-only failure reply --- .../chttp2/transport/chttp2_transport.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index 082078c72f0..89659e7464f 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -1765,6 +1765,7 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error *error) { grpc_slice hdr; grpc_slice status_hdr; + grpc_slice http_status_hdr; grpc_slice message_pfx; uint8_t *p; uint32_t len = 0; @@ -1780,6 +1781,26 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, It's complicated by the fact that our send machinery would be dead by the time we got around to sending this, so instead we ignore HPACK compression and just write the uncompressed bytes onto the wire. */ + if (!s->sent_initial_metadata) { + http_status_hdr = grpc_slice_malloc(13); + p = GRPC_SLICE_START_PTR(http_status_hdr); + *p++ = 0x00; + *p++ = 7; + *p++ = ':'; + *p++ = 's'; + *p++ = 't'; + *p++ = 'a'; + *p++ = 't'; + *p++ = 'u'; + *p++ = 's'; + *p++ = 3; + *p++ = '2'; + *p++ = '0'; + *p++ = '0'; + GPR_ASSERT(p == GRPC_SLICE_END_PTR(http_status_hdr)); + len += (uint32_t)GRPC_SLICE_LENGTH(http_status_hdr); + } + status_hdr = grpc_slice_malloc(15 + (grpc_status >= 10)); p = GRPC_SLICE_START_PTR(status_hdr); *p++ = 0x00; /* literal header, not indexed */ @@ -1847,6 +1868,9 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, GPR_ASSERT(p == GRPC_SLICE_END_PTR(hdr)); grpc_slice_buffer_add(&t->qbuf, hdr); + if (!s->sent_initial_metadata) { + grpc_slice_buffer_add(&t->qbuf, http_status_hdr); + } grpc_slice_buffer_add(&t->qbuf, status_hdr); if (msg != NULL) { grpc_slice_buffer_add(&t->qbuf, message_pfx); From 780cf2a9c15fc41751c42caeada2b8340cd034cd Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 17 Mar 2017 14:36:01 -0700 Subject: [PATCH 129/186] Fix that there is no :status header in the case of trailer-only failure reply --- .../chttp2/transport/chttp2_transport.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index a3684535ff0..042a89277db 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -1760,6 +1760,7 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s, grpc_error *error) { grpc_slice hdr; grpc_slice status_hdr; + grpc_slice http_status_hdr; grpc_slice message_pfx; uint8_t *p; uint32_t len = 0; @@ -1775,6 +1776,26 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, It's complicated by the fact that our send machinery would be dead by the time we got around to sending this, so instead we ignore HPACK compression and just write the uncompressed bytes onto the wire. */ + if (!s->sent_initial_metadata) { + http_status_hdr = grpc_slice_malloc(13); + p = GRPC_SLICE_START_PTR(http_status_hdr); + *p++ = 0x00; + *p++ = 7; + *p++ = ':'; + *p++ = 's'; + *p++ = 't'; + *p++ = 'a'; + *p++ = 't'; + *p++ = 'u'; + *p++ = 's'; + *p++ = 3; + *p++ = '2'; + *p++ = '0'; + *p++ = '0'; + GPR_ASSERT(p == GRPC_SLICE_END_PTR(http_status_hdr)); + len += (uint32_t)GRPC_SLICE_LENGTH(http_status_hdr); + } + status_hdr = grpc_slice_malloc(15 + (grpc_status >= 10)); p = GRPC_SLICE_START_PTR(status_hdr); *p++ = 0x00; /* literal header, not indexed */ @@ -1842,6 +1863,9 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, GPR_ASSERT(p == GRPC_SLICE_END_PTR(hdr)); grpc_slice_buffer_add(&t->qbuf, hdr); + if (!s->sent_initial_metadata) { + grpc_slice_buffer_add(&t->qbuf, http_status_hdr); + } grpc_slice_buffer_add(&t->qbuf, status_hdr); if (msg != NULL) { grpc_slice_buffer_add(&t->qbuf, message_pfx); From cb2f3f6ba6f8097b6a15d311d6eed9709c655963 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Fri, 17 Mar 2017 14:30:09 -0700 Subject: [PATCH 130/186] Downgrade error severity to INFO when failing to add a listener --- src/core/lib/iomgr/tcp_server_posix.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/core/lib/iomgr/tcp_server_posix.c b/src/core/lib/iomgr/tcp_server_posix.c index b3644518f54..e242631fc0b 100644 --- a/src/core/lib/iomgr/tcp_server_posix.c +++ b/src/core/lib/iomgr/tcp_server_posix.c @@ -350,8 +350,20 @@ static grpc_error *add_wildcard_addrs_to_server(grpc_tcp_server *s, } } if (*out_port > 0) { - GRPC_LOG_IF_ERROR("Failed to add :: listener", v6_err); - GRPC_LOG_IF_ERROR("Failed to add 0.0.0.0 listener", v4_err); + if (v6_err != GRPC_ERROR_NONE) { + gpr_log(GPR_INFO, + "Failed to add :: listener, " + "the environment may not support IPv6: %s", + grpc_error_string(v6_err)); + GRPC_ERROR_UNREF(v6_err); + } + if (v4_err != GRPC_ERROR_NONE) { + gpr_log(GPR_INFO, + "Failed to add 0.0.0.0 listener, " + "the environment may not support IPv4: %s", + grpc_error_string(v4_err)); + GRPC_ERROR_UNREF(v4_err); + } return GRPC_ERROR_NONE; } else { grpc_error *root_err = From 18de3d723902b441f670600a4cbe19ad3634010a Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Fri, 17 Mar 2017 15:28:13 -0700 Subject: [PATCH 131/186] Make changes suggested by Mark, make this pass sanity --- doc/combiner-explainer.md | 8 ++++---- tools/doxygen/Doxyfile.c++ | 1 + tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core | 1 + tools/doxygen/Doxyfile.core.internal | 1 + 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/combiner-explainer.md b/doc/combiner-explainer.md index 9d0a4f30f22..9e9d077273e 100644 --- a/doc/combiner-explainer.md +++ b/doc/combiner-explainer.md @@ -92,7 +92,7 @@ class combiner { So that explains how combiners work in general. In gRPC, there is `start_batch(..., tag)` and then work only gets activated by somebody -calling `cq::next` which returns a tag. This gives and API-level +calling `cq::next` which returns a tag. This gives an API-level guarantee that there will be a thread doing polling to actually make work happen. However, some operations are not covered by a poller thread, such as cancellation that doesn't have a completion. Other @@ -128,12 +128,12 @@ tries to spray events onto as many threads as possible to get as much concurrenc So `offload` really does: ``` - distributor.run(continue_from_while_loop); + workqueue.run(continue_from_while_loop); break; ``` -This needs us to add another class variable for a `distributor` -(called a `workqueue` in the code). +This needs us to add another class variable for a `workqueue` +(which is really conceptually a distributor). ``` workqueue::run(f) { diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index b5021ede157..5e6333dc899 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -764,6 +764,7 @@ INPUT = doc/PROTOCOL-HTTP2.md \ doc/PROTOCOL-WEB.md \ doc/binary-logging.md \ doc/c-style-guide.md \ +doc/combiner-explainer.md \ doc/command_line_tool.md \ doc/compression.md \ doc/compression_cookbook.md \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 758ba2402ae..8b7ec50a930 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -764,6 +764,7 @@ INPUT = doc/PROTOCOL-HTTP2.md \ doc/PROTOCOL-WEB.md \ doc/binary-logging.md \ doc/c-style-guide.md \ +doc/combiner-explainer.md \ doc/command_line_tool.md \ doc/compression.md \ doc/compression_cookbook.md \ diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index cd3f2af44c8..355029ec9e5 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -764,6 +764,7 @@ INPUT = doc/PROTOCOL-HTTP2.md \ doc/PROTOCOL-WEB.md \ doc/binary-logging.md \ doc/c-style-guide.md \ +doc/combiner-explainer.md \ doc/command_line_tool.md \ doc/compression.md \ doc/compression_cookbook.md \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index e4f56f23747..a3507274ec2 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -764,6 +764,7 @@ INPUT = doc/PROTOCOL-HTTP2.md \ doc/PROTOCOL-WEB.md \ doc/binary-logging.md \ doc/c-style-guide.md \ +doc/combiner-explainer.md \ doc/command_line_tool.md \ doc/compression.md \ doc/compression_cookbook.md \ From 59660e55709d29f71d696221d77e0f5d6cc76f7a Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Fri, 17 Mar 2017 15:54:06 -0700 Subject: [PATCH 132/186] Add supprot of processing trailer-only response in cronet_transport.c --- .../cronet/transport/cronet_transport.c | 19 +++++++++++++++++-- .../CoreCronetEnd2EndTests.m | 3 +-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index fa2bdb8cf29..791f0416ad0 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -484,6 +484,16 @@ static void on_response_headers_received( CRONET_LOG(GPR_DEBUG, "R: on_response_headers_received(%p, %p, %s)", stream, headers, negotiated_protocol); stream_obj *s = (stream_obj *)stream->annotation; + + /* Identify if this is a header or a trailer (in a trailer-only response case) + */ + for (size_t i = 0; i < headers->count; i++) { + if (0 == strcmp("grpc-status", headers->headers[i].key)) { + on_response_trailers_received(stream, headers); + return; + } + } + gpr_mu_lock(&s->mu); memset(&s->state.rs.initial_metadata, 0, sizeof(s->state.rs.initial_metadata)); @@ -795,7 +805,8 @@ static bool op_can_be_run(grpc_transport_stream_op *curr_op, else if (!stream_state->state_callback_received[OP_SEND_INITIAL_METADATA]) result = false; /* we haven't received headers yet. */ - else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA]) + else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA] && + !stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) result = false; } else if (op_id == OP_SEND_MESSAGE) { /* already executed (note we're checking op specific state, not stream @@ -808,7 +819,8 @@ static bool op_can_be_run(grpc_transport_stream_op *curr_op, /* already executed */ if (op_state->state_op_done[OP_RECV_MESSAGE]) result = false; /* we haven't received headers yet. */ - else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA]) + else if (!stream_state->state_callback_received[OP_RECV_INITIAL_METADATA] && + !stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) result = false; } else if (op_id == OP_RECV_TRAILING_METADATA) { /* already executed */ @@ -1023,6 +1035,9 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, } else if (stream_state->state_callback_received[OP_FAILED]) { grpc_closure_sched(exec_ctx, stream_op->recv_initial_metadata_ready, GRPC_ERROR_NONE); + } else if (stream_state->state_op_done[OP_RECV_TRAILING_METADATA]) { + grpc_closure_sched(exec_ctx, stream_op->recv_initial_metadata_ready, + GRPC_ERROR_NONE); } else { grpc_chttp2_incoming_metadata_buffer_publish( exec_ctx, &oas->s->state.rs.initial_metadata, diff --git a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m index 1e0c8024cab..3b442645e83 100644 --- a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m +++ b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.m @@ -273,8 +273,7 @@ static char *roots_filename; } - (void)testCompressedPayload { - // NOT SUPPORTED - // [self testIndividualCase:"compressed_payload"]; + [self testIndividualCase:"compressed_payload"]; } - (void)testConnectivity { From bb7484cee7943f82680f32267ffd6115a355111f Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Fri, 17 Mar 2017 23:42:39 +0000 Subject: [PATCH 133/186] Update tests to current gRPC code elements --- .../grpcio_tests/tests/interop/_insecure_intraop_test.py | 8 ++++---- .../grpcio_tests/tests/interop/_secure_intraop_test.py | 8 ++++---- src/python/grpcio_tests/tests/interop/methods.py | 4 ++-- src/python/grpcio_tests/tests/interop/server.py | 5 +++-- src/python/grpcio_tests/tests/qps/qps_worker.py | 4 ++-- src/python/grpcio_tests/tests/qps/worker_server.py | 8 ++++---- .../tests/reflection/_reflection_servicer_test.py | 7 ++++--- src/python/grpcio_tests/tests/stress/client.py | 4 ++-- 8 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py index 58f3b364bad..3325d54375a 100644 --- a/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_insecure_intraop_test.py @@ -32,7 +32,7 @@ from concurrent import futures import unittest import grpc -from src.proto.grpc.testing import test_pb2 +from src.proto.grpc.testing import test_pb2_grpc from tests.interop import _intraop_test_case from tests.interop import methods @@ -44,11 +44,11 @@ class InsecureIntraopTest(_intraop_test_case.IntraopTestCase, def setUp(self): self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - test_pb2.add_TestServiceServicer_to_server(methods.TestService(), - self.server) + test_pb2_grpc.add_TestServiceServicer_to_server(methods.TestService(), + self.server) port = self.server.add_insecure_port('[::]:0') self.server.start() - self.stub = test_pb2.TestServiceStub( + self.stub = test_pb2_grpc.TestServiceStub( grpc.insecure_channel('localhost:{}'.format(port))) diff --git a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py index 5fe929b99ed..857e00efb3a 100644 --- a/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py +++ b/src/python/grpcio_tests/tests/interop/_secure_intraop_test.py @@ -32,7 +32,7 @@ from concurrent import futures import unittest import grpc -from src.proto.grpc.testing import test_pb2 +from src.proto.grpc.testing import test_pb2_grpc from tests.interop import _intraop_test_case from tests.interop import methods @@ -45,14 +45,14 @@ class SecureIntraopTest(_intraop_test_case.IntraopTestCase, unittest.TestCase): def setUp(self): self.server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - test_pb2.add_TestServiceServicer_to_server(methods.TestService(), - self.server) + test_pb2_grpc.add_TestServiceServicer_to_server(methods.TestService(), + self.server) port = self.server.add_secure_port( '[::]:0', grpc.ssl_server_credentials( [(resources.private_key(), resources.certificate_chain())])) self.server.start() - self.stub = test_pb2.TestServiceStub( + self.stub = test_pb2_grpc.TestServiceStub( grpc.secure_channel('localhost:{}'.format(port), grpc.ssl_channel_credentials( resources.test_root_certificates()), ( diff --git a/src/python/grpcio_tests/tests/interop/methods.py b/src/python/grpcio_tests/tests/interop/methods.py index 662ea9ce570..e1016f7c0d5 100644 --- a/src/python/grpcio_tests/tests/interop/methods.py +++ b/src/python/grpcio_tests/tests/interop/methods.py @@ -40,7 +40,7 @@ from grpc.beta import implementations from src.proto.grpc.testing import empty_pb2 from src.proto.grpc.testing import messages_pb2 -from src.proto.grpc.testing import test_pb2 +from src.proto.grpc.testing import test_pb2_grpc _INITIAL_METADATA_KEY = "x-grpc-test-echo-initial" _TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin" @@ -66,7 +66,7 @@ def _maybe_echo_status_and_message(request, servicer_context): servicer_context.set_details(request.response_status.message) -class TestService(test_pb2.TestServiceServicer): +class TestService(test_pb2_grpc.TestServiceServicer): def EmptyCall(self, request, context): _maybe_echo_metadata(context) diff --git a/src/python/grpcio_tests/tests/interop/server.py b/src/python/grpcio_tests/tests/interop/server.py index 65f1604eb82..0ae2c97b427 100644 --- a/src/python/grpcio_tests/tests/interop/server.py +++ b/src/python/grpcio_tests/tests/interop/server.py @@ -34,7 +34,7 @@ import logging import time import grpc -from src.proto.grpc.testing import test_pb2 +from src.proto.grpc.testing import test_pb2_grpc from tests.interop import methods from tests.interop import resources @@ -53,7 +53,8 @@ def serve(): args = parser.parse_args() server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - test_pb2.add_TestServiceServicer_to_server(methods.TestService(), server) + test_pb2_grpc.add_TestServiceServicer_to_server(methods.TestService(), + server) if args.use_tls: private_key = resources.private_key() certificate_chain = resources.certificate_chain() diff --git a/src/python/grpcio_tests/tests/qps/qps_worker.py b/src/python/grpcio_tests/tests/qps/qps_worker.py index 025dfb9d4a7..7cd53e7bd9a 100644 --- a/src/python/grpcio_tests/tests/qps/qps_worker.py +++ b/src/python/grpcio_tests/tests/qps/qps_worker.py @@ -33,7 +33,7 @@ import time from concurrent import futures import grpc -from src.proto.grpc.testing import services_pb2 +from src.proto.grpc.testing import services_pb2_grpc from tests.qps import worker_server @@ -41,7 +41,7 @@ from tests.qps import worker_server def run_worker_server(port): server = grpc.server(futures.ThreadPoolExecutor(max_workers=5)) servicer = worker_server.WorkerServer() - services_pb2.add_WorkerServiceServicer_to_server(servicer, server) + services_pb2_grpc.add_WorkerServiceServicer_to_server(servicer, server) server.add_insecure_port('[::]:{}'.format(port)) server.start() servicer.wait_for_quit() diff --git a/src/python/grpcio_tests/tests/qps/worker_server.py b/src/python/grpcio_tests/tests/qps/worker_server.py index ca1a777611c..de9535f46eb 100644 --- a/src/python/grpcio_tests/tests/qps/worker_server.py +++ b/src/python/grpcio_tests/tests/qps/worker_server.py @@ -35,7 +35,7 @@ import time from concurrent import futures import grpc from src.proto.grpc.testing import control_pb2 -from src.proto.grpc.testing import services_pb2 +from src.proto.grpc.testing import services_pb2_grpc from src.proto.grpc.testing import stats_pb2 from tests.qps import benchmark_client @@ -45,7 +45,7 @@ from tests.qps import histogram from tests.unit import resources -class WorkerServer(services_pb2.WorkerServiceServicer): +class WorkerServer(services_pb2_grpc.WorkerServiceServicer): """Python Worker Server implementation.""" def __init__(self): @@ -87,8 +87,8 @@ class WorkerServer(services_pb2.WorkerServiceServicer): futures.ThreadPoolExecutor(max_workers=server_threads)) if config.server_type == control_pb2.ASYNC_SERVER: servicer = benchmark_server.BenchmarkServer() - services_pb2.add_BenchmarkServiceServicer_to_server(servicer, - server) + services_pb2_grpc.add_BenchmarkServiceServicer_to_server(servicer, + server) elif config.server_type == control_pb2.ASYNC_GENERIC_SERVER: resp_size = config.payload_config.bytebuf_params.resp_size servicer = benchmark_server.GenericBenchmarkServer(resp_size) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index d06ff064e24..4d73be6204c 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -34,6 +34,7 @@ import grpc from grpc.framework.foundation import logging_pool from grpc_reflection.v1alpha import reflection from grpc_reflection.v1alpha import reflection_pb2 +from grpc_reflection.v1alpha import reflection_pb2_grpc from google.protobuf import descriptor_pool from google.protobuf import descriptor_pb2 @@ -61,12 +62,12 @@ class ReflectionServicerTest(unittest.TestCase): server_pool = logging_pool.pool(test_constants.THREAD_CONCURRENCY) self._server = grpc.server(server_pool) port = self._server.add_insecure_port('[::]:0') - reflection_pb2.add_ServerReflectionServicer_to_server(servicer, - self._server) + reflection_pb2_grpc.add_ServerReflectionServicer_to_server(servicer, + self._server) self._server.start() channel = grpc.insecure_channel('localhost:%d' % port) - self._stub = reflection_pb2.ServerReflectionStub(channel) + self._stub = reflection_pb2_grpc.ServerReflectionStub(channel) def testFileByName(self): requests = (reflection_pb2.ServerReflectionRequest( diff --git a/src/python/grpcio_tests/tests/stress/client.py b/src/python/grpcio_tests/tests/stress/client.py index b9dbe61d44b..b7eb12bff86 100644 --- a/src/python/grpcio_tests/tests/stress/client.py +++ b/src/python/grpcio_tests/tests/stress/client.py @@ -34,7 +34,7 @@ import threading import grpc from six.moves import queue -from src.proto.grpc.testing import metrics_pb2 +from src.proto.grpc.testing import metrics_pb2_grpc from src.proto.grpc.testing import test_pb2 from tests.interop import methods @@ -139,7 +139,7 @@ def run_test(args): runners = [] server = grpc.server(futures.ThreadPoolExecutor(max_workers=25)) - metrics_pb2.add_MetricsServiceServicer_to_server( + metrics_pb2_grpc.add_MetricsServiceServicer_to_server( metrics_server.MetricsServer(hist), server) server.add_insecure_port('[::]:{}'.format(args.metrics_port)) server.start() From b862b6ae205628d7713ee2e4cbb752206cf0b1f6 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Sun, 19 Mar 2017 23:36:21 -0700 Subject: [PATCH 134/186] use RTEST with channel watch arg to capture larger set of truthy args --- src/ruby/ext/grpc/rb_channel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 3b1111e5e2c..1fe825efd64 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -234,7 +234,7 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, /* "01" == 0 mandatory args, 1 (try_to_connect) is optional */ rb_scan_args(argc, argv, "01", &try_to_connect_param); - grpc_try_to_connect = try_to_connect_param == Qtrue ? 1 : 0; + grpc_try_to_connect = RTEST(try_to_connect_param) ? 1 : 0; TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); ch = wrapper->wrapped; From 4e606751db54e289fae86aed7e1b1c2f35478469 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Sun, 19 Mar 2017 23:32:54 -0700 Subject: [PATCH 135/186] add end2end tests to formatter and adjust to formatter --- Rakefile | 3 ++- src/ruby/.rubocop.yml | 1 + src/ruby/end2end/channel_closing_client.rb | 6 +++++- src/ruby/end2end/channel_closing_driver.rb | 16 ++++++++------ src/ruby/end2end/channel_state_client.rb | 7 +++--- src/ruby/end2end/channel_state_driver.rb | 11 +++++----- src/ruby/end2end/end2end_common.rb | 22 ++++++++++++------- src/ruby/end2end/sig_handling_client.rb | 25 ++++++++++++++-------- src/ruby/end2end/sig_handling_driver.rb | 9 ++++---- 9 files changed, 62 insertions(+), 38 deletions(-) diff --git a/Rakefile b/Rakefile index 12ac12710fb..cc02aa130ab 100755 --- a/Rakefile +++ b/Rakefile @@ -12,7 +12,8 @@ load 'tools/distrib/docker_for_windows.rb' # Add rubocop style checking tasks RuboCop::RakeTask.new(:rubocop) do |task| task.options = ['-c', 'src/ruby/.rubocop.yml'] - task.patterns = ['src/ruby/{lib,spec}/**/*.rb'] + # add end2end tests to formatter but don't add generated proto _pb.rb's + task.patterns = ['src/ruby/{lib,spec}/**/*.rb', 'src/ruby/end2end/*.rb'] end spec = Gem::Specification.load('grpc.gemspec') diff --git a/src/ruby/.rubocop.yml b/src/ruby/.rubocop.yml index 0f61ccfa812..7174f3b15af 100644 --- a/src/ruby/.rubocop.yml +++ b/src/ruby/.rubocop.yml @@ -9,6 +9,7 @@ AllCops: - 'bin/math_services_pb.rb' - 'pb/grpc/health/v1/*' - 'pb/test/**/*' + - 'end2end/lib/*' Metrics/CyclomaticComplexity: Max: 9 diff --git a/src/ruby/end2end/channel_closing_client.rb b/src/ruby/end2end/channel_closing_client.rb index a9df0784217..84497973607 100755 --- a/src/ruby/end2end/channel_closing_client.rb +++ b/src/ruby/end2end/channel_closing_client.rb @@ -31,10 +31,13 @@ require_relative './end2end_common' +# Calls '#close' on a Channel when "shutdown" called. This tries to +# trigger a hang or crash bug by closing a channel actively being watched class ChannelClosingClientController < ClientControl::ClientController::Service def initialize(ch) @ch = ch end + def shutdown(_, _) @ch.close ClientControl::Void.new @@ -53,7 +56,8 @@ def main end end.parse! - ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, :this_channel_is_insecure) + ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, + :this_channel_is_insecure) srv = GRPC::RpcServer.new thd = Thread.new do diff --git a/src/ruby/end2end/channel_closing_driver.rb b/src/ruby/end2end/channel_closing_driver.rb index 98c8eaa1cdf..43e2fe8cbbd 100755 --- a/src/ruby/end2end/channel_closing_driver.rb +++ b/src/ruby/end2end/channel_closing_driver.rb @@ -29,23 +29,24 @@ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# make sure that the client doesn't hang when channel is closed explictly while it's used +# make sure that the client doesn't hang when channel is closed +# explictly while it's used require_relative './end2end_common' def main - STDERR.puts "start server" + STDERR.puts 'start server' server_runner = ServerRunner.new server_port = server_runner.run sleep 1 - STDERR.puts "start client" - control_stub, client_pid = start_client("channel_closing_client.rb", server_port) + STDERR.puts 'start client' + control_stub, client_pid = start_client('channel_closing_client.rb', + server_port) sleep 3 - begin Timeout.timeout(10) do control_stub.shutdown(ClientControl::Void.new) @@ -55,8 +56,9 @@ def main STDERR.puts "timeout wait for client pid #{client_pid}" Process.kill('SIGKILL', client_pid) Process.wait(client_pid) - STDERR.puts "killed client child" - raise 'Timed out waiting for client process. It likely hangs when a channel is closed while connectivity is watched' + STDERR.puts 'killed client child' + raise 'Timed out waiting for client process. It likely hangs when a ' \ + 'channel is closed while connectivity is watched' end server_runner.stop diff --git a/src/ruby/end2end/channel_state_client.rb b/src/ruby/end2end/channel_state_client.rb index 476329ff73a..08c21bbb8e8 100755 --- a/src/ruby/end2end/channel_state_client.rb +++ b/src/ruby/end2end/channel_state_client.rb @@ -34,15 +34,16 @@ require_relative './end2end_common' def main server_port = '' OptionParser.new do |opts| - opts.on('--client_control_port=P', String) do |p| - STDERR.puts "client_control_port ignored" + opts.on('--client_control_port=P', String) do + STDERR.puts 'client_control_port ignored' end opts.on('--server_port=P', String) do |p| server_port = p end end.parse! - ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, :this_channel_is_insecure) + ch = GRPC::Core::Channel.new("localhost:#{server_port}", {}, + :this_channel_is_insecure) loop do state = ch.connectivity_state diff --git a/src/ruby/end2end/channel_state_driver.rb b/src/ruby/end2end/channel_state_driver.rb index 8ef32acfffe..c3184bf9392 100755 --- a/src/ruby/end2end/channel_state_driver.rb +++ b/src/ruby/end2end/channel_state_driver.rb @@ -34,14 +34,14 @@ require_relative './end2end_common' def main - STDERR.puts "start server" + STDERR.puts 'start server' server_runner = ServerRunner.new server_port = server_runner.run sleep 1 - STDERR.puts "start client" - _, client_pid = start_client("channel_state_client.rb", server_port) + STDERR.puts 'start client' + _, client_pid = start_client('channel_state_client.rb', server_port) sleep 3 @@ -53,8 +53,9 @@ def main STDERR.puts "timeout wait for client pid #{client_pid}" Process.kill('SIGKILL', client_pid) Process.wait(client_pid) - STDERR.puts "killed client child" - raise 'Timed out waiting for client process. It likely hangs when ended abruptly' + STDERR.puts 'killed client child' + raise 'Timed out waiting for client process. ' \ + 'It likely hangs when ended abruptly' end server_runner.stop diff --git a/src/ruby/end2end/end2end_common.rb b/src/ruby/end2end/end2end_common.rb index d98e41f6421..9534bb20787 100755 --- a/src/ruby/end2end/end2end_common.rb +++ b/src/ruby/end2end/end2end_common.rb @@ -43,6 +43,7 @@ require 'socket' require 'optparse' require 'thread' require 'timeout' +require 'English' # see https://github.com/bbatsov/rubocop/issues/1747 # GreeterServer is simple server that implements the Helloworld Greeter server. class EchoServerImpl < Echo::EchoServer::Service @@ -52,9 +53,11 @@ class EchoServerImpl < Echo::EchoServer::Service end end +# ServerRunner starts an "echo server" that test clients can make calls to class ServerRunner def initialize end + def run @srv = GRPC::RpcServer.new port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure) @@ -66,10 +69,11 @@ class ServerRunner @srv.wait_till_running port end + def stop @srv.stop @thd.join - raise "server not stopped" unless @srv.stopped? + fail 'server not stopped' unless @srv.stopped? end end @@ -81,22 +85,24 @@ def start_client(client_main, server_port) tmp_server.close client_path = File.join(this_dir, client_main) - client_pid = Process.spawn(RbConfig.ruby, client_path, - "--client_control_port=#{client_control_port}", - "--server_port=#{server_port}") + client_pid = Process.spawn(RbConfig.ruby, + client_path, + "--client_control_port=#{client_control_port}", + "--server_port=#{server_port}") sleep 1 - control_stub = ClientControl::ClientController::Stub.new("localhost:#{client_control_port}", :this_channel_is_insecure) - return control_stub, client_pid + control_stub = ClientControl::ClientController::Stub.new( + "localhost:#{client_control_port}", :this_channel_is_insecure) + [control_stub, client_pid] end def cleanup(control_stub, client_pid, server_runner) control_stub.shutdown(ClientControl::Void.new) Process.wait(client_pid) - client_exit_code = $?.exitstatus + client_exit_code = $CHILD_STATUS if client_exit_code != 0 - raise "term sig test failure: client exit code: #{client_exit_code}" + fail "term sig test failure: client exit code: #{client_exit_code}" end server_runner.stop diff --git a/src/ruby/end2end/sig_handling_client.rb b/src/ruby/end2end/sig_handling_client.rb index f0b2ba61caf..5b1e54718ec 100755 --- a/src/ruby/end2end/sig_handling_client.rb +++ b/src/ruby/end2end/sig_handling_client.rb @@ -31,20 +31,25 @@ require_relative './end2end_common' +# Test client. Sends RPC's as normal but process also has signal handlers class SigHandlingClientController < ClientControl::ClientController::Service def initialize(srv, stub) @srv = srv @stub = stub end + def do_echo_rpc(req, _) response = @stub.echo(Echo::EchoRequest.new(request: req.request)) - raise "bad response" unless response.response == req.request + fail 'bad response' unless response.response == req.request ClientControl::Void.new end + def shutdown(_, _) Thread.new do - #TODO(apolcyn) There is a race between stopping the server and the "shutdown" rpc completing, - # See if stop method on server can end active RPC cleanly, to avoid this sleep. + # TODO(apolcyn) There is a race between stopping the + # server and the "shutdown" rpc completing, + # See if stop method on server can end active RPC cleanly, to + # avoid this sleep. sleep 3 @srv.stop end @@ -64,17 +69,19 @@ def main end end.parse! - Signal.trap("TERM") do - STDERR.puts "SIGTERM received" + Signal.trap('TERM') do + STDERR.puts 'SIGTERM received' end - Signal.trap("INT") do - STDERR.puts "SIGINT received" + Signal.trap('INT') do + STDERR.puts 'SIGINT received' end srv = GRPC::RpcServer.new - srv.add_http2_port("0.0.0.0:#{client_control_port}", :this_port_is_insecure) - stub = Echo::EchoServer::Stub.new("localhost:#{server_port}", :this_channel_is_insecure) + srv.add_http2_port("0.0.0.0:#{client_control_port}", + :this_port_is_insecure) + stub = Echo::EchoServer::Stub.new("localhost:#{server_port}", + :this_channel_is_insecure) srv.handle(SigHandlingClientController.new(srv, stub)) srv.run end diff --git a/src/ruby/end2end/sig_handling_driver.rb b/src/ruby/end2end/sig_handling_driver.rb index 4d205da9ae3..c5d46e074cb 100755 --- a/src/ruby/end2end/sig_handling_driver.rb +++ b/src/ruby/end2end/sig_handling_driver.rb @@ -35,20 +35,21 @@ require_relative './end2end_common' def main - STDERR.puts "start server" + STDERR.puts 'start server' server_runner = ServerRunner.new server_port = server_runner.run sleep 1 - STDERR.puts "start client" - control_stub, client_pid = start_client("sig_handling_client.rb", server_port) + STDERR.puts 'start client' + control_stub, client_pid = start_client('sig_handling_client.rb', server_port) sleep 1 count = 0 while count < 5 - control_stub.do_echo_rpc(ClientControl::DoEchoRpcRequest.new(request: 'hello')) + control_stub.do_echo_rpc( + ClientControl::DoEchoRpcRequest.new(request: 'hello')) Process.kill('SIGTERM', client_pid) Process.kill('SIGINT', client_pid) count += 1 From c9bb78f2f85cbb7a71adc02aa97cd6082ee41e06 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Mon, 20 Mar 2017 08:17:13 -0700 Subject: [PATCH 136/186] Make fuzzers run on mac (but not on mac on jenkins) --- tools/buildgen/plugins/make_fuzzer_tests.py | 2 +- tools/run_tests/generated/tests.json | 4934 +++++++++++++++++++ 2 files changed, 4935 insertions(+), 1 deletion(-) diff --git a/tools/buildgen/plugins/make_fuzzer_tests.py b/tools/buildgen/plugins/make_fuzzer_tests.py index ba9825acb91..5fc28ddd31f 100644 --- a/tools/buildgen/plugins/make_fuzzer_tests.py +++ b/tools/buildgen/plugins/make_fuzzer_tests.py @@ -52,7 +52,7 @@ def mako_plugin(dictionary): 'exclude_iomgrs': ['uv'], 'exclude_configs': ['tsan'], 'uses_polling': False, - 'platforms': ['linux'], + 'platforms': ['mac', 'linux'], 'ci_platforms': ['linux'], 'flaky': False, 'language': 'c', diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index b81b98bc5a0..4d1783e8e27 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -41145,6 +41145,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41167,6 +41168,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41189,6 +41191,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41211,6 +41214,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41233,6 +41237,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41255,6 +41260,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41277,6 +41283,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41299,6 +41306,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41321,6 +41329,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41343,6 +41352,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41365,6 +41375,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41387,6 +41398,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41409,6 +41421,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41431,6 +41444,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41453,6 +41467,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41475,6 +41490,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41497,6 +41513,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41519,6 +41536,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41541,6 +41559,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41563,6 +41582,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41585,6 +41605,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41607,6 +41628,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41629,6 +41651,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41651,6 +41674,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41673,6 +41697,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41695,6 +41720,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41717,6 +41743,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41739,6 +41766,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41761,6 +41789,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41783,6 +41812,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41805,6 +41835,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41827,6 +41858,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41849,6 +41881,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41871,6 +41904,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41893,6 +41927,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41915,6 +41950,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41937,6 +41973,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41959,6 +41996,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -41981,6 +42019,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42003,6 +42042,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42025,6 +42065,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42047,6 +42088,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42069,6 +42111,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42091,6 +42134,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42113,6 +42157,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42135,6 +42180,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42157,6 +42203,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42179,6 +42226,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42201,6 +42249,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42223,6 +42272,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42245,6 +42295,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42267,6 +42318,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42289,6 +42341,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42311,6 +42364,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42333,6 +42387,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42355,6 +42410,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42377,6 +42433,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42399,6 +42456,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42421,6 +42479,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42443,6 +42502,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42465,6 +42525,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42487,6 +42548,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42509,6 +42571,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42531,6 +42594,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42553,6 +42617,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42575,6 +42640,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42597,6 +42663,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42619,6 +42686,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42641,6 +42709,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42663,6 +42732,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42685,6 +42755,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42707,6 +42778,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42729,6 +42801,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42751,6 +42824,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42773,6 +42847,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42795,6 +42870,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42817,6 +42893,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42839,6 +42916,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42861,6 +42939,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42883,6 +42962,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42905,6 +42985,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42927,6 +43008,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42949,6 +43031,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42971,6 +43054,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -42993,6 +43077,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43015,6 +43100,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43037,6 +43123,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43059,6 +43146,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43081,6 +43169,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43103,6 +43192,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43125,6 +43215,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43147,6 +43238,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43169,6 +43261,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43191,6 +43284,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43213,6 +43307,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43235,6 +43330,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43257,6 +43353,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43279,6 +43376,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43301,6 +43399,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43323,6 +43422,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43345,6 +43445,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43367,6 +43468,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43389,6 +43491,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43411,6 +43514,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43433,6 +43537,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43455,6 +43560,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43477,6 +43583,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43499,6 +43606,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43521,6 +43629,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43543,6 +43652,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43565,6 +43675,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43587,6 +43698,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43609,6 +43721,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43631,6 +43744,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43653,6 +43767,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43675,6 +43790,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43697,6 +43813,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43719,6 +43836,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43741,6 +43859,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43763,6 +43882,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43785,6 +43905,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43807,6 +43928,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43829,6 +43951,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43851,6 +43974,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43873,6 +43997,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43895,6 +44020,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43917,6 +44043,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43939,6 +44066,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43961,6 +44089,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -43983,6 +44112,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44005,6 +44135,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44027,6 +44158,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44049,6 +44181,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44071,6 +44204,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44093,6 +44227,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44115,6 +44250,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44137,6 +44273,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44159,6 +44296,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44181,6 +44319,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44203,6 +44342,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44225,6 +44365,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44247,6 +44388,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44269,6 +44411,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44291,6 +44434,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44313,6 +44457,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44335,6 +44480,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44357,6 +44503,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44379,6 +44526,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44401,6 +44549,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44423,6 +44572,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44445,6 +44595,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44467,6 +44618,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44489,6 +44641,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44511,6 +44664,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44533,6 +44687,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44555,6 +44710,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44577,6 +44733,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44599,6 +44756,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44621,6 +44779,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44643,6 +44802,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44665,6 +44825,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44687,6 +44848,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44709,6 +44871,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44731,6 +44894,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44753,6 +44917,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44775,6 +44940,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44797,6 +44963,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44819,6 +44986,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44841,6 +45009,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44863,6 +45032,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44885,6 +45055,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44907,6 +45078,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44929,6 +45101,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44951,6 +45124,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44973,6 +45147,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -44995,6 +45170,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45017,6 +45193,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45039,6 +45216,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45061,6 +45239,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45083,6 +45262,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45105,6 +45285,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45127,6 +45308,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45149,6 +45331,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45171,6 +45354,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45193,6 +45377,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45215,6 +45400,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45237,6 +45423,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45259,6 +45446,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45281,6 +45469,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45303,6 +45492,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45325,6 +45515,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45347,6 +45538,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45369,6 +45561,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45391,6 +45584,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45413,6 +45607,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45435,6 +45630,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45457,6 +45653,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45479,6 +45676,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45501,6 +45699,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45523,6 +45722,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45545,6 +45745,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45567,6 +45768,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45589,6 +45791,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45611,6 +45814,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45633,6 +45837,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45655,6 +45860,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45677,6 +45883,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45699,6 +45906,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45721,6 +45929,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45743,6 +45952,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45765,6 +45975,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45787,6 +45998,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45809,6 +46021,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45831,6 +46044,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45853,6 +46067,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45875,6 +46090,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45897,6 +46113,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45919,6 +46136,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45941,6 +46159,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45963,6 +46182,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -45985,6 +46205,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46007,6 +46228,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46029,6 +46251,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46051,6 +46274,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46073,6 +46297,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46095,6 +46320,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46117,6 +46343,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46139,6 +46366,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46161,6 +46389,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46183,6 +46412,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46205,6 +46435,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46227,6 +46458,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46249,6 +46481,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46271,6 +46504,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46293,6 +46527,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46315,6 +46550,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46337,6 +46573,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46359,6 +46596,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46381,6 +46619,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46403,6 +46642,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46425,6 +46665,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46447,6 +46688,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46469,6 +46711,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46491,6 +46734,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46513,6 +46757,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46535,6 +46780,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46557,6 +46803,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46579,6 +46826,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46601,6 +46849,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46623,6 +46872,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46645,6 +46895,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46667,6 +46918,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46689,6 +46941,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46711,6 +46964,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46733,6 +46987,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46755,6 +47010,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46777,6 +47033,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46799,6 +47056,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46821,6 +47079,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46843,6 +47102,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46865,6 +47125,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46887,6 +47148,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46909,6 +47171,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46931,6 +47194,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46953,6 +47217,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46975,6 +47240,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -46997,6 +47263,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47019,6 +47286,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47041,6 +47309,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47063,6 +47332,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47085,6 +47355,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47107,6 +47378,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47129,6 +47401,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47151,6 +47424,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47173,6 +47447,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47195,6 +47470,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47217,6 +47493,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47239,6 +47516,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47261,6 +47539,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47283,6 +47562,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47305,6 +47585,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47327,6 +47608,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47349,6 +47631,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47371,6 +47654,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47393,6 +47677,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47415,6 +47700,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47437,6 +47723,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47459,6 +47746,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47481,6 +47769,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47503,6 +47792,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47525,6 +47815,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47547,6 +47838,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47569,6 +47861,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47591,6 +47884,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47613,6 +47907,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47635,6 +47930,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47657,6 +47953,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47679,6 +47976,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47701,6 +47999,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47723,6 +48022,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47745,6 +48045,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47767,6 +48068,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47789,6 +48091,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47811,6 +48114,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47833,6 +48137,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47855,6 +48160,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47877,6 +48183,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47899,6 +48206,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47921,6 +48229,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47943,6 +48252,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47965,6 +48275,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -47987,6 +48298,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48009,6 +48321,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48031,6 +48344,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48053,6 +48367,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48075,6 +48390,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48097,6 +48413,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48119,6 +48436,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48141,6 +48459,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48163,6 +48482,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48185,6 +48505,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48207,6 +48528,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48229,6 +48551,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48251,6 +48574,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48273,6 +48597,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48295,6 +48620,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48317,6 +48643,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48339,6 +48666,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48361,6 +48689,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48383,6 +48712,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48405,6 +48735,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48427,6 +48758,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48449,6 +48781,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48471,6 +48804,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48493,6 +48827,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48515,6 +48850,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48537,6 +48873,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48559,6 +48896,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48581,6 +48919,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48603,6 +48942,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48625,6 +48965,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48647,6 +48988,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48669,6 +49011,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48691,6 +49034,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48713,6 +49057,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48735,6 +49080,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48757,6 +49103,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48779,6 +49126,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48801,6 +49149,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48823,6 +49172,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48845,6 +49195,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48867,6 +49218,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48889,6 +49241,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48911,6 +49264,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48933,6 +49287,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48955,6 +49310,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48977,6 +49333,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -48999,6 +49356,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49021,6 +49379,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49043,6 +49402,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49065,6 +49425,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49087,6 +49448,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49109,6 +49471,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49131,6 +49494,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49153,6 +49517,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49175,6 +49540,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49197,6 +49563,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49219,6 +49586,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49241,6 +49609,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49263,6 +49632,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49285,6 +49655,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49307,6 +49678,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49329,6 +49701,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49351,6 +49724,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49373,6 +49747,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49395,6 +49770,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49417,6 +49793,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49439,6 +49816,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49461,6 +49839,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49483,6 +49862,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49505,6 +49885,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49527,6 +49908,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49549,6 +49931,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49571,6 +49954,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49593,6 +49977,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49615,6 +50000,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49637,6 +50023,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49659,6 +50046,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49681,6 +50069,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49703,6 +50092,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49725,6 +50115,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49747,6 +50138,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49769,6 +50161,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49791,6 +50184,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49813,6 +50207,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49835,6 +50230,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49857,6 +50253,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49879,6 +50276,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49901,6 +50299,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49923,6 +50322,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49945,6 +50345,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49967,6 +50368,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -49989,6 +50391,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50011,6 +50414,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50033,6 +50437,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50055,6 +50460,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50077,6 +50483,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50099,6 +50506,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50121,6 +50529,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50143,6 +50552,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50165,6 +50575,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50187,6 +50598,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50209,6 +50621,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50231,6 +50644,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50253,6 +50667,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50275,6 +50690,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50297,6 +50713,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50319,6 +50736,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50341,6 +50759,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50363,6 +50782,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50385,6 +50805,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50407,6 +50828,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50429,6 +50851,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50451,6 +50874,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50473,6 +50897,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50495,6 +50920,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50517,6 +50943,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50539,6 +50966,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50561,6 +50989,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50583,6 +51012,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50605,6 +51035,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50627,6 +51058,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50649,6 +51081,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50671,6 +51104,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50693,6 +51127,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50715,6 +51150,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50737,6 +51173,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50759,6 +51196,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50781,6 +51219,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50803,6 +51242,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50825,6 +51265,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50847,6 +51288,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50869,6 +51311,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50891,6 +51334,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50913,6 +51357,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50935,6 +51380,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50957,6 +51403,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -50979,6 +51426,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51001,6 +51449,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51023,6 +51472,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51045,6 +51495,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51067,6 +51518,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51089,6 +51541,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51111,6 +51564,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51133,6 +51587,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51155,6 +51610,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51177,6 +51633,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51199,6 +51656,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51221,6 +51679,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51243,6 +51702,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51265,6 +51725,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51287,6 +51748,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51309,6 +51771,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51331,6 +51794,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51353,6 +51817,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51375,6 +51840,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51397,6 +51863,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51419,6 +51886,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51441,6 +51909,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51463,6 +51932,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51485,6 +51955,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51507,6 +51978,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51529,6 +52001,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51551,6 +52024,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51573,6 +52047,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51595,6 +52070,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51617,6 +52093,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51639,6 +52116,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51661,6 +52139,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51683,6 +52162,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51705,6 +52185,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51727,6 +52208,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51749,6 +52231,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51771,6 +52254,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51793,6 +52277,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51815,6 +52300,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51837,6 +52323,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51859,6 +52346,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51881,6 +52369,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51903,6 +52392,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51925,6 +52415,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51947,6 +52438,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51969,6 +52461,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -51991,6 +52484,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52013,6 +52507,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52035,6 +52530,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52057,6 +52553,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52079,6 +52576,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52101,6 +52599,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52123,6 +52622,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52145,6 +52645,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52167,6 +52668,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52189,6 +52691,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52211,6 +52714,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52233,6 +52737,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52255,6 +52760,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52277,6 +52783,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52299,6 +52806,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52321,6 +52829,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52343,6 +52852,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52365,6 +52875,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52387,6 +52898,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52409,6 +52921,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52431,6 +52944,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52453,6 +52967,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52475,6 +52990,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52497,6 +53013,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52519,6 +53036,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52541,6 +53059,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52563,6 +53082,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52585,6 +53105,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52607,6 +53128,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52629,6 +53151,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52651,6 +53174,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52673,6 +53197,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52695,6 +53220,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52717,6 +53243,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52739,6 +53266,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52761,6 +53289,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52783,6 +53312,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52805,6 +53335,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52827,6 +53358,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52849,6 +53381,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52871,6 +53404,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52893,6 +53427,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52915,6 +53450,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52937,6 +53473,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52959,6 +53496,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -52981,6 +53519,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53003,6 +53542,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53025,6 +53565,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53047,6 +53588,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53069,6 +53611,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53091,6 +53634,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53113,6 +53657,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53135,6 +53680,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53157,6 +53703,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53179,6 +53726,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53201,6 +53749,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53223,6 +53772,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53245,6 +53795,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53267,6 +53818,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53289,6 +53841,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53311,6 +53864,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53333,6 +53887,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53355,6 +53910,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53377,6 +53933,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53399,6 +53956,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53421,6 +53979,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53443,6 +54002,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53465,6 +54025,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53487,6 +54048,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53509,6 +54071,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53531,6 +54094,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53553,6 +54117,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53575,6 +54140,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53597,6 +54163,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53619,6 +54186,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53641,6 +54209,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53663,6 +54232,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53685,6 +54255,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53707,6 +54278,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53729,6 +54301,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53751,6 +54324,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53773,6 +54347,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53795,6 +54370,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53817,6 +54393,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53839,6 +54416,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53861,6 +54439,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53883,6 +54462,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53905,6 +54485,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53927,6 +54508,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53949,6 +54531,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53971,6 +54554,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -53993,6 +54577,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54015,6 +54600,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54037,6 +54623,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54059,6 +54646,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54081,6 +54669,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54103,6 +54692,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54125,6 +54715,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54147,6 +54738,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54169,6 +54761,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54191,6 +54784,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54213,6 +54807,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54235,6 +54830,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54257,6 +54853,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54279,6 +54876,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54301,6 +54899,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54323,6 +54922,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54345,6 +54945,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54367,6 +54968,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54389,6 +54991,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54411,6 +55014,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54433,6 +55037,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54455,6 +55060,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54477,6 +55083,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54499,6 +55106,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54521,6 +55129,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54543,6 +55152,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54565,6 +55175,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54587,6 +55198,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54609,6 +55221,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54631,6 +55244,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54653,6 +55267,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54675,6 +55290,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54697,6 +55313,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54719,6 +55336,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54741,6 +55359,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54763,6 +55382,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54785,6 +55405,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54807,6 +55428,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54829,6 +55451,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54851,6 +55474,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54873,6 +55497,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54895,6 +55520,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54917,6 +55543,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54939,6 +55566,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54961,6 +55589,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -54983,6 +55612,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55005,6 +55635,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55027,6 +55658,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55049,6 +55681,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55071,6 +55704,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55093,6 +55727,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55115,6 +55750,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55137,6 +55773,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55159,6 +55796,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55181,6 +55819,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55203,6 +55842,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55225,6 +55865,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55247,6 +55888,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55269,6 +55911,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55291,6 +55934,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55313,6 +55957,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55335,6 +55980,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55357,6 +56003,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55379,6 +56026,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55401,6 +56049,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55423,6 +56072,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55445,6 +56095,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55467,6 +56118,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55489,6 +56141,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55511,6 +56164,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55533,6 +56187,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55555,6 +56210,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55577,6 +56233,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55599,6 +56256,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55621,6 +56279,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55643,6 +56302,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55665,6 +56325,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55687,6 +56348,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55709,6 +56371,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55731,6 +56394,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55753,6 +56417,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55775,6 +56440,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55797,6 +56463,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55819,6 +56486,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55841,6 +56509,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55863,6 +56532,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55885,6 +56555,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55907,6 +56578,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55929,6 +56601,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55951,6 +56624,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55973,6 +56647,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -55995,6 +56670,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56017,6 +56693,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56039,6 +56716,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56061,6 +56739,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56083,6 +56762,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56105,6 +56785,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56127,6 +56808,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56149,6 +56831,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56171,6 +56854,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56193,6 +56877,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56215,6 +56900,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56237,6 +56923,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56259,6 +56946,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56281,6 +56969,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56303,6 +56992,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56325,6 +57015,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56347,6 +57038,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56369,6 +57061,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56391,6 +57084,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56413,6 +57107,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56435,6 +57130,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56457,6 +57153,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56479,6 +57176,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56501,6 +57199,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56523,6 +57222,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56545,6 +57245,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56567,6 +57268,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56589,6 +57291,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56611,6 +57314,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56633,6 +57337,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56655,6 +57360,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56677,6 +57383,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56699,6 +57406,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56721,6 +57429,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56743,6 +57452,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56765,6 +57475,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56787,6 +57498,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56809,6 +57521,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56831,6 +57544,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56853,6 +57567,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56875,6 +57590,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56897,6 +57613,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56919,6 +57636,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56941,6 +57659,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56963,6 +57682,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -56985,6 +57705,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57007,6 +57728,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57029,6 +57751,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57051,6 +57774,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57073,6 +57797,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57095,6 +57820,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57117,6 +57843,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57139,6 +57866,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57161,6 +57889,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57183,6 +57912,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57205,6 +57935,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57227,6 +57958,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57249,6 +57981,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57271,6 +58004,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57293,6 +58027,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57315,6 +58050,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57337,6 +58073,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57359,6 +58096,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57381,6 +58119,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57403,6 +58142,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57425,6 +58165,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57447,6 +58188,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57469,6 +58211,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57491,6 +58234,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57513,6 +58257,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57535,6 +58280,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57557,6 +58303,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57579,6 +58326,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57601,6 +58349,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57623,6 +58372,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57645,6 +58395,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57667,6 +58418,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57689,6 +58441,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57711,6 +58464,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57733,6 +58487,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57755,6 +58510,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57777,6 +58533,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57799,6 +58556,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57821,6 +58579,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57843,6 +58602,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57865,6 +58625,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57887,6 +58648,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57909,6 +58671,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57931,6 +58694,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57953,6 +58717,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57975,6 +58740,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -57997,6 +58763,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58019,6 +58786,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58041,6 +58809,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58063,6 +58832,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58085,6 +58855,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58107,6 +58878,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58129,6 +58901,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58151,6 +58924,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58173,6 +58947,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58195,6 +58970,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58217,6 +58993,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58239,6 +59016,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58261,6 +59039,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58283,6 +59062,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58305,6 +59085,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58327,6 +59108,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58349,6 +59131,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58371,6 +59154,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58393,6 +59177,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58415,6 +59200,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58437,6 +59223,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58459,6 +59246,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58481,6 +59269,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58503,6 +59292,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58525,6 +59315,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58547,6 +59338,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58569,6 +59361,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58591,6 +59384,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58613,6 +59407,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58635,6 +59430,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58657,6 +59453,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58679,6 +59476,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58701,6 +59499,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58723,6 +59522,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58745,6 +59545,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58767,6 +59568,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58789,6 +59591,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58811,6 +59614,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58833,6 +59637,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58855,6 +59660,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58877,6 +59683,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58899,6 +59706,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58921,6 +59729,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58943,6 +59752,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58965,6 +59775,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -58987,6 +59798,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59009,6 +59821,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59031,6 +59844,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59053,6 +59867,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59075,6 +59890,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59097,6 +59913,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59119,6 +59936,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59141,6 +59959,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59163,6 +59982,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59185,6 +60005,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59207,6 +60028,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59229,6 +60051,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59251,6 +60074,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59273,6 +60097,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59295,6 +60120,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59317,6 +60143,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59339,6 +60166,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59361,6 +60189,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59383,6 +60212,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59405,6 +60235,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59427,6 +60258,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59449,6 +60281,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59471,6 +60304,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59493,6 +60327,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59515,6 +60350,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59537,6 +60373,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59559,6 +60396,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59581,6 +60419,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59603,6 +60442,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59625,6 +60465,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59647,6 +60488,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59669,6 +60511,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59691,6 +60534,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59713,6 +60557,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59735,6 +60580,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59757,6 +60603,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59779,6 +60626,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59801,6 +60649,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59823,6 +60672,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59845,6 +60695,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59867,6 +60718,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59889,6 +60741,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59911,6 +60764,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59933,6 +60787,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59955,6 +60810,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59977,6 +60833,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -59999,6 +60856,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60021,6 +60879,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60043,6 +60902,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60065,6 +60925,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60087,6 +60948,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60109,6 +60971,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60131,6 +60994,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60153,6 +61017,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60175,6 +61040,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60197,6 +61063,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60219,6 +61086,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60241,6 +61109,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60263,6 +61132,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60285,6 +61155,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60307,6 +61178,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60329,6 +61201,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60351,6 +61224,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60373,6 +61247,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60395,6 +61270,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60417,6 +61293,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60439,6 +61316,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60461,6 +61339,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60483,6 +61362,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60505,6 +61385,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60527,6 +61408,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60549,6 +61431,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60571,6 +61454,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60593,6 +61477,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60615,6 +61500,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60637,6 +61523,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60659,6 +61546,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60681,6 +61569,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60703,6 +61592,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60725,6 +61615,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60747,6 +61638,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60769,6 +61661,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60791,6 +61684,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60813,6 +61707,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60835,6 +61730,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60857,6 +61753,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60879,6 +61776,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60901,6 +61799,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60923,6 +61822,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60945,6 +61845,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60967,6 +61868,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -60989,6 +61891,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61011,6 +61914,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61033,6 +61937,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61055,6 +61960,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61077,6 +61983,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61099,6 +62006,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61121,6 +62029,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61143,6 +62052,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61165,6 +62075,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61187,6 +62098,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61209,6 +62121,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61231,6 +62144,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61253,6 +62167,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61275,6 +62190,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61297,6 +62213,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61319,6 +62236,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61341,6 +62259,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61363,6 +62282,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61385,6 +62305,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61407,6 +62328,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61429,6 +62351,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61451,6 +62374,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61473,6 +62397,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61495,6 +62420,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61517,6 +62443,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61539,6 +62466,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61561,6 +62489,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61583,6 +62512,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61605,6 +62535,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61627,6 +62558,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61649,6 +62581,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61671,6 +62604,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61693,6 +62627,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61715,6 +62650,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61737,6 +62673,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61759,6 +62696,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61781,6 +62719,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61803,6 +62742,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61825,6 +62765,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61847,6 +62788,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61869,6 +62811,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61891,6 +62834,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61913,6 +62857,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61935,6 +62880,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61957,6 +62903,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -61979,6 +62926,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62001,6 +62949,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62023,6 +62972,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62045,6 +62995,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62067,6 +63018,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62089,6 +63041,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62111,6 +63064,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62133,6 +63087,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62155,6 +63110,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62177,6 +63133,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62199,6 +63156,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62221,6 +63179,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62243,6 +63202,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62265,6 +63225,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62287,6 +63248,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62309,6 +63271,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62331,6 +63294,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62353,6 +63317,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62375,6 +63340,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62397,6 +63363,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62419,6 +63386,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62441,6 +63409,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62463,6 +63432,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62485,6 +63455,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62507,6 +63478,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62529,6 +63501,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62551,6 +63524,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62573,6 +63547,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62595,6 +63570,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62617,6 +63593,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62639,6 +63616,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62661,6 +63639,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62683,6 +63662,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62705,6 +63685,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62727,6 +63708,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62749,6 +63731,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62771,6 +63754,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62793,6 +63777,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62815,6 +63800,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62837,6 +63823,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62859,6 +63846,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62881,6 +63869,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62903,6 +63892,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62925,6 +63915,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62947,6 +63938,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62969,6 +63961,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -62991,6 +63984,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63013,6 +64007,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63035,6 +64030,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63057,6 +64053,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63079,6 +64076,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63101,6 +64099,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63123,6 +64122,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63145,6 +64145,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63167,6 +64168,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63189,6 +64191,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63211,6 +64214,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63233,6 +64237,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63255,6 +64260,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63277,6 +64283,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63299,6 +64306,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63321,6 +64329,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63343,6 +64352,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63365,6 +64375,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63387,6 +64398,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63409,6 +64421,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63431,6 +64444,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63453,6 +64467,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63475,6 +64490,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63497,6 +64513,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63519,6 +64536,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63541,6 +64559,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63563,6 +64582,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63585,6 +64605,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63607,6 +64628,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63629,6 +64651,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63651,6 +64674,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63673,6 +64697,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63695,6 +64720,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63717,6 +64743,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63739,6 +64766,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63761,6 +64789,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63783,6 +64812,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63805,6 +64835,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63827,6 +64858,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63849,6 +64881,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63871,6 +64904,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63893,6 +64927,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63915,6 +64950,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63937,6 +64973,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63959,6 +64996,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -63981,6 +65019,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64003,6 +65042,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64025,6 +65065,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64047,6 +65088,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64069,6 +65111,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64091,6 +65134,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64113,6 +65157,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64135,6 +65180,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64157,6 +65203,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64179,6 +65226,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64201,6 +65249,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64223,6 +65272,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64245,6 +65295,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64267,6 +65318,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64289,6 +65341,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64311,6 +65364,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64333,6 +65387,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64355,6 +65410,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64377,6 +65433,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64399,6 +65456,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64421,6 +65479,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64443,6 +65502,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64465,6 +65525,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64487,6 +65548,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64509,6 +65571,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64531,6 +65594,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64553,6 +65617,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64575,6 +65640,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64597,6 +65663,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64619,6 +65686,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64641,6 +65709,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64663,6 +65732,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64685,6 +65755,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64707,6 +65778,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64729,6 +65801,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64751,6 +65824,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64773,6 +65847,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64795,6 +65870,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64817,6 +65893,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64839,6 +65916,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64861,6 +65939,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64883,6 +65962,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64905,6 +65985,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64927,6 +66008,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64949,6 +66031,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64971,6 +66054,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -64993,6 +66077,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65015,6 +66100,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65037,6 +66123,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65059,6 +66146,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65081,6 +66169,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65103,6 +66192,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65125,6 +66215,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65147,6 +66238,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65169,6 +66261,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65191,6 +66284,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65213,6 +66307,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65235,6 +66330,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65257,6 +66353,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65279,6 +66376,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65301,6 +66399,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65323,6 +66422,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65345,6 +66445,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65367,6 +66468,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65389,6 +66491,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65411,6 +66514,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65433,6 +66537,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65455,6 +66560,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65477,6 +66583,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65499,6 +66606,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65521,6 +66629,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65543,6 +66652,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65565,6 +66675,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65587,6 +66698,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65609,6 +66721,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65631,6 +66744,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65653,6 +66767,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65675,6 +66790,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65697,6 +66813,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65719,6 +66836,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65741,6 +66859,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65763,6 +66882,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65785,6 +66905,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65807,6 +66928,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65829,6 +66951,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65851,6 +66974,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65873,6 +66997,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65895,6 +67020,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65917,6 +67043,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65939,6 +67066,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65961,6 +67089,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -65983,6 +67112,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66005,6 +67135,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66027,6 +67158,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66049,6 +67181,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66071,6 +67204,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66093,6 +67227,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66115,6 +67250,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66137,6 +67273,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66159,6 +67296,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66181,6 +67319,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66203,6 +67342,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66225,6 +67365,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66247,6 +67388,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66269,6 +67411,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66291,6 +67434,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66313,6 +67457,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66335,6 +67480,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66357,6 +67503,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66379,6 +67526,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66401,6 +67549,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66423,6 +67572,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66445,6 +67595,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66467,6 +67618,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66489,6 +67641,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66511,6 +67664,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66533,6 +67687,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66555,6 +67710,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66577,6 +67733,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66599,6 +67756,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66621,6 +67779,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66643,6 +67802,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66665,6 +67825,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66687,6 +67848,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66709,6 +67871,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66731,6 +67894,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66753,6 +67917,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66775,6 +67940,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66797,6 +67963,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66819,6 +67986,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66841,6 +68009,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66863,6 +68032,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66885,6 +68055,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66907,6 +68078,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66929,6 +68101,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66951,6 +68124,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66973,6 +68147,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -66995,6 +68170,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67017,6 +68193,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67039,6 +68216,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67061,6 +68239,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67083,6 +68262,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67105,6 +68285,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67127,6 +68308,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67149,6 +68331,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67171,6 +68354,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67193,6 +68377,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67215,6 +68400,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67237,6 +68423,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67259,6 +68446,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67281,6 +68469,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67303,6 +68492,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67325,6 +68515,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67347,6 +68538,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67369,6 +68561,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67391,6 +68584,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67413,6 +68607,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67435,6 +68630,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67457,6 +68653,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67479,6 +68676,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67501,6 +68699,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67523,6 +68722,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67545,6 +68745,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67567,6 +68768,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67589,6 +68791,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67611,6 +68814,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67633,6 +68837,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67655,6 +68860,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67677,6 +68883,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67699,6 +68906,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67721,6 +68929,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67743,6 +68952,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67765,6 +68975,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67787,6 +68998,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67809,6 +69021,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67831,6 +69044,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67853,6 +69067,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67875,6 +69090,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67897,6 +69113,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67919,6 +69136,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67941,6 +69159,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67963,6 +69182,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -67985,6 +69205,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68007,6 +69228,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68029,6 +69251,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68051,6 +69274,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68073,6 +69297,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68095,6 +69320,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68117,6 +69343,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68139,6 +69366,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68161,6 +69389,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68183,6 +69412,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68205,6 +69435,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68227,6 +69458,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68249,6 +69481,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68271,6 +69504,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68293,6 +69527,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68315,6 +69550,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68337,6 +69573,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68359,6 +69596,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68381,6 +69619,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68403,6 +69642,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68425,6 +69665,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68447,6 +69688,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68469,6 +69711,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68491,6 +69734,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68513,6 +69757,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68535,6 +69780,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68557,6 +69803,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68579,6 +69826,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68601,6 +69849,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68623,6 +69872,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68645,6 +69895,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68667,6 +69918,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68689,6 +69941,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68711,6 +69964,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68733,6 +69987,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68755,6 +70010,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68777,6 +70033,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68799,6 +70056,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68821,6 +70079,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68843,6 +70102,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68865,6 +70125,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68887,6 +70148,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68909,6 +70171,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68931,6 +70194,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68953,6 +70217,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68975,6 +70240,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -68997,6 +70263,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69019,6 +70286,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69041,6 +70309,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69063,6 +70332,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69085,6 +70355,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69107,6 +70378,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69129,6 +70401,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69151,6 +70424,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69173,6 +70447,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69195,6 +70470,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69217,6 +70493,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69239,6 +70516,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69261,6 +70539,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69283,6 +70562,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69305,6 +70585,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69327,6 +70608,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69349,6 +70631,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69371,6 +70654,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69393,6 +70677,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69415,6 +70700,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69437,6 +70723,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69459,6 +70746,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69481,6 +70769,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69503,6 +70792,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69525,6 +70815,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69547,6 +70838,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69569,6 +70861,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69591,6 +70884,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69613,6 +70907,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69635,6 +70930,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69657,6 +70953,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69679,6 +70976,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69701,6 +70999,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69723,6 +71022,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69745,6 +71045,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69767,6 +71068,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69789,6 +71091,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69811,6 +71114,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69833,6 +71137,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69855,6 +71160,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69877,6 +71183,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69899,6 +71206,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69921,6 +71229,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69943,6 +71252,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69965,6 +71275,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -69987,6 +71298,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70009,6 +71321,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70031,6 +71344,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70053,6 +71367,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70075,6 +71390,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70097,6 +71413,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70119,6 +71436,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70141,6 +71459,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70163,6 +71482,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70185,6 +71505,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70207,6 +71528,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70229,6 +71551,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70251,6 +71574,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70273,6 +71597,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70295,6 +71620,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70317,6 +71643,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70339,6 +71666,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70361,6 +71689,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70383,6 +71712,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70405,6 +71735,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70427,6 +71758,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70449,6 +71781,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70471,6 +71804,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70493,6 +71827,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70515,6 +71850,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70537,6 +71873,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70559,6 +71896,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70581,6 +71919,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70603,6 +71942,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70625,6 +71965,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70647,6 +71988,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70669,6 +72011,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70691,6 +72034,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70713,6 +72057,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70735,6 +72080,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70757,6 +72103,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70779,6 +72126,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70801,6 +72149,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70823,6 +72172,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70845,6 +72195,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70867,6 +72218,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70889,6 +72241,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70911,6 +72264,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70933,6 +72287,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70955,6 +72310,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70977,6 +72333,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -70999,6 +72356,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71021,6 +72379,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71043,6 +72402,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71065,6 +72425,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71087,6 +72448,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71109,6 +72471,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71131,6 +72494,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71153,6 +72517,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71175,6 +72540,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71197,6 +72563,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71219,6 +72586,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71241,6 +72609,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71263,6 +72632,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71285,6 +72655,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71307,6 +72678,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71329,6 +72701,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71351,6 +72724,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71373,6 +72747,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71395,6 +72770,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71417,6 +72793,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71439,6 +72816,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71461,6 +72839,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71483,6 +72862,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71505,6 +72885,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71527,6 +72908,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71549,6 +72931,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71571,6 +72954,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71593,6 +72977,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71615,6 +73000,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71637,6 +73023,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71659,6 +73046,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71681,6 +73069,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71703,6 +73092,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71725,6 +73115,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71747,6 +73138,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71769,6 +73161,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71791,6 +73184,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71813,6 +73207,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71835,6 +73230,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71857,6 +73253,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71879,6 +73276,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71901,6 +73299,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71923,6 +73322,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71945,6 +73345,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71967,6 +73368,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -71989,6 +73391,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72011,6 +73414,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72033,6 +73437,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72055,6 +73460,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72077,6 +73483,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72099,6 +73506,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72121,6 +73529,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72143,6 +73552,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72165,6 +73575,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72187,6 +73598,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72209,6 +73621,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72231,6 +73644,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72253,6 +73667,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72275,6 +73690,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72297,6 +73713,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72319,6 +73736,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72341,6 +73759,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72363,6 +73782,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72385,6 +73805,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72407,6 +73828,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72429,6 +73851,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72451,6 +73874,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72473,6 +73897,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72495,6 +73920,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72517,6 +73943,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72539,6 +73966,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72561,6 +73989,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72583,6 +74012,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72605,6 +74035,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72627,6 +74058,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72649,6 +74081,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72671,6 +74104,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72693,6 +74127,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72715,6 +74150,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72737,6 +74173,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72759,6 +74196,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72781,6 +74219,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72803,6 +74242,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72825,6 +74265,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72847,6 +74288,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72869,6 +74311,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72891,6 +74334,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72913,6 +74357,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72935,6 +74380,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72957,6 +74403,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -72979,6 +74426,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73001,6 +74449,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73023,6 +74472,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73045,6 +74495,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73067,6 +74518,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73089,6 +74541,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73111,6 +74564,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73133,6 +74587,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73155,6 +74610,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73177,6 +74633,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73199,6 +74656,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73221,6 +74679,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73243,6 +74702,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73265,6 +74725,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73287,6 +74748,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73309,6 +74771,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73331,6 +74794,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73353,6 +74817,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73375,6 +74840,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73397,6 +74863,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73419,6 +74886,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73441,6 +74909,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73463,6 +74932,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73485,6 +74955,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73507,6 +74978,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73529,6 +75001,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73551,6 +75024,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73573,6 +75047,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73595,6 +75070,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73617,6 +75093,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73639,6 +75116,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73661,6 +75139,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73683,6 +75162,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73705,6 +75185,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73727,6 +75208,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73749,6 +75231,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73771,6 +75254,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73793,6 +75277,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73815,6 +75300,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73837,6 +75323,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73859,6 +75346,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73881,6 +75369,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73903,6 +75392,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73925,6 +75415,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73947,6 +75438,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73969,6 +75461,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -73991,6 +75484,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74013,6 +75507,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74035,6 +75530,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74057,6 +75553,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74079,6 +75576,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74101,6 +75599,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74123,6 +75622,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74145,6 +75645,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74167,6 +75668,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74189,6 +75691,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74211,6 +75714,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74233,6 +75737,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74255,6 +75760,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74277,6 +75783,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74299,6 +75806,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74321,6 +75829,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74343,6 +75852,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74365,6 +75875,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74387,6 +75898,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74409,6 +75921,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74431,6 +75944,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74453,6 +75967,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74475,6 +75990,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74497,6 +76013,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74519,6 +76036,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74541,6 +76059,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74563,6 +76082,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74585,6 +76105,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74607,6 +76128,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74629,6 +76151,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74651,6 +76174,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74673,6 +76197,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74695,6 +76220,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74717,6 +76243,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74739,6 +76266,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74761,6 +76289,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74783,6 +76312,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74805,6 +76335,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74827,6 +76358,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74849,6 +76381,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74871,6 +76404,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74893,6 +76427,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74915,6 +76450,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74937,6 +76473,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74959,6 +76496,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -74981,6 +76519,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75003,6 +76542,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75025,6 +76565,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75047,6 +76588,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75069,6 +76611,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75091,6 +76634,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75113,6 +76657,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75135,6 +76680,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75157,6 +76703,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75179,6 +76726,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75201,6 +76749,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75223,6 +76772,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75245,6 +76795,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75267,6 +76818,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75289,6 +76841,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75311,6 +76864,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75333,6 +76887,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75355,6 +76910,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75377,6 +76933,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75399,6 +76956,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75421,6 +76979,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75443,6 +77002,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75465,6 +77025,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75487,6 +77048,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75509,6 +77071,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75531,6 +77094,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75553,6 +77117,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75575,6 +77140,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75597,6 +77163,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75619,6 +77186,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75641,6 +77209,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75663,6 +77232,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75685,6 +77255,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75707,6 +77278,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75729,6 +77301,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75751,6 +77324,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75773,6 +77347,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75795,6 +77370,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75817,6 +77393,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75839,6 +77416,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75861,6 +77439,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75883,6 +77462,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75905,6 +77485,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75927,6 +77508,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75949,6 +77531,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75971,6 +77554,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -75993,6 +77577,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76015,6 +77600,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76037,6 +77623,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76059,6 +77646,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76081,6 +77669,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76103,6 +77692,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76125,6 +77715,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76147,6 +77738,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76169,6 +77761,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76191,6 +77784,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76213,6 +77807,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76235,6 +77830,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76257,6 +77853,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76279,6 +77876,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76301,6 +77899,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76323,6 +77922,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76345,6 +77945,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76367,6 +77968,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76389,6 +77991,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76411,6 +78014,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76433,6 +78037,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76455,6 +78060,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76477,6 +78083,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76499,6 +78106,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76521,6 +78129,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76543,6 +78152,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76565,6 +78175,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76587,6 +78198,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76609,6 +78221,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76631,6 +78244,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76653,6 +78267,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76675,6 +78290,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76697,6 +78313,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76719,6 +78336,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76741,6 +78359,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76763,6 +78382,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76785,6 +78405,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76807,6 +78428,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76829,6 +78451,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76851,6 +78474,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76873,6 +78497,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76895,6 +78520,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76917,6 +78543,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76939,6 +78566,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76961,6 +78589,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -76983,6 +78612,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77005,6 +78635,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77027,6 +78658,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77049,6 +78681,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77071,6 +78704,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77093,6 +78727,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77115,6 +78750,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77137,6 +78773,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77159,6 +78796,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77181,6 +78819,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77203,6 +78842,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77225,6 +78865,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77247,6 +78888,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77269,6 +78911,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77291,6 +78934,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77313,6 +78957,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77335,6 +78980,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77357,6 +79003,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77379,6 +79026,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77401,6 +79049,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77423,6 +79072,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77445,6 +79095,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77467,6 +79118,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77489,6 +79141,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77511,6 +79164,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77533,6 +79187,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77555,6 +79210,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77577,6 +79233,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77599,6 +79256,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77621,6 +79279,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77643,6 +79302,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77665,6 +79325,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77687,6 +79348,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77709,6 +79371,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77731,6 +79394,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77753,6 +79417,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77775,6 +79440,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77797,6 +79463,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77819,6 +79486,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77841,6 +79509,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77863,6 +79532,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77885,6 +79555,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77907,6 +79578,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77929,6 +79601,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77951,6 +79624,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77973,6 +79647,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -77995,6 +79670,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78017,6 +79693,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78039,6 +79716,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78061,6 +79739,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78083,6 +79762,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78105,6 +79785,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78127,6 +79808,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78149,6 +79831,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78171,6 +79854,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78193,6 +79877,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78215,6 +79900,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78237,6 +79923,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78259,6 +79946,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78281,6 +79969,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78303,6 +79992,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78325,6 +80015,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78347,6 +80038,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78369,6 +80061,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78391,6 +80084,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78413,6 +80107,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78435,6 +80130,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78457,6 +80153,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78479,6 +80176,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78501,6 +80199,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78523,6 +80222,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78545,6 +80245,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78567,6 +80268,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78589,6 +80291,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78611,6 +80314,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78633,6 +80337,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78655,6 +80360,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78677,6 +80383,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78699,6 +80406,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78721,6 +80429,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78743,6 +80452,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78765,6 +80475,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78787,6 +80498,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78809,6 +80521,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78831,6 +80544,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78853,6 +80567,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78875,6 +80590,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78897,6 +80613,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78919,6 +80636,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78941,6 +80659,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78963,6 +80682,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -78985,6 +80705,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79007,6 +80728,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79029,6 +80751,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79051,6 +80774,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79073,6 +80797,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79095,6 +80820,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79117,6 +80843,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79139,6 +80866,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79161,6 +80889,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79183,6 +80912,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79205,6 +80935,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79227,6 +80958,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79249,6 +80981,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79271,6 +81004,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79293,6 +81027,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79315,6 +81050,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79337,6 +81073,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79359,6 +81096,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79381,6 +81119,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79403,6 +81142,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79425,6 +81165,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79447,6 +81188,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79469,6 +81211,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79491,6 +81234,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79513,6 +81257,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79535,6 +81280,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79557,6 +81303,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79579,6 +81326,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79601,6 +81349,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79623,6 +81372,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79645,6 +81395,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79667,6 +81418,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79689,6 +81441,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79711,6 +81464,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79733,6 +81487,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79755,6 +81510,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79777,6 +81533,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79799,6 +81556,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79821,6 +81579,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79843,6 +81602,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79865,6 +81625,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79887,6 +81648,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79909,6 +81671,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79931,6 +81694,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79953,6 +81717,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79975,6 +81740,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -79997,6 +81763,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80019,6 +81786,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80041,6 +81809,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80063,6 +81832,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80085,6 +81855,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80107,6 +81878,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80129,6 +81901,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80151,6 +81924,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80173,6 +81947,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80195,6 +81970,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80217,6 +81993,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80239,6 +82016,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80261,6 +82039,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80283,6 +82062,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80305,6 +82085,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80327,6 +82108,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80349,6 +82131,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80371,6 +82154,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80393,6 +82177,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80415,6 +82200,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80437,6 +82223,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80459,6 +82246,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80481,6 +82269,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80503,6 +82292,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80525,6 +82315,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80547,6 +82338,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80569,6 +82361,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80591,6 +82384,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80613,6 +82407,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80635,6 +82430,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80657,6 +82453,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80679,6 +82476,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80701,6 +82499,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80723,6 +82522,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80745,6 +82545,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80767,6 +82568,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80789,6 +82591,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80811,6 +82614,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80833,6 +82637,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80855,6 +82660,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80877,6 +82683,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80899,6 +82706,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80921,6 +82729,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80943,6 +82752,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80965,6 +82775,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -80987,6 +82798,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81009,6 +82821,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81031,6 +82844,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81053,6 +82867,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81075,6 +82890,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81097,6 +82913,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81119,6 +82936,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81141,6 +82959,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81163,6 +82982,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81185,6 +83005,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81207,6 +83028,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81229,6 +83051,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81251,6 +83074,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81273,6 +83097,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81295,6 +83120,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81317,6 +83143,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81339,6 +83166,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81361,6 +83189,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81383,6 +83212,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81405,6 +83235,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81427,6 +83258,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81449,6 +83281,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81471,6 +83304,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81493,6 +83327,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81515,6 +83350,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81537,6 +83373,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81559,6 +83396,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81581,6 +83419,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81603,6 +83442,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81625,6 +83465,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81647,6 +83488,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81669,6 +83511,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81691,6 +83534,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81713,6 +83557,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81735,6 +83580,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81757,6 +83603,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81779,6 +83626,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81801,6 +83649,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81823,6 +83672,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81845,6 +83695,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81867,6 +83718,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81889,6 +83741,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81911,6 +83764,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81933,6 +83787,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81955,6 +83810,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81977,6 +83833,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -81999,6 +83856,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82021,6 +83879,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82043,6 +83902,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82065,6 +83925,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82087,6 +83948,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82109,6 +83971,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82131,6 +83994,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82153,6 +84017,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82175,6 +84040,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82197,6 +84063,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82219,6 +84086,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82241,6 +84109,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82263,6 +84132,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82285,6 +84155,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82307,6 +84178,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82329,6 +84201,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82351,6 +84224,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82373,6 +84247,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82395,6 +84270,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82417,6 +84293,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82439,6 +84316,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82461,6 +84339,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82483,6 +84362,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82505,6 +84385,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82527,6 +84408,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82549,6 +84431,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82571,6 +84454,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82593,6 +84477,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82615,6 +84500,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82637,6 +84523,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82659,6 +84546,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82681,6 +84569,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82703,6 +84592,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82725,6 +84615,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82747,6 +84638,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82769,6 +84661,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82791,6 +84684,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82813,6 +84707,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82835,6 +84730,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82857,6 +84753,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82879,6 +84776,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82901,6 +84799,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82923,6 +84822,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82945,6 +84845,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82967,6 +84868,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -82989,6 +84891,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83011,6 +84914,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83033,6 +84937,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83055,6 +84960,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83077,6 +84983,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83099,6 +85006,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83121,6 +85029,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83143,6 +85052,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83165,6 +85075,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83187,6 +85098,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83209,6 +85121,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83231,6 +85144,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83253,6 +85167,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83275,6 +85190,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83297,6 +85213,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83319,6 +85236,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83341,6 +85259,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83363,6 +85282,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83385,6 +85305,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83407,6 +85328,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83429,6 +85351,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83451,6 +85374,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83473,6 +85397,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83495,6 +85420,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83517,6 +85443,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83539,6 +85466,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83561,6 +85489,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83583,6 +85512,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83605,6 +85535,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83627,6 +85558,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83649,6 +85581,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83671,6 +85604,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83693,6 +85627,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83715,6 +85650,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83737,6 +85673,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83759,6 +85696,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83781,6 +85719,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83803,6 +85742,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83825,6 +85765,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83847,6 +85788,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83869,6 +85811,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83891,6 +85834,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83913,6 +85857,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83935,6 +85880,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83957,6 +85903,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -83979,6 +85926,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84001,6 +85949,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84023,6 +85972,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84045,6 +85995,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84067,6 +86018,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84089,6 +86041,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84111,6 +86064,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84133,6 +86087,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84155,6 +86110,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84177,6 +86133,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84199,6 +86156,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84221,6 +86179,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84243,6 +86202,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84265,6 +86225,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84287,6 +86248,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84309,6 +86271,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84331,6 +86294,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84353,6 +86317,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84375,6 +86340,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84397,6 +86363,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84419,6 +86386,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84441,6 +86409,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84463,6 +86432,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84485,6 +86455,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84507,6 +86478,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84529,6 +86501,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84551,6 +86524,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84573,6 +86547,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84595,6 +86570,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84617,6 +86593,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84639,6 +86616,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84661,6 +86639,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84683,6 +86662,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84705,6 +86685,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84727,6 +86708,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84749,6 +86731,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84771,6 +86754,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84793,6 +86777,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84815,6 +86800,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84837,6 +86823,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84859,6 +86846,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84881,6 +86869,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84903,6 +86892,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84925,6 +86915,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84947,6 +86938,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84969,6 +86961,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -84991,6 +86984,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85013,6 +87007,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85035,6 +87030,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85057,6 +87053,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85079,6 +87076,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85101,6 +87099,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85123,6 +87122,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85145,6 +87145,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85167,6 +87168,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85189,6 +87191,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85211,6 +87214,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85233,6 +87237,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85255,6 +87260,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85277,6 +87283,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85299,6 +87306,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85321,6 +87329,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85343,6 +87352,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85365,6 +87375,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85387,6 +87398,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85409,6 +87421,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85431,6 +87444,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85453,6 +87467,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85475,6 +87490,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85497,6 +87513,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85519,6 +87536,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85541,6 +87559,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85563,6 +87582,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85585,6 +87605,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85607,6 +87628,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85629,6 +87651,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85651,6 +87674,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85673,6 +87697,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85695,6 +87720,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85717,6 +87743,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85739,6 +87766,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85761,6 +87789,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85783,6 +87812,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85805,6 +87835,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85827,6 +87858,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85849,6 +87881,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85871,6 +87904,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85893,6 +87927,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85915,6 +87950,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85937,6 +87973,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85959,6 +87996,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -85981,6 +88019,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86003,6 +88042,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86025,6 +88065,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86047,6 +88088,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86069,6 +88111,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86091,6 +88134,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86113,6 +88157,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86135,6 +88180,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86157,6 +88203,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86179,6 +88226,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86201,6 +88249,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86223,6 +88272,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86245,6 +88295,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86267,6 +88318,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86289,6 +88341,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86311,6 +88364,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86333,6 +88387,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86355,6 +88410,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86377,6 +88433,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86399,6 +88456,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86421,6 +88479,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86443,6 +88502,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86465,6 +88525,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86487,6 +88548,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86509,6 +88571,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86531,6 +88594,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86553,6 +88617,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86575,6 +88640,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86597,6 +88663,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86619,6 +88686,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86641,6 +88709,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86663,6 +88732,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86685,6 +88755,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86707,6 +88778,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86729,6 +88801,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86751,6 +88824,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86773,6 +88847,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86795,6 +88870,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86817,6 +88893,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86839,6 +88916,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86861,6 +88939,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86883,6 +88962,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86905,6 +88985,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86927,6 +89008,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86949,6 +89031,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86971,6 +89054,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -86993,6 +89077,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87015,6 +89100,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87037,6 +89123,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87059,6 +89146,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87081,6 +89169,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87103,6 +89192,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87125,6 +89215,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87147,6 +89238,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87169,6 +89261,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87191,6 +89284,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87213,6 +89307,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87235,6 +89330,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87257,6 +89353,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87279,6 +89376,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87301,6 +89399,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87323,6 +89422,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87345,6 +89445,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87367,6 +89468,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87389,6 +89491,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87411,6 +89514,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87433,6 +89537,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87455,6 +89560,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87477,6 +89583,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87499,6 +89606,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87521,6 +89629,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87543,6 +89652,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87565,6 +89675,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87587,6 +89698,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87609,6 +89721,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87631,6 +89744,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87653,6 +89767,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87675,6 +89790,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87697,6 +89813,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87719,6 +89836,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87741,6 +89859,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87763,6 +89882,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87785,6 +89905,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87807,6 +89928,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87829,6 +89951,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87851,6 +89974,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87873,6 +89997,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87895,6 +90020,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87917,6 +90043,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87939,6 +90066,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87961,6 +90089,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -87983,6 +90112,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88005,6 +90135,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88027,6 +90158,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88049,6 +90181,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88071,6 +90204,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88093,6 +90227,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88115,6 +90250,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88137,6 +90273,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88159,6 +90296,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88181,6 +90319,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88203,6 +90342,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88225,6 +90365,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88247,6 +90388,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88269,6 +90411,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88291,6 +90434,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88313,6 +90457,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88335,6 +90480,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88357,6 +90503,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88379,6 +90526,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88401,6 +90549,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88423,6 +90572,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88445,6 +90595,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88467,6 +90618,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88489,6 +90641,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88511,6 +90664,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88533,6 +90687,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88555,6 +90710,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88577,6 +90733,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88599,6 +90756,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88621,6 +90779,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88643,6 +90802,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88665,6 +90825,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88687,6 +90848,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88709,6 +90871,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88731,6 +90894,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88753,6 +90917,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88775,6 +90940,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88797,6 +90963,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88819,6 +90986,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88841,6 +91009,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88863,6 +91032,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88885,6 +91055,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88907,6 +91078,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88929,6 +91101,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88951,6 +91124,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88973,6 +91147,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -88995,6 +91170,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89017,6 +91193,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89039,6 +91216,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89061,6 +91239,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89083,6 +91262,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89105,6 +91285,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89127,6 +91308,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89149,6 +91331,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89171,6 +91354,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89193,6 +91377,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89215,6 +91400,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89237,6 +91423,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89259,6 +91446,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89281,6 +91469,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89303,6 +91492,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89325,6 +91515,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89347,6 +91538,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89369,6 +91561,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89391,6 +91584,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89413,6 +91607,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89435,6 +91630,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89457,6 +91653,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89479,6 +91676,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89501,6 +91699,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89523,6 +91722,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89545,6 +91745,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89567,6 +91768,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89589,6 +91791,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89611,6 +91814,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89633,6 +91837,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89655,6 +91860,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89677,6 +91883,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89699,6 +91906,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89721,6 +91929,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89743,6 +91952,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89765,6 +91975,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89787,6 +91998,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89809,6 +92021,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89831,6 +92044,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89853,6 +92067,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89875,6 +92090,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89897,6 +92113,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89919,6 +92136,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89941,6 +92159,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89963,6 +92182,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -89985,6 +92205,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90007,6 +92228,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90029,6 +92251,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90051,6 +92274,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90073,6 +92297,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90095,6 +92320,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90117,6 +92343,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90139,6 +92366,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90161,6 +92389,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90183,6 +92412,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90205,6 +92435,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90227,6 +92458,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90249,6 +92481,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90271,6 +92504,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90293,6 +92527,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90315,6 +92550,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90337,6 +92573,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90359,6 +92596,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90381,6 +92619,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90403,6 +92642,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90425,6 +92665,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90447,6 +92688,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90469,6 +92711,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90491,6 +92734,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90513,6 +92757,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90535,6 +92780,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90557,6 +92803,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90579,6 +92826,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90601,6 +92849,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90623,6 +92872,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90645,6 +92895,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90667,6 +92918,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90689,6 +92941,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90711,6 +92964,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90733,6 +92987,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90755,6 +93010,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90777,6 +93033,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90799,6 +93056,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90821,6 +93079,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90843,6 +93102,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90865,6 +93125,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90887,6 +93148,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90909,6 +93171,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90931,6 +93194,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90953,6 +93217,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90975,6 +93240,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -90997,6 +93263,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91019,6 +93286,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91041,6 +93309,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91063,6 +93332,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91085,6 +93355,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91107,6 +93378,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91129,6 +93401,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91151,6 +93424,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91173,6 +93447,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91195,6 +93470,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91217,6 +93493,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91239,6 +93516,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91261,6 +93539,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91283,6 +93562,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91305,6 +93585,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91327,6 +93608,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91349,6 +93631,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91371,6 +93654,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91393,6 +93677,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91415,6 +93700,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91437,6 +93723,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91459,6 +93746,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91481,6 +93769,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91503,6 +93792,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91525,6 +93815,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91547,6 +93838,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91569,6 +93861,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91591,6 +93884,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91613,6 +93907,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91635,6 +93930,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91657,6 +93953,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91679,6 +93976,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91701,6 +93999,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91723,6 +94022,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91745,6 +94045,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91767,6 +94068,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91789,6 +94091,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91811,6 +94114,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91833,6 +94137,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91855,6 +94160,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91877,6 +94183,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91899,6 +94206,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91921,6 +94229,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91943,6 +94252,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91965,6 +94275,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -91987,6 +94298,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92009,6 +94321,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92031,6 +94344,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92053,6 +94367,7 @@ "language": "c", "name": "api_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92075,6 +94390,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92097,6 +94413,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92119,6 +94436,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92141,6 +94459,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92163,6 +94482,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92185,6 +94505,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92207,6 +94528,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92229,6 +94551,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92251,6 +94574,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92273,6 +94597,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92295,6 +94620,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92317,6 +94643,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92339,6 +94666,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92361,6 +94689,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92383,6 +94712,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92405,6 +94735,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92427,6 +94758,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92449,6 +94781,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92471,6 +94804,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92493,6 +94827,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92515,6 +94850,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92537,6 +94873,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92559,6 +94896,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92581,6 +94919,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92603,6 +94942,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92625,6 +94965,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92647,6 +94988,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92669,6 +95011,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92691,6 +95034,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92713,6 +95057,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92735,6 +95080,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92757,6 +95103,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92779,6 +95126,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92801,6 +95149,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92823,6 +95172,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92845,6 +95195,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92867,6 +95218,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92889,6 +95241,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92911,6 +95264,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92933,6 +95287,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92955,6 +95310,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92977,6 +95333,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -92999,6 +95356,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93021,6 +95379,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93043,6 +95402,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93065,6 +95425,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93087,6 +95448,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93109,6 +95471,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93131,6 +95494,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93153,6 +95517,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93175,6 +95540,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93197,6 +95563,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93219,6 +95586,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93241,6 +95609,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93263,6 +95632,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93285,6 +95655,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93307,6 +95678,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93329,6 +95701,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93351,6 +95724,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93373,6 +95747,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93395,6 +95770,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93417,6 +95793,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93439,6 +95816,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93461,6 +95839,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93483,6 +95862,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93505,6 +95885,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93527,6 +95908,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93549,6 +95931,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93571,6 +95954,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93593,6 +95977,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93615,6 +96000,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93637,6 +96023,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93659,6 +96046,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93681,6 +96069,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93703,6 +96092,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93725,6 +96115,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93747,6 +96138,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93769,6 +96161,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93791,6 +96184,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93813,6 +96207,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93835,6 +96230,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93857,6 +96253,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93879,6 +96276,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93901,6 +96299,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93923,6 +96322,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93945,6 +96345,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93967,6 +96368,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -93989,6 +96391,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94011,6 +96414,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94033,6 +96437,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94055,6 +96460,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94077,6 +96483,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94099,6 +96506,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94121,6 +96529,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94143,6 +96552,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94165,6 +96575,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94187,6 +96598,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94209,6 +96621,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94231,6 +96644,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94253,6 +96667,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94275,6 +96690,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94297,6 +96713,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94319,6 +96736,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94341,6 +96759,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94363,6 +96782,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94385,6 +96805,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94407,6 +96828,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94429,6 +96851,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94451,6 +96874,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94473,6 +96897,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94495,6 +96920,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94517,6 +96943,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94539,6 +96966,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94561,6 +96989,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94583,6 +97012,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94605,6 +97035,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94627,6 +97058,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94649,6 +97081,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94671,6 +97104,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94693,6 +97127,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94715,6 +97150,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94737,6 +97173,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94759,6 +97196,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94781,6 +97219,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94803,6 +97242,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94825,6 +97265,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94847,6 +97288,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94869,6 +97311,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94891,6 +97334,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94913,6 +97357,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94935,6 +97380,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94957,6 +97403,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -94979,6 +97426,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95001,6 +97449,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95023,6 +97472,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95045,6 +97495,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95067,6 +97518,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95089,6 +97541,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95111,6 +97564,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95133,6 +97587,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95155,6 +97610,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95177,6 +97633,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95199,6 +97656,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95221,6 +97679,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95243,6 +97702,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95265,6 +97725,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95287,6 +97748,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95309,6 +97771,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95331,6 +97794,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95353,6 +97817,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95375,6 +97840,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95397,6 +97863,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95419,6 +97886,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95441,6 +97909,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95463,6 +97932,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95485,6 +97955,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95507,6 +97978,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95529,6 +98001,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95551,6 +98024,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95573,6 +98047,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95595,6 +98070,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95617,6 +98093,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95639,6 +98116,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95661,6 +98139,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95683,6 +98162,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95705,6 +98185,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95727,6 +98208,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95749,6 +98231,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95771,6 +98254,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95793,6 +98277,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95815,6 +98300,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95837,6 +98323,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95859,6 +98346,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95881,6 +98369,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95903,6 +98392,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95925,6 +98415,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95947,6 +98438,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95969,6 +98461,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -95991,6 +98484,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96013,6 +98507,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96035,6 +98530,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96057,6 +98553,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96079,6 +98576,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96101,6 +98599,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96123,6 +98622,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96145,6 +98645,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96167,6 +98668,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96189,6 +98691,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96211,6 +98714,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96233,6 +98737,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96255,6 +98760,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96277,6 +98783,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96299,6 +98806,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96321,6 +98829,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96343,6 +98852,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96365,6 +98875,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96387,6 +98898,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96409,6 +98921,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96431,6 +98944,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96453,6 +98967,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96475,6 +98990,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96497,6 +99013,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96519,6 +99036,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96541,6 +99059,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96563,6 +99082,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96585,6 +99105,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96607,6 +99128,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96629,6 +99151,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96651,6 +99174,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96673,6 +99197,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96695,6 +99220,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96717,6 +99243,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96739,6 +99266,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96761,6 +99289,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96783,6 +99312,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96805,6 +99335,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96827,6 +99358,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96849,6 +99381,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96871,6 +99404,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96893,6 +99427,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96915,6 +99450,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96937,6 +99473,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96959,6 +99496,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -96981,6 +99519,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97003,6 +99542,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97025,6 +99565,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97047,6 +99588,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97069,6 +99611,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97091,6 +99634,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97113,6 +99657,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97135,6 +99680,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97157,6 +99703,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97179,6 +99726,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97201,6 +99749,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97223,6 +99772,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97245,6 +99795,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97267,6 +99818,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97289,6 +99841,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97311,6 +99864,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97333,6 +99887,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97355,6 +99910,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97377,6 +99933,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97399,6 +99956,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97421,6 +99979,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97443,6 +100002,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97465,6 +100025,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97487,6 +100048,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97509,6 +100071,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97531,6 +100094,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97553,6 +100117,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97575,6 +100140,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97597,6 +100163,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97619,6 +100186,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97641,6 +100209,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97663,6 +100232,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97685,6 +100255,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97707,6 +100278,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97729,6 +100301,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97751,6 +100324,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97773,6 +100347,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97795,6 +100370,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97817,6 +100393,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97839,6 +100416,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97861,6 +100439,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97883,6 +100462,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97905,6 +100485,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97927,6 +100508,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97949,6 +100531,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97971,6 +100554,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -97993,6 +100577,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98015,6 +100600,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98037,6 +100623,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98059,6 +100646,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98081,6 +100669,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98103,6 +100692,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98125,6 +100715,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98147,6 +100738,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98169,6 +100761,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98191,6 +100784,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98213,6 +100807,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98235,6 +100830,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98257,6 +100853,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98279,6 +100876,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98301,6 +100899,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98323,6 +100922,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98345,6 +100945,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98367,6 +100968,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98389,6 +100991,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98411,6 +101014,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98433,6 +101037,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98455,6 +101060,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98477,6 +101083,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98499,6 +101106,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98521,6 +101129,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98543,6 +101152,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98565,6 +101175,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98587,6 +101198,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98609,6 +101221,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98631,6 +101244,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98653,6 +101267,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98675,6 +101290,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98697,6 +101313,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98719,6 +101336,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98741,6 +101359,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98763,6 +101382,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98785,6 +101405,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98807,6 +101428,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98829,6 +101451,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98851,6 +101474,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98873,6 +101497,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98895,6 +101520,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98917,6 +101543,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98939,6 +101566,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98961,6 +101589,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -98983,6 +101612,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99005,6 +101635,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99027,6 +101658,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99049,6 +101681,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99071,6 +101704,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99093,6 +101727,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99115,6 +101750,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99137,6 +101773,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99159,6 +101796,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99181,6 +101819,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99203,6 +101842,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99225,6 +101865,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99247,6 +101888,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99269,6 +101911,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99291,6 +101934,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99313,6 +101957,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99335,6 +101980,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99357,6 +102003,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99379,6 +102026,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99401,6 +102049,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99423,6 +102072,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99445,6 +102095,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99467,6 +102118,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99489,6 +102141,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99511,6 +102164,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99533,6 +102187,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99555,6 +102210,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99577,6 +102233,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99599,6 +102256,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99621,6 +102279,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99643,6 +102302,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99665,6 +102325,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99687,6 +102348,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99709,6 +102371,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99731,6 +102394,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99753,6 +102417,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99775,6 +102440,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99797,6 +102463,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99819,6 +102486,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99841,6 +102509,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99863,6 +102532,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99885,6 +102555,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99907,6 +102578,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99929,6 +102601,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99951,6 +102624,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99973,6 +102647,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -99995,6 +102670,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100017,6 +102693,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100039,6 +102716,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100061,6 +102739,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100083,6 +102762,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100105,6 +102785,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100127,6 +102808,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100149,6 +102831,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100171,6 +102854,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100193,6 +102877,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100215,6 +102900,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100237,6 +102923,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100259,6 +102946,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100281,6 +102969,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100303,6 +102992,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100325,6 +103015,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100347,6 +103038,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100369,6 +103061,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100391,6 +103084,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100413,6 +103107,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100435,6 +103130,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100457,6 +103153,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100479,6 +103176,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100501,6 +103199,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100523,6 +103222,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100545,6 +103245,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100567,6 +103268,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100589,6 +103291,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100611,6 +103314,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100633,6 +103337,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100655,6 +103360,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100677,6 +103383,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100699,6 +103406,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100721,6 +103429,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100743,6 +103452,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100765,6 +103475,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100787,6 +103498,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100809,6 +103521,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100831,6 +103544,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100853,6 +103567,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100875,6 +103590,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100897,6 +103613,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100919,6 +103636,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100941,6 +103659,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100963,6 +103682,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -100985,6 +103705,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101007,6 +103728,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101029,6 +103751,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101051,6 +103774,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101073,6 +103797,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101095,6 +103820,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101117,6 +103843,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101139,6 +103866,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101161,6 +103889,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101183,6 +103912,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101205,6 +103935,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101227,6 +103958,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101249,6 +103981,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101271,6 +104004,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101293,6 +104027,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101315,6 +104050,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101337,6 +104073,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101359,6 +104096,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101381,6 +104119,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101403,6 +104142,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101425,6 +104165,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101447,6 +104188,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101469,6 +104211,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101491,6 +104234,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101513,6 +104257,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101535,6 +104280,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101557,6 +104303,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101579,6 +104326,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101601,6 +104349,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101623,6 +104372,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101645,6 +104395,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101667,6 +104418,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101689,6 +104441,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101711,6 +104464,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101733,6 +104487,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101755,6 +104510,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101777,6 +104533,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101799,6 +104556,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101821,6 +104579,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101843,6 +104602,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101865,6 +104625,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101887,6 +104648,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101909,6 +104671,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101931,6 +104694,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101953,6 +104717,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101975,6 +104740,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -101997,6 +104763,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102019,6 +104786,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102041,6 +104809,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102063,6 +104832,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102085,6 +104855,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102107,6 +104878,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102129,6 +104901,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102151,6 +104924,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102173,6 +104947,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102195,6 +104970,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102217,6 +104993,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102239,6 +105016,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102261,6 +105039,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102283,6 +105062,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102305,6 +105085,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102327,6 +105108,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102349,6 +105131,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102371,6 +105154,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102393,6 +105177,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102415,6 +105200,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102437,6 +105223,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102459,6 +105246,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102481,6 +105269,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102503,6 +105292,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102525,6 +105315,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102547,6 +105338,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102569,6 +105361,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102591,6 +105384,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102613,6 +105407,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102635,6 +105430,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102657,6 +105453,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102679,6 +105476,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102701,6 +105499,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102723,6 +105522,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102745,6 +105545,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102767,6 +105568,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102789,6 +105591,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102811,6 +105614,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102833,6 +105637,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102855,6 +105660,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102877,6 +105683,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102899,6 +105706,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102921,6 +105729,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102943,6 +105752,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102965,6 +105775,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -102987,6 +105798,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103009,6 +105821,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103031,6 +105844,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103053,6 +105867,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103075,6 +105890,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103097,6 +105913,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103119,6 +105936,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103141,6 +105959,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103163,6 +105982,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103185,6 +106005,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103207,6 +106028,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103229,6 +106051,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103251,6 +106074,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103273,6 +106097,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103295,6 +106120,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103317,6 +106143,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103339,6 +106166,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103361,6 +106189,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103383,6 +106212,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103405,6 +106235,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103427,6 +106258,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103449,6 +106281,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103471,6 +106304,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103493,6 +106327,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103515,6 +106350,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103537,6 +106373,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103559,6 +106396,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103581,6 +106419,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103603,6 +106442,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103625,6 +106465,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103647,6 +106488,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103669,6 +106511,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103691,6 +106534,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103713,6 +106557,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103735,6 +106580,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103757,6 +106603,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103779,6 +106626,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103801,6 +106649,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103823,6 +106672,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103845,6 +106695,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103867,6 +106718,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103889,6 +106741,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103911,6 +106764,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103933,6 +106787,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103955,6 +106810,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103977,6 +106833,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -103999,6 +106856,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104021,6 +106879,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104043,6 +106902,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104065,6 +106925,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104087,6 +106948,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104109,6 +106971,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104131,6 +106994,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104153,6 +107017,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104175,6 +107040,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104197,6 +107063,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104219,6 +107086,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104241,6 +107109,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104263,6 +107132,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104285,6 +107155,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104307,6 +107178,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104329,6 +107201,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104351,6 +107224,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104373,6 +107247,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104395,6 +107270,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104417,6 +107293,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104439,6 +107316,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104461,6 +107339,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104483,6 +107362,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104505,6 +107385,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104527,6 +107408,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104549,6 +107431,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104571,6 +107454,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104593,6 +107477,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104615,6 +107500,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104637,6 +107523,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104659,6 +107546,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104681,6 +107569,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104703,6 +107592,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104725,6 +107615,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104747,6 +107638,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104769,6 +107661,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104791,6 +107684,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104813,6 +107707,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104835,6 +107730,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104857,6 +107753,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104879,6 +107776,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104901,6 +107799,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104923,6 +107822,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104945,6 +107845,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104967,6 +107868,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -104989,6 +107891,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105011,6 +107914,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105033,6 +107937,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105055,6 +107960,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105077,6 +107983,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105099,6 +108006,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105121,6 +108029,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105143,6 +108052,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105165,6 +108075,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105187,6 +108098,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105209,6 +108121,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105231,6 +108144,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105253,6 +108167,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105275,6 +108190,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105297,6 +108213,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105319,6 +108236,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105341,6 +108259,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105363,6 +108282,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105385,6 +108305,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105407,6 +108328,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105429,6 +108351,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105451,6 +108374,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105473,6 +108397,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105495,6 +108420,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105517,6 +108443,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105539,6 +108466,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105561,6 +108489,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105583,6 +108512,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105605,6 +108535,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105627,6 +108558,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105649,6 +108581,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105671,6 +108604,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105693,6 +108627,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105715,6 +108650,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105737,6 +108673,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105759,6 +108696,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105781,6 +108719,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105803,6 +108742,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105825,6 +108765,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105847,6 +108788,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105869,6 +108811,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105891,6 +108834,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105913,6 +108857,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105935,6 +108880,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105957,6 +108903,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -105979,6 +108926,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106001,6 +108949,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106023,6 +108972,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106045,6 +108995,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106067,6 +109018,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106089,6 +109041,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106111,6 +109064,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106133,6 +109087,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106155,6 +109110,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106177,6 +109133,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106199,6 +109156,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106221,6 +109179,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106243,6 +109202,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106265,6 +109225,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106287,6 +109248,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106309,6 +109271,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106331,6 +109294,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106353,6 +109317,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106375,6 +109340,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106397,6 +109363,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106419,6 +109386,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106441,6 +109409,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106463,6 +109432,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106485,6 +109455,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106507,6 +109478,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106529,6 +109501,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106551,6 +109524,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106573,6 +109547,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106595,6 +109570,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106617,6 +109593,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106639,6 +109616,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106661,6 +109639,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106683,6 +109662,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106705,6 +109685,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106727,6 +109708,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106749,6 +109731,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106771,6 +109754,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106793,6 +109777,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106815,6 +109800,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106837,6 +109823,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106859,6 +109846,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106881,6 +109869,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106903,6 +109892,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106925,6 +109915,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106947,6 +109938,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106969,6 +109961,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -106991,6 +109984,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107013,6 +110007,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107035,6 +110030,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107057,6 +110053,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107079,6 +110076,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107101,6 +110099,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107123,6 +110122,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107145,6 +110145,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107167,6 +110168,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107189,6 +110191,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107211,6 +110214,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107233,6 +110237,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107255,6 +110260,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107277,6 +110283,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107299,6 +110306,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107321,6 +110329,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107343,6 +110352,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107365,6 +110375,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107387,6 +110398,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107409,6 +110421,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107431,6 +110444,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107453,6 +110467,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107475,6 +110490,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107497,6 +110513,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107519,6 +110536,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107541,6 +110559,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107563,6 +110582,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107585,6 +110605,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107607,6 +110628,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107629,6 +110651,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107651,6 +110674,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107673,6 +110697,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107695,6 +110720,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107717,6 +110743,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107739,6 +110766,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107761,6 +110789,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107783,6 +110812,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107805,6 +110835,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107827,6 +110858,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107849,6 +110881,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107871,6 +110904,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107893,6 +110927,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107915,6 +110950,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107937,6 +110973,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107959,6 +110996,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -107981,6 +111019,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108003,6 +111042,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108025,6 +111065,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108047,6 +111088,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108069,6 +111111,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108091,6 +111134,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108113,6 +111157,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108135,6 +111180,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108157,6 +111203,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108179,6 +111226,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108201,6 +111249,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108223,6 +111272,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108245,6 +111295,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108267,6 +111318,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108289,6 +111341,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108311,6 +111364,7 @@ "language": "c", "name": "client_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108333,6 +111387,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108355,6 +111410,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108377,6 +111433,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108399,6 +111456,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108421,6 +111479,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108443,6 +111502,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108465,6 +111525,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108487,6 +111548,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108509,6 +111571,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108531,6 +111594,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108553,6 +111617,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108575,6 +111640,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108597,6 +111663,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108619,6 +111686,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108641,6 +111709,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108663,6 +111732,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108685,6 +111755,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108707,6 +111778,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108729,6 +111801,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108751,6 +111824,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108773,6 +111847,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108795,6 +111870,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108817,6 +111893,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108839,6 +111916,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108861,6 +111939,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108883,6 +111962,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108905,6 +111985,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108927,6 +112008,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108949,6 +112031,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108971,6 +112054,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -108993,6 +112077,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109015,6 +112100,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109037,6 +112123,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109059,6 +112146,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109081,6 +112169,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109103,6 +112192,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109125,6 +112215,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109147,6 +112238,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109169,6 +112261,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109191,6 +112284,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109213,6 +112307,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109235,6 +112330,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109257,6 +112353,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109279,6 +112376,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109301,6 +112399,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109323,6 +112422,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109345,6 +112445,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109367,6 +112468,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109389,6 +112491,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109411,6 +112514,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109433,6 +112537,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109455,6 +112560,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109477,6 +112583,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109499,6 +112606,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109521,6 +112629,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109543,6 +112652,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109565,6 +112675,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109587,6 +112698,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109609,6 +112721,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109631,6 +112744,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109653,6 +112767,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109675,6 +112790,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109697,6 +112813,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109719,6 +112836,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109741,6 +112859,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109763,6 +112882,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109785,6 +112905,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109807,6 +112928,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109829,6 +112951,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109851,6 +112974,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109873,6 +112997,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109895,6 +113020,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109917,6 +113043,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109939,6 +113066,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109961,6 +113089,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -109983,6 +113112,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110005,6 +113135,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110027,6 +113158,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110049,6 +113181,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110071,6 +113204,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110093,6 +113227,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110115,6 +113250,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110137,6 +113273,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110159,6 +113296,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110181,6 +113319,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110203,6 +113342,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110225,6 +113365,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110247,6 +113388,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110269,6 +113411,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110291,6 +113434,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110313,6 +113457,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110335,6 +113480,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110357,6 +113503,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110379,6 +113526,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110401,6 +113549,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110423,6 +113572,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110445,6 +113595,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110467,6 +113618,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110489,6 +113641,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110511,6 +113664,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110533,6 +113687,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110555,6 +113710,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110577,6 +113733,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110599,6 +113756,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110621,6 +113779,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110643,6 +113802,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110665,6 +113825,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110687,6 +113848,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110709,6 +113871,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110731,6 +113894,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110753,6 +113917,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110775,6 +113940,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110797,6 +113963,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110819,6 +113986,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110841,6 +114009,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110863,6 +114032,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110885,6 +114055,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110907,6 +114078,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110929,6 +114101,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110951,6 +114124,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110973,6 +114147,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -110995,6 +114170,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111017,6 +114193,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111039,6 +114216,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111061,6 +114239,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111083,6 +114262,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111105,6 +114285,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111127,6 +114308,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111149,6 +114331,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111171,6 +114354,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111193,6 +114377,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111215,6 +114400,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111237,6 +114423,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111259,6 +114446,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111281,6 +114469,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111303,6 +114492,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111325,6 +114515,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111347,6 +114538,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111369,6 +114561,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111391,6 +114584,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111413,6 +114607,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111435,6 +114630,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111457,6 +114653,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111479,6 +114676,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111501,6 +114699,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111523,6 +114722,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111545,6 +114745,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111567,6 +114768,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111589,6 +114791,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111611,6 +114814,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111633,6 +114837,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111655,6 +114860,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111677,6 +114883,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111699,6 +114906,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111721,6 +114929,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111743,6 +114952,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111765,6 +114975,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111787,6 +114998,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111809,6 +115021,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111831,6 +115044,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111853,6 +115067,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111875,6 +115090,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111897,6 +115113,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111919,6 +115136,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111941,6 +115159,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111963,6 +115182,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -111985,6 +115205,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112007,6 +115228,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112029,6 +115251,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112051,6 +115274,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112073,6 +115297,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112095,6 +115320,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112117,6 +115343,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112139,6 +115366,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112161,6 +115389,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112183,6 +115412,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112205,6 +115435,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112227,6 +115458,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112249,6 +115481,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112271,6 +115504,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112293,6 +115527,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112315,6 +115550,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112337,6 +115573,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112359,6 +115596,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112381,6 +115619,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112403,6 +115642,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112425,6 +115665,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112447,6 +115688,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112469,6 +115711,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112491,6 +115734,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112513,6 +115757,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112535,6 +115780,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112557,6 +115803,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112579,6 +115826,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112601,6 +115849,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112623,6 +115872,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112645,6 +115895,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112667,6 +115918,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112689,6 +115941,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112711,6 +115964,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112733,6 +115987,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112755,6 +116010,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112777,6 +116033,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112799,6 +116056,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112821,6 +116079,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112843,6 +116102,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112865,6 +116125,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112887,6 +116148,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112909,6 +116171,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112931,6 +116194,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112953,6 +116217,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112975,6 +116240,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -112997,6 +116263,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113019,6 +116286,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113041,6 +116309,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113063,6 +116332,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113085,6 +116355,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113107,6 +116378,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113129,6 +116401,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113151,6 +116424,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113173,6 +116447,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113195,6 +116470,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113217,6 +116493,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113239,6 +116516,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113261,6 +116539,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113283,6 +116562,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113305,6 +116585,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113327,6 +116608,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113349,6 +116631,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113371,6 +116654,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113393,6 +116677,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113415,6 +116700,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113437,6 +116723,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113459,6 +116746,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113481,6 +116769,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113503,6 +116792,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113525,6 +116815,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113547,6 +116838,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113569,6 +116861,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113591,6 +116884,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113613,6 +116907,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113635,6 +116930,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113657,6 +116953,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113679,6 +116976,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113701,6 +116999,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113723,6 +117022,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113745,6 +117045,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113767,6 +117068,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113789,6 +117091,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113811,6 +117114,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113833,6 +117137,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113855,6 +117160,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113877,6 +117183,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113899,6 +117206,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113921,6 +117229,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113943,6 +117252,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113965,6 +117275,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -113987,6 +117298,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114009,6 +117321,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114031,6 +117344,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114053,6 +117367,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114075,6 +117390,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114097,6 +117413,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114119,6 +117436,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114141,6 +117459,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114163,6 +117482,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114185,6 +117505,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114207,6 +117528,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114229,6 +117551,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114251,6 +117574,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114273,6 +117597,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114295,6 +117620,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114317,6 +117643,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114339,6 +117666,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114361,6 +117689,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114383,6 +117712,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114405,6 +117735,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114427,6 +117758,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114449,6 +117781,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114471,6 +117804,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114493,6 +117827,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114515,6 +117850,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114537,6 +117873,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114559,6 +117896,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114581,6 +117919,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114603,6 +117942,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114625,6 +117965,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114647,6 +117988,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114669,6 +118011,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114691,6 +118034,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114713,6 +118057,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114735,6 +118080,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114757,6 +118103,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114779,6 +118126,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114801,6 +118149,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114823,6 +118172,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114845,6 +118195,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114867,6 +118218,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114889,6 +118241,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114911,6 +118264,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114933,6 +118287,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114955,6 +118310,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114977,6 +118333,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -114999,6 +118356,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115021,6 +118379,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115043,6 +118402,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115065,6 +118425,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115087,6 +118448,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115109,6 +118471,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115131,6 +118494,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115153,6 +118517,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115175,6 +118540,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115197,6 +118563,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115219,6 +118586,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115241,6 +118609,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115263,6 +118632,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115285,6 +118655,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115307,6 +118678,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115329,6 +118701,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115351,6 +118724,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115373,6 +118747,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115395,6 +118770,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115417,6 +118793,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115439,6 +118816,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115461,6 +118839,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115483,6 +118862,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115505,6 +118885,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115527,6 +118908,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115549,6 +118931,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115571,6 +118954,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115593,6 +118977,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115615,6 +119000,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115637,6 +119023,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115659,6 +119046,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115681,6 +119069,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115703,6 +119092,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115725,6 +119115,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115747,6 +119138,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115769,6 +119161,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115791,6 +119184,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115813,6 +119207,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115835,6 +119230,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115857,6 +119253,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115879,6 +119276,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115901,6 +119299,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115923,6 +119322,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115945,6 +119345,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115967,6 +119368,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -115989,6 +119391,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116011,6 +119414,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116033,6 +119437,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116055,6 +119460,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116077,6 +119483,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116099,6 +119506,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116121,6 +119529,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116143,6 +119552,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116165,6 +119575,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116187,6 +119598,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116209,6 +119621,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116231,6 +119644,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116253,6 +119667,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116275,6 +119690,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116297,6 +119713,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116319,6 +119736,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116341,6 +119759,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116363,6 +119782,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116385,6 +119805,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116407,6 +119828,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116429,6 +119851,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116451,6 +119874,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116473,6 +119897,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116495,6 +119920,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116517,6 +119943,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116539,6 +119966,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116561,6 +119989,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116583,6 +120012,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116605,6 +120035,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116627,6 +120058,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116649,6 +120081,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116671,6 +120104,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116693,6 +120127,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116715,6 +120150,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116737,6 +120173,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116759,6 +120196,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116781,6 +120219,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116803,6 +120242,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116825,6 +120265,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116847,6 +120288,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116869,6 +120311,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116891,6 +120334,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116913,6 +120357,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116935,6 +120380,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116957,6 +120403,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -116979,6 +120426,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117001,6 +120449,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117023,6 +120472,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117045,6 +120495,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117067,6 +120518,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117089,6 +120541,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117111,6 +120564,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117133,6 +120587,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117155,6 +120610,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117177,6 +120633,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117199,6 +120656,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117221,6 +120679,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117243,6 +120702,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117265,6 +120725,7 @@ "language": "c", "name": "http_request_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117287,6 +120748,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117309,6 +120771,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117331,6 +120794,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117353,6 +120817,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117375,6 +120840,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117397,6 +120863,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117419,6 +120886,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117441,6 +120909,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117463,6 +120932,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117485,6 +120955,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117507,6 +120978,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117529,6 +121001,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117551,6 +121024,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117573,6 +121047,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117595,6 +121070,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117617,6 +121093,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117639,6 +121116,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117661,6 +121139,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117683,6 +121162,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117705,6 +121185,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117727,6 +121208,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117749,6 +121231,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117771,6 +121254,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117793,6 +121277,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117815,6 +121300,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117837,6 +121323,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117859,6 +121346,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117881,6 +121369,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117903,6 +121392,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117925,6 +121415,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117947,6 +121438,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117969,6 +121461,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -117991,6 +121484,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118013,6 +121507,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118035,6 +121530,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118057,6 +121553,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118079,6 +121576,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118101,6 +121599,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118123,6 +121622,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118145,6 +121645,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118167,6 +121668,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118189,6 +121691,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118211,6 +121714,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118233,6 +121737,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118255,6 +121760,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118277,6 +121783,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118299,6 +121806,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118321,6 +121829,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118343,6 +121852,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118365,6 +121875,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118387,6 +121898,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118409,6 +121921,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118431,6 +121944,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118453,6 +121967,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118475,6 +121990,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118497,6 +122013,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118519,6 +122036,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118541,6 +122059,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118563,6 +122082,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118585,6 +122105,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118607,6 +122128,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118629,6 +122151,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118651,6 +122174,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118673,6 +122197,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118695,6 +122220,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118717,6 +122243,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118739,6 +122266,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118761,6 +122289,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118783,6 +122312,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118805,6 +122335,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118827,6 +122358,7 @@ "language": "c", "name": "http_response_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118849,6 +122381,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118871,6 +122404,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118893,6 +122427,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118915,6 +122450,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118937,6 +122473,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118959,6 +122496,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -118981,6 +122519,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119003,6 +122542,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119025,6 +122565,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119047,6 +122588,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119069,6 +122611,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119091,6 +122634,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119113,6 +122657,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119135,6 +122680,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119157,6 +122703,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119179,6 +122726,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119201,6 +122749,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119223,6 +122772,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119245,6 +122795,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119267,6 +122818,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119289,6 +122841,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119311,6 +122864,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119333,6 +122887,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119355,6 +122910,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119377,6 +122933,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119399,6 +122956,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119421,6 +122979,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119443,6 +123002,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119465,6 +123025,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119487,6 +123048,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119509,6 +123071,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119531,6 +123094,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119553,6 +123117,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119575,6 +123140,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119597,6 +123163,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119619,6 +123186,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119641,6 +123209,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119663,6 +123232,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119685,6 +123255,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119707,6 +123278,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119729,6 +123301,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119751,6 +123324,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119773,6 +123347,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119795,6 +123370,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119817,6 +123393,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119839,6 +123416,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119861,6 +123439,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119883,6 +123462,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119905,6 +123485,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119927,6 +123508,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119949,6 +123531,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119971,6 +123554,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -119993,6 +123577,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120015,6 +123600,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120037,6 +123623,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120059,6 +123646,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120081,6 +123669,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120103,6 +123692,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120125,6 +123715,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120147,6 +123738,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120169,6 +123761,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120191,6 +123784,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120213,6 +123807,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120235,6 +123830,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120257,6 +123853,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120279,6 +123876,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120301,6 +123899,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120323,6 +123922,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120345,6 +123945,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120367,6 +123968,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120389,6 +123991,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120411,6 +124014,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120433,6 +124037,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120455,6 +124060,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120477,6 +124083,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120499,6 +124106,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120521,6 +124129,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120543,6 +124152,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120565,6 +124175,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120587,6 +124198,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120609,6 +124221,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120631,6 +124244,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120653,6 +124267,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120675,6 +124290,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120697,6 +124313,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120719,6 +124336,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120741,6 +124359,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120763,6 +124382,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120785,6 +124405,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120807,6 +124428,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120829,6 +124451,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120851,6 +124474,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120873,6 +124497,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120895,6 +124520,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120917,6 +124543,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120939,6 +124566,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120961,6 +124589,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -120983,6 +124612,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121005,6 +124635,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121027,6 +124658,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121049,6 +124681,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121071,6 +124704,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121093,6 +124727,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121115,6 +124750,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121137,6 +124773,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121159,6 +124796,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121181,6 +124819,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121203,6 +124842,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121225,6 +124865,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121247,6 +124888,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121269,6 +124911,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121291,6 +124934,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121313,6 +124957,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121335,6 +124980,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121357,6 +125003,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121379,6 +125026,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121401,6 +125049,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121423,6 +125072,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121445,6 +125095,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121467,6 +125118,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121489,6 +125141,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121511,6 +125164,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121533,6 +125187,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121555,6 +125210,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121577,6 +125233,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121599,6 +125256,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121621,6 +125279,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121643,6 +125302,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121665,6 +125325,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121687,6 +125348,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121709,6 +125371,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121731,6 +125394,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121753,6 +125417,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121775,6 +125440,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121797,6 +125463,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121819,6 +125486,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121841,6 +125509,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121863,6 +125532,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121885,6 +125555,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121907,6 +125578,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121929,6 +125601,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121951,6 +125624,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121973,6 +125647,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -121995,6 +125670,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122017,6 +125693,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122039,6 +125716,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122061,6 +125739,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122083,6 +125762,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122105,6 +125785,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122127,6 +125808,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122149,6 +125831,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122171,6 +125854,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122193,6 +125877,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122215,6 +125900,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122237,6 +125923,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122259,6 +125946,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122281,6 +125969,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122303,6 +125992,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122325,6 +126015,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122347,6 +126038,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122369,6 +126061,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122391,6 +126084,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122413,6 +126107,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122435,6 +126130,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122457,6 +126153,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122479,6 +126176,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122501,6 +126199,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122523,6 +126222,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122545,6 +126245,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122567,6 +126268,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122589,6 +126291,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122611,6 +126314,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122633,6 +126337,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122655,6 +126360,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122677,6 +126383,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122699,6 +126406,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122721,6 +126429,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122743,6 +126452,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122765,6 +126475,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122787,6 +126498,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122809,6 +126521,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122831,6 +126544,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122853,6 +126567,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122875,6 +126590,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122897,6 +126613,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122919,6 +126636,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122941,6 +126659,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122963,6 +126682,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -122985,6 +126705,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123007,6 +126728,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123029,6 +126751,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123051,6 +126774,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123073,6 +126797,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123095,6 +126820,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123117,6 +126843,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123139,6 +126866,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123161,6 +126889,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123183,6 +126912,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123205,6 +126935,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123227,6 +126958,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123249,6 +126981,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123271,6 +127004,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123293,6 +127027,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123315,6 +127050,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123337,6 +127073,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123359,6 +127096,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123381,6 +127119,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123403,6 +127142,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123425,6 +127165,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123447,6 +127188,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123469,6 +127211,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123491,6 +127234,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123513,6 +127257,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123535,6 +127280,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123557,6 +127303,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123579,6 +127326,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123601,6 +127349,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123623,6 +127372,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123645,6 +127395,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123667,6 +127418,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123689,6 +127441,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123711,6 +127464,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123733,6 +127487,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123755,6 +127510,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123777,6 +127533,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123799,6 +127556,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123821,6 +127579,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123843,6 +127602,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123865,6 +127625,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123887,6 +127648,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123909,6 +127671,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123931,6 +127694,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123953,6 +127717,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123975,6 +127740,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -123997,6 +127763,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124019,6 +127786,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124041,6 +127809,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124063,6 +127832,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124085,6 +127855,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124107,6 +127878,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124129,6 +127901,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124151,6 +127924,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124173,6 +127947,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124195,6 +127970,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124217,6 +127993,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124239,6 +128016,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124261,6 +128039,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124283,6 +128062,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124305,6 +128085,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124327,6 +128108,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124349,6 +128131,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124371,6 +128154,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124393,6 +128177,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124415,6 +128200,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124437,6 +128223,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124459,6 +128246,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124481,6 +128269,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124503,6 +128292,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124525,6 +128315,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124547,6 +128338,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124569,6 +128361,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124591,6 +128384,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124613,6 +128407,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124635,6 +128430,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124657,6 +128453,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124679,6 +128476,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124701,6 +128499,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124723,6 +128522,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124745,6 +128545,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124767,6 +128568,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124789,6 +128591,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124811,6 +128614,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124833,6 +128637,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124855,6 +128660,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124877,6 +128683,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124899,6 +128706,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124921,6 +128729,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124943,6 +128752,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124965,6 +128775,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -124987,6 +128798,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125009,6 +128821,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125031,6 +128844,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125053,6 +128867,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125075,6 +128890,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125097,6 +128913,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125119,6 +128936,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125141,6 +128959,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125163,6 +128982,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125185,6 +129005,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125207,6 +129028,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125229,6 +129051,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125251,6 +129074,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125273,6 +129097,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125295,6 +129120,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125317,6 +129143,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125339,6 +129166,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125361,6 +129189,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125383,6 +129212,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125405,6 +129235,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125427,6 +129258,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125449,6 +129281,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125471,6 +129304,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125493,6 +129327,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125515,6 +129350,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125537,6 +129373,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125559,6 +129396,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125581,6 +129419,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125603,6 +129442,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125625,6 +129465,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125647,6 +129488,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125669,6 +129511,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125691,6 +129534,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125713,6 +129557,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125735,6 +129580,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125757,6 +129603,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125779,6 +129626,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125801,6 +129649,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125823,6 +129672,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125845,6 +129695,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125867,6 +129718,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125889,6 +129741,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125911,6 +129764,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125933,6 +129787,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125955,6 +129810,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125977,6 +129833,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -125999,6 +129856,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126021,6 +129879,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126043,6 +129902,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126065,6 +129925,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126087,6 +129948,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126109,6 +129971,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126131,6 +129994,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126153,6 +130017,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126175,6 +130040,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126197,6 +130063,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126219,6 +130086,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126241,6 +130109,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126263,6 +130132,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126285,6 +130155,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126307,6 +130178,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126329,6 +130201,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126351,6 +130224,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126373,6 +130247,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126395,6 +130270,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126417,6 +130293,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126439,6 +130316,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126461,6 +130339,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126483,6 +130362,7 @@ "language": "c", "name": "json_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126505,6 +130385,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126527,6 +130408,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126549,6 +130431,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126571,6 +130454,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126593,6 +130477,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126615,6 +130500,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126637,6 +130523,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126659,6 +130546,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126681,6 +130569,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126703,6 +130592,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126725,6 +130615,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126747,6 +130638,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126769,6 +130661,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126791,6 +130684,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126813,6 +130707,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126835,6 +130730,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126857,6 +130753,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126879,6 +130776,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126901,6 +130799,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126923,6 +130822,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126945,6 +130845,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126967,6 +130868,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -126989,6 +130891,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127011,6 +130914,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127033,6 +130937,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127055,6 +130960,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127077,6 +130983,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127099,6 +131006,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127121,6 +131029,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127143,6 +131052,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127165,6 +131075,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127187,6 +131098,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127209,6 +131121,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127231,6 +131144,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127253,6 +131167,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127275,6 +131190,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127297,6 +131213,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127319,6 +131236,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127341,6 +131259,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127363,6 +131282,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127385,6 +131305,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127407,6 +131328,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127429,6 +131351,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127451,6 +131374,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127473,6 +131397,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127495,6 +131420,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127517,6 +131443,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127539,6 +131466,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127561,6 +131489,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127583,6 +131512,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127605,6 +131535,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127627,6 +131558,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127649,6 +131581,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127671,6 +131604,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127693,6 +131627,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127715,6 +131650,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127737,6 +131673,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127759,6 +131696,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127781,6 +131719,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127803,6 +131742,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127825,6 +131765,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127847,6 +131788,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127869,6 +131811,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127891,6 +131834,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127913,6 +131857,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127935,6 +131880,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127957,6 +131903,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -127979,6 +131926,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128001,6 +131949,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128023,6 +131972,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128045,6 +131995,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128067,6 +132018,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128089,6 +132041,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128111,6 +132064,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128133,6 +132087,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128155,6 +132110,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128177,6 +132133,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128199,6 +132156,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128221,6 +132179,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128243,6 +132202,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128265,6 +132225,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128287,6 +132248,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128309,6 +132271,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128331,6 +132294,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128353,6 +132317,7 @@ "language": "c", "name": "nanopb_fuzzer_response_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128375,6 +132340,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128397,6 +132363,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128419,6 +132386,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128441,6 +132409,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128463,6 +132432,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128485,6 +132455,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128507,6 +132478,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128529,6 +132501,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128551,6 +132524,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128573,6 +132547,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128595,6 +132570,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128617,6 +132593,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128639,6 +132616,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128661,6 +132639,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128683,6 +132662,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128705,6 +132685,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128727,6 +132708,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128749,6 +132731,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128771,6 +132754,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128793,6 +132777,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128815,6 +132800,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128837,6 +132823,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128859,6 +132846,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128881,6 +132869,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128903,6 +132892,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128925,6 +132915,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128947,6 +132938,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128969,6 +132961,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -128991,6 +132984,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129013,6 +133007,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129035,6 +133030,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129057,6 +133053,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129079,6 +133076,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129101,6 +133099,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129123,6 +133122,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129145,6 +133145,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129167,6 +133168,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129189,6 +133191,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129211,6 +133214,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129233,6 +133237,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129255,6 +133260,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129277,6 +133283,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129299,6 +133306,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129321,6 +133329,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129343,6 +133352,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129365,6 +133375,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129387,6 +133398,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129409,6 +133421,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129431,6 +133444,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129453,6 +133467,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129475,6 +133490,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129497,6 +133513,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129519,6 +133536,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129541,6 +133559,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129563,6 +133582,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129585,6 +133605,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129607,6 +133628,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129629,6 +133651,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129651,6 +133674,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129673,6 +133697,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129695,6 +133720,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129717,6 +133743,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129739,6 +133766,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129761,6 +133789,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129783,6 +133812,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129805,6 +133835,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129827,6 +133858,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129849,6 +133881,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129871,6 +133904,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129893,6 +133927,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129915,6 +133950,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129937,6 +133973,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129959,6 +133996,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -129981,6 +134019,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130003,6 +134042,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130025,6 +134065,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130047,6 +134088,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130069,6 +134111,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130091,6 +134134,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130113,6 +134157,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130135,6 +134180,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130157,6 +134203,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130179,6 +134226,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130201,6 +134249,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130223,6 +134272,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130245,6 +134295,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130267,6 +134318,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130289,6 +134341,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130311,6 +134364,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130333,6 +134387,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130355,6 +134410,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130377,6 +134433,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130399,6 +134456,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130421,6 +134479,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130443,6 +134502,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130465,6 +134525,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130487,6 +134548,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130509,6 +134571,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130531,6 +134594,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130553,6 +134617,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130575,6 +134640,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130597,6 +134663,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130619,6 +134686,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130641,6 +134709,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130663,6 +134732,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130685,6 +134755,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130707,6 +134778,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130729,6 +134801,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130751,6 +134824,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130773,6 +134847,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130795,6 +134870,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130817,6 +134893,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130839,6 +134916,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130861,6 +134939,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130883,6 +134962,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130905,6 +134985,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130927,6 +135008,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130949,6 +135031,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130971,6 +135054,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -130993,6 +135077,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131015,6 +135100,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131037,6 +135123,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131059,6 +135146,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131081,6 +135169,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131103,6 +135192,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131125,6 +135215,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131147,6 +135238,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131169,6 +135261,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131191,6 +135284,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131213,6 +135307,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131235,6 +135330,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131257,6 +135353,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131279,6 +135376,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131301,6 +135399,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131323,6 +135422,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131345,6 +135445,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131367,6 +135468,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131389,6 +135491,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131411,6 +135514,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131433,6 +135537,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131455,6 +135560,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131477,6 +135583,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131499,6 +135606,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131521,6 +135629,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131543,6 +135652,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131565,6 +135675,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131587,6 +135698,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131609,6 +135721,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131631,6 +135744,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131653,6 +135767,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131675,6 +135790,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131697,6 +135813,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131719,6 +135836,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131741,6 +135859,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131763,6 +135882,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131785,6 +135905,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131807,6 +135928,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131829,6 +135951,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131851,6 +135974,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131873,6 +135997,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131895,6 +136020,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131917,6 +136043,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131939,6 +136066,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131961,6 +136089,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -131983,6 +136112,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132005,6 +136135,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132027,6 +136158,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132049,6 +136181,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132071,6 +136204,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132093,6 +136227,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132115,6 +136250,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132137,6 +136273,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132159,6 +136296,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132181,6 +136319,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132203,6 +136342,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132225,6 +136365,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132247,6 +136388,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132269,6 +136411,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132291,6 +136434,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132313,6 +136457,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132335,6 +136480,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132357,6 +136503,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132379,6 +136526,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132401,6 +136549,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132423,6 +136572,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132445,6 +136595,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132467,6 +136618,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132489,6 +136641,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132511,6 +136664,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132533,6 +136687,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132555,6 +136710,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132577,6 +136733,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132599,6 +136756,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132621,6 +136779,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132643,6 +136802,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132665,6 +136825,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132687,6 +136848,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132709,6 +136871,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132731,6 +136894,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132753,6 +136917,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132775,6 +136940,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132797,6 +136963,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132819,6 +136986,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132841,6 +137009,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132863,6 +137032,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132885,6 +137055,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132907,6 +137078,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132929,6 +137101,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132951,6 +137124,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132973,6 +137147,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -132995,6 +137170,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133017,6 +137193,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133039,6 +137216,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133061,6 +137239,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133083,6 +137262,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133105,6 +137285,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133127,6 +137308,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133149,6 +137331,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133171,6 +137354,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133193,6 +137377,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133215,6 +137400,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133237,6 +137423,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133259,6 +137446,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133281,6 +137469,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133303,6 +137492,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133325,6 +137515,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133347,6 +137538,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133369,6 +137561,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133391,6 +137584,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133413,6 +137607,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133435,6 +137630,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133457,6 +137653,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133479,6 +137676,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133501,6 +137699,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133523,6 +137722,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133545,6 +137745,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133567,6 +137768,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133589,6 +137791,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133611,6 +137814,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133633,6 +137837,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133655,6 +137860,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133677,6 +137883,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133699,6 +137906,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133721,6 +137929,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133743,6 +137952,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133765,6 +137975,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133787,6 +137998,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133809,6 +138021,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133831,6 +138044,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133853,6 +138067,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133875,6 +138090,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133897,6 +138113,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133919,6 +138136,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133941,6 +138159,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133963,6 +138182,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -133985,6 +138205,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134007,6 +138228,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134029,6 +138251,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134051,6 +138274,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134073,6 +138297,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134095,6 +138320,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134117,6 +138343,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134139,6 +138366,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134161,6 +138389,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134183,6 +138412,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134205,6 +138435,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134227,6 +138458,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134249,6 +138481,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134271,6 +138504,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134293,6 +138527,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134315,6 +138550,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134337,6 +138573,7 @@ "language": "c", "name": "nanopb_fuzzer_serverlist_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134359,6 +138596,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134381,6 +138619,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134403,6 +138642,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134425,6 +138665,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134447,6 +138688,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134469,6 +138711,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134491,6 +138734,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134513,6 +138757,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134535,6 +138780,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134557,6 +138803,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134579,6 +138826,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134601,6 +138849,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134623,6 +138872,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134645,6 +138895,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134667,6 +138918,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134689,6 +138941,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134711,6 +138964,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134733,6 +138987,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134755,6 +139010,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134777,6 +139033,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134799,6 +139056,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134821,6 +139079,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134843,6 +139102,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134865,6 +139125,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134887,6 +139148,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134909,6 +139171,7 @@ "language": "c", "name": "percent_decode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134931,6 +139194,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134953,6 +139217,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134975,6 +139240,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -134997,6 +139263,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135019,6 +139286,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135041,6 +139309,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135063,6 +139332,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135085,6 +139355,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135107,6 +139378,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135129,6 +139401,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135151,6 +139424,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135173,6 +139447,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135195,6 +139470,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135217,6 +139493,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135239,6 +139516,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135261,6 +139539,7 @@ "language": "c", "name": "percent_encode_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135283,6 +139562,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135305,6 +139585,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135327,6 +139608,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135349,6 +139631,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135371,6 +139654,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135393,6 +139677,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135415,6 +139700,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135437,6 +139723,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135459,6 +139746,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135481,6 +139769,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135503,6 +139792,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135525,6 +139815,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135547,6 +139838,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135569,6 +139861,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135591,6 +139884,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135613,6 +139907,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135635,6 +139930,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135657,6 +139953,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135679,6 +139976,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135701,6 +139999,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135723,6 +140022,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135745,6 +140045,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135767,6 +140068,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135789,6 +140091,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135811,6 +140114,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135833,6 +140137,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135855,6 +140160,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135877,6 +140183,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135899,6 +140206,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135921,6 +140229,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135943,6 +140252,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135965,6 +140275,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -135987,6 +140298,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136009,6 +140321,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136031,6 +140344,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136053,6 +140367,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136075,6 +140390,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136097,6 +140413,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136119,6 +140436,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136141,6 +140459,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136163,6 +140482,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136185,6 +140505,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136207,6 +140528,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136229,6 +140551,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136251,6 +140574,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136273,6 +140597,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136295,6 +140620,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136317,6 +140643,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136339,6 +140666,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136361,6 +140689,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136383,6 +140712,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136405,6 +140735,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136427,6 +140758,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136449,6 +140781,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136471,6 +140804,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136493,6 +140827,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136515,6 +140850,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136537,6 +140873,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136559,6 +140896,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136581,6 +140919,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136603,6 +140942,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136625,6 +140965,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136647,6 +140988,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136669,6 +141011,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136691,6 +141034,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136713,6 +141057,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136735,6 +141080,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136757,6 +141103,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136779,6 +141126,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136801,6 +141149,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136823,6 +141172,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136845,6 +141195,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136867,6 +141218,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136889,6 +141241,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136911,6 +141264,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136933,6 +141287,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136955,6 +141310,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136977,6 +141333,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -136999,6 +141356,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137021,6 +141379,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137043,6 +141402,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137065,6 +141425,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137087,6 +141448,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137109,6 +141471,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137131,6 +141494,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137153,6 +141517,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137175,6 +141540,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137197,6 +141563,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137219,6 +141586,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137241,6 +141609,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137263,6 +141632,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137285,6 +141655,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137307,6 +141678,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137329,6 +141701,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137351,6 +141724,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137373,6 +141747,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137395,6 +141770,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137417,6 +141793,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137439,6 +141816,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137461,6 +141839,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137483,6 +141862,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137505,6 +141885,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137527,6 +141908,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137549,6 +141931,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137571,6 +141954,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137593,6 +141977,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137615,6 +142000,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137637,6 +142023,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137659,6 +142046,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137681,6 +142069,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137703,6 +142092,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137725,6 +142115,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137747,6 +142138,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137769,6 +142161,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137791,6 +142184,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137813,6 +142207,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137835,6 +142230,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137857,6 +142253,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137879,6 +142276,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137901,6 +142299,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137923,6 +142322,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137945,6 +142345,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137967,6 +142368,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -137989,6 +142391,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138011,6 +142414,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138033,6 +142437,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138055,6 +142460,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138077,6 +142483,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138099,6 +142506,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138121,6 +142529,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138143,6 +142552,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138165,6 +142575,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138187,6 +142598,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138209,6 +142621,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138231,6 +142644,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138253,6 +142667,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138275,6 +142690,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138297,6 +142713,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138319,6 +142736,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138341,6 +142759,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138363,6 +142782,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138385,6 +142805,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138407,6 +142828,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138429,6 +142851,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138451,6 +142874,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138473,6 +142897,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138495,6 +142920,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138517,6 +142943,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138539,6 +142966,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138561,6 +142989,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138583,6 +143012,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138605,6 +143035,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138627,6 +143058,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138649,6 +143081,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138671,6 +143104,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138693,6 +143127,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138715,6 +143150,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138737,6 +143173,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138759,6 +143196,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138781,6 +143219,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138803,6 +143242,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138825,6 +143265,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138847,6 +143288,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138869,6 +143311,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138891,6 +143334,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138913,6 +143357,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138935,6 +143380,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138957,6 +143403,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -138979,6 +143426,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139001,6 +143449,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139023,6 +143472,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139045,6 +143495,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139067,6 +143518,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139089,6 +143541,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139111,6 +143564,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139133,6 +143587,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139155,6 +143610,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139177,6 +143633,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139199,6 +143656,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139221,6 +143679,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139243,6 +143702,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139265,6 +143725,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139287,6 +143748,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139309,6 +143771,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139331,6 +143794,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139353,6 +143817,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139375,6 +143840,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139397,6 +143863,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139419,6 +143886,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139441,6 +143909,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139463,6 +143932,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139485,6 +143955,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139507,6 +143978,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139529,6 +144001,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139551,6 +144024,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139573,6 +144047,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139595,6 +144070,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139617,6 +144093,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139639,6 +144116,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139661,6 +144139,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139683,6 +144162,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139705,6 +144185,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139727,6 +144208,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139749,6 +144231,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139771,6 +144254,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139793,6 +144277,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139815,6 +144300,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139837,6 +144323,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139859,6 +144346,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139881,6 +144369,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139903,6 +144392,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139925,6 +144415,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139947,6 +144438,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139969,6 +144461,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -139991,6 +144484,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140013,6 +144507,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140035,6 +144530,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140057,6 +144553,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140079,6 +144576,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140101,6 +144599,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140123,6 +144622,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140145,6 +144645,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140167,6 +144668,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140189,6 +144691,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140211,6 +144714,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140233,6 +144737,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140255,6 +144760,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140277,6 +144783,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140299,6 +144806,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140321,6 +144829,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140343,6 +144852,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140365,6 +144875,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140387,6 +144898,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140409,6 +144921,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140431,6 +144944,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140453,6 +144967,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140475,6 +144990,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140497,6 +145013,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140519,6 +145036,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140541,6 +145059,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140563,6 +145082,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140585,6 +145105,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140607,6 +145128,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140629,6 +145151,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140651,6 +145174,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140673,6 +145197,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140695,6 +145220,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140717,6 +145243,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140739,6 +145266,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140761,6 +145289,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140783,6 +145312,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140805,6 +145335,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140827,6 +145358,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140849,6 +145381,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140871,6 +145404,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140893,6 +145427,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140915,6 +145450,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140937,6 +145473,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140959,6 +145496,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -140981,6 +145519,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141003,6 +145542,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141025,6 +145565,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141047,6 +145588,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141069,6 +145611,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141091,6 +145634,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141113,6 +145657,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141135,6 +145680,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141157,6 +145703,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141179,6 +145726,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141201,6 +145749,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141223,6 +145772,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141245,6 +145795,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141267,6 +145818,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141289,6 +145841,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141311,6 +145864,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141333,6 +145887,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141355,6 +145910,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141377,6 +145933,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141399,6 +145956,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141421,6 +145979,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141443,6 +146002,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141465,6 +146025,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141487,6 +146048,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141509,6 +146071,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141531,6 +146094,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141553,6 +146117,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141575,6 +146140,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141597,6 +146163,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141619,6 +146186,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141641,6 +146209,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141663,6 +146232,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141685,6 +146255,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141707,6 +146278,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141729,6 +146301,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141751,6 +146324,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141773,6 +146347,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141795,6 +146370,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141817,6 +146393,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141839,6 +146416,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141861,6 +146439,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141883,6 +146462,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141905,6 +146485,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141927,6 +146508,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141949,6 +146531,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141971,6 +146554,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -141993,6 +146577,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142015,6 +146600,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142037,6 +146623,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142059,6 +146646,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142081,6 +146669,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142103,6 +146692,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142125,6 +146715,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142147,6 +146738,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142169,6 +146761,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142191,6 +146784,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142213,6 +146807,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142235,6 +146830,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142257,6 +146853,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142279,6 +146876,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142301,6 +146899,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142323,6 +146922,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142345,6 +146945,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142367,6 +146968,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142389,6 +146991,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142411,6 +147014,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142433,6 +147037,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142455,6 +147060,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142477,6 +147083,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142499,6 +147106,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142521,6 +147129,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142543,6 +147152,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142565,6 +147175,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142587,6 +147198,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142609,6 +147221,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142631,6 +147244,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142653,6 +147267,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142675,6 +147290,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142697,6 +147313,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142719,6 +147336,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142741,6 +147359,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142763,6 +147382,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142785,6 +147405,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142807,6 +147428,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142829,6 +147451,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142851,6 +147474,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142873,6 +147497,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142895,6 +147520,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142917,6 +147543,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142939,6 +147566,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142961,6 +147589,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -142983,6 +147612,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143005,6 +147635,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143027,6 +147658,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143049,6 +147681,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143071,6 +147704,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143093,6 +147727,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143115,6 +147750,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143137,6 +147773,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143159,6 +147796,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143181,6 +147819,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143203,6 +147842,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143225,6 +147865,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143247,6 +147888,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143269,6 +147911,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143291,6 +147934,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143313,6 +147957,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143335,6 +147980,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143357,6 +148003,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143379,6 +148026,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143401,6 +148049,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143423,6 +148072,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143445,6 +148095,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143467,6 +148118,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143489,6 +148141,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143511,6 +148164,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143533,6 +148187,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143555,6 +148210,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143577,6 +148233,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143599,6 +148256,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143621,6 +148279,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143643,6 +148302,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143665,6 +148325,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143687,6 +148348,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143709,6 +148371,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143731,6 +148394,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143753,6 +148417,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143775,6 +148440,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143797,6 +148463,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143819,6 +148486,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143841,6 +148509,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143863,6 +148532,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143885,6 +148555,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143907,6 +148578,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143929,6 +148601,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143951,6 +148624,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143973,6 +148647,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -143995,6 +148670,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144017,6 +148693,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144039,6 +148716,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144061,6 +148739,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144083,6 +148762,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144105,6 +148785,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144127,6 +148808,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144149,6 +148831,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144171,6 +148854,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144193,6 +148877,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144215,6 +148900,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144237,6 +148923,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144259,6 +148946,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144281,6 +148969,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144303,6 +148992,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144325,6 +149015,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144347,6 +149038,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144369,6 +149061,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144391,6 +149084,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144413,6 +149107,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144435,6 +149130,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144457,6 +149153,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144479,6 +149176,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144501,6 +149199,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144523,6 +149222,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144545,6 +149245,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144567,6 +149268,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144589,6 +149291,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144611,6 +149314,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144633,6 +149337,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144655,6 +149360,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144677,6 +149383,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144699,6 +149406,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144721,6 +149429,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144743,6 +149452,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144765,6 +149475,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144787,6 +149498,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144809,6 +149521,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144831,6 +149544,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144853,6 +149567,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144875,6 +149590,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144897,6 +149613,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144919,6 +149636,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144941,6 +149659,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144963,6 +149682,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -144985,6 +149705,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145007,6 +149728,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145029,6 +149751,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145051,6 +149774,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145073,6 +149797,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145095,6 +149820,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145117,6 +149843,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145139,6 +149866,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145161,6 +149889,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145183,6 +149912,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145205,6 +149935,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145227,6 +149958,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145249,6 +149981,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145271,6 +150004,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145293,6 +150027,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145315,6 +150050,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145337,6 +150073,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145359,6 +150096,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145381,6 +150119,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145403,6 +150142,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145425,6 +150165,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145447,6 +150188,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145469,6 +150211,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145491,6 +150234,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145513,6 +150257,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145535,6 +150280,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145557,6 +150303,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145579,6 +150326,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145601,6 +150349,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145623,6 +150372,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145645,6 +150395,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145667,6 +150418,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145689,6 +150441,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145711,6 +150464,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145733,6 +150487,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145755,6 +150510,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145777,6 +150533,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145799,6 +150556,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145821,6 +150579,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145843,6 +150602,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145865,6 +150625,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145887,6 +150648,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145909,6 +150671,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145931,6 +150694,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145953,6 +150717,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145975,6 +150740,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -145997,6 +150763,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146019,6 +150786,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146041,6 +150809,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146063,6 +150832,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146085,6 +150855,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146107,6 +150878,7 @@ "language": "c", "name": "server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146129,6 +150901,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146151,6 +150924,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146173,6 +150947,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146195,6 +150970,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146217,6 +150993,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146239,6 +151016,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146261,6 +151039,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146283,6 +151062,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146305,6 +151085,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146327,6 +151108,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146349,6 +151131,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146371,6 +151154,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146393,6 +151177,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146415,6 +151200,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146437,6 +151223,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146459,6 +151246,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146481,6 +151269,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146503,6 +151292,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146525,6 +151315,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146547,6 +151338,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146569,6 +151361,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146591,6 +151384,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146613,6 +151407,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146635,6 +151430,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146657,6 +151453,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146679,6 +151476,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146701,6 +151499,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146723,6 +151522,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146745,6 +151545,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146767,6 +151568,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146789,6 +151591,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146811,6 +151614,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146833,6 +151637,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146855,6 +151660,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146877,6 +151683,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146899,6 +151706,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146921,6 +151729,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146943,6 +151752,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146965,6 +151775,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -146987,6 +151798,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147009,6 +151821,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147031,6 +151844,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147053,6 +151867,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147075,6 +151890,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147097,6 +151913,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147119,6 +151936,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147141,6 +151959,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147163,6 +151982,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147185,6 +152005,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147207,6 +152028,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147229,6 +152051,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147251,6 +152074,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147273,6 +152097,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147295,6 +152120,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147317,6 +152143,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147339,6 +152166,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147361,6 +152189,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147383,6 +152212,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147405,6 +152235,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147427,6 +152258,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147449,6 +152281,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147471,6 +152304,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147493,6 +152327,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147515,6 +152350,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147537,6 +152373,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147559,6 +152396,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147581,6 +152419,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147603,6 +152442,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147625,6 +152465,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147647,6 +152488,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147669,6 +152511,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147691,6 +152534,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147713,6 +152557,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147735,6 +152580,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147757,6 +152603,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147779,6 +152626,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147801,6 +152649,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147823,6 +152672,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147845,6 +152695,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147867,6 +152718,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147889,6 +152741,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147911,6 +152764,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147933,6 +152787,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147955,6 +152810,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147977,6 +152833,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -147999,6 +152856,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148021,6 +152879,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148043,6 +152902,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148065,6 +152925,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148087,6 +152948,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148109,6 +152971,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148131,6 +152994,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148153,6 +153017,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148175,6 +153040,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148197,6 +153063,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148219,6 +153086,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148241,6 +153109,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148263,6 +153132,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148285,6 +153155,7 @@ "language": "c", "name": "ssl_server_fuzzer_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148307,6 +153178,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148329,6 +153201,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148351,6 +153224,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148373,6 +153247,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148395,6 +153270,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148417,6 +153293,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148439,6 +153316,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148461,6 +153339,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148483,6 +153362,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148505,6 +153385,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148527,6 +153408,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148549,6 +153431,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148571,6 +153454,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148593,6 +153477,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148615,6 +153500,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148637,6 +153523,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148659,6 +153546,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148681,6 +153569,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148703,6 +153592,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148725,6 +153615,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148747,6 +153638,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148769,6 +153661,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148791,6 +153684,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148813,6 +153707,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148835,6 +153730,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148857,6 +153753,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148879,6 +153776,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148901,6 +153799,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148923,6 +153822,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148945,6 +153845,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148967,6 +153868,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -148989,6 +153891,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149011,6 +153914,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149033,6 +153937,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149055,6 +153960,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149077,6 +153983,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149099,6 +154006,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149121,6 +154029,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149143,6 +154052,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149165,6 +154075,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149187,6 +154098,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149209,6 +154121,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149231,6 +154144,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149253,6 +154167,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149275,6 +154190,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149297,6 +154213,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149319,6 +154236,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149341,6 +154259,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149363,6 +154282,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149385,6 +154305,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149407,6 +154328,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149429,6 +154351,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149451,6 +154374,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149473,6 +154397,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149495,6 +154420,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149517,6 +154443,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149539,6 +154466,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149561,6 +154489,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149583,6 +154512,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149605,6 +154535,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149627,6 +154558,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149649,6 +154581,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false @@ -149671,6 +154604,7 @@ "language": "c", "name": "uri_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false From 69e5a286351fb87c54d29322fbc03859a829e636 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Mon, 20 Mar 2017 12:51:17 -0700 Subject: [PATCH 137/186] Going for 1.2.0 --- BUILD | 2 +- CMakeLists.txt | 2 +- Makefile | 4 ++-- build.yaml | 2 +- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- package.json | 2 +- package.xml | 4 ++-- src/cpp/common/version_cc.cc | 2 +- src/csharp/Grpc.Auth/project.json | 4 ++-- src/csharp/Grpc.Core.Testing/project.json | 4 ++-- src/csharp/Grpc.Core/VersionInfo.cs | 2 +- src/csharp/Grpc.Core/project.json | 2 +- src/csharp/Grpc.HealthCheck/project.json | 4 ++-- src/csharp/Grpc.Reflection/project.json | 4 ++-- src/csharp/build_packages_dotnetcli.bat | 2 +- src/csharp/build_packages_dotnetcli.sh | 4 ++-- src/node/health_check/package.json | 4 ++-- src/node/tools/package.json | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/GRPCClient/private/version.h | 2 +- src/python/grpcio/grpc_version.py | 2 +- src/python/grpcio_health_checking/grpc_version.py | 2 +- src/python/grpcio_reflection/grpc_version.py | 2 +- src/python/grpcio_tests/grpc_version.py | 2 +- src/ruby/lib/grpc/version.rb | 2 +- src/ruby/tools/version.rb | 2 +- tools/distrib/python/grpcio_tools/grpc_version.py | 2 +- tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- 32 files changed, 40 insertions(+), 40 deletions(-) diff --git a/BUILD b/BUILD index 585c26ad1c5..db08f57fbf1 100644 --- a/BUILD +++ b/BUILD @@ -41,7 +41,7 @@ g_stands_for = "green" core_version = "3.0.0-dev" -version = "1.2.0-pre1" +version = "1.2.0" grpc_cc_library( name = "gpr", diff --git a/CMakeLists.txt b/CMakeLists.txt index 28bff0d2318..ce9c346dddf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ cmake_minimum_required(VERSION 2.8) set(PACKAGE_NAME "grpc") -set(PACKAGE_VERSION "1.2.0-pre2") +set(PACKAGE_VERSION "1.2.0") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") diff --git a/Makefile b/Makefile index 331523ed7d7..1d2436cc940 100644 --- a/Makefile +++ b/Makefile @@ -412,8 +412,8 @@ Q = @ endif CORE_VERSION = 3.0.0-dev -CPP_VERSION = 1.2.0-pre2 -CSHARP_VERSION = 1.2.0-pre2 +CPP_VERSION = 1.2.0 +CSHARP_VERSION = 1.2.0 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) diff --git a/build.yaml b/build.yaml index ce88586b92b..91d65d84efb 100644 --- a/build.yaml +++ b/build.yaml @@ -14,7 +14,7 @@ settings: '#10': See the expand_version.py for all the quirks here core_version: 3.0.0-dev g_stands_for: green - version: 1.2.0-pre2 + version: 1.2.0 filegroups: - name: census public_headers: diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 6857f4bfb25..5530588abc9 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-Core' - version = '1.2.0-pre2' + version = '1.2.0' s.version = version s.summary = 'Core cross-platform gRPC library, written in C' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index e37a34b6728..dd0f6e89f32 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-ProtoRPC' - version = '1.2.0-pre2' + version = '1.2.0' s.version = version s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index 7cd110b7400..23301e1adc8 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-RxLibrary' - version = '1.2.0-pre2' + version = '1.2.0' s.version = version s.summary = 'Reactive Extensions library for iOS/OSX.' s.homepage = 'http://www.grpc.io' diff --git a/gRPC.podspec b/gRPC.podspec index 073f3b7a0ff..b91e815e412 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.name = 'gRPC' - version = '1.2.0-pre2' + version = '1.2.0' s.version = version s.summary = 'gRPC client library for iOS/OSX' s.homepage = 'http://www.grpc.io' diff --git a/package.json b/package.json index 36f7d35a7e0..db1e5dddbef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "1.2.0-pre2", + "version": "1.2.0", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", diff --git a/package.xml b/package.xml index 7b3e6b129f9..6fc30f1aa21 100644 --- a/package.xml +++ b/package.xml @@ -13,8 +13,8 @@ 2017-03-01 - 1.2.0RC2 - 1.2.0RC2 + 1.2.0 + 1.2.0 beta diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc index 9b30223f475..fd80b98f3c1 100644 --- a/src/cpp/common/version_cc.cc +++ b/src/cpp/common/version_cc.cc @@ -37,5 +37,5 @@ #include namespace grpc { -grpc::string Version() { return "1.2.0-pre2"; } +grpc::string Version() { return "1.2.0"; } } diff --git a/src/csharp/Grpc.Auth/project.json b/src/csharp/Grpc.Auth/project.json index fc0a8ba0def..ad708e32c41 100644 --- a/src/csharp/Grpc.Auth/project.json +++ b/src/csharp/Grpc.Auth/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre2", + "version": "1.2.0", "title": "gRPC C# Auth", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre2", + "Grpc.Core": "1.2.0", "Google.Apis.Auth": "1.21.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Core.Testing/project.json b/src/csharp/Grpc.Core.Testing/project.json index 0070b74cc38..737ae3b9266 100644 --- a/src/csharp/Grpc.Core.Testing/project.json +++ b/src/csharp/Grpc.Core.Testing/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre2", + "version": "1.2.0", "title": "gRPC C# Core Testing", "authors": [ "Google Inc." ], "copyright": "Copyright 2017, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre2" + "Grpc.Core": "1.2.0" }, "frameworks": { "net45": { diff --git a/src/csharp/Grpc.Core/VersionInfo.cs b/src/csharp/Grpc.Core/VersionInfo.cs index 8773183aaf0..e4e0b5b2ad1 100644 --- a/src/csharp/Grpc.Core/VersionInfo.cs +++ b/src/csharp/Grpc.Core/VersionInfo.cs @@ -53,6 +53,6 @@ namespace Grpc.Core /// /// Current version of gRPC C# /// - public const string CurrentVersion = "1.2.0-pre2"; + public const string CurrentVersion = "1.2.0"; } } diff --git a/src/csharp/Grpc.Core/project.json b/src/csharp/Grpc.Core/project.json index 0f9f1e819e7..5f2a5f944de 100644 --- a/src/csharp/Grpc.Core/project.json +++ b/src/csharp/Grpc.Core/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre2", + "version": "1.2.0", "title": "gRPC C# Core", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", diff --git a/src/csharp/Grpc.HealthCheck/project.json b/src/csharp/Grpc.HealthCheck/project.json index ae3094b903d..d2acce5cf4b 100644 --- a/src/csharp/Grpc.HealthCheck/project.json +++ b/src/csharp/Grpc.HealthCheck/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre2", + "version": "1.2.0", "title": "gRPC C# Healthchecking", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre2", + "Grpc.Core": "1.2.0", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Reflection/project.json b/src/csharp/Grpc.Reflection/project.json index 8daa9e47ddb..8b7a46aa4a1 100644 --- a/src/csharp/Grpc.Reflection/project.json +++ b/src/csharp/Grpc.Reflection/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0-pre2", + "version": "1.2.0", "title": "gRPC C# Reflection", "authors": [ "Google Inc." ], "copyright": "Copyright 2016, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0-pre2", + "Grpc.Core": "1.2.0", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/build_packages_dotnetcli.bat b/src/csharp/build_packages_dotnetcli.bat index 9e1074833fb..8180098c01e 100755 --- a/src/csharp/build_packages_dotnetcli.bat +++ b/src/csharp/build_packages_dotnetcli.bat @@ -28,7 +28,7 @@ @rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @rem Current package versions -set VERSION=1.2.0-pre2 +set VERSION=1.2.0 set PROTOBUF_VERSION=3.0.0 @rem Adjust the location of nuget.exe diff --git a/src/csharp/build_packages_dotnetcli.sh b/src/csharp/build_packages_dotnetcli.sh index a283dc76f17..b758f3fc84b 100755 --- a/src/csharp/build_packages_dotnetcli.sh +++ b/src/csharp/build_packages_dotnetcli.sh @@ -66,7 +66,7 @@ dotnet pack --configuration Release Grpc.Auth/project.json --output ../../artifa dotnet pack --configuration Release Grpc.HealthCheck/project.json --output ../../artifacts dotnet pack --configuration Release Grpc.Reflection/project.json --output ../../artifacts -nuget pack Grpc.nuspec -Version "1.2.0-pre2" -OutputDirectory ../../artifacts -nuget pack Grpc.Tools.nuspec -Version "1.2.0-pre2" -OutputDirectory ../../artifacts +nuget pack Grpc.nuspec -Version "1.2.0" -OutputDirectory ../../artifacts +nuget pack Grpc.Tools.nuspec -Version "1.2.0" -OutputDirectory ../../artifacts (cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg) diff --git a/src/node/health_check/package.json b/src/node/health_check/package.json index d03d5a4d625..31b4ed24ad6 100644 --- a/src/node/health_check/package.json +++ b/src/node/health_check/package.json @@ -1,6 +1,6 @@ { "name": "grpc-health-check", - "version": "1.2.0-pre2", + "version": "1.2.0", "author": "Google Inc.", "description": "Health check service for use with gRPC", "repository": { @@ -15,7 +15,7 @@ } ], "dependencies": { - "grpc": "^1.2.0-pre2", + "grpc": "^1.2.0", "lodash": "^3.9.3", "google-protobuf": "^3.0.0" }, diff --git a/src/node/tools/package.json b/src/node/tools/package.json index e3b53bcdf54..8370fa65a4f 100644 --- a/src/node/tools/package.json +++ b/src/node/tools/package.json @@ -1,6 +1,6 @@ { "name": "grpc-tools", - "version": "1.2.0-pre2", + "version": "1.2.0", "author": "Google Inc.", "description": "Tools for developing with gRPC on Node.js", "homepage": "http://www.grpc.io/", diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index c4867768f0f..4b8faf75828 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCPlugin' - v = '1.2.0-pre2' + v = '1.2.0' s.version = v s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/GRPCClient/private/version.h b/src/objective-c/GRPCClient/private/version.h index 289a55d083b..346763326e9 100644 --- a/src/objective-c/GRPCClient/private/version.h +++ b/src/objective-c/GRPCClient/private/version.h @@ -38,4 +38,4 @@ // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.2.0-pre2" +#define GRPC_OBJC_VERSION_STRING @"1.2.0" diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py index ff72fde5838..1da40ca19f9 100644 --- a/src/python/grpcio/grpc_version.py +++ b/src/python/grpcio/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!! -VERSION='1.2.0rc2' +VERSION='1.2.0' diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py index 6e098452a8f..362f21f4586 100644 --- a/src/python/grpcio_health_checking/grpc_version.py +++ b/src/python/grpcio_health_checking/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!! -VERSION='1.2.0rc2' +VERSION='1.2.0' diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py index 3fe4779e154..79b7c1d665f 100644 --- a/src/python/grpcio_reflection/grpc_version.py +++ b/src/python/grpcio_reflection/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!! -VERSION='1.2.0rc2' +VERSION='1.2.0' diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py index ca78d14ad92..722093ddd31 100644 --- a/src/python/grpcio_tests/grpc_version.py +++ b/src/python/grpcio_tests/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!! -VERSION='1.2.0rc2' +VERSION='1.2.0' diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index 2cc0a950d02..f35f74b852a 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -29,5 +29,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '1.2.0.pre2' + VERSION = '1.2.0' end diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb index 22a2a72e4c2..af39467db12 100644 --- a/src/ruby/tools/version.rb +++ b/src/ruby/tools/version.rb @@ -29,6 +29,6 @@ module GRPC module Tools - VERSION = '1.2.0.pre2' + VERSION = '1.2.0' end end diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py index b784a80bf58..7829999e035 100644 --- a/tools/distrib/python/grpcio_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION='1.2.0rc2' +VERSION='1.2.0' diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 7af9246beef..9d7bd84e922 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0-pre2 +PROJECT_NUMBER = 1.2.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 5ca65127dca..d64190ad7f6 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0-pre2 +PROJECT_NUMBER = 1.2.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From eb6f20128ac2f902d9d6ad7e49a51897b3e06d44 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 20 Mar 2017 13:53:59 -0700 Subject: [PATCH 138/186] Improvement on reading compression byt --- .../cronet/transport/cronet_transport.c | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 791f0416ad0..4d80501ba84 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -733,26 +733,17 @@ static void convert_metadata_to_cronet_headers( *p_num_headers = (size_t)num_headers; } -static bool parse_grpc_header(const uint8_t *data, +static void parse_grpc_header(const uint8_t *data, int *length, bool *compressed) { const uint8_t c = *data; const uint8_t *p = data + 1; + *compressed = ((c & 0x01) == 0x01); *length = 0; *length |= ((uint8_t)*p++) << 24; *length |= ((uint8_t)*p++) << 16; *length |= ((uint8_t)*p++) << 8; *length |= ((uint8_t)*p++); - switch (c) { - case 0: - *compressed = false; - return true; - case 1: - *compressed = true; - return true; - default: - return false; - } } static bool header_has_authority(grpc_linked_mdelem *head) { @@ -1082,15 +1073,9 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, stream_state->rs.remaining_bytes == 0) { /* Start a read operation for data */ stream_state->rs.length_field_received = true; - if (parse_grpc_header((const uint8_t *)stream_state->rs.read_buffer, - &stream_state->rs.length_field, - &stream_state->rs.compressed)) { - stream_state->rs.remaining_bytes = stream_state->rs.length_field; - } else { - /* Error deframing the data frame. */ - CRONET_LOG(GPR_DEBUG, "stream deframing error"); - GPR_ASSERT(false); - } + parse_grpc_header((const uint8_t *)stream_state->rs.read_buffer, + &stream_state->rs.length_field, + &stream_state->rs.compressed); CRONET_LOG(GPR_DEBUG, "length field = %d", stream_state->rs.length_field); if (stream_state->rs.length_field > 0) { From 34e91944521833dc7474733093b98e4b534da87c Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Mon, 20 Mar 2017 14:32:33 -0700 Subject: [PATCH 139/186] Make enum34 only required for Python 2.7 --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 234252a16ca..06a32a38ea7 100644 --- a/setup.py +++ b/setup.py @@ -206,14 +206,13 @@ PACKAGE_DIRECTORIES = { INSTALL_REQUIRES = ( 'six>=1.5.2', - 'enum34>=1.0.4', # TODO(atash): eventually split the grpcio package into a metapackage # depending on protobuf and the runtime component (independent of protobuf) 'protobuf>=3.0.0', ) if not PY3: - INSTALL_REQUIRES += ('futures>=2.2.0',) + INSTALL_REQUIRES += ('futures>=2.2.0', 'enum34>=1.0.4') SETUP_REQUIRES = INSTALL_REQUIRES + ( 'sphinx>=1.3', From 3e30832ccad4df08e3ca1967ab9d3d3c48f27a6f Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 20 Mar 2017 17:00:45 -0700 Subject: [PATCH 140/186] bump v1.2.x branch to 1.2.1-pre1 --- CMakeLists.txt | 2 +- Makefile | 4 ++-- build.yaml | 2 +- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- package.json | 2 +- package.xml | 4 ++-- src/cpp/common/version_cc.cc | 2 +- src/csharp/Grpc.Auth/project.json | 4 ++-- src/csharp/Grpc.Core.Testing/project.json | 4 ++-- src/csharp/Grpc.Core/VersionInfo.cs | 4 ++-- src/csharp/Grpc.Core/project.json | 2 +- src/csharp/Grpc.HealthCheck/project.json | 4 ++-- src/csharp/Grpc.Reflection/project.json | 4 ++-- src/csharp/build_packages_dotnetcli.bat | 2 +- src/csharp/build_packages_dotnetcli.sh | 4 ++-- src/node/health_check/package.json | 4 ++-- src/node/tools/package.json | 2 +- src/objective-c/!ProtoCompiler-gRPCPlugin.podspec | 2 +- src/objective-c/GRPCClient/private/version.h | 2 +- src/php/composer.json | 2 +- src/python/grpcio/grpc_version.py | 2 +- src/python/grpcio_health_checking/grpc_version.py | 2 +- src/python/grpcio_reflection/grpc_version.py | 2 +- src/python/grpcio_tests/grpc_version.py | 2 +- src/ruby/lib/grpc/version.rb | 2 +- src/ruby/tools/version.rb | 2 +- tools/distrib/python/grpcio_tools/grpc_version.py | 2 +- tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- 32 files changed, 41 insertions(+), 41 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ce9c346dddf..3a0787e2f1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ cmake_minimum_required(VERSION 2.8) set(PACKAGE_NAME "grpc") -set(PACKAGE_VERSION "1.2.0") +set(PACKAGE_VERSION "1.2.1-pre1") set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}") set(PACKAGE_TARNAME "${PACKAGE_NAME}-${PACKAGE_VERSION}") set(PACKAGE_BUGREPORT "https://github.com/grpc/grpc/issues/") diff --git a/Makefile b/Makefile index 1d2436cc940..4a32fed2c96 100644 --- a/Makefile +++ b/Makefile @@ -412,8 +412,8 @@ Q = @ endif CORE_VERSION = 3.0.0-dev -CPP_VERSION = 1.2.0 -CSHARP_VERSION = 1.2.0 +CPP_VERSION = 1.2.1-pre1 +CSHARP_VERSION = 1.2.1-pre1 CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES)) CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS) diff --git a/build.yaml b/build.yaml index 91d65d84efb..1ec134645ce 100644 --- a/build.yaml +++ b/build.yaml @@ -14,7 +14,7 @@ settings: '#10': See the expand_version.py for all the quirks here core_version: 3.0.0-dev g_stands_for: green - version: 1.2.0 + version: 1.2.1-pre1 filegroups: - name: census public_headers: diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 5530588abc9..c502c4440eb 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -37,7 +37,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-Core' - version = '1.2.0' + version = '1.2.1-pre1' s.version = version s.summary = 'Core cross-platform gRPC library, written in C' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index dd0f6e89f32..5fddf8fd820 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-ProtoRPC' - version = '1.2.0' + version = '1.2.1-pre1' s.version = version s.summary = 'RPC library for Protocol Buffers, based on gRPC' s.homepage = 'http://www.grpc.io' diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index 23301e1adc8..84478f56ea7 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -36,7 +36,7 @@ Pod::Spec.new do |s| s.name = 'gRPC-RxLibrary' - version = '1.2.0' + version = '1.2.1-pre1' s.version = version s.summary = 'Reactive Extensions library for iOS/OSX.' s.homepage = 'http://www.grpc.io' diff --git a/gRPC.podspec b/gRPC.podspec index b91e815e412..dc1dd38a6e8 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -35,7 +35,7 @@ Pod::Spec.new do |s| s.name = 'gRPC' - version = '1.2.0' + version = '1.2.1-pre1' s.version = version s.summary = 'gRPC client library for iOS/OSX' s.homepage = 'http://www.grpc.io' diff --git a/package.json b/package.json index db1e5dddbef..004f968ea2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "1.2.0", + "version": "1.2.1-pre1", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", diff --git a/package.xml b/package.xml index 6fc30f1aa21..fc3d0923728 100644 --- a/package.xml +++ b/package.xml @@ -13,8 +13,8 @@ 2017-03-01 - 1.2.0 - 1.2.0 + 1.2.1RC1 + 1.2.1RC1 beta diff --git a/src/cpp/common/version_cc.cc b/src/cpp/common/version_cc.cc index fd80b98f3c1..a40f8f0a284 100644 --- a/src/cpp/common/version_cc.cc +++ b/src/cpp/common/version_cc.cc @@ -37,5 +37,5 @@ #include namespace grpc { -grpc::string Version() { return "1.2.0"; } +grpc::string Version() { return "1.2.1-pre1"; } } diff --git a/src/csharp/Grpc.Auth/project.json b/src/csharp/Grpc.Auth/project.json index ad708e32c41..16584f9b14b 100644 --- a/src/csharp/Grpc.Auth/project.json +++ b/src/csharp/Grpc.Auth/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0", + "version": "1.2.1-pre1", "title": "gRPC C# Auth", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0", + "Grpc.Core": "1.2.1-pre1", "Google.Apis.Auth": "1.21.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Core.Testing/project.json b/src/csharp/Grpc.Core.Testing/project.json index 737ae3b9266..960774c0d95 100644 --- a/src/csharp/Grpc.Core.Testing/project.json +++ b/src/csharp/Grpc.Core.Testing/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0", + "version": "1.2.1-pre1", "title": "gRPC C# Core Testing", "authors": [ "Google Inc." ], "copyright": "Copyright 2017, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0" + "Grpc.Core": "1.2.1-pre1" }, "frameworks": { "net45": { diff --git a/src/csharp/Grpc.Core/VersionInfo.cs b/src/csharp/Grpc.Core/VersionInfo.cs index e4e0b5b2ad1..25be59a61ce 100644 --- a/src/csharp/Grpc.Core/VersionInfo.cs +++ b/src/csharp/Grpc.Core/VersionInfo.cs @@ -48,11 +48,11 @@ namespace Grpc.Core /// /// Current AssemblyFileVersion of gRPC C# assemblies /// - public const string CurrentAssemblyFileVersion = "1.2.0.0"; + public const string CurrentAssemblyFileVersion = "1.2.1.0"; /// /// Current version of gRPC C# /// - public const string CurrentVersion = "1.2.0"; + public const string CurrentVersion = "1.2.1-pre1"; } } diff --git a/src/csharp/Grpc.Core/project.json b/src/csharp/Grpc.Core/project.json index 5f2a5f944de..5338011dd25 100644 --- a/src/csharp/Grpc.Core/project.json +++ b/src/csharp/Grpc.Core/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0", + "version": "1.2.1-pre1", "title": "gRPC C# Core", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", diff --git a/src/csharp/Grpc.HealthCheck/project.json b/src/csharp/Grpc.HealthCheck/project.json index d2acce5cf4b..2a7ec78852d 100644 --- a/src/csharp/Grpc.HealthCheck/project.json +++ b/src/csharp/Grpc.HealthCheck/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0", + "version": "1.2.1-pre1", "title": "gRPC C# Healthchecking", "authors": [ "Google Inc." ], "copyright": "Copyright 2015, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0", + "Grpc.Core": "1.2.1-pre1", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/Grpc.Reflection/project.json b/src/csharp/Grpc.Reflection/project.json index 8b7a46aa4a1..18bc2d8d699 100644 --- a/src/csharp/Grpc.Reflection/project.json +++ b/src/csharp/Grpc.Reflection/project.json @@ -1,5 +1,5 @@ { - "version": "1.2.0", + "version": "1.2.1-pre1", "title": "gRPC C# Reflection", "authors": [ "Google Inc." ], "copyright": "Copyright 2016, Google Inc.", @@ -21,7 +21,7 @@ } }, "dependencies": { - "Grpc.Core": "1.2.0", + "Grpc.Core": "1.2.1-pre1", "Google.Protobuf": "3.2.0" }, "frameworks": { diff --git a/src/csharp/build_packages_dotnetcli.bat b/src/csharp/build_packages_dotnetcli.bat index 8180098c01e..e4f75d3ba01 100755 --- a/src/csharp/build_packages_dotnetcli.bat +++ b/src/csharp/build_packages_dotnetcli.bat @@ -28,7 +28,7 @@ @rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @rem Current package versions -set VERSION=1.2.0 +set VERSION=1.2.1-pre1 set PROTOBUF_VERSION=3.0.0 @rem Adjust the location of nuget.exe diff --git a/src/csharp/build_packages_dotnetcli.sh b/src/csharp/build_packages_dotnetcli.sh index b758f3fc84b..a5a6b6108a8 100755 --- a/src/csharp/build_packages_dotnetcli.sh +++ b/src/csharp/build_packages_dotnetcli.sh @@ -66,7 +66,7 @@ dotnet pack --configuration Release Grpc.Auth/project.json --output ../../artifa dotnet pack --configuration Release Grpc.HealthCheck/project.json --output ../../artifacts dotnet pack --configuration Release Grpc.Reflection/project.json --output ../../artifacts -nuget pack Grpc.nuspec -Version "1.2.0" -OutputDirectory ../../artifacts -nuget pack Grpc.Tools.nuspec -Version "1.2.0" -OutputDirectory ../../artifacts +nuget pack Grpc.nuspec -Version "1.2.1-pre1" -OutputDirectory ../../artifacts +nuget pack Grpc.Tools.nuspec -Version "1.2.1-pre1" -OutputDirectory ../../artifacts (cd ../../artifacts && zip csharp_nugets_dotnetcli.zip *.nupkg) diff --git a/src/node/health_check/package.json b/src/node/health_check/package.json index 31b4ed24ad6..a3966a4abbf 100644 --- a/src/node/health_check/package.json +++ b/src/node/health_check/package.json @@ -1,6 +1,6 @@ { "name": "grpc-health-check", - "version": "1.2.0", + "version": "1.2.1-pre1", "author": "Google Inc.", "description": "Health check service for use with gRPC", "repository": { @@ -15,7 +15,7 @@ } ], "dependencies": { - "grpc": "^1.2.0", + "grpc": "^1.2.1-pre1", "lodash": "^3.9.3", "google-protobuf": "^3.0.0" }, diff --git a/src/node/tools/package.json b/src/node/tools/package.json index 8370fa65a4f..de64cca844b 100644 --- a/src/node/tools/package.json +++ b/src/node/tools/package.json @@ -1,6 +1,6 @@ { "name": "grpc-tools", - "version": "1.2.0", + "version": "1.2.1-pre1", "author": "Google Inc.", "description": "Tools for developing with gRPC on Node.js", "homepage": "http://www.grpc.io/", diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec index 4b8faf75828..906fea86b71 100644 --- a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec +++ b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # exclamation mark ensures that other "regular" pods will be able to find it as it'll be installed # before them. s.name = '!ProtoCompiler-gRPCPlugin' - v = '1.2.0' + v = '1.2.1-pre1' s.version = v s.summary = 'The gRPC ProtoC plugin generates Objective-C files from .proto services.' s.description = <<-DESC diff --git a/src/objective-c/GRPCClient/private/version.h b/src/objective-c/GRPCClient/private/version.h index 346763326e9..a623d2d772c 100644 --- a/src/objective-c/GRPCClient/private/version.h +++ b/src/objective-c/GRPCClient/private/version.h @@ -38,4 +38,4 @@ // `tools/buildgen/generate_projects.sh`. -#define GRPC_OBJC_VERSION_STRING @"1.2.0" +#define GRPC_OBJC_VERSION_STRING @"1.2.1-pre1" diff --git a/src/php/composer.json b/src/php/composer.json index 491e34795ac..ee7616b45df 100644 --- a/src/php/composer.json +++ b/src/php/composer.json @@ -2,7 +2,7 @@ "name": "grpc/grpc-dev", "description": "gRPC library for PHP - for Developement use only", "license": "BSD-3-Clause", - "version": "1.2.0", + "version": "1.2.1", "require": { "php": ">=5.5.0", "google/protobuf": "^v3.1.0" diff --git a/src/python/grpcio/grpc_version.py b/src/python/grpcio/grpc_version.py index 1da40ca19f9..5a0cf4df2e3 100644 --- a/src/python/grpcio/grpc_version.py +++ b/src/python/grpcio/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_version.py.template`!!! -VERSION='1.2.0' +VERSION='1.2.1rc1' diff --git a/src/python/grpcio_health_checking/grpc_version.py b/src/python/grpcio_health_checking/grpc_version.py index 362f21f4586..c401cdbbcaa 100644 --- a/src/python/grpcio_health_checking/grpc_version.py +++ b/src/python/grpcio_health_checking/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_health_checking/grpc_version.py.template`!!! -VERSION='1.2.0' +VERSION='1.2.1rc1' diff --git a/src/python/grpcio_reflection/grpc_version.py b/src/python/grpcio_reflection/grpc_version.py index 79b7c1d665f..83f5d950b14 100644 --- a/src/python/grpcio_reflection/grpc_version.py +++ b/src/python/grpcio_reflection/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_reflection/grpc_version.py.template`!!! -VERSION='1.2.0' +VERSION='1.2.1rc1' diff --git a/src/python/grpcio_tests/grpc_version.py b/src/python/grpcio_tests/grpc_version.py index 722093ddd31..3613aeee130 100644 --- a/src/python/grpcio_tests/grpc_version.py +++ b/src/python/grpcio_tests/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio_tests/grpc_version.py.template`!!! -VERSION='1.2.0' +VERSION='1.2.1rc1' diff --git a/src/ruby/lib/grpc/version.rb b/src/ruby/lib/grpc/version.rb index f35f74b852a..e9759ad206e 100644 --- a/src/ruby/lib/grpc/version.rb +++ b/src/ruby/lib/grpc/version.rb @@ -29,5 +29,5 @@ # GRPC contains the General RPC module. module GRPC - VERSION = '1.2.0' + VERSION = '1.2.1.pre1' end diff --git a/src/ruby/tools/version.rb b/src/ruby/tools/version.rb index af39467db12..a11e53cb2be 100644 --- a/src/ruby/tools/version.rb +++ b/src/ruby/tools/version.rb @@ -29,6 +29,6 @@ module GRPC module Tools - VERSION = '1.2.0' + VERSION = '1.2.1.pre1' end end diff --git a/tools/distrib/python/grpcio_tools/grpc_version.py b/tools/distrib/python/grpcio_tools/grpc_version.py index 7829999e035..73f06ba875d 100644 --- a/tools/distrib/python/grpcio_tools/grpc_version.py +++ b/tools/distrib/python/grpcio_tools/grpc_version.py @@ -29,4 +29,4 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/tools/distrib/python/grpcio_tools/grpc_version.py.template`!!! -VERSION='1.2.0' +VERSION='1.2.1rc1' diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index 9d7bd84e922..8b69893696b 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0 +PROJECT_NUMBER = 1.2.1-pre1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index d64190ad7f6..823f9b01688 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -40,7 +40,7 @@ PROJECT_NAME = "GRPC C++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.2.0 +PROJECT_NUMBER = 1.2.1-pre1 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a From b4478ff26496ceb3b92c8ad768bfe02121c5d158 Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Mon, 20 Mar 2017 18:56:57 -0700 Subject: [PATCH 141/186] Comment --- src/core/ext/transport/cronet/transport/cronet_transport.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 4d80501ba84..50dee35786c 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -655,7 +655,9 @@ static void create_grpc_frame(grpc_slice_buffer *write_slice_buffer, *pp_write_buffer = write_buffer; uint8_t *p = (uint8_t *)write_buffer; /* Append 5 byte header */ + /* Compressed flag */ *p++ = (flags & GRPC_WRITE_INTERNAL_COMPRESS) ? 1 : 0; + /* Message length */ *p++ = (uint8_t)(length >> 24); *p++ = (uint8_t)(length >> 16); *p++ = (uint8_t)(length >> 8); From ea282e9c4cd422a1edcbdd30a81b8f58c8523063 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Mon, 20 Mar 2017 20:53:34 -0700 Subject: [PATCH 142/186] add passing test that kills a process while there are active watch chan state calls --- .../sig_int_during_channel_watch_client.rb | 70 +++++++++++++++++++ .../sig_int_during_channel_watch_driver.rb | 67 ++++++++++++++++++ .../helper_scripts/run_ruby_end2end_tests.sh | 1 + 3 files changed, 138 insertions(+) create mode 100755 src/ruby/end2end/sig_int_during_channel_watch_client.rb create mode 100755 src/ruby/end2end/sig_int_during_channel_watch_driver.rb diff --git a/src/ruby/end2end/sig_int_during_channel_watch_client.rb b/src/ruby/end2end/sig_int_during_channel_watch_client.rb new file mode 100755 index 00000000000..389fc5ba332 --- /dev/null +++ b/src/ruby/end2end/sig_int_during_channel_watch_client.rb @@ -0,0 +1,70 @@ +#!/usr/bin/env ruby + +# Copyright 2015, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +require_relative './end2end_common' + +# Start polling the channel state in both the main thread +# and a child thread. Try to get the driver to send process-ending +# interrupt while both a child thread and the main thread are in the +# middle of a blocking connectivity_state call. +def main + server_port = '' + OptionParser.new do |opts| + opts.on('--client_control_port=P', String) do + STDERR.puts 'client_control_port not used' + end + opts.on('--server_port=P', String) do |p| + server_port = p + end + end.parse! + + thd = Thread.new do + child_thread_channel = GRPC::Core::Channel.new("localhost:#{server_port}", + {}, + :this_channel_is_insecure) + loop do + state = child_thread_channel.connectivity_state(false) + child_thread_channel.watch_connectivity_state(state, Time.now + 360) + end + end + + main_channel = GRPC::Core::Channel.new("localhost:#{server_port}", + {}, + :this_channel_is_insecure) + loop do + state = main_channel.connectivity_state(false) + main_channel.watch_connectivity_state(state, Time.now + 360) + end + + thd.join +end + +main diff --git a/src/ruby/end2end/sig_int_during_channel_watch_driver.rb b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb new file mode 100755 index 00000000000..8c9fecd5493 --- /dev/null +++ b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb @@ -0,0 +1,67 @@ +#!/usr/bin/env ruby + +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# abruptly end a process that has active calls to +# Channel.watch_connectivity_state + +require_relative './end2end_common' + +def main + STDERR.puts 'start server' + server_runner = ServerRunner.new + server_port = server_runner.run + + sleep 1 + + STDERR.puts 'start client' + _, client_pid = start_client('sig_int_during_channel_watch_client.rb', + server_port) + + # give time for the client to get into the middle + # of a channel state watch call + sleep 1 + Process.kill('SIGINT', client_pid) + + begin + Timeout.timeout(10) do + Process.wait(client_pid) + end + rescue Timeout::Error + STDERR.puts "timeout wait for client pid #{client_pid}" + Process.kill('SIGKILL', client_pid) + Process.wait(client_pid) + STDERR.puts 'killed client child' + raise 'Timed out waiting for client process. It likely hangs when a ' \ + 'SIGINT is sent while there is an active connectivity_state call' + end +end + +main diff --git a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh index eb75878caf9..d7da6364d8f 100755 --- a/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh +++ b/tools/run_tests/helper_scripts/run_ruby_end2end_tests.sh @@ -37,4 +37,5 @@ EXIT_CODE=0 ruby src/ruby/end2end/sig_handling_driver.rb || EXIT_CODE=1 ruby src/ruby/end2end/channel_state_driver.rb || EXIT_CODE=1 ruby src/ruby/end2end/channel_closing_driver.rb || EXIT_CODE=1 +ruby src/ruby/end2end/sig_int_during_channel_watch_driver.rb || EXIT_CODE=1 exit $EXIT_CODE From d86d7424a0844e90bd4748b428e988443545051d Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 21 Mar 2017 07:38:46 -0700 Subject: [PATCH 143/186] Remove BUILD rule for removed test. --- test/core/client_channel/BUILD | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/core/client_channel/BUILD b/test/core/client_channel/BUILD index a29e9aca4e6..55a74c6d019 100644 --- a/test/core/client_channel/BUILD +++ b/test/core/client_channel/BUILD @@ -45,10 +45,3 @@ cc_test( deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util", "//test/core/end2end:cq_verifier"], copts = ['-std=c99'] ) - -cc_test( - name = "set_initial_connect_string_test", - srcs = ["set_initial_connect_string_test.c"], - deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"], - copts = ['-std=c99'] -) From 18f09a01f659e9004740766dfc5ab46e2aeea00e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 23 Feb 2017 17:10:04 -0800 Subject: [PATCH 144/186] Add benchmark suite for chttp2 --- CMakeLists.txt | 42 ++ Makefile | 48 ++ build.yaml | 20 + include/grpc++/support/channel_arguments.h | 4 +- src/core/lib/iomgr/closure.c | 4 + src/core/lib/iomgr/combiner.c | 2 + .../microbenchmarks/bm_chttp2_transport.cc | 587 ++++++++++++++++++ .../generated/sources_and_headers.json | 21 + tools/run_tests/generated/tests.json | 23 + 9 files changed, 749 insertions(+), 2 deletions(-) create mode 100644 test/cpp/microbenchmarks/bm_chttp2_transport.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 851aeb8401b..28d3b5152f4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -584,6 +584,9 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx bm_chttp2_hpack) endif() if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) +add_dependencies(buildtests_cxx bm_chttp2_transport) +endif() +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx bm_closure) endif() if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -7791,6 +7794,45 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) +add_executable(bm_chttp2_transport + test/cpp/microbenchmarks/bm_chttp2_transport.cc + third_party/googletest/src/gtest-all.cc +) + + +target_include_directories(bm_chttp2_transport + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${BORINGSSL_ROOT_DIR}/include + PRIVATE ${PROTOBUF_ROOT_DIR}/src + PRIVATE ${BENCHMARK_ROOT_DIR}/include + PRIVATE ${ZLIB_ROOT_DIR} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include + PRIVATE third_party/googletest/include + PRIVATE third_party/googletest + PRIVATE ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(bm_chttp2_transport + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_benchmark + benchmark + grpc++_test_util + grpc_test_util + grpc++ + grpc + gpr_test_util + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + +endif() +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) +if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) + add_executable(bm_closure test/cpp/microbenchmarks/bm_closure.cc third_party/googletest/src/gtest-all.cc diff --git a/Makefile b/Makefile index d2104e973c8..ac70d1a6be5 100644 --- a/Makefile +++ b/Makefile @@ -1051,6 +1051,7 @@ auth_property_iterator_test: $(BINDIR)/$(CONFIG)/auth_property_iterator_test bm_arena: $(BINDIR)/$(CONFIG)/bm_arena bm_call_create: $(BINDIR)/$(CONFIG)/bm_call_create bm_chttp2_hpack: $(BINDIR)/$(CONFIG)/bm_chttp2_hpack +bm_chttp2_transport: $(BINDIR)/$(CONFIG)/bm_chttp2_transport bm_closure: $(BINDIR)/$(CONFIG)/bm_closure bm_cq: $(BINDIR)/$(CONFIG)/bm_cq bm_error: $(BINDIR)/$(CONFIG)/bm_error @@ -1475,6 +1476,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/bm_arena \ $(BINDIR)/$(CONFIG)/bm_call_create \ $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ + $(BINDIR)/$(CONFIG)/bm_chttp2_transport \ $(BINDIR)/$(CONFIG)/bm_closure \ $(BINDIR)/$(CONFIG)/bm_cq \ $(BINDIR)/$(CONFIG)/bm_error \ @@ -1592,6 +1594,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/bm_arena \ $(BINDIR)/$(CONFIG)/bm_call_create \ $(BINDIR)/$(CONFIG)/bm_chttp2_hpack \ + $(BINDIR)/$(CONFIG)/bm_chttp2_transport \ $(BINDIR)/$(CONFIG)/bm_closure \ $(BINDIR)/$(CONFIG)/bm_cq \ $(BINDIR)/$(CONFIG)/bm_error \ @@ -1939,6 +1942,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/bm_call_create || ( echo test bm_call_create failed ; exit 1 ) $(E) "[RUN] Testing bm_chttp2_hpack" $(Q) $(BINDIR)/$(CONFIG)/bm_chttp2_hpack || ( echo test bm_chttp2_hpack failed ; exit 1 ) + $(E) "[RUN] Testing bm_chttp2_transport" + $(Q) $(BINDIR)/$(CONFIG)/bm_chttp2_transport || ( echo test bm_chttp2_transport failed ; exit 1 ) $(E) "[RUN] Testing bm_closure" $(Q) $(BINDIR)/$(CONFIG)/bm_closure || ( echo test bm_closure failed ; exit 1 ) $(E) "[RUN] Testing bm_cq" @@ -12830,6 +12835,49 @@ endif endif +BM_CHTTP2_TRANSPORT_SRC = \ + test/cpp/microbenchmarks/bm_chttp2_transport.cc \ + +BM_CHTTP2_TRANSPORT_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BM_CHTTP2_TRANSPORT_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/bm_chttp2_transport: $(PROTOBUF_DEP) $(BM_CHTTP2_TRANSPORT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(BM_CHTTP2_TRANSPORT_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/bm_chttp2_transport + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/cpp/microbenchmarks/bm_chttp2_transport.o: $(LIBDIR)/$(CONFIG)/libgrpc_benchmark.a $(LIBDIR)/$(CONFIG)/libbenchmark.a $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_bm_chttp2_transport: $(BM_CHTTP2_TRANSPORT_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(BM_CHTTP2_TRANSPORT_OBJS:.o=.dep) +endif +endif + + BM_CLOSURE_SRC = \ test/cpp/microbenchmarks/bm_closure.cc \ diff --git a/build.yaml b/build.yaml index 80c9849ca4a..be31935cb01 100644 --- a/build.yaml +++ b/build.yaml @@ -3128,6 +3128,26 @@ targets: - mac - linux - posix +- name: bm_chttp2_transport + build: test + language: c++ + src: + - test/cpp/microbenchmarks/bm_chttp2_transport.cc + deps: + - grpc_benchmark + - benchmark + - grpc++_test_util + - grpc_test_util + - grpc++ + - grpc + - gpr_test_util + - gpr + args: + - --benchmark_min_time=0 + platforms: + - mac + - linux + - posix - name: bm_closure build: test language: c++ diff --git a/include/grpc++/support/channel_arguments.h b/include/grpc++/support/channel_arguments.h index 80a3bfda3d9..61307d61942 100644 --- a/include/grpc++/support/channel_arguments.h +++ b/include/grpc++/support/channel_arguments.h @@ -117,10 +117,10 @@ class ChannelArguments { /// Return (by value) a c grpc_channel_args structure which points to /// arguments owned by this ChannelArguments instance - grpc_channel_args c_channel_args() { + grpc_channel_args c_channel_args() const { grpc_channel_args out; out.num_args = args_.size(); - out.args = args_.empty() ? NULL : &args_[0]; + out.args = args_.empty() ? NULL : const_cast(&args_[0]); return out; } diff --git a/src/core/lib/iomgr/closure.c b/src/core/lib/iomgr/closure.c index 509c1ff95dd..6633fb68ecf 100644 --- a/src/core/lib/iomgr/closure.c +++ b/src/core/lib/iomgr/closure.c @@ -33,6 +33,7 @@ #include "src/core/lib/iomgr/closure.h" +#include #include #include @@ -124,6 +125,7 @@ void grpc_closure_run(grpc_exec_ctx *exec_ctx, grpc_closure *c, grpc_error *error) { GPR_TIMER_BEGIN("grpc_closure_run", 0); if (c != NULL) { + assert(c->cb); c->scheduler->vtable->run(exec_ctx, c, error); } else { GRPC_ERROR_UNREF(error); @@ -135,6 +137,7 @@ void grpc_closure_sched(grpc_exec_ctx *exec_ctx, grpc_closure *c, grpc_error *error) { GPR_TIMER_BEGIN("grpc_closure_sched", 0); if (c != NULL) { + assert(c->cb); c->scheduler->vtable->sched(exec_ctx, c, error); } else { GRPC_ERROR_UNREF(error); @@ -146,6 +149,7 @@ void grpc_closure_list_sched(grpc_exec_ctx *exec_ctx, grpc_closure_list *list) { grpc_closure *c = list->head; while (c != NULL) { grpc_closure *next = c->next_data.next; + assert(c->cb); c->scheduler->vtable->sched(exec_ctx, c, c->error_data.error); c = next; } diff --git a/src/core/lib/iomgr/combiner.c b/src/core/lib/iomgr/combiner.c index fa9966c3a69..2bc476bbef6 100644 --- a/src/core/lib/iomgr/combiner.c +++ b/src/core/lib/iomgr/combiner.c @@ -33,6 +33,7 @@ #include "src/core/lib/iomgr/combiner.h" +#include #include #include @@ -216,6 +217,7 @@ static void combiner_exec(grpc_exec_ctx *exec_ctx, grpc_combiner *lock, GPR_DEBUG, "C:%p grpc_combiner_execute c=%p cov=%d last=%" PRIdPTR, lock, cl, covered_by_poller, last)); GPR_ASSERT(last & STATE_UNORPHANED); // ensure lock has not been destroyed + assert(cl->cb); cl->error_data.scratch = pack_error_data((error_data){error, covered_by_poller}); if (covered_by_poller) { diff --git a/test/cpp/microbenchmarks/bm_chttp2_transport.cc b/test/cpp/microbenchmarks/bm_chttp2_transport.cc new file mode 100644 index 00000000000..254d57de205 --- /dev/null +++ b/test/cpp/microbenchmarks/bm_chttp2_transport.cc @@ -0,0 +1,587 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +/* Microbenchmarks around CHTTP2 transport operations */ + +#include +#include +#include +#include +#include +#include +#include +#include +extern "C" { +#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" +#include "src/core/ext/transport/chttp2/transport/internal.h" +#include "src/core/lib/iomgr/resource_quota.h" +#include "src/core/lib/slice/slice_internal.h" +#include "src/core/lib/transport/static_metadata.h" +} +#include "test/cpp/microbenchmarks/helpers.h" +#include "third_party/benchmark/include/benchmark/benchmark.h" + +auto &force_library_initialization = Library::get(); + +//////////////////////////////////////////////////////////////////////////////// +// Helper classes +// + +class DummyEndpoint : public grpc_endpoint { + public: + DummyEndpoint() { + static const grpc_endpoint_vtable my_vtable = {read, + write, + get_workqueue, + add_to_pollset, + add_to_pollset_set, + shutdown, + destroy, + get_resource_user, + get_peer, + get_fd}; + grpc_endpoint::vtable = &my_vtable; + ru_ = grpc_resource_user_create(Library::get().rq(), "dummy_endpoint"); + } + + void PushInput(grpc_exec_ctx *exec_ctx, grpc_slice slice) { + if (read_cb_ == nullptr) { + GPR_ASSERT(!have_slice_); + buffered_slice_ = slice; + have_slice_ = true; + return; + } + grpc_slice_buffer_add(slices_, slice); + grpc_closure_sched(exec_ctx, read_cb_, GRPC_ERROR_NONE); + read_cb_ = nullptr; + } + + private: + grpc_resource_user *ru_; + grpc_closure *read_cb_ = nullptr; + grpc_slice_buffer *slices_ = nullptr; + bool have_slice_ = false; + grpc_slice buffered_slice_; + + void QueueRead(grpc_exec_ctx *exec_ctx, grpc_slice_buffer *slices, + grpc_closure *cb) { + GPR_ASSERT(read_cb_ == nullptr); + if (have_slice_) { + have_slice_ = false; + grpc_slice_buffer_add(slices, buffered_slice_); + grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_NONE); + return; + } + read_cb_ = cb; + slices_ = slices; + } + + static void read(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_slice_buffer *slices, grpc_closure *cb) { + static_cast(ep)->QueueRead(exec_ctx, slices, cb); + } + + static void write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_slice_buffer *slices, grpc_closure *cb) { + grpc_closure_sched(exec_ctx, cb, GRPC_ERROR_NONE); + } + + static grpc_workqueue *get_workqueue(grpc_endpoint *ep) { return NULL; } + + static void add_to_pollset(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_pollset *pollset) {} + + static void add_to_pollset_set(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_pollset_set *pollset) {} + + static void shutdown(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep, + grpc_error *why) { + grpc_resource_user_shutdown(exec_ctx, + static_cast(ep)->ru_); + grpc_closure_sched(exec_ctx, static_cast(ep)->read_cb_, + why); + } + + static void destroy(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep) { + grpc_resource_user_unref(exec_ctx, static_cast(ep)->ru_); + delete static_cast(ep); + } + + static grpc_resource_user *get_resource_user(grpc_endpoint *ep) { + return static_cast(ep)->ru_; + } + static char *get_peer(grpc_endpoint *ep) { return gpr_strdup("test"); } + static int get_fd(grpc_endpoint *ep) { return 0; } +}; + +class Fixture { + public: + Fixture(const grpc::ChannelArguments &args, bool client) { + grpc_channel_args c_args = args.c_channel_args(); + ep_ = new DummyEndpoint; + t_ = grpc_create_chttp2_transport(exec_ctx(), &c_args, ep_, client); + grpc_chttp2_transport_start_reading(exec_ctx(), t_, NULL); + FlushExecCtx(); + } + + void FlushExecCtx() { grpc_exec_ctx_flush(&exec_ctx_); } + + ~Fixture() { + grpc_transport_destroy(&exec_ctx_, t_); + grpc_exec_ctx_finish(&exec_ctx_); + } + + grpc_chttp2_transport *chttp2_transport() { + return reinterpret_cast(t_); + } + grpc_transport *transport() { return t_; } + grpc_exec_ctx *exec_ctx() { return &exec_ctx_; } + + void PushInput(grpc_slice slice) { ep_->PushInput(exec_ctx(), slice); } + + private: + DummyEndpoint *ep_; + grpc_exec_ctx exec_ctx_ = GRPC_EXEC_CTX_INIT; + grpc_transport *t_; +}; + +static void DoNothing(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {} + +class Stream { + public: + Stream(Fixture *f) : f_(f) { + GRPC_STREAM_REF_INIT(&refcount_, 1, DoNothing, nullptr, "test_stream"); + stream_size_ = grpc_transport_stream_size(f->transport()); + stream_ = gpr_malloc(stream_size_); + arena_ = gpr_arena_create(4096); + } + + ~Stream() { + gpr_free(stream_); + gpr_arena_destroy(arena_); + } + + void Init(benchmark::State &state) { + memset(stream_, 0, stream_size_); + if ((state.iterations() & 0xffff) == 0) { + gpr_arena_destroy(arena_); + arena_ = gpr_arena_create(4096); + } + grpc_transport_init_stream(f_->exec_ctx(), f_->transport(), + static_cast(stream_), &refcount_, + NULL, arena_); + } + + void DestroyThen(grpc_closure *closure) { + grpc_transport_destroy_stream(f_->exec_ctx(), f_->transport(), + static_cast(stream_), closure); + } + + void Op(grpc_transport_stream_op *op) { + grpc_transport_perform_stream_op(f_->exec_ctx(), f_->transport(), + static_cast(stream_), op); + } + + grpc_chttp2_stream *chttp2_stream() { + return static_cast(stream_); + } + + private: + Fixture *f_; + grpc_stream_refcount refcount_; + gpr_arena *arena_; + size_t stream_size_; + void *stream_; +}; + +class Closure : public grpc_closure { + public: + virtual ~Closure() {} +}; + +template +std::unique_ptr MakeClosure( + F f, grpc_closure_scheduler *sched = grpc_schedule_on_exec_ctx) { + struct C : public Closure { + C(const F &f, grpc_closure_scheduler *sched) : f_(f) { + grpc_closure_init(this, Execute, this, sched); + } + F f_; + static void Execute(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { + static_cast(arg)->f_(exec_ctx, error); + } + }; + return std::unique_ptr(new C(f, sched)); +} + +template +grpc_closure *MakeOnceClosure( + F f, grpc_closure_scheduler *sched = grpc_schedule_on_exec_ctx) { + struct C : public grpc_closure { + C(const F &f) : f_(f) {} + F f_; + static void Execute(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { + static_cast(arg)->f_(exec_ctx, error); + delete static_cast(arg); + } + }; + auto *c = new C{f}; + return grpc_closure_init(c, C::Execute, c, sched); +} + +//////////////////////////////////////////////////////////////////////////////// +// Benchmarks +// + +static void BM_StreamCreateDestroy(benchmark::State &state) { + TrackCounters track_counters; + Fixture f(grpc::ChannelArguments(), true); + Stream s(&f); + std::unique_ptr next = + MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (!state.KeepRunning()) return; + s.Init(state); + s.DestroyThen(next.get()); + }); + grpc_closure_run(f.exec_ctx(), next.get(), GRPC_ERROR_NONE); + f.FlushExecCtx(); + track_counters.Finish(state); +} +BENCHMARK(BM_StreamCreateDestroy); + +class RepresentativeClientInitialMetadata { + public: + static std::vector GetElems(grpc_exec_ctx *exec_ctx) { + return { + GRPC_MDELEM_SCHEME_HTTP, GRPC_MDELEM_METHOD_POST, + grpc_mdelem_from_slices( + exec_ctx, GRPC_MDSTR_PATH, + grpc_slice_intern(grpc_slice_from_static_string("/foo/bar"))), + grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_AUTHORITY, + grpc_slice_intern(grpc_slice_from_static_string( + "foo.test.google.fr:1234"))), + GRPC_MDELEM_GRPC_ACCEPT_ENCODING_IDENTITY_COMMA_DEFLATE_COMMA_GZIP, + GRPC_MDELEM_TE_TRAILERS, + GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC, + grpc_mdelem_from_slices( + exec_ctx, GRPC_MDSTR_USER_AGENT, + grpc_slice_intern(grpc_slice_from_static_string( + "grpc-c/3.0.0-dev (linux; chttp2; green)")))}; + } +}; + +template +static void BM_StreamCreateSendInitialMetadataDestroy(benchmark::State &state) { + TrackCounters track_counters; + Fixture f(grpc::ChannelArguments(), true); + Stream s(&f); + grpc_transport_stream_op op; + std::unique_ptr start; + std::unique_ptr done; + + grpc_metadata_batch b; + grpc_metadata_batch_init(&b); + b.deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + std::vector elems = Metadata::GetElems(f.exec_ctx()); + std::vector storage(elems.size()); + for (size_t i = 0; i < elems.size(); i++) { + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "addmd", + grpc_metadata_batch_add_tail(f.exec_ctx(), &b, &storage[i], elems[i]))); + } + + f.FlushExecCtx(); + start = MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (!state.KeepRunning()) return; + s.Init(state); + memset(&op, 0, sizeof(op)); + op.on_complete = done.get(); + op.send_initial_metadata = &b; + s.Op(&op); + }); + done = MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + memset(&op, 0, sizeof(op)); + op.cancel_error = GRPC_ERROR_CANCELLED; + s.Op(&op); + s.DestroyThen(start.get()); + }); + grpc_closure_sched(f.exec_ctx(), start.get(), GRPC_ERROR_NONE); + f.FlushExecCtx(); + grpc_metadata_batch_destroy(f.exec_ctx(), &b); + track_counters.Finish(state); +} +BENCHMARK_TEMPLATE(BM_StreamCreateSendInitialMetadataDestroy, + RepresentativeClientInitialMetadata); + +static void BM_TransportEmptyOp(benchmark::State &state) { + TrackCounters track_counters; + Fixture f(grpc::ChannelArguments(), true); + Stream s(&f); + s.Init(state); + grpc_transport_stream_op op; + std::unique_ptr c = + MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (!state.KeepRunning()) return; + memset(&op, 0, sizeof(op)); + op.on_complete = c.get(); + s.Op(&op); + }); + grpc_closure_sched(f.exec_ctx(), c.get(), GRPC_ERROR_NONE); + f.FlushExecCtx(); + s.DestroyThen( + MakeOnceClosure([](grpc_exec_ctx *exec_ctx, grpc_error *error) {})); + f.FlushExecCtx(); + track_counters.Finish(state); +} +BENCHMARK(BM_TransportEmptyOp); + +static void BM_TransportStreamSend(benchmark::State &state) { + TrackCounters track_counters; + Fixture f(grpc::ChannelArguments(), true); + Stream s(&f); + s.Init(state); + grpc_transport_stream_op op; + grpc_slice_buffer_stream send_stream; + grpc_slice_buffer send_buffer; + grpc_slice_buffer_init(&send_buffer); + grpc_slice_buffer_add(&send_buffer, gpr_slice_malloc(state.range(0))); + memset(GRPC_SLICE_START_PTR(send_buffer.slices[0]), 0, + GRPC_SLICE_LENGTH(send_buffer.slices[0])); + + grpc_metadata_batch b; + grpc_metadata_batch_init(&b); + b.deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + std::vector elems = + RepresentativeClientInitialMetadata::GetElems(f.exec_ctx()); + std::vector storage(elems.size()); + for (size_t i = 0; i < elems.size(); i++) { + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "addmd", + grpc_metadata_batch_add_tail(f.exec_ctx(), &b, &storage[i], elems[i]))); + } + + std::unique_ptr c = + MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (!state.KeepRunning()) return; + // force outgoing window to be yuge + s.chttp2_stream()->outgoing_window_delta = 1024 * 1024 * 1024; + f.chttp2_transport()->outgoing_window = 1024 * 1024 * 1024; + grpc_slice_buffer_stream_init(&send_stream, &send_buffer, 0); + memset(&op, 0, sizeof(op)); + op.on_complete = c.get(); + op.send_message = &send_stream.base; + s.Op(&op); + }); + + memset(&op, 0, sizeof(op)); + op.send_initial_metadata = &b; + op.on_complete = c.get(); + s.Op(&op); + + f.FlushExecCtx(); + memset(&op, 0, sizeof(op)); + op.cancel_error = GRPC_ERROR_CANCELLED; + s.Op(&op); + s.DestroyThen( + MakeOnceClosure([](grpc_exec_ctx *exec_ctx, grpc_error *error) {})); + f.FlushExecCtx(); + track_counters.Finish(state); + grpc_metadata_batch_destroy(f.exec_ctx(), &b); + grpc_slice_buffer_destroy(&send_buffer); +} +BENCHMARK(BM_TransportStreamSend)->Range(0, 128 * 1024 * 1024); + +#define SLICE_FROM_BUFFER(s) grpc_slice_from_static_buffer(s, sizeof(s) - 1) + +static grpc_slice CreateIncomingDataSlice(size_t length, size_t frame_size) { + std::queue unframed; + + unframed.push(static_cast(0)); + unframed.push(static_cast(length >> 24)); + unframed.push(static_cast(length >> 16)); + unframed.push(static_cast(length >> 8)); + unframed.push(static_cast(length)); + for (size_t i = 0; i < length; i++) { + unframed.push('a'); + } + + std::vector framed; + while (unframed.size() > frame_size) { + // frame size + framed.push_back(static_cast(frame_size >> 16)); + framed.push_back(static_cast(frame_size >> 8)); + framed.push_back(static_cast(frame_size)); + // data frame + framed.push_back(0); + // no flags + framed.push_back(0); + // stream id + framed.push_back(0); + framed.push_back(0); + framed.push_back(0); + framed.push_back(1); + // frame data + for (size_t i = 0; i < frame_size; i++) { + framed.push_back(unframed.front()); + unframed.pop(); + } + } + + // frame size + framed.push_back(static_cast(unframed.size() >> 16)); + framed.push_back(static_cast(unframed.size() >> 8)); + framed.push_back(static_cast(unframed.size())); + // data frame + framed.push_back(0); + // no flags + framed.push_back(0); + // stream id + framed.push_back(0); + framed.push_back(0); + framed.push_back(0); + framed.push_back(1); + while (!unframed.empty()) { + framed.push_back(unframed.front()); + unframed.pop(); + } + + return grpc_slice_from_copied_buffer(framed.data(), framed.size()); +} + +static void BM_TransportStreamRecv(benchmark::State &state) { + TrackCounters track_counters; + Fixture f(grpc::ChannelArguments(), true); + Stream s(&f); + s.Init(state); + grpc_transport_stream_op op; + grpc_byte_stream *recv_stream; + grpc_slice incoming_data = CreateIncomingDataSlice(state.range(0), 16384); + + grpc_metadata_batch b; + grpc_metadata_batch_init(&b); + grpc_metadata_batch b_recv; + grpc_metadata_batch_init(&b_recv); + b.deadline = gpr_inf_future(GPR_CLOCK_MONOTONIC); + std::vector elems = + RepresentativeClientInitialMetadata::GetElems(f.exec_ctx()); + std::vector storage(elems.size()); + for (size_t i = 0; i < elems.size(); i++) { + GPR_ASSERT(GRPC_LOG_IF_ERROR( + "addmd", + grpc_metadata_batch_add_tail(f.exec_ctx(), &b, &storage[i], elems[i]))); + } + + std::unique_ptr do_nothing = + MakeClosure([](grpc_exec_ctx *exec_ctx, grpc_error *error) {}); + + uint32_t received; + + std::unique_ptr drain_start; + std::unique_ptr drain; + std::unique_ptr drain_continue; + grpc_slice recv_slice; + + std::unique_ptr c = + MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (!state.KeepRunning()) return; + // force outgoing window to be yuge + s.chttp2_stream()->incoming_window_delta = 1024 * 1024 * 1024; + f.chttp2_transport()->incoming_window = 1024 * 1024 * 1024; + received = 0; + memset(&op, 0, sizeof(op)); + op.on_complete = do_nothing.get(); + op.recv_message = &recv_stream; + op.recv_message_ready = drain_start.get(); + s.Op(&op); + f.PushInput(grpc_slice_ref(incoming_data)); + }); + + drain_start = MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + if (recv_stream == NULL) { + GPR_ASSERT(!state.KeepRunning()); + return; + } + grpc_closure_run(exec_ctx, drain.get(), GRPC_ERROR_NONE); + }); + + drain = MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + do { + if (received == recv_stream->length) { + grpc_byte_stream_destroy(exec_ctx, recv_stream); + grpc_closure_sched(exec_ctx, c.get(), GRPC_ERROR_NONE); + return; + } + } while (grpc_byte_stream_next(exec_ctx, recv_stream, &recv_slice, + recv_stream->length - received, + drain_continue.get())); + }); + + drain_continue = MakeClosure([&](grpc_exec_ctx *exec_ctx, grpc_error *error) { + received += GRPC_SLICE_LENGTH(recv_slice); + grpc_slice_unref_internal(exec_ctx, recv_slice); + grpc_closure_run(exec_ctx, drain.get(), GRPC_ERROR_NONE); + }); + + memset(&op, 0, sizeof(op)); + op.send_initial_metadata = &b; + op.recv_initial_metadata = &b_recv; + op.on_complete = c.get(); + s.Op(&op); + f.PushInput(SLICE_FROM_BUFFER( + "\x00\x00\x00\x04\x00\x00\x00\x00\x00" + // Generated using: + // tools/codegen/core/gen_header_frame.py < + // test/cpp/microbenchmarks/representative_server_initial_metadata.headers + "\x00\x00X\x01\x04\x00\x00\x00\x01" + "\x10\x07:status\x03" + "200" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip")); + + f.FlushExecCtx(); + memset(&op, 0, sizeof(op)); + op.cancel_error = GRPC_ERROR_CANCELLED; + s.Op(&op); + s.DestroyThen( + MakeOnceClosure([](grpc_exec_ctx *exec_ctx, grpc_error *error) {})); + f.FlushExecCtx(); + track_counters.Finish(state); + grpc_metadata_batch_destroy(f.exec_ctx(), &b); + grpc_metadata_batch_destroy(f.exec_ctx(), &b_recv); + grpc_slice_unref(incoming_data); +} +BENCHMARK(BM_TransportStreamRecv)->Range(0, 128 * 1024 * 1024); + +BENCHMARK_MAIN(); diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 9160b0d9d67..2e272e654fa 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -2507,6 +2507,27 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "benchmark", + "gpr", + "gpr_test_util", + "grpc", + "grpc++", + "grpc++_test_util", + "grpc_benchmark", + "grpc_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c++", + "name": "bm_chttp2_transport", + "src": [ + "test/cpp/microbenchmarks/bm_chttp2_transport.cc" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "benchmark", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 1af05162b4f..2dc5198ca88 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -2695,6 +2695,28 @@ "posix" ] }, + { + "args": [ + "--benchmark_min_time=0" + ], + "ci_platforms": [ + "linux", + "mac", + "posix" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": false, + "language": "c++", + "name": "bm_chttp2_transport", + "platforms": [ + "linux", + "mac", + "posix" + ] + }, { "args": [ "--benchmark_min_time=0" @@ -117505,6 +117527,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false From e718647ed074862c8e96663c64f6c3cdf414541f Mon Sep 17 00:00:00 2001 From: Eric Pinzur Date: Tue, 21 Mar 2017 10:50:18 -0500 Subject: [PATCH 145/186] fix the namespacing for php docs on clients --- src/compiler/php_generator.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/php_generator.cc b/src/compiler/php_generator.cc index fba8cbaa97b..7d51d403013 100644 --- a/src/compiler/php_generator.cc +++ b/src/compiler/php_generator.cc @@ -118,7 +118,7 @@ void PrintService(const ServiceDescriptor *service, Printer *out) { out->Print( "/**\n * @param string $$hostname hostname\n" " * @param array $$opts channel options\n" - " * @param Grpc\\Channel $$channel (optional) re-use channel " + " * @param \\Grpc\\Channel $$channel (optional) re-use channel " "object\n */\n" "public function __construct($$hostname, $$opts, " "$$channel = null) {\n"); From 94f3dddfdc584b9de7e61f14e97183833dc5672e Mon Sep 17 00:00:00 2001 From: Muxi Yan Date: Tue, 21 Mar 2017 10:34:12 -0700 Subject: [PATCH 146/186] clang-format --- src/core/ext/transport/cronet/transport/cronet_transport.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c index 50dee35786c..67bf6bb1519 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.c +++ b/src/core/ext/transport/cronet/transport/cronet_transport.c @@ -735,8 +735,7 @@ static void convert_metadata_to_cronet_headers( *p_num_headers = (size_t)num_headers; } -static void parse_grpc_header(const uint8_t *data, - int *length, +static void parse_grpc_header(const uint8_t *data, int *length, bool *compressed) { const uint8_t c = *data; const uint8_t *p = data + 1; From f7c2cd274efc143549028b40e2b6e6be8d260b76 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Tue, 21 Mar 2017 13:10:20 -0700 Subject: [PATCH 147/186] Ran generate_projects.sh. --- tools/run_tests/generated/tests.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 4f84507041a..dc4de218b68 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -117481,6 +117481,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false From ac433cf640d90f405edb6d7740140bcdf542aff1 Mon Sep 17 00:00:00 2001 From: Ken Payson Date: Mon, 20 Mar 2017 14:44:49 -0700 Subject: [PATCH 148/186] Assert on thread creation --- src/core/lib/iomgr/ev_poll_posix.c | 2 +- src/core/lib/iomgr/executor.c | 4 ++-- src/core/lib/profiling/basic_timers.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/lib/iomgr/ev_poll_posix.c b/src/core/lib/iomgr/ev_poll_posix.c index 5ddd5313e2b..789ef22c557 100644 --- a/src/core/lib/iomgr/ev_poll_posix.c +++ b/src/core/lib/iomgr/ev_poll_posix.c @@ -1421,7 +1421,7 @@ static int cvfd_poll(struct pollfd *fds, nfds_t nfds, int timeout) { g_cvfds.pollcount++; opt = gpr_thd_options_default(); gpr_thd_options_set_detached(&opt); - gpr_thd_new(&t_id, &run_poll, pargs, &opt); + GPR_ASSERT(gpr_thd_new(&t_id, &run_poll, pargs, &opt)); // We want the poll() thread to trigger the deadline, so wait forever here gpr_cv_wait(pollcv, &g_cvfds.mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); if (gpr_atm_no_barrier_load(&pargs->status) == COMPLETED) { diff --git a/src/core/lib/iomgr/executor.c b/src/core/lib/iomgr/executor.c index a5b62aa8888..ae3e2eabc39 100644 --- a/src/core/lib/iomgr/executor.c +++ b/src/core/lib/iomgr/executor.c @@ -115,8 +115,8 @@ static void maybe_spawn_locked() { /* All previous instances of the thread should have been joined at this point. * Spawn time! */ g_executor.busy = 1; - gpr_thd_new(&g_executor.tid, closure_exec_thread_func, NULL, - &g_executor.options); + GPR_ASSERT(gpr_thd_new(&g_executor.tid, closure_exec_thread_func, NULL, + &g_executor.options)); g_executor.pending_join = 1; } diff --git a/src/core/lib/profiling/basic_timers.c b/src/core/lib/profiling/basic_timers.c index 1f1987fb8e7..bc8e27714ca 100644 --- a/src/core/lib/profiling/basic_timers.c +++ b/src/core/lib/profiling/basic_timers.c @@ -218,7 +218,7 @@ void gpr_timers_set_log_filename(const char *filename) { static void init_output() { gpr_thd_options options = gpr_thd_options_default(); gpr_thd_options_set_joinable(&options); - gpr_thd_new(&g_writing_thread, writing_thread, NULL, &options); + GPR_ASSERT(gpr_thd_new(&g_writing_thread, writing_thread, NULL, &options)); atexit(finish_writing); } From e63cde9f7d187371387666b5da0aaed9bf839c49 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Tue, 21 Mar 2017 14:44:55 -0700 Subject: [PATCH 149/186] Fix sanity, generated projects --- tools/run_tests/generated/tests.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 1af05162b4f..8c708f09ee3 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -117505,6 +117505,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false From bf18428740ebf0f36b68fcf9b7d427538e074a31 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Tue, 21 Mar 2017 15:18:58 -0700 Subject: [PATCH 150/186] Introduce grpc_completion_queue_factory API Just the API and a bare-bone implementation --- CMakeLists.txt | 5 ++ Makefile | 5 ++ binding.gyp | 1 + build.yaml | 2 + config.m4 | 1 + gRPC-Core.podspec | 3 + grpc.def | 3 + grpc.gemspec | 2 + include/grpc/grpc.h | 64 ++++++++++++++++ package.xml | 2 + .../lib/surface/completion_queue_factory.c | 75 +++++++++++++++++++ .../lib/surface/completion_queue_factory.h | 51 +++++++++++++ src/python/grpcio/grpc_core_dependencies.py | 1 + src/ruby/ext/grpc/rb_grpc_imports.generated.c | 6 ++ src/ruby/ext/grpc/rb_grpc_imports.generated.h | 9 +++ tools/doxygen/Doxyfile.core.internal | 2 + .../generated/sources_and_headers.json | 3 + tools/run_tests/generated/tests.json | 1 + vsprojects/vcxproj/grpc/grpc.vcxproj | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 6 ++ .../grpc_test_util/grpc_test_util.vcxproj | 3 + .../grpc_test_util.vcxproj.filters | 6 ++ .../grpc_unsecure/grpc_unsecure.vcxproj | 3 + .../grpc_unsecure.vcxproj.filters | 6 ++ 24 files changed, 263 insertions(+) create mode 100644 src/core/lib/surface/completion_queue_factory.c create mode 100644 src/core/lib/surface/completion_queue_factory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 851aeb8401b..950b8b62e7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -965,6 +965,7 @@ add_library(grpc src/core/lib/surface/channel_ping.c src/core/lib/surface/channel_stack_type.c src/core/lib/surface/completion_queue.c + src/core/lib/surface/completion_queue_factory.c src/core/lib/surface/event_string.c src/core/lib/surface/lame_client.c src/core/lib/surface/metadata_array.c @@ -1277,6 +1278,7 @@ add_library(grpc_cronet src/core/lib/surface/channel_ping.c src/core/lib/surface/channel_stack_type.c src/core/lib/surface/completion_queue.c + src/core/lib/surface/completion_queue_factory.c src/core/lib/surface/event_string.c src/core/lib/surface/lame_client.c src/core/lib/surface/metadata_array.c @@ -1580,6 +1582,7 @@ add_library(grpc_test_util src/core/lib/surface/channel_ping.c src/core/lib/surface/channel_stack_type.c src/core/lib/surface/completion_queue.c + src/core/lib/surface/completion_queue_factory.c src/core/lib/surface/event_string.c src/core/lib/surface/lame_client.c src/core/lib/surface/metadata_array.c @@ -1829,6 +1832,7 @@ add_library(grpc_unsecure src/core/lib/surface/channel_ping.c src/core/lib/surface/channel_stack_type.c src/core/lib/surface/completion_queue.c + src/core/lib/surface/completion_queue_factory.c src/core/lib/surface/event_string.c src/core/lib/surface/lame_client.c src/core/lib/surface/metadata_array.c @@ -2439,6 +2443,7 @@ add_library(grpc++_cronet src/core/lib/surface/channel_ping.c src/core/lib/surface/channel_stack_type.c src/core/lib/surface/completion_queue.c + src/core/lib/surface/completion_queue_factory.c src/core/lib/surface/event_string.c src/core/lib/surface/lame_client.c src/core/lib/surface/metadata_array.c diff --git a/Makefile b/Makefile index d2104e973c8..9a8a44b7d1b 100644 --- a/Makefile +++ b/Makefile @@ -2857,6 +2857,7 @@ LIBGRPC_SRC = \ src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ @@ -3172,6 +3173,7 @@ LIBGRPC_CRONET_SRC = \ src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ @@ -3478,6 +3480,7 @@ LIBGRPC_TEST_UTIL_SRC = \ src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ @@ -3707,6 +3710,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ @@ -4319,6 +4323,7 @@ LIBGRPC++_CRONET_SRC = \ src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ diff --git a/binding.gyp b/binding.gyp index f79374a4469..957c343e4f1 100644 --- a/binding.gyp +++ b/binding.gyp @@ -711,6 +711,7 @@ 'src/core/lib/surface/channel_ping.c', 'src/core/lib/surface/channel_stack_type.c', 'src/core/lib/surface/completion_queue.c', + 'src/core/lib/surface/completion_queue_factory.c', 'src/core/lib/surface/event_string.c', 'src/core/lib/surface/lame_client.c', 'src/core/lib/surface/metadata_array.c', diff --git a/build.yaml b/build.yaml index 80c9849ca4a..8f339bdd08c 100644 --- a/build.yaml +++ b/build.yaml @@ -261,6 +261,7 @@ filegroups: - src/core/lib/surface/channel_init.h - src/core/lib/surface/channel_stack_type.h - src/core/lib/surface/completion_queue.h + - src/core/lib/surface/completion_queue_factory.h - src/core/lib/surface/event_string.h - src/core/lib/surface/init.h - src/core/lib/surface/lame_client.h @@ -383,6 +384,7 @@ filegroups: - src/core/lib/surface/channel_ping.c - src/core/lib/surface/channel_stack_type.c - src/core/lib/surface/completion_queue.c + - src/core/lib/surface/completion_queue_factory.c - src/core/lib/surface/event_string.c - src/core/lib/surface/lame_client.c - src/core/lib/surface/metadata_array.c diff --git a/config.m4 b/config.m4 index 3194b266690..0ca8c499f9e 100644 --- a/config.m4 +++ b/config.m4 @@ -184,6 +184,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/surface/channel_ping.c \ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/completion_queue.c \ + src/core/lib/surface/completion_queue_factory.c \ src/core/lib/surface/event_string.c \ src/core/lib/surface/lame_client.c \ src/core/lib/surface/metadata_array.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 2444ffa57ab..b5ff7a51c7d 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -342,6 +342,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/channel_init.h', 'src/core/lib/surface/channel_stack_type.h', 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.h', 'src/core/lib/surface/event_string.h', 'src/core/lib/surface/init.h', 'src/core/lib/surface/lame_client.h', @@ -554,6 +555,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/channel_ping.c', 'src/core/lib/surface/channel_stack_type.c', 'src/core/lib/surface/completion_queue.c', + 'src/core/lib/surface/completion_queue_factory.c', 'src/core/lib/surface/event_string.c', 'src/core/lib/surface/lame_client.c', 'src/core/lib/surface/metadata_array.c', @@ -782,6 +784,7 @@ Pod::Spec.new do |s| 'src/core/lib/surface/channel_init.h', 'src/core/lib/surface/channel_stack_type.h', 'src/core/lib/surface/completion_queue.h', + 'src/core/lib/surface/completion_queue_factory.h', 'src/core/lib/surface/event_string.h', 'src/core/lib/surface/init.h', 'src/core/lib/surface/lame_client.h', diff --git a/grpc.def b/grpc.def index 30d60b0d06d..1589316a588 100644 --- a/grpc.def +++ b/grpc.def @@ -53,6 +53,9 @@ EXPORTS grpc_shutdown grpc_version_string grpc_g_stands_for + grpc_completion_queue_factory_lookup + grpc_completion_queue_create_for_next + grpc_completion_queue_create_for_pluck grpc_completion_queue_create grpc_completion_queue_next grpc_completion_queue_pluck diff --git a/grpc.gemspec b/grpc.gemspec index 81e8733052b..d85cc5ebacb 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -259,6 +259,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/surface/channel_init.h ) s.files += %w( src/core/lib/surface/channel_stack_type.h ) s.files += %w( src/core/lib/surface/completion_queue.h ) + s.files += %w( src/core/lib/surface/completion_queue_factory.h ) s.files += %w( src/core/lib/surface/event_string.h ) s.files += %w( src/core/lib/surface/init.h ) s.files += %w( src/core/lib/surface/lame_client.h ) @@ -471,6 +472,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/surface/channel_ping.c ) s.files += %w( src/core/lib/surface/channel_stack_type.c ) s.files += %w( src/core/lib/surface/completion_queue.c ) + s.files += %w( src/core/lib/surface/completion_queue_factory.c ) s.files += %w( src/core/lib/surface/event_string.c ) s.files += %w( src/core/lib/surface/lame_client.c ) s.files += %w( src/core/lib/surface/metadata_array.c ) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 1b33d48c023..bcf64a6081a 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -93,6 +93,70 @@ GRPCAPI const char *grpc_version_string(void); /** Return a string specifying what the 'g' in gRPC stands for */ GRPCAPI const char *grpc_g_stands_for(void); +/** Specifies the type of APIs to use to pop events from the completion queue */ +typedef enum { + /* Events are popped out by calling grpc_completion_queue_next() API ONLY */ + GRPC_CQ_NEXT = 0, + + /* Events are popped out by calling grpc_completion_queue_pluck() API ONLY */ + GRPC_CQ_PLUCK +} grpc_cq_completion_type; + +/** Completion queues internally MAY maintain a set of file descriptors in a + structure called 'pollset'. This enum specifies if a completion queue has an + associated pollset and any restrictions on the type of file descriptors that + can be present in the pollset. + + I/O progress can only be made when grpc_completion_queue_next() or + grpc_completion_queue_pluck() are called on the completion queue (unless the + grpc_cq_polling_type is GRPC_CQ_NON_POLLING) and hence it is very important + to actively call these APIs */ +typedef enum { + /** The completion queue will have an associated pollset and there is no + restriction on the type of file descriptors the pollset may contain */ + GRPC_CQ_DEFAULT_POLLING, + + /* Similar to GRPC_CQ_DEFAULT_POLLING except that the completion queues will + not contain any 'listening file descriptors' (i.e file descriptors used to + listen to incoming channels) */ + GRPC_CQ_NON_LISTENING, + + /* The completion queue will not have an associated pollset. Note that + grpc_completion_queue_next() or grpc_completion_queue_pluck() MUST still be + called to pop events from the completion queue; it is not required to call + them actively to make I/O progress */ + GRPC_CQ_NON_POLLING +} grpc_cq_polling_type; + +typedef struct grpc_completion_queue_attributes { + /* The version number of this structure. More fields might be added to this + structure in future. */ + int version; /* Current version is 1 */ + + grpc_cq_completion_type cq_type; + + grpc_cq_polling_type cq_polling_type; +} grpc_completion_queue_attributes; + +/** The completion queue factory structure is opaque to the callers of grpc */ +typedef struct grpc_completion_queue_factory grpc_completion_queue_factory; + +/** Returns the completion queue factory based on the attributes. MAY return a + NULL if no factory can be found */ +GRPCAPI const grpc_completion_queue_factory * +grpc_completion_queue_factory_lookup( + const grpc_completion_queue_attributes *attributes); + +/** Helper function to create a completion queue with grpc_cq_completion_type + of GRPC_CQ_NEXT and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ +GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_next( + void *reserved); + +/** Helper function to create a completion queue with grpc_cq_completion_type + of GRPC_CQ_PLUCK and grpc_cq_polling_type of GRPC_CQ_DEFAULT_POLLING */ +GRPCAPI grpc_completion_queue *grpc_completion_queue_create_for_pluck( + void *reserved); + /** Create a completion queue */ GRPCAPI grpc_completion_queue *grpc_completion_queue_create(void *reserved); diff --git a/package.xml b/package.xml index c66706cfde7..a405c1f0434 100644 --- a/package.xml +++ b/package.xml @@ -268,6 +268,7 @@ + @@ -480,6 +481,7 @@ + diff --git a/src/core/lib/surface/completion_queue_factory.c b/src/core/lib/surface/completion_queue_factory.c new file mode 100644 index 00000000000..879b456ed5d --- /dev/null +++ b/src/core/lib/surface/completion_queue_factory.c @@ -0,0 +1,75 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/surface/completion_queue_factory.h" +#include "src/core/lib/surface/completion_queue.h" + +#include + +/* TODO (sreek) - Currently this does not use the attributes arg. This will be + added in a future PR */ +static grpc_completion_queue* default_create( + const grpc_completion_queue_factory* factory, + const grpc_completion_queue_attributes* attributes) { + return grpc_completion_queue_create(NULL); +} + +static grpc_completion_queue_factory_vtable default_vtable = {default_create}; + +static const grpc_completion_queue_factory g_default_cq_factory = { + "Default Factory", NULL, &default_vtable}; + +const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( + const grpc_completion_queue_attributes* attributes) { + /* As we add more fields to grpc_completion_queue_attributes, we may have to + change this assert */ + GPR_ASSERT(attributes->version == 1); + + /* The default factory can handle version 1 of the attributes structure. We + may have to change this as more fields are added to the structure */ + return &g_default_cq_factory; +} + +grpc_completion_queue* grpc_completion_queue_create_for_next(void* reserved) { + GPR_ASSERT(!reserved); + grpc_completion_queue_attributes attr = {1, GRPC_CQ_NEXT, + GRPC_CQ_DEFAULT_POLLING}; + return g_default_cq_factory.vtable->create(&g_default_cq_factory, &attr); +} + +grpc_completion_queue* grpc_completion_queue_create_for_pluck(void* reserved) { + GPR_ASSERT(!reserved); + grpc_completion_queue_attributes attr = {1, GRPC_CQ_NEXT, + GRPC_CQ_DEFAULT_POLLING}; + return g_default_cq_factory.vtable->create(&g_default_cq_factory, &attr); +} diff --git a/src/core/lib/surface/completion_queue_factory.h b/src/core/lib/surface/completion_queue_factory.h new file mode 100644 index 00000000000..57e90b50907 --- /dev/null +++ b/src/core/lib/surface/completion_queue_factory.h @@ -0,0 +1,51 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_LIB_SURFACE_COMPLETION_QUEUE_FACTORY_H +#define GRPC_CORE_LIB_SURFACE_COMPLETION_QUEUE_FACTORY_H + +#include +#include "src/core/lib/surface/completion_queue.h" + +typedef struct grpc_completion_queue_factory_vtable { + grpc_completion_queue* (*create)(const grpc_completion_queue_factory*, + const grpc_completion_queue_attributes*); +} grpc_completion_queue_factory_vtable; + +struct grpc_completion_queue_factory { + const char* name; + void* data; /* Factory specific data */ + grpc_completion_queue_factory_vtable* vtable; +}; + +#endif /* GRPC_CORE_LIB_SURFACE_COMPLETION_QUEUE_FACTORY_H */ diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 5fc748483a7..a9469046d4a 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -178,6 +178,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/surface/channel_ping.c', 'src/core/lib/surface/channel_stack_type.c', 'src/core/lib/surface/completion_queue.c', + 'src/core/lib/surface/completion_queue_factory.c', 'src/core/lib/surface/event_string.c', 'src/core/lib/surface/lame_client.c', 'src/core/lib/surface/metadata_array.c', diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.c b/src/ruby/ext/grpc/rb_grpc_imports.generated.c index 3ef6f0eb299..063f92114c0 100644 --- a/src/ruby/ext/grpc/rb_grpc_imports.generated.c +++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.c @@ -91,6 +91,9 @@ grpc_init_type grpc_init_import; grpc_shutdown_type grpc_shutdown_import; grpc_version_string_type grpc_version_string_import; grpc_g_stands_for_type grpc_g_stands_for_import; +grpc_completion_queue_factory_lookup_type grpc_completion_queue_factory_lookup_import; +grpc_completion_queue_create_for_next_type grpc_completion_queue_create_for_next_import; +grpc_completion_queue_create_for_pluck_type grpc_completion_queue_create_for_pluck_import; grpc_completion_queue_create_type grpc_completion_queue_create_import; grpc_completion_queue_next_type grpc_completion_queue_next_import; grpc_completion_queue_pluck_type grpc_completion_queue_pluck_import; @@ -385,6 +388,9 @@ void grpc_rb_load_imports(HMODULE library) { grpc_shutdown_import = (grpc_shutdown_type) GetProcAddress(library, "grpc_shutdown"); grpc_version_string_import = (grpc_version_string_type) GetProcAddress(library, "grpc_version_string"); grpc_g_stands_for_import = (grpc_g_stands_for_type) GetProcAddress(library, "grpc_g_stands_for"); + grpc_completion_queue_factory_lookup_import = (grpc_completion_queue_factory_lookup_type) GetProcAddress(library, "grpc_completion_queue_factory_lookup"); + grpc_completion_queue_create_for_next_import = (grpc_completion_queue_create_for_next_type) GetProcAddress(library, "grpc_completion_queue_create_for_next"); + grpc_completion_queue_create_for_pluck_import = (grpc_completion_queue_create_for_pluck_type) GetProcAddress(library, "grpc_completion_queue_create_for_pluck"); grpc_completion_queue_create_import = (grpc_completion_queue_create_type) GetProcAddress(library, "grpc_completion_queue_create"); grpc_completion_queue_next_import = (grpc_completion_queue_next_type) GetProcAddress(library, "grpc_completion_queue_next"); grpc_completion_queue_pluck_import = (grpc_completion_queue_pluck_type) GetProcAddress(library, "grpc_completion_queue_pluck"); diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h index ef9845dfe06..f5dcd68a8e9 100644 --- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h +++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h @@ -224,6 +224,15 @@ extern grpc_version_string_type grpc_version_string_import; typedef const char *(*grpc_g_stands_for_type)(void); extern grpc_g_stands_for_type grpc_g_stands_for_import; #define grpc_g_stands_for grpc_g_stands_for_import +typedef const grpc_completion_queue_factory *(*grpc_completion_queue_factory_lookup_type)(const grpc_completion_queue_attributes *attributes); +extern grpc_completion_queue_factory_lookup_type grpc_completion_queue_factory_lookup_import; +#define grpc_completion_queue_factory_lookup grpc_completion_queue_factory_lookup_import +typedef grpc_completion_queue *(*grpc_completion_queue_create_for_next_type)(void *reserved); +extern grpc_completion_queue_create_for_next_type grpc_completion_queue_create_for_next_import; +#define grpc_completion_queue_create_for_next grpc_completion_queue_create_for_next_import +typedef grpc_completion_queue *(*grpc_completion_queue_create_for_pluck_type)(void *reserved); +extern grpc_completion_queue_create_for_pluck_type grpc_completion_queue_create_for_pluck_import; +#define grpc_completion_queue_create_for_pluck grpc_completion_queue_create_for_pluck_import typedef grpc_completion_queue *(*grpc_completion_queue_create_type)(void *reserved); extern grpc_completion_queue_create_type grpc_completion_queue_create_import; #define grpc_completion_queue_create grpc_completion_queue_create_import diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 89223630980..d9690a07ede 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1308,6 +1308,8 @@ src/core/lib/surface/channel_stack_type.c \ src/core/lib/surface/channel_stack_type.h \ src/core/lib/surface/completion_queue.c \ src/core/lib/surface/completion_queue.h \ +src/core/lib/surface/completion_queue_factory.c \ +src/core/lib/surface/completion_queue_factory.h \ src/core/lib/surface/event_string.c \ src/core/lib/surface/event_string.h \ src/core/lib/surface/init.c \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 9160b0d9d67..e6e9c7c933d 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7547,6 +7547,7 @@ "src/core/lib/surface/channel_init.h", "src/core/lib/surface/channel_stack_type.h", "src/core/lib/surface/completion_queue.h", + "src/core/lib/surface/completion_queue_factory.h", "src/core/lib/surface/event_string.h", "src/core/lib/surface/init.h", "src/core/lib/surface/lame_client.h", @@ -7771,6 +7772,8 @@ "src/core/lib/surface/channel_stack_type.h", "src/core/lib/surface/completion_queue.c", "src/core/lib/surface/completion_queue.h", + "src/core/lib/surface/completion_queue_factory.c", + "src/core/lib/surface/completion_queue_factory.h", "src/core/lib/surface/event_string.c", "src/core/lib/surface/event_string.h", "src/core/lib/surface/init.h", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 1af05162b4f..8c708f09ee3 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -117505,6 +117505,7 @@ "language": "c", "name": "hpack_parser_fuzzer_test_one_entry", "platforms": [ + "mac", "linux" ], "uses_polling": false diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index 5e3b027663d..0123f3eb821 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -388,6 +388,7 @@ + @@ -705,6 +706,8 @@ + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index d75ca766c0d..f54379f0eef 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -310,6 +310,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface @@ -1046,6 +1049,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj index 62969e31acf..70a6d1806a1 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj @@ -283,6 +283,7 @@ + @@ -548,6 +549,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters index 30088101f5f..b4de56e564e 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters @@ -367,6 +367,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface @@ -830,6 +833,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 11ac8bd4b2b..8c2dcebfa26 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -378,6 +378,7 @@ + @@ -672,6 +673,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 414e2a50b89..b8ad369a5fc 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -313,6 +313,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface @@ -956,6 +959,9 @@ src\core\lib\surface + + src\core\lib\surface + src\core\lib\surface From 34319964851e5f0f42ea2ae49641957dffa68477 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 21 Mar 2017 15:48:15 -0700 Subject: [PATCH 151/186] Fix subchannel creation in pick_first and round_robin --- src/core/ext/lb_policy/pick_first/pick_first.c | 6 ++++-- src/core/ext/lb_policy/round_robin/round_robin.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/core/ext/lb_policy/pick_first/pick_first.c b/src/core/ext/lb_policy/pick_first/pick_first.c index e2a66d16bd7..179dcd6eac4 100644 --- a/src/core/ext/lb_policy/pick_first/pick_first.c +++ b/src/core/ext/lb_policy/pick_first/pick_first.c @@ -423,11 +423,13 @@ static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx, "This LB policy doesn't support user data. It will be ignored"); } + static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS}; memset(&sc_args, 0, sizeof(grpc_subchannel_args)); grpc_arg addr_arg = grpc_create_subchannel_address_arg(&addresses->addresses[i].address); - grpc_channel_args *new_args = - grpc_channel_args_copy_and_add(args->args, &addr_arg, 1); + grpc_channel_args *new_args = grpc_channel_args_copy_and_add_and_remove( + args->args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &addr_arg, + 1); gpr_free(addr_arg.value.string); sc_args.args = new_args; grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel( diff --git a/src/core/ext/lb_policy/round_robin/round_robin.c b/src/core/ext/lb_policy/round_robin/round_robin.c index f2d1d46179a..09562d30edc 100644 --- a/src/core/ext/lb_policy/round_robin/round_robin.c +++ b/src/core/ext/lb_policy/round_robin/round_robin.c @@ -709,11 +709,13 @@ static grpc_lb_policy *round_robin_create(grpc_exec_ctx *exec_ctx, /* Skip balancer addresses, since we only know how to handle backends. */ if (addresses->addresses[i].is_balancer) continue; + static const char *keys_to_remove[] = {GRPC_ARG_SUBCHANNEL_ADDRESS}; memset(&sc_args, 0, sizeof(grpc_subchannel_args)); grpc_arg addr_arg = grpc_create_subchannel_address_arg(&addresses->addresses[i].address); - grpc_channel_args *new_args = - grpc_channel_args_copy_and_add(args->args, &addr_arg, 1); + grpc_channel_args *new_args = grpc_channel_args_copy_and_add_and_remove( + args->args, keys_to_remove, GPR_ARRAY_SIZE(keys_to_remove), &addr_arg, + 1); gpr_free(addr_arg.value.string); sc_args.args = new_args; grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel( From c88fd35f979e18a74c9ffb761379f49a12db4cbb Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Tue, 21 Mar 2017 16:10:36 -0700 Subject: [PATCH 152/186] Add reproduction --- .../clusterfuzz-testcase-6723650944237568 | Bin 0 -> 669 bytes tools/run_tests/generated/tests.json | 23 ++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6723650944237568 diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6723650944237568 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6723650944237568 new file mode 100644 index 0000000000000000000000000000000000000000..e140fdc7050e4cb92899a40a5e98b498b48a0c13 GIT binary patch literal 669 zcmchUu};G<5J1mvQx&L?5TC$MV4x#XJ5V-u#B90ADMU0*basNez|sLerr*HCk91*W z0tq3xc4&r%1ti1`_E|c=yJy3m%oF&(;2Nn!0>)y>!xLRh!fUA%PKAsjLal+jVcM__ zgMOB|V)}fyw#4%nSAP_bs!Q5cQ;bGrQVA?mq#B})3~$7wNT!i%B2%G;SW*&sN&9rg z?)P_kEe`C}cNu$a_VL(r>vJ1g0R$c72dAU6%fSQj&h0Kz_wMl6!wpHL^UMg1VL?B_ zdwLZO=bVyM(o7W2PRJOQ`R;5RQKSBDAA8h>{F+@)8?3+RYh3p*W(FlA>u$~8mSBf$ W{yT?;(&ljiTU}Vd1%qXk`W#koWw Date: Tue, 21 Mar 2017 16:12:39 -0700 Subject: [PATCH 153/186] Add version macro --- include/grpc/grpc.h | 4 +++- src/core/lib/surface/completion_queue_factory.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index bcf64a6081a..fa4fd6d49d0 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -128,10 +128,12 @@ typedef enum { GRPC_CQ_NON_POLLING } grpc_cq_polling_type; + +#define GRPC_CQ_CURRENT_VERSION 1 typedef struct grpc_completion_queue_attributes { /* The version number of this structure. More fields might be added to this structure in future. */ - int version; /* Current version is 1 */ + int version; /* Set to GRPC_CQ_CURRENT_VERSION */ grpc_cq_completion_type cq_type; diff --git a/src/core/lib/surface/completion_queue_factory.c b/src/core/lib/surface/completion_queue_factory.c index 879b456ed5d..138dfeff484 100644 --- a/src/core/lib/surface/completion_queue_factory.c +++ b/src/core/lib/surface/completion_queue_factory.c @@ -52,7 +52,9 @@ static const grpc_completion_queue_factory g_default_cq_factory = { const grpc_completion_queue_factory* grpc_completion_queue_factory_lookup( const grpc_completion_queue_attributes* attributes) { /* As we add more fields to grpc_completion_queue_attributes, we may have to - change this assert */ + change this assert to: + GPR_ASSERT (attributes->version >= 1 && + attributes->version <= GRPC_CQ_CURRENT_VERSION) */ GPR_ASSERT(attributes->version == 1); /* The default factory can handle version 1 of the attributes structure. We From 48ed124138d5a6c58710fd6d89d2568733987959 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Tue, 21 Mar 2017 16:43:38 -0700 Subject: [PATCH 154/186] minor enum change --- include/grpc/grpc.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index fa4fd6d49d0..68c277cd086 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -96,7 +96,7 @@ GRPCAPI const char *grpc_g_stands_for(void); /** Specifies the type of APIs to use to pop events from the completion queue */ typedef enum { /* Events are popped out by calling grpc_completion_queue_next() API ONLY */ - GRPC_CQ_NEXT = 0, + GRPC_CQ_NEXT = 1, /* Events are popped out by calling grpc_completion_queue_pluck() API ONLY */ GRPC_CQ_PLUCK From 5b881460d24bc930339d1cfd37805a7eadeee5c0 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 21 Mar 2017 18:31:29 -0700 Subject: [PATCH 155/186] make fewer lock/unlock calls and loop on cv_wait in watch conn state --- src/ruby/ext/grpc/rb_channel.c | 40 +++++++++++------------- src/ruby/spec/channel_connection_spec.rb | 2 +- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index 1fe825efd64..c12ea921c98 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -78,6 +78,7 @@ typedef struct grpc_rb_channel { grpc_connectivity_state current_connectivity_state; int mu_init_done; + int abort_watch_connectivity_state; gpr_mu channel_mu; gpr_cv channel_cv; } grpc_rb_channel; @@ -193,6 +194,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { wrapper->mu_init_done = 1; gpr_mu_lock(&wrapper->channel_mu); + wrapper->abort_watch_connectivity_state = 0; wrapper->current_connectivity_state = grpc_channel_check_connectivity_state(wrapper->wrapped, 0); wrapper->safe_to_destroy = 0; wrapper->request_safe_destroy = 0; @@ -242,8 +244,7 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, rb_raise(rb_eRuntimeError, "closed!"); return Qnil; } - return LONG2NUM( - grpc_channel_check_connectivity_state(ch, grpc_try_to_connect)); + return LONG2NUM(grpc_channel_check_connectivity_state(wrapper->wrapped, grpc_try_to_connect)); } typedef struct watch_state_stack { @@ -254,39 +255,35 @@ typedef struct watch_state_stack { static void *watch_channel_state_without_gvl(void *arg) { watch_state_stack *stack = (watch_state_stack*)arg; - gpr_timespec deadline = stack->deadline; grpc_rb_channel *wrapper = stack->wrapper; int last_state = stack->last_state; + void *return_value = (void*)0; + gpr_timespec time_check_increment = gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); + gpr_mu_lock(&wrapper->channel_mu); - if (wrapper->current_connectivity_state != last_state) { - gpr_mu_unlock(&wrapper->channel_mu); - return (void*)0; - } - if (wrapper->request_safe_destroy) { - gpr_mu_unlock(&wrapper->channel_mu); - return (void*)0; + while(wrapper->current_connectivity_state == last_state && + !wrapper->request_safe_destroy && + !wrapper->safe_to_destroy && + !wrapper->abort_watch_connectivity_state && + gpr_time_cmp(deadline, gpr_now(GPR_CLOCK_REALTIME)) > 0) { + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, time_check_increment); } - if (wrapper->safe_to_destroy) { - gpr_mu_unlock(&wrapper->channel_mu); - return (void*)0; - } - - gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, deadline); - if (wrapper->current_connectivity_state != last_state) { - gpr_mu_unlock(&wrapper->channel_mu); - return (void*)1; + return_value = (void*)1; } gpr_mu_unlock(&wrapper->channel_mu); - return (void*)0; + + return return_value; } static void watch_channel_state_unblocking_func(void *arg) { grpc_rb_channel *wrapper = (grpc_rb_channel*)arg; gpr_log(GPR_DEBUG, "GRPC_RUBY: watch channel state unblocking func called"); gpr_mu_lock(&wrapper->channel_mu); + wrapper->abort_watch_connectivity_state = 1; gpr_cv_broadcast(&wrapper->channel_cv); gpr_mu_unlock(&wrapper->channel_mu); } @@ -461,8 +458,9 @@ static void grpc_rb_channel_try_register_connection_polling( // Note requires wrapper->wrapped, wrapper->channel_mu/cv initialized static void grpc_rb_channel_safe_destroy(grpc_rb_channel *wrapper) { gpr_mu_lock(&wrapper->channel_mu); + wrapper->request_safe_destroy = 1; + while (!wrapper->safe_to_destroy) { - wrapper->request_safe_destroy = 1; gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, gpr_inf_future(GPR_CLOCK_REALTIME)); } diff --git a/src/ruby/spec/channel_connection_spec.rb b/src/ruby/spec/channel_connection_spec.rb index b344052a215..940d68b9b04 100644 --- a/src/ruby/spec/channel_connection_spec.rb +++ b/src/ruby/spec/channel_connection_spec.rb @@ -92,7 +92,7 @@ describe 'channel connection behavior' do end it 'observably connects and reconnects to transient server' \ - 'when using the channel state API' do + ' when using the channel state API' do port = start_server ch = GRPC::Core::Channel.new("localhost:#{port}", {}, :this_channel_is_insecure) From f6c202670c89b9dd540a21d9d412f544dee69fe1 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Tue, 21 Mar 2017 18:52:19 -0700 Subject: [PATCH 156/186] Add the new file to bazel BUILD file --- BUILD | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/BUILD b/BUILD index 2bcd81a7c88..4dc57f97f33 100644 --- a/BUILD +++ b/BUILD @@ -308,8 +308,8 @@ grpc_cc_library( srcs = [ "src/core/lib/profiling/basic_timers.c", "src/core/lib/profiling/stap_timers.c", - "src/core/lib/support/arena.c", "src/core/lib/support/alloc.c", + "src/core/lib/support/arena.c", "src/core/lib/support/atm.c", "src/core/lib/support/avl.c", "src/core/lib/support/backoff.c", @@ -354,8 +354,8 @@ grpc_cc_library( "src/core/lib/support/wrap_memcpy.c", ], hdrs = [ - "src/core/lib/support/arena.h", "src/core/lib/profiling/timers.h", + "src/core/lib/support/arena.h", "src/core/lib/support/backoff.h", "src/core/lib/support/block_annotate.h", "src/core/lib/support/env.h", @@ -527,6 +527,7 @@ grpc_cc_library( "src/core/lib/surface/channel_ping.c", "src/core/lib/surface/channel_stack_type.c", "src/core/lib/surface/completion_queue.c", + "src/core/lib/surface/completion_queue_factory.c", "src/core/lib/surface/event_string.c", "src/core/lib/surface/lame_client.c", "src/core/lib/surface/metadata_array.c", @@ -636,6 +637,7 @@ grpc_cc_library( "src/core/lib/surface/channel_init.h", "src/core/lib/surface/channel_stack_type.h", "src/core/lib/surface/completion_queue.h", + "src/core/lib/surface/completion_queue_factory.h", "src/core/lib/surface/event_string.h", "src/core/lib/surface/init.h", "src/core/lib/surface/lame_client.h", From 031cfeb954f94d435ade4c4021a28a34987d789d Mon Sep 17 00:00:00 2001 From: ncteisen Date: Tue, 21 Mar 2017 19:07:17 -0700 Subject: [PATCH 157/186] Line breaks and doc reffing --- ...error-ownership-rules.md => grpc-error.md} | 89 ++++++++++++++----- src/core/lib/iomgr/error.h | 25 +----- 2 files changed, 69 insertions(+), 45 deletions(-) rename doc/core/{error-ownership-rules.md => grpc-error.md} (52%) diff --git a/doc/core/error-ownership-rules.md b/doc/core/grpc-error.md similarity index 52% rename from doc/core/error-ownership-rules.md rename to doc/core/grpc-error.md index a8ae072ae02..1fa24802315 100644 --- a/doc/core/error-ownership-rules.md +++ b/doc/core/grpc-error.md @@ -1,43 +1,72 @@ -gRPC Error Ownership Rules -===================== +# gRPC Error ## Background -`grpc_error` is the c-core's opaque representation of an error. It holds a collection of integers, strings, timestamps, and child errors that related to the final error. +`grpc_error` is the c-core's opaque representation of an error. It holds a +collection of integers, strings, timestamps, and child errors that related to +the final error. -grpc_errors are refcounted objects, which means they need strict ownership semantics. An extra ref on an error can cause a memory leak, and a missing ref can cause a crash. +always present are: -This document serves as a detailed overview of grpc_error's ownership rules. It should help people use the errors, as well as help people debug refcount related errors. +* GRPC_ERROR_STR_FILE and GRPC_ERROR_INT_FILE_LINE - the source location where + the error was generated +* GRPC_ERROR_STR_DESCRIPTION - a human readable description of the error +* GRPC_ERROR_TIME_CREATED - a timestamp indicating when the error happened + +An error can also have children; these are other errors that are believed to +have contributed to this one. By accumulating children, we can begin to root +cause high level failures from low level failures, without having to derive +execution paths from log lines. + +grpc_errors are refcounted objects, which means they need strict ownership +semantics. An extra ref on an error can cause a memory leak, and a missing ref +can cause a crash. + +This document serves as a detailed overview of grpc_error's ownership rules. It +should help people use the errors, as well as help people debug refcount related +errors. ## Clarification of Ownership -If a particular function is said to "own" an error, that means it has the responsibility of calling unref on the error. A function may have access to an error without ownership of it. +If a particular function is said to "own" an error, that means it has the +responsibility of calling unref on the error. A function may have access to an +error without ownership of it. -This means the function may use the error, but must not call unref on it, since that will be done elsewhere in the code. A function that does not own an error may explicitly take ownership of it by manually calling GRPC_ERROR_REF. +This means the function may use the error, but must not call unref on it, since +that will be done elsewhere in the code. A function that does not own an error +may explicitly take ownership of it by manually calling GRPC_ERROR_REF. ## Ownership Rules There are three rules of error ownership, which we will go over in detail. -* If `grpc_error` is returned by a function, the caller owns a ref to that instance. -* If a `grpc_error` is passed to a `grpc_closure` callback function, then that function does not own a ref to the error. -* if a `grpc_error` is passed to *any other function*, then that function takes ownership of the error. + +* If `grpc_error` is returned by a function, the caller owns a ref to that + instance. +* If a `grpc_error` is passed to a `grpc_closure` callback function, then that + function does not own a ref to the error. +* if a `grpc_error` is passed to *any other function*, then that function + takes ownership of the error. ### Rule 1 -> If `grpc_error` is returned by a function, the caller owns a ref to that instance.* +> If `grpc_error` is returned by a function, the caller owns a ref to that +> instance.* -For example, in the following code block, error1 and error2 are owned by the current function. +For example, in the following code block, error1 and error2 are owned by the +current function. ```C grpc_error* error1 = GRPC_ERROR_CREATE("Some error occured"); grpc_error* error2 = some_operation_that_might_fail(...); ``` -The current function would have to explicitly call GRPC_ERROR_UNREF on the errors, or pass them along to a function that would take over the ownership. +The current function would have to explicitly call GRPC_ERROR_UNREF on the +errors, or pass them along to a function that would take over the ownership. ### Rule 2 -> If a `grpc_error` is passed to a `grpc_closure` callback function, then that function does not own a ref to the error. +> If a `grpc_error` is passed to a `grpc_closure` callback function, then that +> function does not own a ref to the error. A `grpc_closure` callback function is any function that has the signature: @@ -53,7 +82,9 @@ c->cb(exec_ctx, c->cb_arg, err); The caller is still responsible for unref-ing the error. -However, the above line is currently being phased out! It is safer to invoke callbacks with `grpc_closure_run` and `grpc_closure_sched`. These functions are not callbacks, so they will take ownership of the error passed to them. +However, the above line is currently being phased out! It is safer to invoke +callbacks with `grpc_closure_run` and `grpc_closure_sched`. These functions are +not callbacks, so they will take ownership of the error passed to them. ```C grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); @@ -61,7 +92,8 @@ grpc_closure_run(exec_ctx, cb, error); // current function no longer has ownership of the error ``` -If you schedule or run a closure, but still need ownership of the error, then you must explicitly take a reference. +If you schedule or run a closure, but still need ownership of the error, then +you must explicitly take a reference. ```C grpc_error* error = GRPC_ERROR_CREATE("Some error occured"); @@ -70,7 +102,11 @@ grpc_closure_run(exec_ctx, cb, GRPC_ERROR_REF(error)); GRPC_ERROR_UNREF(error); ``` -Rule 2 is more important to keep in mind when **implementing** `grpc_closure` callback functions. You must keep in mind that you do not own the error, and must not unref it. More importantly, you cannot pass it to any function that would take ownership of the error, without explicitly taking ownership yourself. For example: +Rule 2 is more important to keep in mind when **implementing** `grpc_closure` +callback functions. You must keep in mind that you do not own the error, and +must not unref it. More importantly, you cannot pass it to any function that +would take ownership of the error, without explicitly taking ownership yourself. +For example: ```C void on_some_action(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { @@ -78,7 +114,7 @@ void on_some_action(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { // and the caller of this callback will also unref it. some_function(error); - // this callback function must take ownership, so it can give that + // this callback function must take ownership, so it can give that // ownership to the function it is calling. some_function(GRPC_ERROR_REF(error)); } @@ -86,7 +122,8 @@ void on_some_action(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { ### Rule 3 -> if a `grpc_error` is passed to *any other function*, then that function takes ownership of the error. +> if a `grpc_error` is passed to *any other function*, then that function takes +> ownership of the error. Take the following example: @@ -97,9 +134,11 @@ some_function(error); // can't use error anymore! might be gone. ``` -When some_function is called, it takes over the ownership of the error, and it will eventually unref it. So the caller can no longer safely use the error. +When some_function is called, it takes over the ownership of the error, and it +will eventually unref it. So the caller can no longer safely use the error. -If the caller needed to keep using the error (or passing it to other functions), if would have to take on a reference to it. This is a common pattern seen. +If the caller needed to keep using the error (or passing it to other functions), +if would have to take on a reference to it. This is a common pattern seen. ```C void func() { @@ -112,6 +151,10 @@ void func() { } ``` -The last call takes ownership and will eventually give the error its final unref. +The last call takes ownership and will eventually give the error its final +unref. -When **implementing** a function that takes an error (and is not a `grpc_closure` callback function), you must ensure the error is unref-ed either by doing it explicitly with GRPC_ERROR_UNREF, or by passing the error to a function that takes over the ownership. +When **implementing** a function that takes an error (and is not a +`grpc_closure` callback function), you must ensure the error is unref-ed either +by doing it explicitly with GRPC_ERROR_UNREF, or by passing the error to a +function that takes over the ownership. diff --git a/src/core/lib/iomgr/error.h b/src/core/lib/iomgr/error.h index eb953947ae9..0e7a7b0a1ef 100644 --- a/src/core/lib/iomgr/error.h +++ b/src/core/lib/iomgr/error.h @@ -45,28 +45,9 @@ extern "C" { #endif /// Opaque representation of an error. -/// Errors are refcounted objects that represent the result of an operation. -/// Ownership laws: -/// if a grpc_error is returned by a function, the caller owns a ref to that -/// instance -/// if a grpc_error is passed to a grpc_closure callback function (functions -/// with the signature: -/// void (*f)(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error)) -/// then those functions do not own a ref to error (but are free to manually -/// take a reference). -/// if a grpc_error is passed to *ANY OTHER FUNCTION* then that function takes -/// ownership of the error -/// Errors have: -/// a set of ints, strings, and timestamps that describe the error -/// always present are: -/// GRPC_ERROR_STR_FILE, GRPC_ERROR_INT_FILE_LINE - source location the error -/// was generated -/// GRPC_ERROR_STR_DESCRIPTION - a human readable description of the error -/// GRPC_ERROR_TIME_CREATED - a timestamp indicating when the error happened -/// an error can also have children; these are other errors that are believed -/// to have contributed to this one. By accumulating children, we can begin -/// to root cause high level failures from low level failures, without having -/// to derive execution paths from log lines +/// See https://github.com/grpc/grpc/blob/master/doc/core/grpc-error.md for a +/// full write up of this object. + typedef struct grpc_error grpc_error; typedef enum { From 4c2e57df9afb9565dfd8c01272b08f24878de01c Mon Sep 17 00:00:00 2001 From: ncteisen Date: Tue, 21 Mar 2017 19:08:53 -0700 Subject: [PATCH 158/186] Regen project --- tools/doxygen/Doxyfile.core | 2 +- tools/doxygen/Doxyfile.core.internal | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index 6c235cacf9b..94d962b5fe0 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -770,7 +770,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ -doc/core/error-ownership-rules.md \ +doc/core/grpc-error.md \ doc/core/pending_api_cleanups.md \ doc/cpp-style-guide.md \ doc/environment_variables.md \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index ee34ec8a4b3..a4617d2e85e 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -770,7 +770,7 @@ doc/compression_cookbook.md \ doc/connection-backoff-interop-test-description.md \ doc/connection-backoff.md \ doc/connectivity-semantics-and-api.md \ -doc/core/error-ownership-rules.md \ +doc/core/grpc-error.md \ doc/core/pending_api_cleanups.md \ doc/cpp-style-guide.md \ doc/environment_variables.md \ From 06d4edd28355877e71733a0d246a9b5b4c67452b Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Tue, 21 Mar 2017 19:24:07 -0700 Subject: [PATCH 159/186] fix setting of time_check_increment in watch conn state loop --- src/ruby/ext/grpc/rb_channel.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index c12ea921c98..acf22dd46be 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -259,9 +259,7 @@ static void *watch_channel_state_without_gvl(void *arg) { grpc_rb_channel *wrapper = stack->wrapper; int last_state = stack->last_state; void *return_value = (void*)0; - gpr_timespec time_check_increment = gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); - + gpr_timespec time_check_increment; gpr_mu_lock(&wrapper->channel_mu); while(wrapper->current_connectivity_state == last_state && @@ -269,6 +267,8 @@ static void *watch_channel_state_without_gvl(void *arg) { !wrapper->safe_to_destroy && !wrapper->abort_watch_connectivity_state && gpr_time_cmp(deadline, gpr_now(GPR_CLOCK_REALTIME)) > 0) { + time_check_increment = gpr_time_add( + gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, time_check_increment); } if (wrapper->current_connectivity_state != last_state) { From 995ed1c3c6abd81f6b9dad71491da986e0e6f01e Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Wed, 22 Mar 2017 02:34:39 -0700 Subject: [PATCH 160/186] Fix bug --- include/grpc/grpc.h | 2 +- src/core/lib/surface/completion_queue_factory.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 68c277cd086..fecb7845703 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -135,7 +135,7 @@ typedef struct grpc_completion_queue_attributes { structure in future. */ int version; /* Set to GRPC_CQ_CURRENT_VERSION */ - grpc_cq_completion_type cq_type; + grpc_cq_completion_type cq_completion_type; grpc_cq_polling_type cq_polling_type; } grpc_completion_queue_attributes; diff --git a/src/core/lib/surface/completion_queue_factory.c b/src/core/lib/surface/completion_queue_factory.c index 138dfeff484..db67a5192be 100644 --- a/src/core/lib/surface/completion_queue_factory.c +++ b/src/core/lib/surface/completion_queue_factory.c @@ -71,7 +71,7 @@ grpc_completion_queue* grpc_completion_queue_create_for_next(void* reserved) { grpc_completion_queue* grpc_completion_queue_create_for_pluck(void* reserved) { GPR_ASSERT(!reserved); - grpc_completion_queue_attributes attr = {1, GRPC_CQ_NEXT, + grpc_completion_queue_attributes attr = {1, GRPC_CQ_PLUCK, GRPC_CQ_DEFAULT_POLLING}; return g_default_cq_factory.vtable->create(&g_default_cq_factory, &attr); } From 8f0fd82a96daf14c620ccab4b051449897fc29ca Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Wed, 22 Mar 2017 08:47:50 -0700 Subject: [PATCH 161/186] Removing credentials assert in server_auth_filter. This will allow other transports with built-in security to use this filter. --- src/core/lib/security/transport/server_auth_filter.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/lib/security/transport/server_auth_filter.c b/src/core/lib/security/transport/server_auth_filter.c index 01cb4731773..c47fe56ba47 100644 --- a/src/core/lib/security/transport/server_auth_filter.c +++ b/src/core/lib/security/transport/server_auth_filter.c @@ -158,7 +158,7 @@ static void auth_on_recv(grpc_exec_ctx *exec_ctx, void *user_data, call_data *calld = elem->call_data; channel_data *chand = elem->channel_data; if (error == GRPC_ERROR_NONE) { - if (chand->creds->processor.process != NULL) { + if (chand->creds != NULL && chand->creds->processor.process != NULL) { calld->md = metadata_batch_to_md_array(calld->recv_initial_metadata); chand->creds->processor.process( chand->creds->processor.state, calld->auth_context, @@ -242,7 +242,6 @@ static grpc_error *init_channel_elem(grpc_exec_ctx *exec_ctx, GPR_ASSERT(!args->is_last); GPR_ASSERT(auth_context != NULL); - GPR_ASSERT(creds != NULL); /* initialize members */ chand->auth_context = From b14ab80cd8b4bbdabad612b6c529043d46d189e0 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 22 Mar 2017 08:53:39 -0700 Subject: [PATCH 162/186] Fixes for new APIs --- test/cpp/microbenchmarks/bm_call_create.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/cpp/microbenchmarks/bm_call_create.cc b/test/cpp/microbenchmarks/bm_call_create.cc index bc32b3032b6..1ef8caa6903 100644 --- a/test/cpp/microbenchmarks/bm_call_create.cc +++ b/test/cpp/microbenchmarks/bm_call_create.cc @@ -520,8 +520,8 @@ static void SetPollsetOrPollsetSet(grpc_exec_ctx *exec_ctx, static void DestroyCallElem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, const grpc_call_final_info *final_info, - void *and_free_memory) { - gpr_free(and_free_memory); + grpc_closure *then_sched_closure) { + grpc_closure_sched(exec_ctx, then_sched_closure, GRPC_ERROR_NONE); } grpc_error *InitChannelElem(grpc_exec_ctx *exec_ctx, grpc_channel_element *elem, From 9fb3131dba86899828783aa10e17e0912068c76e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 22 Mar 2017 09:09:16 -0700 Subject: [PATCH 163/186] Enroll bm_chttp2_transport into bigquery pipeline --- tools/profiling/microbenchmarks/bm_json.py | 12 ++++++++++++ tools/run_tests/run_microbenchmark.py | 1 + 2 files changed, 13 insertions(+) diff --git a/tools/profiling/microbenchmarks/bm_json.py b/tools/profiling/microbenchmarks/bm_json.py index 4695f829f41..ca0af414a3b 100644 --- a/tools/profiling/microbenchmarks/bm_json.py +++ b/tools/profiling/microbenchmarks/bm_json.py @@ -101,6 +101,18 @@ _BM_SPECS = { 'BM_PollEmptyPollset_SpeedOfLight': { 'tpl': [], 'dyn': ['request_size', 'request_count'], + }, + 'BM_StreamCreateSendInitialMetadataDestroy': { + 'tpl': ['fixture'], + 'dyn': [], + }, + 'BM_TransportStreamSend': { + 'tpl': [], + 'dyn': ['request_size'], + }, + 'BM_TransportStreamRecv': { + 'tpl': [], + 'dyn': ['request_size'], } } diff --git a/tools/run_tests/run_microbenchmark.py b/tools/run_tests/run_microbenchmark.py index 57b2636e569..55bf313bd50 100755 --- a/tools/run_tests/run_microbenchmark.py +++ b/tools/run_tests/run_microbenchmark.py @@ -209,6 +209,7 @@ argp.add_argument('-b', '--benchmarks', 'bm_call_create', 'bm_error', 'bm_chttp2_hpack', + 'bm_chttp2_transport', 'bm_metadata', 'bm_fullstack_trickle', ], From 407101b2c41c111e549935703b19dcdb5c5d0f09 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 22 Mar 2017 09:17:32 -0700 Subject: [PATCH 164/186] Add bm --- tools/run_tests/run_microbenchmark.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/run_tests/run_microbenchmark.py b/tools/run_tests/run_microbenchmark.py index 55bf313bd50..6bedc54941a 100755 --- a/tools/run_tests/run_microbenchmark.py +++ b/tools/run_tests/run_microbenchmark.py @@ -210,6 +210,7 @@ argp.add_argument('-b', '--benchmarks', 'bm_error', 'bm_chttp2_hpack', 'bm_chttp2_transport', + 'bm_pollset', 'bm_metadata', 'bm_fullstack_trickle', ], From 2f390dbb026b2e8a3b64e9273b2ade3f8af66585 Mon Sep 17 00:00:00 2001 From: Nathaniel Manista Date: Wed, 22 Mar 2017 16:57:48 +0000 Subject: [PATCH 165/186] Drop unnecessary imports from _pb2_grpc.py files --- src/compiler/python_generator.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/python_generator.cc b/src/compiler/python_generator.cc index 4841da8da8e..86c831d2b0a 100644 --- a/src/compiler/python_generator.cc +++ b/src/compiler/python_generator.cc @@ -645,15 +645,15 @@ bool PrivateGenerator::PrintBetaPreamble() { "Package", config.beta_package_root); out->Print("from $Package$ import interfaces as beta_interfaces\n", "Package", config.beta_package_root); + out->Print("from grpc.framework.common import cardinality\n"); + out->Print( + "from grpc.framework.interfaces.face import utilities as " + "face_utilities\n"); return true; } bool PrivateGenerator::PrintPreamble() { out->Print("import $Package$\n", "Package", config.grpc_package_root); - out->Print("from grpc.framework.common import cardinality\n"); - out->Print( - "from grpc.framework.interfaces.face import utilities as " - "face_utilities\n"); if (generate_in_pb2_grpc) { out->Print("\n"); StringPairSet imports_set; From 513070cf20c973727c7f5899ac9018f7fd349b1f Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 22 Mar 2017 10:27:31 -0700 Subject: [PATCH 166/186] get rid of time check increment in watch connectivity state loop --- src/ruby/ext/grpc/rb_channel.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index acf22dd46be..ba230525217 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -259,7 +259,6 @@ static void *watch_channel_state_without_gvl(void *arg) { grpc_rb_channel *wrapper = stack->wrapper; int last_state = stack->last_state; void *return_value = (void*)0; - gpr_timespec time_check_increment; gpr_mu_lock(&wrapper->channel_mu); while(wrapper->current_connectivity_state == last_state && @@ -267,9 +266,7 @@ static void *watch_channel_state_without_gvl(void *arg) { !wrapper->safe_to_destroy && !wrapper->abort_watch_connectivity_state && gpr_time_cmp(deadline, gpr_now(GPR_CLOCK_REALTIME)) > 0) { - time_check_increment = gpr_time_add( - gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(20, GPR_TIMESPAN)); - gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, time_check_increment); + gpr_cv_wait(&wrapper->channel_cv, &wrapper->channel_mu, deadline); } if (wrapper->current_connectivity_state != last_state) { return_value = (void*)1; From 3a632c4a71da3c9a3ddfbefefdb160b53db1e0b8 Mon Sep 17 00:00:00 2001 From: Sree Kuchibhotla Date: Wed, 22 Mar 2017 11:49:43 -0700 Subject: [PATCH 167/186] clang format fix --- include/grpc/grpc.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index fecb7845703..e088435d6cc 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -128,7 +128,6 @@ typedef enum { GRPC_CQ_NON_POLLING } grpc_cq_polling_type; - #define GRPC_CQ_CURRENT_VERSION 1 typedef struct grpc_completion_queue_attributes { /* The version number of this structure. More fields might be added to this From 50fdc8ab19ea97e67d9fb1d30ae5016cffab1f43 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 9 Feb 2017 21:06:08 -0800 Subject: [PATCH 168/186] add http2 server test for unary calls that uses small frames and padding --- ....md => http2-interop-test-descriptions.md} | 76 ++++++++++ test/http2_test/http2_base_server.py | 35 +++-- test/http2_test/http2_test_server.py | 10 +- test/http2_test/test_data_frame_padding.py | 94 ++++++++++++ tools/doxygen/Doxyfile.c++ | 2 +- tools/doxygen/Doxyfile.c++.internal | 2 +- tools/doxygen/Doxyfile.core | 2 +- tools/doxygen/Doxyfile.core.internal | 2 +- .../linux/grpc_interop_badserver_java.sh | 2 +- .../linux/grpc_interop_badserver_python.sh | 2 +- tools/jenkins/run_interop.sh | 2 +- .../interop/interop_html_report.template | 10 +- tools/run_tests/python_utils/report_utils.py | 11 +- tools/run_tests/run_interop_tests.py | 134 ++++++++++++------ 14 files changed, 307 insertions(+), 77 deletions(-) rename doc/{negative-http2-interop-test-descriptions.md => http2-interop-test-descriptions.md} (65%) create mode 100644 test/http2_test/test_data_frame_padding.py diff --git a/doc/negative-http2-interop-test-descriptions.md b/doc/http2-interop-test-descriptions.md similarity index 65% rename from doc/negative-http2-interop-test-descriptions.md rename to doc/http2-interop-test-descriptions.md index b64fe6a024d..435a8de709c 100644 --- a/doc/negative-http2-interop-test-descriptions.md +++ b/doc/http2-interop-test-descriptions.md @@ -193,3 +193,79 @@ Server Procedure: 1. Sets MAX_CONCURRENT_STREAMS to one after the connection is made. *The assertion that the MAX_CONCURRENT_STREAMS limit is upheld occurs in the http2 library we used.* + +### data_frame_padding + +This test verifies that the client can correctly receive padded http2 data +frames. It also stresses the client's flow control (there is a high chance +that the sender will deadlock if the client's flow control logic doesn't +correctly account for padding). + +Client Procedure: +(Note this is the same procedure as in the "large_unary" gRPC interop tests. +Clients should use their "large_unary" gRPC interop test implementations.) +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +Server Procedure: + 1. Reply to the client's request with a `SimpleResponse`, with a payload + body length of `SimpleRequest.response_size`. But send it across specific + http2 data frames as follows: + * Each http2 data frame contains a 5 byte payload and 255 bytes of padding. + + * Note the 5 byte payload and 255 byte padding are partly arbitrary, + and other numbers are also ok. With 255 bytes of padding for each 5 bytes of + payload containing actual gRPC message, the 300KB response size will + multiply into around 15 megabytes of flow control debt, which should stress + flow control accounting. + +### no_df_padding_sanity_test + +This test verifies that the client can correctly receive a series of small +data frames. Note that this test is intentionally a slight variation of +"data_frame_padding", with the only difference being that this test doesn't use data +frame padding when the response is sent. This test is primarily meant to +prove correctness of the http2 server implementation and highlight failures +of the "data_frame_padding" test. + +Client Procedure: +(Note this is the same procedure as in the "large_unary" gRPC interop tests. +Clients should use their "large_unary" gRPC interop test implementations.) +Procedure: + 1. Client calls UnaryCall with: + + ``` + { + response_size: 314159 + payload:{ + body: 271828 bytes of zeros + } + } + ``` + +Client asserts: +* call was successful +* response payload body is 314159 bytes in size +* clients are free to assert that the response payload body contents are zero + and comparing the entire response message against a golden response + +Server Procedure: + 1. Reply to the client's request with a `SimpleResponse`, with a payload + body length of `SimpleRequest.response_size`. But send it across series of + http2 data frames that contain 5 bytes of "payload" and zero bytes of + "padding" (the padding flags on the data frames should not be set). diff --git a/test/http2_test/http2_base_server.py b/test/http2_test/http2_base_server.py index 8de028ceb1b..e158e9b7030 100644 --- a/test/http2_test/http2_base_server.py +++ b/test/http2_test/http2_base_server.py @@ -39,6 +39,7 @@ import twisted.internet.protocol _READ_CHUNK_SIZE = 16384 _GRPC_HEADER_SIZE = 5 +_MIN_SETTINGS_MAX_FRAME_SIZE = 16384 class H2ProtocolBaseServer(twisted.internet.protocol.Protocol): def __init__(self): @@ -121,38 +122,46 @@ class H2ProtocolBaseServer(twisted.internet.protocol.Protocol): ) self.transport.write(self._conn.data_to_send()) - def on_window_update_default(self, event): - # send pending data, if any - self.default_send(event.stream_id) + def on_window_update_default(self, _, pad_length=None, read_chunk_size=_READ_CHUNK_SIZE): + # try to resume sending on all active streams (update might be for connection) + for stream_id in self._send_remaining: + self.default_send(stream_id, pad_length=pad_length, read_chunk_size=read_chunk_size) def send_reset_stream(self): self._conn.reset_stream(self._stream_id) self.transport.write(self._conn.data_to_send()) - def setup_send(self, data_to_send, stream_id): + def setup_send(self, data_to_send, stream_id, pad_length=None, read_chunk_size=_READ_CHUNK_SIZE): logging.info('Setting up data to send for stream_id: %d' % stream_id) self._send_remaining[stream_id] = len(data_to_send) self._send_offset = 0 self._data_to_send = data_to_send - self.default_send(stream_id) + self.default_send(stream_id, pad_length=pad_length, read_chunk_size=read_chunk_size) - def default_send(self, stream_id): + def default_send(self, stream_id, pad_length=None, read_chunk_size=_READ_CHUNK_SIZE): if not self._send_remaining.has_key(stream_id): # not setup to send data yet return while self._send_remaining[stream_id] > 0: lfcw = self._conn.local_flow_control_window(stream_id) - if lfcw == 0: + padding_bytes = pad_length + 1 if pad_length is not None else 0 + if lfcw - padding_bytes <= 0: + logging.info('Stream %d. lfcw: %d. padding bytes: %d. not enough quota yet' % (stream_id, lfcw, padding_bytes)) break - chunk_size = min(lfcw, _READ_CHUNK_SIZE) + chunk_size = min(lfcw - padding_bytes, read_chunk_size) bytes_to_send = min(chunk_size, self._send_remaining[stream_id]) - logging.info('flow_control_window = %d. sending [%d:%d] stream_id %d' % - (lfcw, self._send_offset, self._send_offset + bytes_to_send, - stream_id)) + logging.info('flow_control_window = %d. sending [%d:%d] stream_id %d. includes %d total padding bytes' % + (lfcw, self._send_offset, self._send_offset + bytes_to_send + padding_bytes, + stream_id, padding_bytes)) + # The receiver might allow sending frames larger than the http2 minimum + # max frame size (16384), but this test should never send more than 16384 + # for simplicity (which is always legal). + if bytes_to_send + padding_bytes > _MIN_SETTINGS_MAX_FRAME_SIZE: + raise ValueError("overload: sending %d" % (bytes_to_send + padding_bytes)) data = self._data_to_send[self._send_offset : self._send_offset + bytes_to_send] try: - self._conn.send_data(stream_id, data, False) + self._conn.send_data(stream_id, data, end_stream=False, pad_length=pad_length) except h2.exceptions.ProtocolError: logging.info('Stream %d is closed' % stream_id) break @@ -200,5 +209,5 @@ class H2ProtocolBaseServer(twisted.internet.protocol.Protocol): req_proto_str = recv_buffer[5:5+grpc_msg_size] sr = messages_pb2.SimpleRequest() sr.ParseFromString(req_proto_str) - logging.info('Parsed request for stream %d: response_size=%s' % (stream_id, sr.response_size)) + logging.info('Parsed simple request for stream %d' % stream_id) return sr diff --git a/test/http2_test/http2_test_server.py b/test/http2_test/http2_test_server.py index 46c3e00d18f..6a7849b94a7 100644 --- a/test/http2_test/http2_test_server.py +++ b/test/http2_test/http2_test_server.py @@ -44,6 +44,7 @@ import test_ping import test_rst_after_data import test_rst_after_header import test_rst_during_data +import test_data_frame_padding _TEST_CASE_MAPPING = { 'rst_after_header': test_rst_after_header.TestcaseRstStreamAfterHeader, @@ -52,6 +53,10 @@ _TEST_CASE_MAPPING = { 'goaway': test_goaway.TestcaseGoaway, 'ping': test_ping.TestcasePing, 'max_streams': test_max_streams.TestcaseSettingsMaxStreams, + + # Positive tests below: + 'data_frame_padding': test_data_frame_padding.TestDataFramePadding, + 'no_df_padding_sanity_test': test_data_frame_padding.TestDataFramePadding, } _exit_code = 0 @@ -73,6 +78,8 @@ class H2Factory(twisted.internet.protocol.Factory): if self._testcase == 'goaway': return t(self._num_streams).get_base_server() + elif self._testcase == 'no_df_padding_sanity_test': + return t(use_padding=False).get_base_server() else: return t().get_base_server() @@ -81,7 +88,8 @@ def parse_arguments(): parser.add_argument('--base_port', type=int, default=8080, help='base port to run the servers (default: 8080). One test server is ' 'started on each incrementing port, beginning with base_port, in the ' - 'following order: goaway,max_streams,ping,rst_after_data,rst_after_header,' + 'following order: data_frame_padding,goaway,max_streams,' + 'no_df_padding_sanity_test,ping,rst_after_data,rst_after_header,' 'rst_during_data' ) return parser.parse_args() diff --git a/test/http2_test/test_data_frame_padding.py b/test/http2_test/test_data_frame_padding.py new file mode 100644 index 00000000000..e1db28faedc --- /dev/null +++ b/test/http2_test/test_data_frame_padding.py @@ -0,0 +1,94 @@ +# Copyright 2016, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import http2_base_server +import logging +import messages_pb2 + +# Set the number of padding bytes per data frame to be very large +# relative to the number of data bytes for each data frame sent. +_LARGE_PADDING_LENGTH = 255 +_SMALL_READ_CHUNK_SIZE = 5 + +class TestDataFramePadding(object): + """ + In response to an incoming request, this test sends headers, followed by + data, followed by a reset stream frame. Client asserts that the RPC failed. + Client needs to deliver the complete message to the application layer. + """ + def __init__(self, use_padding=True): + self._base_server = http2_base_server.H2ProtocolBaseServer() + self._base_server._handlers['DataReceived'] = self.on_data_received + self._base_server._handlers['WindowUpdated'] = self.on_window_update + self._base_server._handlers['RequestReceived'] = self.on_request_received + + # _total_updates maps stream ids to total flow control updates received + self._total_updates = {} + # zero window updates so far for connection window (stream id '0') + self._total_updates[0] = 0 + self._read_chunk_size = _SMALL_READ_CHUNK_SIZE + + if use_padding: + self._pad_length = _LARGE_PADDING_LENGTH + else: + self._pad_length = None + + def get_base_server(self): + return self._base_server + + def on_data_received(self, event): + logging.info('on data received. Stream id: %d. Data length: %d' % (event.stream_id, len(event.data))) + self._base_server.on_data_received_default(event) + if len(event.data) == 0: + return + sr = self._base_server.parse_received_data(event.stream_id) + stream_bytes = '' + # Check if full grpc msg has been read into the recv buffer yet + if sr: + response_data = self._base_server.default_response_data(sr.response_size) + logging.info('Stream id: %d. total resp size: %d' % (event.stream_id, len(response_data))) + # Begin sending the response. Add ``self._pad_length`` padding to each + # data frame and split the whole message into data frames each carrying + # only self._read_chunk_size of data. + # The purpose is to have the majority of the data frame response bytes + # be padding bytes, since ``self._pad_length`` >> ``self._read_chunk_size``. + self._base_server.setup_send(response_data , event.stream_id, pad_length=self._pad_length, read_chunk_size=self._read_chunk_size) + + def on_request_received(self, event): + self._base_server.on_request_received_default(event) + logging.info('on request received. Stream id: %s.' % event.stream_id) + self._total_updates[event.stream_id] = 0 + + # Log debug info and try to resume sending on all currently active streams. + def on_window_update(self, event): + logging.info('on window update. Stream id: %s. Delta: %s' % (event.stream_id, event.delta)) + self._total_updates[event.stream_id] += event.delta + total = self._total_updates[event.stream_id] + logging.info('... - total updates for stream %d : %d' % (event.stream_id, total)) + self._base_server.on_window_update_default(event, pad_length=self._pad_length, read_chunk_size=self._read_chunk_size) diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index b5021ede157..d21b48cabf6 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -779,11 +779,11 @@ doc/fail_fast.md \ doc/g_stands_for.md \ doc/health-checking.md \ doc/http-grpc-status-mapping.md \ +doc/http2-interop-test-descriptions.md \ doc/internationalization.md \ doc/interop-test-descriptions.md \ doc/load-balancing.md \ doc/naming.md \ -doc/negative-http2-interop-test-descriptions.md \ doc/server-reflection.md \ doc/server_reflection_tutorial.md \ doc/server_side_auth.md \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 758ba2402ae..8d6c2838bba 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -779,11 +779,11 @@ doc/fail_fast.md \ doc/g_stands_for.md \ doc/health-checking.md \ doc/http-grpc-status-mapping.md \ +doc/http2-interop-test-descriptions.md \ doc/internationalization.md \ doc/interop-test-descriptions.md \ doc/load-balancing.md \ doc/naming.md \ -doc/negative-http2-interop-test-descriptions.md \ doc/server-reflection.md \ doc/server_reflection_tutorial.md \ doc/server_side_auth.md \ diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index cd3f2af44c8..b4fdcddbcf4 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -778,11 +778,11 @@ doc/fail_fast.md \ doc/g_stands_for.md \ doc/health-checking.md \ doc/http-grpc-status-mapping.md \ +doc/http2-interop-test-descriptions.md \ doc/internationalization.md \ doc/interop-test-descriptions.md \ doc/load-balancing.md \ doc/naming.md \ -doc/negative-http2-interop-test-descriptions.md \ doc/server-reflection.md \ doc/server_reflection_tutorial.md \ doc/server_side_auth.md \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index b2733500823..3e679e3a2b3 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -778,11 +778,11 @@ doc/fail_fast.md \ doc/g_stands_for.md \ doc/health-checking.md \ doc/http-grpc-status-mapping.md \ +doc/http2-interop-test-descriptions.md \ doc/internationalization.md \ doc/interop-test-descriptions.md \ doc/load-balancing.md \ doc/naming.md \ -doc/negative-http2-interop-test-descriptions.md \ doc/server-reflection.md \ doc/server_reflection_tutorial.md \ doc/server_side_auth.md \ diff --git a/tools/internal_ci/linux/grpc_interop_badserver_java.sh b/tools/internal_ci/linux/grpc_interop_badserver_java.sh index 0985e657c63..c309c623e0b 100755 --- a/tools/internal_ci/linux/grpc_interop_badserver_java.sh +++ b/tools/internal_ci/linux/grpc_interop_badserver_java.sh @@ -37,5 +37,5 @@ cd $(dirname $0)/../../.. git submodule update --init -tools/run_tests/run_interop_tests.py -l java --use_docker --http2_badserver_interop $@ +tools/run_tests/run_interop_tests.py -l java --use_docker --http2_server_interop $@ diff --git a/tools/internal_ci/linux/grpc_interop_badserver_python.sh b/tools/internal_ci/linux/grpc_interop_badserver_python.sh index 3fff537d2b7..c3bb92f33da 100755 --- a/tools/internal_ci/linux/grpc_interop_badserver_python.sh +++ b/tools/internal_ci/linux/grpc_interop_badserver_python.sh @@ -37,5 +37,5 @@ cd $(dirname $0)/../../.. git submodule update --init -tools/run_tests/run_interop_tests.py -l python --use_docker --http2_badserver_interop $@ +tools/run_tests/run_interop_tests.py -l python --use_docker --http2_server_interop $@ diff --git a/tools/jenkins/run_interop.sh b/tools/jenkins/run_interop.sh index 2a9fc662a9e..13c208e97c9 100755 --- a/tools/jenkins/run_interop.sh +++ b/tools/jenkins/run_interop.sh @@ -36,4 +36,4 @@ export LANG=en_US.UTF-8 # Enter the gRPC repo root cd $(dirname $0)/../.. -tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --cloud_to_prod_auth --use_docker --http2_interop --http2_badserver_interop -t -j 12 $@ || true +tools/run_tests/run_interop_tests.py -l all -s all --cloud_to_prod --cloud_to_prod_auth --use_docker --http2_interop --http2_server_interop -t -j 12 $@ || true diff --git a/tools/run_tests/interop/interop_html_report.template b/tools/run_tests/interop/interop_html_report.template index 88ecd4e4db1..6d9de5c62e8 100644 --- a/tools/run_tests/interop/interop_html_report.template +++ b/tools/run_tests/interop/interop_html_report.template @@ -106,19 +106,19 @@ % endfor % endif -% if http2_badserver_cases: -

HTTP/2 Bad Server Tests

+% if http2_server_cases: +

HTTP/2 Server Tests

## Each column header is the client language. - % for client_lang in client_langs_http2_badserver_cases: + % for client_lang in client_langs: % endfor - % for test_case in http2_badserver_cases: + % for test_case in http2_server_cases: - % for client_lang in client_langs_http2_badserver_cases: + % for client_lang in client_langs: <% shortname = 'cloud_to_cloud:%s:http2_server:%s' % (client_lang, test_case) diff --git a/tools/run_tests/python_utils/report_utils.py b/tools/run_tests/python_utils/report_utils.py index 131772f55fc..3b2b4f87129 100644 --- a/tools/run_tests/python_utils/report_utils.py +++ b/tools/run_tests/python_utils/report_utils.py @@ -80,10 +80,9 @@ def render_junit_xml_report(resultset, xml_report, suite_package='grpc', tree = ET.ElementTree(root) tree.write(xml_report, encoding='UTF-8') - def render_interop_html_report( client_langs, server_langs, test_cases, auth_test_cases, http2_cases, - http2_badserver_cases, client_langs_http2_badserver_cases, resultset, + http2_server_cases, resultset, num_failures, cloud_to_prod, prod_servers, http2_interop): """Generate HTML report for interop tests.""" template_file = 'tools/run_tests/interop/interop_html_report.template' @@ -99,9 +98,7 @@ def render_interop_html_report( sorted_test_cases = sorted(test_cases) sorted_auth_test_cases = sorted(auth_test_cases) sorted_http2_cases = sorted(http2_cases) - sorted_http2_badserver_cases = sorted(http2_badserver_cases) - sorted_client_langs_http2_badserver_cases = sorted( - client_langs_http2_badserver_cases) + sorted_http2_server_cases = sorted(http2_server_cases) sorted_client_langs = sorted(client_langs) sorted_server_langs = sorted(server_langs) sorted_prod_servers = sorted(prod_servers) @@ -111,9 +108,7 @@ def render_interop_html_report( 'test_cases': sorted_test_cases, 'auth_test_cases': sorted_auth_test_cases, 'http2_cases': sorted_http2_cases, - 'http2_badserver_cases': sorted_http2_badserver_cases, - 'client_langs_http2_badserver_cases': ( - sorted_client_langs_http2_badserver_cases), + 'http2_server_cases': sorted_http2_server_cases, 'resultset': resultset, 'num_failures': num_failures, 'cloud_to_prod': cloud_to_prod, diff --git a/tools/run_tests/run_interop_tests.py b/tools/run_tests/run_interop_tests.py index ce4dfb863ea..2d7f4a625d6 100755 --- a/tools/run_tests/run_interop_tests.py +++ b/tools/run_tests/run_interop_tests.py @@ -45,6 +45,7 @@ import tempfile import time import uuid import six +import traceback import python_utils.dockerjob as dockerjob import python_utils.jobset as jobset @@ -73,6 +74,10 @@ _SKIP_ADVANCED = ['status_code_and_message', _TEST_TIMEOUT = 3*60 +# disable this test on core-based languages, +# see https://github.com/grpc/grpc/issues/9779 +_SKIP_DATA_FRAME_PADDING = ['data_frame_padding'] + class CXXLanguage: def __init__(self): @@ -97,7 +102,7 @@ class CXXLanguage: return {} def unimplemented_test_cases(self): - return [] + return _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return [] @@ -126,7 +131,7 @@ class CSharpLanguage: return {} def unimplemented_test_cases(self): - return _SKIP_SERVER_COMPRESSION + return _SKIP_SERVER_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _SKIP_COMPRESSION @@ -155,7 +160,7 @@ class CSharpCoreCLRLanguage: return {} def unimplemented_test_cases(self): - return _SKIP_SERVER_COMPRESSION + return _SKIP_SERVER_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _SKIP_COMPRESSION @@ -250,7 +255,7 @@ class Http2Server: return {} def unimplemented_test_cases(self): - return _TEST_CASES + return _TEST_CASES + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _TEST_CASES @@ -281,7 +286,7 @@ class Http2Client: return _TEST_CASES def unimplemented_test_cases_server(self): - return [] + return _TEST_CASES def __str__(self): return 'http2' @@ -308,7 +313,7 @@ class NodeLanguage: return {} def unimplemented_test_cases(self): - return _SKIP_COMPRESSION + return _SKIP_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _SKIP_COMPRESSION @@ -333,7 +338,7 @@ class PHPLanguage: return {} def unimplemented_test_cases(self): - return _SKIP_COMPRESSION + return _SKIP_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return [] @@ -358,7 +363,7 @@ class PHP7Language: return {} def unimplemented_test_cases(self): - return _SKIP_COMPRESSION + return _SKIP_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return [] @@ -389,7 +394,7 @@ class RubyLanguage: return {} def unimplemented_test_cases(self): - return _SKIP_SERVER_COMPRESSION + return _SKIP_SERVER_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _SKIP_COMPRESSION @@ -437,7 +442,7 @@ class PythonLanguage: 'PYTHONPATH': '{}/src/python/gens'.format(DOCKER_WORKDIR_ROOT)} def unimplemented_test_cases(self): - return _SKIP_COMPRESSION + return _SKIP_COMPRESSION + _SKIP_DATA_FRAME_PADDING def unimplemented_test_cases_server(self): return _SKIP_COMPRESSION @@ -476,10 +481,14 @@ _AUTH_TEST_CASES = ['compute_engine_creds', 'jwt_token_creds', _HTTP2_TEST_CASES = ['tls', 'framing'] -_HTTP2_BADSERVER_TEST_CASES = ['rst_after_header', 'rst_after_data', 'rst_during_data', - 'goaway', 'ping', 'max_streams'] +_HTTP2_SERVER_TEST_CASES = ['rst_after_header', 'rst_after_data', 'rst_during_data', + 'goaway', 'ping', 'max_streams', 'data_frame_padding', 'no_df_padding_sanity_test'] + +_GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES = { 'data_frame_padding': 'large_unary', 'no_df_padding_sanity_test': 'large_unary' } -_LANGUAGES_FOR_HTTP2_BADSERVER_TESTS = ['java', 'go', 'python', 'c++'] +_HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS = _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES.keys() + +_LANGUAGES_WITH_HTTP2_CLIENTS_FOR_HTTP2_SERVER_TEST_CASES = ['java', 'go', 'python', 'c++'] DOCKER_WORKDIR_ROOT = '/var/local/git/grpc' @@ -631,14 +640,28 @@ def cloud_to_cloud_jobspec(language, test_case, server_name, server_host, '--use_tls=%s' % ('false' if insecure else 'true'), '--use_test_ca=true', ] + + client_test_case = test_case + if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS: + client_test_case = _GRPC_CLIENT_TEST_CASES_FOR_HTTP2_SERVER_TEST_CASES[test_case] + if client_test_case in language.unimplemented_test_cases(): + print('asking client %s to run unimplemented test case %s' % (repr(language), client_test_case)) + sys.exit(1) + common_options = [ - '--test_case=%s' % test_case, + '--test_case=%s' % client_test_case, '--server_host=%s' % server_host, '--server_port=%s' % server_port, ] - if test_case in _HTTP2_BADSERVER_TEST_CASES: - cmdline = bash_cmdline(language.client_cmd_http2interop(common_options)) - cwd = language.http2_cwd + + if test_case in _HTTP2_SERVER_TEST_CASES: + if test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS: + client_options = interop_only_options + common_options + cmdline = bash_cmdline(language.client_cmd(client_options)) + cwd = language.client_cwd + else: + cmdline = bash_cmdline(language.client_cmd_http2interop(common_options)) + cwd = language.http2_cwd else: cmdline = bash_cmdline(language.client_cmd(common_options+interop_only_options)) cwd = language.client_cwd @@ -686,7 +709,7 @@ def server_jobspec(language, docker_image, insecure=False, manual_cmd_log=None): docker_args += list( itertools.chain.from_iterable(('-p', str(_DEFAULT_SERVER_PORT + i)) for i in range( - len(_HTTP2_BADSERVER_TEST_CASES)))) + len(_HTTP2_SERVER_TEST_CASES)))) # Enable docker's healthcheck mechanism. # This runs a Python script inside the container every second. The script # pings the http2 server to verify it is ready. The 'health-retries' flag @@ -856,11 +879,11 @@ argp.add_argument('--http2_interop', action='store_const', const=True, help='Enable HTTP/2 client edge case testing. (Bad client, good server)') -argp.add_argument('--http2_badserver_interop', +argp.add_argument('--http2_server_interop', default=False, action='store_const', const=True, - help='Enable HTTP/2 server edge case testing. (Good client, bad server)') + help='Enable HTTP/2 server edge case testing. (Includes positive and negative tests') argp.add_argument('--insecure', default=False, action='store_const', @@ -895,26 +918,26 @@ languages = set(_LANGUAGES[l] six.iterkeys(_LANGUAGES) if x == 'all' else [x] for x in args.language)) -languages_http2_badserver_interop = set() -if args.http2_badserver_interop: - languages_http2_badserver_interop = set( - _LANGUAGES[l] for l in _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS +languages_http2_clients_for_http2_server_interop = set() +if args.http2_server_interop: + languages_http2_clients_for_http2_server_interop = set( + _LANGUAGES[l] for l in _LANGUAGES_WITH_HTTP2_CLIENTS_FOR_HTTP2_SERVER_TEST_CASES if 'all' in args.language or l in args.language) http2Interop = Http2Client() if args.http2_interop else None -http2InteropServer = Http2Server() if args.http2_badserver_interop else None +http2InteropServer = Http2Server() if args.http2_server_interop else None docker_images={} if args.use_docker: # languages for which to build docker images languages_to_build = set( _LANGUAGES[k] for k in set([str(l) for l in languages] + [s for s in servers])) - languages_to_build = languages_to_build | languages_http2_badserver_interop + languages_to_build = languages_to_build | languages_http2_clients_for_http2_server_interop if args.http2_interop: languages_to_build.add(http2Interop) - if args.http2_badserver_interop: + if args.http2_server_interop: languages_to_build.add(http2InteropServer) build_jobs = [] @@ -943,7 +966,6 @@ client_manual_cmd_log = [] if args.manual_run else None # Start interop servers. server_jobs = {} server_addresses = {} -http2_badserver_ports = () try: for s in servers: lang = str(s) @@ -957,15 +979,15 @@ try: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') - http2_badserver_job = None - if args.http2_badserver_interop: + http2_server_job = None + if args.http2_server_interop: # launch a HTTP2 server emulator that creates edge cases lang = str(http2InteropServer) spec = server_jobspec(http2InteropServer, docker_images.get(lang), manual_cmd_log=server_manual_cmd_log) if not args.manual_run: - http2_badserver_job = dockerjob.DockerJob(spec) - server_jobs[lang] = http2_badserver_job + http2_server_job = dockerjob.DockerJob(spec) + server_jobs[lang] = http2_server_job else: # don't run the server, set server port to a placeholder value server_addresses[lang] = ('localhost', '${SERVER_PORT}') @@ -1049,15 +1071,15 @@ try: manual_cmd_log=client_manual_cmd_log) jobs.append(test_job) - if args.http2_badserver_interop: + if args.http2_server_interop: if not args.manual_run: - http2_badserver_job.wait_for_healthy(timeout_seconds=600) - for language in languages_http2_badserver_interop: - for test_case in _HTTP2_BADSERVER_TEST_CASES: - offset = sorted(_HTTP2_BADSERVER_TEST_CASES).index(test_case) + http2_server_job.wait_for_healthy(timeout_seconds=600) + for language in languages_http2_clients_for_http2_server_interop: + for test_case in set(_HTTP2_SERVER_TEST_CASES) - set(_HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS): + offset = sorted(_HTTP2_SERVER_TEST_CASES).index(test_case) server_port = _DEFAULT_SERVER_PORT+offset if not args.manual_run: - server_port = http2_badserver_job.mapped_port(server_port) + server_port = http2_server_job.mapped_port(server_port) test_job = cloud_to_cloud_jobspec(language, test_case, str(http2InteropServer), @@ -1066,6 +1088,31 @@ try: docker_image=docker_images.get(str(language)), manual_cmd_log=client_manual_cmd_log) jobs.append(test_job) + for language in languages: + # HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS is a subset of + # HTTP_SERVER_TEST_CASES, in which clients use their gRPC interop clients rather + # than specialized http2 clients, reusing existing test implementations. + # For example, in the "data_frame_padding" test, use language's gRPC + # interop clients and make them think that theyre running "large_unary" + # test case. This avoids implementing a new test case in each language. + for test_case in _HTTP2_SERVER_TEST_CASES_THAT_USE_GRPC_CLIENTS: + if test_case not in language.unimplemented_test_cases(): + offset = sorted(_HTTP2_SERVER_TEST_CASES).index(test_case) + server_port = _DEFAULT_SERVER_PORT+offset + if not args.manual_run: + server_port = http2_server_job.mapped_port(server_port) + if not args.insecure: + print(('Creating grpc cient to http2 server test case with insecure connection, even though' + ' args.insecure is False. Http2 test server only supports insecure connections.')) + test_job = cloud_to_cloud_jobspec(language, + test_case, + str(http2InteropServer), + 'localhost', + server_port, + docker_image=docker_images.get(str(language)), + insecure=True, + manual_cmd_log=client_manual_cmd_log) + jobs.append(test_job) if not jobs: print('No jobs to run.') @@ -1093,16 +1140,17 @@ try: if "http2" in name: job[0].http2results = aggregate_http2_results(job[0].message) - http2_badserver_test_cases = ( - _HTTP2_BADSERVER_TEST_CASES if args.http2_badserver_interop else []) + http2_server_test_cases = ( + _HTTP2_SERVER_TEST_CASES if args.http2_server_interop else []) report_utils.render_interop_html_report( set([str(l) for l in languages]), servers, _TEST_CASES, _AUTH_TEST_CASES, - _HTTP2_TEST_CASES, http2_badserver_test_cases, - _LANGUAGES_FOR_HTTP2_BADSERVER_TESTS, resultset, num_failures, + _HTTP2_TEST_CASES, http2_server_test_cases, resultset, num_failures, args.cloud_to_prod_auth or args.cloud_to_prod, args.prod_servers, args.http2_interop) - +except Exception as e: + print('exception occurred:') + traceback.print_exc(file=sys.stdout) finally: # Check if servers are still running. for server, job in server_jobs.items(): From 659ae125228bf9c1e9d1be917871190b008a8c00 Mon Sep 17 00:00:00 2001 From: Ritesh Shukla Date: Wed, 22 Mar 2017 14:23:36 -0700 Subject: [PATCH 169/186] Fix markdown to comply with GitHub --- INSTALL.md | 24 ++++++++++++------------ README.md | 14 +++++++------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 24f088ea492..89f2f11f9da 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -1,4 +1,4 @@ -#If you are in a hurry +# If you are in a hurry For language-specific installation instructions for gRPC runtime, please refer to these documents @@ -14,15 +14,15 @@ refer to these documents * [Ruby](src/ruby): `gem install grpc` -#Pre-requisites +# Pre-requisites -##Linux +## Linux ```sh $ [sudo] apt-get install build-essential autoconf libtool ``` -##Mac OSX +## Mac OSX For a Mac system, git is not available by default. You will first need to install Xcode from the Mac AppStore and then run the following command from a @@ -32,7 +32,7 @@ terminal: $ [sudo] xcode-select --install ``` -##Protoc +## Protoc By default gRPC uses [protocol buffers](https://github.com/google/protobuf), you will need the `protoc` compiler to generate stub server and client code. @@ -43,7 +43,7 @@ repository recursively and it detects that you don't already have it installed. -#Build from Source +# Build from Source For developers who are interested to contribute, here is how to compile the gRPC C Core library. @@ -56,16 +56,16 @@ gRPC C Core library. $ [sudo] make install ``` -##Windows +## Windows There are several ways to build under Windows, of varying complexity depending on experience with the tools involved. -###Pre-generated Visual Studio solution +### Pre-generated Visual Studio solution The pre-generated VS projects & solution are checked into the repository under the [vsprojects](/vsprojects) directory. - -###Building using CMake (with BoringSSL) + +### Building using CMake (with BoringSSL) - Install [CMake](https://cmake.org/download/). - Install [Active State Perl](http://www.activestate.com/activeperl/) (`choco install activeperl`) - Install [Ninja](https://ninja-build.org/) (`choco install ninja`) @@ -81,14 +81,14 @@ The pre-generated VS projects & solution are checked into the repository under t ``` NOTE: Currently you can only use Ninja to build using cmake on Windows (because of the boringssl dependency). -###msys2 (with mingw) +### msys2 (with mingw) The Makefile (and source code) should support msys2's mingw32 and mingw64 compilers. Building with msys2's native compiler is also possible, but difficult. This approach requires having [msys2](https://msys2.github.io/) installed. - + ``` # Install prerequisites MSYS2$ pacman -S autoconf automake gcc libtool mingw-w64-x86_64-toolchain perl pkg-config zlib diff --git a/README.md b/README.md index 174e861f594..2d73d7a7ad5 100644 --- a/README.md +++ b/README.md @@ -7,11 +7,11 @@ Copyright 2015 Google Inc. -#Documentation +# Documentation You can find more detailed documentation and examples in the [doc](doc) and [examples](examples) directories respectively. -#Installation & Testing +# Installation & Testing See [INSTALL](INSTALL.md) for installation instructions for various platforms. @@ -19,7 +19,7 @@ See [tools/run_tests](tools/run_tests) for more guidance on how to run various t See [Performance dashboard](http://performance-dot-grpc-testing.appspot.com/explore?dashboard=5712453606309888) for the performance numbers for v1.0.x. -#Repository Structure & Status +# Repository Structure & Status This repository contains source code for gRPC libraries for multiple languages written on top of shared C core library [src/core] (src/core). @@ -44,7 +44,7 @@ Go source code is in the [grpc-go] (http://github.com/grpc/grpc-go) repository. See [MANIFEST.md](MANIFEST.md) for a listing of top-level items in the repository. -#Overview +# Overview Remote Procedure Calls (RPCs) provide a useful abstraction for building @@ -54,7 +54,7 @@ These libraries enable communication between clients and servers using any combination of the supported languages. -##Interface +## Interface Developers using gRPC typically start with the description of an RPC service @@ -66,7 +66,7 @@ Interface Definition Language (IDL) for describing both the service interface and the structure of the payload messages. It is possible to use other alternatives if desired. -###Surface API +### Surface API Starting from an interface definition in a .proto file, gRPC provides Protocol Compiler plugins that generate Client- and Server-side APIs. gRPC users typically call into these APIs on the Client side and implement @@ -94,7 +94,7 @@ the client and the server can send a stream of messages to each other. The strea messages are delivered in the order they were sent. -#Protocol +# Protocol The [gRPC protocol](doc/PROTOCOL-HTTP2.md) specifies the abstract requirements for communication between clients and servers. A concrete embedding over HTTP/2 completes the picture by From 02d131b5ef69e5427b078caa68c49da8eda91bac Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Wed, 22 Mar 2017 15:12:32 -0700 Subject: [PATCH 170/186] fix mac crash on abruptly ended server thread --- src/ruby/end2end/sig_int_during_channel_watch_driver.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ruby/end2end/sig_int_during_channel_watch_driver.rb b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb index 8c9fecd5493..84d039bf19d 100755 --- a/src/ruby/end2end/sig_int_during_channel_watch_driver.rb +++ b/src/ruby/end2end/sig_int_during_channel_watch_driver.rb @@ -62,6 +62,8 @@ def main raise 'Timed out waiting for client process. It likely hangs when a ' \ 'SIGINT is sent while there is an active connectivity_state call' end + + server_runner.stop end main From f5b6b5b70234e406e2a6b2ddf031165b47dd5663 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Wed, 22 Mar 2017 12:08:38 -0700 Subject: [PATCH 171/186] Replace existing string in SetUserAgentPrefix --- src/cpp/common/channel_arguments.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/cpp/common/channel_arguments.cc b/src/cpp/common/channel_arguments.cc index eddcacc3325..53e4a9c39c1 100644 --- a/src/cpp/common/channel_arguments.cc +++ b/src/cpp/common/channel_arguments.cc @@ -133,14 +133,19 @@ void ChannelArguments::SetUserAgentPrefix( return; } bool replaced = false; + auto strings_it = strings_.begin(); for (auto it = args_.begin(); it != args_.end(); ++it) { const grpc_arg& arg = *it; - if (arg.type == GRPC_ARG_STRING && - grpc::string(arg.key) == GRPC_ARG_PRIMARY_USER_AGENT_STRING) { - strings_.push_back(user_agent_prefix + " " + arg.value.string); - it->value.string = const_cast(strings_.back().c_str()); - replaced = true; - break; + ++strings_it; + if (arg.type == GRPC_ARG_STRING) { + if (grpc::string(arg.key) == GRPC_ARG_PRIMARY_USER_AGENT_STRING) { + GPR_ASSERT(arg.value.string == strings_it->c_str()); + *(strings_it) = user_agent_prefix + " " + arg.value.string; + it->value.string = const_cast(strings_it->c_str()); + replaced = true; + break; + } + ++strings_it; } } if (!replaced) { From 9f0a115f059c3a6be619c41173a50f56364e119c Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Wed, 22 Mar 2017 18:03:06 -0700 Subject: [PATCH 172/186] Test if the user agent string is copied correctly --- test/cpp/common/channel_arguments_test.cc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/cpp/common/channel_arguments_test.cc b/test/cpp/common/channel_arguments_test.cc index 9bcc9f99f68..8e7b56cbd61 100644 --- a/test/cpp/common/channel_arguments_test.cc +++ b/test/cpp/common/channel_arguments_test.cc @@ -243,6 +243,22 @@ TEST_F(ChannelArgumentsTest, SetUserAgentPrefix) { channel_args_.SetUserAgentPrefix(prefix); EXPECT_TRUE(HasArg(arg0)); + + // Test if the user agent string is copied correctly + ChannelArguments new_channel_args(channel_args_); + grpc_channel_args args; + SetChannelArgs(new_channel_args, &args); + bool found = false; + for (size_t i = 0; i < args.num_args; i++) { + const grpc_arg& arg = args.args[i]; + if (arg.type == GRPC_ARG_STRING && + grpc::string(arg.key) == GRPC_ARG_PRIMARY_USER_AGENT_STRING) { + EXPECT_FALSE(found); + EXPECT_EQ(0, strcmp(arg.value.string, arg0.value.string)); + found = true; + } + } + EXPECT_TRUE(found); } } // namespace testing From a0cbe8c0f7885bb0c2369071182ce2083d57bf29 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Fri, 17 Mar 2017 17:15:05 +0000 Subject: [PATCH 173/186] Fix and un-skip testFileContainingExtension Fix and un-skip the test for _file_containing_extension in python reflection service to refer to the correct proto and expect the right object to be returned. Enable it too. --- .../tests/reflection/_reflection_servicer_test.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index 4d73be6204c..5163ffe7381 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -39,14 +39,18 @@ from grpc_reflection.v1alpha import reflection_pb2_grpc from google.protobuf import descriptor_pool from google.protobuf import descriptor_pb2 -from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 from src.proto.grpc.testing import empty_pb2 + +from src.proto.grpc.testing.proto2 import empty2_pb2 +from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 + from tests.unit.framework.common import test_constants _EMPTY_PROTO_FILE_NAME = 'src/proto/grpc/testing/empty.proto' _EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty' _SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', 'Galilei') +_EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions' def _file_descriptor_to_proto(descriptor): @@ -109,13 +113,10 @@ class ReflectionServicerTest(unittest.TestCase): )),) self.assertSequenceEqual(expected_responses, responses) - @unittest.skip( - 'TODO(atash): implement file-containing-extension reflection ' - '(see https://github.com/google/protobuf/issues/2248)') def testFileContainingExtension(self): requests = (reflection_pb2.ServerReflectionRequest( file_containing_extension=reflection_pb2.ExtensionRequest( - containing_type='grpc.testing.proto2.Empty', + containing_type=_EMPTY_EXTENSIONS_SYMBOL_NAME, extension_number=125,), ), reflection_pb2.ServerReflectionRequest( file_containing_extension=reflection_pb2.ExtensionRequest( @@ -127,7 +128,7 @@ class ReflectionServicerTest(unittest.TestCase): valid_host='', file_descriptor_response=reflection_pb2.FileDescriptorResponse( file_descriptor_proto=(_file_descriptor_to_proto( - empty_extensions_pb2.DESCRIPTOR),))), + empty2_extensions_pb2.DESCRIPTOR),))), reflection_pb2.ServerReflectionResponse( valid_host='', error_response=reflection_pb2.ErrorResponse( From 8be4e03af2dddb4bdc89df8595a30c8d5fc7cb12 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Fri, 17 Mar 2017 17:19:30 +0000 Subject: [PATCH 174/186] Add ReflectionServicer._file_containing_extension --- .../grpc_reflection/v1alpha/reflection.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 87f28396ce2..fdb8baab0d9 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -84,13 +84,17 @@ class ReflectionServicer(reflection_pb2.ServerReflectionServicer): else: return _file_descriptor_response(descriptor) - def _file_containing_extension(containing_type, extension_number): - # TODO(atash) Python protobuf currently doesn't support querying extensions. - # https://github.com/google/protobuf/issues/2248 - return reflection_pb2.ServerReflectionResponse( - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.UNIMPLEMENTED.value[0], - error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),)) + def _file_containing_extension(self, containing_type, extension_number): + try: + message_descriptor = self._pool.FindMessageTypeByName(containing_type) + extension_descriptor = self._pool.FindExtensionByNumber( + message_descriptor, extension_number) + descriptor = self._pool.FindFileContainingSymbol( + extension_descriptor.full_name) + except KeyError: + return _not_found_error() + else: + return _file_descriptor_response(descriptor) def _extension_numbers_of_type(fully_qualified_name): # TODO(atash) We're allowed to leave this unsupported according to the From 03d9500ec022b6c307d982b05c7d5b6917bbcec5 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Mon, 20 Mar 2017 08:05:25 +0000 Subject: [PATCH 175/186] Test all_extension_numbers_of_type --- .../reflection/_reflection_servicer_test.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index 5163ffe7381..69192a2b741 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -51,6 +51,7 @@ _EMPTY_PROTO_SYMBOL_NAME = 'grpc.testing.Empty' _SERVICE_NAMES = ('Angstrom', 'Bohr', 'Curie', 'Dyson', 'Einstein', 'Feynman', 'Galilei') _EMPTY_EXTENSIONS_SYMBOL_NAME = 'grpc.testing.proto2.EmptyWithExtensions' +_EMPTY_EXTENSIONS_NUMBERS = (124, 125, 126, 127, 128,) def _file_descriptor_to_proto(descriptor): @@ -137,6 +138,27 @@ class ReflectionServicerTest(unittest.TestCase): )),) self.assertSequenceEqual(expected_responses, responses) + def testExtensionNumbersOfType(self): + requests = (reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type=_EMPTY_EXTENSIONS_SYMBOL_NAME + ), reflection_pb2.ServerReflectionRequest( + all_extension_numbers_of_type='i.donut.exist.co.uk.net.name.foo'),) + responses = tuple(self._stub.ServerReflectionInfo(iter(requests))) + expected_responses = ( + reflection_pb2.ServerReflectionResponse( + valid_host='', + all_extension_numbers_response=reflection_pb2. + ExtensionNumberResponse( + base_type_name=_EMPTY_EXTENSIONS_SYMBOL_NAME, + extension_number=_EMPTY_EXTENSIONS_NUMBERS)), + reflection_pb2.ServerReflectionResponse( + valid_host='', + error_response=reflection_pb2.ErrorResponse( + error_code=grpc.StatusCode.NOT_FOUND.value[0], + error_message=grpc.StatusCode.NOT_FOUND.value[1].encode(), + )),) + self.assertSequenceEqual(expected_responses, responses) + def testListServices(self): requests = (reflection_pb2.ServerReflectionRequest( list_services='',),) From 9ca61fd05f7e56483fb6bf4ba566ff36b2d868d1 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Mon, 20 Mar 2017 08:07:20 +0000 Subject: [PATCH 176/186] Add all_extension_numbers_of_type in py reflection --- .../grpc_reflection/v1alpha/reflection.py | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index fdb8baab0d9..f9f78fcad4e 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -96,15 +96,20 @@ class ReflectionServicer(reflection_pb2.ServerReflectionServicer): else: return _file_descriptor_response(descriptor) - def _extension_numbers_of_type(fully_qualified_name): - # TODO(atash) We're allowed to leave this unsupported according to the - # protocol, but we should still eventually implement it. Hits the same issue - # as `_file_containing_extension`, however. - # https://github.com/google/protobuf/issues/2248 - return reflection_pb2.ServerReflectionResponse( - error_response=reflection_pb2.ErrorResponse( - error_code=grpc.StatusCode.UNIMPLEMENTED.value[0], - error_message=grpc.StatusCode.UNIMPLMENTED.value[1].encode(),)) + def _all_extension_numbers_of_type(self, containing_type): + try: + message_descriptor = self._pool.FindMessageTypeByName(containing_type) + extension_numbers = tuple(sorted( + extension.number + for extension in self._pool.FindAllExtensions(message_descriptor))) + except KeyError: + return _not_found_error() + else: + return reflection_pb2.ServerReflectionResponse( + all_extension_numbers_response=reflection_pb2. + ExtensionNumberResponse( + base_type_name=message_descriptor.full_name, + extension_number=extension_numbers)) def _list_services(self): return reflection_pb2.ServerReflectionResponse( @@ -125,7 +130,7 @@ class ReflectionServicer(reflection_pb2.ServerReflectionServicer): request.file_containing_extension.containing_type, request.file_containing_extension.extension_number) elif request.HasField('all_extension_numbers_of_type'): - yield _all_extension_numbers_of_type( + yield self._all_extension_numbers_of_type( request.all_extension_numbers_of_type) elif request.HasField('list_services'): yield self._list_services() From 7be69fcc1c5bf3b87a88749a33c9aa42f6a33dba Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Mon, 20 Mar 2017 08:08:32 +0000 Subject: [PATCH 177/186] Add helper function for enabling python reflection --- .../grpc_reflection/v1alpha/reflection.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index f9f78fcad4e..4e4b10fa970 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -35,6 +35,7 @@ from google.protobuf import descriptor_pb2 from google.protobuf import descriptor_pool from grpc_reflection.v1alpha import reflection_pb2 +from grpc_reflection.v1alpha import reflection_pb2_grpc _POOL = descriptor_pool.Default() @@ -140,3 +141,14 @@ class ReflectionServicer(reflection_pb2.ServerReflectionServicer): error_code=grpc.StatusCode.INVALID_ARGUMENT.value[0], error_message=grpc.StatusCode.INVALID_ARGUMENT.value[1] .encode(),)) + + +def enable_server_reflection(service_names, server): + """Enables server reflection on a server. + + Args: + service_names: Iterable of fully-qualified service names available. + server: grpc.Server to which reflection service will be added. + """ + reflection_pb2_grpc.add_ServerReflectionServicer_to_server( + ReflectionServicer(service_names), server) From 7472e13095b15f65654f2e463a10bfbf616c2d72 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Tue, 21 Mar 2017 19:23:58 +0000 Subject: [PATCH 178/186] Sort service_names returned by python reflection While not strictly required by the protocol, it will make testing easier. --- .../grpcio_reflection/grpc_reflection/v1alpha/reflection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py index 4e4b10fa970..c8ad9668acc 100644 --- a/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py +++ b/src/python/grpcio_reflection/grpc_reflection/v1alpha/reflection.py @@ -65,7 +65,7 @@ class ReflectionServicer(reflection_pb2.ServerReflectionServicer): Args: service_names: Iterable of fully-qualified service names available. """ - self._service_names = list(service_names) + self._service_names = tuple(sorted(service_names)) self._pool = _POOL if pool is None else pool def _file_by_filename(self, filename): From 626efa67f0101af6bb4f6505b0eef848b148585a Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Wed, 22 Mar 2017 14:07:00 -0700 Subject: [PATCH 179/186] Temporarily disable testFileContainingExtension There is a behavioral discrepency in `DescriptorPool.FindFileContainingSymbol` between the two implementations of the protobuf python library (one of which is purely python, and the other utilizes a python extension library written in C++). protobuf on PyPI is distributed via various prebuilt wheels, and our CI setup fetches the relevant one for each platform. Our Linux instances end up fetching a pre-compiled C++ version of the library, whereas our Mac and Windows builders automatically get the pure python version. This test fails (and our reflection implementation itself) succeeds with the C++ implementation but fails with the pure python version. The test will be temporarily disabled pending a fix for https://github.com/google/protobuf/issues/2882 --- .../grpcio_tests/tests/reflection/_reflection_servicer_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index 69192a2b741..56b85c2dd09 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -114,6 +114,9 @@ class ReflectionServicerTest(unittest.TestCase): )),) self.assertSequenceEqual(expected_responses, responses) + @unittest.skip( + 'TODO(mmx): enable when (pure) python protobuf issue is fixed' + '(see https://github.com/google/protobuf/issues/2882)') def testFileContainingExtension(self): requests = (reflection_pb2.ServerReflectionRequest( file_containing_extension=reflection_pb2.ExtensionRequest( From 02735941e41a40702e5e01619697afddb8b1ac2f Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Thu, 23 Mar 2017 10:27:30 -0700 Subject: [PATCH 180/186] Add pylint comment to justify unused import --- .../tests/reflection/_reflection_servicer_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py index 56b85c2dd09..14e6d64c66b 100644 --- a/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py +++ b/src/python/grpcio_tests/tests/reflection/_reflection_servicer_test.py @@ -40,8 +40,8 @@ from google.protobuf import descriptor_pool from google.protobuf import descriptor_pb2 from src.proto.grpc.testing import empty_pb2 - -from src.proto.grpc.testing.proto2 import empty2_pb2 +#empty2_pb2 is imported for import-consequent side-effects. +from src.proto.grpc.testing.proto2 import empty2_pb2 # pylint: disable=unused-import from src.proto.grpc.testing.proto2 import empty2_extensions_pb2 from tests.unit.framework.common import test_constants From b129095618fd3288179e9cca0ed294e281eea5c2 Mon Sep 17 00:00:00 2001 From: Yuchen Zeng Date: Thu, 23 Mar 2017 10:37:02 -0700 Subject: [PATCH 181/186] Fix tcp_server_utils_posix_common --- src/core/lib/iomgr/tcp_server_utils_posix_common.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/lib/iomgr/tcp_server_utils_posix_common.c b/src/core/lib/iomgr/tcp_server_utils_posix_common.c index 283b92b0a2f..af2b00b4b54 100644 --- a/src/core/lib/iomgr/tcp_server_utils_posix_common.c +++ b/src/core/lib/iomgr/tcp_server_utils_posix_common.c @@ -33,7 +33,7 @@ #include "src/core/lib/iomgr/port.h" -#ifdef GRPC_HAVE_IFADDRS +#ifdef GRPC_POSIX_SOCKET #include "src/core/lib/iomgr/tcp_server_utils_posix.h" @@ -218,4 +218,4 @@ error: return ret; } -#endif /* GRPC_HAVE_IFADDRS */ +#endif /* GRPC_POSIX_SOCKET */ From 604abf4fa57fffa5448a85d606db290574c33493 Mon Sep 17 00:00:00 2001 From: Alexander Polcyn Date: Thu, 23 Mar 2017 11:20:15 -0700 Subject: [PATCH 182/186] add generated imports header to be able to build on mingw --- src/ruby/ext/grpc/rb_channel.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ruby/ext/grpc/rb_channel.c b/src/ruby/ext/grpc/rb_channel.c index ba230525217..1c20c8813ff 100644 --- a/src/ruby/ext/grpc/rb_channel.c +++ b/src/ruby/ext/grpc/rb_channel.c @@ -34,6 +34,7 @@ #include #include +#include "rb_grpc_imports.generated.h" #include "rb_byte_buffer.h" #include "rb_channel.h" From a8a569035f8e92caa3fa40c343eb827b2dbef24a Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 23 Mar 2017 14:07:28 -0700 Subject: [PATCH 183/186] Use 7-bit prefix in manually created header. --- src/core/ext/transport/chttp2/transport/chttp2_transport.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c index 88d96b1a15c..8676a3752e8 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c @@ -1835,7 +1835,7 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, size_t msg_len = GRPC_SLICE_LENGTH(slice); GPR_ASSERT(msg_len <= UINT32_MAX); - uint32_t msg_len_len = GRPC_CHTTP2_VARINT_LENGTH((uint32_t)msg_len, 0); + uint32_t msg_len_len = GRPC_CHTTP2_VARINT_LENGTH((uint32_t)msg_len, 1); message_pfx = grpc_slice_malloc(14 + msg_len_len); p = GRPC_SLICE_START_PTR(message_pfx); *p++ = 0x00; /* literal header, not indexed */ @@ -1852,7 +1852,7 @@ static void close_from_api(grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, *p++ = 'a'; *p++ = 'g'; *p++ = 'e'; - GRPC_CHTTP2_WRITE_VARINT((uint32_t)msg_len, 0, 0, p, (uint32_t)msg_len_len); + GRPC_CHTTP2_WRITE_VARINT((uint32_t)msg_len, 1, 0, p, (uint32_t)msg_len_len); p += msg_len_len; GPR_ASSERT(p == GRPC_SLICE_END_PTR(message_pfx)); len += (uint32_t)GRPC_SLICE_LENGTH(message_pfx); From 8fc385a3d2132ef2035d18d08598666291915e0a Mon Sep 17 00:00:00 2001 From: yang-g Date: Thu, 23 Mar 2017 16:29:01 -0700 Subject: [PATCH 184/186] Prevent cleaning up the fd twice. --- src/core/lib/iomgr/udp_server.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/core/lib/iomgr/udp_server.c b/src/core/lib/iomgr/udp_server.c index 28f2bd93598..95013cb6fbd 100644 --- a/src/core/lib/iomgr/udp_server.c +++ b/src/core/lib/iomgr/udp_server.c @@ -162,10 +162,7 @@ static void deactivated_all_ports(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) { /* delete ALL the things */ gpr_mu_lock(&s->mu); - if (!s->shutdown) { - gpr_mu_unlock(&s->mu); - return; - } + GPR_ASSERT(s->shutdown); if (s->head) { grpc_udp_listener *sp; @@ -288,7 +285,7 @@ static void on_read(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { gpr_mu_lock(&sp->server->mu); if (error != GRPC_ERROR_NONE) { - if (0 == --sp->server->active_ports) { + if (0 == --sp->server->active_ports && sp->server->shutdown) { gpr_mu_unlock(&sp->server->mu); deactivated_all_ports(exec_ctx, sp->server); } else { @@ -311,7 +308,7 @@ static void on_write(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { gpr_mu_lock(&(sp->server->mu)); if (error != GRPC_ERROR_NONE) { - if (0 == --sp->server->active_ports) { + if (0 == --sp->server->active_ports && sp->server->shutdown) { gpr_mu_unlock(&sp->server->mu); deactivated_all_ports(exec_ctx, sp->server); } else { From db7eec7c6d21feec695a4a63a961469730d32452 Mon Sep 17 00:00:00 2001 From: Leonardo Saraiva Date: Fri, 24 Mar 2017 11:24:58 -0300 Subject: [PATCH 185/186] Remove spaces for correct format --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 174e861f594..934333c4731 100644 --- a/README.md +++ b/README.md @@ -37,8 +37,8 @@ Libraries in different languages may be in different states of development. We a | Objective-C | [src/objective-c] (src/objective-c) | 1.0 | -Java source code is in the [grpc-java] (http://github.com/grpc/grpc-java) repository. -Go source code is in the [grpc-go] (http://github.com/grpc/grpc-go) repository. +Java source code is in the [grpc-java](http://github.com/grpc/grpc-java) repository. +Go source code is in the [grpc-go](http://github.com/grpc/grpc-go) repository. See [MANIFEST.md](MANIFEST.md) for a listing of top-level items in the From c46b3ebeb925baf3d006f0a5c297dd4539e40797 Mon Sep 17 00:00:00 2001 From: Michael Warres Date: Wed, 22 Feb 2017 22:57:04 -0500 Subject: [PATCH 186/186] Add socket factory support to udp_server.c --- BUILD | 4 +- CMakeLists.txt | 5 + Makefile | 5 + binding.gyp | 1 + build.yaml | 2 + config.m4 | 1 + gRPC-Core.podspec | 3 + grpc.gemspec | 2 + include/grpc/impl/codegen/grpc_types.h | 5 + package.xml | 2 + src/core/lib/iomgr/socket_factory_posix.c | 110 ++++++++++++++++++ src/core/lib/iomgr/socket_factory_posix.h | 90 ++++++++++++++ .../lib/iomgr/socket_utils_common_posix.c | 18 ++- src/core/lib/iomgr/socket_utils_posix.h | 7 ++ src/core/lib/iomgr/udp_server.c | 49 ++++++-- src/core/lib/iomgr/udp_server.h | 2 +- src/python/grpcio/grpc_core_dependencies.py | 1 + test/core/iomgr/udp_server_test.c | 89 +++++++++++++- tools/doxygen/Doxyfile.core.internal | 2 + .../generated/sources_and_headers.json | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj | 3 + vsprojects/vcxproj/grpc/grpc.vcxproj.filters | 6 + .../grpc_test_util/grpc_test_util.vcxproj | 3 + .../grpc_test_util.vcxproj.filters | 6 + .../grpc_unsecure/grpc_unsecure.vcxproj | 3 + .../grpc_unsecure.vcxproj.filters | 6 + 26 files changed, 411 insertions(+), 17 deletions(-) create mode 100644 src/core/lib/iomgr/socket_factory_posix.c create mode 100644 src/core/lib/iomgr/socket_factory_posix.h diff --git a/BUILD b/BUILD index 053f581101d..10d5c447ca2 100644 --- a/BUILD +++ b/BUILD @@ -354,8 +354,8 @@ grpc_cc_library( "src/core/lib/support/wrap_memcpy.c", ], hdrs = [ - "src/core/lib/support/arena.h", "src/core/lib/profiling/timers.h", + "src/core/lib/support/arena.h", "src/core/lib/support/backoff.h", "src/core/lib/support/block_annotate.h", "src/core/lib/support/env.h", @@ -472,6 +472,7 @@ grpc_cc_library( "src/core/lib/iomgr/resolve_address_windows.c", "src/core/lib/iomgr/resource_quota.c", "src/core/lib/iomgr/sockaddr_utils.c", + "src/core/lib/iomgr/socket_factory_posix.c", "src/core/lib/iomgr/socket_mutator.c", "src/core/lib/iomgr/socket_utils_common_posix.c", "src/core/lib/iomgr/socket_utils_linux.c", @@ -597,6 +598,7 @@ grpc_cc_library( "src/core/lib/iomgr/sockaddr_posix.h", "src/core/lib/iomgr/sockaddr_utils.h", "src/core/lib/iomgr/sockaddr_windows.h", + "src/core/lib/iomgr/socket_factory_posix.h", "src/core/lib/iomgr/socket_mutator.h", "src/core/lib/iomgr/socket_utils.h", "src/core/lib/iomgr/socket_utils_posix.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a8bff55342..f73d76dbe64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -913,6 +913,7 @@ add_library(grpc src/core/lib/iomgr/resolve_address_windows.c src/core/lib/iomgr/resource_quota.c src/core/lib/iomgr/sockaddr_utils.c + src/core/lib/iomgr/socket_factory_posix.c src/core/lib/iomgr/socket_mutator.c src/core/lib/iomgr/socket_utils_common_posix.c src/core/lib/iomgr/socket_utils_linux.c @@ -1224,6 +1225,7 @@ add_library(grpc_cronet src/core/lib/iomgr/resolve_address_windows.c src/core/lib/iomgr/resource_quota.c src/core/lib/iomgr/sockaddr_utils.c + src/core/lib/iomgr/socket_factory_posix.c src/core/lib/iomgr/socket_mutator.c src/core/lib/iomgr/socket_utils_common_posix.c src/core/lib/iomgr/socket_utils_linux.c @@ -1526,6 +1528,7 @@ add_library(grpc_test_util src/core/lib/iomgr/resolve_address_windows.c src/core/lib/iomgr/resource_quota.c src/core/lib/iomgr/sockaddr_utils.c + src/core/lib/iomgr/socket_factory_posix.c src/core/lib/iomgr/socket_mutator.c src/core/lib/iomgr/socket_utils_common_posix.c src/core/lib/iomgr/socket_utils_linux.c @@ -1775,6 +1778,7 @@ add_library(grpc_unsecure src/core/lib/iomgr/resolve_address_windows.c src/core/lib/iomgr/resource_quota.c src/core/lib/iomgr/sockaddr_utils.c + src/core/lib/iomgr/socket_factory_posix.c src/core/lib/iomgr/socket_mutator.c src/core/lib/iomgr/socket_utils_common_posix.c src/core/lib/iomgr/socket_utils_linux.c @@ -2384,6 +2388,7 @@ add_library(grpc++_cronet src/core/lib/iomgr/resolve_address_windows.c src/core/lib/iomgr/resource_quota.c src/core/lib/iomgr/sockaddr_utils.c + src/core/lib/iomgr/socket_factory_posix.c src/core/lib/iomgr/socket_mutator.c src/core/lib/iomgr/socket_utils_common_posix.c src/core/lib/iomgr/socket_utils_linux.c diff --git a/Makefile b/Makefile index a1659cc8e5e..9d3aee8a719 100644 --- a/Makefile +++ b/Makefile @@ -2804,6 +2804,7 @@ LIBGRPC_SRC = \ src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ @@ -3118,6 +3119,7 @@ LIBGRPC_CRONET_SRC = \ src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ @@ -3423,6 +3425,7 @@ LIBGRPC_TEST_UTIL_SRC = \ src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ @@ -3652,6 +3655,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ @@ -4263,6 +4267,7 @@ LIBGRPC++_CRONET_SRC = \ src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ diff --git a/binding.gyp b/binding.gyp index 2ec57768ae7..12ed7a8f3ca 100644 --- a/binding.gyp +++ b/binding.gyp @@ -657,6 +657,7 @@ 'src/core/lib/iomgr/resolve_address_windows.c', 'src/core/lib/iomgr/resource_quota.c', 'src/core/lib/iomgr/sockaddr_utils.c', + 'src/core/lib/iomgr/socket_factory_posix.c', 'src/core/lib/iomgr/socket_mutator.c', 'src/core/lib/iomgr/socket_utils_common_posix.c', 'src/core/lib/iomgr/socket_utils_linux.c', diff --git a/build.yaml b/build.yaml index 72b15374c63..63f22fd2fd7 100644 --- a/build.yaml +++ b/build.yaml @@ -223,6 +223,7 @@ filegroups: - src/core/lib/iomgr/sockaddr_posix.h - src/core/lib/iomgr/sockaddr_utils.h - src/core/lib/iomgr/sockaddr_windows.h + - src/core/lib/iomgr/socket_factory_posix.h - src/core/lib/iomgr/socket_mutator.h - src/core/lib/iomgr/socket_utils.h - src/core/lib/iomgr/socket_utils_posix.h @@ -329,6 +330,7 @@ filegroups: - src/core/lib/iomgr/resolve_address_windows.c - src/core/lib/iomgr/resource_quota.c - src/core/lib/iomgr/sockaddr_utils.c + - src/core/lib/iomgr/socket_factory_posix.c - src/core/lib/iomgr/socket_mutator.c - src/core/lib/iomgr/socket_utils_common_posix.c - src/core/lib/iomgr/socket_utils_linux.c diff --git a/config.m4 b/config.m4 index 2bf302b8357..96ac5588c0f 100644 --- a/config.m4 +++ b/config.m4 @@ -130,6 +130,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/iomgr/resolve_address_windows.c \ src/core/lib/iomgr/resource_quota.c \ src/core/lib/iomgr/sockaddr_utils.c \ + src/core/lib/iomgr/socket_factory_posix.c \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_utils_common_posix.c \ src/core/lib/iomgr/socket_utils_linux.c \ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 6d1a59766e5..1d091d0f7f3 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -304,6 +304,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/sockaddr_posix.h', 'src/core/lib/iomgr/sockaddr_utils.h', 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.h', 'src/core/lib/iomgr/socket_mutator.h', 'src/core/lib/iomgr/socket_utils.h', 'src/core/lib/iomgr/socket_utils_posix.h', @@ -500,6 +501,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/resolve_address_windows.c', 'src/core/lib/iomgr/resource_quota.c', 'src/core/lib/iomgr/sockaddr_utils.c', + 'src/core/lib/iomgr/socket_factory_posix.c', 'src/core/lib/iomgr/socket_mutator.c', 'src/core/lib/iomgr/socket_utils_common_posix.c', 'src/core/lib/iomgr/socket_utils_linux.c', @@ -743,6 +745,7 @@ Pod::Spec.new do |s| 'src/core/lib/iomgr/sockaddr_posix.h', 'src/core/lib/iomgr/sockaddr_utils.h', 'src/core/lib/iomgr/sockaddr_windows.h', + 'src/core/lib/iomgr/socket_factory_posix.h', 'src/core/lib/iomgr/socket_mutator.h', 'src/core/lib/iomgr/socket_utils.h', 'src/core/lib/iomgr/socket_utils_posix.h', diff --git a/grpc.gemspec b/grpc.gemspec index 8074df266ce..c7d9bfb433f 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -221,6 +221,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/sockaddr_posix.h ) s.files += %w( src/core/lib/iomgr/sockaddr_utils.h ) s.files += %w( src/core/lib/iomgr/sockaddr_windows.h ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.h ) s.files += %w( src/core/lib/iomgr/socket_mutator.h ) s.files += %w( src/core/lib/iomgr/socket_utils.h ) s.files += %w( src/core/lib/iomgr/socket_utils_posix.h ) @@ -417,6 +418,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/iomgr/resolve_address_windows.c ) s.files += %w( src/core/lib/iomgr/resource_quota.c ) s.files += %w( src/core/lib/iomgr/sockaddr_utils.c ) + s.files += %w( src/core/lib/iomgr/socket_factory_posix.c ) s.files += %w( src/core/lib/iomgr/socket_mutator.c ) s.files += %w( src/core/lib/iomgr/socket_utils_common_posix.c ) s.files += %w( src/core/lib/iomgr/socket_utils_linux.c ) diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index e5c731304cd..887c176f1a4 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -87,6 +87,9 @@ typedef struct grpc_call grpc_call; /** The Socket Mutator interface allows changes on socket options */ typedef struct grpc_socket_mutator grpc_socket_mutator; +/** The Socket Factory interface creates and binds sockets */ +typedef struct grpc_socket_factory grpc_socket_factory; + /** Type specifier for grpc_arg */ typedef enum { GRPC_ARG_STRING, @@ -240,6 +243,8 @@ typedef struct { #define GRPC_ARG_LB_POLICY_NAME "grpc.lb_policy_name" /** The grpc_socket_mutator instance that set the socket options. A pointer. */ #define GRPC_ARG_SOCKET_MUTATOR "grpc.socket_mutator" +/** The grpc_socket_factory instance to create and bind sockets. A pointer. */ +#define GRPC_ARG_SOCKET_FACTORY "grpc.socket_factory" /** If non-zero, Cronet transport will coalesce packets to fewer frames when * possible. */ #define GRPC_ARG_USE_CRONET_PACKET_COALESCING \ diff --git a/package.xml b/package.xml index f096869e4ed..a47f1b9761a 100644 --- a/package.xml +++ b/package.xml @@ -230,6 +230,7 @@ + @@ -426,6 +427,7 @@ + diff --git a/src/core/lib/iomgr/socket_factory_posix.c b/src/core/lib/iomgr/socket_factory_posix.c new file mode 100644 index 00000000000..1050a14c469 --- /dev/null +++ b/src/core/lib/iomgr/socket_factory_posix.c @@ -0,0 +1,110 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "src/core/lib/iomgr/port.h" + +#ifdef GRPC_POSIX_SOCKET + +#include "src/core/lib/iomgr/socket_factory_posix.h" + +#include +#include +#include + +void grpc_socket_factory_init(grpc_socket_factory *factory, + const grpc_socket_factory_vtable *vtable) { + factory->vtable = vtable; + gpr_ref_init(&factory->refcount, 1); +} + +int grpc_socket_factory_socket(grpc_socket_factory *factory, int domain, + int type, int protocol) { + return factory->vtable->socket(factory, domain, type, protocol); +} + +int grpc_socket_factory_bind(grpc_socket_factory *factory, int sockfd, + const grpc_resolved_address *addr) { + return factory->vtable->bind(factory, sockfd, addr); +} + +int grpc_socket_factory_compare(grpc_socket_factory *a, + grpc_socket_factory *b) { + int c = GPR_ICMP(a, b); + if (c != 0) { + grpc_socket_factory *sma = a; + grpc_socket_factory *smb = b; + c = GPR_ICMP(sma->vtable, smb->vtable); + if (c == 0) { + c = sma->vtable->compare(sma, smb); + } + } + return c; +} + +grpc_socket_factory *grpc_socket_factory_ref(grpc_socket_factory *factory) { + gpr_ref(&factory->refcount); + return factory; +} + +void grpc_socket_factory_unref(grpc_socket_factory *factory) { + if (gpr_unref(&factory->refcount)) { + factory->vtable->destroy(factory); + } +} + +static void *socket_factory_arg_copy(void *p) { + return grpc_socket_factory_ref(p); +} + +static void socket_factory_arg_destroy(grpc_exec_ctx *exec_ctx, void *p) { + grpc_socket_factory_unref(p); +} + +static int socket_factory_cmp(void *a, void *b) { + return grpc_socket_factory_compare((grpc_socket_factory *)a, + (grpc_socket_factory *)b); +} + +static const grpc_arg_pointer_vtable socket_factory_arg_vtable = { + socket_factory_arg_copy, socket_factory_arg_destroy, socket_factory_cmp}; + +grpc_arg grpc_socket_factory_to_arg(grpc_socket_factory *factory) { + grpc_arg arg; + arg.type = GRPC_ARG_POINTER; + arg.key = GRPC_ARG_SOCKET_FACTORY; + arg.value.pointer.vtable = &socket_factory_arg_vtable; + arg.value.pointer.p = factory; + return arg; +} + +#endif diff --git a/src/core/lib/iomgr/socket_factory_posix.h b/src/core/lib/iomgr/socket_factory_posix.h new file mode 100644 index 00000000000..2c63299030c --- /dev/null +++ b/src/core/lib/iomgr/socket_factory_posix.h @@ -0,0 +1,90 @@ +/* + * + * Copyright 2017, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef GRPC_CORE_LIB_IOMGR_SOCKET_FACTORY_POSIX_H +#define GRPC_CORE_LIB_IOMGR_SOCKET_FACTORY_POSIX_H + +#include +#include +#include "src/core/lib/iomgr/resolve_address.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** The virtual table of grpc_socket_factory */ +typedef struct { + /** Replacement for socket(2) */ + int (*socket)(grpc_socket_factory *factory, int domain, int type, + int protocol); + /** Replacement for bind(2) */ + int (*bind)(grpc_socket_factory *factory, int sockfd, + const grpc_resolved_address *addr); + /** Compare socket factory \a a and \a b */ + int (*compare)(grpc_socket_factory *a, grpc_socket_factory *b); + /** Destroys the socket factory instance */ + void (*destroy)(grpc_socket_factory *factory); +} grpc_socket_factory_vtable; + +/** The Socket Factory interface allows changes on socket options */ +struct grpc_socket_factory { + const grpc_socket_factory_vtable *vtable; + gpr_refcount refcount; +}; + +/** called by concrete implementations to initialize the base struct */ +void grpc_socket_factory_init(grpc_socket_factory *factory, + const grpc_socket_factory_vtable *vtable); + +/** Wrap \a factory as a grpc_arg */ +grpc_arg grpc_socket_factory_to_arg(grpc_socket_factory *factory); + +/** Perform the equivalent of a socket(2) operation using \a factory */ +int grpc_socket_factory_socket(grpc_socket_factory *factory, int domain, + int type, int protocol); + +/** Perform the equivalent of a bind(2) operation using \a factory */ +int grpc_socket_factory_bind(grpc_socket_factory *factory, int sockfd, + const grpc_resolved_address *addr); + +/** Compare if \a a and \a b are the same factory or have same settings */ +int grpc_socket_factory_compare(grpc_socket_factory *a, grpc_socket_factory *b); + +grpc_socket_factory *grpc_socket_factory_ref(grpc_socket_factory *factory); +void grpc_socket_factory_unref(grpc_socket_factory *factory); + +#ifdef __cplusplus +} +#endif + +#endif /* GRPC_CORE_LIB_IOMGR_SOCKET_FACTORY_POSIX_H */ diff --git a/src/core/lib/iomgr/socket_utils_common_posix.c b/src/core/lib/iomgr/socket_utils_common_posix.c index b69c924d4ac..bbe642d0fb4 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.c +++ b/src/core/lib/iomgr/socket_utils_common_posix.c @@ -278,11 +278,25 @@ static grpc_error *error_for_fd(int fd, const grpc_resolved_address *addr) { grpc_error *grpc_create_dualstack_socket( const grpc_resolved_address *resolved_addr, int type, int protocol, grpc_dualstack_mode *dsmode, int *newfd) { + return grpc_create_dualstack_socket_using_factory(NULL, resolved_addr, type, + protocol, dsmode, newfd); +} + +static int create_socket(grpc_socket_factory *factory, int domain, int type, + int protocol) { + return (factory != NULL) + ? grpc_socket_factory_socket(factory, domain, type, protocol) + : socket(domain, type, protocol); +} + +grpc_error *grpc_create_dualstack_socket_using_factory( + grpc_socket_factory *factory, const grpc_resolved_address *resolved_addr, + int type, int protocol, grpc_dualstack_mode *dsmode, int *newfd) { const struct sockaddr *addr = (const struct sockaddr *)resolved_addr->addr; int family = addr->sa_family; if (family == AF_INET6) { if (grpc_ipv6_loopback_available()) { - *newfd = socket(family, type, protocol); + *newfd = create_socket(factory, family, type, protocol); } else { *newfd = -1; errno = EAFNOSUPPORT; @@ -304,7 +318,7 @@ grpc_error *grpc_create_dualstack_socket( family = AF_INET; } *dsmode = family == AF_INET ? GRPC_DSMODE_IPV4 : GRPC_DSMODE_NONE; - *newfd = socket(family, type, protocol); + *newfd = create_socket(factory, family, type, protocol); return error_for_fd(*newfd, resolved_addr); } diff --git a/src/core/lib/iomgr/socket_utils_posix.h b/src/core/lib/iomgr/socket_utils_posix.h index e84d3781a15..2c2fc95ff98 100644 --- a/src/core/lib/iomgr/socket_utils_posix.h +++ b/src/core/lib/iomgr/socket_utils_posix.h @@ -41,6 +41,7 @@ #include #include "src/core/lib/iomgr/error.h" +#include "src/core/lib/iomgr/socket_factory_posix.h" #include "src/core/lib/iomgr/socket_mutator.h" /* a wrapper for accept or accept4 */ @@ -137,4 +138,10 @@ grpc_error *grpc_create_dualstack_socket(const grpc_resolved_address *addr, grpc_dualstack_mode *dsmode, int *newfd); +/* Same as grpc_create_dualstack_socket(), but use the given socket factory (if + non-null) to create the socket, rather than calling socket() directly. */ +grpc_error *grpc_create_dualstack_socket_using_factory( + grpc_socket_factory *factory, const grpc_resolved_address *addr, int type, + int protocol, grpc_dualstack_mode *dsmode, int *newfd); + #endif /* GRPC_CORE_LIB_IOMGR_SOCKET_UTILS_POSIX_H */ diff --git a/src/core/lib/iomgr/udp_server.c b/src/core/lib/iomgr/udp_server.c index 28f2bd93598..86ec8f667d3 100644 --- a/src/core/lib/iomgr/udp_server.c +++ b/src/core/lib/iomgr/udp_server.c @@ -59,11 +59,13 @@ #include #include #include +#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" +#include "src/core/lib/iomgr/socket_factory_posix.h" #include "src/core/lib/iomgr/socket_utils_posix.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/support/string.h" @@ -89,6 +91,9 @@ struct grpc_udp_listener { struct grpc_udp_server { gpr_mu mu; + /* factory to use for creating and binding sockets, or NULL */ + grpc_socket_factory *socket_factory; + /* active port count: how many ports are actually still listening */ size_t active_ports; /* destroyed port count: how many ports are completely destroyed */ @@ -113,9 +118,24 @@ struct grpc_udp_server { void *user_data; }; -grpc_udp_server *grpc_udp_server_create(void) { +static grpc_socket_factory *get_socket_factory(const grpc_channel_args *args) { + if (args) { + const grpc_arg *arg = grpc_channel_args_find(args, GRPC_ARG_SOCKET_FACTORY); + if (arg) { + GPR_ASSERT(arg->type == GRPC_ARG_POINTER); + return arg->value.pointer.p; + } + } + return NULL; +} + +grpc_udp_server *grpc_udp_server_create(const grpc_channel_args *args) { grpc_udp_server *s = gpr_malloc(sizeof(grpc_udp_server)); gpr_mu_init(&s->mu); + s->socket_factory = get_socket_factory(args); + if (s->socket_factory) { + grpc_socket_factory_ref(s->socket_factory); + } s->active_ports = 0; s->destroyed_ports = 0; s->shutdown = 0; @@ -139,6 +159,10 @@ static void finish_shutdown(grpc_exec_ctx *exec_ctx, grpc_udp_server *s) { gpr_free(sp); } + if (s->socket_factory) { + grpc_socket_factory_unref(s->socket_factory); + } + gpr_free(s); } @@ -215,8 +239,17 @@ void grpc_udp_server_destroy(grpc_exec_ctx *exec_ctx, grpc_udp_server *s, } } +static int bind_socket(grpc_socket_factory *socket_factory, int sockfd, + const grpc_resolved_address *addr) { + return (socket_factory != NULL) + ? grpc_socket_factory_bind(socket_factory, sockfd, addr) + : bind(sockfd, (struct sockaddr *)addr->addr, + (socklen_t)addr->len); +} + /* Prepare a recently-created socket for listening. */ -static int prepare_socket(int fd, const grpc_resolved_address *addr) { +static int prepare_socket(grpc_socket_factory *socket_factory, int fd, + const grpc_resolved_address *addr) { grpc_resolved_address sockname_temp; struct sockaddr *addr_ptr = (struct sockaddr *)addr->addr; /* Set send/receive socket buffers to 1 MB */ @@ -246,7 +279,7 @@ static int prepare_socket(int fd, const grpc_resolved_address *addr) { } GPR_ASSERT(addr->len < ~(socklen_t)0); - if (bind(fd, (struct sockaddr *)addr, (socklen_t)addr->len) < 0) { + if (bind_socket(socket_factory, fd, addr) < 0) { char *addr_str; grpc_sockaddr_to_string(&addr_str, addr, 0); gpr_log(GPR_ERROR, "bind addr=%s: %s", addr_str, strerror(errno)); @@ -339,7 +372,7 @@ static int add_socket_to_server(grpc_udp_server *s, int fd, char *addr_str; char *name; - port = prepare_socket(fd, addr); + port = prepare_socket(s->socket_factory, fd, addr); if (port >= 0) { grpc_sockaddr_to_string(&addr_str, addr, 1); gpr_asprintf(&name, "udp-server-listener:%s", addr_str); @@ -417,8 +450,8 @@ int grpc_udp_server_add_port(grpc_udp_server *s, /* Try listening on IPv6 first. */ addr = &wild6; // TODO(rjshade): Test and propagate the returned grpc_error*: - GRPC_ERROR_UNREF(grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, - &dsmode, &fd)); + GRPC_ERROR_UNREF(grpc_create_dualstack_socket_using_factory( + s->socket_factory, addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode, &fd)); allocated_port1 = add_socket_to_server(s, fd, addr, read_cb, write_cb, orphan_cb); if (fd >= 0 && dsmode == GRPC_DSMODE_DUALSTACK) { @@ -433,8 +466,8 @@ int grpc_udp_server_add_port(grpc_udp_server *s, } // TODO(rjshade): Test and propagate the returned grpc_error*: - GRPC_ERROR_UNREF(grpc_create_dualstack_socket(addr, SOCK_DGRAM, IPPROTO_UDP, - &dsmode, &fd)); + GRPC_ERROR_UNREF(grpc_create_dualstack_socket_using_factory( + s->socket_factory, addr, SOCK_DGRAM, IPPROTO_UDP, &dsmode, &fd)); if (fd < 0) { gpr_log(GPR_ERROR, "Unable to create socket: %s", strerror(errno)); } diff --git a/src/core/lib/iomgr/udp_server.h b/src/core/lib/iomgr/udp_server.h index 90842a47f09..9df3fe4d1f0 100644 --- a/src/core/lib/iomgr/udp_server.h +++ b/src/core/lib/iomgr/udp_server.h @@ -58,7 +58,7 @@ typedef void (*grpc_udp_server_orphan_cb)(grpc_exec_ctx *exec_ctx, grpc_fd *emfd, void *user_data); /* Create a server, initially not bound to any ports */ -grpc_udp_server *grpc_udp_server_create(void); +grpc_udp_server *grpc_udp_server_create(const grpc_channel_args *args); /* Start listening to bound ports. user_data is passed to callbacks. */ void grpc_udp_server_start(grpc_exec_ctx *exec_ctx, grpc_udp_server *udp_server, diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index cb6ca34dc68..249d63ddd09 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -124,6 +124,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/iomgr/resolve_address_windows.c', 'src/core/lib/iomgr/resource_quota.c', 'src/core/lib/iomgr/sockaddr_utils.c', + 'src/core/lib/iomgr/socket_factory_posix.c', 'src/core/lib/iomgr/socket_mutator.c', 'src/core/lib/iomgr/socket_utils_common_posix.c', 'src/core/lib/iomgr/socket_utils_linux.c', diff --git a/test/core/iomgr/udp_server_test.c b/test/core/iomgr/udp_server_test.c index 396ec959cdc..12d84063239 100644 --- a/test/core/iomgr/udp_server_test.c +++ b/test/core/iomgr/udp_server_test.c @@ -48,9 +48,12 @@ #include #include #include +#include +#include "src/core/lib/channel/channel_args.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr.h" +#include "src/core/lib/iomgr/socket_factory_posix.h" #include "test/core/util/test_config.h" #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", #x) @@ -94,16 +97,59 @@ static void on_fd_orphaned(grpc_exec_ctx *exec_ctx, grpc_fd *emfd, g_number_of_orphan_calls++; } +struct test_socket_factory { + grpc_socket_factory base; + int number_of_socket_calls; + int number_of_bind_calls; +}; +typedef struct test_socket_factory test_socket_factory; + +static int test_socket_factory_socket(grpc_socket_factory *factory, int domain, + int type, int protocol) { + test_socket_factory *f = (test_socket_factory *)factory; + f->number_of_socket_calls++; + return socket(domain, type, protocol); +} + +static int test_socket_factory_bind(grpc_socket_factory *factory, int sockfd, + const grpc_resolved_address *addr) { + test_socket_factory *f = (test_socket_factory *)factory; + f->number_of_bind_calls++; + return bind(sockfd, (struct sockaddr *)addr->addr, (socklen_t)addr->len); +} + +static int test_socket_factory_compare(grpc_socket_factory *a, + grpc_socket_factory *b) { + return GPR_ICMP(a, b); +} + +static void test_socket_factory_destroy(grpc_socket_factory *factory) { + test_socket_factory *f = (test_socket_factory *)factory; + gpr_free(f); +} + +static const grpc_socket_factory_vtable test_socket_factory_vtable = { + test_socket_factory_socket, test_socket_factory_bind, + test_socket_factory_compare, test_socket_factory_destroy}; + +static test_socket_factory *test_socket_factory_create(void) { + test_socket_factory *factory = gpr_malloc(sizeof(test_socket_factory)); + grpc_socket_factory_init(&factory->base, &test_socket_factory_vtable); + factory->number_of_socket_calls = 0; + factory->number_of_bind_calls = 0; + return factory; +} + static void test_no_op(void) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_udp_server *s = grpc_udp_server_create(); + grpc_udp_server *s = grpc_udp_server_create(NULL); grpc_udp_server_destroy(&exec_ctx, s, NULL); grpc_exec_ctx_finish(&exec_ctx); } static void test_no_op_with_start(void) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; - grpc_udp_server *s = grpc_udp_server_create(); + grpc_udp_server *s = grpc_udp_server_create(NULL); LOG_TEST("test_no_op_with_start"); grpc_udp_server_start(&exec_ctx, s, NULL, 0, NULL); grpc_udp_server_destroy(&exec_ctx, s, NULL); @@ -115,7 +161,7 @@ static void test_no_op_with_port(void) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_resolved_address resolved_addr; struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr; - grpc_udp_server *s = grpc_udp_server_create(); + grpc_udp_server *s = grpc_udp_server_create(NULL); LOG_TEST("test_no_op_with_port"); memset(&resolved_addr, 0, sizeof(resolved_addr)); @@ -131,12 +177,44 @@ static void test_no_op_with_port(void) { GPR_ASSERT(g_number_of_orphan_calls == 1); } +static void test_no_op_with_port_and_socket_factory(void) { + g_number_of_orphan_calls = 0; + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_resolved_address resolved_addr; + struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr; + + test_socket_factory *socket_factory = test_socket_factory_create(); + grpc_arg socket_factory_arg = + grpc_socket_factory_to_arg(&socket_factory->base); + grpc_channel_args *channel_args = + grpc_channel_args_copy_and_add(NULL, &socket_factory_arg, 1); + grpc_udp_server *s = grpc_udp_server_create(channel_args); + grpc_channel_args_destroy(&exec_ctx, channel_args); + + LOG_TEST("test_no_op_with_port_and_socket_factory"); + + memset(&resolved_addr, 0, sizeof(resolved_addr)); + resolved_addr.len = sizeof(struct sockaddr_in); + addr->sin_family = AF_INET; + GPR_ASSERT(grpc_udp_server_add_port(s, &resolved_addr, on_read, on_write, + on_fd_orphaned)); + GPR_ASSERT(socket_factory->number_of_socket_calls == 1); + GPR_ASSERT(socket_factory->number_of_bind_calls == 1); + + grpc_udp_server_destroy(&exec_ctx, s, NULL); + grpc_exec_ctx_finish(&exec_ctx); + grpc_socket_factory_unref(&socket_factory->base); + + /* The server had a single FD, which should have been orphaned. */ + GPR_ASSERT(g_number_of_orphan_calls == 1); +} + static void test_no_op_with_port_and_start(void) { g_number_of_orphan_calls = 0; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; grpc_resolved_address resolved_addr; struct sockaddr_in *addr = (struct sockaddr_in *)resolved_addr.addr; - grpc_udp_server *s = grpc_udp_server_create(); + grpc_udp_server *s = grpc_udp_server_create(NULL); LOG_TEST("test_no_op_with_port_and_start"); memset(&resolved_addr, 0, sizeof(resolved_addr)); @@ -160,7 +238,7 @@ static void test_receive(int number_of_clients) { grpc_resolved_address resolved_addr; struct sockaddr_storage *addr = (struct sockaddr_storage *)resolved_addr.addr; int clifd, svrfd; - grpc_udp_server *s = grpc_udp_server_create(); + grpc_udp_server *s = grpc_udp_server_create(NULL); int i; int number_of_reads_before; gpr_timespec deadline; @@ -243,6 +321,7 @@ int main(int argc, char **argv) { test_no_op(); test_no_op_with_start(); test_no_op_with_port(); + test_no_op_with_port_and_socket_factory(); test_no_op_with_port_and_start(); test_receive(1); test_receive(10); diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 351638389e9..5eb74ea77db 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1111,6 +1111,8 @@ src/core/lib/iomgr/sockaddr_posix.h \ src/core/lib/iomgr/sockaddr_utils.c \ src/core/lib/iomgr/sockaddr_utils.h \ src/core/lib/iomgr/sockaddr_windows.h \ +src/core/lib/iomgr/socket_factory_posix.c \ +src/core/lib/iomgr/socket_factory_posix.h \ src/core/lib/iomgr/socket_mutator.c \ src/core/lib/iomgr/socket_mutator.h \ src/core/lib/iomgr/socket_utils.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 14ad133863a..81dbd020083 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -7512,6 +7512,7 @@ "src/core/lib/iomgr/sockaddr_posix.h", "src/core/lib/iomgr/sockaddr_utils.h", "src/core/lib/iomgr/sockaddr_windows.h", + "src/core/lib/iomgr/socket_factory_posix.h", "src/core/lib/iomgr/socket_mutator.h", "src/core/lib/iomgr/socket_utils.h", "src/core/lib/iomgr/socket_utils_posix.h", @@ -7681,6 +7682,8 @@ "src/core/lib/iomgr/sockaddr_utils.c", "src/core/lib/iomgr/sockaddr_utils.h", "src/core/lib/iomgr/sockaddr_windows.h", + "src/core/lib/iomgr/socket_factory_posix.c", + "src/core/lib/iomgr/socket_factory_posix.h", "src/core/lib/iomgr/socket_mutator.c", "src/core/lib/iomgr/socket_mutator.h", "src/core/lib/iomgr/socket_utils.h", diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index afe72746e94..ccf0d4d87d4 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -349,6 +349,7 @@ + @@ -595,6 +596,8 @@ + + diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index a7d32afbe1b..e9d950a9625 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -145,6 +145,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr @@ -926,6 +929,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj index 62969e31acf..734ce1b0252 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj @@ -244,6 +244,7 @@ + @@ -438,6 +439,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters index 30088101f5f..63eb9a03058 100644 --- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters @@ -202,6 +202,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr @@ -713,6 +716,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 46069134a1e..a077f0ec3c2 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -339,6 +339,7 @@ + @@ -562,6 +563,8 @@ + + diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index d658f4d5740..e8b381cdc01 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -148,6 +148,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr @@ -836,6 +839,9 @@ src\core\lib\iomgr + + src\core\lib\iomgr + src\core\lib\iomgr
Client languages ►
Test Cases ▼
${client_lang}
${test_case}