aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--BUILD1
-rw-r--r--CMakeLists.txt32
-rw-r--r--Makefile36
-rw-r--r--build.yaml11
-rw-r--r--gRPC-Core.podspec4
-rwxr-xr-xgrpc.gemspec1
-rw-r--r--include/grpc/impl/codegen/grpc_types.h4
-rw-r--r--include/grpc/support/avl.h60
-rw-r--r--package.xml1
-rw-r--r--src/compiler/node_generator.cc1
-rw-r--r--src/core/ext/filters/client_channel/channel_connectivity.c2
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c1
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c78
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c79
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h27
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c44
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h2
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c22
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h48
-rw-r--r--src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c6
-rw-r--r--src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c2
-rw-r--r--src/core/ext/filters/client_channel/retry_throttle.c22
-rw-r--r--src/core/ext/filters/client_channel/subchannel_index.c88
-rw-r--r--src/core/ext/filters/http/client/http_client_filter.c514
-rw-r--r--src/core/ext/filters/http/message_compress/message_compress_filter.c202
-rw-r--r--src/core/ext/transport/chttp2/transport/chttp2_transport.c195
-rw-r--r--src/core/ext/transport/chttp2/transport/frame_data.c2
-rw-r--r--src/core/ext/transport/chttp2/transport/internal.h23
-rw-r--r--src/core/ext/transport/chttp2/transport/writing.c85
-rw-r--r--src/core/ext/transport/inproc/inproc_transport.c33
-rw-r--r--src/core/lib/iomgr/nameser.h104
-rw-r--r--src/core/lib/iomgr/port.h5
-rw-r--r--src/core/lib/support/avl.c165
-rw-r--r--src/core/lib/surface/alarm.c3
-rw-r--r--src/core/lib/surface/call.c6
-rw-r--r--src/core/lib/surface/channel_ping.c2
-rw-r--r--src/core/lib/surface/completion_queue.c87
-rw-r--r--src/core/lib/surface/completion_queue.h5
-rw-r--r--src/core/lib/surface/server.c14
-rw-r--r--src/core/lib/transport/byte_stream.c128
-rw-r--r--src/core/lib/transport/byte_stream.h99
-rw-r--r--src/core/lib/transport/transport.c24
-rw-r--r--src/core/lib/transport/transport.h9
-rw-r--r--src/cpp/server/server_cc.cc50
-rw-r--r--src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs98
-rwxr-xr-xsrc/csharp/Grpc.Core/Grpc.Core.csproj1
-rw-r--r--src/csharp/Grpc.Core/GrpcEnvironment.cs22
-rw-r--r--src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs31
-rw-r--r--src/csharp/Grpc.IntegrationTesting/QpsWorker.cs5
-rw-r--r--src/csharp/tests.json1
-rw-r--r--src/objective-c/!ProtoCompiler-gRPCPlugin.podspec2
-rw-r--r--src/objective-c/!ProtoCompiler.podspec2
-rw-r--r--src/objective-c/BoringSSL.podspec544
-rw-r--r--src/objective-c/RxLibrary/GRXBufferedPipe.m8
-rw-r--r--src/objective-c/tests/RxLibraryUnitTests.m70
-rw-r--r--src/proto/grpc/lb/v1/load_balancer.proto42
-rw-r--r--src/ruby/ext/grpc/rb_grpc_imports.generated.h12
-rw-r--r--src/ruby/lib/grpc/generic/active_call.rb15
-rw-r--r--src/ruby/spec/generic/client_stub_spec.rb26
-rw-r--r--templates/gRPC-Core.podspec.template2
-rw-r--r--templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template2
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer.c5
-rw-r--r--test/core/fling/server.c6
-rw-r--r--test/core/support/avl_test.c3484
-rw-r--r--test/core/surface/completion_queue_test.c6
-rw-r--r--test/core/surface/completion_queue_threading_test.c4
-rw-r--r--test/core/transport/BUILD12
-rw-r--r--test/core/transport/byte_stream_test.c279
-rw-r--r--test/cpp/end2end/grpclb_end2end_test.cc177
-rw-r--r--test/cpp/grpclb/grpclb_api_test.cc16
-rw-r--r--test/cpp/microbenchmarks/bm_cq.cc7
-rw-r--r--test/cpp/microbenchmarks/bm_cq_multiple_threads.cc2
-rw-r--r--test/cpp/qps/server.h7
-rw-r--r--tools/doxygen/Doxyfile.core.internal1
-rwxr-xr-xtools/internal_ci/helper_scripts/gen_report_index.sh35
-rw-r--r--tools/internal_ci/helper_scripts/prepare_build_linux_rc2
-rw-r--r--tools/internal_ci/helper_scripts/prepare_build_macos_rc7
-rw-r--r--tools/internal_ci/helper_scripts/prepare_build_windows.bat (renamed from tools/internal_ci/windows/grpc_portability_master.bat)17
-rw-r--r--tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_basictests_multilang.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_build_artifacts.cfg1
-rwxr-xr-xtools/internal_ci/linux/grpc_build_artifacts.sh2
-rw-r--r--tools/internal_ci/linux/grpc_interop_badserver_java.cfg2
-rw-r--r--tools/internal_ci/linux/grpc_interop_badserver_python.cfg2
-rw-r--r--tools/internal_ci/linux/grpc_interop_matrix.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_interop_tocloud.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_interop_toprod.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_portability.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_portability_build_only.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_pull_request_sanity.cfg1
-rw-r--r--tools/internal_ci/linux/grpc_sanity.cfg1
-rw-r--r--tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_dbg.cfg30
-rw-r--r--tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_opt.cfg30
-rw-r--r--tools/internal_ci/linux/pull_request/grpc_basictests_multilang.cfg (renamed from tools/internal_ci/linux/grpc_master.cfg)3
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg1
-rw-r--r--tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg1
-rw-r--r--tools/internal_ci/macos/grpc_basictests.cfg31
-rw-r--r--tools/internal_ci/macos/grpc_build_artifacts.cfg2
-rw-r--r--tools/internal_ci/macos/grpc_interop.cfg3
-rwxr-xr-xtools/internal_ci/macos/grpc_run_tests_matrix.sh (renamed from tools/internal_ci/macos/grpc_master.sh)2
-rw-r--r--tools/internal_ci/macos/pull_request/grpc_basictests.cfg31
-rw-r--r--tools/internal_ci/macos/pull_request/grpc_interop.cfg (renamed from tools/internal_ci/macos/grpc_master.cfg)4
-rw-r--r--tools/internal_ci/windows/grpc_basictests.cfg30
-rw-r--r--tools/internal_ci/windows/grpc_build_artifacts.bat9
-rw-r--r--tools/internal_ci/windows/grpc_build_artifacts.cfg1
-rw-r--r--tools/internal_ci/windows/grpc_portability.cfg30
-rw-r--r--tools/internal_ci/windows/grpc_portability_master.cfg8
-rw-r--r--tools/internal_ci/windows/grpc_run_tests_matrix.bat (renamed from tools/internal_ci/windows/grpc_master.bat)8
-rw-r--r--tools/internal_ci/windows/pull_request/grpc_basictests.cfg (renamed from tools/internal_ci/windows/grpc_master.cfg)8
-rw-r--r--tools/internal_ci/windows/pull_request/grpc_portability.cfg30
-rw-r--r--tools/run_tests/generated/sources_and_headers.json19
-rw-r--r--tools/run_tests/generated/tests.json22
-rw-r--r--tools/run_tests/performance/scenario_result_schema.json10
-rw-r--r--vsprojects/buildtests_c.sln27
-rw-r--r--vsprojects/vcxproj/grpc/grpc.vcxproj1
-rw-r--r--vsprojects/vcxproj/grpc/grpc.vcxproj.filters3
-rw-r--r--vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj1
-rw-r--r--vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters3
-rw-r--r--vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj1
-rw-r--r--vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters3
-rw-r--r--vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj199
-rw-r--r--vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj.filters21
133 files changed, 4910 insertions, 2966 deletions
diff --git a/BUILD b/BUILD
index 6dcc76eb7a..6552d5879e 100644
--- a/BUILD
+++ b/BUILD
@@ -725,6 +725,7 @@ grpc_cc_library(
"src/core/lib/iomgr/is_epollexclusive_available.h",
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/lockfree_event.h",
+ "src/core/lib/iomgr/nameser.h",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.h",
"src/core/lib/iomgr/pollset.h",
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 266f2c0774..f71563a38d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -394,6 +394,7 @@ add_dependencies(buildtests_c bad_server_response_test)
add_dependencies(buildtests_c bdp_estimator_test)
add_dependencies(buildtests_c bin_decoder_test)
add_dependencies(buildtests_c bin_encoder_test)
+add_dependencies(buildtests_c byte_stream_test)
add_dependencies(buildtests_c census_context_test)
add_dependencies(buildtests_c census_intrusive_hash_map_test)
add_dependencies(buildtests_c census_resource_test)
@@ -4785,6 +4786,37 @@ target_link_libraries(bin_encoder_test
endif (gRPC_BUILD_TESTS)
if (gRPC_BUILD_TESTS)
+add_executable(byte_stream_test
+ test/core/transport/byte_stream_test.c
+)
+
+
+target_include_directories(byte_stream_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 ${CARES_BUILD_INCLUDE_DIR}
+ PRIVATE ${CARES_INCLUDE_DIR}
+ PRIVATE ${CARES_PLATFORM_INCLUDE_DIR}
+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/cares/cares
+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include
+)
+
+target_link_libraries(byte_stream_test
+ ${_gRPC_ALLTARGETS_LIBRARIES}
+ grpc_test_util
+ grpc
+ gpr_test_util
+ gpr
+)
+
+endif (gRPC_BUILD_TESTS)
+if (gRPC_BUILD_TESTS)
+
add_executable(census_context_test
test/core/census/context_test.c
)
diff --git a/Makefile b/Makefile
index 7b53024b6c..98cfb04e54 100644
--- a/Makefile
+++ b/Makefile
@@ -954,6 +954,7 @@ 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
bin_encoder_test: $(BINDIR)/$(CONFIG)/bin_encoder_test
+byte_stream_test: $(BINDIR)/$(CONFIG)/byte_stream_test
census_context_test: $(BINDIR)/$(CONFIG)/census_context_test
census_intrusive_hash_map_test: $(BINDIR)/$(CONFIG)/census_intrusive_hash_map_test
census_resource_test: $(BINDIR)/$(CONFIG)/census_resource_test
@@ -1345,6 +1346,7 @@ buildtests_c: privatelibs_c \
$(BINDIR)/$(CONFIG)/bdp_estimator_test \
$(BINDIR)/$(CONFIG)/bin_decoder_test \
$(BINDIR)/$(CONFIG)/bin_encoder_test \
+ $(BINDIR)/$(CONFIG)/byte_stream_test \
$(BINDIR)/$(CONFIG)/census_context_test \
$(BINDIR)/$(CONFIG)/census_intrusive_hash_map_test \
$(BINDIR)/$(CONFIG)/census_resource_test \
@@ -1746,6 +1748,8 @@ test_c: buildtests_c
$(Q) $(BINDIR)/$(CONFIG)/bin_decoder_test || ( echo test bin_decoder_test failed ; exit 1 )
$(E) "[RUN] Testing bin_encoder_test"
$(Q) $(BINDIR)/$(CONFIG)/bin_encoder_test || ( echo test bin_encoder_test failed ; exit 1 )
+ $(E) "[RUN] Testing byte_stream_test"
+ $(Q) $(BINDIR)/$(CONFIG)/byte_stream_test || ( echo test byte_stream_test failed ; exit 1 )
$(E) "[RUN] Testing census_context_test"
$(Q) $(BINDIR)/$(CONFIG)/census_context_test || ( echo test census_context_test failed ; exit 1 )
$(E) "[RUN] Testing census_intrusive_hash_map_test"
@@ -8411,6 +8415,38 @@ endif
endif
+BYTE_STREAM_TEST_SRC = \
+ test/core/transport/byte_stream_test.c \
+
+BYTE_STREAM_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(BYTE_STREAM_TEST_SRC))))
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure targets if you don't have OpenSSL.
+
+$(BINDIR)/$(CONFIG)/byte_stream_test: openssl_dep_error
+
+else
+
+
+
+$(BINDIR)/$(CONFIG)/byte_stream_test: $(BYTE_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+ $(E) "[LD] Linking $@"
+ $(Q) mkdir -p `dirname $@`
+ $(Q) $(LD) $(LDFLAGS) $(BYTE_STREAM_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/byte_stream_test
+
+endif
+
+$(OBJDIR)/$(CONFIG)/test/core/transport/byte_stream_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
+
+deps_byte_stream_test: $(BYTE_STREAM_TEST_OBJS:.o=.dep)
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(BYTE_STREAM_TEST_OBJS:.o=.dep)
+endif
+endif
+
+
CENSUS_CONTEXT_TEST_SRC = \
test/core/census/context_test.c \
diff --git a/build.yaml b/build.yaml
index 198467bf5a..52ffbc6c58 100644
--- a/build.yaml
+++ b/build.yaml
@@ -218,6 +218,7 @@ filegroups:
- src/core/lib/iomgr/is_epollexclusive_available.h
- src/core/lib/iomgr/load_file.h
- src/core/lib/iomgr/lockfree_event.h
+ - src/core/lib/iomgr/nameser.h
- src/core/lib/iomgr/network_status_tracker.h
- src/core/lib/iomgr/polling_entity.h
- src/core/lib/iomgr/pollset.h
@@ -1702,6 +1703,16 @@ targets:
deps:
- grpc_test_util
- grpc
+- name: byte_stream_test
+ build: test
+ language: c
+ src:
+ - test/core/transport/byte_stream_test.c
+ deps:
+ - grpc_test_util
+ - grpc
+ - gpr_test_util
+ - gpr
- name: census_context_test
build: test
language: c
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 90580c5fad..332d331d62 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -176,7 +176,7 @@ Pod::Spec.new do |s|
ss.header_mappings_dir = '.'
ss.libraries = 'z'
ss.dependency "#{s.name}/Interface", version
- ss.dependency 'BoringSSL', '~> 8.0'
+ ss.dependency 'BoringSSL', '~> 9.0'
ss.dependency 'nanopb', '~> 0.3'
# To save you from scrolling, this is the last part of the podspec.
@@ -281,6 +281,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/is_epollexclusive_available.h',
'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h',
+ 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h',
@@ -766,6 +767,7 @@ Pod::Spec.new do |s|
'src/core/lib/iomgr/is_epollexclusive_available.h',
'src/core/lib/iomgr/load_file.h',
'src/core/lib/iomgr/lockfree_event.h',
+ 'src/core/lib/iomgr/nameser.h',
'src/core/lib/iomgr/network_status_tracker.h',
'src/core/lib/iomgr/polling_entity.h',
'src/core/lib/iomgr/pollset.h',
diff --git a/grpc.gemspec b/grpc.gemspec
index a166839888..fee406892c 100755
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -213,6 +213,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/lib/iomgr/is_epollexclusive_available.h )
s.files += %w( src/core/lib/iomgr/load_file.h )
s.files += %w( src/core/lib/iomgr/lockfree_event.h )
+ s.files += %w( src/core/lib/iomgr/nameser.h )
s.files += %w( src/core/lib/iomgr/network_status_tracker.h )
s.files += %w( src/core/lib/iomgr/polling_entity.h )
s.files += %w( src/core/lib/iomgr/pollset.h )
diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h
index f1c457c027..bb3c90e303 100644
--- a/include/grpc/impl/codegen/grpc_types.h
+++ b/include/grpc/impl/codegen/grpc_types.h
@@ -333,7 +333,9 @@ typedef enum grpc_call_error {
/** this batch of operations leads to more operations than allowed */
GRPC_CALL_ERROR_BATCH_TOO_BIG,
/** payload type requested is not the type registered */
- GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH
+ GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH,
+ /** completion queue has been shutdown */
+ GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN
} grpc_call_error;
/** Default send/receive message size limits in bytes. -1 for unlimited. */
diff --git a/include/grpc/support/avl.h b/include/grpc/support/avl.h
index ed052e8222..d53ff5d904 100644
--- a/include/grpc/support/avl.h
+++ b/include/grpc/support/avl.h
@@ -31,18 +31,23 @@ typedef struct gpr_avl_node {
long height;
} gpr_avl_node;
+/** vtable for the AVL tree
+ * The optional user_data is propagated from the top level gpr_avl_XXX API.
+ * From the same API call, multiple vtable functions may be called multiple
+ * times.
+ */
typedef struct gpr_avl_vtable {
/** destroy a key */
- void (*destroy_key)(void *key);
+ void (*destroy_key)(void *key, void *user_data);
/** copy a key, returning new value */
- void *(*copy_key)(void *key);
+ void *(*copy_key)(void *key, void *user_data);
/** compare key1, key2; return <0 if key1 < key2,
>0 if key1 > key2, 0 if key1 == key2 */
- long (*compare_keys)(void *key1, void *key2);
+ long (*compare_keys)(void *key1, void *key2, void *user_data);
/** destroy a value */
- void (*destroy_value)(void *value);
+ void (*destroy_value)(void *value, void *user_data);
/** copy a value */
- void *(*copy_value)(void *value);
+ void *(*copy_value)(void *value, void *user_data);
} gpr_avl_vtable;
/** "pointer" to an AVL tree - this is a reference
@@ -53,29 +58,36 @@ typedef struct gpr_avl {
gpr_avl_node *root;
} gpr_avl;
-/** create an immutable AVL tree */
+/** Create an immutable AVL tree. */
GPRAPI gpr_avl gpr_avl_create(const gpr_avl_vtable *vtable);
-/** add a reference to an existing tree - returns
- the tree as a convenience */
-GPRAPI gpr_avl gpr_avl_ref(gpr_avl avl);
-/** remove a reference to a tree - destroying it if there
- are no references left */
-GPRAPI void gpr_avl_unref(gpr_avl avl);
-/** return a new tree with (key, value) added to avl.
+/** Add a reference to an existing tree - returns
+ the tree as a convenience. The optional user_data will be passed to vtable
+ functions. */
+GPRAPI gpr_avl gpr_avl_ref(gpr_avl avl, void *user_data);
+/** Remove a reference to a tree - destroying it if there
+ are no references left. The optional user_data will be passed to vtable
+ functions. */
+GPRAPI void gpr_avl_unref(gpr_avl avl, void *user_data);
+/** Return a new tree with (key, value) added to avl.
implicitly unrefs avl to allow easy chaining.
if key exists in avl, the new tree's key entry updated
- (i.e. a duplicate is not created) */
-GPRAPI gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value);
-/** return a new tree with key deleted
- implicitly unrefs avl to allow easy chaining. */
-GPRAPI gpr_avl gpr_avl_remove(gpr_avl avl, void *key);
-/** lookup key, and return the associated value.
- does not mutate avl.
- returns NULL if key is not found. */
-GPRAPI void *gpr_avl_get(gpr_avl avl, void *key);
+ (i.e. a duplicate is not created). The optional user_data will be passed to
+ vtable functions. */
+GPRAPI gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value,
+ void *user_data);
+/** Return a new tree with key deleted
+ implicitly unrefs avl to allow easy chaining. The optional user_data will be
+ passed to vtable functions. */
+GPRAPI gpr_avl gpr_avl_remove(gpr_avl avl, void *key, void *user_data);
+/** Lookup key, and return the associated value.
+ Does not mutate avl.
+ Returns NULL if key is not found. The optional user_data will be passed to
+ vtable functions.*/
+GPRAPI void *gpr_avl_get(gpr_avl avl, void *key, void *user_data);
/** Return 1 if avl contains key, 0 otherwise; if it has the key, sets *value to
- its value*/
-GPRAPI int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value);
+ its value. THe optional user_data will be passed to vtable functions. */
+GPRAPI int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value,
+ void *user_data);
/** Return 1 if avl is empty, 0 otherwise */
GPRAPI int gpr_avl_is_empty(gpr_avl avl);
diff --git a/package.xml b/package.xml
index b31514b99f..04ab3d2e32 100644
--- a/package.xml
+++ b/package.xml
@@ -227,6 +227,7 @@
<file baseinstalldir="/" name="src/core/lib/iomgr/is_epollexclusive_available.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/load_file.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/lockfree_event.h" role="src" />
+ <file baseinstalldir="/" name="src/core/lib/iomgr/nameser.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/network_status_tracker.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/polling_entity.h" role="src" />
<file baseinstalldir="/" name="src/core/lib/iomgr/pollset.h" role="src" />
diff --git a/src/compiler/node_generator.cc b/src/compiler/node_generator.cc
index 249ba086a5..c0fef9128f 100644
--- a/src/compiler/node_generator.cc
+++ b/src/compiler/node_generator.cc
@@ -47,6 +47,7 @@ grpc::string ModuleAlias(const grpc::string filename) {
grpc::string basename = grpc_generator::StripProto(filename);
basename = grpc_generator::StringReplace(basename, "-", "$");
basename = grpc_generator::StringReplace(basename, "/", "_");
+ basename = grpc_generator::StringReplace(basename, ".", "_");
return basename + "_pb";
}
diff --git a/src/core/ext/filters/client_channel/channel_connectivity.c b/src/core/ext/filters/client_channel/channel_connectivity.c
index c3dca14305..b83c95275f 100644
--- a/src/core/ext/filters/client_channel/channel_connectivity.c
+++ b/src/core/ext/filters/client_channel/channel_connectivity.c
@@ -208,7 +208,7 @@ void grpc_channel_watch_connectivity_state(
7, (channel, (int)last_observed_state, deadline.tv_sec, deadline.tv_nsec,
(int)deadline.clock_type, cq, tag));
- grpc_cq_begin_op(cq, tag);
+ GPR_ASSERT(grpc_cq_begin_op(cq, tag));
gpr_mu_init(&w->mu);
GRPC_CLOSURE_INIT(&w->on_complete, watch_complete, w,
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c b/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c
index 52c6e38c87..568bb2ba8d 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c
@@ -88,7 +88,6 @@ static void destroy_call_elem(grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
// Record call finished, optionally setting client_failed_to_send and
// received.
grpc_grpclb_client_stats_add_call_finished(
- false /* drop_for_rate_limiting */, false /* drop_for_load_balancing */,
!calld->send_initial_metadata_succeeded /* client_failed_to_send */,
calld->recv_initial_metadata_succeeded /* known_received */,
calld->client_stats);
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c
index ebce801b37..bb9217d843 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c
@@ -416,9 +416,7 @@ struct rr_connectivity_data {
static bool is_server_valid(const grpc_grpclb_server *server, size_t idx,
bool log) {
- if (server->drop_for_rate_limiting || server->drop_for_load_balancing) {
- return false;
- }
+ if (server->drop) return false;
const grpc_grpclb_ip_address *ip = &server->ip_address;
if (server->port >> 16 != 0) {
if (log) {
@@ -462,7 +460,7 @@ static const grpc_lb_user_data_vtable lb_token_vtable = {
static void parse_server(const grpc_grpclb_server *server,
grpc_resolved_address *addr) {
memset(addr, 0, sizeof(*addr));
- if (server->drop_for_rate_limiting || server->drop_for_load_balancing) return;
+ if (server->drop) return;
const uint16_t netorder_port = htons((uint16_t)server->port);
/* the addresses are given in binary format (a in(6)_addr struct) in
* server->ip_address.bytes. */
@@ -610,7 +608,7 @@ static bool pick_from_internal_rr_locked(
if (glb_policy->serverlist_index == glb_policy->serverlist->num_servers) {
glb_policy->serverlist_index = 0; // Wrap-around.
}
- if (server->drop_for_rate_limiting || server->drop_for_load_balancing) {
+ if (server->drop) {
// Not using the RR policy, so unref it.
if (GRPC_TRACER_ON(grpc_lb_glb_trace)) {
gpr_log(GPR_INFO, "Unreffing RR for drop (0x%" PRIxPTR ")",
@@ -622,11 +620,8 @@ static bool pick_from_internal_rr_locked(
// the client_load_reporting filter, because we do not create a
// subchannel call (and therefore no client_load_reporting filter)
// for dropped calls.
- grpc_grpclb_client_stats_add_call_started(wc_arg->client_stats);
- grpc_grpclb_client_stats_add_call_finished(
- server->drop_for_rate_limiting, server->drop_for_load_balancing,
- false /* failed_to_send */, false /* known_received */,
- wc_arg->client_stats);
+ grpc_grpclb_client_stats_add_call_dropped_locked(server->load_balance_token,
+ wc_arg->client_stats);
grpc_grpclb_client_stats_unref(wc_arg->client_stats);
if (force_async) {
GPR_ASSERT(wc_arg->wrapped_closure != NULL);
@@ -715,7 +710,6 @@ static void create_rr_locked(grpc_exec_ctx *exec_ctx, glb_lb_policy *glb_policy,
return;
}
glb_policy->rr_policy = new_rr_policy;
-
grpc_error *rr_state_error = NULL;
const grpc_connectivity_state rr_state =
grpc_lb_policy_check_connectivity_locked(exec_ctx, glb_policy->rr_policy,
@@ -741,7 +735,7 @@ static void create_rr_locked(grpc_exec_ctx *exec_ctx, glb_lb_policy *glb_policy,
rr_connectivity->state = rr_state;
/* Subscribe to changes to the connectivity of the new RR */
- GRPC_LB_POLICY_WEAK_REF(&glb_policy->base, "rr_connectivity_sched");
+ GRPC_LB_POLICY_WEAK_REF(&glb_policy->base, "glb_rr_connectivity_cb");
grpc_lb_policy_notify_on_state_change_locked(exec_ctx, glb_policy->rr_policy,
&rr_connectivity->state,
&rr_connectivity->on_change);
@@ -806,32 +800,31 @@ static void glb_rr_connectivity_changed_locked(grpc_exec_ctx *exec_ctx,
void *arg, grpc_error *error) {
rr_connectivity_data *rr_connectivity = arg;
glb_lb_policy *glb_policy = rr_connectivity->glb_policy;
-
- const bool shutting_down = glb_policy->shutting_down;
- bool unref_needed = false;
- GRPC_ERROR_REF(error);
-
- if (rr_connectivity->state == GRPC_CHANNEL_SHUTDOWN || shutting_down) {
- /* RR policy shutting down. Don't renew subscription and free the arg of
- * this callback. In addition we need to stash away the current policy to
- * be UNREF'd after releasing the lock. Otherwise, if the UNREF is the last
- * one, the policy would be destroyed, alongside the lock, which would
- * result in a use-after-free */
- unref_needed = true;
+ if (glb_policy->shutting_down) {
+ GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &glb_policy->base,
+ "glb_rr_connectivity_cb");
gpr_free(rr_connectivity);
- } else { /* rr state != SHUTDOWN && !shutting down: biz as usual */
- update_lb_connectivity_status_locked(
- exec_ctx, glb_policy, rr_connectivity->state, GRPC_ERROR_REF(error));
- /* Resubscribe. Reuse the "rr_connectivity_cb" weak ref. */
- grpc_lb_policy_notify_on_state_change_locked(
- exec_ctx, glb_policy->rr_policy, &rr_connectivity->state,
- &rr_connectivity->on_change);
+ return;
}
- if (unref_needed) {
+ if (rr_connectivity->state == GRPC_CHANNEL_SHUTDOWN) {
+ /* An RR policy that has transitioned into the SHUTDOWN connectivity state
+ * should not be considered for picks or updates: the SHUTDOWN state is a
+ * sink, policies can't transition back from it. .*/
+ GRPC_LB_POLICY_UNREF(exec_ctx, glb_policy->rr_policy,
+ "rr_connectivity_shutdown");
+ glb_policy->rr_policy = NULL;
GRPC_LB_POLICY_WEAK_UNREF(exec_ctx, &glb_policy->base,
- "rr_connectivity_cb");
+ "glb_rr_connectivity_cb");
+ gpr_free(rr_connectivity);
+ return;
}
- GRPC_ERROR_UNREF(error);
+ /* rr state != SHUTDOWN && !glb_policy->shutting down: biz as usual */
+ update_lb_connectivity_status_locked(
+ exec_ctx, glb_policy, rr_connectivity->state, GRPC_ERROR_REF(error));
+ /* Resubscribe. Reuse the "glb_rr_connectivity_cb" weak ref. */
+ grpc_lb_policy_notify_on_state_change_locked(exec_ctx, glb_policy->rr_policy,
+ &rr_connectivity->state,
+ &rr_connectivity->on_change);
}
static void destroy_balancer_name(grpc_exec_ctx *exec_ctx,
@@ -995,7 +988,6 @@ static grpc_lb_policy *glb_create(grpc_exec_ctx *exec_ctx,
gpr_free(glb_policy);
return NULL;
}
-
GRPC_CLOSURE_INIT(&glb_policy->lb_channel_on_connectivity_changed,
glb_lb_channel_on_connectivity_changed_cb, glb_policy,
grpc_combiner_scheduler(args->combiner));
@@ -1052,7 +1044,7 @@ static void glb_shutdown_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) {
glb_policy->pending_picks = NULL;
pending_ping *pping = glb_policy->pending_pings;
glb_policy->pending_pings = NULL;
- if (glb_policy->rr_policy) {
+ if (glb_policy->rr_policy != NULL) {
GRPC_LB_POLICY_UNREF(exec_ctx, glb_policy->rr_policy, "glb_shutdown");
}
// We destroy the LB channel here because
@@ -1309,15 +1301,14 @@ static void do_send_client_load_report_locked(grpc_exec_ctx *exec_ctx,
}
static bool load_report_counters_are_zero(grpc_grpclb_request *request) {
+ grpc_grpclb_dropped_call_counts *drop_entries =
+ request->client_stats.calls_finished_with_drop.arg;
return request->client_stats.num_calls_started == 0 &&
request->client_stats.num_calls_finished == 0 &&
- request->client_stats.num_calls_finished_with_drop_for_rate_limiting ==
- 0 &&
- request->client_stats
- .num_calls_finished_with_drop_for_load_balancing == 0 &&
request->client_stats.num_calls_finished_with_client_failed_to_send ==
0 &&
- request->client_stats.num_calls_finished_known_received == 0;
+ request->client_stats.num_calls_finished_known_received == 0 &&
+ (drop_entries == NULL || drop_entries->num_entries == 0);
}
static void send_client_load_report_locked(grpc_exec_ctx *exec_ctx, void *arg,
@@ -1332,7 +1323,7 @@ static void send_client_load_report_locked(grpc_exec_ctx *exec_ctx, void *arg,
// Construct message payload.
GPR_ASSERT(glb_policy->client_load_report_payload == NULL);
grpc_grpclb_request *request =
- grpc_grpclb_load_report_request_create(glb_policy->client_stats);
+ grpc_grpclb_load_report_request_create_locked(glb_policy->client_stats);
// Skip client load report if the counters were all zero in the last
// report and they are still zero in this one.
if (load_report_counters_are_zero(request)) {
@@ -1778,7 +1769,8 @@ static void glb_update_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy,
if (!glb_policy->watching_lb_channel) {
// Watch the LB channel connectivity for connection.
- glb_policy->lb_channel_connectivity = GRPC_CHANNEL_INIT;
+ glb_policy->lb_channel_connectivity = grpc_channel_check_connectivity_state(
+ glb_policy->lb_channel, true /* try to connect */);
grpc_channel_element *client_channel_elem = grpc_channel_stack_last_element(
grpc_channel_get_channel_stack(glb_policy->lb_channel));
GPR_ASSERT(client_channel_elem->filter == &grpc_client_channel_filter);
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c
index c762443b7c..5b62623145 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c
@@ -18,8 +18,11 @@
#include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
+#include <string.h>
+
#include <grpc/support/alloc.h>
#include <grpc/support/atm.h>
+#include <grpc/support/string_util.h>
#include <grpc/support/sync.h>
#include <grpc/support/useful.h>
@@ -29,10 +32,11 @@
struct grpc_grpclb_client_stats {
gpr_refcount refs;
+ // This field must only be accessed via *_locked() methods.
+ grpc_grpclb_dropped_call_counts* drop_token_counts;
+ // These fields may be accessed from multiple threads at a time.
gpr_atm num_calls_started;
gpr_atm num_calls_finished;
- gpr_atm num_calls_finished_with_drop_for_rate_limiting;
- gpr_atm num_calls_finished_with_drop_for_load_balancing;
gpr_atm num_calls_finished_with_client_failed_to_send;
gpr_atm num_calls_finished_known_received;
};
@@ -51,6 +55,7 @@ grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats) {
if (gpr_unref(&client_stats->refs)) {
+ grpc_grpclb_dropped_call_counts_destroy(client_stats->drop_token_counts);
gpr_free(client_stats);
}
}
@@ -61,21 +66,9 @@ void grpc_grpclb_client_stats_add_call_started(
}
void grpc_grpclb_client_stats_add_call_finished(
- bool finished_with_drop_for_rate_limiting,
- bool finished_with_drop_for_load_balancing,
bool finished_with_client_failed_to_send, bool finished_known_received,
grpc_grpclb_client_stats* client_stats) {
gpr_atm_full_fetch_add(&client_stats->num_calls_finished, (gpr_atm)1);
- if (finished_with_drop_for_rate_limiting) {
- gpr_atm_full_fetch_add(
- &client_stats->num_calls_finished_with_drop_for_rate_limiting,
- (gpr_atm)1);
- }
- if (finished_with_drop_for_load_balancing) {
- gpr_atm_full_fetch_add(
- &client_stats->num_calls_finished_with_drop_for_load_balancing,
- (gpr_atm)1);
- }
if (finished_with_client_failed_to_send) {
gpr_atm_full_fetch_add(
&client_stats->num_calls_finished_with_client_failed_to_send,
@@ -87,32 +80,70 @@ void grpc_grpclb_client_stats_add_call_finished(
}
}
+void grpc_grpclb_client_stats_add_call_dropped_locked(
+ char* token, grpc_grpclb_client_stats* client_stats) {
+ // Increment num_calls_started and num_calls_finished.
+ gpr_atm_full_fetch_add(&client_stats->num_calls_started, (gpr_atm)1);
+ gpr_atm_full_fetch_add(&client_stats->num_calls_finished, (gpr_atm)1);
+ // Record the drop.
+ if (client_stats->drop_token_counts == NULL) {
+ client_stats->drop_token_counts =
+ gpr_zalloc(sizeof(grpc_grpclb_dropped_call_counts));
+ }
+ grpc_grpclb_dropped_call_counts* drop_token_counts =
+ client_stats->drop_token_counts;
+ for (size_t i = 0; i < drop_token_counts->num_entries; ++i) {
+ if (strcmp(drop_token_counts->token_counts[i].token, token) == 0) {
+ ++drop_token_counts->token_counts[i].count;
+ return;
+ }
+ }
+ // Not found, so add a new entry. We double the size of the array each time.
+ size_t new_num_entries = 2;
+ while (new_num_entries < drop_token_counts->num_entries + 1) {
+ new_num_entries *= 2;
+ }
+ drop_token_counts->token_counts =
+ gpr_realloc(drop_token_counts->token_counts,
+ new_num_entries * sizeof(grpc_grpclb_drop_token_count));
+ grpc_grpclb_drop_token_count* new_entry =
+ &drop_token_counts->token_counts[drop_token_counts->num_entries++];
+ new_entry->token = gpr_strdup(token);
+ new_entry->count = 1;
+}
+
static void atomic_get_and_reset_counter(int64_t* value, gpr_atm* counter) {
*value = (int64_t)gpr_atm_acq_load(counter);
gpr_atm_full_fetch_add(counter, (gpr_atm)(-*value));
}
-void grpc_grpclb_client_stats_get(
+void grpc_grpclb_client_stats_get_locked(
grpc_grpclb_client_stats* client_stats, int64_t* num_calls_started,
int64_t* num_calls_finished,
- int64_t* num_calls_finished_with_drop_for_rate_limiting,
- int64_t* num_calls_finished_with_drop_for_load_balancing,
int64_t* num_calls_finished_with_client_failed_to_send,
- int64_t* num_calls_finished_known_received) {
+ int64_t* num_calls_finished_known_received,
+ grpc_grpclb_dropped_call_counts** drop_token_counts) {
atomic_get_and_reset_counter(num_calls_started,
&client_stats->num_calls_started);
atomic_get_and_reset_counter(num_calls_finished,
&client_stats->num_calls_finished);
atomic_get_and_reset_counter(
- num_calls_finished_with_drop_for_rate_limiting,
- &client_stats->num_calls_finished_with_drop_for_rate_limiting);
- atomic_get_and_reset_counter(
- num_calls_finished_with_drop_for_load_balancing,
- &client_stats->num_calls_finished_with_drop_for_load_balancing);
- atomic_get_and_reset_counter(
num_calls_finished_with_client_failed_to_send,
&client_stats->num_calls_finished_with_client_failed_to_send);
atomic_get_and_reset_counter(
num_calls_finished_known_received,
&client_stats->num_calls_finished_known_received);
+ *drop_token_counts = client_stats->drop_token_counts;
+ client_stats->drop_token_counts = NULL;
+}
+
+void grpc_grpclb_dropped_call_counts_destroy(
+ grpc_grpclb_dropped_call_counts* drop_entries) {
+ if (drop_entries != NULL) {
+ for (size_t i = 0; i < drop_entries->num_entries; ++i) {
+ gpr_free(drop_entries->token_counts[i].token);
+ }
+ gpr_free(drop_entries->token_counts);
+ gpr_free(drop_entries);
+ }
}
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h
index 4bb47d5c5c..c51e2a431a 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h
@@ -25,6 +25,16 @@
typedef struct grpc_grpclb_client_stats grpc_grpclb_client_stats;
+typedef struct {
+ char* token;
+ int64_t count;
+} grpc_grpclb_drop_token_count;
+
+typedef struct {
+ grpc_grpclb_drop_token_count* token_counts;
+ size_t num_entries;
+} grpc_grpclb_dropped_call_counts;
+
grpc_grpclb_client_stats* grpc_grpclb_client_stats_create();
grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
grpc_grpclb_client_stats* client_stats);
@@ -33,18 +43,23 @@ void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats);
void grpc_grpclb_client_stats_add_call_started(
grpc_grpclb_client_stats* client_stats);
void grpc_grpclb_client_stats_add_call_finished(
- bool finished_with_drop_for_rate_limiting,
- bool finished_with_drop_for_load_balancing,
bool finished_with_client_failed_to_send, bool finished_known_received,
grpc_grpclb_client_stats* client_stats);
-void grpc_grpclb_client_stats_get(
+// This method is not thread-safe; caller must synchronize.
+void grpc_grpclb_client_stats_add_call_dropped_locked(
+ char* token, grpc_grpclb_client_stats* client_stats);
+
+// This method is not thread-safe; caller must synchronize.
+void grpc_grpclb_client_stats_get_locked(
grpc_grpclb_client_stats* client_stats, int64_t* num_calls_started,
int64_t* num_calls_finished,
- int64_t* num_calls_finished_with_drop_for_rate_limiting,
- int64_t* num_calls_finished_with_drop_for_load_balancing,
int64_t* num_calls_finished_with_client_failed_to_send,
- int64_t* num_calls_finished_known_received);
+ int64_t* num_calls_finished_known_received,
+ grpc_grpclb_dropped_call_counts** drop_token_counts);
+
+void grpc_grpclb_dropped_call_counts_destroy(
+ grpc_grpclb_dropped_call_counts* drop_entries);
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
*/
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c b/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c
index bec7c97a78..6fa29f326e 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c
@@ -76,7 +76,33 @@ static void populate_timestamp(gpr_timespec timestamp,
timestamp_pb->nanos = timestamp.tv_nsec;
}
-grpc_grpclb_request *grpc_grpclb_load_report_request_create(
+static bool encode_string(pb_ostream_t *stream, const pb_field_t *field,
+ void *const *arg) {
+ char *str = *arg;
+ if (!pb_encode_tag_for_field(stream, field)) return false;
+ return pb_encode_string(stream, (uint8_t *)str, strlen(str));
+}
+
+static bool encode_drops(pb_ostream_t *stream, const pb_field_t *field,
+ void *const *arg) {
+ grpc_grpclb_dropped_call_counts *drop_entries = *arg;
+ if (drop_entries == NULL) return true;
+ for (size_t i = 0; i < drop_entries->num_entries; ++i) {
+ if (!pb_encode_tag_for_field(stream, field)) return false;
+ grpc_lb_v1_ClientStatsPerToken drop_message;
+ drop_message.load_balance_token.funcs.encode = encode_string;
+ drop_message.load_balance_token.arg = drop_entries->token_counts[i].token;
+ drop_message.has_num_calls = true;
+ drop_message.num_calls = drop_entries->token_counts[i].count;
+ if (!pb_encode_submessage(stream, grpc_lb_v1_ClientStatsPerToken_fields,
+ &drop_message)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+grpc_grpclb_request *grpc_grpclb_load_report_request_create_locked(
grpc_grpclb_client_stats *client_stats) {
grpc_grpclb_request *req = gpr_zalloc(sizeof(grpc_grpclb_request));
req->has_client_stats = true;
@@ -84,18 +110,17 @@ grpc_grpclb_request *grpc_grpclb_load_report_request_create(
populate_timestamp(gpr_now(GPR_CLOCK_REALTIME), &req->client_stats.timestamp);
req->client_stats.has_num_calls_started = true;
req->client_stats.has_num_calls_finished = true;
- req->client_stats.has_num_calls_finished_with_drop_for_rate_limiting = true;
- req->client_stats.has_num_calls_finished_with_drop_for_load_balancing = true;
req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
req->client_stats.has_num_calls_finished_known_received = true;
- grpc_grpclb_client_stats_get(
+ req->client_stats.calls_finished_with_drop.funcs.encode = encode_drops;
+ grpc_grpclb_client_stats_get_locked(
client_stats, &req->client_stats.num_calls_started,
&req->client_stats.num_calls_finished,
- &req->client_stats.num_calls_finished_with_drop_for_rate_limiting,
- &req->client_stats.num_calls_finished_with_drop_for_load_balancing,
&req->client_stats.num_calls_finished_with_client_failed_to_send,
- &req->client_stats.num_calls_finished_known_received);
+ &req->client_stats.num_calls_finished_known_received,
+ (grpc_grpclb_dropped_call_counts **)&req->client_stats
+ .calls_finished_with_drop.arg);
return req;
}
@@ -117,6 +142,11 @@ grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request) {
}
void grpc_grpclb_request_destroy(grpc_grpclb_request *request) {
+ if (request->has_client_stats) {
+ grpc_grpclb_dropped_call_counts *drop_entries =
+ request->client_stats.calls_finished_with_drop.arg;
+ grpc_grpclb_dropped_call_counts_destroy(drop_entries);
+ }
gpr_free(request);
}
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h b/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h
index ef8d563edc..c4a98492c9 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h
@@ -44,7 +44,7 @@ typedef struct {
/** Create a request for a gRPC LB service under \a lb_service_name */
grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name);
-grpc_grpclb_request *grpc_grpclb_load_report_request_create(
+grpc_grpclb_request *grpc_grpclb_load_report_request_create_locked(
grpc_grpclb_client_stats *client_stats);
/** Protocol Buffers v3-encode \a request */
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c b/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
index fb119c7fc8..6a5d54c82a 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c
@@ -33,14 +33,19 @@ const pb_field_t grpc_lb_v1_InitialLoadBalanceRequest_fields[2] = {
PB_LAST_FIELD
};
-const pb_field_t grpc_lb_v1_ClientStats_fields[8] = {
+const pb_field_t grpc_lb_v1_ClientStatsPerToken_fields[3] = {
+ PB_FIELD( 1, STRING , OPTIONAL, CALLBACK, FIRST, grpc_lb_v1_ClientStatsPerToken, load_balance_token, load_balance_token, 0),
+ PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStatsPerToken, num_calls, load_balance_token, 0),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v1_ClientStats_fields[7] = {
PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, grpc_lb_v1_ClientStats, timestamp, timestamp, &grpc_lb_v1_Timestamp_fields),
PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_started, timestamp, 0),
PB_FIELD( 3, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished, num_calls_started, 0),
- PB_FIELD( 4, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_drop_for_rate_limiting, num_calls_finished, 0),
- PB_FIELD( 5, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_drop_for_load_balancing, num_calls_finished_with_drop_for_rate_limiting, 0),
- PB_FIELD( 6, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_client_failed_to_send, num_calls_finished_with_drop_for_load_balancing, 0),
+ PB_FIELD( 6, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_client_failed_to_send, num_calls_finished, 0),
PB_FIELD( 7, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_known_received, num_calls_finished_with_client_failed_to_send, 0),
+ PB_FIELD( 8, MESSAGE , REPEATED, CALLBACK, OTHER, grpc_lb_v1_ClientStats, calls_finished_with_drop, num_calls_finished_known_received, &grpc_lb_v1_ClientStatsPerToken_fields),
PB_LAST_FIELD
};
@@ -62,12 +67,11 @@ const pb_field_t grpc_lb_v1_ServerList_fields[3] = {
PB_LAST_FIELD
};
-const pb_field_t grpc_lb_v1_Server_fields[6] = {
+const pb_field_t grpc_lb_v1_Server_fields[5] = {
PB_FIELD( 1, BYTES , OPTIONAL, STATIC , FIRST, grpc_lb_v1_Server, ip_address, ip_address, 0),
PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, port, ip_address, 0),
PB_FIELD( 3, STRING , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, load_balance_token, port, 0),
- PB_FIELD( 4, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop_for_rate_limiting, load_balance_token, 0),
- PB_FIELD( 5, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop_for_load_balancing, drop_for_rate_limiting, 0),
+ PB_FIELD( 4, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop, load_balance_token, 0),
PB_LAST_FIELD
};
@@ -81,7 +85,7 @@ const pb_field_t grpc_lb_v1_Server_fields[6] = {
* numbers or field sizes that are larger than what can fit in 8 or 16 bit
* field descriptors.
*/
-PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
#endif
#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
@@ -92,7 +96,7 @@ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request)
* numbers or field sizes that are larger than what can fit in the default
* 8 bit descriptors.
*/
-PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 256 && pb_membersize(grpc_lb_v1_ClientStats, calls_finished_with_drop) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStatsPerToken_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
#endif
diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h b/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
index d3ae919ec2..93333d1aed 100644
--- a/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
+++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h
@@ -14,6 +14,13 @@ extern "C" {
#endif
/* Struct definitions */
+typedef struct _grpc_lb_v1_ClientStatsPerToken {
+ pb_callback_t load_balance_token;
+ bool has_num_calls;
+ int64_t num_calls;
+/* @@protoc_insertion_point(struct:grpc_lb_v1_ClientStatsPerToken) */
+} grpc_lb_v1_ClientStatsPerToken;
+
typedef struct _grpc_lb_v1_Duration {
bool has_seconds;
int64_t seconds;
@@ -36,10 +43,8 @@ typedef struct _grpc_lb_v1_Server {
int32_t port;
bool has_load_balance_token;
char load_balance_token[50];
- bool has_drop_for_rate_limiting;
- bool drop_for_rate_limiting;
- bool has_drop_for_load_balancing;
- bool drop_for_load_balancing;
+ bool has_drop;
+ bool drop;
/* @@protoc_insertion_point(struct:grpc_lb_v1_Server) */
} grpc_lb_v1_Server;
@@ -58,14 +63,11 @@ typedef struct _grpc_lb_v1_ClientStats {
int64_t num_calls_started;
bool has_num_calls_finished;
int64_t num_calls_finished;
- bool has_num_calls_finished_with_drop_for_rate_limiting;
- int64_t num_calls_finished_with_drop_for_rate_limiting;
- bool has_num_calls_finished_with_drop_for_load_balancing;
- int64_t num_calls_finished_with_drop_for_load_balancing;
bool has_num_calls_finished_with_client_failed_to_send;
int64_t num_calls_finished_with_client_failed_to_send;
bool has_num_calls_finished_known_received;
int64_t num_calls_finished_known_received;
+ pb_callback_t calls_finished_with_drop;
/* @@protoc_insertion_point(struct:grpc_lb_v1_ClientStats) */
} grpc_lb_v1_ClientStats;
@@ -107,39 +109,41 @@ typedef struct _grpc_lb_v1_LoadBalanceResponse {
#define grpc_lb_v1_Timestamp_init_default {false, 0, false, 0}
#define grpc_lb_v1_LoadBalanceRequest_init_default {false, grpc_lb_v1_InitialLoadBalanceRequest_init_default, false, grpc_lb_v1_ClientStats_init_default}
#define grpc_lb_v1_InitialLoadBalanceRequest_init_default {false, ""}
-#define grpc_lb_v1_ClientStats_init_default {false, grpc_lb_v1_Timestamp_init_default, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
+#define grpc_lb_v1_ClientStatsPerToken_init_default {{{NULL}, NULL}, false, 0}
+#define grpc_lb_v1_ClientStats_init_default {false, grpc_lb_v1_Timestamp_init_default, false, 0, false, 0, false, 0, false, 0, {{NULL}, NULL}}
#define grpc_lb_v1_LoadBalanceResponse_init_default {false, grpc_lb_v1_InitialLoadBalanceResponse_init_default, false, grpc_lb_v1_ServerList_init_default}
#define grpc_lb_v1_InitialLoadBalanceResponse_init_default {false, "", false, grpc_lb_v1_Duration_init_default}
#define grpc_lb_v1_ServerList_init_default {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_default}
-#define grpc_lb_v1_Server_init_default {false, {0, {0}}, false, 0, false, "", false, 0, false, 0}
+#define grpc_lb_v1_Server_init_default {false, {0, {0}}, false, 0, false, "", false, 0}
#define grpc_lb_v1_Duration_init_zero {false, 0, false, 0}
#define grpc_lb_v1_Timestamp_init_zero {false, 0, false, 0}
#define grpc_lb_v1_LoadBalanceRequest_init_zero {false, grpc_lb_v1_InitialLoadBalanceRequest_init_zero, false, grpc_lb_v1_ClientStats_init_zero}
#define grpc_lb_v1_InitialLoadBalanceRequest_init_zero {false, ""}
-#define grpc_lb_v1_ClientStats_init_zero {false, grpc_lb_v1_Timestamp_init_zero, false, 0, false, 0, false, 0, false, 0, false, 0, false, 0}
+#define grpc_lb_v1_ClientStatsPerToken_init_zero {{{NULL}, NULL}, false, 0}
+#define grpc_lb_v1_ClientStats_init_zero {false, grpc_lb_v1_Timestamp_init_zero, false, 0, false, 0, false, 0, false, 0, {{NULL}, NULL}}
#define grpc_lb_v1_LoadBalanceResponse_init_zero {false, grpc_lb_v1_InitialLoadBalanceResponse_init_zero, false, grpc_lb_v1_ServerList_init_zero}
#define grpc_lb_v1_InitialLoadBalanceResponse_init_zero {false, "", false, grpc_lb_v1_Duration_init_zero}
#define grpc_lb_v1_ServerList_init_zero {{{NULL}, NULL}, false, grpc_lb_v1_Duration_init_zero}
-#define grpc_lb_v1_Server_init_zero {false, {0, {0}}, false, 0, false, "", false, 0, false, 0}
+#define grpc_lb_v1_Server_init_zero {false, {0, {0}}, false, 0, false, "", false, 0}
/* Field tags (for use in manual encoding/decoding) */
+#define grpc_lb_v1_ClientStatsPerToken_load_balance_token_tag 1
+#define grpc_lb_v1_ClientStatsPerToken_num_calls_tag 2
#define grpc_lb_v1_Duration_seconds_tag 1
#define grpc_lb_v1_Duration_nanos_tag 2
#define grpc_lb_v1_InitialLoadBalanceRequest_name_tag 1
#define grpc_lb_v1_Server_ip_address_tag 1
#define grpc_lb_v1_Server_port_tag 2
#define grpc_lb_v1_Server_load_balance_token_tag 3
-#define grpc_lb_v1_Server_drop_for_rate_limiting_tag 4
-#define grpc_lb_v1_Server_drop_for_load_balancing_tag 5
+#define grpc_lb_v1_Server_drop_tag 4
#define grpc_lb_v1_Timestamp_seconds_tag 1
#define grpc_lb_v1_Timestamp_nanos_tag 2
#define grpc_lb_v1_ClientStats_timestamp_tag 1
#define grpc_lb_v1_ClientStats_num_calls_started_tag 2
#define grpc_lb_v1_ClientStats_num_calls_finished_tag 3
-#define grpc_lb_v1_ClientStats_num_calls_finished_with_drop_for_rate_limiting_tag 4
-#define grpc_lb_v1_ClientStats_num_calls_finished_with_drop_for_load_balancing_tag 5
#define grpc_lb_v1_ClientStats_num_calls_finished_with_client_failed_to_send_tag 6
#define grpc_lb_v1_ClientStats_num_calls_finished_known_received_tag 7
+#define grpc_lb_v1_ClientStats_calls_finished_with_drop_tag 8
#define grpc_lb_v1_InitialLoadBalanceResponse_load_balancer_delegate_tag 1
#define grpc_lb_v1_InitialLoadBalanceResponse_client_stats_report_interval_tag 2
#define grpc_lb_v1_ServerList_servers_tag 1
@@ -154,22 +158,24 @@ extern const pb_field_t grpc_lb_v1_Duration_fields[3];
extern const pb_field_t grpc_lb_v1_Timestamp_fields[3];
extern const pb_field_t grpc_lb_v1_LoadBalanceRequest_fields[3];
extern const pb_field_t grpc_lb_v1_InitialLoadBalanceRequest_fields[2];
-extern const pb_field_t grpc_lb_v1_ClientStats_fields[8];
+extern const pb_field_t grpc_lb_v1_ClientStatsPerToken_fields[3];
+extern const pb_field_t grpc_lb_v1_ClientStats_fields[7];
extern const pb_field_t grpc_lb_v1_LoadBalanceResponse_fields[3];
extern const pb_field_t grpc_lb_v1_InitialLoadBalanceResponse_fields[3];
extern const pb_field_t grpc_lb_v1_ServerList_fields[3];
-extern const pb_field_t grpc_lb_v1_Server_fields[6];
+extern const pb_field_t grpc_lb_v1_Server_fields[5];
/* Maximum encoded size of messages (where known) */
#define grpc_lb_v1_Duration_size 22
#define grpc_lb_v1_Timestamp_size 22
-#define grpc_lb_v1_LoadBalanceRequest_size 226
+#define grpc_lb_v1_LoadBalanceRequest_size (140 + grpc_lb_v1_ClientStats_size)
#define grpc_lb_v1_InitialLoadBalanceRequest_size 131
-#define grpc_lb_v1_ClientStats_size 90
+/* grpc_lb_v1_ClientStatsPerToken_size depends on runtime parameters */
+/* grpc_lb_v1_ClientStats_size depends on runtime parameters */
#define grpc_lb_v1_LoadBalanceResponse_size (98 + grpc_lb_v1_ServerList_size)
#define grpc_lb_v1_InitialLoadBalanceResponse_size 90
/* grpc_lb_v1_ServerList_size depends on runtime parameters */
-#define grpc_lb_v1_Server_size 85
+#define grpc_lb_v1_Server_size 83
/* Message IDs (where set with "msgid" option) */
#ifdef PB_MSGID
diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c
index bc40165cfb..a7f7e9542c 100644
--- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c
+++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c
@@ -74,6 +74,9 @@ typedef struct round_robin_lb_policy {
bool started_picking;
/** are we shutting down? */
bool shutdown;
+ /** has the policy gotten into the GRPC_CHANNEL_SHUTDOWN? No picks can be
+ * service after this point, the policy will never transition out. */
+ bool in_connectivity_shutdown;
/** List of picks that are waiting on connectivity */
pending_pick *pending_picks;
@@ -420,6 +423,8 @@ static int rr_pick_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol,
grpc_call_context_element *context, void **user_data,
grpc_closure *on_complete) {
round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+ GPR_ASSERT(!p->shutdown);
+ GPR_ASSERT(!p->in_connectivity_shutdown);
if (GRPC_TRACER_ON(grpc_lb_round_robin_trace)) {
gpr_log(GPR_INFO, "[RR %p] Trying to pick", (void *)pol);
}
@@ -532,6 +537,7 @@ static grpc_connectivity_state update_lb_connectivity_status_locked(
grpc_connectivity_state_set(exec_ctx, &p->state_tracker,
GRPC_CHANNEL_SHUTDOWN, GRPC_ERROR_REF(error),
"rr_shutdown");
+ p->in_connectivity_shutdown = true;
new_state = GRPC_CHANNEL_SHUTDOWN;
} else if (subchannel_list->num_transient_failures ==
p->subchannel_list->num_subchannels) { /* 4) TRANSIENT_FAILURE */
diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c
index 9065e33613..6ec3790a5f 100644
--- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c
+++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c
@@ -33,13 +33,13 @@
#include <grpc/support/string_util.h>
#include <grpc/support/time.h>
#include <grpc/support/useful.h>
-#include <nameser.h>
#include "src/core/ext/filters/client_channel/parse_address.h"
#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
#include "src/core/lib/iomgr/error.h"
#include "src/core/lib/iomgr/executor.h"
#include "src/core/lib/iomgr/iomgr_internal.h"
+#include "src/core/lib/iomgr/nameser.h"
#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/support/string.h"
diff --git a/src/core/ext/filters/client_channel/retry_throttle.c b/src/core/ext/filters/client_channel/retry_throttle.c
index 3009e21d49..0c7a3ae651 100644
--- a/src/core/ext/filters/client_channel/retry_throttle.c
+++ b/src/core/ext/filters/client_channel/retry_throttle.c
@@ -130,24 +130,28 @@ static grpc_server_retry_throttle_data* grpc_server_retry_throttle_data_create(
// avl vtable for string -> server_retry_throttle_data map
//
-static void* copy_server_name(void* key) { return gpr_strdup(key); }
+static void* copy_server_name(void* key, void* unused) {
+ return gpr_strdup(key);
+}
-static long compare_server_name(void* key1, void* key2) {
+static long compare_server_name(void* key1, void* key2, void* unused) {
return strcmp(key1, key2);
}
-static void destroy_server_retry_throttle_data(void* value) {
+static void destroy_server_retry_throttle_data(void* value, void* unused) {
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) {
+static void* copy_server_retry_throttle_data(void* value, void* unused) {
grpc_server_retry_throttle_data* throttle_data = value;
return grpc_server_retry_throttle_data_ref(throttle_data);
}
+static void destroy_server_name(void* key, void* unused) { gpr_free(key); }
+
static const gpr_avl_vtable avl_vtable = {
- gpr_free /* destroy_key */, copy_server_name, compare_server_name,
+ destroy_server_name, copy_server_name, compare_server_name,
destroy_server_retry_throttle_data, copy_server_retry_throttle_data};
//
@@ -164,19 +168,19 @@ void grpc_retry_throttle_map_init() {
void grpc_retry_throttle_map_shutdown() {
gpr_mu_destroy(&g_mu);
- gpr_avl_unref(g_avl);
+ gpr_avl_unref(g_avl, NULL);
}
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);
+ gpr_avl_get(g_avl, (char*)server_name, NULL);
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);
+ g_avl = gpr_avl_add(g_avl, (char*)server_name, throttle_data, NULL);
} else {
if (throttle_data->max_milli_tokens != max_milli_tokens ||
throttle_data->milli_token_ratio != milli_token_ratio) {
@@ -184,7 +188,7 @@ grpc_server_retry_throttle_data* grpc_retry_throttle_map_get_data_for_server(
// 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);
+ g_avl = gpr_avl_add(g_avl, (char*)server_name, throttle_data, NULL);
} else {
// Entry found. Increase refcount.
grpc_server_retry_throttle_data_ref(throttle_data);
diff --git a/src/core/ext/filters/client_channel/subchannel_index.c b/src/core/ext/filters/client_channel/subchannel_index.c
index a33ab950bf..ababd05d84 100644
--- a/src/core/ext/filters/client_channel/subchannel_index.c
+++ b/src/core/ext/filters/client_channel/subchannel_index.c
@@ -38,26 +38,8 @@ struct grpc_subchannel_key {
grpc_subchannel_args args;
};
-GPR_TLS_DECL(subchannel_index_exec_ctx);
-
static bool g_force_creation = false;
-static void enter_ctx(grpc_exec_ctx *exec_ctx) {
- GPR_ASSERT(gpr_tls_get(&subchannel_index_exec_ctx) == 0);
- gpr_tls_set(&subchannel_index_exec_ctx, (intptr_t)exec_ctx);
-}
-
-static void leave_ctx(grpc_exec_ctx *exec_ctx) {
- GPR_ASSERT(gpr_tls_get(&subchannel_index_exec_ctx) == (intptr_t)exec_ctx);
- gpr_tls_set(&subchannel_index_exec_ctx, 0);
-}
-
-static grpc_exec_ctx *current_ctx() {
- grpc_exec_ctx *c = (grpc_exec_ctx *)gpr_tls_get(&subchannel_index_exec_ctx);
- GPR_ASSERT(c != NULL);
- return c;
-}
-
static grpc_subchannel_key *create_key(
const grpc_subchannel_args *args,
grpc_channel_args *(*copy_channel_args)(const grpc_channel_args *args)) {
@@ -104,21 +86,25 @@ void grpc_subchannel_key_destroy(grpc_exec_ctx *exec_ctx,
gpr_free(k);
}
-static void sck_avl_destroy(void *p) {
- grpc_subchannel_key_destroy(current_ctx(), p);
+static void sck_avl_destroy(void *p, void *user_data) {
+ grpc_exec_ctx *exec_ctx = (grpc_exec_ctx *)user_data;
+ grpc_subchannel_key_destroy(exec_ctx, p);
}
-static void *sck_avl_copy(void *p) { return subchannel_key_copy(p); }
+static void *sck_avl_copy(void *p, void *unused) {
+ return subchannel_key_copy(p);
+}
-static long sck_avl_compare(void *a, void *b) {
+static long sck_avl_compare(void *a, void *b, void *unused) {
return grpc_subchannel_key_compare(a, b);
}
-static void scv_avl_destroy(void *p) {
- GRPC_SUBCHANNEL_WEAK_UNREF(current_ctx(), p, "subchannel_index");
+static void scv_avl_destroy(void *p, void *user_data) {
+ grpc_exec_ctx *exec_ctx = (grpc_exec_ctx *)user_data;
+ GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, p, "subchannel_index");
}
-static void *scv_avl_copy(void *p) {
+static void *scv_avl_copy(void *p, void *unused) {
GRPC_SUBCHANNEL_WEAK_REF(p, "subchannel_index");
return p;
}
@@ -133,38 +119,33 @@ static const gpr_avl_vtable subchannel_avl_vtable = {
void grpc_subchannel_index_init(void) {
g_subchannel_index = gpr_avl_create(&subchannel_avl_vtable);
gpr_mu_init(&g_mu);
- gpr_tls_init(&subchannel_index_exec_ctx);
}
void grpc_subchannel_index_shutdown(void) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
gpr_mu_destroy(&g_mu);
- gpr_avl_unref(g_subchannel_index);
- gpr_tls_destroy(&subchannel_index_exec_ctx);
+ gpr_avl_unref(g_subchannel_index, &exec_ctx);
+ grpc_exec_ctx_finish(&exec_ctx);
}
grpc_subchannel *grpc_subchannel_index_find(grpc_exec_ctx *exec_ctx,
grpc_subchannel_key *key) {
- enter_ctx(exec_ctx);
-
// Lock, and take a reference to the subchannel index.
// We don't need to do the search under a lock as avl's are immutable.
gpr_mu_lock(&g_mu);
- gpr_avl index = gpr_avl_ref(g_subchannel_index);
+ gpr_avl index = gpr_avl_ref(g_subchannel_index, exec_ctx);
gpr_mu_unlock(&g_mu);
- grpc_subchannel *c =
- GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(gpr_avl_get(index, key), "index_find");
- gpr_avl_unref(index);
+ grpc_subchannel *c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(
+ gpr_avl_get(index, key, exec_ctx), "index_find");
+ gpr_avl_unref(index, exec_ctx);
- leave_ctx(exec_ctx);
return c;
}
grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx,
grpc_subchannel_key *key,
grpc_subchannel *constructed) {
- enter_ctx(exec_ctx);
-
grpc_subchannel *c = NULL;
bool need_to_unref_constructed;
@@ -174,11 +155,11 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx,
// Compare and swap loop:
// - take a reference to the current index
gpr_mu_lock(&g_mu);
- gpr_avl index = gpr_avl_ref(g_subchannel_index);
+ gpr_avl index = gpr_avl_ref(g_subchannel_index, exec_ctx);
gpr_mu_unlock(&g_mu);
// - Check to see if a subchannel already exists
- c = gpr_avl_get(index, key);
+ c = gpr_avl_get(index, key, exec_ctx);
if (c != NULL) {
c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "index_register");
}
@@ -187,9 +168,9 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx,
need_to_unref_constructed = true;
} else {
// no -> update the avl and compare/swap
- gpr_avl updated =
- gpr_avl_add(gpr_avl_ref(index), subchannel_key_copy(key),
- GRPC_SUBCHANNEL_WEAK_REF(constructed, "index_register"));
+ gpr_avl updated = gpr_avl_add(
+ gpr_avl_ref(index, exec_ctx), subchannel_key_copy(key),
+ GRPC_SUBCHANNEL_WEAK_REF(constructed, "index_register"), exec_ctx);
// it may happen (but it's expected to be unlikely)
// that some other thread has changed the index:
@@ -201,13 +182,11 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx,
}
gpr_mu_unlock(&g_mu);
- gpr_avl_unref(updated);
+ gpr_avl_unref(updated, exec_ctx);
}
- gpr_avl_unref(index);
+ gpr_avl_unref(index, exec_ctx);
}
- leave_ctx(exec_ctx);
-
if (need_to_unref_constructed) {
GRPC_SUBCHANNEL_UNREF(exec_ctx, constructed, "index_register");
}
@@ -218,27 +197,26 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx,
void grpc_subchannel_index_unregister(grpc_exec_ctx *exec_ctx,
grpc_subchannel_key *key,
grpc_subchannel *constructed) {
- enter_ctx(exec_ctx);
-
bool done = false;
while (!done) {
// Compare and swap loop:
// - take a reference to the current index
gpr_mu_lock(&g_mu);
- gpr_avl index = gpr_avl_ref(g_subchannel_index);
+ gpr_avl index = gpr_avl_ref(g_subchannel_index, exec_ctx);
gpr_mu_unlock(&g_mu);
// Check to see if this key still refers to the previously
// registered subchannel
- grpc_subchannel *c = gpr_avl_get(index, key);
+ grpc_subchannel *c = gpr_avl_get(index, key, exec_ctx);
if (c != constructed) {
- gpr_avl_unref(index);
+ gpr_avl_unref(index, exec_ctx);
break;
}
// compare and swap the update (some other thread may have
// mutated the index behind us)
- gpr_avl updated = gpr_avl_remove(gpr_avl_ref(index), key);
+ gpr_avl updated =
+ gpr_avl_remove(gpr_avl_ref(index, exec_ctx), key, exec_ctx);
gpr_mu_lock(&g_mu);
if (index.root == g_subchannel_index.root) {
@@ -247,11 +225,9 @@ void grpc_subchannel_index_unregister(grpc_exec_ctx *exec_ctx,
}
gpr_mu_unlock(&g_mu);
- gpr_avl_unref(updated);
- gpr_avl_unref(index);
+ gpr_avl_unref(updated, exec_ctx);
+ gpr_avl_unref(index, exec_ctx);
}
-
- leave_ctx(exec_ctx);
}
void grpc_subchannel_index_test_only_set_force_creation(bool force_creation) {
diff --git a/src/core/ext/filters/http/client/http_client_filter.c b/src/core/ext/filters/http/client/http_client_filter.c
index 90f0aed7a0..3ca01a41b5 100644
--- a/src/core/ext/filters/http/client/http_client_filter.c
+++ b/src/core/ext/filters/http/client/http_client_filter.c
@@ -36,41 +36,29 @@
static const size_t kMaxPayloadSizeForGet = 2048;
typedef struct call_data {
+ // State for handling send_initial_metadata ops.
grpc_linked_mdelem method;
grpc_linked_mdelem scheme;
grpc_linked_mdelem authority;
grpc_linked_mdelem te_trailers;
grpc_linked_mdelem content_type;
grpc_linked_mdelem user_agent;
-
+ // State for handling recv_initial_metadata ops.
grpc_metadata_batch *recv_initial_metadata;
+ grpc_closure *original_recv_initial_metadata_ready;
+ grpc_closure recv_initial_metadata_ready;
+ // State for handling recv_trailing_metadata ops.
grpc_metadata_batch *recv_trailing_metadata;
- uint8_t *payload_bytes;
-
- /* Vars to read data off of send_message */
- grpc_transport_stream_op_batch *send_op;
- uint32_t send_length;
- uint32_t send_flags;
- grpc_slice incoming_slice;
- grpc_slice_buffer_stream replacement_stream;
- grpc_slice_buffer slices;
- /* flag that indicates that all slices of send_messages aren't availble */
- bool send_message_blocked;
-
- /** Closure to call when finished with the hc_on_recv hook */
- grpc_closure *on_done_recv_initial_metadata;
- grpc_closure *on_done_recv_trailing_metadata;
- grpc_closure *on_complete;
- grpc_closure *post_send;
-
- /** Receive closures are chained: we inject this closure as the on_done_recv
- up-call on transport_op, and remember to call our on_done_recv member
- after handling it. */
- grpc_closure hc_on_recv_initial_metadata;
- grpc_closure hc_on_recv_trailing_metadata;
- grpc_closure hc_on_complete;
- grpc_closure got_slice;
- grpc_closure send_done;
+ grpc_closure *original_recv_trailing_metadata_on_complete;
+ grpc_closure recv_trailing_metadata_on_complete;
+ // State for handling send_message ops.
+ grpc_transport_stream_op_batch *send_message_batch;
+ size_t send_message_bytes_read;
+ grpc_byte_stream_cache send_message_cache;
+ grpc_caching_byte_stream send_message_caching_stream;
+ grpc_closure on_send_message_next_done;
+ grpc_closure *original_send_message_on_complete;
+ grpc_closure send_message_on_complete;
} call_data;
typedef struct channel_data {
@@ -148,7 +136,7 @@ static grpc_error *client_filter_incoming_metadata(grpc_exec_ctx *exec_ctx,
return GRPC_ERROR_NONE;
}
-static void hc_on_recv_initial_metadata(grpc_exec_ctx *exec_ctx,
+static void recv_initial_metadata_ready(grpc_exec_ctx *exec_ctx,
void *user_data, grpc_error *error) {
grpc_call_element *elem = user_data;
call_data *calld = elem->call_data;
@@ -158,11 +146,13 @@ static void hc_on_recv_initial_metadata(grpc_exec_ctx *exec_ctx,
} else {
GRPC_ERROR_REF(error);
}
- GRPC_CLOSURE_RUN(exec_ctx, calld->on_done_recv_initial_metadata, error);
+ GRPC_CLOSURE_RUN(exec_ctx, calld->original_recv_initial_metadata_ready,
+ error);
}
-static void hc_on_recv_trailing_metadata(grpc_exec_ctx *exec_ctx,
- void *user_data, grpc_error *error) {
+static void recv_trailing_metadata_on_complete(grpc_exec_ctx *exec_ctx,
+ void *user_data,
+ grpc_error *error) {
grpc_call_element *elem = user_data;
call_data *calld = elem->call_data;
if (error == GRPC_ERROR_NONE) {
@@ -171,25 +161,131 @@ static void hc_on_recv_trailing_metadata(grpc_exec_ctx *exec_ctx,
} else {
GRPC_ERROR_REF(error);
}
- GRPC_CLOSURE_RUN(exec_ctx, calld->on_done_recv_trailing_metadata, error);
+ GRPC_CLOSURE_RUN(exec_ctx, calld->original_recv_trailing_metadata_on_complete,
+ error);
}
-static void hc_on_complete(grpc_exec_ctx *exec_ctx, void *user_data,
- grpc_error *error) {
- grpc_call_element *elem = user_data;
- call_data *calld = elem->call_data;
- if (calld->payload_bytes) {
- gpr_free(calld->payload_bytes);
- calld->payload_bytes = NULL;
+static void send_message_on_complete(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ grpc_call_element *elem = (grpc_call_element *)arg;
+ call_data *calld = (call_data *)elem->call_data;
+ grpc_byte_stream_cache_destroy(exec_ctx, &calld->send_message_cache);
+ GRPC_CLOSURE_RUN(exec_ctx, calld->original_send_message_on_complete,
+ GRPC_ERROR_REF(error));
+}
+
+// Pulls a slice from the send_message byte stream, updating
+// calld->send_message_bytes_read.
+static grpc_error *pull_slice_from_send_message(grpc_exec_ctx *exec_ctx,
+ call_data *calld) {
+ grpc_slice incoming_slice;
+ grpc_error *error = grpc_byte_stream_pull(
+ exec_ctx, &calld->send_message_caching_stream.base, &incoming_slice);
+ if (error == GRPC_ERROR_NONE) {
+ calld->send_message_bytes_read += GRPC_SLICE_LENGTH(incoming_slice);
+ grpc_slice_unref_internal(exec_ctx, incoming_slice);
}
- calld->on_complete->cb(exec_ctx, calld->on_complete->cb_arg, error);
+ return error;
}
-static void send_done(grpc_exec_ctx *exec_ctx, void *elemp, grpc_error *error) {
- grpc_call_element *elem = elemp;
- call_data *calld = elem->call_data;
- grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &calld->slices);
- calld->post_send->cb(exec_ctx, calld->post_send->cb_arg, error);
+// Reads as many slices as possible from the send_message byte stream.
+// Upon successful return, if calld->send_message_bytes_read ==
+// calld->send_message_caching_stream.base.length, then we have completed
+// reading from the byte stream; otherwise, an async read has been dispatched
+// and on_send_message_next_done() will be invoked when it is complete.
+static grpc_error *read_all_available_send_message_data(grpc_exec_ctx *exec_ctx,
+ call_data *calld) {
+ while (grpc_byte_stream_next(exec_ctx,
+ &calld->send_message_caching_stream.base,
+ ~(size_t)0, &calld->on_send_message_next_done)) {
+ grpc_error *error = pull_slice_from_send_message(exec_ctx, calld);
+ if (error != GRPC_ERROR_NONE) return error;
+ if (calld->send_message_bytes_read ==
+ calld->send_message_caching_stream.base.length) {
+ break;
+ }
+ }
+ return GRPC_ERROR_NONE;
+}
+
+// Async callback for grpc_byte_stream_next().
+static void on_send_message_next_done(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ grpc_call_element *elem = (grpc_call_element *)arg;
+ call_data *calld = (call_data *)elem->call_data;
+ if (error != GRPC_ERROR_NONE) {
+ grpc_transport_stream_op_batch_finish_with_failure(
+ exec_ctx, calld->send_message_batch, error);
+ return;
+ }
+ error = pull_slice_from_send_message(exec_ctx, calld);
+ if (error != GRPC_ERROR_NONE) {
+ grpc_transport_stream_op_batch_finish_with_failure(
+ exec_ctx, calld->send_message_batch, error);
+ return;
+ }
+ // There may or may not be more to read, but we don't care. If we got
+ // here, then we know that all of the data was not available
+ // synchronously, so we were not able to do a cached call. Instead,
+ // we just reset the byte stream and then send down the batch as-is.
+ grpc_caching_byte_stream_reset(&calld->send_message_caching_stream);
+ grpc_call_next_op(exec_ctx, elem, calld->send_message_batch);
+}
+
+static char *slice_buffer_to_string(grpc_slice_buffer *slice_buffer) {
+ char *payload_bytes = gpr_malloc(slice_buffer->length + 1);
+ size_t offset = 0;
+ for (size_t i = 0; i < slice_buffer->count; ++i) {
+ memcpy(payload_bytes + offset,
+ GRPC_SLICE_START_PTR(slice_buffer->slices[i]),
+ GRPC_SLICE_LENGTH(slice_buffer->slices[i]));
+ offset += GRPC_SLICE_LENGTH(slice_buffer->slices[i]);
+ }
+ *(payload_bytes + offset) = '\0';
+ return payload_bytes;
+}
+
+// Modifies the path entry in the batch's send_initial_metadata to
+// append the base64-encoded query for a GET request.
+static grpc_error *update_path_for_get(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem,
+ grpc_transport_stream_op_batch *batch) {
+ call_data *calld = (call_data *)elem->call_data;
+ grpc_slice path_slice =
+ GRPC_MDVALUE(batch->payload->send_initial_metadata.send_initial_metadata
+ ->idx.named.path->md);
+ /* sum up individual component's lengths and allocate enough memory to
+ * hold combined path+query */
+ size_t estimated_len = GRPC_SLICE_LENGTH(path_slice);
+ estimated_len++; /* for the '?' */
+ estimated_len += grpc_base64_estimate_encoded_size(
+ batch->payload->send_message.send_message->length, true /* url_safe */,
+ false /* multi_line */);
+ grpc_slice path_with_query_slice = GRPC_SLICE_MALLOC(estimated_len);
+ /* memcopy individual pieces into this slice */
+ char *write_ptr = (char *)GRPC_SLICE_START_PTR(path_with_query_slice);
+ char *original_path = (char *)GRPC_SLICE_START_PTR(path_slice);
+ memcpy(write_ptr, original_path, GRPC_SLICE_LENGTH(path_slice));
+ write_ptr += GRPC_SLICE_LENGTH(path_slice);
+ *write_ptr++ = '?';
+ char *payload_bytes =
+ slice_buffer_to_string(&calld->send_message_cache.cache_buffer);
+ grpc_base64_encode_core((char *)write_ptr, payload_bytes,
+ batch->payload->send_message.send_message->length,
+ true /* url_safe */, false /* multi_line */);
+ gpr_free(payload_bytes);
+ /* remove trailing unused memory and add trailing 0 to terminate string */
+ char *t = (char *)GRPC_SLICE_START_PTR(path_with_query_slice);
+ /* safe to use strlen since base64_encode will always add '\0' */
+ path_with_query_slice =
+ grpc_slice_sub_no_ref(path_with_query_slice, 0, strlen(t));
+ /* substitute previous path with the new path+query */
+ grpc_mdelem mdelem_path_and_query =
+ grpc_mdelem_from_slices(exec_ctx, GRPC_MDSTR_PATH, path_with_query_slice);
+ grpc_metadata_batch *b =
+ batch->payload->send_initial_metadata.send_initial_metadata;
+ return grpc_metadata_batch_substitute(exec_ctx, b, b->idx.named.path,
+ mdelem_path_and_query);
}
static void remove_if_present(grpc_exec_ctx *exec_ctx,
@@ -200,273 +296,153 @@ static void remove_if_present(grpc_exec_ctx *exec_ctx,
}
}
-static void continue_send_message(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem) {
+static void hc_start_transport_stream_op_batch(
+ grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
+ grpc_transport_stream_op_batch *batch) {
call_data *calld = elem->call_data;
- uint8_t *wrptr = calld->payload_bytes;
- while (grpc_byte_stream_next(
- exec_ctx, calld->send_op->payload->send_message.send_message, ~(size_t)0,
- &calld->got_slice)) {
- grpc_byte_stream_pull(exec_ctx,
- calld->send_op->payload->send_message.send_message,
- &calld->incoming_slice);
- if (GRPC_SLICE_LENGTH(calld->incoming_slice) > 0) {
- memcpy(wrptr, GRPC_SLICE_START_PTR(calld->incoming_slice),
- GRPC_SLICE_LENGTH(calld->incoming_slice));
- }
- wrptr += GRPC_SLICE_LENGTH(calld->incoming_slice);
- grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
- if (calld->send_length == calld->slices.length) {
- calld->send_message_blocked = false;
- break;
- }
- }
-}
+ channel_data *channeld = elem->channel_data;
+ GPR_TIMER_BEGIN("hc_start_transport_stream_op_batch", 0);
+ GRPC_CALL_LOG_OP(GPR_INFO, elem, batch);
-static void got_slice(grpc_exec_ctx *exec_ctx, void *elemp, grpc_error *error) {
- grpc_call_element *elem = elemp;
- call_data *calld = elem->call_data;
- calld->send_message_blocked = false;
- if (GRPC_ERROR_NONE !=
- grpc_byte_stream_pull(exec_ctx,
- calld->send_op->payload->send_message.send_message,
- &calld->incoming_slice)) {
- /* Should never reach here */
- abort();
- }
- grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
- if (calld->send_length == calld->slices.length) {
- /* Pass down the original send_message op that was blocked.*/
- grpc_slice_buffer_stream_init(&calld->replacement_stream, &calld->slices,
- calld->send_flags);
- calld->send_op->payload->send_message.send_message =
- &calld->replacement_stream.base;
- calld->post_send = calld->send_op->on_complete;
- calld->send_op->on_complete = &calld->send_done;
- grpc_call_next_op(exec_ctx, elem, calld->send_op);
- } else {
- continue_send_message(exec_ctx, elem);
+ if (batch->recv_initial_metadata) {
+ /* substitute our callback for the higher callback */
+ calld->recv_initial_metadata =
+ batch->payload->recv_initial_metadata.recv_initial_metadata;
+ calld->original_recv_initial_metadata_ready =
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready;
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready =
+ &calld->recv_initial_metadata_ready;
}
-}
-static grpc_error *hc_mutate_op(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem,
- grpc_transport_stream_op_batch *op) {
- /* grab pointers to our data from the call element */
- call_data *calld = elem->call_data;
- channel_data *channeld = elem->channel_data;
- grpc_error *error;
+ if (batch->recv_trailing_metadata) {
+ /* substitute our callback for the higher callback */
+ calld->recv_trailing_metadata =
+ batch->payload->recv_trailing_metadata.recv_trailing_metadata;
+ calld->original_recv_trailing_metadata_on_complete = batch->on_complete;
+ batch->on_complete = &calld->recv_trailing_metadata_on_complete;
+ }
- if (op->send_initial_metadata) {
- /* Decide which HTTP VERB to use. We use GET if the request is marked
- cacheable, and the operation contains both initial metadata and send
- message, and the payload is below the size threshold, and all the data
- for this request is immediately available. */
+ grpc_error *error = GRPC_ERROR_NONE;
+ bool batch_will_be_handled_asynchronously = false;
+ if (batch->send_initial_metadata) {
+ // Decide which HTTP VERB to use. We use GET if the request is marked
+ // cacheable, and the operation contains both initial metadata and send
+ // message, and the payload is below the size threshold, and all the data
+ // for this request is immediately available.
grpc_mdelem method = GRPC_MDELEM_METHOD_POST;
- if (op->send_message &&
- (op->payload->send_initial_metadata.send_initial_metadata_flags &
+ if (batch->send_message &&
+ (batch->payload->send_initial_metadata.send_initial_metadata_flags &
GRPC_INITIAL_METADATA_CACHEABLE_REQUEST) &&
- op->payload->send_message.send_message->length <
+ batch->payload->send_message.send_message->length <
channeld->max_payload_size_for_get) {
- method = GRPC_MDELEM_METHOD_GET;
- /* The following write to calld->send_message_blocked isn't racy with
- reads in hc_start_transport_op (which deals with SEND_MESSAGE ops) because
- being here means ops->send_message is not NULL, which is primarily
- guarding the read there. */
- calld->send_message_blocked = true;
- } else if (op->payload->send_initial_metadata.send_initial_metadata_flags &
- GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) {
- method = GRPC_MDELEM_METHOD_PUT;
- }
-
- /* Attempt to read the data from send_message and create a header field. */
- if (grpc_mdelem_eq(method, GRPC_MDELEM_METHOD_GET)) {
- /* allocate memory to hold the entire payload */
- calld->payload_bytes =
- gpr_malloc(op->payload->send_message.send_message->length);
-
- /* read slices of send_message and copy into payload_bytes */
- calld->send_op = op;
- calld->send_length = op->payload->send_message.send_message->length;
- calld->send_flags = op->payload->send_message.send_message->flags;
- continue_send_message(exec_ctx, elem);
-
- if (calld->send_message_blocked == false) {
- /* when all the send_message data is available, then modify the path
- * MDELEM by appending base64 encoded query to the path */
- const int k_url_safe = 1;
- const int k_multi_line = 0;
- const unsigned char k_query_separator = '?';
-
- grpc_slice path_slice =
- GRPC_MDVALUE(op->payload->send_initial_metadata
- .send_initial_metadata->idx.named.path->md);
- /* sum up individual component's lengths and allocate enough memory to
- * hold combined path+query */
- size_t estimated_len = GRPC_SLICE_LENGTH(path_slice);
- estimated_len++; /* for the '?' */
- estimated_len += grpc_base64_estimate_encoded_size(
- op->payload->send_message.send_message->length, k_url_safe,
- k_multi_line);
- grpc_slice path_with_query_slice = GRPC_SLICE_MALLOC(estimated_len);
-
- /* memcopy individual pieces into this slice */
- uint8_t *write_ptr =
- (uint8_t *)GRPC_SLICE_START_PTR(path_with_query_slice);
- uint8_t *original_path = (uint8_t *)GRPC_SLICE_START_PTR(path_slice);
- memcpy(write_ptr, original_path, GRPC_SLICE_LENGTH(path_slice));
- write_ptr += GRPC_SLICE_LENGTH(path_slice);
-
- *write_ptr = k_query_separator;
- write_ptr++; /* for the '?' */
-
- grpc_base64_encode_core((char *)write_ptr, calld->payload_bytes,
- op->payload->send_message.send_message->length,
- k_url_safe, k_multi_line);
-
- /* remove trailing unused memory and add trailing 0 to terminate string
- */
- char *t = (char *)GRPC_SLICE_START_PTR(path_with_query_slice);
- /* safe to use strlen since base64_encode will always add '\0' */
- path_with_query_slice =
- grpc_slice_sub_no_ref(path_with_query_slice, 0, strlen(t));
-
- /* substitute previous path with the new path+query */
- grpc_mdelem mdelem_path_and_query = grpc_mdelem_from_slices(
- exec_ctx, GRPC_MDSTR_PATH, path_with_query_slice);
- grpc_metadata_batch *b =
- op->payload->send_initial_metadata.send_initial_metadata;
- error = grpc_metadata_batch_substitute(exec_ctx, b, b->idx.named.path,
- mdelem_path_and_query);
- if (error != GRPC_ERROR_NONE) return error;
-
- calld->on_complete = op->on_complete;
- op->on_complete = &calld->hc_on_complete;
- op->send_message = false;
+ calld->send_message_bytes_read = 0;
+ grpc_byte_stream_cache_init(&calld->send_message_cache,
+ batch->payload->send_message.send_message);
+ grpc_caching_byte_stream_init(&calld->send_message_caching_stream,
+ &calld->send_message_cache);
+ batch->payload->send_message.send_message =
+ &calld->send_message_caching_stream.base;
+ calld->original_send_message_on_complete = batch->on_complete;
+ batch->on_complete = &calld->send_message_on_complete;
+ calld->send_message_batch = batch;
+ error = read_all_available_send_message_data(exec_ctx, calld);
+ if (error != GRPC_ERROR_NONE) goto done;
+ // If all the data has been read, then we can use GET.
+ if (calld->send_message_bytes_read ==
+ calld->send_message_caching_stream.base.length) {
+ method = GRPC_MDELEM_METHOD_GET;
+ error = update_path_for_get(exec_ctx, elem, batch);
+ if (error != GRPC_ERROR_NONE) goto done;
+ batch->send_message = false;
+ grpc_byte_stream_destroy(exec_ctx,
+ &calld->send_message_caching_stream.base);
} else {
- /* Not all data is available. Fall back to POST. */
+ // Not all data is available. The batch will be sent down
+ // asynchronously in on_send_message_next_done().
+ batch_will_be_handled_asynchronously = true;
+ // Fall back to POST.
gpr_log(GPR_DEBUG,
- "Request is marked Cacheable but not all data is available.\
- Falling back to POST");
- method = GRPC_MDELEM_METHOD_POST;
+ "Request is marked Cacheable but not all data is available. "
+ "Falling back to POST");
}
+ } else if (batch->payload->send_initial_metadata
+ .send_initial_metadata_flags &
+ GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) {
+ method = GRPC_MDELEM_METHOD_PUT;
}
- remove_if_present(exec_ctx,
- op->payload->send_initial_metadata.send_initial_metadata,
- GRPC_BATCH_METHOD);
- remove_if_present(exec_ctx,
- op->payload->send_initial_metadata.send_initial_metadata,
- GRPC_BATCH_SCHEME);
- remove_if_present(exec_ctx,
- op->payload->send_initial_metadata.send_initial_metadata,
- GRPC_BATCH_TE);
- remove_if_present(exec_ctx,
- op->payload->send_initial_metadata.send_initial_metadata,
- GRPC_BATCH_CONTENT_TYPE);
- remove_if_present(exec_ctx,
- op->payload->send_initial_metadata.send_initial_metadata,
- GRPC_BATCH_USER_AGENT);
+ remove_if_present(
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
+ GRPC_BATCH_METHOD);
+ remove_if_present(
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
+ GRPC_BATCH_SCHEME);
+ remove_if_present(
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
+ GRPC_BATCH_TE);
+ remove_if_present(
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
+ GRPC_BATCH_CONTENT_TYPE);
+ remove_if_present(
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
+ GRPC_BATCH_USER_AGENT);
/* Send : prefixed headers, which have to be before any application
layer headers. */
error = grpc_metadata_batch_add_head(
- exec_ctx, op->payload->send_initial_metadata.send_initial_metadata,
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
&calld->method, method);
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) goto done;
error = grpc_metadata_batch_add_head(
- exec_ctx, op->payload->send_initial_metadata.send_initial_metadata,
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
&calld->scheme, channeld->static_scheme);
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) goto done;
error = grpc_metadata_batch_add_tail(
- exec_ctx, op->payload->send_initial_metadata.send_initial_metadata,
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
&calld->te_trailers, GRPC_MDELEM_TE_TRAILERS);
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) goto done;
error = grpc_metadata_batch_add_tail(
- exec_ctx, op->payload->send_initial_metadata.send_initial_metadata,
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
&calld->content_type, GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC);
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) goto done;
error = grpc_metadata_batch_add_tail(
- exec_ctx, op->payload->send_initial_metadata.send_initial_metadata,
+ exec_ctx, batch->payload->send_initial_metadata.send_initial_metadata,
&calld->user_agent, GRPC_MDELEM_REF(channeld->user_agent));
- if (error != GRPC_ERROR_NONE) return error;
+ if (error != GRPC_ERROR_NONE) goto done;
}
- if (op->recv_initial_metadata) {
- /* substitute our callback for the higher callback */
- calld->recv_initial_metadata =
- op->payload->recv_initial_metadata.recv_initial_metadata;
- calld->on_done_recv_initial_metadata =
- op->payload->recv_initial_metadata.recv_initial_metadata_ready;
- op->payload->recv_initial_metadata.recv_initial_metadata_ready =
- &calld->hc_on_recv_initial_metadata;
- }
-
- if (op->recv_trailing_metadata) {
- /* substitute our callback for the higher callback */
- calld->recv_trailing_metadata =
- op->payload->recv_trailing_metadata.recv_trailing_metadata;
- calld->on_done_recv_trailing_metadata = op->on_complete;
- op->on_complete = &calld->hc_on_recv_trailing_metadata;
- }
-
- return GRPC_ERROR_NONE;
-}
-
-static void hc_start_transport_op(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem,
- grpc_transport_stream_op_batch *op) {
- GPR_TIMER_BEGIN("hc_start_transport_op", 0);
- GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
- grpc_error *error = hc_mutate_op(exec_ctx, elem, op);
+done:
if (error != GRPC_ERROR_NONE) {
- grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, op, error);
- } else {
- call_data *calld = elem->call_data;
- if (op->send_message && calld->send_message_blocked) {
- /* Don't forward the op. send_message contains slices that aren't ready
- yet. The call will be forwarded by the op_complete of slice read call.
- */
- } else {
- grpc_call_next_op(exec_ctx, elem, op);
- }
+ grpc_transport_stream_op_batch_finish_with_failure(
+ exec_ctx, calld->send_message_batch, error);
+ } else if (!batch_will_be_handled_asynchronously) {
+ grpc_call_next_op(exec_ctx, elem, batch);
}
- GPR_TIMER_END("hc_start_transport_op", 0);
+ GPR_TIMER_END("hc_start_transport_stream_op_batch", 0);
}
/* Constructor for call_data */
static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
grpc_call_element *elem,
const grpc_call_element_args *args) {
- call_data *calld = elem->call_data;
- calld->on_done_recv_initial_metadata = NULL;
- calld->on_done_recv_trailing_metadata = NULL;
- calld->on_complete = NULL;
- calld->payload_bytes = NULL;
- calld->send_message_blocked = false;
- grpc_slice_buffer_init(&calld->slices);
- GRPC_CLOSURE_INIT(&calld->hc_on_recv_initial_metadata,
- hc_on_recv_initial_metadata, elem,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&calld->hc_on_recv_trailing_metadata,
- hc_on_recv_trailing_metadata, elem,
+ call_data *calld = (call_data *)elem->call_data;
+ GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
+ recv_initial_metadata_ready, elem,
grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&calld->hc_on_complete, hc_on_complete, elem,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&calld->got_slice, got_slice, elem,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&calld->send_done, send_done, elem,
+ GRPC_CLOSURE_INIT(&calld->recv_trailing_metadata_on_complete,
+ recv_trailing_metadata_on_complete, elem,
grpc_schedule_on_exec_ctx);
+ GRPC_CLOSURE_INIT(&calld->send_message_on_complete, send_message_on_complete,
+ elem, grpc_schedule_on_exec_ctx);
+ GRPC_CLOSURE_INIT(&calld->on_send_message_next_done,
+ on_send_message_next_done, elem, grpc_schedule_on_exec_ctx);
return GRPC_ERROR_NONE;
}
/* 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,
- grpc_closure *ignored) {
- call_data *calld = elem->call_data;
- grpc_slice_buffer_destroy_internal(exec_ctx, &calld->slices);
-}
+ grpc_closure *ignored) {}
static grpc_mdelem scheme_from_args(const grpc_channel_args *args) {
unsigned i;
@@ -580,7 +556,7 @@ static void destroy_channel_elem(grpc_exec_ctx *exec_ctx,
}
const grpc_channel_filter grpc_http_client_filter = {
- hc_start_transport_op,
+ hc_start_transport_stream_op_batch,
grpc_channel_next_op,
sizeof(call_data),
init_call_elem,
diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.c b/src/core/ext/filters/http/message_compress/message_compress_filter.c
index 71a8bc5bec..20a3488115 100644
--- a/src/core/ext/filters/http/message_compress/message_compress_filter.c
+++ b/src/core/ext/filters/http/message_compress/message_compress_filter.c
@@ -61,14 +61,11 @@ typedef struct call_data {
pointer | CANCELLED_BIT - request was cancelled with error pointed to */
gpr_atm send_initial_metadata_state;
- grpc_transport_stream_op_batch *send_op;
- uint32_t send_length;
- uint32_t send_flags;
- grpc_slice incoming_slice;
+ grpc_transport_stream_op_batch *send_message_batch;
grpc_slice_buffer_stream replacement_stream;
- grpc_closure *post_send;
- grpc_closure send_done;
- grpc_closure got_slice;
+ grpc_closure *original_send_message_on_complete;
+ grpc_closure send_message_on_complete;
+ grpc_closure on_send_message_next_done;
} call_data;
typedef struct channel_data {
@@ -164,24 +161,25 @@ static grpc_error *process_send_initial_metadata(
return error;
}
-static void continue_send_message(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem);
-
-static void send_done(grpc_exec_ctx *exec_ctx, void *elemp, grpc_error *error) {
- grpc_call_element *elem = elemp;
- call_data *calld = elem->call_data;
+static void send_message_on_complete(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ grpc_call_element *elem = (grpc_call_element *)arg;
+ call_data *calld = (call_data *)elem->call_data;
grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &calld->slices);
- calld->post_send->cb(exec_ctx, calld->post_send->cb_arg, error);
+ GRPC_CLOSURE_RUN(exec_ctx, calld->original_send_message_on_complete,
+ GRPC_ERROR_REF(error));
}
static void finish_send_message(grpc_exec_ctx *exec_ctx,
grpc_call_element *elem) {
- call_data *calld = elem->call_data;
- int did_compress;
+ call_data *calld = (call_data *)elem->call_data;
+ // Compress the data if appropriate.
grpc_slice_buffer tmp;
grpc_slice_buffer_init(&tmp);
- did_compress = grpc_msg_compress(exec_ctx, calld->compression_algorithm,
- &calld->slices, &tmp);
+ uint32_t send_flags =
+ calld->send_message_batch->payload->send_message.send_message->flags;
+ const bool did_compress = grpc_msg_compress(
+ exec_ctx, calld->compression_algorithm, &calld->slices, &tmp);
if (did_compress) {
if (GRPC_TRACER_ON(grpc_compression_trace)) {
char *algo_name;
@@ -195,7 +193,7 @@ static void finish_send_message(grpc_exec_ctx *exec_ctx,
algo_name, before_size, after_size, 100 * savings_ratio);
}
grpc_slice_buffer_swap(&calld->slices, &tmp);
- calld->send_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
+ send_flags |= GRPC_WRITE_INTERNAL_COMPRESS;
} else {
if (GRPC_TRACER_ON(grpc_compression_trace)) {
char *algo_name;
@@ -207,83 +205,118 @@ static void finish_send_message(grpc_exec_ctx *exec_ctx,
algo_name, calld->slices.length);
}
}
-
grpc_slice_buffer_destroy_internal(exec_ctx, &tmp);
-
+ // Swap out the original byte stream with our new one and send the
+ // batch down.
+ grpc_byte_stream_destroy(
+ exec_ctx, calld->send_message_batch->payload->send_message.send_message);
grpc_slice_buffer_stream_init(&calld->replacement_stream, &calld->slices,
- calld->send_flags);
- calld->send_op->payload->send_message.send_message =
+ send_flags);
+ calld->send_message_batch->payload->send_message.send_message =
&calld->replacement_stream.base;
- calld->post_send = calld->send_op->on_complete;
- calld->send_op->on_complete = &calld->send_done;
-
- grpc_call_next_op(exec_ctx, elem, calld->send_op);
+ calld->original_send_message_on_complete =
+ calld->send_message_batch->on_complete;
+ calld->send_message_batch->on_complete = &calld->send_message_on_complete;
+ grpc_call_next_op(exec_ctx, elem, calld->send_message_batch);
}
-static void got_slice(grpc_exec_ctx *exec_ctx, void *elemp, grpc_error *error) {
- grpc_call_element *elem = elemp;
- call_data *calld = elem->call_data;
- if (GRPC_ERROR_NONE !=
- grpc_byte_stream_pull(exec_ctx,
- calld->send_op->payload->send_message.send_message,
- &calld->incoming_slice)) {
- /* Should never reach here */
- abort();
- }
- grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
- if (calld->send_length == calld->slices.length) {
- finish_send_message(exec_ctx, elem);
- } else {
- continue_send_message(exec_ctx, elem);
+// Pulls a slice from the send_message byte stream and adds it to calld->slices.
+static grpc_error *pull_slice_from_send_message(grpc_exec_ctx *exec_ctx,
+ call_data *calld) {
+ grpc_slice incoming_slice;
+ grpc_error *error = grpc_byte_stream_pull(
+ exec_ctx, calld->send_message_batch->payload->send_message.send_message,
+ &incoming_slice);
+ if (error == GRPC_ERROR_NONE) {
+ grpc_slice_buffer_add(&calld->slices, incoming_slice);
}
+ return error;
}
-static void continue_send_message(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem) {
- call_data *calld = elem->call_data;
+// Reads as many slices as possible from the send_message byte stream.
+// If all data has been read, invokes finish_send_message(). Otherwise,
+// an async call to grpc_byte_stream_next() has been started, which will
+// eventually result in calling on_send_message_next_done().
+static grpc_error *continue_reading_send_message(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem) {
+ call_data *calld = (call_data *)elem->call_data;
while (grpc_byte_stream_next(
- exec_ctx, calld->send_op->payload->send_message.send_message, ~(size_t)0,
- &calld->got_slice)) {
- grpc_byte_stream_pull(exec_ctx,
- calld->send_op->payload->send_message.send_message,
- &calld->incoming_slice);
- grpc_slice_buffer_add(&calld->slices, calld->incoming_slice);
- if (calld->send_length == calld->slices.length) {
+ exec_ctx, calld->send_message_batch->payload->send_message.send_message,
+ ~(size_t)0, &calld->on_send_message_next_done)) {
+ grpc_error *error = pull_slice_from_send_message(exec_ctx, calld);
+ if (error != GRPC_ERROR_NONE) return error;
+ if (calld->slices.length ==
+ calld->send_message_batch->payload->send_message.send_message->length) {
finish_send_message(exec_ctx, elem);
break;
}
}
+ return GRPC_ERROR_NONE;
}
-static void handle_send_message_batch(grpc_exec_ctx *exec_ctx,
- grpc_call_element *elem,
- grpc_transport_stream_op_batch *op,
- bool has_compression_algorithm) {
- call_data *calld = elem->call_data;
- if (!skip_compression(elem, op->payload->send_message.send_message->flags,
+// Async callback for grpc_byte_stream_next().
+static void on_send_message_next_done(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ grpc_call_element *elem = (grpc_call_element *)arg;
+ call_data *calld = (call_data *)elem->call_data;
+ if (error != GRPC_ERROR_NONE) goto fail;
+ error = pull_slice_from_send_message(exec_ctx, calld);
+ if (error != GRPC_ERROR_NONE) goto fail;
+ if (calld->slices.length ==
+ calld->send_message_batch->payload->send_message.send_message->length) {
+ finish_send_message(exec_ctx, elem);
+ } else {
+ // This will either finish reading all of the data and invoke
+ // finish_send_message(), or else it will make an async call to
+ // grpc_byte_stream_next(), which will eventually result in calling
+ // this function again.
+ error = continue_reading_send_message(exec_ctx, elem);
+ if (error != GRPC_ERROR_NONE) goto fail;
+ }
+ return;
+fail:
+ grpc_transport_stream_op_batch_finish_with_failure(
+ exec_ctx, calld->send_message_batch, error);
+}
+
+static void start_send_message_batch(grpc_exec_ctx *exec_ctx,
+ grpc_call_element *elem,
+ grpc_transport_stream_op_batch *batch,
+ bool has_compression_algorithm) {
+ call_data *calld = (call_data *)elem->call_data;
+ if (!skip_compression(elem, batch->payload->send_message.send_message->flags,
has_compression_algorithm)) {
- calld->send_op = op;
- calld->send_length = op->payload->send_message.send_message->length;
- calld->send_flags = op->payload->send_message.send_message->flags;
- continue_send_message(exec_ctx, elem);
+ calld->send_message_batch = batch;
+ // This will either finish reading all of the data and invoke
+ // finish_send_message(), or else it will make an async call to
+ // grpc_byte_stream_next(), which will eventually result in calling
+ // on_send_message_next_done().
+ grpc_error *error = continue_reading_send_message(exec_ctx, elem);
+ if (error != GRPC_ERROR_NONE) {
+ grpc_transport_stream_op_batch_finish_with_failure(
+ exec_ctx, calld->send_message_batch, error);
+ }
} else {
/* pass control down the stack */
- grpc_call_next_op(exec_ctx, elem, op);
+ grpc_call_next_op(exec_ctx, elem, batch);
}
}
static void compress_start_transport_stream_op_batch(
grpc_exec_ctx *exec_ctx, grpc_call_element *elem,
- grpc_transport_stream_op_batch *op) {
+ grpc_transport_stream_op_batch *batch) {
call_data *calld = elem->call_data;
GPR_TIMER_BEGIN("compress_start_transport_stream_op_batch", 0);
- if (op->cancel_stream) {
- GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error);
+ if (batch->cancel_stream) {
+ // TODO(roth): As part of the upcoming call combiner work, change
+ // this to call grpc_byte_stream_shutdown() on the incoming byte
+ // stream, to cancel any in-flight calls to grpc_byte_stream_next().
+ GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error);
gpr_atm cur = gpr_atm_full_xchg(
&calld->send_initial_metadata_state,
- CANCELLED_BIT | (gpr_atm)op->payload->cancel_stream.cancel_error);
+ CANCELLED_BIT | (gpr_atm)batch->payload->cancel_stream.cancel_error);
switch (cur) {
case HAS_COMPRESSION_ALGORITHM:
case NO_COMPRESSION_ALGORITHM:
@@ -293,7 +326,7 @@ static void compress_start_transport_stream_op_batch(
if ((cur & CANCELLED_BIT) == 0) {
grpc_transport_stream_op_batch_finish_with_failure(
exec_ctx, (grpc_transport_stream_op_batch *)cur,
- GRPC_ERROR_REF(op->payload->cancel_stream.cancel_error));
+ GRPC_ERROR_REF(batch->payload->cancel_stream.cancel_error));
} else {
GRPC_ERROR_UNREF((grpc_error *)(cur & ~CANCELLED_BIT));
}
@@ -301,14 +334,15 @@ static void compress_start_transport_stream_op_batch(
}
}
- if (op->send_initial_metadata) {
+ if (batch->send_initial_metadata) {
bool has_compression_algorithm;
grpc_error *error = process_send_initial_metadata(
exec_ctx, elem,
- op->payload->send_initial_metadata.send_initial_metadata,
+ batch->payload->send_initial_metadata.send_initial_metadata,
&has_compression_algorithm);
if (error != GRPC_ERROR_NONE) {
- grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, op, error);
+ grpc_transport_stream_op_batch_finish_with_failure(exec_ctx, batch,
+ error);
return;
}
gpr_atm cur;
@@ -324,32 +358,32 @@ static void compress_start_transport_stream_op_batch(
goto retry_send_im;
}
if (cur != INITIAL_METADATA_UNSEEN) {
- handle_send_message_batch(exec_ctx, elem,
- (grpc_transport_stream_op_batch *)cur,
- has_compression_algorithm);
+ start_send_message_batch(exec_ctx, elem,
+ (grpc_transport_stream_op_batch *)cur,
+ has_compression_algorithm);
}
}
}
- if (op->send_message) {
+ if (batch->send_message) {
gpr_atm cur;
retry_send:
cur = gpr_atm_acq_load(&calld->send_initial_metadata_state);
switch (cur) {
case INITIAL_METADATA_UNSEEN:
if (!gpr_atm_rel_cas(&calld->send_initial_metadata_state, cur,
- (gpr_atm)op)) {
+ (gpr_atm)batch)) {
goto retry_send;
}
break;
case HAS_COMPRESSION_ALGORITHM:
case NO_COMPRESSION_ALGORITHM:
- handle_send_message_batch(exec_ctx, elem, op,
- cur == HAS_COMPRESSION_ALGORITHM);
+ start_send_message_batch(exec_ctx, elem, batch,
+ cur == HAS_COMPRESSION_ALGORITHM);
break;
default:
if (cur & CANCELLED_BIT) {
grpc_transport_stream_op_batch_finish_with_failure(
- exec_ctx, op,
+ exec_ctx, batch,
GRPC_ERROR_REF((grpc_error *)(cur & ~CANCELLED_BIT)));
} else {
/* >1 send_message concurrently */
@@ -358,7 +392,7 @@ static void compress_start_transport_stream_op_batch(
}
} else {
/* pass control down the stack */
- grpc_call_next_op(exec_ctx, elem, op);
+ grpc_call_next_op(exec_ctx, elem, batch);
}
GPR_TIMER_END("compress_start_transport_stream_op_batch", 0);
@@ -373,10 +407,10 @@ static grpc_error *init_call_elem(grpc_exec_ctx *exec_ctx,
/* initialize members */
grpc_slice_buffer_init(&calld->slices);
- GRPC_CLOSURE_INIT(&calld->got_slice, got_slice, elem,
- grpc_schedule_on_exec_ctx);
- GRPC_CLOSURE_INIT(&calld->send_done, send_done, elem,
- grpc_schedule_on_exec_ctx);
+ GRPC_CLOSURE_INIT(&calld->on_send_message_next_done,
+ on_send_message_next_done, elem, grpc_schedule_on_exec_ctx);
+ GRPC_CLOSURE_INIT(&calld->send_message_on_complete, send_message_on_complete,
+ elem, grpc_schedule_on_exec_ctx);
return GRPC_ERROR_NONE;
}
diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.c b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
index 731ebf400f..dc35f4855c 100644
--- a/src/core/ext/transport/chttp2/transport/chttp2_transport.c
+++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.c
@@ -730,6 +730,14 @@ static void destroy_stream_locked(grpc_exec_ctx *exec_ctx, void *sp,
grpc_slice_buffer_destroy_internal(exec_ctx,
&s->unprocessed_incoming_frames_buffer);
grpc_slice_buffer_destroy_internal(exec_ctx, &s->frame_storage);
+ if (s->compressed_data_buffer) {
+ grpc_slice_buffer_destroy_internal(exec_ctx, s->compressed_data_buffer);
+ gpr_free(s->compressed_data_buffer);
+ }
+ if (s->decompressed_data_buffer) {
+ grpc_slice_buffer_destroy_internal(exec_ctx, s->decompressed_data_buffer);
+ gpr_free(s->decompressed_data_buffer);
+ }
grpc_chttp2_list_remove_stalled_by_transport(t, s);
grpc_chttp2_list_remove_stalled_by_stream(t, s);
@@ -780,6 +788,15 @@ static void destroy_stream(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
grpc_chttp2_transport *t = (grpc_chttp2_transport *)gt;
grpc_chttp2_stream *s = (grpc_chttp2_stream *)gs;
+ if (s->stream_compression_ctx != NULL) {
+ grpc_stream_compression_context_destroy(s->stream_compression_ctx);
+ s->stream_compression_ctx = NULL;
+ }
+ if (s->stream_decompression_ctx != NULL) {
+ grpc_stream_compression_context_destroy(s->stream_decompression_ctx);
+ s->stream_decompression_ctx = NULL;
+ }
+
s->destroy_stream_arg = then_schedule_closure;
GRPC_CLOSURE_SCHED(
exec_ctx, GRPC_CLOSURE_INIT(&s->destroy_stream, destroy_stream_locked, s,
@@ -1173,6 +1190,7 @@ static void continue_fetching_send_locked(grpc_exec_ctx *exec_ctx,
return; /* early out */
}
if (s->fetched_send_message_length == s->fetching_send_message->length) {
+ grpc_byte_stream_destroy(exec_ctx, s->fetching_send_message);
int64_t notify_offset = s->next_message_end_offset;
if (notify_offset <= s->flow_controlled_bytes_written) {
grpc_chttp2_complete_closure_step(
@@ -1195,9 +1213,14 @@ static void continue_fetching_send_locked(grpc_exec_ctx *exec_ctx,
return; /* early out */
} else if (grpc_byte_stream_next(exec_ctx, s->fetching_send_message,
UINT32_MAX, &s->complete_fetch_locked)) {
- grpc_byte_stream_pull(exec_ctx, s->fetching_send_message,
- &s->fetching_slice);
- add_fetched_slice_locked(exec_ctx, t, s);
+ grpc_error *error = grpc_byte_stream_pull(
+ exec_ctx, s->fetching_send_message, &s->fetching_slice);
+ if (error != GRPC_ERROR_NONE) {
+ grpc_byte_stream_destroy(exec_ctx, s->fetching_send_message);
+ grpc_chttp2_cancel_stream(exec_ctx, t, s, error);
+ } else {
+ add_fetched_slice_locked(exec_ctx, t, s);
+ }
}
}
}
@@ -1214,10 +1237,9 @@ static void complete_fetch_locked(grpc_exec_ctx *exec_ctx, void *gs,
continue_fetching_send_locked(exec_ctx, t, s);
}
}
-
if (error != GRPC_ERROR_NONE) {
- /* TODO(ctiller): what to do here */
- abort();
+ grpc_byte_stream_destroy(exec_ctx, s->fetching_send_message);
+ grpc_chttp2_cancel_stream(exec_ctx, t, s, error);
}
}
@@ -1362,8 +1384,8 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
"fetching_send_message_finished");
} else {
GPR_ASSERT(s->fetching_send_message == NULL);
- uint8_t *frame_hdr =
- grpc_slice_buffer_tiny_add(&s->flow_controlled_buffer, 5);
+ uint8_t *frame_hdr = grpc_slice_buffer_tiny_add(
+ &s->flow_controlled_buffer, GRPC_HEADER_SIZE_IN_BYTES);
uint32_t flags = op_payload->send_message.send_message->flags;
frame_hdr[0] = (flags & GRPC_WRITE_INTERNAL_COMPRESS) != 0;
size_t len = op_payload->send_message.send_message->length;
@@ -1454,14 +1476,9 @@ static void perform_stream_op_locked(grpc_exec_ctx *exec_ctx, void *stream_op,
s->recv_message_ready = op_payload->recv_message.recv_message_ready;
s->recv_message = op_payload->recv_message.recv_message;
if (s->id != 0) {
- if (s->pending_byte_stream) {
- already_received = s->frame_storage.length;
- } else {
- already_received = s->frame_storage.length +
- s->unprocessed_incoming_frames_buffer.length;
- }
- incoming_byte_stream_update_flow_control(exec_ctx, t, s, 5,
- already_received);
+ already_received = s->frame_storage.length;
+ incoming_byte_stream_update_flow_control(
+ exec_ctx, t, s, GRPC_HEADER_SIZE_IN_BYTES, already_received);
}
grpc_chttp2_maybe_complete_recv_message(exec_ctx, t, s);
}
@@ -1698,10 +1715,43 @@ void grpc_chttp2_maybe_complete_recv_message(grpc_exec_ctx *exec_ctx,
if (s->unprocessed_incoming_frames_buffer.length == 0) {
grpc_slice_buffer_swap(&s->unprocessed_incoming_frames_buffer,
&s->frame_storage);
+ s->unprocessed_incoming_frames_decompressed = false;
+ }
+ if (s->stream_compression_recv_enabled &&
+ !s->unprocessed_incoming_frames_decompressed) {
+ GPR_ASSERT(s->decompressed_data_buffer->length == 0);
+ bool end_of_context;
+ if (!s->stream_decompression_ctx) {
+ s->stream_decompression_ctx =
+ grpc_stream_compression_context_create(
+ GRPC_STREAM_COMPRESSION_DECOMPRESS);
+ }
+ if (!grpc_stream_decompress(s->stream_decompression_ctx,
+ &s->unprocessed_incoming_frames_buffer,
+ s->decompressed_data_buffer, NULL,
+ GRPC_HEADER_SIZE_IN_BYTES,
+ &end_of_context)) {
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
+ &s->frame_storage);
+ grpc_slice_buffer_reset_and_unref_internal(
+ exec_ctx, &s->unprocessed_incoming_frames_buffer);
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
+ "Stream decompression error.");
+ } else {
+ error = grpc_deframe_unprocessed_incoming_frames(
+ exec_ctx, &s->data_parser, s, s->decompressed_data_buffer, NULL,
+ s->recv_message);
+ if (end_of_context) {
+ grpc_stream_compression_context_destroy(
+ s->stream_decompression_ctx);
+ s->stream_decompression_ctx = NULL;
+ }
+ }
+ } else {
+ error = grpc_deframe_unprocessed_incoming_frames(
+ exec_ctx, &s->data_parser, s,
+ &s->unprocessed_incoming_frames_buffer, NULL, s->recv_message);
}
- error = grpc_deframe_unprocessed_incoming_frames(
- exec_ctx, &s->data_parser, s,
- &s->unprocessed_incoming_frames_buffer, NULL, s->recv_message);
if (error != GRPC_ERROR_NONE) {
s->seen_error = true;
grpc_slice_buffer_reset_and_unref_internal(exec_ctx,
@@ -1739,7 +1789,37 @@ void grpc_chttp2_maybe_complete_recv_trailing_metadata(grpc_exec_ctx *exec_ctx,
}
bool pending_data = s->pending_byte_stream ||
s->unprocessed_incoming_frames_buffer.length > 0;
+ if (s->stream_compression_recv_enabled && s->read_closed &&
+ s->frame_storage.length > 0 &&
+ s->unprocessed_incoming_frames_buffer.length == 0 && !pending_data &&
+ !s->seen_error && s->recv_trailing_metadata_finished != NULL) {
+ /* Maybe some SYNC_FLUSH data is left in frame_storage. Consume them and
+ * maybe decompress the next 5 bytes in the stream. */
+ bool end_of_context;
+ if (!s->stream_decompression_ctx) {
+ s->stream_decompression_ctx = grpc_stream_compression_context_create(
+ GRPC_STREAM_COMPRESSION_DECOMPRESS);
+ }
+ if (!grpc_stream_decompress(s->stream_decompression_ctx,
+ &s->frame_storage,
+ &s->unprocessed_incoming_frames_buffer, NULL,
+ GRPC_HEADER_SIZE_IN_BYTES, &end_of_context)) {
+ grpc_slice_buffer_reset_and_unref_internal(exec_ctx, &s->frame_storage);
+ grpc_slice_buffer_reset_and_unref_internal(
+ exec_ctx, &s->unprocessed_incoming_frames_buffer);
+ s->seen_error = true;
+ } else {
+ if (s->unprocessed_incoming_frames_buffer.length > 0) {
+ s->unprocessed_incoming_frames_decompressed = true;
+ }
+ if (end_of_context) {
+ grpc_stream_compression_context_destroy(s->stream_decompression_ctx);
+ s->stream_decompression_ctx = NULL;
+ }
+ }
+ }
if (s->read_closed && s->frame_storage.length == 0 &&
+ s->unprocessed_incoming_frames_buffer.length == 0 &&
(!pending_data || s->seen_error) &&
s->recv_trailing_metadata_finished != NULL) {
grpc_chttp2_incoming_metadata_buffer_publish(
@@ -2607,6 +2687,7 @@ static void incoming_byte_stream_next_locked(grpc_exec_ctx *exec_ctx,
if (s->frame_storage.length > 0) {
grpc_slice_buffer_swap(&s->frame_storage,
&s->unprocessed_incoming_frames_buffer);
+ s->unprocessed_incoming_frames_decompressed = false;
GRPC_CLOSURE_SCHED(exec_ctx, bs->next_action.on_complete, GRPC_ERROR_NONE);
} else if (s->byte_stream_error != GRPC_ERROR_NONE) {
GRPC_CLOSURE_SCHED(exec_ctx, bs->next_action.on_complete,
@@ -2668,17 +2749,41 @@ static grpc_error *incoming_byte_stream_pull(grpc_exec_ctx *exec_ctx,
grpc_chttp2_incoming_byte_stream *bs =
(grpc_chttp2_incoming_byte_stream *)byte_stream;
grpc_chttp2_stream *s = bs->stream;
+ grpc_error *error;
if (s->unprocessed_incoming_frames_buffer.length > 0) {
- grpc_error *error = grpc_deframe_unprocessed_incoming_frames(
+ if (s->stream_compression_recv_enabled &&
+ !s->unprocessed_incoming_frames_decompressed) {
+ bool end_of_context;
+ if (!s->stream_decompression_ctx) {
+ s->stream_decompression_ctx = grpc_stream_compression_context_create(
+ GRPC_STREAM_COMPRESSION_DECOMPRESS);
+ }
+ if (!grpc_stream_decompress(s->stream_decompression_ctx,
+ &s->unprocessed_incoming_frames_buffer,
+ s->decompressed_data_buffer, NULL, MAX_SIZE_T,
+ &end_of_context)) {
+ error =
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("Stream decompression error.");
+ return error;
+ }
+ GPR_ASSERT(s->unprocessed_incoming_frames_buffer.length == 0);
+ grpc_slice_buffer_swap(&s->unprocessed_incoming_frames_buffer,
+ s->decompressed_data_buffer);
+ s->unprocessed_incoming_frames_decompressed = true;
+ if (end_of_context) {
+ grpc_stream_compression_context_destroy(s->stream_decompression_ctx);
+ s->stream_decompression_ctx = NULL;
+ }
+ }
+ error = grpc_deframe_unprocessed_incoming_frames(
exec_ctx, &s->data_parser, s, &s->unprocessed_incoming_frames_buffer,
slice, NULL);
if (error != GRPC_ERROR_NONE) {
return error;
}
} else {
- grpc_error *error =
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message");
+ error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Truncated message");
GRPC_CLOSURE_SCHED(exec_ctx, &s->reset_byte_stream, GRPC_ERROR_REF(error));
return error;
}
@@ -2686,22 +2791,9 @@ static grpc_error *incoming_byte_stream_pull(grpc_exec_ctx *exec_ctx,
return GRPC_ERROR_NONE;
}
-static void incoming_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
- grpc_byte_stream *byte_stream);
-
static void incoming_byte_stream_destroy_locked(grpc_exec_ctx *exec_ctx,
void *byte_stream,
- grpc_error *error_ignored) {
- grpc_chttp2_incoming_byte_stream *bs = byte_stream;
- grpc_chttp2_stream *s = bs->stream;
- grpc_chttp2_transport *t = s->t;
-
- GPR_ASSERT(bs->base.destroy == incoming_byte_stream_destroy);
- incoming_byte_stream_unref(exec_ctx, bs);
- s->pending_byte_stream = false;
- grpc_chttp2_maybe_complete_recv_message(exec_ctx, t, s);
- grpc_chttp2_maybe_complete_recv_trailing_metadata(exec_ctx, t, s);
-}
+ grpc_error *error_ignored);
static void incoming_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream) {
@@ -2768,6 +2860,33 @@ grpc_error *grpc_chttp2_incoming_byte_stream_finished(
return error;
}
+static void incoming_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_error *error) {
+ grpc_chttp2_incoming_byte_stream *bs =
+ (grpc_chttp2_incoming_byte_stream *)byte_stream;
+ GRPC_ERROR_UNREF(grpc_chttp2_incoming_byte_stream_finished(
+ exec_ctx, bs, error, true /* reset_on_error */));
+}
+
+static const grpc_byte_stream_vtable grpc_chttp2_incoming_byte_stream_vtable = {
+ incoming_byte_stream_next, incoming_byte_stream_pull,
+ incoming_byte_stream_shutdown, incoming_byte_stream_destroy};
+
+static void incoming_byte_stream_destroy_locked(grpc_exec_ctx *exec_ctx,
+ void *byte_stream,
+ grpc_error *error_ignored) {
+ grpc_chttp2_incoming_byte_stream *bs = byte_stream;
+ grpc_chttp2_stream *s = bs->stream;
+ grpc_chttp2_transport *t = s->t;
+
+ GPR_ASSERT(bs->base.vtable == &grpc_chttp2_incoming_byte_stream_vtable);
+ incoming_byte_stream_unref(exec_ctx, bs);
+ s->pending_byte_stream = false;
+ grpc_chttp2_maybe_complete_recv_message(exec_ctx, t, s);
+ grpc_chttp2_maybe_complete_recv_trailing_metadata(exec_ctx, t, s);
+}
+
grpc_chttp2_incoming_byte_stream *grpc_chttp2_incoming_byte_stream_create(
grpc_exec_ctx *exec_ctx, grpc_chttp2_transport *t, grpc_chttp2_stream *s,
uint32_t frame_size, uint32_t flags) {
@@ -2776,9 +2895,7 @@ grpc_chttp2_incoming_byte_stream *grpc_chttp2_incoming_byte_stream_create(
incoming_byte_stream->base.length = frame_size;
incoming_byte_stream->remaining_bytes = frame_size;
incoming_byte_stream->base.flags = flags;
- incoming_byte_stream->base.next = incoming_byte_stream_next;
- incoming_byte_stream->base.pull = incoming_byte_stream_pull;
- incoming_byte_stream->base.destroy = incoming_byte_stream_destroy;
+ incoming_byte_stream->base.vtable = &grpc_chttp2_incoming_byte_stream_vtable;
gpr_ref_init(&incoming_byte_stream->refs, 2);
incoming_byte_stream->transport = t;
incoming_byte_stream->stream = s;
diff --git a/src/core/ext/transport/chttp2/transport/frame_data.c b/src/core/ext/transport/chttp2/transport/frame_data.c
index dead6be77f..222d2177b2 100644
--- a/src/core/ext/transport/chttp2/transport/frame_data.c
+++ b/src/core/ext/transport/chttp2/transport/frame_data.c
@@ -293,7 +293,6 @@ grpc_error *grpc_chttp2_data_parser_parse(grpc_exec_ctx *exec_ctx, void *parser,
grpc_chttp2_transport *t,
grpc_chttp2_stream *s,
grpc_slice slice, int is_last) {
- /* grpc_error *error = parse_inner_buffer(exec_ctx, p, t, s, slice); */
if (!s->pending_byte_stream) {
grpc_slice_ref_internal(slice);
grpc_slice_buffer_add(&s->frame_storage, slice);
@@ -304,6 +303,7 @@ grpc_error *grpc_chttp2_data_parser_parse(grpc_exec_ctx *exec_ctx, void *parser,
grpc_slice_buffer_add(&s->unprocessed_incoming_frames_buffer, slice);
GRPC_CLOSURE_SCHED(exec_ctx, s->on_next, GRPC_ERROR_NONE);
s->on_next = NULL;
+ s->unprocessed_incoming_frames_decompressed = false;
} else {
grpc_slice_ref_internal(slice);
grpc_slice_buffer_add(&s->frame_storage, slice);
diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h
index 4563b78e75..b538d1df17 100644
--- a/src/core/ext/transport/chttp2/transport/internal.h
+++ b/src/core/ext/transport/chttp2/transport/internal.h
@@ -526,6 +526,26 @@ struct grpc_chttp2_stream {
grpc_chttp2_write_cb *on_write_finished_cbs;
grpc_chttp2_write_cb *finish_after_write;
size_t sending_bytes;
+
+ /** Whether stream compression send is enabled */
+ bool stream_compression_recv_enabled;
+ /** Whether stream compression recv is enabled */
+ bool stream_compression_send_enabled;
+ /** Whether bytes stored in unprocessed_incoming_byte_stream is decompressed
+ */
+ bool unprocessed_incoming_frames_decompressed;
+ /** Stream compression decompress context */
+ grpc_stream_compression_context *stream_decompression_ctx;
+ /** Stream compression compress context */
+ grpc_stream_compression_context *stream_compression_ctx;
+
+ /** Buffer storing data that is compressed but not sent */
+ grpc_slice_buffer *compressed_data_buffer;
+ /** Amount of uncompressed bytes sent out when compressed_data_buffer is
+ * emptied */
+ size_t uncompressed_data_size;
+ /** Temporary buffer storing decompressed data */
+ grpc_slice_buffer *decompressed_data_buffer;
};
/** Transport writing call flow:
@@ -621,6 +641,9 @@ void grpc_chttp2_complete_closure_step(grpc_exec_ctx *exec_ctx,
grpc_closure **pclosure,
grpc_error *error, const char *desc);
+#define GRPC_HEADER_SIZE_IN_BYTES 5
+#define MAX_SIZE_T (~(size_t)0)
+
#define GRPC_CHTTP2_CLIENT_CONNECT_STRING "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"
#define GRPC_CHTTP2_CLIENT_CONNECT_STRLEN \
(sizeof(GRPC_CHTTP2_CLIENT_CONNECT_STRING) - 1)
diff --git a/src/core/ext/transport/chttp2/transport/writing.c b/src/core/ext/transport/chttp2/transport/writing.c
index 315f2a67a2..c3ede08343 100644
--- a/src/core/ext/transport/chttp2/transport/writing.c
+++ b/src/core/ext/transport/chttp2/transport/writing.c
@@ -303,7 +303,9 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
}
if (sent_initial_metadata) {
/* send any body bytes, if allowed by flow control */
- if (s->flow_controlled_buffer.length > 0) {
+ if (s->flow_controlled_buffer.length > 0 ||
+ (s->stream_compression_send_enabled &&
+ s->compressed_data_buffer->length > 0)) {
uint32_t stream_outgoing_window = (uint32_t)GPR_MAX(
0,
s->outgoing_window_delta +
@@ -314,21 +316,63 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
[GRPC_CHTTP2_SETTINGS_MAX_FRAME_SIZE],
GPR_MIN(stream_outgoing_window, t->outgoing_window));
if (max_outgoing > 0) {
- uint32_t send_bytes =
- (uint32_t)GPR_MIN(max_outgoing, s->flow_controlled_buffer.length);
- bool is_last_data_frame =
- s->fetching_send_message == NULL &&
- send_bytes == s->flow_controlled_buffer.length;
- bool is_last_frame =
- is_last_data_frame && s->send_trailing_metadata != NULL &&
- grpc_metadata_batch_is_empty(s->send_trailing_metadata);
- grpc_chttp2_encode_data(s->id, &s->flow_controlled_buffer, send_bytes,
- is_last_frame, &s->stats.outgoing,
- &t->outbuf);
- GRPC_CHTTP2_FLOW_DEBIT_STREAM("write", t, s, outgoing_window_delta,
- send_bytes);
- GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("write", t, outgoing_window,
- send_bytes);
+ bool is_last_data_frame = false;
+ bool is_last_frame = false;
+ if (s->stream_compression_send_enabled) {
+ while ((s->flow_controlled_buffer.length > 0 ||
+ s->compressed_data_buffer->length > 0) &&
+ max_outgoing > 0) {
+ if (s->compressed_data_buffer->length > 0) {
+ uint32_t send_bytes = (uint32_t)GPR_MIN(
+ max_outgoing, s->compressed_data_buffer->length);
+ is_last_data_frame =
+ (send_bytes == s->compressed_data_buffer->length &&
+ s->flow_controlled_buffer.length == 0 &&
+ s->fetching_send_message == NULL);
+ is_last_frame =
+ is_last_data_frame && s->send_trailing_metadata != NULL &&
+ grpc_metadata_batch_is_empty(s->send_trailing_metadata);
+ grpc_chttp2_encode_data(s->id, s->compressed_data_buffer,
+ send_bytes, is_last_frame,
+ &s->stats.outgoing, &t->outbuf);
+ GRPC_CHTTP2_FLOW_DEBIT_STREAM(
+ "write", t, s, outgoing_window_delta, send_bytes);
+ GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("write", t, outgoing_window,
+ send_bytes);
+ max_outgoing -= send_bytes;
+ if (s->compressed_data_buffer->length == 0) {
+ s->sending_bytes += s->uncompressed_data_size;
+ }
+ } else {
+ if (s->stream_compression_ctx == NULL) {
+ s->stream_compression_ctx =
+ grpc_stream_compression_context_create(
+ GRPC_STREAM_COMPRESSION_COMPRESS);
+ }
+ s->uncompressed_data_size = s->flow_controlled_buffer.length;
+ GPR_ASSERT(grpc_stream_compress(
+ s->stream_compression_ctx, &s->flow_controlled_buffer,
+ s->compressed_data_buffer, NULL, MAX_SIZE_T,
+ GRPC_STREAM_COMPRESSION_FLUSH_SYNC));
+ }
+ }
+ } else {
+ uint32_t send_bytes = (uint32_t)GPR_MIN(
+ max_outgoing, s->flow_controlled_buffer.length);
+ is_last_data_frame = s->fetching_send_message == NULL &&
+ send_bytes == s->flow_controlled_buffer.length;
+ is_last_frame =
+ is_last_data_frame && s->send_trailing_metadata != NULL &&
+ grpc_metadata_batch_is_empty(s->send_trailing_metadata);
+ grpc_chttp2_encode_data(s->id, &s->flow_controlled_buffer,
+ send_bytes, is_last_frame,
+ &s->stats.outgoing, &t->outbuf);
+ GRPC_CHTTP2_FLOW_DEBIT_STREAM("write", t, s, outgoing_window_delta,
+ send_bytes);
+ GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("write", t, outgoing_window,
+ send_bytes);
+ s->sending_bytes += send_bytes;
+ }
t->ping_state.pings_before_data_required =
t->ping_policy.max_pings_without_data;
if (!t->is_client) {
@@ -345,9 +389,10 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
&s->stats.outgoing));
}
}
- s->sending_bytes += send_bytes;
now_writing = true;
- if (s->flow_controlled_buffer.length > 0) {
+ if (s->flow_controlled_buffer.length > 0 ||
+ (s->stream_compression_send_enabled &&
+ s->compressed_data_buffer->length > 0)) {
GRPC_CHTTP2_STREAM_REF(s, "chttp2_writing:fork");
grpc_chttp2_list_add_writable_stream(t, s);
}
@@ -361,7 +406,9 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write(
}
if (s->send_trailing_metadata != NULL &&
s->fetching_send_message == NULL &&
- s->flow_controlled_buffer.length == 0) {
+ s->flow_controlled_buffer.length == 0 &&
+ (!s->stream_compression_send_enabled ||
+ s->compressed_data_buffer->length == 0)) {
GRPC_CHTTP2_IF_TRACING(gpr_log(GPR_INFO, "sending trailing_metadata"));
if (grpc_metadata_batch_is_empty(s->send_trailing_metadata)) {
grpc_chttp2_encode_data(s->id, &s->flow_controlled_buffer, 0, true,
diff --git a/src/core/ext/transport/inproc/inproc_transport.c b/src/core/ext/transport/inproc/inproc_transport.c
index 14498021eb..6f4b429ee2 100644
--- a/src/core/ext/transport/inproc/inproc_transport.c
+++ b/src/core/ext/transport/inproc/inproc_transport.c
@@ -72,6 +72,7 @@ typedef struct sb_list_entry {
typedef struct {
grpc_byte_stream base;
sb_list_entry *le;
+ grpc_error *shutdown_error;
} inproc_slice_byte_stream;
typedef struct {
@@ -201,24 +202,39 @@ static grpc_error *inproc_slice_byte_stream_pull(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *bs,
grpc_slice *slice) {
inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
+ if (stream->shutdown_error != GRPC_ERROR_NONE) {
+ return GRPC_ERROR_REF(stream->shutdown_error);
+ }
*slice = grpc_slice_buffer_take_first(&stream->le->sb);
return GRPC_ERROR_NONE;
}
+static void inproc_slice_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *bs,
+ grpc_error *error) {
+ inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
+ GRPC_ERROR_UNREF(stream->shutdown_error);
+ stream->shutdown_error = error;
+}
+
static void inproc_slice_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *bs) {
inproc_slice_byte_stream *stream = (inproc_slice_byte_stream *)bs;
sb_list_entry_destroy(exec_ctx, stream->le);
+ GRPC_ERROR_UNREF(stream->shutdown_error);
}
+static const grpc_byte_stream_vtable inproc_slice_byte_stream_vtable = {
+ inproc_slice_byte_stream_next, inproc_slice_byte_stream_pull,
+ inproc_slice_byte_stream_shutdown, inproc_slice_byte_stream_destroy};
+
void inproc_slice_byte_stream_init(inproc_slice_byte_stream *s,
sb_list_entry *le) {
s->base.length = (uint32_t)le->sb.length;
s->base.flags = 0;
- s->base.next = inproc_slice_byte_stream_next;
- s->base.pull = inproc_slice_byte_stream_pull;
- s->base.destroy = inproc_slice_byte_stream_destroy;
+ s->base.vtable = &inproc_slice_byte_stream_vtable;
s->le = le;
+ s->shutdown_error = GRPC_ERROR_NONE;
}
static void ref_transport(inproc_transport *t) {
@@ -956,11 +972,18 @@ static void perform_stream_op(grpc_exec_ctx *exec_ctx, grpc_transport *gt,
GPR_ASSERT(grpc_byte_stream_next(exec_ctx,
op->payload->send_message.send_message,
SIZE_MAX, &unused));
- grpc_byte_stream_pull(exec_ctx, op->payload->send_message.send_message,
- &message_slice);
+ error = grpc_byte_stream_pull(
+ exec_ctx, op->payload->send_message.send_message, &message_slice);
+ if (error != GRPC_ERROR_NONE) {
+ cancel_stream_locked(exec_ctx, s, GRPC_ERROR_REF(error));
+ break;
+ }
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
remaining -= GRPC_SLICE_LENGTH(message_slice);
grpc_slice_buffer_add(dest, message_slice);
} while (remaining != 0);
+ grpc_byte_stream_destroy(exec_ctx,
+ op->payload->send_message.send_message);
}
if (error == GRPC_ERROR_NONE && op->send_trailing_metadata) {
grpc_metadata_batch *dest = (other == NULL) ? &s->write_buffer_trailing_md
diff --git a/src/core/lib/iomgr/nameser.h b/src/core/lib/iomgr/nameser.h
new file mode 100644
index 0000000000..daed6de518
--- /dev/null
+++ b/src/core/lib/iomgr/nameser.h
@@ -0,0 +1,104 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#ifndef GRPC_CORE_LIB_IOMGR_NAMESER_H
+#define GRPC_CORE_LIB_IOMGR_NAMESER_H
+
+#include "src/core/lib/iomgr/port.h"
+
+#ifdef GRPC_HAVE_ARPA_NAMESER
+
+#include <arpa/nameser.h>
+
+#else /* GRPC_HAVE_ARPA_NAMESER */
+
+typedef enum __ns_class {
+ ns_c_invalid = 0, /* Cookie. */
+ ns_c_in = 1, /* Internet. */
+ ns_c_2 = 2, /* unallocated/unsupported. */
+ ns_c_chaos = 3, /* MIT Chaos-net. */
+ ns_c_hs = 4, /* MIT Hesiod. */
+ /* Query class values which do not appear in resource records */
+ ns_c_none = 254, /* for prereq. sections in update requests */
+ ns_c_any = 255, /* Wildcard match. */
+ ns_c_max = 65536
+} ns_class;
+
+typedef enum __ns_type {
+ ns_t_invalid = 0, /* Cookie. */
+ ns_t_a = 1, /* Host address. */
+ ns_t_ns = 2, /* Authoritative server. */
+ ns_t_md = 3, /* Mail destination. */
+ ns_t_mf = 4, /* Mail forwarder. */
+ ns_t_cname = 5, /* Canonical name. */
+ ns_t_soa = 6, /* Start of authority zone. */
+ ns_t_mb = 7, /* Mailbox domain name. */
+ ns_t_mg = 8, /* Mail group member. */
+ ns_t_mr = 9, /* Mail rename name. */
+ ns_t_null = 10, /* Null resource record. */
+ ns_t_wks = 11, /* Well known service. */
+ ns_t_ptr = 12, /* Domain name pointer. */
+ ns_t_hinfo = 13, /* Host information. */
+ ns_t_minfo = 14, /* Mailbox information. */
+ ns_t_mx = 15, /* Mail routing information. */
+ ns_t_txt = 16, /* Text strings. */
+ ns_t_rp = 17, /* Responsible person. */
+ ns_t_afsdb = 18, /* AFS cell database. */
+ ns_t_x25 = 19, /* X_25 calling address. */
+ ns_t_isdn = 20, /* ISDN calling address. */
+ ns_t_rt = 21, /* Router. */
+ ns_t_nsap = 22, /* NSAP address. */
+ ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
+ ns_t_sig = 24, /* Security signature. */
+ ns_t_key = 25, /* Security key. */
+ ns_t_px = 26, /* X.400 mail mapping. */
+ ns_t_gpos = 27, /* Geographical position (withdrawn). */
+ ns_t_aaaa = 28, /* Ip6 Address. */
+ ns_t_loc = 29, /* Location Information. */
+ ns_t_nxt = 30, /* Next domain (security). */
+ ns_t_eid = 31, /* Endpoint identifier. */
+ ns_t_nimloc = 32, /* Nimrod Locator. */
+ ns_t_srv = 33, /* Server Selection. */
+ ns_t_atma = 34, /* ATM Address */
+ ns_t_naptr = 35, /* Naming Authority PoinTeR */
+ ns_t_kx = 36, /* Key Exchange */
+ ns_t_cert = 37, /* Certification record */
+ ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */
+ ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
+ ns_t_sink = 40, /* Kitchen sink (experimentatl) */
+ ns_t_opt = 41, /* EDNS0 option (meta-RR) */
+ ns_t_apl = 42, /* Address prefix list (RFC3123) */
+ ns_t_ds = 43, /* Delegation Signer (RFC4034) */
+ ns_t_sshfp = 44, /* SSH Key Fingerprint (RFC4255) */
+ ns_t_rrsig = 46, /* Resource Record Signature (RFC4034) */
+ ns_t_nsec = 47, /* Next Secure (RFC4034) */
+ ns_t_dnskey = 48, /* DNS Public Key (RFC4034) */
+ ns_t_tkey = 249, /* Transaction key */
+ ns_t_tsig = 250, /* Transaction signature. */
+ ns_t_ixfr = 251, /* Incremental zone transfer. */
+ ns_t_axfr = 252, /* Transfer zone of authority. */
+ ns_t_mailb = 253, /* Transfer mailbox records. */
+ ns_t_maila = 254, /* Transfer mail agent records. */
+ ns_t_any = 255, /* Wildcard match. */
+ ns_t_zxfr = 256, /* BIND-specific, nonstandard. */
+ ns_t_max = 65536
+} ns_type;
+
+#endif /* GRPC_HAVE_ARPA_NAMESER */
+
+#endif /* GRPC_CORE_LIB_IOMGR_NAMESER_H */
diff --git a/src/core/lib/iomgr/port.h b/src/core/lib/iomgr/port.h
index f5d15b4850..c12058f890 100644
--- a/src/core/lib/iomgr/port.h
+++ b/src/core/lib/iomgr/port.h
@@ -24,6 +24,7 @@
#if defined(GRPC_UV)
// Do nothing
#elif defined(GPR_MANYLINUX1)
+#define GRPC_HAVE_ARPA_NAMESER 1
#define GRPC_HAVE_IFADDRS 1
#define GRPC_HAVE_IPV6_RECVPKTINFO 1
#define GRPC_HAVE_IP_PKTINFO 1
@@ -51,6 +52,7 @@
#define GRPC_POSIX_WAKEUP_FD 1
#define GRPC_TIMER_USE_GENERIC 1
#elif defined(GPR_LINUX)
+#define GRPC_HAVE_ARPA_NAMESER 1
#define GRPC_HAVE_IFADDRS 1
#define GRPC_HAVE_IPV6_RECVPKTINFO 1
#define GRPC_HAVE_IP_PKTINFO 1
@@ -82,6 +84,7 @@
#define GRPC_POSIX_SOCKETUTILS
#endif
#elif defined(GPR_APPLE)
+#define GRPC_HAVE_ARPA_NAMESER 1
#define GRPC_HAVE_IFADDRS 1
#define GRPC_HAVE_SO_NOSIGPIPE 1
#define GRPC_HAVE_UNIX_SOCKET 1
@@ -93,6 +96,7 @@
#define GRPC_POSIX_WAKEUP_FD 1
#define GRPC_TIMER_USE_GENERIC 1
#elif defined(GPR_FREEBSD)
+#define GRPC_HAVE_ARPA_NAMESER 1
#define GRPC_HAVE_IFADDRS 1
#define GRPC_HAVE_IPV6_RECVPKTINFO 1
#define GRPC_HAVE_SO_NOSIGPIPE 1
@@ -104,6 +108,7 @@
#define GRPC_POSIX_WAKEUP_FD 1
#define GRPC_TIMER_USE_GENERIC 1
#elif defined(GPR_NACL)
+#define GRPC_HAVE_ARPA_NAMESER 1
#define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1
#define GRPC_POSIX_SOCKET 1
#define GRPC_POSIX_SOCKETADDR 1
diff --git a/src/core/lib/support/avl.c b/src/core/lib/support/avl.c
index a6178fdbce..0e28b24c98 100644
--- a/src/core/lib/support/avl.c
+++ b/src/core/lib/support/avl.c
@@ -39,15 +39,16 @@ static gpr_avl_node *ref_node(gpr_avl_node *node) {
return node;
}
-static void unref_node(const gpr_avl_vtable *vtable, gpr_avl_node *node) {
+static void unref_node(const gpr_avl_vtable *vtable, gpr_avl_node *node,
+ void *user_data) {
if (node == NULL) {
return;
}
if (gpr_unref(&node->refs)) {
- vtable->destroy_key(node->key);
- vtable->destroy_value(node->value);
- unref_node(vtable, node->left);
- unref_node(vtable, node->right);
+ vtable->destroy_key(node->key, user_data);
+ vtable->destroy_value(node->value, user_data);
+ unref_node(vtable, node->left, user_data);
+ unref_node(vtable, node->right, user_data);
gpr_free(node);
}
}
@@ -87,30 +88,30 @@ gpr_avl_node *new_node(void *key, void *value, gpr_avl_node *left,
}
static gpr_avl_node *get(const gpr_avl_vtable *vtable, gpr_avl_node *node,
- void *key) {
+ void *key, void *user_data) {
long cmp;
if (node == NULL) {
return NULL;
}
- cmp = vtable->compare_keys(node->key, key);
+ cmp = vtable->compare_keys(node->key, key, user_data);
if (cmp == 0) {
return node;
} else if (cmp > 0) {
- return get(vtable, node->left, key);
+ return get(vtable, node->left, key, user_data);
} else {
- return get(vtable, node->right, key);
+ return get(vtable, node->right, key, user_data);
}
}
-void *gpr_avl_get(gpr_avl avl, void *key) {
- gpr_avl_node *node = get(avl.vtable, avl.root, key);
+void *gpr_avl_get(gpr_avl avl, void *key, void *user_data) {
+ gpr_avl_node *node = get(avl.vtable, avl.root, key, user_data);
return node ? node->value : NULL;
}
-int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value) {
- gpr_avl_node *node = get(avl.vtable, avl.root, key);
+int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value, void *user_data) {
+ gpr_avl_node *node = get(avl.vtable, avl.root, key, user_data);
if (node != NULL) {
*value = node->value;
return 1;
@@ -120,70 +121,75 @@ int gpr_avl_maybe_get(gpr_avl avl, void *key, void **value) {
static gpr_avl_node *rotate_left(const gpr_avl_vtable *vtable, void *key,
void *value, gpr_avl_node *left,
- gpr_avl_node *right) {
- gpr_avl_node *n =
- new_node(vtable->copy_key(right->key), vtable->copy_value(right->value),
- new_node(key, value, left, ref_node(right->left)),
- ref_node(right->right));
- unref_node(vtable, right);
+ gpr_avl_node *right, void *user_data) {
+ gpr_avl_node *n = new_node(vtable->copy_key(right->key, user_data),
+ vtable->copy_value(right->value, user_data),
+ new_node(key, value, left, ref_node(right->left)),
+ ref_node(right->right));
+ unref_node(vtable, right, user_data);
return n;
}
static gpr_avl_node *rotate_right(const gpr_avl_vtable *vtable, void *key,
void *value, gpr_avl_node *left,
- gpr_avl_node *right) {
- gpr_avl_node *n = new_node(
- vtable->copy_key(left->key), vtable->copy_value(left->value),
- ref_node(left->left), new_node(key, value, ref_node(left->right), right));
- unref_node(vtable, left);
+ gpr_avl_node *right, void *user_data) {
+ gpr_avl_node *n =
+ new_node(vtable->copy_key(left->key, user_data),
+ vtable->copy_value(left->value, user_data), ref_node(left->left),
+ new_node(key, value, ref_node(left->right), right));
+ unref_node(vtable, left, user_data);
return n;
}
static gpr_avl_node *rotate_left_right(const gpr_avl_vtable *vtable, void *key,
void *value, gpr_avl_node *left,
- gpr_avl_node *right) {
+ gpr_avl_node *right, void *user_data) {
/* rotate_right(..., rotate_left(left), right) */
- gpr_avl_node *n = new_node(
- vtable->copy_key(left->right->key),
- vtable->copy_value(left->right->value),
- new_node(vtable->copy_key(left->key), vtable->copy_value(left->value),
- ref_node(left->left), ref_node(left->right->left)),
- new_node(key, value, ref_node(left->right->right), right));
- unref_node(vtable, left);
+ gpr_avl_node *n =
+ new_node(vtable->copy_key(left->right->key, user_data),
+ vtable->copy_value(left->right->value, user_data),
+ new_node(vtable->copy_key(left->key, user_data),
+ vtable->copy_value(left->value, user_data),
+ ref_node(left->left), ref_node(left->right->left)),
+ new_node(key, value, ref_node(left->right->right), right));
+ unref_node(vtable, left, user_data);
return n;
}
static gpr_avl_node *rotate_right_left(const gpr_avl_vtable *vtable, void *key,
void *value, gpr_avl_node *left,
- gpr_avl_node *right) {
+ gpr_avl_node *right, void *user_data) {
/* rotate_left(..., left, rotate_right(right)) */
- gpr_avl_node *n = new_node(
- vtable->copy_key(right->left->key),
- vtable->copy_value(right->left->value),
- new_node(key, value, left, ref_node(right->left->left)),
- new_node(vtable->copy_key(right->key), vtable->copy_value(right->value),
- ref_node(right->left->right), ref_node(right->right)));
- unref_node(vtable, right);
+ gpr_avl_node *n =
+ new_node(vtable->copy_key(right->left->key, user_data),
+ vtable->copy_value(right->left->value, user_data),
+ new_node(key, value, left, ref_node(right->left->left)),
+ new_node(vtable->copy_key(right->key, user_data),
+ vtable->copy_value(right->value, user_data),
+ ref_node(right->left->right), ref_node(right->right)));
+ unref_node(vtable, right, user_data);
return n;
}
static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key,
void *value, gpr_avl_node *left,
- gpr_avl_node *right) {
+ gpr_avl_node *right, void *user_data) {
switch (node_height(left) - node_height(right)) {
case 2:
if (node_height(left->left) - node_height(left->right) == -1) {
return assert_invariants(
- rotate_left_right(vtable, key, value, left, right));
+ rotate_left_right(vtable, key, value, left, right, user_data));
} else {
- return assert_invariants(rotate_right(vtable, key, value, left, right));
+ return assert_invariants(
+ rotate_right(vtable, key, value, left, right, user_data));
}
case -2:
if (node_height(right->left) - node_height(right->right) == 1) {
return assert_invariants(
- rotate_right_left(vtable, key, value, left, right));
+ rotate_right_left(vtable, key, value, left, right, user_data));
} else {
- return assert_invariants(rotate_left(vtable, key, value, left, right));
+ return assert_invariants(
+ rotate_left(vtable, key, value, left, right, user_data));
}
default:
return assert_invariants(new_node(key, value, left, right));
@@ -191,30 +197,32 @@ static gpr_avl_node *rebalance(const gpr_avl_vtable *vtable, void *key,
}
static gpr_avl_node *add_key(const gpr_avl_vtable *vtable, gpr_avl_node *node,
- void *key, void *value) {
+ void *key, void *value, void *user_data) {
long cmp;
if (node == NULL) {
return new_node(key, value, NULL, NULL);
}
- cmp = vtable->compare_keys(node->key, key);
+ cmp = vtable->compare_keys(node->key, key, user_data);
if (cmp == 0) {
return new_node(key, value, ref_node(node->left), ref_node(node->right));
} else if (cmp > 0) {
- return rebalance(
- vtable, vtable->copy_key(node->key), vtable->copy_value(node->value),
- add_key(vtable, node->left, key, value), ref_node(node->right));
+ return rebalance(vtable, vtable->copy_key(node->key, user_data),
+ vtable->copy_value(node->value, user_data),
+ add_key(vtable, node->left, key, value, user_data),
+ ref_node(node->right), user_data);
} else {
- return rebalance(vtable, vtable->copy_key(node->key),
- vtable->copy_value(node->value), ref_node(node->left),
- add_key(vtable, node->right, key, value));
+ return rebalance(
+ vtable, vtable->copy_key(node->key, user_data),
+ vtable->copy_value(node->value, user_data), ref_node(node->left),
+ add_key(vtable, node->right, key, value, user_data), user_data);
}
}
-gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value) {
+gpr_avl gpr_avl_add(gpr_avl avl, void *key, void *value, void *user_data) {
gpr_avl_node *old_root = avl.root;
- avl.root = add_key(avl.vtable, avl.root, key, value);
+ avl.root = add_key(avl.vtable, avl.root, key, value, user_data);
assert_invariants(avl.root);
- unref_node(avl.vtable, old_root);
+ unref_node(avl.vtable, old_root, user_data);
return avl;
}
@@ -233,12 +241,13 @@ static gpr_avl_node *in_order_tail(gpr_avl_node *node) {
}
static gpr_avl_node *remove_key(const gpr_avl_vtable *vtable,
- gpr_avl_node *node, void *key) {
+ gpr_avl_node *node, void *key,
+ void *user_data) {
long cmp;
if (node == NULL) {
return NULL;
}
- cmp = vtable->compare_keys(node->key, key);
+ cmp = vtable->compare_keys(node->key, key, user_data);
if (cmp == 0) {
if (node->left == NULL) {
return ref_node(node->right);
@@ -246,39 +255,45 @@ static gpr_avl_node *remove_key(const gpr_avl_vtable *vtable,
return ref_node(node->left);
} else if (node->left->height < node->right->height) {
gpr_avl_node *h = in_order_head(node->right);
- return rebalance(vtable, vtable->copy_key(h->key),
- vtable->copy_value(h->value), ref_node(node->left),
- remove_key(vtable, node->right, h->key));
+ return rebalance(
+ vtable, vtable->copy_key(h->key, user_data),
+ vtable->copy_value(h->value, user_data), ref_node(node->left),
+ remove_key(vtable, node->right, h->key, user_data), user_data);
} else {
gpr_avl_node *h = in_order_tail(node->left);
- return rebalance(
- vtable, vtable->copy_key(h->key), vtable->copy_value(h->value),
- remove_key(vtable, node->left, h->key), ref_node(node->right));
+ return rebalance(vtable, vtable->copy_key(h->key, user_data),
+ vtable->copy_value(h->value, user_data),
+ remove_key(vtable, node->left, h->key, user_data),
+ ref_node(node->right), user_data);
}
} else if (cmp > 0) {
- return rebalance(
- vtable, vtable->copy_key(node->key), vtable->copy_value(node->value),
- remove_key(vtable, node->left, key), ref_node(node->right));
+ return rebalance(vtable, vtable->copy_key(node->key, user_data),
+ vtable->copy_value(node->value, user_data),
+ remove_key(vtable, node->left, key, user_data),
+ ref_node(node->right), user_data);
} else {
- return rebalance(vtable, vtable->copy_key(node->key),
- vtable->copy_value(node->value), ref_node(node->left),
- remove_key(vtable, node->right, key));
+ return rebalance(
+ vtable, vtable->copy_key(node->key, user_data),
+ vtable->copy_value(node->value, user_data), ref_node(node->left),
+ remove_key(vtable, node->right, key, user_data), user_data);
}
}
-gpr_avl gpr_avl_remove(gpr_avl avl, void *key) {
+gpr_avl gpr_avl_remove(gpr_avl avl, void *key, void *user_data) {
gpr_avl_node *old_root = avl.root;
- avl.root = remove_key(avl.vtable, avl.root, key);
+ avl.root = remove_key(avl.vtable, avl.root, key, user_data);
assert_invariants(avl.root);
- unref_node(avl.vtable, old_root);
+ unref_node(avl.vtable, old_root, user_data);
return avl;
}
-gpr_avl gpr_avl_ref(gpr_avl avl) {
+gpr_avl gpr_avl_ref(gpr_avl avl, void *user_data) {
ref_node(avl.root);
return avl;
}
-void gpr_avl_unref(gpr_avl avl) { unref_node(avl.vtable, avl.root); }
+void gpr_avl_unref(gpr_avl avl, void *user_data) {
+ unref_node(avl.vtable, avl.root, user_data);
+}
int gpr_avl_is_empty(gpr_avl avl) { return avl.root == NULL; }
diff --git a/src/core/lib/surface/alarm.c b/src/core/lib/surface/alarm.c
index ef8405cca8..55934964f3 100644
--- a/src/core/lib/surface/alarm.c
+++ b/src/core/lib/surface/alarm.c
@@ -18,6 +18,7 @@
#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/surface/completion_queue.h"
@@ -49,7 +50,7 @@ grpc_alarm *grpc_alarm_create(grpc_completion_queue *cq, gpr_timespec deadline,
alarm->cq = cq;
alarm->tag = tag;
- grpc_cq_begin_op(cq, tag);
+ GPR_ASSERT(grpc_cq_begin_op(cq, tag));
GRPC_CLOSURE_INIT(&alarm->on_alarm, alarm_cb, alarm,
grpc_schedule_on_exec_ctx);
grpc_timer_init(&exec_ctx, &alarm->alarm,
diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c
index 2365d27307..04613f17e3 100644
--- a/src/core/lib/surface/call.c
+++ b/src/core/lib/surface/call.c
@@ -1422,7 +1422,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx,
if (nops == 0) {
if (!is_notify_tag_closure) {
- grpc_cq_begin_op(call->cq, notify_tag);
+ GPR_ASSERT(grpc_cq_begin_op(call->cq, notify_tag));
grpc_cq_end_op(exec_ctx, call->cq, notify_tag, GRPC_ERROR_NONE,
free_no_op_completion, NULL,
gpr_malloc(sizeof(grpc_cq_completion)));
@@ -1723,7 +1723,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx,
GRPC_CALL_INTERNAL_REF(call, "completion");
if (!is_notify_tag_closure) {
- grpc_cq_begin_op(call->cq, notify_tag);
+ GPR_ASSERT(grpc_cq_begin_op(call->cq, notify_tag));
}
gpr_ref_init(&bctl->steps_to_complete, num_completion_callbacks_needed);
@@ -1844,6 +1844,8 @@ const char *grpc_call_error_to_string(grpc_call_error error) {
return "GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH";
case GRPC_CALL_ERROR_TOO_MANY_OPERATIONS:
return "GRPC_CALL_ERROR_TOO_MANY_OPERATIONS";
+ case GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN:
+ return "GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN";
case GRPC_CALL_OK:
return "GRPC_CALL_OK";
}
diff --git a/src/core/lib/surface/channel_ping.c b/src/core/lib/surface/channel_ping.c
index 80eb80af78..e85b308850 100644
--- a/src/core/lib/surface/channel_ping.c
+++ b/src/core/lib/surface/channel_ping.c
@@ -59,7 +59,7 @@ void grpc_channel_ping(grpc_channel *channel, grpc_completion_queue *cq,
GRPC_CLOSURE_INIT(&pr->closure, ping_done, pr, grpc_schedule_on_exec_ctx);
op->send_ping = &pr->closure;
op->bind_pollset = grpc_cq_pollset(cq);
- grpc_cq_begin_op(cq, tag);
+ GPR_ASSERT(grpc_cq_begin_op(cq, tag));
top_elem->filter->start_transport_op(&exec_ctx, top_elem, op);
grpc_exec_ctx_finish(&exec_ctx);
}
diff --git a/src/core/lib/surface/completion_queue.c b/src/core/lib/surface/completion_queue.c
index 978d7b4171..3d82a32e82 100644
--- a/src/core/lib/surface/completion_queue.c
+++ b/src/core/lib/surface/completion_queue.c
@@ -196,7 +196,7 @@ typedef struct cq_vtable {
void (*init)(void *data);
void (*shutdown)(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cq);
void (*destroy)(void *data);
- void (*begin_op)(grpc_completion_queue *cq, void *tag);
+ bool (*begin_op)(grpc_completion_queue *cq, void *tag);
void (*end_op)(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cq, void *tag,
grpc_error *error,
void (*done)(grpc_exec_ctx *exec_ctx, void *done_arg,
@@ -288,8 +288,8 @@ static void cq_shutdown_next(grpc_exec_ctx *exec_ctx,
static void cq_shutdown_pluck(grpc_exec_ctx *exec_ctx,
grpc_completion_queue *cq);
-static void cq_begin_op_for_next(grpc_completion_queue *cq, void *tag);
-static void cq_begin_op_for_pluck(grpc_completion_queue *cq, void *tag);
+static bool cq_begin_op_for_next(grpc_completion_queue *cq, void *tag);
+static bool cq_begin_op_for_pluck(grpc_completion_queue *cq, void *tag);
static void cq_end_op_for_next(grpc_exec_ctx *exec_ctx,
grpc_completion_queue *cq, void *tag,
@@ -522,33 +522,6 @@ void grpc_cq_internal_unref(grpc_exec_ctx *exec_ctx,
}
}
-static void cq_begin_op_for_next(grpc_completion_queue *cq, void *tag) {
- cq_next_data *cqd = DATA_FROM_CQ(cq);
- GPR_ASSERT(!cqd->shutdown_called);
- gpr_atm_no_barrier_fetch_add(&cqd->pending_events, 1);
-}
-
-static void cq_begin_op_for_pluck(grpc_completion_queue *cq, void *tag) {
- cq_pluck_data *cqd = DATA_FROM_CQ(cq);
- GPR_ASSERT(!cqd->shutdown_called);
- gpr_ref(&cqd->pending_events);
-}
-
-void grpc_cq_begin_op(grpc_completion_queue *cq, void *tag) {
-#ifndef NDEBUG
- gpr_mu_lock(cq->mu);
- if (cq->outstanding_tag_count == cq->outstanding_tag_capacity) {
- cq->outstanding_tag_capacity = GPR_MAX(4, 2 * cq->outstanding_tag_capacity);
- cq->outstanding_tags =
- gpr_realloc(cq->outstanding_tags, sizeof(*cq->outstanding_tags) *
- cq->outstanding_tag_capacity);
- }
- cq->outstanding_tags[cq->outstanding_tag_count++] = tag;
- gpr_mu_unlock(cq->mu);
-#endif
- cq->vtable->begin_op(cq, tag);
-}
-
#ifndef NDEBUG
static void cq_check_tag(grpc_completion_queue *cq, void *tag, bool lock_cq) {
int found = 0;
@@ -576,6 +549,41 @@ static void cq_check_tag(grpc_completion_queue *cq, void *tag, bool lock_cq) {
static void cq_check_tag(grpc_completion_queue *cq, void *tag, bool lock_cq) {}
#endif
+static bool cq_begin_op_for_next(grpc_completion_queue *cq, void *tag) {
+ cq_next_data *cqd = DATA_FROM_CQ(cq);
+ while (true) {
+ gpr_atm count = gpr_atm_no_barrier_load(&cqd->pending_events);
+ if (count == 0) {
+ return false;
+ } else if (gpr_atm_no_barrier_cas(&cqd->pending_events, count, count + 1)) {
+ break;
+ }
+ }
+ return true;
+}
+
+static bool cq_begin_op_for_pluck(grpc_completion_queue *cq, void *tag) {
+ cq_pluck_data *cqd = DATA_FROM_CQ(cq);
+ GPR_ASSERT(!cqd->shutdown_called);
+ gpr_ref(&cqd->pending_events);
+ return true;
+}
+
+bool grpc_cq_begin_op(grpc_completion_queue *cq, void *tag) {
+#ifndef NDEBUG
+ gpr_mu_lock(cq->mu);
+ if (cq->outstanding_tag_count == cq->outstanding_tag_capacity) {
+ cq->outstanding_tag_capacity = GPR_MAX(4, 2 * cq->outstanding_tag_capacity);
+ cq->outstanding_tags =
+ gpr_realloc(cq->outstanding_tags, sizeof(*cq->outstanding_tags) *
+ cq->outstanding_tag_capacity);
+ }
+ cq->outstanding_tags[cq->outstanding_tag_count++] = tag;
+ gpr_mu_unlock(cq->mu);
+#endif
+ return cq->vtable->begin_op(cq, tag);
+}
+
/* Queue a GRPC_OP_COMPLETED operation to a completion queue (with a
* completion
* type of GRPC_CQ_NEXT) */
@@ -855,8 +863,7 @@ static grpc_event cq_next(grpc_completion_queue *cq, gpr_timespec deadline,
inconsistent state. If it is the latter, we shold do a 0-timeout poll
so that the thread comes back quickly from poll to make a second
attempt at popping. Not doing this can potentially deadlock this
- thread
- forever (if the deadline is infinity) */
+ thread forever (if the deadline is infinity) */
if (cq_event_queue_num_items(&cqd->queue) > 0) {
iteration_deadline = gpr_time_0(GPR_CLOCK_MONOTONIC);
}
@@ -869,10 +876,8 @@ static grpc_event cq_next(grpc_completion_queue *cq, gpr_timespec deadline,
if (cq_event_queue_num_items(&cqd->queue) > 0) {
/* Go to the beginning of the loop. No point doing a poll because
(cq->shutdown == true) is only possible when there is no pending
- work
- (i.e cq->pending_events == 0) and any outstanding
- grpc_cq_completion
- events are already queued on this cq */
+ work (i.e cq->pending_events == 0) and any outstanding completion
+ events should have already been queued on this cq */
continue;
}
@@ -909,11 +914,6 @@ static grpc_event cq_next(grpc_completion_queue *cq, gpr_timespec deadline,
is_finished_arg.first_loop = false;
}
- GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, &ret);
- GRPC_CQ_INTERNAL_UNREF(&exec_ctx, cq, "next");
- grpc_exec_ctx_finish(&exec_ctx);
- GPR_ASSERT(is_finished_arg.stolen_completion == NULL);
-
if (cq_event_queue_num_items(&cqd->queue) > 0 &&
gpr_atm_no_barrier_load(&cqd->pending_events) > 0) {
gpr_mu_lock(cq->mu);
@@ -921,6 +921,11 @@ static grpc_event cq_next(grpc_completion_queue *cq, gpr_timespec deadline,
gpr_mu_unlock(cq->mu);
}
+ GRPC_SURFACE_TRACE_RETURNED_EVENT(cq, &ret);
+ GRPC_CQ_INTERNAL_UNREF(&exec_ctx, cq, "next");
+ grpc_exec_ctx_finish(&exec_ctx);
+ GPR_ASSERT(is_finished_arg.stolen_completion == NULL);
+
GPR_TIMER_END("grpc_completion_queue_next", 0);
return ret;
diff --git a/src/core/lib/surface/completion_queue.h b/src/core/lib/surface/completion_queue.h
index af44482513..69d144bd95 100644
--- a/src/core/lib/surface/completion_queue.h
+++ b/src/core/lib/surface/completion_queue.h
@@ -72,8 +72,9 @@ void grpc_cq_internal_unref(grpc_exec_ctx *exec_ctx, grpc_completion_queue *cc);
/* Flag that an operation is beginning: the completion channel will not finish
shutdown until a corrensponding grpc_cq_end_* call is made.
- \a tag is currently used only in debug builds. */
-void grpc_cq_begin_op(grpc_completion_queue *cc, void *tag);
+ \a tag is currently used only in debug builds. Return true on success, and
+ false if completion_queue has been shutdown. */
+bool grpc_cq_begin_op(grpc_completion_queue *cc, void *tag);
/* Queue a GRPC_OP_COMPLETED operation; tag must correspond to the tag passed to
grpc_cq_begin_op */
diff --git a/src/core/lib/surface/server.c b/src/core/lib/surface/server.c
index fce7f8dca1..66dcc299aa 100644
--- a/src/core/lib/surface/server.c
+++ b/src/core/lib/surface/server.c
@@ -1259,7 +1259,7 @@ void grpc_server_shutdown_and_notify(grpc_server *server,
}
/* stay locked, and gather up some stuff to do */
- grpc_cq_begin_op(cq, tag);
+ GPR_ASSERT(grpc_cq_begin_op(cq, tag));
if (server->shutdown_published) {
grpc_cq_end_op(&exec_ctx, cq, tag, GRPC_ERROR_NONE, done_published_shutdown,
NULL, gpr_malloc(sizeof(grpc_cq_completion)));
@@ -1446,7 +1446,11 @@ grpc_call_error grpc_server_request_call(
error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE;
goto done;
}
- grpc_cq_begin_op(cq_for_notification, tag);
+ if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
+ gpr_free(rc);
+ error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
+ goto done;
+ }
details->reserved = NULL;
rc->cq_idx = cq_idx;
rc->type = BATCH_CALL;
@@ -1496,7 +1500,11 @@ grpc_call_error grpc_server_request_registered_call(
error = GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH;
goto done;
}
- grpc_cq_begin_op(cq_for_notification, tag);
+ if (grpc_cq_begin_op(cq_for_notification, tag) == false) {
+ gpr_free(rc);
+ error = GRPC_CALL_ERROR_COMPLETION_QUEUE_SHUTDOWN;
+ goto done;
+ }
rc->cq_idx = cq_idx;
rc->type = REGISTERED_CALL;
rc->server = server;
diff --git a/src/core/lib/transport/byte_stream.c b/src/core/lib/transport/byte_stream.c
index 3355814017..fb03a10315 100644
--- a/src/core/lib/transport/byte_stream.c
+++ b/src/core/lib/transport/byte_stream.c
@@ -19,29 +19,37 @@
#include "src/core/lib/transport/byte_stream.h"
#include <stdlib.h>
+#include <string.h>
#include <grpc/support/log.h>
#include "src/core/lib/slice/slice_internal.h"
-int grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
- grpc_byte_stream *byte_stream, size_t max_size_hint,
- grpc_closure *on_complete) {
- return byte_stream->next(exec_ctx, byte_stream, max_size_hint, on_complete);
+bool grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream, size_t max_size_hint,
+ grpc_closure *on_complete) {
+ return byte_stream->vtable->next(exec_ctx, byte_stream, max_size_hint,
+ on_complete);
}
grpc_error *grpc_byte_stream_pull(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream,
grpc_slice *slice) {
- return byte_stream->pull(exec_ctx, byte_stream, slice);
+ return byte_stream->vtable->pull(exec_ctx, byte_stream, slice);
+}
+
+void grpc_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_error *error) {
+ byte_stream->vtable->shutdown(exec_ctx, byte_stream, error);
}
void grpc_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream) {
- byte_stream->destroy(exec_ctx, byte_stream);
+ byte_stream->vtable->destroy(exec_ctx, byte_stream);
}
-/* slice_buffer_stream */
+// grpc_slice_buffer_stream
static bool slice_buffer_stream_next(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream,
@@ -56,6 +64,9 @@ static grpc_error *slice_buffer_stream_pull(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream,
grpc_slice *slice) {
grpc_slice_buffer_stream *stream = (grpc_slice_buffer_stream *)byte_stream;
+ if (stream->shutdown_error != GRPC_ERROR_NONE) {
+ return GRPC_ERROR_REF(stream->shutdown_error);
+ }
GPR_ASSERT(stream->cursor < stream->backing_buffer->count);
*slice =
grpc_slice_ref_internal(stream->backing_buffer->slices[stream->cursor]);
@@ -63,8 +74,23 @@ static grpc_error *slice_buffer_stream_pull(grpc_exec_ctx *exec_ctx,
return GRPC_ERROR_NONE;
}
+static void slice_buffer_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_error *error) {
+ grpc_slice_buffer_stream *stream = (grpc_slice_buffer_stream *)byte_stream;
+ GRPC_ERROR_UNREF(stream->shutdown_error);
+ stream->shutdown_error = error;
+}
+
static void slice_buffer_stream_destroy(grpc_exec_ctx *exec_ctx,
- grpc_byte_stream *byte_stream) {}
+ grpc_byte_stream *byte_stream) {
+ grpc_slice_buffer_stream *stream = (grpc_slice_buffer_stream *)byte_stream;
+ GRPC_ERROR_UNREF(stream->shutdown_error);
+}
+
+static const grpc_byte_stream_vtable slice_buffer_stream_vtable = {
+ slice_buffer_stream_next, slice_buffer_stream_pull,
+ slice_buffer_stream_shutdown, slice_buffer_stream_destroy};
void grpc_slice_buffer_stream_init(grpc_slice_buffer_stream *stream,
grpc_slice_buffer *slice_buffer,
@@ -72,9 +98,89 @@ void grpc_slice_buffer_stream_init(grpc_slice_buffer_stream *stream,
GPR_ASSERT(slice_buffer->length <= UINT32_MAX);
stream->base.length = (uint32_t)slice_buffer->length;
stream->base.flags = flags;
- stream->base.next = slice_buffer_stream_next;
- stream->base.pull = slice_buffer_stream_pull;
- stream->base.destroy = slice_buffer_stream_destroy;
+ stream->base.vtable = &slice_buffer_stream_vtable;
stream->backing_buffer = slice_buffer;
stream->cursor = 0;
+ stream->shutdown_error = GRPC_ERROR_NONE;
+}
+
+// grpc_caching_byte_stream
+
+void grpc_byte_stream_cache_init(grpc_byte_stream_cache *cache,
+ grpc_byte_stream *underlying_stream) {
+ cache->underlying_stream = underlying_stream;
+ grpc_slice_buffer_init(&cache->cache_buffer);
+}
+
+void grpc_byte_stream_cache_destroy(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream_cache *cache) {
+ grpc_byte_stream_destroy(exec_ctx, cache->underlying_stream);
+ grpc_slice_buffer_destroy_internal(exec_ctx, &cache->cache_buffer);
+}
+
+static bool caching_byte_stream_next(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ size_t max_size_hint,
+ grpc_closure *on_complete) {
+ grpc_caching_byte_stream *stream = (grpc_caching_byte_stream *)byte_stream;
+ if (stream->shutdown_error != GRPC_ERROR_NONE) return true;
+ if (stream->cursor < stream->cache->cache_buffer.count) return true;
+ return grpc_byte_stream_next(exec_ctx, stream->cache->underlying_stream,
+ max_size_hint, on_complete);
+}
+
+static grpc_error *caching_byte_stream_pull(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_slice *slice) {
+ grpc_caching_byte_stream *stream = (grpc_caching_byte_stream *)byte_stream;
+ if (stream->shutdown_error != GRPC_ERROR_NONE) {
+ return GRPC_ERROR_REF(stream->shutdown_error);
+ }
+ if (stream->cursor < stream->cache->cache_buffer.count) {
+ *slice = grpc_slice_ref_internal(
+ stream->cache->cache_buffer.slices[stream->cursor]);
+ ++stream->cursor;
+ return GRPC_ERROR_NONE;
+ }
+ grpc_error *error =
+ grpc_byte_stream_pull(exec_ctx, stream->cache->underlying_stream, slice);
+ if (error == GRPC_ERROR_NONE) {
+ ++stream->cursor;
+ grpc_slice_buffer_add(&stream->cache->cache_buffer,
+ grpc_slice_ref_internal(*slice));
+ }
+ return error;
+}
+
+static void caching_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_error *error) {
+ grpc_caching_byte_stream *stream = (grpc_caching_byte_stream *)byte_stream;
+ GRPC_ERROR_UNREF(stream->shutdown_error);
+ stream->shutdown_error = GRPC_ERROR_REF(error);
+ grpc_byte_stream_shutdown(exec_ctx, stream->cache->underlying_stream, error);
+}
+
+static void caching_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream) {
+ grpc_caching_byte_stream *stream = (grpc_caching_byte_stream *)byte_stream;
+ GRPC_ERROR_UNREF(stream->shutdown_error);
+}
+
+static const grpc_byte_stream_vtable caching_byte_stream_vtable = {
+ caching_byte_stream_next, caching_byte_stream_pull,
+ caching_byte_stream_shutdown, caching_byte_stream_destroy};
+
+void grpc_caching_byte_stream_init(grpc_caching_byte_stream *stream,
+ grpc_byte_stream_cache *cache) {
+ memset(stream, 0, sizeof(*stream));
+ stream->base.length = cache->underlying_stream->length;
+ stream->base.flags = cache->underlying_stream->flags;
+ stream->base.vtable = &caching_byte_stream_vtable;
+ stream->cache = cache;
+ stream->shutdown_error = GRPC_ERROR_NONE;
+}
+
+void grpc_caching_byte_stream_reset(grpc_caching_byte_stream *stream) {
+ stream->cursor = 0;
}
diff --git a/src/core/lib/transport/byte_stream.h b/src/core/lib/transport/byte_stream.h
index f172296e4b..1e1e8310b8 100644
--- a/src/core/lib/transport/byte_stream.h
+++ b/src/core/lib/transport/byte_stream.h
@@ -28,52 +28,109 @@
/** Mask of all valid internal flags. */
#define GRPC_WRITE_INTERNAL_USED_MASK (GRPC_WRITE_INTERNAL_COMPRESS)
-struct grpc_byte_stream;
typedef struct grpc_byte_stream grpc_byte_stream;
-struct grpc_byte_stream {
- uint32_t length;
- uint32_t flags;
+typedef struct {
bool (*next)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream,
size_t max_size_hint, grpc_closure *on_complete);
grpc_error *(*pull)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream,
grpc_slice *slice);
+ void (*shutdown)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream,
+ grpc_error *error);
void (*destroy)(grpc_exec_ctx *exec_ctx, grpc_byte_stream *byte_stream);
+} grpc_byte_stream_vtable;
+
+struct grpc_byte_stream {
+ uint32_t length;
+ uint32_t flags;
+ const grpc_byte_stream_vtable *vtable;
};
-/* returns 1 if the bytes are available immediately (in which case
- * on_complete will not be called), 0 if the bytes will be available
- * asynchronously.
- *
- * max_size_hint can be set as a hint as to the maximum number
- * of bytes that would be acceptable to read.
- */
-int grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
- grpc_byte_stream *byte_stream, size_t max_size_hint,
- grpc_closure *on_complete);
+// Returns true if the bytes are available immediately (in which case
+// on_complete will not be called), false if the bytes will be available
+// asynchronously.
+//
+// max_size_hint can be set as a hint as to the maximum number
+// of bytes that would be acceptable to read.
+bool grpc_byte_stream_next(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream, size_t max_size_hint,
+ grpc_closure *on_complete);
-/* returns the next slice in the byte stream when it is ready (indicated by
- * either grpc_byte_stream_next returning 1 or on_complete passed to
- * grpc_byte_stream_next is called).
- *
- * once a slice is returned into *slice, it is owned by the caller.
- */
+// Returns the next slice in the byte stream when it is ready (indicated by
+// either grpc_byte_stream_next returning true or on_complete passed to
+// grpc_byte_stream_next is called).
+//
+// Once a slice is returned into *slice, it is owned by the caller.
grpc_error *grpc_byte_stream_pull(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream,
grpc_slice *slice);
+// Shuts down the byte stream.
+//
+// If there is a pending call to on_complete from grpc_byte_stream_next(),
+// it will be invoked with the error passed to grpc_byte_stream_shutdown().
+//
+// The next call to grpc_byte_stream_pull() (if any) will return the error
+// passed to grpc_byte_stream_shutdown().
+void grpc_byte_stream_shutdown(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream *byte_stream,
+ grpc_error *error);
+
void grpc_byte_stream_destroy(grpc_exec_ctx *exec_ctx,
grpc_byte_stream *byte_stream);
-/* grpc_byte_stream that wraps a slice buffer */
+// grpc_slice_buffer_stream
+//
+// A grpc_byte_stream that wraps a slice buffer.
+
typedef struct grpc_slice_buffer_stream {
grpc_byte_stream base;
grpc_slice_buffer *backing_buffer;
size_t cursor;
+ grpc_error *shutdown_error;
} grpc_slice_buffer_stream;
void grpc_slice_buffer_stream_init(grpc_slice_buffer_stream *stream,
grpc_slice_buffer *slice_buffer,
uint32_t flags);
+// grpc_caching_byte_stream
+//
+// A grpc_byte_stream that that wraps an underlying byte stream but caches
+// the resulting slices in a slice buffer. If an initial attempt fails
+// without fully draining the underlying stream, a new caching stream
+// can be created from the same underlying cache, in which case it will
+// return whatever is in the backing buffer before continuing to read the
+// underlying stream.
+//
+// NOTE: No synchronization is done, so it is not safe to have multiple
+// grpc_caching_byte_streams simultaneously drawing from the same underlying
+// grpc_byte_stream_cache at the same time.
+
+typedef struct {
+ grpc_byte_stream *underlying_stream;
+ grpc_slice_buffer cache_buffer;
+} grpc_byte_stream_cache;
+
+// Takes ownership of underlying_stream.
+void grpc_byte_stream_cache_init(grpc_byte_stream_cache *cache,
+ grpc_byte_stream *underlying_stream);
+
+// Must not be called while still in use by a grpc_caching_byte_stream.
+void grpc_byte_stream_cache_destroy(grpc_exec_ctx *exec_ctx,
+ grpc_byte_stream_cache *cache);
+
+typedef struct {
+ grpc_byte_stream base;
+ grpc_byte_stream_cache *cache;
+ size_t cursor;
+ grpc_error *shutdown_error;
+} grpc_caching_byte_stream;
+
+void grpc_caching_byte_stream_init(grpc_caching_byte_stream *stream,
+ grpc_byte_stream_cache *cache);
+
+// Resets the byte stream to the start of the underlying stream.
+void grpc_caching_byte_stream_reset(grpc_caching_byte_stream *stream);
+
#endif /* GRPC_CORE_LIB_TRANSPORT_BYTE_STREAM_H */
diff --git a/src/core/lib/transport/transport.c b/src/core/lib/transport/transport.c
index 7281602d66..6c61f4b8d9 100644
--- a/src/core/lib/transport/transport.c
+++ b/src/core/lib/transport/transport.c
@@ -207,27 +207,35 @@ grpc_endpoint *grpc_transport_get_endpoint(grpc_exec_ctx *exec_ctx,
return transport->vtable->get_endpoint(exec_ctx, transport);
}
+// This comment should be sung to the tune of
+// "Supercalifragilisticexpialidocious":
+//
// grpc_transport_stream_op_batch_finish_with_failure
// is a function that must always unref cancel_error
// though it lives in lib, it handles transport stream ops sure
// it's grpc_transport_stream_op_batch_finish_with_failure
void grpc_transport_stream_op_batch_finish_with_failure(
- grpc_exec_ctx *exec_ctx, grpc_transport_stream_op_batch *op,
+ grpc_exec_ctx *exec_ctx, grpc_transport_stream_op_batch *batch,
grpc_error *error) {
- if (op->recv_message) {
- GRPC_CLOSURE_SCHED(exec_ctx, op->payload->recv_message.recv_message_ready,
+ if (batch->send_message) {
+ grpc_byte_stream_destroy(exec_ctx,
+ batch->payload->send_message.send_message);
+ }
+ if (batch->recv_message) {
+ GRPC_CLOSURE_SCHED(exec_ctx,
+ batch->payload->recv_message.recv_message_ready,
GRPC_ERROR_REF(error));
}
- if (op->recv_initial_metadata) {
+ if (batch->recv_initial_metadata) {
GRPC_CLOSURE_SCHED(
exec_ctx,
- op->payload->recv_initial_metadata.recv_initial_metadata_ready,
+ batch->payload->recv_initial_metadata.recv_initial_metadata_ready,
GRPC_ERROR_REF(error));
}
- GRPC_CLOSURE_SCHED(exec_ctx, op->on_complete, error);
- if (op->cancel_stream) {
- GRPC_ERROR_UNREF(op->payload->cancel_stream.cancel_error);
+ GRPC_CLOSURE_SCHED(exec_ctx, batch->on_complete, error);
+ if (batch->cancel_stream) {
+ GRPC_ERROR_UNREF(batch->payload->cancel_stream.cancel_error);
}
}
diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h
index 84e53e683a..099138ea14 100644
--- a/src/core/lib/transport/transport.h
+++ b/src/core/lib/transport/transport.h
@@ -159,6 +159,11 @@ struct grpc_transport_stream_op_batch_payload {
} send_trailing_metadata;
struct {
+ // The transport (or a filter that decides to return a failure before
+ // the op gets down to the transport) is responsible for calling
+ // grpc_byte_stream_destroy() on this.
+ // The batch's on_complete will not be called until after the byte
+ // stream is destroyed.
grpc_byte_stream *send_message;
} send_message;
@@ -174,6 +179,10 @@ struct grpc_transport_stream_op_batch_payload {
} recv_initial_metadata;
struct {
+ // Will be set by the transport to point to the byte stream
+ // containing a received message.
+ // The caller is responsible for calling grpc_byte_stream_destroy()
+ // on this byte stream.
grpc_byte_stream **recv_message;
/** Should be enqueued when one message is ready to be processed. */
grpc_closure *recv_message_ready;
diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc
index 92bacbe061..2483300cb1 100644
--- a/src/cpp/server/server_cc.cc
+++ b/src/cpp/server/server_cc.cc
@@ -151,19 +151,25 @@ class Server::SyncRequest final : public CompletionQueueTag {
GPR_ASSERT(cq_ && !in_flight_);
in_flight_ = true;
if (tag_) {
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_server_request_registered_call(
- server, tag_, &call_, &deadline_, &request_metadata_,
- has_request_payload_ ? &request_payload_ : nullptr, cq_,
- notify_cq, this));
+ if (GRPC_CALL_OK !=
+ grpc_server_request_registered_call(
+ server, tag_, &call_, &deadline_, &request_metadata_,
+ has_request_payload_ ? &request_payload_ : nullptr, cq_,
+ notify_cq, this)) {
+ TeardownRequest();
+ return;
+ }
} else {
if (!call_details_) {
call_details_ = new grpc_call_details;
grpc_call_details_init(call_details_);
}
- GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
- server, &call_, call_details_,
- &request_metadata_, cq_, notify_cq, this));
+ if (grpc_server_request_call(server, &call_, call_details_,
+ &request_metadata_, cq_, notify_cq,
+ this) != GRPC_CALL_OK) {
+ TeardownRequest();
+ return;
+ }
}
}
@@ -286,12 +292,10 @@ class Server::SyncRequestThreadManager : public ThreadManager {
if (ok) {
// Calldata takes ownership of the completion queue inside sync_req
SyncRequest::CallData cd(server_, sync_req);
- {
- // Prepare for the next request
- if (!IsShutdown()) {
- sync_req->SetupRequest(); // Create new completion queue for sync_req
- sync_req->Request(server_->c_server(), server_cq_->cq());
- }
+ // Prepare for the next request
+ if (!IsShutdown()) {
+ sync_req->SetupRequest(); // Create new completion queue for sync_req
+ sync_req->Request(server_->c_server(), server_cq_->cq());
}
GPR_TIMER_SCOPE("cd.Run()", 0);
@@ -316,8 +320,8 @@ class Server::SyncRequestThreadManager : public ThreadManager {
}
void Shutdown() override {
- server_cq_->Shutdown();
ThreadManager::Shutdown();
+ server_cq_->Shutdown();
}
void Wait() override {
@@ -652,10 +656,11 @@ ServerInterface::RegisteredAsyncRequest::RegisteredAsyncRequest(
void ServerInterface::RegisteredAsyncRequest::IssueRequest(
void* registered_method, grpc_byte_buffer** payload,
ServerCompletionQueue* notification_cq) {
- grpc_server_request_registered_call(
- server_->server(), registered_method, &call_, &context_->deadline_,
- context_->client_metadata_.arr(), payload, call_cq_->cq(),
- notification_cq->cq(), this);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_registered_call(
+ server_->server(), registered_method, &call_,
+ &context_->deadline_,
+ context_->client_metadata_.arr(), payload,
+ call_cq_->cq(), notification_cq->cq(), this));
}
ServerInterface::GenericAsyncRequest::GenericAsyncRequest(
@@ -667,9 +672,10 @@ ServerInterface::GenericAsyncRequest::GenericAsyncRequest(
grpc_call_details_init(&call_details_);
GPR_ASSERT(notification_cq);
GPR_ASSERT(call_cq);
- grpc_server_request_call(server->server(), &call_, &call_details_,
- context->client_metadata_.arr(), call_cq->cq(),
- notification_cq->cq(), this);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
+ server->server(), &call_, &call_details_,
+ context->client_metadata_.arr(), call_cq->cq(),
+ notification_cq->cq(), this));
}
bool ServerInterface::GenericAsyncRequest::FinalizeResult(void** tag,
diff --git a/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs b/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs
new file mode 100644
index 0000000000..fb18198945
--- /dev/null
+++ b/src/csharp/Grpc.Core.Tests/ThreadingModelTest.cs
@@ -0,0 +1,98 @@
+#region Copyright notice and license
+
+// Copyright 2015 gRPC authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#endregion
+
+using System;
+using NUnit.Framework;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Grpc.Core.Tests
+{
+ public class ThreadingModelTest
+ {
+ const string Host = "127.0.0.1";
+
+ MockServiceHelper helper;
+ Server server;
+ Channel channel;
+
+ [SetUp]
+ public void Init()
+ {
+ helper = new MockServiceHelper(Host);
+ server = helper.GetServer();
+ server.Start();
+ channel = helper.GetChannel();
+ }
+
+ [TearDown]
+ public void Cleanup()
+ {
+ channel.ShutdownAsync().Wait();
+ server.ShutdownAsync().Wait();
+ }
+
+ [Test]
+ public void BlockingCallInServerHandlerDoesNotDeadlock()
+ {
+ helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+ {
+ int recursionDepth = int.Parse(request);
+ if (recursionDepth <= 0) {
+ return "SUCCESS";
+ }
+ return Calls.BlockingUnaryCall(helper.CreateUnaryCall(), (recursionDepth - 1).ToString());
+ });
+
+ int maxRecursionDepth = Environment.ProcessorCount * 2; // make sure we have more pending blocking calls than threads in GrpcThreadPool
+ Assert.AreEqual("SUCCESS", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), maxRecursionDepth.ToString()));
+ }
+
+ [Test]
+ public void HandlerDoesNotRunOnGrpcThread()
+ {
+ helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+ {
+ if (IsRunningOnGrpcThreadPool()) {
+ return "Server handler should not run on gRPC threadpool thread.";
+ }
+ return request;
+ });
+
+ Assert.AreEqual("ABC", Calls.BlockingUnaryCall(helper.CreateUnaryCall(), "ABC"));
+ }
+
+ [Test]
+ public async Task ContinuationDoesNotRunOnGrpcThread()
+ {
+ helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
+ {
+ return request;
+ });
+
+ await Calls.AsyncUnaryCall(helper.CreateUnaryCall(), "ABC");
+ Assert.IsFalse(IsRunningOnGrpcThreadPool());
+ }
+
+ private static bool IsRunningOnGrpcThreadPool()
+ {
+ var threadName = Thread.CurrentThread.Name ?? "";
+ return threadName.Contains("grpc");
+ }
+ }
+}
diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj
index 50358298f4..e32711c520 100755
--- a/src/csharp/Grpc.Core/Grpc.Core.csproj
+++ b/src/csharp/Grpc.Core/Grpc.Core.csproj
@@ -64,6 +64,7 @@
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard1.5' ">
<PackageReference Include="System.Runtime.Loader" Version="4.0.0" />
<PackageReference Include="System.Threading.Thread" Version="4.0.0" />
+ <PackageReference Include="System.Threading.ThreadPool" Version="4.0.0" />
</ItemGroup>
<Import Project="NativeDeps.csproj.include" />
diff --git a/src/csharp/Grpc.Core/GrpcEnvironment.cs b/src/csharp/Grpc.Core/GrpcEnvironment.cs
index 8d0c66aa5b..0663ee9215 100644
--- a/src/csharp/Grpc.Core/GrpcEnvironment.cs
+++ b/src/csharp/Grpc.Core/GrpcEnvironment.cs
@@ -39,6 +39,7 @@ namespace Grpc.Core
static int refCount;
static int? customThreadPoolSize;
static int? customCompletionQueueCount;
+ static bool inlineHandlers;
static readonly HashSet<Channel> registeredChannels = new HashSet<Channel>();
static readonly HashSet<Server> registeredServers = new HashSet<Server>();
@@ -218,12 +219,31 @@ namespace Grpc.Core
}
/// <summary>
+ /// By default, gRPC's internal event handlers get offloaded to .NET default thread pool thread (<c>inlineHandlers=false</c>).
+ /// Setting <c>inlineHandlers</c> to <c>true</c> will allow scheduling the event handlers directly to
+ /// <c>GrpcThreadPool</c> internal threads. That can lead to significant performance gains in some situations,
+ /// but requires user to never block in async code (incorrectly written code can easily lead to deadlocks).
+ /// Inlining handlers is an advanced setting and you should only use it if you know what you are doing.
+ /// Most users should rely on the default value provided by gRPC library.
+ /// Note: this method is part of an experimental API that can change or be removed without any prior notice.
+ /// Note: <c>inlineHandlers=true</c> was the default in gRPC C# v1.4.x and earlier.
+ /// </summary>
+ public static void SetHandlerInlining(bool inlineHandlers)
+ {
+ lock (staticLock)
+ {
+ GrpcPreconditions.CheckState(instance == null, "Can only be set before GrpcEnvironment is initialized");
+ GrpcEnvironment.inlineHandlers = inlineHandlers;
+ }
+ }
+
+ /// <summary>
/// Creates gRPC environment.
/// </summary>
private GrpcEnvironment()
{
GrpcNativeInit();
- threadPool = new GrpcThreadPool(this, GetThreadPoolSizeOrDefault(), GetCompletionQueueCountOrDefault());
+ threadPool = new GrpcThreadPool(this, GetThreadPoolSizeOrDefault(), GetCompletionQueueCountOrDefault(), inlineHandlers);
threadPool.Start();
}
diff --git a/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs b/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
index f9ae77c74e..19b44c2618 100644
--- a/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
+++ b/src/csharp/Grpc.Core/Internal/GrpcThreadPool.cs
@@ -33,12 +33,15 @@ namespace Grpc.Core.Internal
internal class GrpcThreadPool
{
static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<GrpcThreadPool>();
+ static readonly WaitCallback RunCompletionQueueEventCallbackSuccess = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, true));
+ static readonly WaitCallback RunCompletionQueueEventCallbackFailure = new WaitCallback((callback) => RunCompletionQueueEventCallback((OpCompletionDelegate) callback, false));
readonly GrpcEnvironment environment;
readonly object myLock = new object();
readonly List<Thread> threads = new List<Thread>();
readonly int poolSize;
readonly int completionQueueCount;
+ readonly bool inlineHandlers;
readonly List<BasicProfiler> threadProfilers = new List<BasicProfiler>(); // profilers assigned to threadpool threads
@@ -52,11 +55,13 @@ namespace Grpc.Core.Internal
/// <param name="environment">Environment.</param>
/// <param name="poolSize">Pool size.</param>
/// <param name="completionQueueCount">Completion queue count.</param>
- public GrpcThreadPool(GrpcEnvironment environment, int poolSize, int completionQueueCount)
+ /// <param name="inlineHandlers">Handler inlining.</param>
+ public GrpcThreadPool(GrpcEnvironment environment, int poolSize, int completionQueueCount, bool inlineHandlers)
{
this.environment = environment;
this.poolSize = poolSize;
this.completionQueueCount = completionQueueCount;
+ this.inlineHandlers = inlineHandlers;
GrpcPreconditions.CheckArgument(poolSize >= completionQueueCount,
"Thread pool size cannot be smaller than the number of completion queues used.");
}
@@ -165,11 +170,19 @@ namespace Grpc.Core.Internal
try
{
var callback = cq.CompletionRegistry.Extract(tag);
- callback(success);
+ // Use cached delegates to avoid unnecessary allocations
+ if (!inlineHandlers)
+ {
+ ThreadPool.QueueUserWorkItem(success ? RunCompletionQueueEventCallbackSuccess : RunCompletionQueueEventCallbackFailure, callback);
+ }
+ else
+ {
+ RunCompletionQueueEventCallback(callback, success);
+ }
}
catch (Exception e)
{
- Logger.Error(e, "Exception occured while invoking completion delegate");
+ Logger.Error(e, "Exception occured while extracting event from completion registry.");
}
}
}
@@ -186,5 +199,17 @@ namespace Grpc.Core.Internal
}
return list.AsReadOnly();
}
+
+ private static void RunCompletionQueueEventCallback(OpCompletionDelegate callback, bool success)
+ {
+ try
+ {
+ callback(success);
+ }
+ catch (Exception e)
+ {
+ Logger.Error(e, "Exception occured while invoking completion delegate");
+ }
+ }
}
}
diff --git a/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs b/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
index 7009a93b18..a579fb8040 100644
--- a/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
+++ b/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
@@ -63,11 +63,6 @@ namespace Grpc.IntegrationTesting
private async Task RunAsync()
{
- // (ThreadPoolSize == ProcessorCount) gives best throughput in benchmarks
- // and doesn't seem to harm performance even when server and client
- // are running on the same machine.
- GrpcEnvironment.SetThreadPoolSize(Environment.ProcessorCount);
-
string host = "0.0.0.0";
int port = options.DriverPort;
diff --git a/src/csharp/tests.json b/src/csharp/tests.json
index bc6adbbfe8..7841051052 100644
--- a/src/csharp/tests.json
+++ b/src/csharp/tests.json
@@ -31,6 +31,7 @@
"Grpc.Core.Tests.ShutdownHookPendingCallTest",
"Grpc.Core.Tests.ShutdownHookServerTest",
"Grpc.Core.Tests.ShutdownTest",
+ "Grpc.Core.Tests.ThreadingModelTest",
"Grpc.Core.Tests.TimeoutsTest",
"Grpc.Core.Tests.UserAgentStringTest"
],
diff --git a/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec b/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec
index 22527d1572..345eecc279 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.2.0'
+ s.dependency '!ProtoCompiler', '3.3.0'
# For the Protobuf dependency not to complain:
s.ios.deployment_target = '7.0'
s.osx.deployment_target = '10.9'
diff --git a/src/objective-c/!ProtoCompiler.podspec b/src/objective-c/!ProtoCompiler.podspec
index 2e9b944f33..c3f95f9f42 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.2.0'
+ v = '3.3.0'
s.version = v
s.summary = 'The Protobuf Compiler (protoc) generates Objective-C files from .proto files'
s.description = <<-DESC
diff --git a/src/objective-c/BoringSSL.podspec b/src/objective-c/BoringSSL.podspec
index 651bd4977d..37798ec3c6 100644
--- a/src/objective-c/BoringSSL.podspec
+++ b/src/objective-c/BoringSSL.podspec
@@ -31,7 +31,7 @@
Pod::Spec.new do |s|
s.name = 'BoringSSL'
- version = '8.2'
+ version = '9.0'
s.version = version
s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google’s needs.'
# Adapted from the homepage:
@@ -69,9 +69,7 @@ Pod::Spec.new do |s|
s.source = {
:git => 'https://boringssl.googlesource.com/boringssl',
- # Restore this version name hack in the next version!!
- # :tag => "version_for_cocoapods_#{version}",
- :tag => "version_for_cocoapods_8.0",
+ :tag => "version_for_cocoapods_#{version}",
}
name = 'openssl'
@@ -169,7 +167,6 @@ Pod::Spec.new do |s|
#include "hkdf.h"
#include "md4.h"
#include "md5.h"
- #include "newhope.h"
#include "obj_mac.h"
#include "objects.h"
#include "opensslv.h"
@@ -183,7 +180,6 @@ Pod::Spec.new do |s|
#include "ripemd.h"
#include "safestack.h"
#include "srtp.h"
- #include "time_support.h"
#include "x509.h"
#include "x509v3.h"
EOF
@@ -389,42 +385,42 @@ Pod::Spec.new do |s|
0x28340c19,
0x283480ac,
0x283500ea,
- 0x2c3228ca,
- 0x2c32a8d8,
- 0x2c3328ea,
- 0x2c33a8fc,
- 0x2c342910,
- 0x2c34a922,
- 0x2c35293d,
- 0x2c35a94f,
- 0x2c362962,
+ 0x2c3229b1,
+ 0x2c32a9bf,
+ 0x2c3329d1,
+ 0x2c33a9e3,
+ 0x2c3429f7,
+ 0x2c34aa09,
+ 0x2c352a24,
+ 0x2c35aa36,
+ 0x2c362a49,
0x2c36832d,
- 0x2c37296f,
- 0x2c37a981,
- 0x2c382994,
- 0x2c38a9ab,
- 0x2c3929b9,
- 0x2c39a9c9,
- 0x2c3a29db,
- 0x2c3aa9ef,
- 0x2c3b2a00,
- 0x2c3baa1f,
- 0x2c3c2a33,
- 0x2c3caa49,
- 0x2c3d2a62,
- 0x2c3daa7f,
- 0x2c3e2a90,
- 0x2c3eaa9e,
- 0x2c3f2ab6,
- 0x2c3faace,
- 0x2c402adb,
+ 0x2c372a56,
+ 0x2c37aa68,
+ 0x2c382a7b,
+ 0x2c38aa92,
+ 0x2c392aa0,
+ 0x2c39aab0,
+ 0x2c3a2ac2,
+ 0x2c3aaad6,
+ 0x2c3b2ae7,
+ 0x2c3bab06,
+ 0x2c3c2b1a,
+ 0x2c3cab30,
+ 0x2c3d2b49,
+ 0x2c3dab66,
+ 0x2c3e2b77,
+ 0x2c3eab85,
+ 0x2c3f2b9d,
+ 0x2c3fabb5,
+ 0x2c402bc2,
0x2c4090e7,
- 0x2c412aec,
- 0x2c41aaff,
+ 0x2c412bd3,
+ 0x2c41abe6,
0x2c4210c0,
- 0x2c42ab10,
+ 0x2c42abf7,
0x2c430720,
- 0x2c43aa11,
+ 0x2c43aaf8,
0x30320000,
0x30328015,
0x3033001f,
@@ -577,180 +573,189 @@ Pod::Spec.new do |s|
0x403b9861,
0x403c0064,
0x403c8083,
- 0x403d18aa,
- 0x403d98c0,
- 0x403e18cf,
- 0x403e98e2,
- 0x403f18fc,
- 0x403f990a,
- 0x4040191f,
- 0x40409933,
- 0x40411950,
- 0x4041996b,
- 0x40421984,
- 0x40429997,
- 0x404319ab,
- 0x404399c3,
- 0x404419da,
+ 0x403d18c1,
+ 0x403d98d7,
+ 0x403e18e6,
+ 0x403e98f9,
+ 0x403f1913,
+ 0x403f9921,
+ 0x40401936,
+ 0x4040994a,
+ 0x40411967,
+ 0x40419982,
+ 0x4042199b,
+ 0x404299ae,
+ 0x404319c2,
+ 0x404399da,
+ 0x404419f1,
0x404480ac,
- 0x404519ef,
- 0x40459a01,
- 0x40461a25,
- 0x40469a45,
- 0x40471a53,
- 0x40479a7a,
- 0x40481ab7,
- 0x40489ad0,
- 0x40491ae7,
- 0x40499b01,
- 0x404a1b18,
- 0x404a9b36,
- 0x404b1b4e,
- 0x404b9b65,
- 0x404c1b7b,
- 0x404c9b8d,
- 0x404d1bae,
- 0x404d9bd0,
- 0x404e1be4,
- 0x404e9bf1,
- 0x404f1c1e,
- 0x404f9c47,
- 0x40501c71,
- 0x40509c85,
- 0x40511ca0,
- 0x40519cb0,
- 0x40521cc7,
- 0x40529ceb,
- 0x40531d03,
- 0x40539d16,
- 0x40541d2b,
- 0x40549d4e,
- 0x40551d5c,
- 0x40559d79,
- 0x40561d86,
- 0x40569d9f,
- 0x40571db7,
- 0x40579dca,
- 0x40581ddf,
- 0x40589e06,
- 0x40591e35,
- 0x40599e62,
- 0x405a1e76,
- 0x405a9e86,
- 0x405b1e9e,
- 0x405b9eaf,
- 0x405c1ec2,
- 0x405c9ed3,
- 0x405d1ee0,
- 0x405d9ef7,
- 0x405e1f17,
+ 0x40451a06,
+ 0x40459a18,
+ 0x40461a3c,
+ 0x40469a5c,
+ 0x40471a6a,
+ 0x40479a91,
+ 0x40481ace,
+ 0x40489ae7,
+ 0x40491afe,
+ 0x40499b18,
+ 0x404a1b2f,
+ 0x404a9b4d,
+ 0x404b1b65,
+ 0x404b9b7c,
+ 0x404c1b92,
+ 0x404c9ba4,
+ 0x404d1bc5,
+ 0x404d9be7,
+ 0x404e1bfb,
+ 0x404e9c08,
+ 0x404f1c35,
+ 0x404f9c5e,
+ 0x40501c99,
+ 0x40509cad,
+ 0x40511cc8,
+ 0x40519cd8,
+ 0x40521cef,
+ 0x40529d13,
+ 0x40531d2b,
+ 0x40539d3e,
+ 0x40541d53,
+ 0x40549d76,
+ 0x40551d84,
+ 0x40559da1,
+ 0x40561dae,
+ 0x40569dc7,
+ 0x40571ddf,
+ 0x40579df2,
+ 0x40581e07,
+ 0x40589e2e,
+ 0x40591e5d,
+ 0x40599e8a,
+ 0x405a1e9e,
+ 0x405a9eae,
+ 0x405b1ec6,
+ 0x405b9ed7,
+ 0x405c1eea,
+ 0x405c9f0b,
+ 0x405d1f18,
+ 0x405d9f2f,
+ 0x405e1f6d,
0x405e8a95,
- 0x405f1f38,
- 0x405f9f45,
- 0x40601f53,
- 0x40609f75,
- 0x40611f9d,
- 0x40619fb2,
- 0x40621fc9,
- 0x40629fda,
- 0x40631feb,
- 0x4063a000,
- 0x40642017,
- 0x4064a043,
- 0x4065205e,
- 0x4065a075,
- 0x4066208d,
- 0x4066a0b7,
- 0x406720e2,
- 0x4067a103,
- 0x40682116,
- 0x4068a137,
- 0x40692169,
- 0x4069a197,
- 0x406a21b8,
- 0x406aa1d8,
- 0x406b2360,
- 0x406ba383,
- 0x406c2399,
- 0x406ca5c5,
- 0x406d25f4,
- 0x406da61c,
- 0x406e264a,
- 0x406ea662,
- 0x406f2681,
- 0x406fa696,
- 0x407026a9,
- 0x4070a6c6,
+ 0x405f1f8e,
+ 0x405f9f9b,
+ 0x40601fa9,
+ 0x40609fcb,
+ 0x4061200f,
+ 0x4061a047,
+ 0x4062205e,
+ 0x4062a06f,
+ 0x40632080,
+ 0x4063a095,
+ 0x406420ac,
+ 0x4064a0d8,
+ 0x406520f3,
+ 0x4065a10a,
+ 0x40662122,
+ 0x4066a14c,
+ 0x40672177,
+ 0x4067a198,
+ 0x406821ab,
+ 0x4068a1cc,
+ 0x406921fe,
+ 0x4069a22c,
+ 0x406a224d,
+ 0x406aa26d,
+ 0x406b23f5,
+ 0x406ba418,
+ 0x406c242e,
+ 0x406ca690,
+ 0x406d26bf,
+ 0x406da6e7,
+ 0x406e2715,
+ 0x406ea749,
+ 0x406f2768,
+ 0x406fa77d,
+ 0x40702790,
+ 0x4070a7ad,
0x40710800,
- 0x4071a6d8,
- 0x407226eb,
- 0x4072a704,
- 0x4073271c,
+ 0x4071a7bf,
+ 0x407227d2,
+ 0x4072a7eb,
+ 0x40732803,
0x4073936d,
- 0x40742730,
- 0x4074a74a,
- 0x4075275b,
- 0x4075a76f,
- 0x4076277d,
+ 0x40742817,
+ 0x4074a831,
+ 0x40752842,
+ 0x4075a856,
+ 0x40762864,
0x407691aa,
- 0x407727a2,
- 0x4077a7c4,
- 0x407827df,
- 0x4078a818,
- 0x4079282f,
- 0x4079a845,
- 0x407a2851,
- 0x407aa864,
- 0x407b2879,
- 0x407ba88b,
- 0x407c28a0,
- 0x407ca8a9,
- 0x407d2152,
- 0x407d9c57,
- 0x407e27f4,
- 0x407e9e16,
- 0x407f1a67,
+ 0x40772889,
+ 0x4077a8ab,
+ 0x407828c6,
+ 0x4078a8ff,
+ 0x40792916,
+ 0x4079a92c,
+ 0x407a2938,
+ 0x407aa94b,
+ 0x407b2960,
+ 0x407ba972,
+ 0x407c2987,
+ 0x407ca990,
+ 0x407d21e7,
+ 0x407d9c6e,
+ 0x407e28db,
+ 0x407e9e3e,
+ 0x407f1a7e,
0x407f9887,
- 0x40801c2e,
- 0x40809a8f,
- 0x40811cd9,
- 0x40819c08,
- 0x40822635,
+ 0x40801c45,
+ 0x40809aa6,
+ 0x40811d01,
+ 0x40819c1f,
+ 0x40822700,
0x4082986d,
- 0x40831df1,
- 0x4083a028,
- 0x40841aa3,
- 0x40849e4e,
- 0x41f4228b,
- 0x41f9231d,
- 0x41fe2210,
- 0x41fea3ec,
- 0x41ff24dd,
- 0x420322a4,
- 0x420822c6,
- 0x4208a302,
- 0x420921f4,
- 0x4209a33c,
- 0x420a224b,
- 0x420aa22b,
- 0x420b226b,
- 0x420ba2e4,
- 0x420c24f9,
- 0x420ca3b9,
- 0x420d23d3,
- 0x420da40a,
- 0x42122424,
- 0x421724c0,
- 0x4217a466,
- 0x421c2488,
- 0x421f2443,
- 0x42212510,
- 0x422624a3,
- 0x422b25a9,
- 0x422ba572,
- 0x422c2591,
- 0x422ca54c,
- 0x422d252b,
+ 0x40831e19,
+ 0x4083a0bd,
+ 0x40841aba,
+ 0x40849e76,
+ 0x40851efb,
+ 0x40859ff3,
+ 0x40861f4f,
+ 0x40869c88,
+ 0x4087272d,
+ 0x4087a024,
+ 0x408818aa,
+ 0x41f42320,
+ 0x41f923b2,
+ 0x41fe22a5,
+ 0x41fea481,
+ 0x41ff2572,
+ 0x42032339,
+ 0x4208235b,
+ 0x4208a397,
+ 0x42092289,
+ 0x4209a3d1,
+ 0x420a22e0,
+ 0x420aa2c0,
+ 0x420b2300,
+ 0x420ba379,
+ 0x420c258e,
+ 0x420ca44e,
+ 0x420d2468,
+ 0x420da49f,
+ 0x421224b9,
+ 0x42172555,
+ 0x4217a4fb,
+ 0x421c251d,
+ 0x421f24d8,
+ 0x422125a5,
+ 0x42262538,
+ 0x422b2674,
+ 0x422ba622,
+ 0x422c265c,
+ 0x422ca5e1,
+ 0x422d25c0,
+ 0x422da641,
+ 0x422e2607,
0x4432072b,
0x4432873a,
0x44330746,
@@ -793,69 +798,69 @@ Pod::Spec.new do |s|
0x4c3d136d,
0x4c3d937c,
0x4c3e1389,
- 0x50322b22,
- 0x5032ab31,
- 0x50332b3c,
- 0x5033ab4c,
- 0x50342b65,
- 0x5034ab7f,
- 0x50352b8d,
- 0x5035aba3,
- 0x50362bb5,
- 0x5036abcb,
- 0x50372be4,
- 0x5037abf7,
- 0x50382c0f,
- 0x5038ac20,
- 0x50392c35,
- 0x5039ac49,
- 0x503a2c69,
- 0x503aac7f,
- 0x503b2c97,
- 0x503baca9,
- 0x503c2cc5,
- 0x503cacdc,
- 0x503d2cf5,
- 0x503dad0b,
- 0x503e2d18,
- 0x503ead2e,
- 0x503f2d40,
+ 0x50322c09,
+ 0x5032ac18,
+ 0x50332c23,
+ 0x5033ac33,
+ 0x50342c4c,
+ 0x5034ac66,
+ 0x50352c74,
+ 0x5035ac8a,
+ 0x50362c9c,
+ 0x5036acb2,
+ 0x50372ccb,
+ 0x5037acde,
+ 0x50382cf6,
+ 0x5038ad07,
+ 0x50392d1c,
+ 0x5039ad30,
+ 0x503a2d50,
+ 0x503aad66,
+ 0x503b2d7e,
+ 0x503bad90,
+ 0x503c2dac,
+ 0x503cadc3,
+ 0x503d2ddc,
+ 0x503dadf2,
+ 0x503e2dff,
+ 0x503eae15,
+ 0x503f2e27,
0x503f8382,
- 0x50402d53,
- 0x5040ad63,
- 0x50412d7d,
- 0x5041ad8c,
- 0x50422da6,
- 0x5042adc3,
- 0x50432dd3,
- 0x5043ade3,
- 0x50442df2,
+ 0x50402e3a,
+ 0x5040ae4a,
+ 0x50412e64,
+ 0x5041ae73,
+ 0x50422e8d,
+ 0x5042aeaa,
+ 0x50432eba,
+ 0x5043aeca,
+ 0x50442ed9,
0x5044843f,
- 0x50452e06,
- 0x5045ae24,
- 0x50462e37,
- 0x5046ae4d,
- 0x50472e5f,
- 0x5047ae74,
- 0x50482e9a,
- 0x5048aea8,
- 0x50492ebb,
- 0x5049aed0,
- 0x504a2ee6,
- 0x504aaef6,
- 0x504b2f16,
- 0x504baf29,
- 0x504c2f4c,
- 0x504caf7a,
- 0x504d2f8c,
- 0x504dafa9,
- 0x504e2fc4,
- 0x504eafe0,
- 0x504f2ff2,
- 0x504fb009,
- 0x50503018,
+ 0x50452eed,
+ 0x5045af0b,
+ 0x50462f1e,
+ 0x5046af34,
+ 0x50472f46,
+ 0x5047af5b,
+ 0x50482f81,
+ 0x5048af8f,
+ 0x50492fa2,
+ 0x5049afb7,
+ 0x504a2fcd,
+ 0x504aafdd,
+ 0x504b2ffd,
+ 0x504bb010,
+ 0x504c3033,
+ 0x504cb061,
+ 0x504d3073,
+ 0x504db090,
+ 0x504e30ab,
+ 0x504eb0c7,
+ 0x504f30d9,
+ 0x504fb0f0,
+ 0x505030ff,
0x505086ef,
- 0x5051302b,
+ 0x50513112,
0x58320ec9,
0x68320e8b,
0x68328c25,
@@ -1218,6 +1223,7 @@ Pod::Spec.new do |s|
"BIO_NOT_SET\\0"
"BLOCK_CIPHER_PAD_IS_WRONG\\0"
"BUFFERED_MESSAGES_ON_CIPHER_CHANGE\\0"
+ "CANNOT_PARSE_LEAF_CERT\\0"
"CA_DN_LENGTH_MISMATCH\\0"
"CA_DN_TOO_LONG\\0"
"CCS_RECEIVED_EARLY\\0"
@@ -1261,6 +1267,7 @@ Pod::Spec.new do |s|
"INVALID_COMPRESSION_LIST\\0"
"INVALID_MESSAGE\\0"
"INVALID_OUTER_RECORD_TYPE\\0"
+ "INVALID_SCT_LIST\\0"
"INVALID_SSL_SESSION\\0"
"INVALID_TICKET_KEYS_LENGTH\\0"
"LENGTH_MISMATCH\\0"
@@ -1290,15 +1297,19 @@ Pod::Spec.new do |s|
"NO_RENEGOTIATION\\0"
"NO_REQUIRED_DIGEST\\0"
"NO_SHARED_CIPHER\\0"
+ "NO_SHARED_GROUP\\0"
"NULL_SSL_CTX\\0"
"NULL_SSL_METHOD_PASSED\\0"
"OLD_SESSION_CIPHER_NOT_RETURNED\\0"
+ "OLD_SESSION_PRF_HASH_MISMATCH\\0"
"OLD_SESSION_VERSION_NOT_RETURNED\\0"
"PARSE_TLSEXT\\0"
"PATH_TOO_LONG\\0"
"PEER_DID_NOT_RETURN_A_CERTIFICATE\\0"
"PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE\\0"
+ "PRE_SHARED_KEY_MUST_BE_LAST\\0"
"PROTOCOL_IS_SHUTDOWN\\0"
+ "PSK_IDENTITY_BINDER_COUNT_MISMATCH\\0"
"PSK_IDENTITY_NOT_FOUND\\0"
"PSK_NO_CLIENT_CB\\0"
"PSK_NO_SERVER_CB\\0"
@@ -1350,7 +1361,9 @@ Pod::Spec.new do |s|
"TLSV1_ALERT_USER_CANCELLED\\0"
"TLSV1_BAD_CERTIFICATE_HASH_VALUE\\0"
"TLSV1_BAD_CERTIFICATE_STATUS_RESPONSE\\0"
+ "TLSV1_CERTIFICATE_REQUIRED\\0"
"TLSV1_CERTIFICATE_UNOBTAINABLE\\0"
+ "TLSV1_UNKNOWN_PSK_IDENTITY\\0"
"TLSV1_UNRECOGNIZED_NAME\\0"
"TLSV1_UNSUPPORTED_EXTENSION\\0"
"TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST\\0"
@@ -1358,6 +1371,7 @@ Pod::Spec.new do |s|
"TOO_MANY_EMPTY_FRAGMENTS\\0"
"TOO_MANY_KEY_UPDATES\\0"
"TOO_MANY_WARNING_ALERTS\\0"
+ "TOO_MUCH_SKIPPED_EARLY_DATA\\0"
"UNABLE_TO_FIND_ECDH_PARAMETERS\\0"
"UNEXPECTED_EXTENSION\\0"
"UNEXPECTED_MESSAGE\\0"
diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m
index 99cb0ad971..577a5e9a42 100644
--- a/src/objective-c/RxLibrary/GRXBufferedPipe.m
+++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m
@@ -110,4 +110,12 @@
self.state = GRXWriterStateFinished;
}
+- (void)dealloc {
+ GRXWriterState state = self.state;
+ if (state == GRXWriterStateNotStarted ||
+ state == GRXWriterStatePaused) {
+ dispatch_resume(_writeQueue);
+ }
+}
+
@end
diff --git a/src/objective-c/tests/RxLibraryUnitTests.m b/src/objective-c/tests/RxLibraryUnitTests.m
index fa3ded4c0c..3a5adbbf37 100644
--- a/src/objective-c/tests/RxLibraryUnitTests.m
+++ b/src/objective-c/tests/RxLibraryUnitTests.m
@@ -213,4 +213,74 @@
XCTAssertEqualObjects(handler.errorOrNil, nil);
}
+#define WRITE_ROUNDS (1000)
+- (void)testBufferedPipeResumeWhenDealloc {
+ id anyValue = @7;
+ id<GRXWriteable> writeable = [GRXWriteable writeableWithSingleHandler:^(id value, NSError *errorOrNil) {
+ }];
+
+ // Release after alloc;
+ GRXBufferedPipe *pipe = [GRXBufferedPipe pipe];
+ pipe = nil;
+
+ // Release after write but before start
+ pipe = [GRXBufferedPipe pipe];
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ pipe = nil;
+
+ // Release after start but not write
+ pipe = [GRXBufferedPipe pipe];
+ [pipe startWithWriteable:writeable];
+ pipe = nil;
+
+ // Release after start and write
+ pipe = [GRXBufferedPipe pipe];
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ [pipe startWithWriteable:writeable];
+ pipe = nil;
+
+ // Release after start, write and pause
+ pipe = [GRXBufferedPipe pipe];
+ [pipe startWithWriteable:writeable];
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ pipe.state = GRXWriterStatePaused;
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ pipe = nil;
+
+ // Release after start, write, pause and finish
+ pipe = [GRXBufferedPipe pipe];
+ [pipe startWithWriteable:writeable];
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ pipe.state = GRXWriterStatePaused;
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ [pipe finishWithError:nil];
+ pipe = nil;
+
+ // Release after start, write, pause, finish and resume
+ pipe = [GRXBufferedPipe pipe];
+ [pipe startWithWriteable:writeable];
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ pipe.state = GRXWriterStatePaused;
+ for (int i = 0; i < WRITE_ROUNDS; i++) {
+ [pipe writeValue:anyValue];
+ }
+ [pipe finishWithError:nil];
+ pipe.state = GRXWriterStateStarted;
+ pipe = nil;
+}
+
@end
diff --git a/src/proto/grpc/lb/v1/load_balancer.proto b/src/proto/grpc/lb/v1/load_balancer.proto
index b13b3438cf..0a33568bd6 100644
--- a/src/proto/grpc/lb/v1/load_balancer.proto
+++ b/src/proto/grpc/lb/v1/load_balancer.proto
@@ -67,6 +67,15 @@ message InitialLoadBalanceRequest {
string name = 1;
}
+// Contains the number of calls finished for a particular load balance token.
+message ClientStatsPerToken {
+ // See Server.load_balance_token.
+ string load_balance_token = 1;
+
+ // The total number of RPCs that finished associated with the token.
+ int64 num_calls = 2;
+}
+
// Contains client level statistics that are useful to load balancing. Each
// count except the timestamp should be reset to zero after reporting the stats.
message ClientStats {
@@ -79,20 +88,17 @@ message ClientStats {
// The total number of RPCs that finished.
int64 num_calls_finished = 3;
- // The total number of RPCs that were dropped by the client because of rate
- // limiting.
- int64 num_calls_finished_with_drop_for_rate_limiting = 4;
-
- // The total number of RPCs that were dropped by the client because of load
- // balancing.
- int64 num_calls_finished_with_drop_for_load_balancing = 5;
-
// The total number of RPCs that failed to reach a server except dropped RPCs.
int64 num_calls_finished_with_client_failed_to_send = 6;
// The total number of RPCs that finished and are known to have been received
// by a server.
int64 num_calls_finished_known_received = 7;
+
+ // The list of dropped calls.
+ repeated ClientStatsPerToken calls_finished_with_drop = 8;
+
+ reserved 4, 5;
}
message LoadBalanceResponse {
@@ -134,10 +140,8 @@ message ServerList {
Duration expiration_interval = 3;
}
-// Contains server information. When none of the [drop_for_*] fields are true,
-// use the other fields. When drop_for_rate_limiting is true, ignore all other
-// fields. Use drop_for_load_balancing only when it is true and
-// drop_for_rate_limiting is false.
+// Contains server information. When the drop field is not true, use the other
+// fields.
message Server {
// A resolved address for the server, serialized in network-byte-order. It may
// either be an IPv4 or IPv6 address.
@@ -149,16 +153,16 @@ message Server {
// An opaque but printable token given to the frontend for each pick. All
// frontend requests for that pick must include the token in its initial
// metadata. The token is used by the backend to verify the request and to
- // allow the backend to report load to the gRPC LB system.
+ // allow the backend to report load to the gRPC LB system. The token is also
+ // used in client stats for reporting dropped calls.
//
// Its length is variable but less than 50 bytes.
string load_balance_token = 3;
- // Indicates whether this particular request should be dropped by the client
- // for rate limiting.
- bool drop_for_rate_limiting = 4;
+ // Indicates whether this particular request should be dropped by the client.
+ // If the request is dropped, there will be a corresponding entry in
+ // ClientStats.calls_finished_with_drop.
+ bool drop = 4;
- // Indicates whether this particular request should be dropped by the client
- // for load balancing.
- bool drop_for_load_balancing = 5;
+ reserved 5;
}
diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
index a477ab6507..5288704350 100644
--- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h
+++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h
@@ -644,22 +644,22 @@ extern gpr_get_allocation_functions_type gpr_get_allocation_functions_import;
typedef gpr_avl(*gpr_avl_create_type)(const gpr_avl_vtable *vtable);
extern gpr_avl_create_type gpr_avl_create_import;
#define gpr_avl_create gpr_avl_create_import
-typedef gpr_avl(*gpr_avl_ref_type)(gpr_avl avl);
+typedef gpr_avl(*gpr_avl_ref_type)(gpr_avl avl, void *user_data);
extern gpr_avl_ref_type gpr_avl_ref_import;
#define gpr_avl_ref gpr_avl_ref_import
-typedef void(*gpr_avl_unref_type)(gpr_avl avl);
+typedef void(*gpr_avl_unref_type)(gpr_avl avl, void *user_data);
extern gpr_avl_unref_type gpr_avl_unref_import;
#define gpr_avl_unref gpr_avl_unref_import
-typedef gpr_avl(*gpr_avl_add_type)(gpr_avl avl, void *key, void *value);
+typedef gpr_avl(*gpr_avl_add_type)(gpr_avl avl, void *key, void *value, void *user_data);
extern gpr_avl_add_type gpr_avl_add_import;
#define gpr_avl_add gpr_avl_add_import
-typedef gpr_avl(*gpr_avl_remove_type)(gpr_avl avl, void *key);
+typedef gpr_avl(*gpr_avl_remove_type)(gpr_avl avl, void *key, void *user_data);
extern gpr_avl_remove_type gpr_avl_remove_import;
#define gpr_avl_remove gpr_avl_remove_import
-typedef void *(*gpr_avl_get_type)(gpr_avl avl, void *key);
+typedef void *(*gpr_avl_get_type)(gpr_avl avl, void *key, void *user_data);
extern gpr_avl_get_type gpr_avl_get_import;
#define gpr_avl_get gpr_avl_get_import
-typedef int(*gpr_avl_maybe_get_type)(gpr_avl avl, void *key, void **value);
+typedef int(*gpr_avl_maybe_get_type)(gpr_avl avl, void *key, void **value, void *user_data);
extern gpr_avl_maybe_get_type gpr_avl_maybe_get_import;
#define gpr_avl_maybe_get gpr_avl_maybe_get_import
typedef int(*gpr_avl_is_empty_type)(gpr_avl avl);
diff --git a/src/ruby/lib/grpc/generic/active_call.rb b/src/ruby/lib/grpc/generic/active_call.rb
index 87b29c26ea..10eb70b4a7 100644
--- a/src/ruby/lib/grpc/generic/active_call.rb
+++ b/src/ruby/lib/grpc/generic/active_call.rb
@@ -480,7 +480,20 @@ module GRPC
def bidi_streamer(requests, metadata: {}, &blk)
raise_error_if_already_executed
# Metadata might have already been sent if this is an operation view
- merge_metadata_and_send_if_not_already_sent(metadata)
+ begin
+ merge_metadata_and_send_if_not_already_sent(metadata)
+ rescue GRPC::Core::CallError => e
+ batch_result = @call.run_batch(RECV_STATUS_ON_CLIENT => nil)
+ set_input_stream_done
+ set_output_stream_done
+ attach_status_results_and_complete_call(batch_result)
+ raise e
+ rescue => e
+ set_input_stream_done
+ set_output_stream_done
+ raise e
+ end
+
bd = BidiCall.new(@call,
@marshal,
@unmarshal,
diff --git a/src/ruby/spec/generic/client_stub_spec.rb b/src/ruby/spec/generic/client_stub_spec.rb
index 42cff4041b..e1e7a535fb 100644
--- a/src/ruby/spec/generic/client_stub_spec.rb
+++ b/src/ruby/spec/generic/client_stub_spec.rb
@@ -616,8 +616,22 @@ describe 'ClientStub' do
th.join
end
- # TODO: add test for metadata-related ArgumentError in a bidi call once
- # issue mentioned in https://github.com/grpc/grpc/issues/10526 is fixed
+ it 'should raise ArgumentError if metadata contains invalid values' do
+ @metadata.merge!(k3: 3)
+ stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
+ expect do
+ get_responses(stub).collect { |r| r }
+ end.to raise_error(ArgumentError,
+ /Header values must be of type string or array/)
+ end
+
+ it 'terminates if the call fails to start' do
+ # don't start the server
+ stub = GRPC::ClientStub.new(@host, :this_channel_is_insecure)
+ expect do
+ get_responses(stub, deadline: from_relative_time(0)).collect { |r| r }
+ end.to raise_error(GRPC::BadStatus)
+ end
it 'should send metadata to the server ok' do
th = run_bidi_streamer_echo_ping_pong(@sent_msgs, @pass, true,
@@ -630,9 +644,9 @@ describe 'ClientStub' do
end
describe 'without a call operation' do
- def get_responses(stub)
+ def get_responses(stub, deadline: nil)
e = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
- metadata: @metadata)
+ metadata: @metadata, deadline: deadline)
expect(e).to be_a(Enumerator)
e
end
@@ -644,10 +658,10 @@ describe 'ClientStub' do
after(:each) do
@op.wait # make sure wait doesn't hang
end
- def get_responses(stub, run_start_call_first: false)
+ def get_responses(stub, run_start_call_first: false, deadline: nil)
@op = stub.bidi_streamer(@method, @sent_msgs, noop, noop,
return_op: true,
- metadata: @metadata)
+ metadata: @metadata, deadline: deadline)
expect(@op).to be_a(GRPC::ActiveCall::Operation)
@op.start_call if run_start_call_first
e = @op.execute
diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template
index 3d54534023..cfc13cf4dd 100644
--- a/templates/gRPC-Core.podspec.template
+++ b/templates/gRPC-Core.podspec.template
@@ -135,7 +135,7 @@
ss.header_mappings_dir = '.'
ss.libraries = 'z'
ss.dependency "#{s.name}/Interface", version
- ss.dependency 'BoringSSL', '~> 8.0'
+ ss.dependency 'BoringSSL', '~> 9.0'
ss.dependency 'nanopb', '~> 0.3'
# To save you from scrolling, this is the last part of the podspec.
diff --git a/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template b/templates/src/objective-c/!ProtoCompiler-gRPCPlugin.podspec.template
index 24c167d7f1..b8223417b7 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.2.0'
+ s.dependency '!ProtoCompiler', '3.3.0'
# For the Protobuf dependency not to complain:
s.ios.deployment_target = '7.0'
s.osx.deployment_target = '10.9'
diff --git a/test/core/end2end/fuzzers/server_fuzzer.c b/test/core/end2end/fuzzers/server_fuzzer.c
index 3ddc1ae907..ef4c0a4bfd 100644
--- a/test/core/end2end/fuzzers/server_fuzzer.c
+++ b/test/core/end2end/fuzzers/server_fuzzer.c
@@ -72,8 +72,9 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
grpc_metadata_array_init(&request_metadata1);
int requested_calls = 0;
- grpc_server_request_call(server, &call1, &call_details1, &request_metadata1,
- cq, cq, tag(1));
+ GPR_ASSERT(GRPC_CALL_OK ==
+ grpc_server_request_call(server, &call1, &call_details1,
+ &request_metadata1, cq, cq, tag(1)));
requested_calls++;
grpc_event ev;
diff --git a/test/core/fling/server.c b/test/core/fling/server.c
index 0f0f22ffcf..b3a7fa21ec 100644
--- a/test/core/fling/server.c
+++ b/test/core/fling/server.c
@@ -77,8 +77,10 @@ typedef struct {
static void request_call(void) {
grpc_metadata_array_init(&request_metadata_recv);
- grpc_server_request_call(server, &call, &call_details, &request_metadata_recv,
- cq, cq, tag(FLING_SERVER_NEW_REQUEST));
+ GPR_ASSERT(GRPC_CALL_OK ==
+ grpc_server_request_call(server, &call, &call_details,
+ &request_metadata_recv, cq, cq,
+ tag(FLING_SERVER_NEW_REQUEST)));
}
static void handle_unary_method(void) {
diff --git a/test/core/support/avl_test.c b/test/core/support/avl_test.c
index cd352d3d1d..37424d6405 100644
--- a/test/core/support/avl_test.c
+++ b/test/core/support/avl_test.c
@@ -33,29 +33,31 @@ static int *box(int x) {
return b;
}
-static long int_compare(void *int1, void *int2) {
+static long int_compare(void *int1, void *int2, void *unused) {
return (*(int *)int1) - (*(int *)int2);
}
-static void *int_copy(void *p) { return box(*(int *)p); }
+static void *int_copy(void *p, void *unused) { return box(*(int *)p); }
-static const gpr_avl_vtable int_int_vtable = {gpr_free, int_copy, int_compare,
- gpr_free, int_copy};
+static void destroy(void *p, void *unused) { gpr_free(p); }
+
+static const gpr_avl_vtable int_int_vtable = {destroy, int_copy, int_compare,
+ destroy, int_copy};
static void check_get(gpr_avl avl, int key, int value) {
int *k = box(key);
- GPR_ASSERT(*(int *)gpr_avl_get(avl, k) == value);
+ GPR_ASSERT(*(int *)gpr_avl_get(avl, k, NULL) == value);
gpr_free(k);
}
static void check_negget(gpr_avl avl, int key) {
int *k = box(key);
- GPR_ASSERT(gpr_avl_get(avl, k) == NULL);
+ GPR_ASSERT(gpr_avl_get(avl, k, NULL) == NULL);
gpr_free(k);
}
static gpr_avl remove_int(gpr_avl avl, int key) {
int *k = box(key);
- avl = gpr_avl_remove(avl, k);
+ avl = gpr_avl_remove(avl, k, NULL);
gpr_free(k);
return avl;
}
@@ -64,94 +66,94 @@ static void test_get(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_get");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(1), box(11));
- avl = gpr_avl_add(avl, box(2), box(22));
- avl = gpr_avl_add(avl, box(3), box(33));
+ avl = gpr_avl_add(avl, box(1), box(11), NULL);
+ avl = gpr_avl_add(avl, box(2), box(22), NULL);
+ avl = gpr_avl_add(avl, box(3), box(33), NULL);
check_get(avl, 1, 11);
check_get(avl, 2, 22);
check_get(avl, 3, 33);
check_negget(avl, 4);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_ll(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_ll");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(5), box(1));
- avl = gpr_avl_add(avl, box(4), box(2));
- avl = gpr_avl_add(avl, box(3), box(3));
+ avl = gpr_avl_add(avl, box(5), box(1), NULL);
+ avl = gpr_avl_add(avl, box(4), box(2), NULL);
+ avl = gpr_avl_add(avl, box(3), box(3), NULL);
GPR_ASSERT(*(int *)avl.root->key == 4);
GPR_ASSERT(*(int *)avl.root->left->key == 3);
GPR_ASSERT(*(int *)avl.root->right->key == 5);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_lr(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_lr");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(5), box(1));
- avl = gpr_avl_add(avl, box(3), box(2));
- avl = gpr_avl_add(avl, box(4), box(3));
+ avl = gpr_avl_add(avl, box(5), box(1), NULL);
+ avl = gpr_avl_add(avl, box(3), box(2), NULL);
+ avl = gpr_avl_add(avl, box(4), box(3), NULL);
GPR_ASSERT(*(int *)avl.root->key == 4);
GPR_ASSERT(*(int *)avl.root->left->key == 3);
GPR_ASSERT(*(int *)avl.root->right->key == 5);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_rr(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_rr");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(3), box(1));
- avl = gpr_avl_add(avl, box(4), box(2));
- avl = gpr_avl_add(avl, box(5), box(3));
+ avl = gpr_avl_add(avl, box(3), box(1), NULL);
+ avl = gpr_avl_add(avl, box(4), box(2), NULL);
+ avl = gpr_avl_add(avl, box(5), box(3), NULL);
GPR_ASSERT(*(int *)avl.root->key == 4);
GPR_ASSERT(*(int *)avl.root->left->key == 3);
GPR_ASSERT(*(int *)avl.root->right->key == 5);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_rl(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_rl");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(3), box(1));
- avl = gpr_avl_add(avl, box(5), box(2));
- avl = gpr_avl_add(avl, box(4), box(3));
+ avl = gpr_avl_add(avl, box(3), box(1), NULL);
+ avl = gpr_avl_add(avl, box(5), box(2), NULL);
+ avl = gpr_avl_add(avl, box(4), box(3), NULL);
GPR_ASSERT(*(int *)avl.root->key == 4);
GPR_ASSERT(*(int *)avl.root->left->key == 3);
GPR_ASSERT(*(int *)avl.root->right->key == 5);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_unbalanced(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_unbalanced");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(5), box(1));
- avl = gpr_avl_add(avl, box(4), box(2));
- avl = gpr_avl_add(avl, box(3), box(3));
- avl = gpr_avl_add(avl, box(2), box(4));
- avl = gpr_avl_add(avl, box(1), box(5));
+ avl = gpr_avl_add(avl, box(5), box(1), NULL);
+ avl = gpr_avl_add(avl, box(4), box(2), NULL);
+ avl = gpr_avl_add(avl, box(3), box(3), NULL);
+ avl = gpr_avl_add(avl, box(2), box(4), NULL);
+ avl = gpr_avl_add(avl, box(1), box(5), NULL);
GPR_ASSERT(*(int *)avl.root->key == 4);
GPR_ASSERT(*(int *)avl.root->left->key == 2);
GPR_ASSERT(*(int *)avl.root->left->left->key == 1);
GPR_ASSERT(*(int *)avl.root->left->right->key == 3);
GPR_ASSERT(*(int *)avl.root->right->key == 5);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_replace(void) {
gpr_avl avl;
gpr_log(GPR_DEBUG, "test_replace");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(1), box(1));
- avl = gpr_avl_add(avl, box(1), box(2));
+ avl = gpr_avl_add(avl, box(1), box(1), NULL);
+ avl = gpr_avl_add(avl, box(1), box(2), NULL);
check_get(avl, 1, 2);
check_negget(avl, 2);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_remove(void) {
@@ -159,36 +161,36 @@ static void test_remove(void) {
gpr_avl avl3, avl4, avl5, avln;
gpr_log(GPR_DEBUG, "test_remove");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(3), box(1));
- avl = gpr_avl_add(avl, box(4), box(2));
- avl = gpr_avl_add(avl, box(5), box(3));
+ avl = gpr_avl_add(avl, box(3), box(1), NULL);
+ avl = gpr_avl_add(avl, box(4), box(2), NULL);
+ avl = gpr_avl_add(avl, box(5), box(3), NULL);
- avl3 = remove_int(gpr_avl_ref(avl), 3);
- avl4 = remove_int(gpr_avl_ref(avl), 4);
- avl5 = remove_int(gpr_avl_ref(avl), 5);
- avln = remove_int(gpr_avl_ref(avl), 1);
+ avl3 = remove_int(gpr_avl_ref(avl, NULL), 3);
+ avl4 = remove_int(gpr_avl_ref(avl, NULL), 4);
+ avl5 = remove_int(gpr_avl_ref(avl, NULL), 5);
+ avln = remove_int(gpr_avl_ref(avl, NULL), 1);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
check_negget(avl3, 3);
check_get(avl3, 4, 2);
check_get(avl3, 5, 3);
- gpr_avl_unref(avl3);
+ gpr_avl_unref(avl3, NULL);
check_get(avl4, 3, 1);
check_negget(avl4, 4);
check_get(avl4, 5, 3);
- gpr_avl_unref(avl4);
+ gpr_avl_unref(avl4, NULL);
check_get(avl5, 3, 1);
check_get(avl5, 4, 2);
check_negget(avl5, 5);
- gpr_avl_unref(avl5);
+ gpr_avl_unref(avl5, NULL);
check_get(avln, 3, 1);
check_get(avln, 4, 2);
check_get(avln, 5, 3);
- gpr_avl_unref(avln);
+ gpr_avl_unref(avln, NULL);
}
static void test_badcase1(void) {
@@ -197,44 +199,44 @@ static void test_badcase1(void) {
gpr_log(GPR_DEBUG, "test_badcase1");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(88), box(1));
+ avl = gpr_avl_add(avl, box(88), box(1), NULL);
avl = remove_int(avl, 643);
avl = remove_int(avl, 983);
- avl = gpr_avl_add(avl, box(985), box(4));
- avl = gpr_avl_add(avl, box(640), box(5));
- avl = gpr_avl_add(avl, box(41), box(6));
- avl = gpr_avl_add(avl, box(112), box(7));
- avl = gpr_avl_add(avl, box(342), box(8));
+ avl = gpr_avl_add(avl, box(985), box(4), NULL);
+ avl = gpr_avl_add(avl, box(640), box(5), NULL);
+ avl = gpr_avl_add(avl, box(41), box(6), NULL);
+ avl = gpr_avl_add(avl, box(112), box(7), NULL);
+ avl = gpr_avl_add(avl, box(342), box(8), NULL);
avl = remove_int(avl, 1013);
- avl = gpr_avl_add(avl, box(434), box(10));
- avl = gpr_avl_add(avl, box(520), box(11));
- avl = gpr_avl_add(avl, box(231), box(12));
- avl = gpr_avl_add(avl, box(852), box(13));
+ avl = gpr_avl_add(avl, box(434), box(10), NULL);
+ avl = gpr_avl_add(avl, box(520), box(11), NULL);
+ avl = gpr_avl_add(avl, box(231), box(12), NULL);
+ avl = gpr_avl_add(avl, box(852), box(13), NULL);
avl = remove_int(avl, 461);
- avl = gpr_avl_add(avl, box(108), box(15));
- avl = gpr_avl_add(avl, box(806), box(16));
- avl = gpr_avl_add(avl, box(827), box(17));
+ avl = gpr_avl_add(avl, box(108), box(15), NULL);
+ avl = gpr_avl_add(avl, box(806), box(16), NULL);
+ avl = gpr_avl_add(avl, box(827), box(17), NULL);
avl = remove_int(avl, 796);
- avl = gpr_avl_add(avl, box(340), box(19));
- avl = gpr_avl_add(avl, box(498), box(20));
- avl = gpr_avl_add(avl, box(203), box(21));
- avl = gpr_avl_add(avl, box(751), box(22));
- avl = gpr_avl_add(avl, box(150), box(23));
+ avl = gpr_avl_add(avl, box(340), box(19), NULL);
+ avl = gpr_avl_add(avl, box(498), box(20), NULL);
+ avl = gpr_avl_add(avl, box(203), box(21), NULL);
+ avl = gpr_avl_add(avl, box(751), box(22), NULL);
+ avl = gpr_avl_add(avl, box(150), box(23), NULL);
avl = remove_int(avl, 237);
- avl = gpr_avl_add(avl, box(830), box(25));
+ avl = gpr_avl_add(avl, box(830), box(25), NULL);
avl = remove_int(avl, 1007);
avl = remove_int(avl, 394);
- avl = gpr_avl_add(avl, box(65), box(28));
+ avl = gpr_avl_add(avl, box(65), box(28), NULL);
avl = remove_int(avl, 904);
avl = remove_int(avl, 123);
- avl = gpr_avl_add(avl, box(238), box(31));
- avl = gpr_avl_add(avl, box(184), box(32));
+ avl = gpr_avl_add(avl, box(238), box(31), NULL);
+ avl = gpr_avl_add(avl, box(184), box(32), NULL);
avl = remove_int(avl, 331);
- avl = gpr_avl_add(avl, box(827), box(34));
+ avl = gpr_avl_add(avl, box(827), box(34), NULL);
check_get(avl, 830, 25);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_badcase2(void) {
@@ -243,254 +245,254 @@ static void test_badcase2(void) {
gpr_log(GPR_DEBUG, "test_badcase2");
avl = gpr_avl_create(&int_int_vtable);
- avl = gpr_avl_add(avl, box(288), box(1));
+ avl = gpr_avl_add(avl, box(288), box(1), NULL);
avl = remove_int(avl, 415);
- avl = gpr_avl_add(avl, box(953), box(3));
- avl = gpr_avl_add(avl, box(101), box(4));
- avl = gpr_avl_add(avl, box(516), box(5));
- avl = gpr_avl_add(avl, box(547), box(6));
- avl = gpr_avl_add(avl, box(467), box(7));
- avl = gpr_avl_add(avl, box(793), box(8));
+ avl = gpr_avl_add(avl, box(953), box(3), NULL);
+ avl = gpr_avl_add(avl, box(101), box(4), NULL);
+ avl = gpr_avl_add(avl, box(516), box(5), NULL);
+ avl = gpr_avl_add(avl, box(547), box(6), NULL);
+ avl = gpr_avl_add(avl, box(467), box(7), NULL);
+ avl = gpr_avl_add(avl, box(793), box(8), NULL);
avl = remove_int(avl, 190);
- avl = gpr_avl_add(avl, box(687), box(10));
- avl = gpr_avl_add(avl, box(242), box(11));
- avl = gpr_avl_add(avl, box(142), box(12));
+ avl = gpr_avl_add(avl, box(687), box(10), NULL);
+ avl = gpr_avl_add(avl, box(242), box(11), NULL);
+ avl = gpr_avl_add(avl, box(142), box(12), NULL);
avl = remove_int(avl, 705);
avl = remove_int(avl, 578);
avl = remove_int(avl, 767);
avl = remove_int(avl, 183);
- avl = gpr_avl_add(avl, box(950), box(17));
- avl = gpr_avl_add(avl, box(622), box(18));
+ avl = gpr_avl_add(avl, box(950), box(17), NULL);
+ avl = gpr_avl_add(avl, box(622), box(18), NULL);
avl = remove_int(avl, 513);
avl = remove_int(avl, 429);
- avl = gpr_avl_add(avl, box(205), box(21));
+ avl = gpr_avl_add(avl, box(205), box(21), NULL);
avl = remove_int(avl, 663);
avl = remove_int(avl, 953);
avl = remove_int(avl, 892);
- avl = gpr_avl_add(avl, box(236), box(25));
+ avl = gpr_avl_add(avl, box(236), box(25), NULL);
avl = remove_int(avl, 982);
avl = remove_int(avl, 201);
avl = remove_int(avl, 684);
- avl = gpr_avl_add(avl, box(572), box(29));
+ avl = gpr_avl_add(avl, box(572), box(29), NULL);
avl = remove_int(avl, 817);
- avl = gpr_avl_add(avl, box(970), box(31));
+ avl = gpr_avl_add(avl, box(970), box(31), NULL);
avl = remove_int(avl, 347);
avl = remove_int(avl, 574);
- avl = gpr_avl_add(avl, box(752), box(34));
- avl = gpr_avl_add(avl, box(670), box(35));
- avl = gpr_avl_add(avl, box(69), box(36));
+ avl = gpr_avl_add(avl, box(752), box(34), NULL);
+ avl = gpr_avl_add(avl, box(670), box(35), NULL);
+ avl = gpr_avl_add(avl, box(69), box(36), NULL);
avl = remove_int(avl, 111);
avl = remove_int(avl, 523);
- avl = gpr_avl_add(avl, box(141), box(39));
+ avl = gpr_avl_add(avl, box(141), box(39), NULL);
avl = remove_int(avl, 159);
- avl = gpr_avl_add(avl, box(947), box(41));
- avl = gpr_avl_add(avl, box(855), box(42));
+ avl = gpr_avl_add(avl, box(947), box(41), NULL);
+ avl = gpr_avl_add(avl, box(855), box(42), NULL);
avl = remove_int(avl, 218);
avl = remove_int(avl, 6);
- avl = gpr_avl_add(avl, box(753), box(45));
+ avl = gpr_avl_add(avl, box(753), box(45), NULL);
avl = remove_int(avl, 82);
avl = remove_int(avl, 799);
- avl = gpr_avl_add(avl, box(572), box(48));
+ avl = gpr_avl_add(avl, box(572), box(48), NULL);
avl = remove_int(avl, 376);
avl = remove_int(avl, 413);
- avl = gpr_avl_add(avl, box(458), box(51));
+ avl = gpr_avl_add(avl, box(458), box(51), NULL);
avl = remove_int(avl, 897);
- avl = gpr_avl_add(avl, box(191), box(53));
- avl = gpr_avl_add(avl, box(609), box(54));
+ avl = gpr_avl_add(avl, box(191), box(53), NULL);
+ avl = gpr_avl_add(avl, box(609), box(54), NULL);
avl = remove_int(avl, 787);
avl = remove_int(avl, 710);
avl = remove_int(avl, 886);
avl = remove_int(avl, 835);
avl = remove_int(avl, 33);
- avl = gpr_avl_add(avl, box(871), box(60));
+ avl = gpr_avl_add(avl, box(871), box(60), NULL);
avl = remove_int(avl, 641);
- avl = gpr_avl_add(avl, box(462), box(62));
+ avl = gpr_avl_add(avl, box(462), box(62), NULL);
avl = remove_int(avl, 359);
avl = remove_int(avl, 767);
- avl = gpr_avl_add(avl, box(310), box(65));
+ avl = gpr_avl_add(avl, box(310), box(65), NULL);
avl = remove_int(avl, 757);
avl = remove_int(avl, 639);
avl = remove_int(avl, 314);
- avl = gpr_avl_add(avl, box(2), box(69));
+ avl = gpr_avl_add(avl, box(2), box(69), NULL);
avl = remove_int(avl, 138);
- avl = gpr_avl_add(avl, box(669), box(71));
+ avl = gpr_avl_add(avl, box(669), box(71), NULL);
avl = remove_int(avl, 477);
- avl = gpr_avl_add(avl, box(366), box(73));
- avl = gpr_avl_add(avl, box(612), box(74));
- avl = gpr_avl_add(avl, box(106), box(75));
+ avl = gpr_avl_add(avl, box(366), box(73), NULL);
+ avl = gpr_avl_add(avl, box(612), box(74), NULL);
+ avl = gpr_avl_add(avl, box(106), box(75), NULL);
avl = remove_int(avl, 161);
- avl = gpr_avl_add(avl, box(388), box(77));
- avl = gpr_avl_add(avl, box(141), box(78));
+ avl = gpr_avl_add(avl, box(388), box(77), NULL);
+ avl = gpr_avl_add(avl, box(141), box(78), NULL);
avl = remove_int(avl, 633);
avl = remove_int(avl, 459);
- avl = gpr_avl_add(avl, box(40), box(81));
+ avl = gpr_avl_add(avl, box(40), box(81), NULL);
avl = remove_int(avl, 689);
- avl = gpr_avl_add(avl, box(823), box(83));
+ avl = gpr_avl_add(avl, box(823), box(83), NULL);
avl = remove_int(avl, 485);
- avl = gpr_avl_add(avl, box(903), box(85));
- avl = gpr_avl_add(avl, box(592), box(86));
+ avl = gpr_avl_add(avl, box(903), box(85), NULL);
+ avl = gpr_avl_add(avl, box(592), box(86), NULL);
avl = remove_int(avl, 448);
- avl = gpr_avl_add(avl, box(56), box(88));
+ avl = gpr_avl_add(avl, box(56), box(88), NULL);
avl = remove_int(avl, 333);
- avl = gpr_avl_add(avl, box(189), box(90));
- avl = gpr_avl_add(avl, box(103), box(91));
+ avl = gpr_avl_add(avl, box(189), box(90), NULL);
+ avl = gpr_avl_add(avl, box(103), box(91), NULL);
avl = remove_int(avl, 164);
avl = remove_int(avl, 974);
- avl = gpr_avl_add(avl, box(215), box(94));
+ avl = gpr_avl_add(avl, box(215), box(94), NULL);
avl = remove_int(avl, 189);
avl = remove_int(avl, 504);
- avl = gpr_avl_add(avl, box(868), box(97));
+ avl = gpr_avl_add(avl, box(868), box(97), NULL);
avl = remove_int(avl, 909);
avl = remove_int(avl, 148);
avl = remove_int(avl, 469);
- avl = gpr_avl_add(avl, box(994), box(101));
- avl = gpr_avl_add(avl, box(576), box(102));
+ avl = gpr_avl_add(avl, box(994), box(101), NULL);
+ avl = gpr_avl_add(avl, box(576), box(102), NULL);
avl = remove_int(avl, 82);
avl = remove_int(avl, 209);
- avl = gpr_avl_add(avl, box(276), box(105));
+ avl = gpr_avl_add(avl, box(276), box(105), NULL);
avl = remove_int(avl, 856);
- avl = gpr_avl_add(avl, box(750), box(107));
+ avl = gpr_avl_add(avl, box(750), box(107), NULL);
avl = remove_int(avl, 871);
- avl = gpr_avl_add(avl, box(301), box(109));
+ avl = gpr_avl_add(avl, box(301), box(109), NULL);
avl = remove_int(avl, 260);
avl = remove_int(avl, 737);
avl = remove_int(avl, 719);
- avl = gpr_avl_add(avl, box(933), box(113));
- avl = gpr_avl_add(avl, box(225), box(114));
- avl = gpr_avl_add(avl, box(975), box(115));
- avl = gpr_avl_add(avl, box(86), box(116));
+ avl = gpr_avl_add(avl, box(933), box(113), NULL);
+ avl = gpr_avl_add(avl, box(225), box(114), NULL);
+ avl = gpr_avl_add(avl, box(975), box(115), NULL);
+ avl = gpr_avl_add(avl, box(86), box(116), NULL);
avl = remove_int(avl, 732);
- avl = gpr_avl_add(avl, box(340), box(118));
- avl = gpr_avl_add(avl, box(271), box(119));
+ avl = gpr_avl_add(avl, box(340), box(118), NULL);
+ avl = gpr_avl_add(avl, box(271), box(119), NULL);
avl = remove_int(avl, 206);
- avl = gpr_avl_add(avl, box(949), box(121));
- avl = gpr_avl_add(avl, box(927), box(122));
- avl = gpr_avl_add(avl, box(34), box(123));
- avl = gpr_avl_add(avl, box(351), box(124));
+ avl = gpr_avl_add(avl, box(949), box(121), NULL);
+ avl = gpr_avl_add(avl, box(927), box(122), NULL);
+ avl = gpr_avl_add(avl, box(34), box(123), NULL);
+ avl = gpr_avl_add(avl, box(351), box(124), NULL);
avl = remove_int(avl, 836);
- avl = gpr_avl_add(avl, box(825), box(126));
- avl = gpr_avl_add(avl, box(352), box(127));
+ avl = gpr_avl_add(avl, box(825), box(126), NULL);
+ avl = gpr_avl_add(avl, box(352), box(127), NULL);
avl = remove_int(avl, 107);
avl = remove_int(avl, 101);
- avl = gpr_avl_add(avl, box(320), box(130));
- avl = gpr_avl_add(avl, box(3), box(131));
+ avl = gpr_avl_add(avl, box(320), box(130), NULL);
+ avl = gpr_avl_add(avl, box(3), box(131), NULL);
avl = remove_int(avl, 998);
avl = remove_int(avl, 44);
- avl = gpr_avl_add(avl, box(525), box(134));
- avl = gpr_avl_add(avl, box(864), box(135));
- avl = gpr_avl_add(avl, box(863), box(136));
+ avl = gpr_avl_add(avl, box(525), box(134), NULL);
+ avl = gpr_avl_add(avl, box(864), box(135), NULL);
+ avl = gpr_avl_add(avl, box(863), box(136), NULL);
avl = remove_int(avl, 770);
- avl = gpr_avl_add(avl, box(440), box(138));
+ avl = gpr_avl_add(avl, box(440), box(138), NULL);
avl = remove_int(avl, 516);
- avl = gpr_avl_add(avl, box(116), box(140));
+ avl = gpr_avl_add(avl, box(116), box(140), NULL);
avl = remove_int(avl, 380);
- avl = gpr_avl_add(avl, box(878), box(142));
+ avl = gpr_avl_add(avl, box(878), box(142), NULL);
avl = remove_int(avl, 439);
- avl = gpr_avl_add(avl, box(994), box(144));
+ avl = gpr_avl_add(avl, box(994), box(144), NULL);
avl = remove_int(avl, 294);
avl = remove_int(avl, 593);
- avl = gpr_avl_add(avl, box(696), box(147));
+ avl = gpr_avl_add(avl, box(696), box(147), NULL);
avl = remove_int(avl, 8);
- avl = gpr_avl_add(avl, box(881), box(149));
+ avl = gpr_avl_add(avl, box(881), box(149), NULL);
avl = remove_int(avl, 32);
avl = remove_int(avl, 242);
- avl = gpr_avl_add(avl, box(487), box(152));
- avl = gpr_avl_add(avl, box(637), box(153));
- avl = gpr_avl_add(avl, box(793), box(154));
- avl = gpr_avl_add(avl, box(696), box(155));
+ avl = gpr_avl_add(avl, box(487), box(152), NULL);
+ avl = gpr_avl_add(avl, box(637), box(153), NULL);
+ avl = gpr_avl_add(avl, box(793), box(154), NULL);
+ avl = gpr_avl_add(avl, box(696), box(155), NULL);
avl = remove_int(avl, 458);
- avl = gpr_avl_add(avl, box(828), box(157));
+ avl = gpr_avl_add(avl, box(828), box(157), NULL);
avl = remove_int(avl, 784);
avl = remove_int(avl, 274);
- avl = gpr_avl_add(avl, box(783), box(160));
+ avl = gpr_avl_add(avl, box(783), box(160), NULL);
avl = remove_int(avl, 21);
- avl = gpr_avl_add(avl, box(866), box(162));
+ avl = gpr_avl_add(avl, box(866), box(162), NULL);
avl = remove_int(avl, 919);
- avl = gpr_avl_add(avl, box(435), box(164));
+ avl = gpr_avl_add(avl, box(435), box(164), NULL);
avl = remove_int(avl, 385);
- avl = gpr_avl_add(avl, box(475), box(166));
+ avl = gpr_avl_add(avl, box(475), box(166), NULL);
avl = remove_int(avl, 339);
- avl = gpr_avl_add(avl, box(615), box(168));
+ avl = gpr_avl_add(avl, box(615), box(168), NULL);
avl = remove_int(avl, 866);
avl = remove_int(avl, 82);
avl = remove_int(avl, 271);
- avl = gpr_avl_add(avl, box(590), box(172));
- avl = gpr_avl_add(avl, box(852), box(173));
+ avl = gpr_avl_add(avl, box(590), box(172), NULL);
+ avl = gpr_avl_add(avl, box(852), box(173), NULL);
avl = remove_int(avl, 318);
avl = remove_int(avl, 82);
- avl = gpr_avl_add(avl, box(672), box(176));
+ avl = gpr_avl_add(avl, box(672), box(176), NULL);
avl = remove_int(avl, 430);
- avl = gpr_avl_add(avl, box(821), box(178));
- avl = gpr_avl_add(avl, box(365), box(179));
+ avl = gpr_avl_add(avl, box(821), box(178), NULL);
+ avl = gpr_avl_add(avl, box(365), box(179), NULL);
avl = remove_int(avl, 78);
- avl = gpr_avl_add(avl, box(700), box(181));
- avl = gpr_avl_add(avl, box(353), box(182));
+ avl = gpr_avl_add(avl, box(700), box(181), NULL);
+ avl = gpr_avl_add(avl, box(353), box(182), NULL);
avl = remove_int(avl, 492);
- avl = gpr_avl_add(avl, box(991), box(184));
+ avl = gpr_avl_add(avl, box(991), box(184), NULL);
avl = remove_int(avl, 330);
- avl = gpr_avl_add(avl, box(873), box(186));
+ avl = gpr_avl_add(avl, box(873), box(186), NULL);
avl = remove_int(avl, 589);
- avl = gpr_avl_add(avl, box(676), box(188));
- avl = gpr_avl_add(avl, box(790), box(189));
+ avl = gpr_avl_add(avl, box(676), box(188), NULL);
+ avl = gpr_avl_add(avl, box(790), box(189), NULL);
avl = remove_int(avl, 521);
avl = remove_int(avl, 47);
- avl = gpr_avl_add(avl, box(976), box(192));
- avl = gpr_avl_add(avl, box(683), box(193));
+ avl = gpr_avl_add(avl, box(976), box(192), NULL);
+ avl = gpr_avl_add(avl, box(683), box(193), NULL);
avl = remove_int(avl, 803);
avl = remove_int(avl, 1006);
- avl = gpr_avl_add(avl, box(775), box(196));
- avl = gpr_avl_add(avl, box(411), box(197));
- avl = gpr_avl_add(avl, box(697), box(198));
+ avl = gpr_avl_add(avl, box(775), box(196), NULL);
+ avl = gpr_avl_add(avl, box(411), box(197), NULL);
+ avl = gpr_avl_add(avl, box(697), box(198), NULL);
avl = remove_int(avl, 50);
- avl = gpr_avl_add(avl, box(213), box(200));
+ avl = gpr_avl_add(avl, box(213), box(200), NULL);
avl = remove_int(avl, 714);
- avl = gpr_avl_add(avl, box(981), box(202));
- avl = gpr_avl_add(avl, box(502), box(203));
- avl = gpr_avl_add(avl, box(697), box(204));
- avl = gpr_avl_add(avl, box(603), box(205));
- avl = gpr_avl_add(avl, box(117), box(206));
+ avl = gpr_avl_add(avl, box(981), box(202), NULL);
+ avl = gpr_avl_add(avl, box(502), box(203), NULL);
+ avl = gpr_avl_add(avl, box(697), box(204), NULL);
+ avl = gpr_avl_add(avl, box(603), box(205), NULL);
+ avl = gpr_avl_add(avl, box(117), box(206), NULL);
avl = remove_int(avl, 363);
- avl = gpr_avl_add(avl, box(104), box(208));
+ avl = gpr_avl_add(avl, box(104), box(208), NULL);
avl = remove_int(avl, 842);
- avl = gpr_avl_add(avl, box(48), box(210));
+ avl = gpr_avl_add(avl, box(48), box(210), NULL);
avl = remove_int(avl, 764);
- avl = gpr_avl_add(avl, box(482), box(212));
- avl = gpr_avl_add(avl, box(928), box(213));
- avl = gpr_avl_add(avl, box(30), box(214));
- avl = gpr_avl_add(avl, box(820), box(215));
- avl = gpr_avl_add(avl, box(334), box(216));
+ avl = gpr_avl_add(avl, box(482), box(212), NULL);
+ avl = gpr_avl_add(avl, box(928), box(213), NULL);
+ avl = gpr_avl_add(avl, box(30), box(214), NULL);
+ avl = gpr_avl_add(avl, box(820), box(215), NULL);
+ avl = gpr_avl_add(avl, box(334), box(216), NULL);
avl = remove_int(avl, 306);
- avl = gpr_avl_add(avl, box(789), box(218));
+ avl = gpr_avl_add(avl, box(789), box(218), NULL);
avl = remove_int(avl, 924);
- avl = gpr_avl_add(avl, box(53), box(220));
+ avl = gpr_avl_add(avl, box(53), box(220), NULL);
avl = remove_int(avl, 657);
- avl = gpr_avl_add(avl, box(130), box(222));
- avl = gpr_avl_add(avl, box(239), box(223));
+ avl = gpr_avl_add(avl, box(130), box(222), NULL);
+ avl = gpr_avl_add(avl, box(239), box(223), NULL);
avl = remove_int(avl, 20);
- avl = gpr_avl_add(avl, box(117), box(225));
+ avl = gpr_avl_add(avl, box(117), box(225), NULL);
avl = remove_int(avl, 882);
avl = remove_int(avl, 891);
- avl = gpr_avl_add(avl, box(9), box(228));
- avl = gpr_avl_add(avl, box(496), box(229));
- avl = gpr_avl_add(avl, box(750), box(230));
- avl = gpr_avl_add(avl, box(283), box(231));
- avl = gpr_avl_add(avl, box(802), box(232));
+ avl = gpr_avl_add(avl, box(9), box(228), NULL);
+ avl = gpr_avl_add(avl, box(496), box(229), NULL);
+ avl = gpr_avl_add(avl, box(750), box(230), NULL);
+ avl = gpr_avl_add(avl, box(283), box(231), NULL);
+ avl = gpr_avl_add(avl, box(802), box(232), NULL);
avl = remove_int(avl, 352);
- avl = gpr_avl_add(avl, box(374), box(234));
- avl = gpr_avl_add(avl, box(6), box(235));
- avl = gpr_avl_add(avl, box(756), box(236));
- avl = gpr_avl_add(avl, box(597), box(237));
- avl = gpr_avl_add(avl, box(661), box(238));
+ avl = gpr_avl_add(avl, box(374), box(234), NULL);
+ avl = gpr_avl_add(avl, box(6), box(235), NULL);
+ avl = gpr_avl_add(avl, box(756), box(236), NULL);
+ avl = gpr_avl_add(avl, box(597), box(237), NULL);
+ avl = gpr_avl_add(avl, box(661), box(238), NULL);
avl = remove_int(avl, 96);
- avl = gpr_avl_add(avl, box(894), box(240));
+ avl = gpr_avl_add(avl, box(894), box(240), NULL);
avl = remove_int(avl, 749);
- avl = gpr_avl_add(avl, box(71), box(242));
+ avl = gpr_avl_add(avl, box(71), box(242), NULL);
avl = remove_int(avl, 68);
- avl = gpr_avl_add(avl, box(388), box(244));
+ avl = gpr_avl_add(avl, box(388), box(244), NULL);
avl = remove_int(avl, 119);
avl = remove_int(avl, 856);
- avl = gpr_avl_add(avl, box(176), box(247));
- avl = gpr_avl_add(avl, box(993), box(248));
+ avl = gpr_avl_add(avl, box(176), box(247), NULL);
+ avl = gpr_avl_add(avl, box(993), box(248), NULL);
avl = remove_int(avl, 178);
avl = remove_int(avl, 781);
avl = remove_int(avl, 771);
@@ -499,37 +501,37 @@ static void test_badcase2(void) {
avl = remove_int(avl, 157);
avl = remove_int(avl, 142);
avl = remove_int(avl, 686);
- avl = gpr_avl_add(avl, box(779), box(257));
- avl = gpr_avl_add(avl, box(484), box(258));
+ avl = gpr_avl_add(avl, box(779), box(257), NULL);
+ avl = gpr_avl_add(avl, box(484), box(258), NULL);
avl = remove_int(avl, 837);
- avl = gpr_avl_add(avl, box(388), box(260));
+ avl = gpr_avl_add(avl, box(388), box(260), NULL);
avl = remove_int(avl, 987);
- avl = gpr_avl_add(avl, box(336), box(262));
+ avl = gpr_avl_add(avl, box(336), box(262), NULL);
avl = remove_int(avl, 855);
- avl = gpr_avl_add(avl, box(668), box(264));
+ avl = gpr_avl_add(avl, box(668), box(264), NULL);
avl = remove_int(avl, 648);
- avl = gpr_avl_add(avl, box(193), box(266));
+ avl = gpr_avl_add(avl, box(193), box(266), NULL);
avl = remove_int(avl, 939);
- avl = gpr_avl_add(avl, box(740), box(268));
- avl = gpr_avl_add(avl, box(503), box(269));
- avl = gpr_avl_add(avl, box(765), box(270));
+ avl = gpr_avl_add(avl, box(740), box(268), NULL);
+ avl = gpr_avl_add(avl, box(503), box(269), NULL);
+ avl = gpr_avl_add(avl, box(765), box(270), NULL);
avl = remove_int(avl, 924);
avl = remove_int(avl, 513);
- avl = gpr_avl_add(avl, box(161), box(273));
- avl = gpr_avl_add(avl, box(502), box(274));
- avl = gpr_avl_add(avl, box(846), box(275));
+ avl = gpr_avl_add(avl, box(161), box(273), NULL);
+ avl = gpr_avl_add(avl, box(502), box(274), NULL);
+ avl = gpr_avl_add(avl, box(846), box(275), NULL);
avl = remove_int(avl, 931);
- avl = gpr_avl_add(avl, box(87), box(277));
- avl = gpr_avl_add(avl, box(949), box(278));
- avl = gpr_avl_add(avl, box(548), box(279));
- avl = gpr_avl_add(avl, box(951), box(280));
+ avl = gpr_avl_add(avl, box(87), box(277), NULL);
+ avl = gpr_avl_add(avl, box(949), box(278), NULL);
+ avl = gpr_avl_add(avl, box(548), box(279), NULL);
+ avl = gpr_avl_add(avl, box(951), box(280), NULL);
avl = remove_int(avl, 1018);
avl = remove_int(avl, 568);
- avl = gpr_avl_add(avl, box(138), box(283));
- avl = gpr_avl_add(avl, box(202), box(284));
- avl = gpr_avl_add(avl, box(157), box(285));
- avl = gpr_avl_add(avl, box(264), box(286));
- avl = gpr_avl_add(avl, box(370), box(287));
+ avl = gpr_avl_add(avl, box(138), box(283), NULL);
+ avl = gpr_avl_add(avl, box(202), box(284), NULL);
+ avl = gpr_avl_add(avl, box(157), box(285), NULL);
+ avl = gpr_avl_add(avl, box(264), box(286), NULL);
+ avl = gpr_avl_add(avl, box(370), box(287), NULL);
avl = remove_int(avl, 736);
avl = remove_int(avl, 751);
avl = remove_int(avl, 506);
@@ -537,524 +539,524 @@ static void test_badcase2(void) {
avl = remove_int(avl, 358);
avl = remove_int(avl, 657);
avl = remove_int(avl, 86);
- avl = gpr_avl_add(avl, box(876), box(295));
+ avl = gpr_avl_add(avl, box(876), box(295), NULL);
avl = remove_int(avl, 354);
- avl = gpr_avl_add(avl, box(134), box(297));
+ avl = gpr_avl_add(avl, box(134), box(297), NULL);
avl = remove_int(avl, 781);
avl = remove_int(avl, 183);
- avl = gpr_avl_add(avl, box(914), box(300));
+ avl = gpr_avl_add(avl, box(914), box(300), NULL);
avl = remove_int(avl, 926);
avl = remove_int(avl, 398);
avl = remove_int(avl, 932);
avl = remove_int(avl, 804);
avl = remove_int(avl, 326);
- avl = gpr_avl_add(avl, box(208), box(306));
- avl = gpr_avl_add(avl, box(699), box(307));
+ avl = gpr_avl_add(avl, box(208), box(306), NULL);
+ avl = gpr_avl_add(avl, box(699), box(307), NULL);
avl = remove_int(avl, 576);
avl = remove_int(avl, 850);
avl = remove_int(avl, 514);
avl = remove_int(avl, 676);
avl = remove_int(avl, 549);
avl = remove_int(avl, 767);
- avl = gpr_avl_add(avl, box(58), box(314));
- avl = gpr_avl_add(avl, box(265), box(315));
- avl = gpr_avl_add(avl, box(268), box(316));
- avl = gpr_avl_add(avl, box(103), box(317));
- avl = gpr_avl_add(avl, box(440), box(318));
+ avl = gpr_avl_add(avl, box(58), box(314), NULL);
+ avl = gpr_avl_add(avl, box(265), box(315), NULL);
+ avl = gpr_avl_add(avl, box(268), box(316), NULL);
+ avl = gpr_avl_add(avl, box(103), box(317), NULL);
+ avl = gpr_avl_add(avl, box(440), box(318), NULL);
avl = remove_int(avl, 777);
- avl = gpr_avl_add(avl, box(670), box(320));
+ avl = gpr_avl_add(avl, box(670), box(320), NULL);
avl = remove_int(avl, 506);
avl = remove_int(avl, 487);
- avl = gpr_avl_add(avl, box(421), box(323));
+ avl = gpr_avl_add(avl, box(421), box(323), NULL);
avl = remove_int(avl, 514);
- avl = gpr_avl_add(avl, box(701), box(325));
+ avl = gpr_avl_add(avl, box(701), box(325), NULL);
avl = remove_int(avl, 949);
avl = remove_int(avl, 872);
avl = remove_int(avl, 139);
- avl = gpr_avl_add(avl, box(781), box(329));
- avl = gpr_avl_add(avl, box(543), box(330));
- avl = gpr_avl_add(avl, box(147), box(331));
+ avl = gpr_avl_add(avl, box(781), box(329), NULL);
+ avl = gpr_avl_add(avl, box(543), box(330), NULL);
+ avl = gpr_avl_add(avl, box(147), box(331), NULL);
avl = remove_int(avl, 190);
- avl = gpr_avl_add(avl, box(453), box(333));
+ avl = gpr_avl_add(avl, box(453), box(333), NULL);
avl = remove_int(avl, 262);
avl = remove_int(avl, 850);
avl = remove_int(avl, 286);
avl = remove_int(avl, 787);
- avl = gpr_avl_add(avl, box(514), box(338));
+ avl = gpr_avl_add(avl, box(514), box(338), NULL);
avl = remove_int(avl, 812);
- avl = gpr_avl_add(avl, box(431), box(340));
- avl = gpr_avl_add(avl, box(8), box(341));
+ avl = gpr_avl_add(avl, box(431), box(340), NULL);
+ avl = gpr_avl_add(avl, box(8), box(341), NULL);
avl = remove_int(avl, 843);
- avl = gpr_avl_add(avl, box(831), box(343));
+ avl = gpr_avl_add(avl, box(831), box(343), NULL);
avl = remove_int(avl, 472);
avl = remove_int(avl, 157);
- avl = gpr_avl_add(avl, box(612), box(346));
- avl = gpr_avl_add(avl, box(802), box(347));
+ avl = gpr_avl_add(avl, box(612), box(346), NULL);
+ avl = gpr_avl_add(avl, box(802), box(347), NULL);
avl = remove_int(avl, 554);
- avl = gpr_avl_add(avl, box(409), box(349));
- avl = gpr_avl_add(avl, box(439), box(350));
- avl = gpr_avl_add(avl, box(725), box(351));
- avl = gpr_avl_add(avl, box(568), box(352));
+ avl = gpr_avl_add(avl, box(409), box(349), NULL);
+ avl = gpr_avl_add(avl, box(439), box(350), NULL);
+ avl = gpr_avl_add(avl, box(725), box(351), NULL);
+ avl = gpr_avl_add(avl, box(568), box(352), NULL);
avl = remove_int(avl, 475);
avl = remove_int(avl, 672);
avl = remove_int(avl, 62);
avl = remove_int(avl, 753);
- avl = gpr_avl_add(avl, box(435), box(357));
- avl = gpr_avl_add(avl, box(950), box(358));
- avl = gpr_avl_add(avl, box(532), box(359));
- avl = gpr_avl_add(avl, box(832), box(360));
+ avl = gpr_avl_add(avl, box(435), box(357), NULL);
+ avl = gpr_avl_add(avl, box(950), box(358), NULL);
+ avl = gpr_avl_add(avl, box(532), box(359), NULL);
+ avl = gpr_avl_add(avl, box(832), box(360), NULL);
avl = remove_int(avl, 390);
- avl = gpr_avl_add(avl, box(993), box(362));
+ avl = gpr_avl_add(avl, box(993), box(362), NULL);
avl = remove_int(avl, 198);
avl = remove_int(avl, 401);
- avl = gpr_avl_add(avl, box(316), box(365));
+ avl = gpr_avl_add(avl, box(316), box(365), NULL);
avl = remove_int(avl, 843);
- avl = gpr_avl_add(avl, box(541), box(367));
- avl = gpr_avl_add(avl, box(505), box(368));
+ avl = gpr_avl_add(avl, box(541), box(367), NULL);
+ avl = gpr_avl_add(avl, box(505), box(368), NULL);
avl = remove_int(avl, 445);
avl = remove_int(avl, 256);
- avl = gpr_avl_add(avl, box(232), box(371));
+ avl = gpr_avl_add(avl, box(232), box(371), NULL);
avl = remove_int(avl, 577);
avl = remove_int(avl, 558);
- avl = gpr_avl_add(avl, box(910), box(374));
+ avl = gpr_avl_add(avl, box(910), box(374), NULL);
avl = remove_int(avl, 902);
avl = remove_int(avl, 755);
avl = remove_int(avl, 114);
avl = remove_int(avl, 438);
avl = remove_int(avl, 224);
- avl = gpr_avl_add(avl, box(920), box(380));
- avl = gpr_avl_add(avl, box(655), box(381));
+ avl = gpr_avl_add(avl, box(920), box(380), NULL);
+ avl = gpr_avl_add(avl, box(655), box(381), NULL);
avl = remove_int(avl, 557);
avl = remove_int(avl, 102);
avl = remove_int(avl, 165);
- avl = gpr_avl_add(avl, box(191), box(385));
+ avl = gpr_avl_add(avl, box(191), box(385), NULL);
avl = remove_int(avl, 30);
- avl = gpr_avl_add(avl, box(406), box(387));
- avl = gpr_avl_add(avl, box(66), box(388));
- avl = gpr_avl_add(avl, box(87), box(389));
+ avl = gpr_avl_add(avl, box(406), box(387), NULL);
+ avl = gpr_avl_add(avl, box(66), box(388), NULL);
+ avl = gpr_avl_add(avl, box(87), box(389), NULL);
avl = remove_int(avl, 7);
avl = remove_int(avl, 671);
- avl = gpr_avl_add(avl, box(234), box(392));
+ avl = gpr_avl_add(avl, box(234), box(392), NULL);
avl = remove_int(avl, 463);
- avl = gpr_avl_add(avl, box(75), box(394));
- avl = gpr_avl_add(avl, box(487), box(395));
+ avl = gpr_avl_add(avl, box(75), box(394), NULL);
+ avl = gpr_avl_add(avl, box(487), box(395), NULL);
avl = remove_int(avl, 203);
- avl = gpr_avl_add(avl, box(711), box(397));
+ avl = gpr_avl_add(avl, box(711), box(397), NULL);
avl = remove_int(avl, 291);
avl = remove_int(avl, 798);
avl = remove_int(avl, 337);
- avl = gpr_avl_add(avl, box(877), box(401));
- avl = gpr_avl_add(avl, box(388), box(402));
+ avl = gpr_avl_add(avl, box(877), box(401), NULL);
+ avl = gpr_avl_add(avl, box(388), box(402), NULL);
avl = remove_int(avl, 975);
- avl = gpr_avl_add(avl, box(200), box(404));
- avl = gpr_avl_add(avl, box(408), box(405));
- avl = gpr_avl_add(avl, box(3), box(406));
- avl = gpr_avl_add(avl, box(971), box(407));
+ avl = gpr_avl_add(avl, box(200), box(404), NULL);
+ avl = gpr_avl_add(avl, box(408), box(405), NULL);
+ avl = gpr_avl_add(avl, box(3), box(406), NULL);
+ avl = gpr_avl_add(avl, box(971), box(407), NULL);
avl = remove_int(avl, 841);
avl = remove_int(avl, 910);
avl = remove_int(avl, 74);
avl = remove_int(avl, 888);
- avl = gpr_avl_add(avl, box(492), box(412));
+ avl = gpr_avl_add(avl, box(492), box(412), NULL);
avl = remove_int(avl, 14);
avl = remove_int(avl, 364);
- avl = gpr_avl_add(avl, box(215), box(415));
+ avl = gpr_avl_add(avl, box(215), box(415), NULL);
avl = remove_int(avl, 778);
avl = remove_int(avl, 45);
- avl = gpr_avl_add(avl, box(328), box(418));
- avl = gpr_avl_add(avl, box(597), box(419));
+ avl = gpr_avl_add(avl, box(328), box(418), NULL);
+ avl = gpr_avl_add(avl, box(597), box(419), NULL);
avl = remove_int(avl, 34);
- avl = gpr_avl_add(avl, box(736), box(421));
+ avl = gpr_avl_add(avl, box(736), box(421), NULL);
avl = remove_int(avl, 37);
- avl = gpr_avl_add(avl, box(275), box(423));
- avl = gpr_avl_add(avl, box(70), box(424));
- avl = gpr_avl_add(avl, box(771), box(425));
+ avl = gpr_avl_add(avl, box(275), box(423), NULL);
+ avl = gpr_avl_add(avl, box(70), box(424), NULL);
+ avl = gpr_avl_add(avl, box(771), box(425), NULL);
avl = remove_int(avl, 536);
avl = remove_int(avl, 421);
- avl = gpr_avl_add(avl, box(186), box(428));
- avl = gpr_avl_add(avl, box(788), box(429));
- avl = gpr_avl_add(avl, box(224), box(430));
+ avl = gpr_avl_add(avl, box(186), box(428), NULL);
+ avl = gpr_avl_add(avl, box(788), box(429), NULL);
+ avl = gpr_avl_add(avl, box(224), box(430), NULL);
avl = remove_int(avl, 228);
- avl = gpr_avl_add(avl, box(48), box(432));
- avl = gpr_avl_add(avl, box(120), box(433));
- avl = gpr_avl_add(avl, box(269), box(434));
- avl = gpr_avl_add(avl, box(904), box(435));
+ avl = gpr_avl_add(avl, box(48), box(432), NULL);
+ avl = gpr_avl_add(avl, box(120), box(433), NULL);
+ avl = gpr_avl_add(avl, box(269), box(434), NULL);
+ avl = gpr_avl_add(avl, box(904), box(435), NULL);
avl = remove_int(avl, 699);
- avl = gpr_avl_add(avl, box(340), box(437));
+ avl = gpr_avl_add(avl, box(340), box(437), NULL);
avl = remove_int(avl, 276);
- avl = gpr_avl_add(avl, box(591), box(439));
- avl = gpr_avl_add(avl, box(778), box(440));
+ avl = gpr_avl_add(avl, box(591), box(439), NULL);
+ avl = gpr_avl_add(avl, box(778), box(440), NULL);
avl = remove_int(avl, 490);
avl = remove_int(avl, 973);
- avl = gpr_avl_add(avl, box(294), box(443));
- avl = gpr_avl_add(avl, box(323), box(444));
+ avl = gpr_avl_add(avl, box(294), box(443), NULL);
+ avl = gpr_avl_add(avl, box(323), box(444), NULL);
avl = remove_int(avl, 685);
- avl = gpr_avl_add(avl, box(38), box(446));
- avl = gpr_avl_add(avl, box(525), box(447));
+ avl = gpr_avl_add(avl, box(38), box(446), NULL);
+ avl = gpr_avl_add(avl, box(525), box(447), NULL);
avl = remove_int(avl, 162);
- avl = gpr_avl_add(avl, box(462), box(449));
- avl = gpr_avl_add(avl, box(340), box(450));
+ avl = gpr_avl_add(avl, box(462), box(449), NULL);
+ avl = gpr_avl_add(avl, box(340), box(450), NULL);
avl = remove_int(avl, 734);
avl = remove_int(avl, 959);
- avl = gpr_avl_add(avl, box(752), box(453));
- avl = gpr_avl_add(avl, box(667), box(454));
+ avl = gpr_avl_add(avl, box(752), box(453), NULL);
+ avl = gpr_avl_add(avl, box(667), box(454), NULL);
avl = remove_int(avl, 558);
avl = remove_int(avl, 657);
- avl = gpr_avl_add(avl, box(711), box(457));
+ avl = gpr_avl_add(avl, box(711), box(457), NULL);
avl = remove_int(avl, 937);
- avl = gpr_avl_add(avl, box(741), box(459));
- avl = gpr_avl_add(avl, box(40), box(460));
+ avl = gpr_avl_add(avl, box(741), box(459), NULL);
+ avl = gpr_avl_add(avl, box(40), box(460), NULL);
avl = remove_int(avl, 784);
- avl = gpr_avl_add(avl, box(292), box(462));
+ avl = gpr_avl_add(avl, box(292), box(462), NULL);
avl = remove_int(avl, 164);
avl = remove_int(avl, 931);
avl = remove_int(avl, 886);
- avl = gpr_avl_add(avl, box(968), box(466));
+ avl = gpr_avl_add(avl, box(968), box(466), NULL);
avl = remove_int(avl, 263);
- avl = gpr_avl_add(avl, box(647), box(468));
- avl = gpr_avl_add(avl, box(92), box(469));
+ avl = gpr_avl_add(avl, box(647), box(468), NULL);
+ avl = gpr_avl_add(avl, box(92), box(469), NULL);
avl = remove_int(avl, 310);
- avl = gpr_avl_add(avl, box(711), box(471));
- avl = gpr_avl_add(avl, box(675), box(472));
+ avl = gpr_avl_add(avl, box(711), box(471), NULL);
+ avl = gpr_avl_add(avl, box(675), box(472), NULL);
avl = remove_int(avl, 549);
- avl = gpr_avl_add(avl, box(380), box(474));
+ avl = gpr_avl_add(avl, box(380), box(474), NULL);
avl = remove_int(avl, 825);
- avl = gpr_avl_add(avl, box(668), box(476));
+ avl = gpr_avl_add(avl, box(668), box(476), NULL);
avl = remove_int(avl, 498);
- avl = gpr_avl_add(avl, box(870), box(478));
- avl = gpr_avl_add(avl, box(391), box(479));
- avl = gpr_avl_add(avl, box(264), box(480));
+ avl = gpr_avl_add(avl, box(870), box(478), NULL);
+ avl = gpr_avl_add(avl, box(391), box(479), NULL);
+ avl = gpr_avl_add(avl, box(264), box(480), NULL);
avl = remove_int(avl, 1);
avl = remove_int(avl, 849);
avl = remove_int(avl, 88);
avl = remove_int(avl, 255);
avl = remove_int(avl, 763);
avl = remove_int(avl, 831);
- avl = gpr_avl_add(avl, box(508), box(487));
+ avl = gpr_avl_add(avl, box(508), box(487), NULL);
avl = remove_int(avl, 849);
avl = remove_int(avl, 47);
- avl = gpr_avl_add(avl, box(299), box(490));
+ avl = gpr_avl_add(avl, box(299), box(490), NULL);
avl = remove_int(avl, 625);
avl = remove_int(avl, 433);
avl = remove_int(avl, 904);
avl = remove_int(avl, 761);
- avl = gpr_avl_add(avl, box(33), box(495));
- avl = gpr_avl_add(avl, box(524), box(496));
+ avl = gpr_avl_add(avl, box(33), box(495), NULL);
+ avl = gpr_avl_add(avl, box(524), box(496), NULL);
avl = remove_int(avl, 210);
avl = remove_int(avl, 299);
- avl = gpr_avl_add(avl, box(823), box(499));
+ avl = gpr_avl_add(avl, box(823), box(499), NULL);
avl = remove_int(avl, 479);
avl = remove_int(avl, 96);
avl = remove_int(avl, 1013);
- avl = gpr_avl_add(avl, box(768), box(503));
+ avl = gpr_avl_add(avl, box(768), box(503), NULL);
avl = remove_int(avl, 638);
avl = remove_int(avl, 20);
- avl = gpr_avl_add(avl, box(663), box(506));
+ avl = gpr_avl_add(avl, box(663), box(506), NULL);
avl = remove_int(avl, 882);
- avl = gpr_avl_add(avl, box(745), box(508));
+ avl = gpr_avl_add(avl, box(745), box(508), NULL);
avl = remove_int(avl, 352);
- avl = gpr_avl_add(avl, box(10), box(510));
+ avl = gpr_avl_add(avl, box(10), box(510), NULL);
avl = remove_int(avl, 484);
- avl = gpr_avl_add(avl, box(420), box(512));
- avl = gpr_avl_add(avl, box(884), box(513));
- avl = gpr_avl_add(avl, box(993), box(514));
- avl = gpr_avl_add(avl, box(251), box(515));
+ avl = gpr_avl_add(avl, box(420), box(512), NULL);
+ avl = gpr_avl_add(avl, box(884), box(513), NULL);
+ avl = gpr_avl_add(avl, box(993), box(514), NULL);
+ avl = gpr_avl_add(avl, box(251), box(515), NULL);
avl = remove_int(avl, 222);
- avl = gpr_avl_add(avl, box(734), box(517));
- avl = gpr_avl_add(avl, box(952), box(518));
+ avl = gpr_avl_add(avl, box(734), box(517), NULL);
+ avl = gpr_avl_add(avl, box(952), box(518), NULL);
avl = remove_int(avl, 26);
avl = remove_int(avl, 270);
avl = remove_int(avl, 481);
avl = remove_int(avl, 693);
avl = remove_int(avl, 1006);
- avl = gpr_avl_add(avl, box(77), box(524));
+ avl = gpr_avl_add(avl, box(77), box(524), NULL);
avl = remove_int(avl, 897);
- avl = gpr_avl_add(avl, box(719), box(526));
- avl = gpr_avl_add(avl, box(622), box(527));
+ avl = gpr_avl_add(avl, box(719), box(526), NULL);
+ avl = gpr_avl_add(avl, box(622), box(527), NULL);
avl = remove_int(avl, 28);
avl = remove_int(avl, 836);
avl = remove_int(avl, 142);
- avl = gpr_avl_add(avl, box(445), box(531));
- avl = gpr_avl_add(avl, box(410), box(532));
+ avl = gpr_avl_add(avl, box(445), box(531), NULL);
+ avl = gpr_avl_add(avl, box(410), box(532), NULL);
avl = remove_int(avl, 575);
- avl = gpr_avl_add(avl, box(634), box(534));
- avl = gpr_avl_add(avl, box(906), box(535));
+ avl = gpr_avl_add(avl, box(634), box(534), NULL);
+ avl = gpr_avl_add(avl, box(906), box(535), NULL);
avl = remove_int(avl, 649);
- avl = gpr_avl_add(avl, box(813), box(537));
+ avl = gpr_avl_add(avl, box(813), box(537), NULL);
avl = remove_int(avl, 702);
avl = remove_int(avl, 732);
- avl = gpr_avl_add(avl, box(105), box(540));
- avl = gpr_avl_add(avl, box(867), box(541));
+ avl = gpr_avl_add(avl, box(105), box(540), NULL);
+ avl = gpr_avl_add(avl, box(867), box(541), NULL);
avl = remove_int(avl, 964);
avl = remove_int(avl, 941);
- avl = gpr_avl_add(avl, box(947), box(544));
+ avl = gpr_avl_add(avl, box(947), box(544), NULL);
avl = remove_int(avl, 990);
- avl = gpr_avl_add(avl, box(816), box(546));
+ avl = gpr_avl_add(avl, box(816), box(546), NULL);
avl = remove_int(avl, 429);
avl = remove_int(avl, 567);
avl = remove_int(avl, 541);
avl = remove_int(avl, 583);
- avl = gpr_avl_add(avl, box(57), box(551));
- avl = gpr_avl_add(avl, box(786), box(552));
- avl = gpr_avl_add(avl, box(526), box(553));
+ avl = gpr_avl_add(avl, box(57), box(551), NULL);
+ avl = gpr_avl_add(avl, box(786), box(552), NULL);
+ avl = gpr_avl_add(avl, box(526), box(553), NULL);
avl = remove_int(avl, 642);
avl = remove_int(avl, 220);
avl = remove_int(avl, 840);
avl = remove_int(avl, 548);
- avl = gpr_avl_add(avl, box(528), box(558));
- avl = gpr_avl_add(avl, box(749), box(559));
- avl = gpr_avl_add(avl, box(194), box(560));
+ avl = gpr_avl_add(avl, box(528), box(558), NULL);
+ avl = gpr_avl_add(avl, box(749), box(559), NULL);
+ avl = gpr_avl_add(avl, box(194), box(560), NULL);
avl = remove_int(avl, 517);
- avl = gpr_avl_add(avl, box(102), box(562));
+ avl = gpr_avl_add(avl, box(102), box(562), NULL);
avl = remove_int(avl, 189);
- avl = gpr_avl_add(avl, box(927), box(564));
+ avl = gpr_avl_add(avl, box(927), box(564), NULL);
avl = remove_int(avl, 846);
avl = remove_int(avl, 130);
- avl = gpr_avl_add(avl, box(694), box(567));
+ avl = gpr_avl_add(avl, box(694), box(567), NULL);
avl = remove_int(avl, 750);
- avl = gpr_avl_add(avl, box(357), box(569));
+ avl = gpr_avl_add(avl, box(357), box(569), NULL);
avl = remove_int(avl, 431);
avl = remove_int(avl, 91);
- avl = gpr_avl_add(avl, box(640), box(572));
+ avl = gpr_avl_add(avl, box(640), box(572), NULL);
avl = remove_int(avl, 4);
- avl = gpr_avl_add(avl, box(81), box(574));
- avl = gpr_avl_add(avl, box(595), box(575));
+ avl = gpr_avl_add(avl, box(81), box(574), NULL);
+ avl = gpr_avl_add(avl, box(595), box(575), NULL);
avl = remove_int(avl, 444);
avl = remove_int(avl, 262);
avl = remove_int(avl, 11);
- avl = gpr_avl_add(avl, box(192), box(579));
- avl = gpr_avl_add(avl, box(158), box(580));
+ avl = gpr_avl_add(avl, box(192), box(579), NULL);
+ avl = gpr_avl_add(avl, box(158), box(580), NULL);
avl = remove_int(avl, 401);
avl = remove_int(avl, 918);
- avl = gpr_avl_add(avl, box(180), box(583));
+ avl = gpr_avl_add(avl, box(180), box(583), NULL);
avl = remove_int(avl, 268);
- avl = gpr_avl_add(avl, box(1012), box(585));
- avl = gpr_avl_add(avl, box(90), box(586));
- avl = gpr_avl_add(avl, box(946), box(587));
+ avl = gpr_avl_add(avl, box(1012), box(585), NULL);
+ avl = gpr_avl_add(avl, box(90), box(586), NULL);
+ avl = gpr_avl_add(avl, box(946), box(587), NULL);
avl = remove_int(avl, 719);
- avl = gpr_avl_add(avl, box(874), box(589));
- avl = gpr_avl_add(avl, box(679), box(590));
+ avl = gpr_avl_add(avl, box(874), box(589), NULL);
+ avl = gpr_avl_add(avl, box(679), box(590), NULL);
avl = remove_int(avl, 53);
avl = remove_int(avl, 534);
- avl = gpr_avl_add(avl, box(646), box(593));
- avl = gpr_avl_add(avl, box(767), box(594));
- avl = gpr_avl_add(avl, box(460), box(595));
- avl = gpr_avl_add(avl, box(852), box(596));
- avl = gpr_avl_add(avl, box(189), box(597));
+ avl = gpr_avl_add(avl, box(646), box(593), NULL);
+ avl = gpr_avl_add(avl, box(767), box(594), NULL);
+ avl = gpr_avl_add(avl, box(460), box(595), NULL);
+ avl = gpr_avl_add(avl, box(852), box(596), NULL);
+ avl = gpr_avl_add(avl, box(189), box(597), NULL);
avl = remove_int(avl, 932);
avl = remove_int(avl, 366);
avl = remove_int(avl, 907);
- avl = gpr_avl_add(avl, box(875), box(601));
- avl = gpr_avl_add(avl, box(434), box(602));
- avl = gpr_avl_add(avl, box(704), box(603));
- avl = gpr_avl_add(avl, box(724), box(604));
- avl = gpr_avl_add(avl, box(930), box(605));
- avl = gpr_avl_add(avl, box(1000), box(606));
+ avl = gpr_avl_add(avl, box(875), box(601), NULL);
+ avl = gpr_avl_add(avl, box(434), box(602), NULL);
+ avl = gpr_avl_add(avl, box(704), box(603), NULL);
+ avl = gpr_avl_add(avl, box(724), box(604), NULL);
+ avl = gpr_avl_add(avl, box(930), box(605), NULL);
+ avl = gpr_avl_add(avl, box(1000), box(606), NULL);
avl = remove_int(avl, 479);
- avl = gpr_avl_add(avl, box(275), box(608));
+ avl = gpr_avl_add(avl, box(275), box(608), NULL);
avl = remove_int(avl, 32);
- avl = gpr_avl_add(avl, box(939), box(610));
+ avl = gpr_avl_add(avl, box(939), box(610), NULL);
avl = remove_int(avl, 943);
avl = remove_int(avl, 329);
- avl = gpr_avl_add(avl, box(490), box(613));
+ avl = gpr_avl_add(avl, box(490), box(613), NULL);
avl = remove_int(avl, 477);
avl = remove_int(avl, 414);
avl = remove_int(avl, 187);
avl = remove_int(avl, 334);
- avl = gpr_avl_add(avl, box(40), box(618));
+ avl = gpr_avl_add(avl, box(40), box(618), NULL);
avl = remove_int(avl, 751);
- avl = gpr_avl_add(avl, box(568), box(620));
- avl = gpr_avl_add(avl, box(120), box(621));
- avl = gpr_avl_add(avl, box(617), box(622));
- avl = gpr_avl_add(avl, box(32), box(623));
+ avl = gpr_avl_add(avl, box(568), box(620), NULL);
+ avl = gpr_avl_add(avl, box(120), box(621), NULL);
+ avl = gpr_avl_add(avl, box(617), box(622), NULL);
+ avl = gpr_avl_add(avl, box(32), box(623), NULL);
avl = remove_int(avl, 701);
- avl = gpr_avl_add(avl, box(910), box(625));
+ avl = gpr_avl_add(avl, box(910), box(625), NULL);
avl = remove_int(avl, 557);
avl = remove_int(avl, 361);
avl = remove_int(avl, 937);
avl = remove_int(avl, 100);
avl = remove_int(avl, 684);
- avl = gpr_avl_add(avl, box(751), box(631));
+ avl = gpr_avl_add(avl, box(751), box(631), NULL);
avl = remove_int(avl, 781);
avl = remove_int(avl, 469);
avl = remove_int(avl, 75);
avl = remove_int(avl, 561);
- avl = gpr_avl_add(avl, box(854), box(636));
+ avl = gpr_avl_add(avl, box(854), box(636), NULL);
avl = remove_int(avl, 164);
avl = remove_int(avl, 258);
avl = remove_int(avl, 315);
avl = remove_int(avl, 261);
- avl = gpr_avl_add(avl, box(552), box(641));
- avl = gpr_avl_add(avl, box(6), box(642));
- avl = gpr_avl_add(avl, box(680), box(643));
+ avl = gpr_avl_add(avl, box(552), box(641), NULL);
+ avl = gpr_avl_add(avl, box(6), box(642), NULL);
+ avl = gpr_avl_add(avl, box(680), box(643), NULL);
avl = remove_int(avl, 741);
avl = remove_int(avl, 309);
avl = remove_int(avl, 272);
- avl = gpr_avl_add(avl, box(249), box(647));
+ avl = gpr_avl_add(avl, box(249), box(647), NULL);
avl = remove_int(avl, 97);
avl = remove_int(avl, 850);
- avl = gpr_avl_add(avl, box(915), box(650));
- avl = gpr_avl_add(avl, box(816), box(651));
- avl = gpr_avl_add(avl, box(45), box(652));
- avl = gpr_avl_add(avl, box(168), box(653));
+ avl = gpr_avl_add(avl, box(915), box(650), NULL);
+ avl = gpr_avl_add(avl, box(816), box(651), NULL);
+ avl = gpr_avl_add(avl, box(45), box(652), NULL);
+ avl = gpr_avl_add(avl, box(168), box(653), NULL);
avl = remove_int(avl, 153);
avl = remove_int(avl, 239);
- avl = gpr_avl_add(avl, box(684), box(656));
- avl = gpr_avl_add(avl, box(208), box(657));
- avl = gpr_avl_add(avl, box(681), box(658));
- avl = gpr_avl_add(avl, box(609), box(659));
- avl = gpr_avl_add(avl, box(645), box(660));
+ avl = gpr_avl_add(avl, box(684), box(656), NULL);
+ avl = gpr_avl_add(avl, box(208), box(657), NULL);
+ avl = gpr_avl_add(avl, box(681), box(658), NULL);
+ avl = gpr_avl_add(avl, box(609), box(659), NULL);
+ avl = gpr_avl_add(avl, box(645), box(660), NULL);
avl = remove_int(avl, 799);
- avl = gpr_avl_add(avl, box(955), box(662));
- avl = gpr_avl_add(avl, box(946), box(663));
- avl = gpr_avl_add(avl, box(744), box(664));
- avl = gpr_avl_add(avl, box(201), box(665));
- avl = gpr_avl_add(avl, box(136), box(666));
+ avl = gpr_avl_add(avl, box(955), box(662), NULL);
+ avl = gpr_avl_add(avl, box(946), box(663), NULL);
+ avl = gpr_avl_add(avl, box(744), box(664), NULL);
+ avl = gpr_avl_add(avl, box(201), box(665), NULL);
+ avl = gpr_avl_add(avl, box(136), box(666), NULL);
avl = remove_int(avl, 357);
- avl = gpr_avl_add(avl, box(974), box(668));
+ avl = gpr_avl_add(avl, box(974), box(668), NULL);
avl = remove_int(avl, 485);
- avl = gpr_avl_add(avl, box(1009), box(670));
- avl = gpr_avl_add(avl, box(517), box(671));
+ avl = gpr_avl_add(avl, box(1009), box(670), NULL);
+ avl = gpr_avl_add(avl, box(517), box(671), NULL);
avl = remove_int(avl, 491);
- avl = gpr_avl_add(avl, box(336), box(673));
- avl = gpr_avl_add(avl, box(589), box(674));
+ avl = gpr_avl_add(avl, box(336), box(673), NULL);
+ avl = gpr_avl_add(avl, box(589), box(674), NULL);
avl = remove_int(avl, 546);
avl = remove_int(avl, 840);
avl = remove_int(avl, 104);
avl = remove_int(avl, 347);
- avl = gpr_avl_add(avl, box(801), box(679));
+ avl = gpr_avl_add(avl, box(801), box(679), NULL);
avl = remove_int(avl, 799);
avl = remove_int(avl, 702);
avl = remove_int(avl, 996);
avl = remove_int(avl, 93);
- avl = gpr_avl_add(avl, box(561), box(684));
- avl = gpr_avl_add(avl, box(25), box(685));
+ avl = gpr_avl_add(avl, box(561), box(684), NULL);
+ avl = gpr_avl_add(avl, box(25), box(685), NULL);
avl = remove_int(avl, 278);
- avl = gpr_avl_add(avl, box(191), box(687));
+ avl = gpr_avl_add(avl, box(191), box(687), NULL);
avl = remove_int(avl, 243);
avl = remove_int(avl, 918);
avl = remove_int(avl, 449);
- avl = gpr_avl_add(avl, box(19), box(691));
- avl = gpr_avl_add(avl, box(762), box(692));
- avl = gpr_avl_add(avl, box(13), box(693));
- avl = gpr_avl_add(avl, box(151), box(694));
- avl = gpr_avl_add(avl, box(152), box(695));
- avl = gpr_avl_add(avl, box(793), box(696));
+ avl = gpr_avl_add(avl, box(19), box(691), NULL);
+ avl = gpr_avl_add(avl, box(762), box(692), NULL);
+ avl = gpr_avl_add(avl, box(13), box(693), NULL);
+ avl = gpr_avl_add(avl, box(151), box(694), NULL);
+ avl = gpr_avl_add(avl, box(152), box(695), NULL);
+ avl = gpr_avl_add(avl, box(793), box(696), NULL);
avl = remove_int(avl, 862);
avl = remove_int(avl, 890);
- avl = gpr_avl_add(avl, box(687), box(699));
- avl = gpr_avl_add(avl, box(509), box(700));
- avl = gpr_avl_add(avl, box(973), box(701));
+ avl = gpr_avl_add(avl, box(687), box(699), NULL);
+ avl = gpr_avl_add(avl, box(509), box(700), NULL);
+ avl = gpr_avl_add(avl, box(973), box(701), NULL);
avl = remove_int(avl, 230);
- avl = gpr_avl_add(avl, box(532), box(703));
+ avl = gpr_avl_add(avl, box(532), box(703), NULL);
avl = remove_int(avl, 668);
- avl = gpr_avl_add(avl, box(281), box(705));
- avl = gpr_avl_add(avl, box(867), box(706));
- avl = gpr_avl_add(avl, box(359), box(707));
+ avl = gpr_avl_add(avl, box(281), box(705), NULL);
+ avl = gpr_avl_add(avl, box(867), box(706), NULL);
+ avl = gpr_avl_add(avl, box(359), box(707), NULL);
avl = remove_int(avl, 425);
- avl = gpr_avl_add(avl, box(691), box(709));
- avl = gpr_avl_add(avl, box(163), box(710));
- avl = gpr_avl_add(avl, box(502), box(711));
+ avl = gpr_avl_add(avl, box(691), box(709), NULL);
+ avl = gpr_avl_add(avl, box(163), box(710), NULL);
+ avl = gpr_avl_add(avl, box(502), box(711), NULL);
avl = remove_int(avl, 674);
- avl = gpr_avl_add(avl, box(697), box(713));
+ avl = gpr_avl_add(avl, box(697), box(713), NULL);
avl = remove_int(avl, 271);
- avl = gpr_avl_add(avl, box(968), box(715));
- avl = gpr_avl_add(avl, box(48), box(716));
+ avl = gpr_avl_add(avl, box(968), box(715), NULL);
+ avl = gpr_avl_add(avl, box(48), box(716), NULL);
avl = remove_int(avl, 543);
- avl = gpr_avl_add(avl, box(35), box(718));
- avl = gpr_avl_add(avl, box(751), box(719));
- avl = gpr_avl_add(avl, box(478), box(720));
+ avl = gpr_avl_add(avl, box(35), box(718), NULL);
+ avl = gpr_avl_add(avl, box(751), box(719), NULL);
+ avl = gpr_avl_add(avl, box(478), box(720), NULL);
avl = remove_int(avl, 797);
avl = remove_int(avl, 309);
- avl = gpr_avl_add(avl, box(927), box(723));
+ avl = gpr_avl_add(avl, box(927), box(723), NULL);
avl = remove_int(avl, 504);
- avl = gpr_avl_add(avl, box(286), box(725));
- avl = gpr_avl_add(avl, box(413), box(726));
- avl = gpr_avl_add(avl, box(599), box(727));
+ avl = gpr_avl_add(avl, box(286), box(725), NULL);
+ avl = gpr_avl_add(avl, box(413), box(726), NULL);
+ avl = gpr_avl_add(avl, box(599), box(727), NULL);
avl = remove_int(avl, 105);
avl = remove_int(avl, 605);
- avl = gpr_avl_add(avl, box(632), box(730));
- avl = gpr_avl_add(avl, box(133), box(731));
+ avl = gpr_avl_add(avl, box(632), box(730), NULL);
+ avl = gpr_avl_add(avl, box(133), box(731), NULL);
avl = remove_int(avl, 443);
- avl = gpr_avl_add(avl, box(958), box(733));
- avl = gpr_avl_add(avl, box(729), box(734));
+ avl = gpr_avl_add(avl, box(958), box(733), NULL);
+ avl = gpr_avl_add(avl, box(729), box(734), NULL);
avl = remove_int(avl, 158);
- avl = gpr_avl_add(avl, box(694), box(736));
- avl = gpr_avl_add(avl, box(505), box(737));
+ avl = gpr_avl_add(avl, box(694), box(736), NULL);
+ avl = gpr_avl_add(avl, box(505), box(737), NULL);
avl = remove_int(avl, 63);
avl = remove_int(avl, 714);
- avl = gpr_avl_add(avl, box(1002), box(740));
+ avl = gpr_avl_add(avl, box(1002), box(740), NULL);
avl = remove_int(avl, 211);
- avl = gpr_avl_add(avl, box(765), box(742));
- avl = gpr_avl_add(avl, box(455), box(743));
+ avl = gpr_avl_add(avl, box(765), box(742), NULL);
+ avl = gpr_avl_add(avl, box(455), box(743), NULL);
avl = remove_int(avl, 59);
avl = remove_int(avl, 224);
- avl = gpr_avl_add(avl, box(586), box(746));
- avl = gpr_avl_add(avl, box(348), box(747));
+ avl = gpr_avl_add(avl, box(586), box(746), NULL);
+ avl = gpr_avl_add(avl, box(348), box(747), NULL);
avl = remove_int(avl, 10);
avl = remove_int(avl, 484);
- avl = gpr_avl_add(avl, box(968), box(750));
- avl = gpr_avl_add(avl, box(923), box(751));
+ avl = gpr_avl_add(avl, box(968), box(750), NULL);
+ avl = gpr_avl_add(avl, box(923), box(751), NULL);
avl = remove_int(avl, 573);
avl = remove_int(avl, 617);
- avl = gpr_avl_add(avl, box(812), box(754));
- avl = gpr_avl_add(avl, box(179), box(755));
+ avl = gpr_avl_add(avl, box(812), box(754), NULL);
+ avl = gpr_avl_add(avl, box(179), box(755), NULL);
avl = remove_int(avl, 284);
avl = remove_int(avl, 157);
avl = remove_int(avl, 177);
avl = remove_int(avl, 896);
- avl = gpr_avl_add(avl, box(649), box(760));
- avl = gpr_avl_add(avl, box(927), box(761));
- avl = gpr_avl_add(avl, box(454), box(762));
- avl = gpr_avl_add(avl, box(217), box(763));
+ avl = gpr_avl_add(avl, box(649), box(760), NULL);
+ avl = gpr_avl_add(avl, box(927), box(761), NULL);
+ avl = gpr_avl_add(avl, box(454), box(762), NULL);
+ avl = gpr_avl_add(avl, box(217), box(763), NULL);
avl = remove_int(avl, 534);
- avl = gpr_avl_add(avl, box(180), box(765));
- avl = gpr_avl_add(avl, box(319), box(766));
+ avl = gpr_avl_add(avl, box(180), box(765), NULL);
+ avl = gpr_avl_add(avl, box(319), box(766), NULL);
avl = remove_int(avl, 92);
- avl = gpr_avl_add(avl, box(483), box(768));
+ avl = gpr_avl_add(avl, box(483), box(768), NULL);
avl = remove_int(avl, 504);
avl = remove_int(avl, 1017);
avl = remove_int(avl, 37);
avl = remove_int(avl, 50);
- avl = gpr_avl_add(avl, box(302), box(773));
+ avl = gpr_avl_add(avl, box(302), box(773), NULL);
avl = remove_int(avl, 807);
- avl = gpr_avl_add(avl, box(463), box(775));
- avl = gpr_avl_add(avl, box(271), box(776));
- avl = gpr_avl_add(avl, box(644), box(777));
+ avl = gpr_avl_add(avl, box(463), box(775), NULL);
+ avl = gpr_avl_add(avl, box(271), box(776), NULL);
+ avl = gpr_avl_add(avl, box(644), box(777), NULL);
avl = remove_int(avl, 618);
- avl = gpr_avl_add(avl, box(166), box(779));
- avl = gpr_avl_add(avl, box(538), box(780));
+ avl = gpr_avl_add(avl, box(166), box(779), NULL);
+ avl = gpr_avl_add(avl, box(538), box(780), NULL);
avl = remove_int(avl, 606);
- avl = gpr_avl_add(avl, box(425), box(782));
+ avl = gpr_avl_add(avl, box(425), box(782), NULL);
avl = remove_int(avl, 725);
avl = remove_int(avl, 383);
- avl = gpr_avl_add(avl, box(155), box(785));
+ avl = gpr_avl_add(avl, box(155), box(785), NULL);
avl = remove_int(avl, 889);
- avl = gpr_avl_add(avl, box(653), box(787));
+ avl = gpr_avl_add(avl, box(653), box(787), NULL);
avl = remove_int(avl, 386);
- avl = gpr_avl_add(avl, box(142), box(789));
+ avl = gpr_avl_add(avl, box(142), box(789), NULL);
avl = remove_int(avl, 107);
avl = remove_int(avl, 603);
avl = remove_int(avl, 971);
- avl = gpr_avl_add(avl, box(80), box(793));
- avl = gpr_avl_add(avl, box(61), box(794));
- avl = gpr_avl_add(avl, box(693), box(795));
- avl = gpr_avl_add(avl, box(592), box(796));
- avl = gpr_avl_add(avl, box(433), box(797));
- avl = gpr_avl_add(avl, box(973), box(798));
+ avl = gpr_avl_add(avl, box(80), box(793), NULL);
+ avl = gpr_avl_add(avl, box(61), box(794), NULL);
+ avl = gpr_avl_add(avl, box(693), box(795), NULL);
+ avl = gpr_avl_add(avl, box(592), box(796), NULL);
+ avl = gpr_avl_add(avl, box(433), box(797), NULL);
+ avl = gpr_avl_add(avl, box(973), box(798), NULL);
avl = remove_int(avl, 901);
avl = remove_int(avl, 340);
avl = remove_int(avl, 709);
- avl = gpr_avl_add(avl, box(224), box(802));
+ avl = gpr_avl_add(avl, box(224), box(802), NULL);
avl = remove_int(avl, 120);
avl = remove_int(avl, 271);
- avl = gpr_avl_add(avl, box(780), box(805));
- avl = gpr_avl_add(avl, box(867), box(806));
- avl = gpr_avl_add(avl, box(756), box(807));
- avl = gpr_avl_add(avl, box(583), box(808));
- avl = gpr_avl_add(avl, box(356), box(809));
- avl = gpr_avl_add(avl, box(58), box(810));
+ avl = gpr_avl_add(avl, box(780), box(805), NULL);
+ avl = gpr_avl_add(avl, box(867), box(806), NULL);
+ avl = gpr_avl_add(avl, box(756), box(807), NULL);
+ avl = gpr_avl_add(avl, box(583), box(808), NULL);
+ avl = gpr_avl_add(avl, box(356), box(809), NULL);
+ avl = gpr_avl_add(avl, box(58), box(810), NULL);
avl = remove_int(avl, 219);
- avl = gpr_avl_add(avl, box(301), box(812));
+ avl = gpr_avl_add(avl, box(301), box(812), NULL);
avl = remove_int(avl, 643);
avl = remove_int(avl, 787);
avl = remove_int(avl, 583);
@@ -1063,72 +1065,72 @@ static void test_badcase2(void) {
avl = remove_int(avl, 608);
avl = remove_int(avl, 363);
avl = remove_int(avl, 690);
- avl = gpr_avl_add(avl, box(233), box(821));
- avl = gpr_avl_add(avl, box(479), box(822));
- avl = gpr_avl_add(avl, box(323), box(823));
- avl = gpr_avl_add(avl, box(802), box(824));
+ avl = gpr_avl_add(avl, box(233), box(821), NULL);
+ avl = gpr_avl_add(avl, box(479), box(822), NULL);
+ avl = gpr_avl_add(avl, box(323), box(823), NULL);
+ avl = gpr_avl_add(avl, box(802), box(824), NULL);
avl = remove_int(avl, 682);
avl = remove_int(avl, 705);
avl = remove_int(avl, 487);
- avl = gpr_avl_add(avl, box(530), box(828));
- avl = gpr_avl_add(avl, box(232), box(829));
+ avl = gpr_avl_add(avl, box(530), box(828), NULL);
+ avl = gpr_avl_add(avl, box(232), box(829), NULL);
avl = remove_int(avl, 627);
- avl = gpr_avl_add(avl, box(396), box(831));
- avl = gpr_avl_add(avl, box(61), box(832));
- avl = gpr_avl_add(avl, box(932), box(833));
- avl = gpr_avl_add(avl, box(108), box(834));
- avl = gpr_avl_add(avl, box(524), box(835));
+ avl = gpr_avl_add(avl, box(396), box(831), NULL);
+ avl = gpr_avl_add(avl, box(61), box(832), NULL);
+ avl = gpr_avl_add(avl, box(932), box(833), NULL);
+ avl = gpr_avl_add(avl, box(108), box(834), NULL);
+ avl = gpr_avl_add(avl, box(524), box(835), NULL);
avl = remove_int(avl, 390);
avl = remove_int(avl, 307);
- avl = gpr_avl_add(avl, box(722), box(838));
- avl = gpr_avl_add(avl, box(907), box(839));
+ avl = gpr_avl_add(avl, box(722), box(838), NULL);
+ avl = gpr_avl_add(avl, box(907), box(839), NULL);
avl = remove_int(avl, 286);
avl = remove_int(avl, 337);
avl = remove_int(avl, 443);
- avl = gpr_avl_add(avl, box(973), box(843));
+ avl = gpr_avl_add(avl, box(973), box(843), NULL);
avl = remove_int(avl, 930);
avl = remove_int(avl, 242);
- avl = gpr_avl_add(avl, box(997), box(846));
- avl = gpr_avl_add(avl, box(689), box(847));
+ avl = gpr_avl_add(avl, box(997), box(846), NULL);
+ avl = gpr_avl_add(avl, box(689), box(847), NULL);
avl = remove_int(avl, 318);
- avl = gpr_avl_add(avl, box(703), box(849));
- avl = gpr_avl_add(avl, box(868), box(850));
- avl = gpr_avl_add(avl, box(200), box(851));
- avl = gpr_avl_add(avl, box(960), box(852));
- avl = gpr_avl_add(avl, box(80), box(853));
+ avl = gpr_avl_add(avl, box(703), box(849), NULL);
+ avl = gpr_avl_add(avl, box(868), box(850), NULL);
+ avl = gpr_avl_add(avl, box(200), box(851), NULL);
+ avl = gpr_avl_add(avl, box(960), box(852), NULL);
+ avl = gpr_avl_add(avl, box(80), box(853), NULL);
avl = remove_int(avl, 113);
- avl = gpr_avl_add(avl, box(135), box(855));
+ avl = gpr_avl_add(avl, box(135), box(855), NULL);
avl = remove_int(avl, 529);
- avl = gpr_avl_add(avl, box(366), box(857));
+ avl = gpr_avl_add(avl, box(366), box(857), NULL);
avl = remove_int(avl, 272);
- avl = gpr_avl_add(avl, box(921), box(859));
+ avl = gpr_avl_add(avl, box(921), box(859), NULL);
avl = remove_int(avl, 497);
- avl = gpr_avl_add(avl, box(712), box(861));
+ avl = gpr_avl_add(avl, box(712), box(861), NULL);
avl = remove_int(avl, 777);
avl = remove_int(avl, 505);
avl = remove_int(avl, 974);
avl = remove_int(avl, 497);
- avl = gpr_avl_add(avl, box(388), box(866));
- avl = gpr_avl_add(avl, box(29), box(867));
- avl = gpr_avl_add(avl, box(180), box(868));
- avl = gpr_avl_add(avl, box(983), box(869));
- avl = gpr_avl_add(avl, box(72), box(870));
- avl = gpr_avl_add(avl, box(693), box(871));
- avl = gpr_avl_add(avl, box(567), box(872));
+ avl = gpr_avl_add(avl, box(388), box(866), NULL);
+ avl = gpr_avl_add(avl, box(29), box(867), NULL);
+ avl = gpr_avl_add(avl, box(180), box(868), NULL);
+ avl = gpr_avl_add(avl, box(983), box(869), NULL);
+ avl = gpr_avl_add(avl, box(72), box(870), NULL);
+ avl = gpr_avl_add(avl, box(693), box(871), NULL);
+ avl = gpr_avl_add(avl, box(567), box(872), NULL);
avl = remove_int(avl, 549);
avl = remove_int(avl, 351);
- avl = gpr_avl_add(avl, box(1019), box(875));
+ avl = gpr_avl_add(avl, box(1019), box(875), NULL);
avl = remove_int(avl, 585);
avl = remove_int(avl, 294);
avl = remove_int(avl, 61);
- avl = gpr_avl_add(avl, box(409), box(879));
- avl = gpr_avl_add(avl, box(984), box(880));
- avl = gpr_avl_add(avl, box(830), box(881));
+ avl = gpr_avl_add(avl, box(409), box(879), NULL);
+ avl = gpr_avl_add(avl, box(984), box(880), NULL);
+ avl = gpr_avl_add(avl, box(830), box(881), NULL);
avl = remove_int(avl, 579);
- avl = gpr_avl_add(avl, box(672), box(883));
+ avl = gpr_avl_add(avl, box(672), box(883), NULL);
avl = remove_int(avl, 968);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_badcase3(void) {
@@ -1138,191 +1140,191 @@ static void test_badcase3(void) {
avl = gpr_avl_create(&int_int_vtable);
avl = remove_int(avl, 624);
- avl = gpr_avl_add(avl, box(59), box(2));
- avl = gpr_avl_add(avl, box(494), box(3));
- avl = gpr_avl_add(avl, box(226), box(4));
+ avl = gpr_avl_add(avl, box(59), box(2), NULL);
+ avl = gpr_avl_add(avl, box(494), box(3), NULL);
+ avl = gpr_avl_add(avl, box(226), box(4), NULL);
avl = remove_int(avl, 524);
- avl = gpr_avl_add(avl, box(540), box(6));
+ avl = gpr_avl_add(avl, box(540), box(6), NULL);
avl = remove_int(avl, 1008);
- avl = gpr_avl_add(avl, box(502), box(8));
+ avl = gpr_avl_add(avl, box(502), box(8), NULL);
avl = remove_int(avl, 267);
avl = remove_int(avl, 764);
avl = remove_int(avl, 443);
- avl = gpr_avl_add(avl, box(8), box(12));
+ avl = gpr_avl_add(avl, box(8), box(12), NULL);
avl = remove_int(avl, 291);
avl = remove_int(avl, 796);
avl = remove_int(avl, 1002);
- avl = gpr_avl_add(avl, box(778), box(16));
+ avl = gpr_avl_add(avl, box(778), box(16), NULL);
avl = remove_int(avl, 621);
avl = remove_int(avl, 891);
avl = remove_int(avl, 880);
- avl = gpr_avl_add(avl, box(197), box(20));
- avl = gpr_avl_add(avl, box(441), box(21));
- avl = gpr_avl_add(avl, box(719), box(22));
+ avl = gpr_avl_add(avl, box(197), box(20), NULL);
+ avl = gpr_avl_add(avl, box(441), box(21), NULL);
+ avl = gpr_avl_add(avl, box(719), box(22), NULL);
avl = remove_int(avl, 109);
- avl = gpr_avl_add(avl, box(458), box(24));
+ avl = gpr_avl_add(avl, box(458), box(24), NULL);
avl = remove_int(avl, 86);
- avl = gpr_avl_add(avl, box(897), box(26));
- avl = gpr_avl_add(avl, box(997), box(27));
+ avl = gpr_avl_add(avl, box(897), box(26), NULL);
+ avl = gpr_avl_add(avl, box(997), box(27), NULL);
avl = remove_int(avl, 235);
avl = remove_int(avl, 425);
avl = remove_int(avl, 186);
- avl = gpr_avl_add(avl, box(887), box(31));
- avl = gpr_avl_add(avl, box(1005), box(32));
- avl = gpr_avl_add(avl, box(778), box(33));
- avl = gpr_avl_add(avl, box(575), box(34));
+ avl = gpr_avl_add(avl, box(887), box(31), NULL);
+ avl = gpr_avl_add(avl, box(1005), box(32), NULL);
+ avl = gpr_avl_add(avl, box(778), box(33), NULL);
+ avl = gpr_avl_add(avl, box(575), box(34), NULL);
avl = remove_int(avl, 966);
avl = remove_int(avl, 1015);
- avl = gpr_avl_add(avl, box(486), box(37));
- avl = gpr_avl_add(avl, box(809), box(38));
- avl = gpr_avl_add(avl, box(907), box(39));
- avl = gpr_avl_add(avl, box(971), box(40));
+ avl = gpr_avl_add(avl, box(486), box(37), NULL);
+ avl = gpr_avl_add(avl, box(809), box(38), NULL);
+ avl = gpr_avl_add(avl, box(907), box(39), NULL);
+ avl = gpr_avl_add(avl, box(971), box(40), NULL);
avl = remove_int(avl, 441);
avl = remove_int(avl, 498);
- avl = gpr_avl_add(avl, box(727), box(43));
+ avl = gpr_avl_add(avl, box(727), box(43), NULL);
avl = remove_int(avl, 679);
avl = remove_int(avl, 740);
avl = remove_int(avl, 532);
- avl = gpr_avl_add(avl, box(805), box(47));
+ avl = gpr_avl_add(avl, box(805), box(47), NULL);
avl = remove_int(avl, 64);
- avl = gpr_avl_add(avl, box(362), box(49));
- avl = gpr_avl_add(avl, box(170), box(50));
- avl = gpr_avl_add(avl, box(389), box(51));
- avl = gpr_avl_add(avl, box(689), box(52));
+ avl = gpr_avl_add(avl, box(362), box(49), NULL);
+ avl = gpr_avl_add(avl, box(170), box(50), NULL);
+ avl = gpr_avl_add(avl, box(389), box(51), NULL);
+ avl = gpr_avl_add(avl, box(689), box(52), NULL);
avl = remove_int(avl, 871);
- avl = gpr_avl_add(avl, box(447), box(54));
+ avl = gpr_avl_add(avl, box(447), box(54), NULL);
avl = remove_int(avl, 718);
- avl = gpr_avl_add(avl, box(724), box(56));
+ avl = gpr_avl_add(avl, box(724), box(56), NULL);
avl = remove_int(avl, 215);
- avl = gpr_avl_add(avl, box(550), box(58));
+ avl = gpr_avl_add(avl, box(550), box(58), NULL);
avl = remove_int(avl, 932);
- avl = gpr_avl_add(avl, box(47), box(60));
+ avl = gpr_avl_add(avl, box(47), box(60), NULL);
avl = remove_int(avl, 46);
avl = remove_int(avl, 229);
- avl = gpr_avl_add(avl, box(68), box(63));
- avl = gpr_avl_add(avl, box(387), box(64));
+ avl = gpr_avl_add(avl, box(68), box(63), NULL);
+ avl = gpr_avl_add(avl, box(387), box(64), NULL);
avl = remove_int(avl, 933);
avl = remove_int(avl, 736);
avl = remove_int(avl, 719);
- avl = gpr_avl_add(avl, box(150), box(68));
+ avl = gpr_avl_add(avl, box(150), box(68), NULL);
avl = remove_int(avl, 875);
avl = remove_int(avl, 298);
- avl = gpr_avl_add(avl, box(991), box(71));
+ avl = gpr_avl_add(avl, box(991), box(71), NULL);
avl = remove_int(avl, 705);
- avl = gpr_avl_add(avl, box(197), box(73));
- avl = gpr_avl_add(avl, box(101), box(74));
+ avl = gpr_avl_add(avl, box(197), box(73), NULL);
+ avl = gpr_avl_add(avl, box(101), box(74), NULL);
avl = remove_int(avl, 436);
- avl = gpr_avl_add(avl, box(755), box(76));
- avl = gpr_avl_add(avl, box(727), box(77));
+ avl = gpr_avl_add(avl, box(755), box(76), NULL);
+ avl = gpr_avl_add(avl, box(727), box(77), NULL);
avl = remove_int(avl, 309);
avl = remove_int(avl, 253);
- avl = gpr_avl_add(avl, box(203), box(80));
+ avl = gpr_avl_add(avl, box(203), box(80), NULL);
avl = remove_int(avl, 231);
- avl = gpr_avl_add(avl, box(461), box(82));
+ avl = gpr_avl_add(avl, box(461), box(82), NULL);
avl = remove_int(avl, 316);
avl = remove_int(avl, 493);
- avl = gpr_avl_add(avl, box(184), box(85));
+ avl = gpr_avl_add(avl, box(184), box(85), NULL);
avl = remove_int(avl, 737);
- avl = gpr_avl_add(avl, box(790), box(87));
- avl = gpr_avl_add(avl, box(335), box(88));
+ avl = gpr_avl_add(avl, box(790), box(87), NULL);
+ avl = gpr_avl_add(avl, box(335), box(88), NULL);
avl = remove_int(avl, 649);
- avl = gpr_avl_add(avl, box(69), box(90));
+ avl = gpr_avl_add(avl, box(69), box(90), NULL);
avl = remove_int(avl, 585);
avl = remove_int(avl, 543);
- avl = gpr_avl_add(avl, box(784), box(93));
- avl = gpr_avl_add(avl, box(60), box(94));
- avl = gpr_avl_add(avl, box(525), box(95));
- avl = gpr_avl_add(avl, box(177), box(96));
- avl = gpr_avl_add(avl, box(178), box(97));
- avl = gpr_avl_add(avl, box(683), box(98));
- avl = gpr_avl_add(avl, box(226), box(99));
- avl = gpr_avl_add(avl, box(662), box(100));
+ avl = gpr_avl_add(avl, box(784), box(93), NULL);
+ avl = gpr_avl_add(avl, box(60), box(94), NULL);
+ avl = gpr_avl_add(avl, box(525), box(95), NULL);
+ avl = gpr_avl_add(avl, box(177), box(96), NULL);
+ avl = gpr_avl_add(avl, box(178), box(97), NULL);
+ avl = gpr_avl_add(avl, box(683), box(98), NULL);
+ avl = gpr_avl_add(avl, box(226), box(99), NULL);
+ avl = gpr_avl_add(avl, box(662), box(100), NULL);
avl = remove_int(avl, 944);
- avl = gpr_avl_add(avl, box(562), box(102));
- avl = gpr_avl_add(avl, box(793), box(103));
+ avl = gpr_avl_add(avl, box(562), box(102), NULL);
+ avl = gpr_avl_add(avl, box(793), box(103), NULL);
avl = remove_int(avl, 673);
- avl = gpr_avl_add(avl, box(310), box(105));
+ avl = gpr_avl_add(avl, box(310), box(105), NULL);
avl = remove_int(avl, 479);
avl = remove_int(avl, 543);
avl = remove_int(avl, 159);
avl = remove_int(avl, 850);
- avl = gpr_avl_add(avl, box(318), box(110));
- avl = gpr_avl_add(avl, box(483), box(111));
- avl = gpr_avl_add(avl, box(84), box(112));
+ avl = gpr_avl_add(avl, box(318), box(110), NULL);
+ avl = gpr_avl_add(avl, box(483), box(111), NULL);
+ avl = gpr_avl_add(avl, box(84), box(112), NULL);
avl = remove_int(avl, 109);
- avl = gpr_avl_add(avl, box(132), box(114));
- avl = gpr_avl_add(avl, box(920), box(115));
+ avl = gpr_avl_add(avl, box(132), box(114), NULL);
+ avl = gpr_avl_add(avl, box(920), box(115), NULL);
avl = remove_int(avl, 746);
- avl = gpr_avl_add(avl, box(145), box(117));
- avl = gpr_avl_add(avl, box(526), box(118));
+ avl = gpr_avl_add(avl, box(145), box(117), NULL);
+ avl = gpr_avl_add(avl, box(526), box(118), NULL);
avl = remove_int(avl, 158);
- avl = gpr_avl_add(avl, box(332), box(120));
- avl = gpr_avl_add(avl, box(918), box(121));
+ avl = gpr_avl_add(avl, box(332), box(120), NULL);
+ avl = gpr_avl_add(avl, box(918), box(121), NULL);
avl = remove_int(avl, 339);
- avl = gpr_avl_add(avl, box(809), box(123));
- avl = gpr_avl_add(avl, box(742), box(124));
- avl = gpr_avl_add(avl, box(718), box(125));
+ avl = gpr_avl_add(avl, box(809), box(123), NULL);
+ avl = gpr_avl_add(avl, box(742), box(124), NULL);
+ avl = gpr_avl_add(avl, box(718), box(125), NULL);
avl = remove_int(avl, 988);
avl = remove_int(avl, 531);
avl = remove_int(avl, 840);
- avl = gpr_avl_add(avl, box(816), box(129));
- avl = gpr_avl_add(avl, box(976), box(130));
+ avl = gpr_avl_add(avl, box(816), box(129), NULL);
+ avl = gpr_avl_add(avl, box(976), box(130), NULL);
avl = remove_int(avl, 743);
avl = remove_int(avl, 528);
avl = remove_int(avl, 982);
- avl = gpr_avl_add(avl, box(803), box(134));
- avl = gpr_avl_add(avl, box(205), box(135));
- avl = gpr_avl_add(avl, box(584), box(136));
+ avl = gpr_avl_add(avl, box(803), box(134), NULL);
+ avl = gpr_avl_add(avl, box(205), box(135), NULL);
+ avl = gpr_avl_add(avl, box(584), box(136), NULL);
avl = remove_int(avl, 923);
avl = remove_int(avl, 538);
avl = remove_int(avl, 398);
avl = remove_int(avl, 320);
avl = remove_int(avl, 292);
- avl = gpr_avl_add(avl, box(270), box(142));
- avl = gpr_avl_add(avl, box(333), box(143));
+ avl = gpr_avl_add(avl, box(270), box(142), NULL);
+ avl = gpr_avl_add(avl, box(333), box(143), NULL);
avl = remove_int(avl, 439);
- avl = gpr_avl_add(avl, box(35), box(145));
- avl = gpr_avl_add(avl, box(837), box(146));
+ avl = gpr_avl_add(avl, box(35), box(145), NULL);
+ avl = gpr_avl_add(avl, box(837), box(146), NULL);
avl = remove_int(avl, 65);
avl = remove_int(avl, 642);
avl = remove_int(avl, 371);
avl = remove_int(avl, 140);
avl = remove_int(avl, 533);
avl = remove_int(avl, 676);
- avl = gpr_avl_add(avl, box(624), box(153));
- avl = gpr_avl_add(avl, box(116), box(154));
- avl = gpr_avl_add(avl, box(446), box(155));
+ avl = gpr_avl_add(avl, box(624), box(153), NULL);
+ avl = gpr_avl_add(avl, box(116), box(154), NULL);
+ avl = gpr_avl_add(avl, box(446), box(155), NULL);
avl = remove_int(avl, 91);
avl = remove_int(avl, 721);
avl = remove_int(avl, 537);
- avl = gpr_avl_add(avl, box(448), box(159));
+ avl = gpr_avl_add(avl, box(448), box(159), NULL);
avl = remove_int(avl, 155);
avl = remove_int(avl, 344);
avl = remove_int(avl, 237);
- avl = gpr_avl_add(avl, box(309), box(163));
- avl = gpr_avl_add(avl, box(434), box(164));
- avl = gpr_avl_add(avl, box(277), box(165));
+ avl = gpr_avl_add(avl, box(309), box(163), NULL);
+ avl = gpr_avl_add(avl, box(434), box(164), NULL);
+ avl = gpr_avl_add(avl, box(277), box(165), NULL);
avl = remove_int(avl, 233);
- avl = gpr_avl_add(avl, box(275), box(167));
- avl = gpr_avl_add(avl, box(218), box(168));
- avl = gpr_avl_add(avl, box(76), box(169));
- avl = gpr_avl_add(avl, box(898), box(170));
+ avl = gpr_avl_add(avl, box(275), box(167), NULL);
+ avl = gpr_avl_add(avl, box(218), box(168), NULL);
+ avl = gpr_avl_add(avl, box(76), box(169), NULL);
+ avl = gpr_avl_add(avl, box(898), box(170), NULL);
avl = remove_int(avl, 771);
- avl = gpr_avl_add(avl, box(237), box(172));
+ avl = gpr_avl_add(avl, box(237), box(172), NULL);
avl = remove_int(avl, 327);
- avl = gpr_avl_add(avl, box(499), box(174));
+ avl = gpr_avl_add(avl, box(499), box(174), NULL);
avl = remove_int(avl, 727);
avl = remove_int(avl, 234);
avl = remove_int(avl, 623);
avl = remove_int(avl, 458);
avl = remove_int(avl, 326);
avl = remove_int(avl, 589);
- avl = gpr_avl_add(avl, box(442), box(181));
+ avl = gpr_avl_add(avl, box(442), box(181), NULL);
avl = remove_int(avl, 389);
- avl = gpr_avl_add(avl, box(708), box(183));
- avl = gpr_avl_add(avl, box(594), box(184));
- avl = gpr_avl_add(avl, box(942), box(185));
- avl = gpr_avl_add(avl, box(282), box(186));
+ avl = gpr_avl_add(avl, box(708), box(183), NULL);
+ avl = gpr_avl_add(avl, box(594), box(184), NULL);
+ avl = gpr_avl_add(avl, box(942), box(185), NULL);
+ avl = gpr_avl_add(avl, box(282), box(186), NULL);
avl = remove_int(avl, 434);
avl = remove_int(avl, 134);
avl = remove_int(avl, 270);
@@ -1332,125 +1334,125 @@ static void test_badcase3(void) {
avl = remove_int(avl, 193);
avl = remove_int(avl, 797);
avl = remove_int(avl, 347);
- avl = gpr_avl_add(avl, box(99), box(196));
- avl = gpr_avl_add(avl, box(161), box(197));
+ avl = gpr_avl_add(avl, box(99), box(196), NULL);
+ avl = gpr_avl_add(avl, box(161), box(197), NULL);
avl = remove_int(avl, 484);
- avl = gpr_avl_add(avl, box(72), box(199));
+ avl = gpr_avl_add(avl, box(72), box(199), NULL);
avl = remove_int(avl, 629);
- avl = gpr_avl_add(avl, box(522), box(201));
+ avl = gpr_avl_add(avl, box(522), box(201), NULL);
avl = remove_int(avl, 679);
- avl = gpr_avl_add(avl, box(407), box(203));
+ avl = gpr_avl_add(avl, box(407), box(203), NULL);
avl = remove_int(avl, 693);
- avl = gpr_avl_add(avl, box(424), box(205));
- avl = gpr_avl_add(avl, box(651), box(206));
- avl = gpr_avl_add(avl, box(927), box(207));
+ avl = gpr_avl_add(avl, box(424), box(205), NULL);
+ avl = gpr_avl_add(avl, box(651), box(206), NULL);
+ avl = gpr_avl_add(avl, box(927), box(207), NULL);
avl = remove_int(avl, 553);
- avl = gpr_avl_add(avl, box(128), box(209));
- avl = gpr_avl_add(avl, box(616), box(210));
- avl = gpr_avl_add(avl, box(690), box(211));
+ avl = gpr_avl_add(avl, box(128), box(209), NULL);
+ avl = gpr_avl_add(avl, box(616), box(210), NULL);
+ avl = gpr_avl_add(avl, box(690), box(211), NULL);
avl = remove_int(avl, 241);
avl = remove_int(avl, 179);
- avl = gpr_avl_add(avl, box(697), box(214));
+ avl = gpr_avl_add(avl, box(697), box(214), NULL);
avl = remove_int(avl, 779);
- avl = gpr_avl_add(avl, box(241), box(216));
+ avl = gpr_avl_add(avl, box(241), box(216), NULL);
avl = remove_int(avl, 190);
avl = remove_int(avl, 210);
- avl = gpr_avl_add(avl, box(711), box(219));
+ avl = gpr_avl_add(avl, box(711), box(219), NULL);
avl = remove_int(avl, 251);
avl = remove_int(avl, 61);
- avl = gpr_avl_add(avl, box(800), box(222));
+ avl = gpr_avl_add(avl, box(800), box(222), NULL);
avl = remove_int(avl, 551);
- avl = gpr_avl_add(avl, box(61), box(224));
- avl = gpr_avl_add(avl, box(656), box(225));
+ avl = gpr_avl_add(avl, box(61), box(224), NULL);
+ avl = gpr_avl_add(avl, box(656), box(225), NULL);
avl = remove_int(avl, 130);
avl = remove_int(avl, 368);
avl = remove_int(avl, 150);
avl = remove_int(avl, 73);
- avl = gpr_avl_add(avl, box(799), box(230));
- avl = gpr_avl_add(avl, box(125), box(231));
+ avl = gpr_avl_add(avl, box(799), box(230), NULL);
+ avl = gpr_avl_add(avl, box(125), box(231), NULL);
avl = remove_int(avl, 107);
- avl = gpr_avl_add(avl, box(938), box(233));
- avl = gpr_avl_add(avl, box(914), box(234));
- avl = gpr_avl_add(avl, box(197), box(235));
+ avl = gpr_avl_add(avl, box(938), box(233), NULL);
+ avl = gpr_avl_add(avl, box(914), box(234), NULL);
+ avl = gpr_avl_add(avl, box(197), box(235), NULL);
avl = remove_int(avl, 736);
- avl = gpr_avl_add(avl, box(20), box(237));
+ avl = gpr_avl_add(avl, box(20), box(237), NULL);
avl = remove_int(avl, 224);
avl = remove_int(avl, 841);
- avl = gpr_avl_add(avl, box(226), box(240));
+ avl = gpr_avl_add(avl, box(226), box(240), NULL);
avl = remove_int(avl, 963);
avl = remove_int(avl, 796);
avl = remove_int(avl, 728);
- avl = gpr_avl_add(avl, box(855), box(244));
- avl = gpr_avl_add(avl, box(769), box(245));
- avl = gpr_avl_add(avl, box(631), box(246));
+ avl = gpr_avl_add(avl, box(855), box(244), NULL);
+ avl = gpr_avl_add(avl, box(769), box(245), NULL);
+ avl = gpr_avl_add(avl, box(631), box(246), NULL);
avl = remove_int(avl, 648);
- avl = gpr_avl_add(avl, box(187), box(248));
- avl = gpr_avl_add(avl, box(31), box(249));
+ avl = gpr_avl_add(avl, box(187), box(248), NULL);
+ avl = gpr_avl_add(avl, box(31), box(249), NULL);
avl = remove_int(avl, 163);
- avl = gpr_avl_add(avl, box(218), box(251));
- avl = gpr_avl_add(avl, box(488), box(252));
- avl = gpr_avl_add(avl, box(387), box(253));
- avl = gpr_avl_add(avl, box(809), box(254));
- avl = gpr_avl_add(avl, box(997), box(255));
+ avl = gpr_avl_add(avl, box(218), box(251), NULL);
+ avl = gpr_avl_add(avl, box(488), box(252), NULL);
+ avl = gpr_avl_add(avl, box(387), box(253), NULL);
+ avl = gpr_avl_add(avl, box(809), box(254), NULL);
+ avl = gpr_avl_add(avl, box(997), box(255), NULL);
avl = remove_int(avl, 678);
- avl = gpr_avl_add(avl, box(368), box(257));
- avl = gpr_avl_add(avl, box(220), box(258));
- avl = gpr_avl_add(avl, box(373), box(259));
+ avl = gpr_avl_add(avl, box(368), box(257), NULL);
+ avl = gpr_avl_add(avl, box(220), box(258), NULL);
+ avl = gpr_avl_add(avl, box(373), box(259), NULL);
avl = remove_int(avl, 874);
avl = remove_int(avl, 682);
avl = remove_int(avl, 1014);
avl = remove_int(avl, 195);
- avl = gpr_avl_add(avl, box(868), box(264));
+ avl = gpr_avl_add(avl, box(868), box(264), NULL);
avl = remove_int(avl, 254);
avl = remove_int(avl, 456);
- avl = gpr_avl_add(avl, box(906), box(267));
+ avl = gpr_avl_add(avl, box(906), box(267), NULL);
avl = remove_int(avl, 711);
- avl = gpr_avl_add(avl, box(632), box(269));
+ avl = gpr_avl_add(avl, box(632), box(269), NULL);
avl = remove_int(avl, 474);
- avl = gpr_avl_add(avl, box(508), box(271));
- avl = gpr_avl_add(avl, box(518), box(272));
+ avl = gpr_avl_add(avl, box(508), box(271), NULL);
+ avl = gpr_avl_add(avl, box(518), box(272), NULL);
avl = remove_int(avl, 579);
avl = remove_int(avl, 948);
- avl = gpr_avl_add(avl, box(789), box(275));
- avl = gpr_avl_add(avl, box(48), box(276));
- avl = gpr_avl_add(avl, box(256), box(277));
- avl = gpr_avl_add(avl, box(754), box(278));
+ avl = gpr_avl_add(avl, box(789), box(275), NULL);
+ avl = gpr_avl_add(avl, box(48), box(276), NULL);
+ avl = gpr_avl_add(avl, box(256), box(277), NULL);
+ avl = gpr_avl_add(avl, box(754), box(278), NULL);
avl = remove_int(avl, 215);
- avl = gpr_avl_add(avl, box(679), box(280));
- avl = gpr_avl_add(avl, box(606), box(281));
+ avl = gpr_avl_add(avl, box(679), box(280), NULL);
+ avl = gpr_avl_add(avl, box(606), box(281), NULL);
avl = remove_int(avl, 941);
avl = remove_int(avl, 31);
- avl = gpr_avl_add(avl, box(758), box(284));
+ avl = gpr_avl_add(avl, box(758), box(284), NULL);
avl = remove_int(avl, 101);
- avl = gpr_avl_add(avl, box(244), box(286));
- avl = gpr_avl_add(avl, box(337), box(287));
- avl = gpr_avl_add(avl, box(461), box(288));
+ avl = gpr_avl_add(avl, box(244), box(286), NULL);
+ avl = gpr_avl_add(avl, box(337), box(287), NULL);
+ avl = gpr_avl_add(avl, box(461), box(288), NULL);
avl = remove_int(avl, 476);
- avl = gpr_avl_add(avl, box(845), box(290));
+ avl = gpr_avl_add(avl, box(845), box(290), NULL);
avl = remove_int(avl, 160);
- avl = gpr_avl_add(avl, box(690), box(292));
+ avl = gpr_avl_add(avl, box(690), box(292), NULL);
avl = remove_int(avl, 931);
- avl = gpr_avl_add(avl, box(869), box(294));
- avl = gpr_avl_add(avl, box(1019), box(295));
+ avl = gpr_avl_add(avl, box(869), box(294), NULL);
+ avl = gpr_avl_add(avl, box(1019), box(295), NULL);
avl = remove_int(avl, 591);
avl = remove_int(avl, 635);
avl = remove_int(avl, 67);
- avl = gpr_avl_add(avl, box(113), box(299));
+ avl = gpr_avl_add(avl, box(113), box(299), NULL);
avl = remove_int(avl, 305);
- avl = gpr_avl_add(avl, box(10), box(301));
+ avl = gpr_avl_add(avl, box(10), box(301), NULL);
avl = remove_int(avl, 823);
avl = remove_int(avl, 288);
avl = remove_int(avl, 239);
- avl = gpr_avl_add(avl, box(646), box(305));
- avl = gpr_avl_add(avl, box(1006), box(306));
- avl = gpr_avl_add(avl, box(954), box(307));
- avl = gpr_avl_add(avl, box(199), box(308));
- avl = gpr_avl_add(avl, box(69), box(309));
- avl = gpr_avl_add(avl, box(984), box(310));
+ avl = gpr_avl_add(avl, box(646), box(305), NULL);
+ avl = gpr_avl_add(avl, box(1006), box(306), NULL);
+ avl = gpr_avl_add(avl, box(954), box(307), NULL);
+ avl = gpr_avl_add(avl, box(199), box(308), NULL);
+ avl = gpr_avl_add(avl, box(69), box(309), NULL);
+ avl = gpr_avl_add(avl, box(984), box(310), NULL);
avl = remove_int(avl, 568);
avl = remove_int(avl, 666);
avl = remove_int(avl, 37);
- avl = gpr_avl_add(avl, box(845), box(314));
+ avl = gpr_avl_add(avl, box(845), box(314), NULL);
avl = remove_int(avl, 535);
avl = remove_int(avl, 365);
avl = remove_int(avl, 676);
@@ -1458,372 +1460,372 @@ static void test_badcase3(void) {
avl = remove_int(avl, 425);
avl = remove_int(avl, 704);
avl = remove_int(avl, 168);
- avl = gpr_avl_add(avl, box(853), box(322));
- avl = gpr_avl_add(avl, box(335), box(323));
- avl = gpr_avl_add(avl, box(961), box(324));
- avl = gpr_avl_add(avl, box(73), box(325));
+ avl = gpr_avl_add(avl, box(853), box(322), NULL);
+ avl = gpr_avl_add(avl, box(335), box(323), NULL);
+ avl = gpr_avl_add(avl, box(961), box(324), NULL);
+ avl = gpr_avl_add(avl, box(73), box(325), NULL);
avl = remove_int(avl, 469);
- avl = gpr_avl_add(avl, box(449), box(327));
+ avl = gpr_avl_add(avl, box(449), box(327), NULL);
avl = remove_int(avl, 821);
- avl = gpr_avl_add(avl, box(845), box(329));
+ avl = gpr_avl_add(avl, box(845), box(329), NULL);
avl = remove_int(avl, 637);
- avl = gpr_avl_add(avl, box(769), box(331));
- avl = gpr_avl_add(avl, box(901), box(332));
+ avl = gpr_avl_add(avl, box(769), box(331), NULL);
+ avl = gpr_avl_add(avl, box(901), box(332), NULL);
avl = remove_int(avl, 142);
avl = remove_int(avl, 361);
avl = remove_int(avl, 876);
- avl = gpr_avl_add(avl, box(614), box(336));
- avl = gpr_avl_add(avl, box(729), box(337));
+ avl = gpr_avl_add(avl, box(614), box(336), NULL);
+ avl = gpr_avl_add(avl, box(729), box(337), NULL);
avl = remove_int(avl, 120);
avl = remove_int(avl, 473);
avl = remove_int(avl, 445);
- avl = gpr_avl_add(avl, box(978), box(341));
- avl = gpr_avl_add(avl, box(164), box(342));
- avl = gpr_avl_add(avl, box(1), box(343));
+ avl = gpr_avl_add(avl, box(978), box(341), NULL);
+ avl = gpr_avl_add(avl, box(164), box(342), NULL);
+ avl = gpr_avl_add(avl, box(1), box(343), NULL);
avl = remove_int(avl, 890);
- avl = gpr_avl_add(avl, box(605), box(345));
- avl = gpr_avl_add(avl, box(178), box(346));
- avl = gpr_avl_add(avl, box(481), box(347));
- avl = gpr_avl_add(avl, box(772), box(348));
+ avl = gpr_avl_add(avl, box(605), box(345), NULL);
+ avl = gpr_avl_add(avl, box(178), box(346), NULL);
+ avl = gpr_avl_add(avl, box(481), box(347), NULL);
+ avl = gpr_avl_add(avl, box(772), box(348), NULL);
avl = remove_int(avl, 824);
avl = remove_int(avl, 167);
avl = remove_int(avl, 151);
- avl = gpr_avl_add(avl, box(698), box(352));
- avl = gpr_avl_add(avl, box(202), box(353));
- avl = gpr_avl_add(avl, box(921), box(354));
- avl = gpr_avl_add(avl, box(875), box(355));
+ avl = gpr_avl_add(avl, box(698), box(352), NULL);
+ avl = gpr_avl_add(avl, box(202), box(353), NULL);
+ avl = gpr_avl_add(avl, box(921), box(354), NULL);
+ avl = gpr_avl_add(avl, box(875), box(355), NULL);
avl = remove_int(avl, 197);
avl = remove_int(avl, 232);
- avl = gpr_avl_add(avl, box(209), box(358));
+ avl = gpr_avl_add(avl, box(209), box(358), NULL);
avl = remove_int(avl, 324);
avl = remove_int(avl, 56);
avl = remove_int(avl, 579);
avl = remove_int(avl, 255);
avl = remove_int(avl, 290);
- avl = gpr_avl_add(avl, box(661), box(364));
- avl = gpr_avl_add(avl, box(113), box(365));
+ avl = gpr_avl_add(avl, box(661), box(364), NULL);
+ avl = gpr_avl_add(avl, box(113), box(365), NULL);
avl = remove_int(avl, 767);
- avl = gpr_avl_add(avl, box(586), box(367));
- avl = gpr_avl_add(avl, box(121), box(368));
+ avl = gpr_avl_add(avl, box(586), box(367), NULL);
+ avl = gpr_avl_add(avl, box(121), box(368), NULL);
avl = remove_int(avl, 235);
avl = remove_int(avl, 439);
avl = remove_int(avl, 360);
- avl = gpr_avl_add(avl, box(916), box(372));
+ avl = gpr_avl_add(avl, box(916), box(372), NULL);
avl = remove_int(avl, 999);
- avl = gpr_avl_add(avl, box(825), box(374));
- avl = gpr_avl_add(avl, box(177), box(375));
+ avl = gpr_avl_add(avl, box(825), box(374), NULL);
+ avl = gpr_avl_add(avl, box(177), box(375), NULL);
avl = remove_int(avl, 204);
avl = remove_int(avl, 92);
- avl = gpr_avl_add(avl, box(794), box(378));
- avl = gpr_avl_add(avl, box(463), box(379));
- avl = gpr_avl_add(avl, box(472), box(380));
+ avl = gpr_avl_add(avl, box(794), box(378), NULL);
+ avl = gpr_avl_add(avl, box(463), box(379), NULL);
+ avl = gpr_avl_add(avl, box(472), box(380), NULL);
avl = remove_int(avl, 235);
- avl = gpr_avl_add(avl, box(840), box(382));
+ avl = gpr_avl_add(avl, box(840), box(382), NULL);
avl = remove_int(avl, 657);
- avl = gpr_avl_add(avl, box(586), box(384));
- avl = gpr_avl_add(avl, box(979), box(385));
+ avl = gpr_avl_add(avl, box(586), box(384), NULL);
+ avl = gpr_avl_add(avl, box(979), box(385), NULL);
avl = remove_int(avl, 979);
- avl = gpr_avl_add(avl, box(639), box(387));
+ avl = gpr_avl_add(avl, box(639), box(387), NULL);
avl = remove_int(avl, 907);
avl = remove_int(avl, 973);
- avl = gpr_avl_add(avl, box(913), box(390));
- avl = gpr_avl_add(avl, box(566), box(391));
- avl = gpr_avl_add(avl, box(883), box(392));
- avl = gpr_avl_add(avl, box(552), box(393));
- avl = gpr_avl_add(avl, box(16), box(394));
+ avl = gpr_avl_add(avl, box(913), box(390), NULL);
+ avl = gpr_avl_add(avl, box(566), box(391), NULL);
+ avl = gpr_avl_add(avl, box(883), box(392), NULL);
+ avl = gpr_avl_add(avl, box(552), box(393), NULL);
+ avl = gpr_avl_add(avl, box(16), box(394), NULL);
avl = remove_int(avl, 60);
- avl = gpr_avl_add(avl, box(567), box(396));
- avl = gpr_avl_add(avl, box(705), box(397));
- avl = gpr_avl_add(avl, box(94), box(398));
+ avl = gpr_avl_add(avl, box(567), box(396), NULL);
+ avl = gpr_avl_add(avl, box(705), box(397), NULL);
+ avl = gpr_avl_add(avl, box(94), box(398), NULL);
avl = remove_int(avl, 321);
- avl = gpr_avl_add(avl, box(207), box(400));
- avl = gpr_avl_add(avl, box(682), box(401));
- avl = gpr_avl_add(avl, box(592), box(402));
- avl = gpr_avl_add(avl, box(10), box(403));
+ avl = gpr_avl_add(avl, box(207), box(400), NULL);
+ avl = gpr_avl_add(avl, box(682), box(401), NULL);
+ avl = gpr_avl_add(avl, box(592), box(402), NULL);
+ avl = gpr_avl_add(avl, box(10), box(403), NULL);
avl = remove_int(avl, 911);
avl = remove_int(avl, 161);
- avl = gpr_avl_add(avl, box(86), box(406));
+ avl = gpr_avl_add(avl, box(86), box(406), NULL);
avl = remove_int(avl, 893);
avl = remove_int(avl, 362);
- avl = gpr_avl_add(avl, box(599), box(409));
+ avl = gpr_avl_add(avl, box(599), box(409), NULL);
avl = remove_int(avl, 413);
- avl = gpr_avl_add(avl, box(867), box(411));
+ avl = gpr_avl_add(avl, box(867), box(411), NULL);
avl = remove_int(avl, 955);
- avl = gpr_avl_add(avl, box(341), box(413));
- avl = gpr_avl_add(avl, box(887), box(414));
+ avl = gpr_avl_add(avl, box(341), box(413), NULL);
+ avl = gpr_avl_add(avl, box(887), box(414), NULL);
avl = remove_int(avl, 706);
- avl = gpr_avl_add(avl, box(939), box(416));
+ avl = gpr_avl_add(avl, box(939), box(416), NULL);
avl = remove_int(avl, 233);
avl = remove_int(avl, 662);
avl = remove_int(avl, 984);
avl = remove_int(avl, 203);
- avl = gpr_avl_add(avl, box(326), box(421));
+ avl = gpr_avl_add(avl, box(326), box(421), NULL);
avl = remove_int(avl, 848);
- avl = gpr_avl_add(avl, box(235), box(423));
+ avl = gpr_avl_add(avl, box(235), box(423), NULL);
avl = remove_int(avl, 617);
- avl = gpr_avl_add(avl, box(565), box(425));
+ avl = gpr_avl_add(avl, box(565), box(425), NULL);
avl = remove_int(avl, 469);
- avl = gpr_avl_add(avl, box(988), box(427));
+ avl = gpr_avl_add(avl, box(988), box(427), NULL);
avl = remove_int(avl, 957);
- avl = gpr_avl_add(avl, box(426), box(429));
+ avl = gpr_avl_add(avl, box(426), box(429), NULL);
avl = remove_int(avl, 967);
- avl = gpr_avl_add(avl, box(890), box(431));
- avl = gpr_avl_add(avl, box(473), box(432));
+ avl = gpr_avl_add(avl, box(890), box(431), NULL);
+ avl = gpr_avl_add(avl, box(473), box(432), NULL);
avl = remove_int(avl, 367);
avl = remove_int(avl, 344);
avl = remove_int(avl, 660);
avl = remove_int(avl, 448);
avl = remove_int(avl, 837);
avl = remove_int(avl, 158);
- avl = gpr_avl_add(avl, box(459), box(439));
+ avl = gpr_avl_add(avl, box(459), box(439), NULL);
avl = remove_int(avl, 882);
avl = remove_int(avl, 782);
- avl = gpr_avl_add(avl, box(408), box(442));
- avl = gpr_avl_add(avl, box(728), box(443));
+ avl = gpr_avl_add(avl, box(408), box(442), NULL);
+ avl = gpr_avl_add(avl, box(728), box(443), NULL);
avl = remove_int(avl, 27);
- avl = gpr_avl_add(avl, box(137), box(445));
- avl = gpr_avl_add(avl, box(239), box(446));
+ avl = gpr_avl_add(avl, box(137), box(445), NULL);
+ avl = gpr_avl_add(avl, box(239), box(446), NULL);
avl = remove_int(avl, 854);
- avl = gpr_avl_add(avl, box(104), box(448));
- avl = gpr_avl_add(avl, box(823), box(449));
- avl = gpr_avl_add(avl, box(524), box(450));
- avl = gpr_avl_add(avl, box(995), box(451));
+ avl = gpr_avl_add(avl, box(104), box(448), NULL);
+ avl = gpr_avl_add(avl, box(823), box(449), NULL);
+ avl = gpr_avl_add(avl, box(524), box(450), NULL);
+ avl = gpr_avl_add(avl, box(995), box(451), NULL);
avl = remove_int(avl, 422);
avl = remove_int(avl, 220);
- avl = gpr_avl_add(avl, box(856), box(454));
+ avl = gpr_avl_add(avl, box(856), box(454), NULL);
avl = remove_int(avl, 332);
- avl = gpr_avl_add(avl, box(679), box(456));
+ avl = gpr_avl_add(avl, box(679), box(456), NULL);
avl = remove_int(avl, 18);
- avl = gpr_avl_add(avl, box(837), box(458));
+ avl = gpr_avl_add(avl, box(837), box(458), NULL);
avl = remove_int(avl, 405);
avl = remove_int(avl, 877);
avl = remove_int(avl, 835);
- avl = gpr_avl_add(avl, box(547), box(462));
+ avl = gpr_avl_add(avl, box(547), box(462), NULL);
avl = remove_int(avl, 805);
avl = remove_int(avl, 862);
- avl = gpr_avl_add(avl, box(75), box(465));
+ avl = gpr_avl_add(avl, box(75), box(465), NULL);
avl = remove_int(avl, 41);
- avl = gpr_avl_add(avl, box(310), box(467));
+ avl = gpr_avl_add(avl, box(310), box(467), NULL);
avl = remove_int(avl, 855);
- avl = gpr_avl_add(avl, box(20), box(469));
+ avl = gpr_avl_add(avl, box(20), box(469), NULL);
avl = remove_int(avl, 186);
avl = remove_int(avl, 378);
avl = remove_int(avl, 442);
avl = remove_int(avl, 930);
- avl = gpr_avl_add(avl, box(118), box(474));
- avl = gpr_avl_add(avl, box(96), box(475));
+ avl = gpr_avl_add(avl, box(118), box(474), NULL);
+ avl = gpr_avl_add(avl, box(96), box(475), NULL);
avl = remove_int(avl, 854);
- avl = gpr_avl_add(avl, box(65), box(477));
- avl = gpr_avl_add(avl, box(573), box(478));
- avl = gpr_avl_add(avl, box(4), box(479));
- avl = gpr_avl_add(avl, box(451), box(480));
- avl = gpr_avl_add(avl, box(774), box(481));
- avl = gpr_avl_add(avl, box(126), box(482));
+ avl = gpr_avl_add(avl, box(65), box(477), NULL);
+ avl = gpr_avl_add(avl, box(573), box(478), NULL);
+ avl = gpr_avl_add(avl, box(4), box(479), NULL);
+ avl = gpr_avl_add(avl, box(451), box(480), NULL);
+ avl = gpr_avl_add(avl, box(774), box(481), NULL);
+ avl = gpr_avl_add(avl, box(126), box(482), NULL);
avl = remove_int(avl, 956);
avl = remove_int(avl, 591);
avl = remove_int(avl, 644);
- avl = gpr_avl_add(avl, box(304), box(486));
+ avl = gpr_avl_add(avl, box(304), box(486), NULL);
avl = remove_int(avl, 620);
avl = remove_int(avl, 394);
- avl = gpr_avl_add(avl, box(1002), box(489));
- avl = gpr_avl_add(avl, box(837), box(490));
+ avl = gpr_avl_add(avl, box(1002), box(489), NULL);
+ avl = gpr_avl_add(avl, box(837), box(490), NULL);
avl = remove_int(avl, 485);
- avl = gpr_avl_add(avl, box(1005), box(492));
+ avl = gpr_avl_add(avl, box(1005), box(492), NULL);
avl = remove_int(avl, 21);
- avl = gpr_avl_add(avl, box(396), box(494));
+ avl = gpr_avl_add(avl, box(396), box(494), NULL);
avl = remove_int(avl, 966);
- avl = gpr_avl_add(avl, box(105), box(496));
- avl = gpr_avl_add(avl, box(316), box(497));
+ avl = gpr_avl_add(avl, box(105), box(496), NULL);
+ avl = gpr_avl_add(avl, box(316), box(497), NULL);
avl = remove_int(avl, 776);
- avl = gpr_avl_add(avl, box(188), box(499));
+ avl = gpr_avl_add(avl, box(188), box(499), NULL);
avl = remove_int(avl, 200);
- avl = gpr_avl_add(avl, box(98), box(501));
- avl = gpr_avl_add(avl, box(831), box(502));
- avl = gpr_avl_add(avl, box(227), box(503));
- avl = gpr_avl_add(avl, box(220), box(504));
+ avl = gpr_avl_add(avl, box(98), box(501), NULL);
+ avl = gpr_avl_add(avl, box(831), box(502), NULL);
+ avl = gpr_avl_add(avl, box(227), box(503), NULL);
+ avl = gpr_avl_add(avl, box(220), box(504), NULL);
avl = remove_int(avl, 715);
avl = remove_int(avl, 279);
- avl = gpr_avl_add(avl, box(701), box(507));
- avl = gpr_avl_add(avl, box(726), box(508));
- avl = gpr_avl_add(avl, box(815), box(509));
- avl = gpr_avl_add(avl, box(749), box(510));
+ avl = gpr_avl_add(avl, box(701), box(507), NULL);
+ avl = gpr_avl_add(avl, box(726), box(508), NULL);
+ avl = gpr_avl_add(avl, box(815), box(509), NULL);
+ avl = gpr_avl_add(avl, box(749), box(510), NULL);
avl = remove_int(avl, 946);
avl = remove_int(avl, 449);
avl = remove_int(avl, 62);
avl = remove_int(avl, 487);
- avl = gpr_avl_add(avl, box(545), box(515));
+ avl = gpr_avl_add(avl, box(545), box(515), NULL);
avl = remove_int(avl, 59);
- avl = gpr_avl_add(avl, box(168), box(517));
+ avl = gpr_avl_add(avl, box(168), box(517), NULL);
avl = remove_int(avl, 337);
- avl = gpr_avl_add(avl, box(69), box(519));
+ avl = gpr_avl_add(avl, box(69), box(519), NULL);
avl = remove_int(avl, 600);
- avl = gpr_avl_add(avl, box(591), box(521));
- avl = gpr_avl_add(avl, box(960), box(522));
- avl = gpr_avl_add(avl, box(116), box(523));
+ avl = gpr_avl_add(avl, box(591), box(521), NULL);
+ avl = gpr_avl_add(avl, box(960), box(522), NULL);
+ avl = gpr_avl_add(avl, box(116), box(523), NULL);
avl = remove_int(avl, 991);
- avl = gpr_avl_add(avl, box(760), box(525));
- avl = gpr_avl_add(avl, box(664), box(526));
- avl = gpr_avl_add(avl, box(547), box(527));
+ avl = gpr_avl_add(avl, box(760), box(525), NULL);
+ avl = gpr_avl_add(avl, box(664), box(526), NULL);
+ avl = gpr_avl_add(avl, box(547), box(527), NULL);
avl = remove_int(avl, 922);
- avl = gpr_avl_add(avl, box(290), box(529));
- avl = gpr_avl_add(avl, box(859), box(530));
- avl = gpr_avl_add(avl, box(49), box(531));
+ avl = gpr_avl_add(avl, box(290), box(529), NULL);
+ avl = gpr_avl_add(avl, box(859), box(530), NULL);
+ avl = gpr_avl_add(avl, box(49), box(531), NULL);
avl = remove_int(avl, 455);
avl = remove_int(avl, 786);
- avl = gpr_avl_add(avl, box(613), box(534));
- avl = gpr_avl_add(avl, box(326), box(535));
+ avl = gpr_avl_add(avl, box(613), box(534), NULL);
+ avl = gpr_avl_add(avl, box(326), box(535), NULL);
avl = remove_int(avl, 615);
- avl = gpr_avl_add(avl, box(45), box(537));
- avl = gpr_avl_add(avl, box(162), box(538));
- avl = gpr_avl_add(avl, box(189), box(539));
+ avl = gpr_avl_add(avl, box(45), box(537), NULL);
+ avl = gpr_avl_add(avl, box(162), box(538), NULL);
+ avl = gpr_avl_add(avl, box(189), box(539), NULL);
avl = remove_int(avl, 68);
avl = remove_int(avl, 846);
- avl = gpr_avl_add(avl, box(608), box(542));
+ avl = gpr_avl_add(avl, box(608), box(542), NULL);
avl = remove_int(avl, 821);
- avl = gpr_avl_add(avl, box(978), box(544));
- avl = gpr_avl_add(avl, box(892), box(545));
+ avl = gpr_avl_add(avl, box(978), box(544), NULL);
+ avl = gpr_avl_add(avl, box(892), box(545), NULL);
avl = remove_int(avl, 924);
- avl = gpr_avl_add(avl, box(708), box(547));
+ avl = gpr_avl_add(avl, box(708), box(547), NULL);
avl = remove_int(avl, 135);
avl = remove_int(avl, 124);
- avl = gpr_avl_add(avl, box(301), box(550));
- avl = gpr_avl_add(avl, box(939), box(551));
- avl = gpr_avl_add(avl, box(344), box(552));
+ avl = gpr_avl_add(avl, box(301), box(550), NULL);
+ avl = gpr_avl_add(avl, box(939), box(551), NULL);
+ avl = gpr_avl_add(avl, box(344), box(552), NULL);
avl = remove_int(avl, 443);
avl = remove_int(avl, 122);
- avl = gpr_avl_add(avl, box(636), box(555));
+ avl = gpr_avl_add(avl, box(636), box(555), NULL);
avl = remove_int(avl, 558);
- avl = gpr_avl_add(avl, box(923), box(557));
+ avl = gpr_avl_add(avl, box(923), box(557), NULL);
avl = remove_int(avl, 827);
- avl = gpr_avl_add(avl, box(649), box(559));
- avl = gpr_avl_add(avl, box(808), box(560));
+ avl = gpr_avl_add(avl, box(649), box(559), NULL);
+ avl = gpr_avl_add(avl, box(808), box(560), NULL);
avl = remove_int(avl, 570);
avl = remove_int(avl, 434);
- avl = gpr_avl_add(avl, box(40), box(563));
- avl = gpr_avl_add(avl, box(725), box(564));
+ avl = gpr_avl_add(avl, box(40), box(563), NULL);
+ avl = gpr_avl_add(avl, box(725), box(564), NULL);
avl = remove_int(avl, 295);
avl = remove_int(avl, 615);
avl = remove_int(avl, 919);
avl = remove_int(avl, 170);
avl = remove_int(avl, 442);
avl = remove_int(avl, 971);
- avl = gpr_avl_add(avl, box(483), box(571));
- avl = gpr_avl_add(avl, box(512), box(572));
+ avl = gpr_avl_add(avl, box(483), box(571), NULL);
+ avl = gpr_avl_add(avl, box(512), box(572), NULL);
avl = remove_int(avl, 648);
avl = remove_int(avl, 78);
avl = remove_int(avl, 72);
avl = remove_int(avl, 790);
avl = remove_int(avl, 571);
- avl = gpr_avl_add(avl, box(898), box(578));
+ avl = gpr_avl_add(avl, box(898), box(578), NULL);
avl = remove_int(avl, 770);
avl = remove_int(avl, 776);
- avl = gpr_avl_add(avl, box(602), box(581));
+ avl = gpr_avl_add(avl, box(602), box(581), NULL);
avl = remove_int(avl, 251);
- avl = gpr_avl_add(avl, box(303), box(583));
+ avl = gpr_avl_add(avl, box(303), box(583), NULL);
avl = remove_int(avl, 837);
- avl = gpr_avl_add(avl, box(714), box(585));
+ avl = gpr_avl_add(avl, box(714), box(585), NULL);
avl = remove_int(avl, 800);
- avl = gpr_avl_add(avl, box(266), box(587));
- avl = gpr_avl_add(avl, box(555), box(588));
+ avl = gpr_avl_add(avl, box(266), box(587), NULL);
+ avl = gpr_avl_add(avl, box(555), box(588), NULL);
avl = remove_int(avl, 604);
avl = remove_int(avl, 163);
avl = remove_int(avl, 497);
- avl = gpr_avl_add(avl, box(296), box(592));
+ avl = gpr_avl_add(avl, box(296), box(592), NULL);
avl = remove_int(avl, 129);
- avl = gpr_avl_add(avl, box(656), box(594));
+ avl = gpr_avl_add(avl, box(656), box(594), NULL);
avl = remove_int(avl, 769);
avl = remove_int(avl, 941);
- avl = gpr_avl_add(avl, box(775), box(597));
- avl = gpr_avl_add(avl, box(846), box(598));
+ avl = gpr_avl_add(avl, box(775), box(597), NULL);
+ avl = gpr_avl_add(avl, box(846), box(598), NULL);
avl = remove_int(avl, 591);
avl = remove_int(avl, 801);
avl = remove_int(avl, 419);
avl = remove_int(avl, 455);
- avl = gpr_avl_add(avl, box(866), box(603));
- avl = gpr_avl_add(avl, box(575), box(604));
- avl = gpr_avl_add(avl, box(620), box(605));
+ avl = gpr_avl_add(avl, box(866), box(603), NULL);
+ avl = gpr_avl_add(avl, box(575), box(604), NULL);
+ avl = gpr_avl_add(avl, box(620), box(605), NULL);
avl = remove_int(avl, 100);
avl = remove_int(avl, 667);
- avl = gpr_avl_add(avl, box(138), box(608));
- avl = gpr_avl_add(avl, box(566), box(609));
- avl = gpr_avl_add(avl, box(673), box(610));
- avl = gpr_avl_add(avl, box(178), box(611));
+ avl = gpr_avl_add(avl, box(138), box(608), NULL);
+ avl = gpr_avl_add(avl, box(566), box(609), NULL);
+ avl = gpr_avl_add(avl, box(673), box(610), NULL);
+ avl = gpr_avl_add(avl, box(178), box(611), NULL);
avl = remove_int(avl, 659);
- avl = gpr_avl_add(avl, box(759), box(613));
- avl = gpr_avl_add(avl, box(1008), box(614));
+ avl = gpr_avl_add(avl, box(759), box(613), NULL);
+ avl = gpr_avl_add(avl, box(1008), box(614), NULL);
avl = remove_int(avl, 116);
- avl = gpr_avl_add(avl, box(608), box(616));
- avl = gpr_avl_add(avl, box(339), box(617));
- avl = gpr_avl_add(avl, box(197), box(618));
+ avl = gpr_avl_add(avl, box(608), box(616), NULL);
+ avl = gpr_avl_add(avl, box(339), box(617), NULL);
+ avl = gpr_avl_add(avl, box(197), box(618), NULL);
avl = remove_int(avl, 25);
avl = remove_int(avl, 628);
- avl = gpr_avl_add(avl, box(487), box(621));
+ avl = gpr_avl_add(avl, box(487), box(621), NULL);
avl = remove_int(avl, 739);
avl = remove_int(avl, 100);
avl = remove_int(avl, 928);
- avl = gpr_avl_add(avl, box(647), box(625));
+ avl = gpr_avl_add(avl, box(647), box(625), NULL);
avl = remove_int(avl, 978);
avl = remove_int(avl, 143);
avl = remove_int(avl, 755);
- avl = gpr_avl_add(avl, box(71), box(629));
+ avl = gpr_avl_add(avl, box(71), box(629), NULL);
avl = remove_int(avl, 205);
- avl = gpr_avl_add(avl, box(501), box(631));
+ avl = gpr_avl_add(avl, box(501), box(631), NULL);
avl = remove_int(avl, 723);
avl = remove_int(avl, 852);
avl = remove_int(avl, 1021);
avl = remove_int(avl, 670);
avl = remove_int(avl, 500);
- avl = gpr_avl_add(avl, box(330), box(637));
+ avl = gpr_avl_add(avl, box(330), box(637), NULL);
avl = remove_int(avl, 264);
- avl = gpr_avl_add(avl, box(69), box(639));
+ avl = gpr_avl_add(avl, box(69), box(639), NULL);
avl = remove_int(avl, 73);
- avl = gpr_avl_add(avl, box(745), box(641));
+ avl = gpr_avl_add(avl, box(745), box(641), NULL);
avl = remove_int(avl, 518);
avl = remove_int(avl, 641);
avl = remove_int(avl, 768);
- avl = gpr_avl_add(avl, box(988), box(645));
- avl = gpr_avl_add(avl, box(899), box(646));
+ avl = gpr_avl_add(avl, box(988), box(645), NULL);
+ avl = gpr_avl_add(avl, box(899), box(646), NULL);
avl = remove_int(avl, 763);
avl = remove_int(avl, 281);
avl = remove_int(avl, 496);
- avl = gpr_avl_add(avl, box(445), box(650));
+ avl = gpr_avl_add(avl, box(445), box(650), NULL);
avl = remove_int(avl, 905);
- avl = gpr_avl_add(avl, box(275), box(652));
- avl = gpr_avl_add(avl, box(137), box(653));
+ avl = gpr_avl_add(avl, box(275), box(652), NULL);
+ avl = gpr_avl_add(avl, box(137), box(653), NULL);
avl = remove_int(avl, 642);
- avl = gpr_avl_add(avl, box(708), box(655));
+ avl = gpr_avl_add(avl, box(708), box(655), NULL);
avl = remove_int(avl, 922);
- avl = gpr_avl_add(avl, box(743), box(657));
+ avl = gpr_avl_add(avl, box(743), box(657), NULL);
avl = remove_int(avl, 295);
avl = remove_int(avl, 665);
avl = remove_int(avl, 48);
- avl = gpr_avl_add(avl, box(1012), box(661));
+ avl = gpr_avl_add(avl, box(1012), box(661), NULL);
avl = remove_int(avl, 71);
avl = remove_int(avl, 523);
- avl = gpr_avl_add(avl, box(319), box(664));
+ avl = gpr_avl_add(avl, box(319), box(664), NULL);
avl = remove_int(avl, 632);
- avl = gpr_avl_add(avl, box(137), box(666));
- avl = gpr_avl_add(avl, box(686), box(667));
- avl = gpr_avl_add(avl, box(724), box(668));
- avl = gpr_avl_add(avl, box(952), box(669));
- avl = gpr_avl_add(avl, box(5), box(670));
+ avl = gpr_avl_add(avl, box(137), box(666), NULL);
+ avl = gpr_avl_add(avl, box(686), box(667), NULL);
+ avl = gpr_avl_add(avl, box(724), box(668), NULL);
+ avl = gpr_avl_add(avl, box(952), box(669), NULL);
+ avl = gpr_avl_add(avl, box(5), box(670), NULL);
avl = remove_int(avl, 35);
- avl = gpr_avl_add(avl, box(43), box(672));
- avl = gpr_avl_add(avl, box(320), box(673));
- avl = gpr_avl_add(avl, box(115), box(674));
+ avl = gpr_avl_add(avl, box(43), box(672), NULL);
+ avl = gpr_avl_add(avl, box(320), box(673), NULL);
+ avl = gpr_avl_add(avl, box(115), box(674), NULL);
avl = remove_int(avl, 377);
avl = remove_int(avl, 591);
avl = remove_int(avl, 87);
avl = remove_int(avl, 93);
- avl = gpr_avl_add(avl, box(1016), box(679));
- avl = gpr_avl_add(avl, box(605), box(680));
- avl = gpr_avl_add(avl, box(152), box(681));
- avl = gpr_avl_add(avl, box(113), box(682));
+ avl = gpr_avl_add(avl, box(1016), box(679), NULL);
+ avl = gpr_avl_add(avl, box(605), box(680), NULL);
+ avl = gpr_avl_add(avl, box(152), box(681), NULL);
+ avl = gpr_avl_add(avl, box(113), box(682), NULL);
avl = remove_int(avl, 131);
avl = remove_int(avl, 637);
- avl = gpr_avl_add(avl, box(156), box(685));
+ avl = gpr_avl_add(avl, box(156), box(685), NULL);
avl = remove_int(avl, 696);
- avl = gpr_avl_add(avl, box(546), box(687));
+ avl = gpr_avl_add(avl, box(546), box(687), NULL);
avl = remove_int(avl, 970);
avl = remove_int(avl, 53);
avl = remove_int(avl, 827);
@@ -1837,22 +1839,22 @@ static void test_badcase3(void) {
avl = remove_int(avl, 244);
avl = remove_int(avl, 576);
avl = remove_int(avl, 413);
- avl = gpr_avl_add(avl, box(500), box(701));
+ avl = gpr_avl_add(avl, box(500), box(701), NULL);
avl = remove_int(avl, 924);
- avl = gpr_avl_add(avl, box(825), box(703));
+ avl = gpr_avl_add(avl, box(825), box(703), NULL);
avl = remove_int(avl, 888);
avl = remove_int(avl, 931);
- avl = gpr_avl_add(avl, box(285), box(706));
+ avl = gpr_avl_add(avl, box(285), box(706), NULL);
avl = remove_int(avl, 62);
avl = remove_int(avl, 444);
avl = remove_int(avl, 946);
- avl = gpr_avl_add(avl, box(122), box(710));
- avl = gpr_avl_add(avl, box(846), box(711));
+ avl = gpr_avl_add(avl, box(122), box(710), NULL);
+ avl = gpr_avl_add(avl, box(846), box(711), NULL);
avl = remove_int(avl, 628);
- avl = gpr_avl_add(avl, box(511), box(713));
- avl = gpr_avl_add(avl, box(398), box(714));
+ avl = gpr_avl_add(avl, box(511), box(713), NULL);
+ avl = gpr_avl_add(avl, box(398), box(714), NULL);
avl = remove_int(avl, 730);
- avl = gpr_avl_add(avl, box(797), box(716));
+ avl = gpr_avl_add(avl, box(797), box(716), NULL);
avl = remove_int(avl, 897);
avl = remove_int(avl, 228);
avl = remove_int(avl, 544);
@@ -1861,51 +1863,51 @@ static void test_badcase3(void) {
avl = remove_int(avl, 583);
avl = remove_int(avl, 894);
avl = remove_int(avl, 942);
- avl = gpr_avl_add(avl, box(346), box(725));
- avl = gpr_avl_add(avl, box(1015), box(726));
+ avl = gpr_avl_add(avl, box(346), box(725), NULL);
+ avl = gpr_avl_add(avl, box(1015), box(726), NULL);
avl = remove_int(avl, 813);
- avl = gpr_avl_add(avl, box(213), box(728));
+ avl = gpr_avl_add(avl, box(213), box(728), NULL);
avl = remove_int(avl, 468);
avl = remove_int(avl, 365);
avl = remove_int(avl, 399);
- avl = gpr_avl_add(avl, box(380), box(732));
+ avl = gpr_avl_add(avl, box(380), box(732), NULL);
avl = remove_int(avl, 835);
avl = remove_int(avl, 970);
- avl = gpr_avl_add(avl, box(700), box(735));
- avl = gpr_avl_add(avl, box(807), box(736));
+ avl = gpr_avl_add(avl, box(700), box(735), NULL);
+ avl = gpr_avl_add(avl, box(807), box(736), NULL);
avl = remove_int(avl, 312);
avl = remove_int(avl, 282);
avl = remove_int(avl, 370);
avl = remove_int(avl, 999);
avl = remove_int(avl, 241);
avl = remove_int(avl, 884);
- avl = gpr_avl_add(avl, box(587), box(743));
- avl = gpr_avl_add(avl, box(332), box(744));
+ avl = gpr_avl_add(avl, box(587), box(743), NULL);
+ avl = gpr_avl_add(avl, box(332), box(744), NULL);
avl = remove_int(avl, 686);
avl = remove_int(avl, 206);
avl = remove_int(avl, 835);
- avl = gpr_avl_add(avl, box(334), box(748));
+ avl = gpr_avl_add(avl, box(334), box(748), NULL);
avl = remove_int(avl, 171);
- avl = gpr_avl_add(avl, box(1002), box(750));
- avl = gpr_avl_add(avl, box(779), box(751));
- avl = gpr_avl_add(avl, box(307), box(752));
- avl = gpr_avl_add(avl, box(127), box(753));
- avl = gpr_avl_add(avl, box(251), box(754));
+ avl = gpr_avl_add(avl, box(1002), box(750), NULL);
+ avl = gpr_avl_add(avl, box(779), box(751), NULL);
+ avl = gpr_avl_add(avl, box(307), box(752), NULL);
+ avl = gpr_avl_add(avl, box(127), box(753), NULL);
+ avl = gpr_avl_add(avl, box(251), box(754), NULL);
avl = remove_int(avl, 790);
avl = remove_int(avl, 189);
avl = remove_int(avl, 193);
avl = remove_int(avl, 38);
avl = remove_int(avl, 124);
- avl = gpr_avl_add(avl, box(812), box(760));
+ avl = gpr_avl_add(avl, box(812), box(760), NULL);
avl = remove_int(avl, 43);
- avl = gpr_avl_add(avl, box(871), box(762));
- avl = gpr_avl_add(avl, box(580), box(763));
+ avl = gpr_avl_add(avl, box(871), box(762), NULL);
+ avl = gpr_avl_add(avl, box(580), box(763), NULL);
avl = remove_int(avl, 501);
avl = remove_int(avl, 462);
avl = remove_int(avl, 599);
- avl = gpr_avl_add(avl, box(240), box(767));
- avl = gpr_avl_add(avl, box(285), box(768));
- avl = gpr_avl_add(avl, box(472), box(769));
+ avl = gpr_avl_add(avl, box(240), box(767), NULL);
+ avl = gpr_avl_add(avl, box(285), box(768), NULL);
+ avl = gpr_avl_add(avl, box(472), box(769), NULL);
avl = remove_int(avl, 865);
avl = remove_int(avl, 763);
avl = remove_int(avl, 245);
@@ -1913,48 +1915,48 @@ static void test_badcase3(void) {
avl = remove_int(avl, 713);
avl = remove_int(avl, 654);
avl = remove_int(avl, 1014);
- avl = gpr_avl_add(avl, box(495), box(777));
- avl = gpr_avl_add(avl, box(552), box(778));
+ avl = gpr_avl_add(avl, box(495), box(777), NULL);
+ avl = gpr_avl_add(avl, box(552), box(778), NULL);
avl = remove_int(avl, 19);
avl = remove_int(avl, 803);
- avl = gpr_avl_add(avl, box(508), box(781));
+ avl = gpr_avl_add(avl, box(508), box(781), NULL);
avl = remove_int(avl, 699);
avl = remove_int(avl, 260);
avl = remove_int(avl, 92);
avl = remove_int(avl, 497);
- avl = gpr_avl_add(avl, box(970), box(786));
+ avl = gpr_avl_add(avl, box(970), box(786), NULL);
avl = remove_int(avl, 987);
avl = remove_int(avl, 168);
avl = remove_int(avl, 476);
avl = remove_int(avl, 248);
- avl = gpr_avl_add(avl, box(358), box(791));
+ avl = gpr_avl_add(avl, box(358), box(791), NULL);
avl = remove_int(avl, 804);
avl = remove_int(avl, 77);
avl = remove_int(avl, 905);
avl = remove_int(avl, 362);
- avl = gpr_avl_add(avl, box(578), box(796));
+ avl = gpr_avl_add(avl, box(578), box(796), NULL);
avl = remove_int(avl, 38);
avl = remove_int(avl, 595);
- avl = gpr_avl_add(avl, box(213), box(799));
+ avl = gpr_avl_add(avl, box(213), box(799), NULL);
avl = remove_int(avl, 7);
avl = remove_int(avl, 620);
- avl = gpr_avl_add(avl, box(946), box(802));
+ avl = gpr_avl_add(avl, box(946), box(802), NULL);
avl = remove_int(avl, 145);
- avl = gpr_avl_add(avl, box(628), box(804));
+ avl = gpr_avl_add(avl, box(628), box(804), NULL);
avl = remove_int(avl, 972);
- avl = gpr_avl_add(avl, box(728), box(806));
+ avl = gpr_avl_add(avl, box(728), box(806), NULL);
avl = remove_int(avl, 91);
- avl = gpr_avl_add(avl, box(136), box(808));
- avl = gpr_avl_add(avl, box(841), box(809));
- avl = gpr_avl_add(avl, box(265), box(810));
- avl = gpr_avl_add(avl, box(701), box(811));
- avl = gpr_avl_add(avl, box(27), box(812));
+ avl = gpr_avl_add(avl, box(136), box(808), NULL);
+ avl = gpr_avl_add(avl, box(841), box(809), NULL);
+ avl = gpr_avl_add(avl, box(265), box(810), NULL);
+ avl = gpr_avl_add(avl, box(701), box(811), NULL);
+ avl = gpr_avl_add(avl, box(27), box(812), NULL);
avl = remove_int(avl, 72);
avl = remove_int(avl, 14);
- avl = gpr_avl_add(avl, box(286), box(815));
+ avl = gpr_avl_add(avl, box(286), box(815), NULL);
avl = remove_int(avl, 996);
avl = remove_int(avl, 998);
- avl = gpr_avl_add(avl, box(466), box(818));
+ avl = gpr_avl_add(avl, box(466), box(818), NULL);
avl = remove_int(avl, 1009);
avl = remove_int(avl, 741);
avl = remove_int(avl, 947);
@@ -1963,138 +1965,138 @@ static void test_badcase3(void) {
avl = remove_int(avl, 183);
avl = remove_int(avl, 395);
avl = remove_int(avl, 951);
- avl = gpr_avl_add(avl, box(267), box(827));
+ avl = gpr_avl_add(avl, box(267), box(827), NULL);
avl = remove_int(avl, 812);
- avl = gpr_avl_add(avl, box(577), box(829));
+ avl = gpr_avl_add(avl, box(577), box(829), NULL);
avl = remove_int(avl, 624);
avl = remove_int(avl, 847);
avl = remove_int(avl, 745);
- avl = gpr_avl_add(avl, box(491), box(833));
- avl = gpr_avl_add(avl, box(941), box(834));
+ avl = gpr_avl_add(avl, box(491), box(833), NULL);
+ avl = gpr_avl_add(avl, box(941), box(834), NULL);
avl = remove_int(avl, 258);
- avl = gpr_avl_add(avl, box(410), box(836));
- avl = gpr_avl_add(avl, box(80), box(837));
- avl = gpr_avl_add(avl, box(196), box(838));
- avl = gpr_avl_add(avl, box(5), box(839));
+ avl = gpr_avl_add(avl, box(410), box(836), NULL);
+ avl = gpr_avl_add(avl, box(80), box(837), NULL);
+ avl = gpr_avl_add(avl, box(196), box(838), NULL);
+ avl = gpr_avl_add(avl, box(5), box(839), NULL);
avl = remove_int(avl, 782);
- avl = gpr_avl_add(avl, box(827), box(841));
+ avl = gpr_avl_add(avl, box(827), box(841), NULL);
avl = remove_int(avl, 472);
avl = remove_int(avl, 664);
- avl = gpr_avl_add(avl, box(409), box(844));
- avl = gpr_avl_add(avl, box(62), box(845));
+ avl = gpr_avl_add(avl, box(409), box(844), NULL);
+ avl = gpr_avl_add(avl, box(62), box(845), NULL);
avl = remove_int(avl, 56);
avl = remove_int(avl, 606);
avl = remove_int(avl, 707);
avl = remove_int(avl, 989);
avl = remove_int(avl, 549);
avl = remove_int(avl, 259);
- avl = gpr_avl_add(avl, box(405), box(852));
+ avl = gpr_avl_add(avl, box(405), box(852), NULL);
avl = remove_int(avl, 587);
avl = remove_int(avl, 350);
- avl = gpr_avl_add(avl, box(980), box(855));
- avl = gpr_avl_add(avl, box(992), box(856));
- avl = gpr_avl_add(avl, box(818), box(857));
+ avl = gpr_avl_add(avl, box(980), box(855), NULL);
+ avl = gpr_avl_add(avl, box(992), box(856), NULL);
+ avl = gpr_avl_add(avl, box(818), box(857), NULL);
avl = remove_int(avl, 853);
avl = remove_int(avl, 701);
- avl = gpr_avl_add(avl, box(675), box(860));
+ avl = gpr_avl_add(avl, box(675), box(860), NULL);
avl = remove_int(avl, 248);
avl = remove_int(avl, 649);
- avl = gpr_avl_add(avl, box(508), box(863));
+ avl = gpr_avl_add(avl, box(508), box(863), NULL);
avl = remove_int(avl, 927);
- avl = gpr_avl_add(avl, box(957), box(865));
- avl = gpr_avl_add(avl, box(698), box(866));
- avl = gpr_avl_add(avl, box(388), box(867));
- avl = gpr_avl_add(avl, box(532), box(868));
- avl = gpr_avl_add(avl, box(681), box(869));
+ avl = gpr_avl_add(avl, box(957), box(865), NULL);
+ avl = gpr_avl_add(avl, box(698), box(866), NULL);
+ avl = gpr_avl_add(avl, box(388), box(867), NULL);
+ avl = gpr_avl_add(avl, box(532), box(868), NULL);
+ avl = gpr_avl_add(avl, box(681), box(869), NULL);
avl = remove_int(avl, 544);
avl = remove_int(avl, 991);
avl = remove_int(avl, 397);
- avl = gpr_avl_add(avl, box(954), box(873));
- avl = gpr_avl_add(avl, box(219), box(874));
- avl = gpr_avl_add(avl, box(465), box(875));
+ avl = gpr_avl_add(avl, box(954), box(873), NULL);
+ avl = gpr_avl_add(avl, box(219), box(874), NULL);
+ avl = gpr_avl_add(avl, box(465), box(875), NULL);
avl = remove_int(avl, 371);
- avl = gpr_avl_add(avl, box(601), box(877));
- avl = gpr_avl_add(avl, box(543), box(878));
+ avl = gpr_avl_add(avl, box(601), box(877), NULL);
+ avl = gpr_avl_add(avl, box(543), box(878), NULL);
avl = remove_int(avl, 329);
- avl = gpr_avl_add(avl, box(560), box(880));
+ avl = gpr_avl_add(avl, box(560), box(880), NULL);
avl = remove_int(avl, 898);
- avl = gpr_avl_add(avl, box(455), box(882));
+ avl = gpr_avl_add(avl, box(455), box(882), NULL);
avl = remove_int(avl, 313);
- avl = gpr_avl_add(avl, box(215), box(884));
+ avl = gpr_avl_add(avl, box(215), box(884), NULL);
avl = remove_int(avl, 846);
- avl = gpr_avl_add(avl, box(608), box(886));
+ avl = gpr_avl_add(avl, box(608), box(886), NULL);
avl = remove_int(avl, 248);
- avl = gpr_avl_add(avl, box(575), box(888));
+ avl = gpr_avl_add(avl, box(575), box(888), NULL);
avl = remove_int(avl, 207);
avl = remove_int(avl, 810);
avl = remove_int(avl, 665);
avl = remove_int(avl, 361);
- avl = gpr_avl_add(avl, box(154), box(893));
- avl = gpr_avl_add(avl, box(329), box(894));
- avl = gpr_avl_add(avl, box(326), box(895));
+ avl = gpr_avl_add(avl, box(154), box(893), NULL);
+ avl = gpr_avl_add(avl, box(329), box(894), NULL);
+ avl = gpr_avl_add(avl, box(326), box(895), NULL);
avl = remove_int(avl, 746);
avl = remove_int(avl, 99);
- avl = gpr_avl_add(avl, box(464), box(898));
- avl = gpr_avl_add(avl, box(141), box(899));
+ avl = gpr_avl_add(avl, box(464), box(898), NULL);
+ avl = gpr_avl_add(avl, box(141), box(899), NULL);
avl = remove_int(avl, 383);
- avl = gpr_avl_add(avl, box(414), box(901));
- avl = gpr_avl_add(avl, box(777), box(902));
+ avl = gpr_avl_add(avl, box(414), box(901), NULL);
+ avl = gpr_avl_add(avl, box(777), box(902), NULL);
avl = remove_int(avl, 972);
avl = remove_int(avl, 841);
avl = remove_int(avl, 100);
- avl = gpr_avl_add(avl, box(828), box(906));
+ avl = gpr_avl_add(avl, box(828), box(906), NULL);
avl = remove_int(avl, 785);
- avl = gpr_avl_add(avl, box(1008), box(908));
- avl = gpr_avl_add(avl, box(46), box(909));
+ avl = gpr_avl_add(avl, box(1008), box(908), NULL);
+ avl = gpr_avl_add(avl, box(46), box(909), NULL);
avl = remove_int(avl, 399);
- avl = gpr_avl_add(avl, box(178), box(911));
- avl = gpr_avl_add(avl, box(573), box(912));
+ avl = gpr_avl_add(avl, box(178), box(911), NULL);
+ avl = gpr_avl_add(avl, box(573), box(912), NULL);
avl = remove_int(avl, 299);
- avl = gpr_avl_add(avl, box(690), box(914));
- avl = gpr_avl_add(avl, box(692), box(915));
+ avl = gpr_avl_add(avl, box(690), box(914), NULL);
+ avl = gpr_avl_add(avl, box(692), box(915), NULL);
avl = remove_int(avl, 404);
avl = remove_int(avl, 16);
avl = remove_int(avl, 746);
avl = remove_int(avl, 486);
avl = remove_int(avl, 119);
- avl = gpr_avl_add(avl, box(167), box(921));
+ avl = gpr_avl_add(avl, box(167), box(921), NULL);
avl = remove_int(avl, 328);
- avl = gpr_avl_add(avl, box(89), box(923));
+ avl = gpr_avl_add(avl, box(89), box(923), NULL);
avl = remove_int(avl, 867);
avl = remove_int(avl, 626);
avl = remove_int(avl, 507);
- avl = gpr_avl_add(avl, box(365), box(927));
- avl = gpr_avl_add(avl, box(58), box(928));
- avl = gpr_avl_add(avl, box(70), box(929));
+ avl = gpr_avl_add(avl, box(365), box(927), NULL);
+ avl = gpr_avl_add(avl, box(58), box(928), NULL);
+ avl = gpr_avl_add(avl, box(70), box(929), NULL);
avl = remove_int(avl, 81);
avl = remove_int(avl, 797);
- avl = gpr_avl_add(avl, box(846), box(932));
+ avl = gpr_avl_add(avl, box(846), box(932), NULL);
avl = remove_int(avl, 642);
- avl = gpr_avl_add(avl, box(777), box(934));
+ avl = gpr_avl_add(avl, box(777), box(934), NULL);
avl = remove_int(avl, 107);
- avl = gpr_avl_add(avl, box(691), box(936));
- avl = gpr_avl_add(avl, box(820), box(937));
- avl = gpr_avl_add(avl, box(202), box(938));
- avl = gpr_avl_add(avl, box(308), box(939));
- avl = gpr_avl_add(avl, box(20), box(940));
+ avl = gpr_avl_add(avl, box(691), box(936), NULL);
+ avl = gpr_avl_add(avl, box(820), box(937), NULL);
+ avl = gpr_avl_add(avl, box(202), box(938), NULL);
+ avl = gpr_avl_add(avl, box(308), box(939), NULL);
+ avl = gpr_avl_add(avl, box(20), box(940), NULL);
avl = remove_int(avl, 289);
- avl = gpr_avl_add(avl, box(714), box(942));
- avl = gpr_avl_add(avl, box(584), box(943));
+ avl = gpr_avl_add(avl, box(714), box(942), NULL);
+ avl = gpr_avl_add(avl, box(584), box(943), NULL);
avl = remove_int(avl, 294);
- avl = gpr_avl_add(avl, box(496), box(945));
- avl = gpr_avl_add(avl, box(394), box(946));
- avl = gpr_avl_add(avl, box(860), box(947));
- avl = gpr_avl_add(avl, box(58), box(948));
+ avl = gpr_avl_add(avl, box(496), box(945), NULL);
+ avl = gpr_avl_add(avl, box(394), box(946), NULL);
+ avl = gpr_avl_add(avl, box(860), box(947), NULL);
+ avl = gpr_avl_add(avl, box(58), box(948), NULL);
avl = remove_int(avl, 784);
avl = remove_int(avl, 584);
avl = remove_int(avl, 708);
- avl = gpr_avl_add(avl, box(142), box(952));
- avl = gpr_avl_add(avl, box(247), box(953));
- avl = gpr_avl_add(avl, box(389), box(954));
+ avl = gpr_avl_add(avl, box(142), box(952), NULL);
+ avl = gpr_avl_add(avl, box(247), box(953), NULL);
+ avl = gpr_avl_add(avl, box(389), box(954), NULL);
avl = remove_int(avl, 390);
- avl = gpr_avl_add(avl, box(465), box(956));
- avl = gpr_avl_add(avl, box(936), box(957));
- avl = gpr_avl_add(avl, box(309), box(958));
+ avl = gpr_avl_add(avl, box(465), box(956), NULL);
+ avl = gpr_avl_add(avl, box(936), box(957), NULL);
+ avl = gpr_avl_add(avl, box(309), box(958), NULL);
avl = remove_int(avl, 928);
avl = remove_int(avl, 128);
avl = remove_int(avl, 979);
@@ -2102,15 +2104,15 @@ static void test_badcase3(void) {
avl = remove_int(avl, 738);
avl = remove_int(avl, 271);
avl = remove_int(avl, 540);
- avl = gpr_avl_add(avl, box(365), box(966));
+ avl = gpr_avl_add(avl, box(365), box(966), NULL);
avl = remove_int(avl, 82);
- avl = gpr_avl_add(avl, box(728), box(968));
+ avl = gpr_avl_add(avl, box(728), box(968), NULL);
avl = remove_int(avl, 852);
- avl = gpr_avl_add(avl, box(884), box(970));
- avl = gpr_avl_add(avl, box(502), box(971));
+ avl = gpr_avl_add(avl, box(884), box(970), NULL);
+ avl = gpr_avl_add(avl, box(502), box(971), NULL);
avl = remove_int(avl, 898);
avl = remove_int(avl, 481);
- avl = gpr_avl_add(avl, box(911), box(974));
+ avl = gpr_avl_add(avl, box(911), box(974), NULL);
avl = remove_int(avl, 787);
avl = remove_int(avl, 785);
avl = remove_int(avl, 537);
@@ -2119,125 +2121,125 @@ static void test_badcase3(void) {
avl = remove_int(avl, 749);
avl = remove_int(avl, 637);
avl = remove_int(avl, 900);
- avl = gpr_avl_add(avl, box(598), box(983));
+ avl = gpr_avl_add(avl, box(598), box(983), NULL);
avl = remove_int(avl, 25);
avl = remove_int(avl, 697);
- avl = gpr_avl_add(avl, box(645), box(986));
- avl = gpr_avl_add(avl, box(211), box(987));
- avl = gpr_avl_add(avl, box(589), box(988));
+ avl = gpr_avl_add(avl, box(645), box(986), NULL);
+ avl = gpr_avl_add(avl, box(211), box(987), NULL);
+ avl = gpr_avl_add(avl, box(589), box(988), NULL);
avl = remove_int(avl, 702);
- avl = gpr_avl_add(avl, box(53), box(990));
+ avl = gpr_avl_add(avl, box(53), box(990), NULL);
avl = remove_int(avl, 492);
avl = remove_int(avl, 185);
avl = remove_int(avl, 246);
avl = remove_int(avl, 257);
avl = remove_int(avl, 502);
avl = remove_int(avl, 34);
- avl = gpr_avl_add(avl, box(74), box(997));
- avl = gpr_avl_add(avl, box(834), box(998));
- avl = gpr_avl_add(avl, box(514), box(999));
- avl = gpr_avl_add(avl, box(75), box(1000));
+ avl = gpr_avl_add(avl, box(74), box(997), NULL);
+ avl = gpr_avl_add(avl, box(834), box(998), NULL);
+ avl = gpr_avl_add(avl, box(514), box(999), NULL);
+ avl = gpr_avl_add(avl, box(75), box(1000), NULL);
avl = remove_int(avl, 745);
- avl = gpr_avl_add(avl, box(362), box(1002));
+ avl = gpr_avl_add(avl, box(362), box(1002), NULL);
avl = remove_int(avl, 215);
- avl = gpr_avl_add(avl, box(624), box(1004));
+ avl = gpr_avl_add(avl, box(624), box(1004), NULL);
avl = remove_int(avl, 404);
avl = remove_int(avl, 359);
avl = remove_int(avl, 491);
- avl = gpr_avl_add(avl, box(903), box(1008));
- avl = gpr_avl_add(avl, box(240), box(1009));
+ avl = gpr_avl_add(avl, box(903), box(1008), NULL);
+ avl = gpr_avl_add(avl, box(240), box(1009), NULL);
avl = remove_int(avl, 95);
- avl = gpr_avl_add(avl, box(119), box(1011));
- avl = gpr_avl_add(avl, box(857), box(1012));
+ avl = gpr_avl_add(avl, box(119), box(1011), NULL);
+ avl = gpr_avl_add(avl, box(857), box(1012), NULL);
avl = remove_int(avl, 39);
avl = remove_int(avl, 866);
- avl = gpr_avl_add(avl, box(503), box(1015));
- avl = gpr_avl_add(avl, box(740), box(1016));
+ avl = gpr_avl_add(avl, box(503), box(1015), NULL);
+ avl = gpr_avl_add(avl, box(740), box(1016), NULL);
avl = remove_int(avl, 637);
avl = remove_int(avl, 156);
avl = remove_int(avl, 6);
avl = remove_int(avl, 745);
avl = remove_int(avl, 433);
avl = remove_int(avl, 283);
- avl = gpr_avl_add(avl, box(625), box(1023));
+ avl = gpr_avl_add(avl, box(625), box(1023), NULL);
avl = remove_int(avl, 638);
- avl = gpr_avl_add(avl, box(299), box(1025));
- avl = gpr_avl_add(avl, box(584), box(1026));
+ avl = gpr_avl_add(avl, box(299), box(1025), NULL);
+ avl = gpr_avl_add(avl, box(584), box(1026), NULL);
avl = remove_int(avl, 863);
- avl = gpr_avl_add(avl, box(612), box(1028));
- avl = gpr_avl_add(avl, box(62), box(1029));
- avl = gpr_avl_add(avl, box(432), box(1030));
+ avl = gpr_avl_add(avl, box(612), box(1028), NULL);
+ avl = gpr_avl_add(avl, box(62), box(1029), NULL);
+ avl = gpr_avl_add(avl, box(432), box(1030), NULL);
avl = remove_int(avl, 371);
avl = remove_int(avl, 790);
avl = remove_int(avl, 227);
avl = remove_int(avl, 836);
- avl = gpr_avl_add(avl, box(703), box(1035));
- avl = gpr_avl_add(avl, box(644), box(1036));
+ avl = gpr_avl_add(avl, box(703), box(1035), NULL);
+ avl = gpr_avl_add(avl, box(644), box(1036), NULL);
avl = remove_int(avl, 638);
- avl = gpr_avl_add(avl, box(13), box(1038));
+ avl = gpr_avl_add(avl, box(13), box(1038), NULL);
avl = remove_int(avl, 66);
avl = remove_int(avl, 82);
- avl = gpr_avl_add(avl, box(362), box(1041));
- avl = gpr_avl_add(avl, box(783), box(1042));
+ avl = gpr_avl_add(avl, box(362), box(1041), NULL);
+ avl = gpr_avl_add(avl, box(783), box(1042), NULL);
avl = remove_int(avl, 60);
- avl = gpr_avl_add(avl, box(80), box(1044));
- avl = gpr_avl_add(avl, box(825), box(1045));
- avl = gpr_avl_add(avl, box(688), box(1046));
- avl = gpr_avl_add(avl, box(662), box(1047));
+ avl = gpr_avl_add(avl, box(80), box(1044), NULL);
+ avl = gpr_avl_add(avl, box(825), box(1045), NULL);
+ avl = gpr_avl_add(avl, box(688), box(1046), NULL);
+ avl = gpr_avl_add(avl, box(662), box(1047), NULL);
avl = remove_int(avl, 156);
avl = remove_int(avl, 376);
avl = remove_int(avl, 99);
- avl = gpr_avl_add(avl, box(526), box(1051));
- avl = gpr_avl_add(avl, box(168), box(1052));
+ avl = gpr_avl_add(avl, box(526), box(1051), NULL);
+ avl = gpr_avl_add(avl, box(168), box(1052), NULL);
avl = remove_int(avl, 646);
avl = remove_int(avl, 380);
avl = remove_int(avl, 833);
- avl = gpr_avl_add(avl, box(53), box(1056));
+ avl = gpr_avl_add(avl, box(53), box(1056), NULL);
avl = remove_int(avl, 105);
- avl = gpr_avl_add(avl, box(373), box(1058));
- avl = gpr_avl_add(avl, box(184), box(1059));
+ avl = gpr_avl_add(avl, box(373), box(1058), NULL);
+ avl = gpr_avl_add(avl, box(184), box(1059), NULL);
avl = remove_int(avl, 288);
- avl = gpr_avl_add(avl, box(966), box(1061));
+ avl = gpr_avl_add(avl, box(966), box(1061), NULL);
avl = remove_int(avl, 158);
- avl = gpr_avl_add(avl, box(406), box(1063));
+ avl = gpr_avl_add(avl, box(406), box(1063), NULL);
avl = remove_int(avl, 470);
- avl = gpr_avl_add(avl, box(283), box(1065));
- avl = gpr_avl_add(avl, box(838), box(1066));
- avl = gpr_avl_add(avl, box(288), box(1067));
- avl = gpr_avl_add(avl, box(950), box(1068));
- avl = gpr_avl_add(avl, box(163), box(1069));
+ avl = gpr_avl_add(avl, box(283), box(1065), NULL);
+ avl = gpr_avl_add(avl, box(838), box(1066), NULL);
+ avl = gpr_avl_add(avl, box(288), box(1067), NULL);
+ avl = gpr_avl_add(avl, box(950), box(1068), NULL);
+ avl = gpr_avl_add(avl, box(163), box(1069), NULL);
avl = remove_int(avl, 623);
avl = remove_int(avl, 769);
- avl = gpr_avl_add(avl, box(144), box(1072));
- avl = gpr_avl_add(avl, box(489), box(1073));
+ avl = gpr_avl_add(avl, box(144), box(1072), NULL);
+ avl = gpr_avl_add(avl, box(489), box(1073), NULL);
avl = remove_int(avl, 15);
- avl = gpr_avl_add(avl, box(971), box(1075));
+ avl = gpr_avl_add(avl, box(971), box(1075), NULL);
avl = remove_int(avl, 660);
- avl = gpr_avl_add(avl, box(255), box(1077));
+ avl = gpr_avl_add(avl, box(255), box(1077), NULL);
avl = remove_int(avl, 494);
- avl = gpr_avl_add(avl, box(109), box(1079));
- avl = gpr_avl_add(avl, box(420), box(1080));
- avl = gpr_avl_add(avl, box(509), box(1081));
+ avl = gpr_avl_add(avl, box(109), box(1079), NULL);
+ avl = gpr_avl_add(avl, box(420), box(1080), NULL);
+ avl = gpr_avl_add(avl, box(509), box(1081), NULL);
avl = remove_int(avl, 178);
- avl = gpr_avl_add(avl, box(216), box(1083));
- avl = gpr_avl_add(avl, box(707), box(1084));
- avl = gpr_avl_add(avl, box(411), box(1085));
- avl = gpr_avl_add(avl, box(352), box(1086));
+ avl = gpr_avl_add(avl, box(216), box(1083), NULL);
+ avl = gpr_avl_add(avl, box(707), box(1084), NULL);
+ avl = gpr_avl_add(avl, box(411), box(1085), NULL);
+ avl = gpr_avl_add(avl, box(352), box(1086), NULL);
avl = remove_int(avl, 983);
- avl = gpr_avl_add(avl, box(6), box(1088));
- avl = gpr_avl_add(avl, box(1014), box(1089));
+ avl = gpr_avl_add(avl, box(6), box(1088), NULL);
+ avl = gpr_avl_add(avl, box(1014), box(1089), NULL);
avl = remove_int(avl, 98);
avl = remove_int(avl, 325);
- avl = gpr_avl_add(avl, box(851), box(1092));
+ avl = gpr_avl_add(avl, box(851), box(1092), NULL);
avl = remove_int(avl, 553);
- avl = gpr_avl_add(avl, box(218), box(1094));
- avl = gpr_avl_add(avl, box(261), box(1095));
+ avl = gpr_avl_add(avl, box(218), box(1094), NULL);
+ avl = gpr_avl_add(avl, box(261), box(1095), NULL);
avl = remove_int(avl, 31);
- avl = gpr_avl_add(avl, box(872), box(1097));
+ avl = gpr_avl_add(avl, box(872), box(1097), NULL);
avl = remove_int(avl, 543);
avl = remove_int(avl, 314);
avl = remove_int(avl, 443);
- avl = gpr_avl_add(avl, box(533), box(1101));
+ avl = gpr_avl_add(avl, box(533), box(1101), NULL);
avl = remove_int(avl, 881);
avl = remove_int(avl, 269);
avl = remove_int(avl, 940);
@@ -2246,114 +2248,114 @@ static void test_badcase3(void) {
avl = remove_int(avl, 773);
avl = remove_int(avl, 790);
avl = remove_int(avl, 345);
- avl = gpr_avl_add(avl, box(965), box(1110));
+ avl = gpr_avl_add(avl, box(965), box(1110), NULL);
avl = remove_int(avl, 622);
- avl = gpr_avl_add(avl, box(352), box(1112));
+ avl = gpr_avl_add(avl, box(352), box(1112), NULL);
avl = remove_int(avl, 182);
- avl = gpr_avl_add(avl, box(534), box(1114));
- avl = gpr_avl_add(avl, box(97), box(1115));
- avl = gpr_avl_add(avl, box(198), box(1116));
+ avl = gpr_avl_add(avl, box(534), box(1114), NULL);
+ avl = gpr_avl_add(avl, box(97), box(1115), NULL);
+ avl = gpr_avl_add(avl, box(198), box(1116), NULL);
avl = remove_int(avl, 750);
- avl = gpr_avl_add(avl, box(98), box(1118));
+ avl = gpr_avl_add(avl, box(98), box(1118), NULL);
avl = remove_int(avl, 943);
- avl = gpr_avl_add(avl, box(254), box(1120));
- avl = gpr_avl_add(avl, box(30), box(1121));
+ avl = gpr_avl_add(avl, box(254), box(1120), NULL);
+ avl = gpr_avl_add(avl, box(30), box(1121), NULL);
avl = remove_int(avl, 14);
avl = remove_int(avl, 475);
avl = remove_int(avl, 82);
- avl = gpr_avl_add(avl, box(789), box(1125));
- avl = gpr_avl_add(avl, box(402), box(1126));
+ avl = gpr_avl_add(avl, box(789), box(1125), NULL);
+ avl = gpr_avl_add(avl, box(402), box(1126), NULL);
avl = remove_int(avl, 1019);
- avl = gpr_avl_add(avl, box(858), box(1128));
- avl = gpr_avl_add(avl, box(625), box(1129));
+ avl = gpr_avl_add(avl, box(858), box(1128), NULL);
+ avl = gpr_avl_add(avl, box(625), box(1129), NULL);
avl = remove_int(avl, 675);
avl = remove_int(avl, 323);
- avl = gpr_avl_add(avl, box(329), box(1132));
+ avl = gpr_avl_add(avl, box(329), box(1132), NULL);
avl = remove_int(avl, 929);
avl = remove_int(avl, 44);
- avl = gpr_avl_add(avl, box(443), box(1135));
- avl = gpr_avl_add(avl, box(653), box(1136));
- avl = gpr_avl_add(avl, box(750), box(1137));
- avl = gpr_avl_add(avl, box(252), box(1138));
- avl = gpr_avl_add(avl, box(449), box(1139));
+ avl = gpr_avl_add(avl, box(443), box(1135), NULL);
+ avl = gpr_avl_add(avl, box(653), box(1136), NULL);
+ avl = gpr_avl_add(avl, box(750), box(1137), NULL);
+ avl = gpr_avl_add(avl, box(252), box(1138), NULL);
+ avl = gpr_avl_add(avl, box(449), box(1139), NULL);
avl = remove_int(avl, 1022);
avl = remove_int(avl, 357);
avl = remove_int(avl, 602);
avl = remove_int(avl, 131);
- avl = gpr_avl_add(avl, box(531), box(1144));
+ avl = gpr_avl_add(avl, box(531), box(1144), NULL);
avl = remove_int(avl, 806);
- avl = gpr_avl_add(avl, box(455), box(1146));
+ avl = gpr_avl_add(avl, box(455), box(1146), NULL);
avl = remove_int(avl, 31);
- avl = gpr_avl_add(avl, box(154), box(1148));
- avl = gpr_avl_add(avl, box(189), box(1149));
+ avl = gpr_avl_add(avl, box(154), box(1148), NULL);
+ avl = gpr_avl_add(avl, box(189), box(1149), NULL);
avl = remove_int(avl, 786);
- avl = gpr_avl_add(avl, box(496), box(1151));
- avl = gpr_avl_add(avl, box(81), box(1152));
- avl = gpr_avl_add(avl, box(59), box(1153));
+ avl = gpr_avl_add(avl, box(496), box(1151), NULL);
+ avl = gpr_avl_add(avl, box(81), box(1152), NULL);
+ avl = gpr_avl_add(avl, box(59), box(1153), NULL);
avl = remove_int(avl, 424);
avl = remove_int(avl, 668);
- avl = gpr_avl_add(avl, box(723), box(1156));
- avl = gpr_avl_add(avl, box(822), box(1157));
- avl = gpr_avl_add(avl, box(354), box(1158));
+ avl = gpr_avl_add(avl, box(723), box(1156), NULL);
+ avl = gpr_avl_add(avl, box(822), box(1157), NULL);
+ avl = gpr_avl_add(avl, box(354), box(1158), NULL);
avl = remove_int(avl, 738);
- avl = gpr_avl_add(avl, box(686), box(1160));
- avl = gpr_avl_add(avl, box(43), box(1161));
- avl = gpr_avl_add(avl, box(625), box(1162));
- avl = gpr_avl_add(avl, box(902), box(1163));
- avl = gpr_avl_add(avl, box(12), box(1164));
- avl = gpr_avl_add(avl, box(977), box(1165));
- avl = gpr_avl_add(avl, box(699), box(1166));
- avl = gpr_avl_add(avl, box(189), box(1167));
+ avl = gpr_avl_add(avl, box(686), box(1160), NULL);
+ avl = gpr_avl_add(avl, box(43), box(1161), NULL);
+ avl = gpr_avl_add(avl, box(625), box(1162), NULL);
+ avl = gpr_avl_add(avl, box(902), box(1163), NULL);
+ avl = gpr_avl_add(avl, box(12), box(1164), NULL);
+ avl = gpr_avl_add(avl, box(977), box(1165), NULL);
+ avl = gpr_avl_add(avl, box(699), box(1166), NULL);
+ avl = gpr_avl_add(avl, box(189), box(1167), NULL);
avl = remove_int(avl, 672);
avl = remove_int(avl, 90);
avl = remove_int(avl, 757);
avl = remove_int(avl, 494);
- avl = gpr_avl_add(avl, box(759), box(1172));
+ avl = gpr_avl_add(avl, box(759), box(1172), NULL);
avl = remove_int(avl, 758);
avl = remove_int(avl, 222);
- avl = gpr_avl_add(avl, box(975), box(1175));
+ avl = gpr_avl_add(avl, box(975), box(1175), NULL);
avl = remove_int(avl, 993);
- avl = gpr_avl_add(avl, box(2), box(1177));
- avl = gpr_avl_add(avl, box(70), box(1178));
+ avl = gpr_avl_add(avl, box(2), box(1177), NULL);
+ avl = gpr_avl_add(avl, box(70), box(1178), NULL);
avl = remove_int(avl, 350);
avl = remove_int(avl, 972);
avl = remove_int(avl, 880);
- avl = gpr_avl_add(avl, box(753), box(1182));
+ avl = gpr_avl_add(avl, box(753), box(1182), NULL);
avl = remove_int(avl, 404);
- avl = gpr_avl_add(avl, box(294), box(1184));
+ avl = gpr_avl_add(avl, box(294), box(1184), NULL);
avl = remove_int(avl, 474);
- avl = gpr_avl_add(avl, box(228), box(1186));
- avl = gpr_avl_add(avl, box(484), box(1187));
+ avl = gpr_avl_add(avl, box(228), box(1186), NULL);
+ avl = gpr_avl_add(avl, box(484), box(1187), NULL);
avl = remove_int(avl, 238);
avl = remove_int(avl, 53);
avl = remove_int(avl, 691);
- avl = gpr_avl_add(avl, box(345), box(1191));
+ avl = gpr_avl_add(avl, box(345), box(1191), NULL);
avl = remove_int(avl, 0);
- avl = gpr_avl_add(avl, box(230), box(1193));
+ avl = gpr_avl_add(avl, box(230), box(1193), NULL);
avl = remove_int(avl, 227);
avl = remove_int(avl, 152);
- avl = gpr_avl_add(avl, box(884), box(1196));
+ avl = gpr_avl_add(avl, box(884), box(1196), NULL);
avl = remove_int(avl, 823);
avl = remove_int(avl, 53);
- avl = gpr_avl_add(avl, box(1015), box(1199));
- avl = gpr_avl_add(avl, box(697), box(1200));
- avl = gpr_avl_add(avl, box(376), box(1201));
+ avl = gpr_avl_add(avl, box(1015), box(1199), NULL);
+ avl = gpr_avl_add(avl, box(697), box(1200), NULL);
+ avl = gpr_avl_add(avl, box(376), box(1201), NULL);
avl = remove_int(avl, 411);
- avl = gpr_avl_add(avl, box(888), box(1203));
+ avl = gpr_avl_add(avl, box(888), box(1203), NULL);
avl = remove_int(avl, 55);
- avl = gpr_avl_add(avl, box(85), box(1205));
+ avl = gpr_avl_add(avl, box(85), box(1205), NULL);
avl = remove_int(avl, 947);
avl = remove_int(avl, 382);
avl = remove_int(avl, 777);
- avl = gpr_avl_add(avl, box(1017), box(1209));
- avl = gpr_avl_add(avl, box(169), box(1210));
- avl = gpr_avl_add(avl, box(156), box(1211));
+ avl = gpr_avl_add(avl, box(1017), box(1209), NULL);
+ avl = gpr_avl_add(avl, box(169), box(1210), NULL);
+ avl = gpr_avl_add(avl, box(156), box(1211), NULL);
avl = remove_int(avl, 153);
avl = remove_int(avl, 642);
avl = remove_int(avl, 158);
- avl = gpr_avl_add(avl, box(554), box(1215));
- avl = gpr_avl_add(avl, box(76), box(1216));
- avl = gpr_avl_add(avl, box(756), box(1217));
+ avl = gpr_avl_add(avl, box(554), box(1215), NULL);
+ avl = gpr_avl_add(avl, box(76), box(1216), NULL);
+ avl = gpr_avl_add(avl, box(756), box(1217), NULL);
avl = remove_int(avl, 767);
avl = remove_int(avl, 112);
avl = remove_int(avl, 539);
@@ -2362,37 +2364,37 @@ static void test_badcase3(void) {
avl = remove_int(avl, 385);
avl = remove_int(avl, 514);
avl = remove_int(avl, 362);
- avl = gpr_avl_add(avl, box(523), box(1226));
- avl = gpr_avl_add(avl, box(712), box(1227));
- avl = gpr_avl_add(avl, box(474), box(1228));
- avl = gpr_avl_add(avl, box(882), box(1229));
- avl = gpr_avl_add(avl, box(965), box(1230));
+ avl = gpr_avl_add(avl, box(523), box(1226), NULL);
+ avl = gpr_avl_add(avl, box(712), box(1227), NULL);
+ avl = gpr_avl_add(avl, box(474), box(1228), NULL);
+ avl = gpr_avl_add(avl, box(882), box(1229), NULL);
+ avl = gpr_avl_add(avl, box(965), box(1230), NULL);
avl = remove_int(avl, 464);
- avl = gpr_avl_add(avl, box(319), box(1232));
- avl = gpr_avl_add(avl, box(504), box(1233));
+ avl = gpr_avl_add(avl, box(319), box(1232), NULL);
+ avl = gpr_avl_add(avl, box(504), box(1233), NULL);
avl = remove_int(avl, 818);
- avl = gpr_avl_add(avl, box(884), box(1235));
- avl = gpr_avl_add(avl, box(813), box(1236));
- avl = gpr_avl_add(avl, box(795), box(1237));
+ avl = gpr_avl_add(avl, box(884), box(1235), NULL);
+ avl = gpr_avl_add(avl, box(813), box(1236), NULL);
+ avl = gpr_avl_add(avl, box(795), box(1237), NULL);
avl = remove_int(avl, 306);
- avl = gpr_avl_add(avl, box(799), box(1239));
+ avl = gpr_avl_add(avl, box(799), box(1239), NULL);
avl = remove_int(avl, 534);
- avl = gpr_avl_add(avl, box(480), box(1241));
- avl = gpr_avl_add(avl, box(656), box(1242));
- avl = gpr_avl_add(avl, box(709), box(1243));
- avl = gpr_avl_add(avl, box(500), box(1244));
+ avl = gpr_avl_add(avl, box(480), box(1241), NULL);
+ avl = gpr_avl_add(avl, box(656), box(1242), NULL);
+ avl = gpr_avl_add(avl, box(709), box(1243), NULL);
+ avl = gpr_avl_add(avl, box(500), box(1244), NULL);
avl = remove_int(avl, 740);
- avl = gpr_avl_add(avl, box(980), box(1246));
- avl = gpr_avl_add(avl, box(458), box(1247));
+ avl = gpr_avl_add(avl, box(980), box(1246), NULL);
+ avl = gpr_avl_add(avl, box(458), box(1247), NULL);
avl = remove_int(avl, 377);
avl = remove_int(avl, 338);
- avl = gpr_avl_add(avl, box(554), box(1250));
- avl = gpr_avl_add(avl, box(504), box(1251));
- avl = gpr_avl_add(avl, box(603), box(1252));
- avl = gpr_avl_add(avl, box(761), box(1253));
+ avl = gpr_avl_add(avl, box(554), box(1250), NULL);
+ avl = gpr_avl_add(avl, box(504), box(1251), NULL);
+ avl = gpr_avl_add(avl, box(603), box(1252), NULL);
+ avl = gpr_avl_add(avl, box(761), box(1253), NULL);
avl = remove_int(avl, 431);
- avl = gpr_avl_add(avl, box(707), box(1255));
- avl = gpr_avl_add(avl, box(673), box(1256));
+ avl = gpr_avl_add(avl, box(707), box(1255), NULL);
+ avl = gpr_avl_add(avl, box(673), box(1256), NULL);
avl = remove_int(avl, 998);
avl = remove_int(avl, 332);
avl = remove_int(avl, 413);
@@ -2400,448 +2402,448 @@ static void test_badcase3(void) {
avl = remove_int(avl, 249);
avl = remove_int(avl, 309);
avl = remove_int(avl, 459);
- avl = gpr_avl_add(avl, box(645), box(1264));
+ avl = gpr_avl_add(avl, box(645), box(1264), NULL);
avl = remove_int(avl, 858);
avl = remove_int(avl, 997);
- avl = gpr_avl_add(avl, box(519), box(1267));
+ avl = gpr_avl_add(avl, box(519), box(1267), NULL);
avl = remove_int(avl, 614);
avl = remove_int(avl, 462);
avl = remove_int(avl, 792);
- avl = gpr_avl_add(avl, box(987), box(1271));
- avl = gpr_avl_add(avl, box(309), box(1272));
+ avl = gpr_avl_add(avl, box(987), box(1271), NULL);
+ avl = gpr_avl_add(avl, box(309), box(1272), NULL);
avl = remove_int(avl, 747);
- avl = gpr_avl_add(avl, box(621), box(1274));
- avl = gpr_avl_add(avl, box(450), box(1275));
+ avl = gpr_avl_add(avl, box(621), box(1274), NULL);
+ avl = gpr_avl_add(avl, box(450), box(1275), NULL);
avl = remove_int(avl, 265);
avl = remove_int(avl, 8);
avl = remove_int(avl, 383);
- avl = gpr_avl_add(avl, box(238), box(1279));
+ avl = gpr_avl_add(avl, box(238), box(1279), NULL);
avl = remove_int(avl, 241);
- avl = gpr_avl_add(avl, box(180), box(1281));
- avl = gpr_avl_add(avl, box(411), box(1282));
- avl = gpr_avl_add(avl, box(791), box(1283));
- avl = gpr_avl_add(avl, box(955), box(1284));
+ avl = gpr_avl_add(avl, box(180), box(1281), NULL);
+ avl = gpr_avl_add(avl, box(411), box(1282), NULL);
+ avl = gpr_avl_add(avl, box(791), box(1283), NULL);
+ avl = gpr_avl_add(avl, box(955), box(1284), NULL);
avl = remove_int(avl, 24);
avl = remove_int(avl, 375);
- avl = gpr_avl_add(avl, box(140), box(1287));
+ avl = gpr_avl_add(avl, box(140), box(1287), NULL);
avl = remove_int(avl, 949);
- avl = gpr_avl_add(avl, box(301), box(1289));
- avl = gpr_avl_add(avl, box(0), box(1290));
+ avl = gpr_avl_add(avl, box(301), box(1289), NULL);
+ avl = gpr_avl_add(avl, box(0), box(1290), NULL);
avl = remove_int(avl, 371);
avl = remove_int(avl, 427);
avl = remove_int(avl, 841);
avl = remove_int(avl, 847);
- avl = gpr_avl_add(avl, box(814), box(1295));
- avl = gpr_avl_add(avl, box(127), box(1296));
- avl = gpr_avl_add(avl, box(279), box(1297));
+ avl = gpr_avl_add(avl, box(814), box(1295), NULL);
+ avl = gpr_avl_add(avl, box(127), box(1296), NULL);
+ avl = gpr_avl_add(avl, box(279), box(1297), NULL);
avl = remove_int(avl, 669);
avl = remove_int(avl, 541);
avl = remove_int(avl, 275);
avl = remove_int(avl, 299);
avl = remove_int(avl, 552);
- avl = gpr_avl_add(avl, box(310), box(1303));
- avl = gpr_avl_add(avl, box(304), box(1304));
- avl = gpr_avl_add(avl, box(1), box(1305));
- avl = gpr_avl_add(avl, box(339), box(1306));
+ avl = gpr_avl_add(avl, box(310), box(1303), NULL);
+ avl = gpr_avl_add(avl, box(304), box(1304), NULL);
+ avl = gpr_avl_add(avl, box(1), box(1305), NULL);
+ avl = gpr_avl_add(avl, box(339), box(1306), NULL);
avl = remove_int(avl, 570);
avl = remove_int(avl, 752);
avl = remove_int(avl, 552);
avl = remove_int(avl, 442);
avl = remove_int(avl, 639);
- avl = gpr_avl_add(avl, box(313), box(1312));
+ avl = gpr_avl_add(avl, box(313), box(1312), NULL);
avl = remove_int(avl, 85);
- avl = gpr_avl_add(avl, box(964), box(1314));
- avl = gpr_avl_add(avl, box(559), box(1315));
+ avl = gpr_avl_add(avl, box(964), box(1314), NULL);
+ avl = gpr_avl_add(avl, box(559), box(1315), NULL);
avl = remove_int(avl, 167);
- avl = gpr_avl_add(avl, box(866), box(1317));
+ avl = gpr_avl_add(avl, box(866), box(1317), NULL);
avl = remove_int(avl, 275);
- avl = gpr_avl_add(avl, box(173), box(1319));
- avl = gpr_avl_add(avl, box(765), box(1320));
+ avl = gpr_avl_add(avl, box(173), box(1319), NULL);
+ avl = gpr_avl_add(avl, box(765), box(1320), NULL);
avl = remove_int(avl, 883);
- avl = gpr_avl_add(avl, box(547), box(1322));
- avl = gpr_avl_add(avl, box(847), box(1323));
+ avl = gpr_avl_add(avl, box(547), box(1322), NULL);
+ avl = gpr_avl_add(avl, box(847), box(1323), NULL);
avl = remove_int(avl, 817);
avl = remove_int(avl, 850);
avl = remove_int(avl, 718);
- avl = gpr_avl_add(avl, box(806), box(1327));
- avl = gpr_avl_add(avl, box(360), box(1328));
+ avl = gpr_avl_add(avl, box(806), box(1327), NULL);
+ avl = gpr_avl_add(avl, box(360), box(1328), NULL);
avl = remove_int(avl, 991);
- avl = gpr_avl_add(avl, box(493), box(1330));
+ avl = gpr_avl_add(avl, box(493), box(1330), NULL);
avl = remove_int(avl, 516);
- avl = gpr_avl_add(avl, box(361), box(1332));
+ avl = gpr_avl_add(avl, box(361), box(1332), NULL);
avl = remove_int(avl, 355);
- avl = gpr_avl_add(avl, box(512), box(1334));
- avl = gpr_avl_add(avl, box(191), box(1335));
+ avl = gpr_avl_add(avl, box(512), box(1334), NULL);
+ avl = gpr_avl_add(avl, box(191), box(1335), NULL);
avl = remove_int(avl, 703);
- avl = gpr_avl_add(avl, box(333), box(1337));
+ avl = gpr_avl_add(avl, box(333), box(1337), NULL);
avl = remove_int(avl, 481);
- avl = gpr_avl_add(avl, box(501), box(1339));
+ avl = gpr_avl_add(avl, box(501), box(1339), NULL);
avl = remove_int(avl, 532);
avl = remove_int(avl, 510);
- avl = gpr_avl_add(avl, box(793), box(1342));
- avl = gpr_avl_add(avl, box(234), box(1343));
+ avl = gpr_avl_add(avl, box(793), box(1342), NULL);
+ avl = gpr_avl_add(avl, box(234), box(1343), NULL);
avl = remove_int(avl, 159);
avl = remove_int(avl, 429);
avl = remove_int(avl, 728);
avl = remove_int(avl, 288);
- avl = gpr_avl_add(avl, box(281), box(1348));
- avl = gpr_avl_add(avl, box(702), box(1349));
- avl = gpr_avl_add(avl, box(149), box(1350));
+ avl = gpr_avl_add(avl, box(281), box(1348), NULL);
+ avl = gpr_avl_add(avl, box(702), box(1349), NULL);
+ avl = gpr_avl_add(avl, box(149), box(1350), NULL);
avl = remove_int(avl, 22);
avl = remove_int(avl, 944);
avl = remove_int(avl, 55);
avl = remove_int(avl, 512);
avl = remove_int(avl, 676);
avl = remove_int(avl, 884);
- avl = gpr_avl_add(avl, box(246), box(1357));
- avl = gpr_avl_add(avl, box(455), box(1358));
+ avl = gpr_avl_add(avl, box(246), box(1357), NULL);
+ avl = gpr_avl_add(avl, box(455), box(1358), NULL);
avl = remove_int(avl, 782);
avl = remove_int(avl, 682);
- avl = gpr_avl_add(avl, box(243), box(1361));
- avl = gpr_avl_add(avl, box(109), box(1362));
- avl = gpr_avl_add(avl, box(452), box(1363));
+ avl = gpr_avl_add(avl, box(243), box(1361), NULL);
+ avl = gpr_avl_add(avl, box(109), box(1362), NULL);
+ avl = gpr_avl_add(avl, box(452), box(1363), NULL);
avl = remove_int(avl, 151);
- avl = gpr_avl_add(avl, box(159), box(1365));
+ avl = gpr_avl_add(avl, box(159), box(1365), NULL);
avl = remove_int(avl, 1023);
- avl = gpr_avl_add(avl, box(129), box(1367));
- avl = gpr_avl_add(avl, box(537), box(1368));
+ avl = gpr_avl_add(avl, box(129), box(1367), NULL);
+ avl = gpr_avl_add(avl, box(537), box(1368), NULL);
avl = remove_int(avl, 321);
- avl = gpr_avl_add(avl, box(740), box(1370));
+ avl = gpr_avl_add(avl, box(740), box(1370), NULL);
avl = remove_int(avl, 45);
avl = remove_int(avl, 136);
- avl = gpr_avl_add(avl, box(229), box(1373));
+ avl = gpr_avl_add(avl, box(229), box(1373), NULL);
avl = remove_int(avl, 772);
- avl = gpr_avl_add(avl, box(181), box(1375));
+ avl = gpr_avl_add(avl, box(181), box(1375), NULL);
avl = remove_int(avl, 175);
- avl = gpr_avl_add(avl, box(817), box(1377));
+ avl = gpr_avl_add(avl, box(817), box(1377), NULL);
avl = remove_int(avl, 956);
- avl = gpr_avl_add(avl, box(675), box(1379));
- avl = gpr_avl_add(avl, box(375), box(1380));
+ avl = gpr_avl_add(avl, box(675), box(1379), NULL);
+ avl = gpr_avl_add(avl, box(375), box(1380), NULL);
avl = remove_int(avl, 384);
- avl = gpr_avl_add(avl, box(1016), box(1382));
+ avl = gpr_avl_add(avl, box(1016), box(1382), NULL);
avl = remove_int(avl, 295);
avl = remove_int(avl, 697);
avl = remove_int(avl, 554);
avl = remove_int(avl, 590);
avl = remove_int(avl, 1014);
- avl = gpr_avl_add(avl, box(890), box(1388));
- avl = gpr_avl_add(avl, box(293), box(1389));
+ avl = gpr_avl_add(avl, box(890), box(1388), NULL);
+ avl = gpr_avl_add(avl, box(293), box(1389), NULL);
avl = remove_int(avl, 207);
avl = remove_int(avl, 46);
- avl = gpr_avl_add(avl, box(899), box(1392));
- avl = gpr_avl_add(avl, box(666), box(1393));
- avl = gpr_avl_add(avl, box(85), box(1394));
- avl = gpr_avl_add(avl, box(914), box(1395));
- avl = gpr_avl_add(avl, box(128), box(1396));
- avl = gpr_avl_add(avl, box(835), box(1397));
- avl = gpr_avl_add(avl, box(787), box(1398));
- avl = gpr_avl_add(avl, box(649), box(1399));
- avl = gpr_avl_add(avl, box(723), box(1400));
+ avl = gpr_avl_add(avl, box(899), box(1392), NULL);
+ avl = gpr_avl_add(avl, box(666), box(1393), NULL);
+ avl = gpr_avl_add(avl, box(85), box(1394), NULL);
+ avl = gpr_avl_add(avl, box(914), box(1395), NULL);
+ avl = gpr_avl_add(avl, box(128), box(1396), NULL);
+ avl = gpr_avl_add(avl, box(835), box(1397), NULL);
+ avl = gpr_avl_add(avl, box(787), box(1398), NULL);
+ avl = gpr_avl_add(avl, box(649), box(1399), NULL);
+ avl = gpr_avl_add(avl, box(723), box(1400), NULL);
avl = remove_int(avl, 874);
- avl = gpr_avl_add(avl, box(778), box(1402));
- avl = gpr_avl_add(avl, box(1015), box(1403));
- avl = gpr_avl_add(avl, box(59), box(1404));
- avl = gpr_avl_add(avl, box(259), box(1405));
- avl = gpr_avl_add(avl, box(758), box(1406));
+ avl = gpr_avl_add(avl, box(778), box(1402), NULL);
+ avl = gpr_avl_add(avl, box(1015), box(1403), NULL);
+ avl = gpr_avl_add(avl, box(59), box(1404), NULL);
+ avl = gpr_avl_add(avl, box(259), box(1405), NULL);
+ avl = gpr_avl_add(avl, box(758), box(1406), NULL);
avl = remove_int(avl, 648);
- avl = gpr_avl_add(avl, box(145), box(1408));
- avl = gpr_avl_add(avl, box(440), box(1409));
+ avl = gpr_avl_add(avl, box(145), box(1408), NULL);
+ avl = gpr_avl_add(avl, box(440), box(1409), NULL);
avl = remove_int(avl, 608);
avl = remove_int(avl, 690);
- avl = gpr_avl_add(avl, box(605), box(1412));
+ avl = gpr_avl_add(avl, box(605), box(1412), NULL);
avl = remove_int(avl, 856);
avl = remove_int(avl, 608);
- avl = gpr_avl_add(avl, box(829), box(1415));
- avl = gpr_avl_add(avl, box(660), box(1416));
+ avl = gpr_avl_add(avl, box(829), box(1415), NULL);
+ avl = gpr_avl_add(avl, box(660), box(1416), NULL);
avl = remove_int(avl, 596);
- avl = gpr_avl_add(avl, box(519), box(1418));
- avl = gpr_avl_add(avl, box(35), box(1419));
- avl = gpr_avl_add(avl, box(871), box(1420));
+ avl = gpr_avl_add(avl, box(519), box(1418), NULL);
+ avl = gpr_avl_add(avl, box(35), box(1419), NULL);
+ avl = gpr_avl_add(avl, box(871), box(1420), NULL);
avl = remove_int(avl, 845);
- avl = gpr_avl_add(avl, box(600), box(1422));
- avl = gpr_avl_add(avl, box(215), box(1423));
+ avl = gpr_avl_add(avl, box(600), box(1422), NULL);
+ avl = gpr_avl_add(avl, box(215), box(1423), NULL);
avl = remove_int(avl, 761);
- avl = gpr_avl_add(avl, box(975), box(1425));
+ avl = gpr_avl_add(avl, box(975), box(1425), NULL);
avl = remove_int(avl, 987);
- avl = gpr_avl_add(avl, box(58), box(1427));
+ avl = gpr_avl_add(avl, box(58), box(1427), NULL);
avl = remove_int(avl, 119);
- avl = gpr_avl_add(avl, box(937), box(1429));
- avl = gpr_avl_add(avl, box(372), box(1430));
- avl = gpr_avl_add(avl, box(11), box(1431));
- avl = gpr_avl_add(avl, box(398), box(1432));
- avl = gpr_avl_add(avl, box(423), box(1433));
+ avl = gpr_avl_add(avl, box(937), box(1429), NULL);
+ avl = gpr_avl_add(avl, box(372), box(1430), NULL);
+ avl = gpr_avl_add(avl, box(11), box(1431), NULL);
+ avl = gpr_avl_add(avl, box(398), box(1432), NULL);
+ avl = gpr_avl_add(avl, box(423), box(1433), NULL);
avl = remove_int(avl, 171);
- avl = gpr_avl_add(avl, box(473), box(1435));
+ avl = gpr_avl_add(avl, box(473), box(1435), NULL);
avl = remove_int(avl, 752);
avl = remove_int(avl, 625);
avl = remove_int(avl, 764);
avl = remove_int(avl, 49);
- avl = gpr_avl_add(avl, box(472), box(1440));
+ avl = gpr_avl_add(avl, box(472), box(1440), NULL);
avl = remove_int(avl, 847);
avl = remove_int(avl, 642);
avl = remove_int(avl, 1004);
avl = remove_int(avl, 795);
avl = remove_int(avl, 465);
- avl = gpr_avl_add(avl, box(636), box(1446));
+ avl = gpr_avl_add(avl, box(636), box(1446), NULL);
avl = remove_int(avl, 152);
- avl = gpr_avl_add(avl, box(61), box(1448));
+ avl = gpr_avl_add(avl, box(61), box(1448), NULL);
avl = remove_int(avl, 929);
avl = remove_int(avl, 9);
- avl = gpr_avl_add(avl, box(251), box(1451));
- avl = gpr_avl_add(avl, box(672), box(1452));
- avl = gpr_avl_add(avl, box(66), box(1453));
+ avl = gpr_avl_add(avl, box(251), box(1451), NULL);
+ avl = gpr_avl_add(avl, box(672), box(1452), NULL);
+ avl = gpr_avl_add(avl, box(66), box(1453), NULL);
avl = remove_int(avl, 693);
avl = remove_int(avl, 914);
avl = remove_int(avl, 116);
avl = remove_int(avl, 577);
- avl = gpr_avl_add(avl, box(618), box(1458));
- avl = gpr_avl_add(avl, box(495), box(1459));
+ avl = gpr_avl_add(avl, box(618), box(1458), NULL);
+ avl = gpr_avl_add(avl, box(495), box(1459), NULL);
avl = remove_int(avl, 450);
- avl = gpr_avl_add(avl, box(533), box(1461));
- avl = gpr_avl_add(avl, box(414), box(1462));
+ avl = gpr_avl_add(avl, box(533), box(1461), NULL);
+ avl = gpr_avl_add(avl, box(414), box(1462), NULL);
avl = remove_int(avl, 74);
avl = remove_int(avl, 236);
- avl = gpr_avl_add(avl, box(707), box(1465));
- avl = gpr_avl_add(avl, box(357), box(1466));
- avl = gpr_avl_add(avl, box(1007), box(1467));
- avl = gpr_avl_add(avl, box(811), box(1468));
- avl = gpr_avl_add(avl, box(418), box(1469));
- avl = gpr_avl_add(avl, box(164), box(1470));
- avl = gpr_avl_add(avl, box(622), box(1471));
+ avl = gpr_avl_add(avl, box(707), box(1465), NULL);
+ avl = gpr_avl_add(avl, box(357), box(1466), NULL);
+ avl = gpr_avl_add(avl, box(1007), box(1467), NULL);
+ avl = gpr_avl_add(avl, box(811), box(1468), NULL);
+ avl = gpr_avl_add(avl, box(418), box(1469), NULL);
+ avl = gpr_avl_add(avl, box(164), box(1470), NULL);
+ avl = gpr_avl_add(avl, box(622), box(1471), NULL);
avl = remove_int(avl, 22);
avl = remove_int(avl, 14);
avl = remove_int(avl, 732);
avl = remove_int(avl, 7);
avl = remove_int(avl, 447);
- avl = gpr_avl_add(avl, box(221), box(1477));
- avl = gpr_avl_add(avl, box(202), box(1478));
- avl = gpr_avl_add(avl, box(312), box(1479));
+ avl = gpr_avl_add(avl, box(221), box(1477), NULL);
+ avl = gpr_avl_add(avl, box(202), box(1478), NULL);
+ avl = gpr_avl_add(avl, box(312), box(1479), NULL);
avl = remove_int(avl, 274);
- avl = gpr_avl_add(avl, box(684), box(1481));
- avl = gpr_avl_add(avl, box(954), box(1482));
- avl = gpr_avl_add(avl, box(637), box(1483));
+ avl = gpr_avl_add(avl, box(684), box(1481), NULL);
+ avl = gpr_avl_add(avl, box(954), box(1482), NULL);
+ avl = gpr_avl_add(avl, box(637), box(1483), NULL);
avl = remove_int(avl, 716);
- avl = gpr_avl_add(avl, box(198), box(1485));
+ avl = gpr_avl_add(avl, box(198), box(1485), NULL);
avl = remove_int(avl, 340);
avl = remove_int(avl, 137);
avl = remove_int(avl, 995);
avl = remove_int(avl, 1004);
- avl = gpr_avl_add(avl, box(661), box(1490));
- avl = gpr_avl_add(avl, box(862), box(1491));
+ avl = gpr_avl_add(avl, box(661), box(1490), NULL);
+ avl = gpr_avl_add(avl, box(862), box(1491), NULL);
avl = remove_int(avl, 527);
- avl = gpr_avl_add(avl, box(945), box(1493));
+ avl = gpr_avl_add(avl, box(945), box(1493), NULL);
avl = remove_int(avl, 355);
avl = remove_int(avl, 144);
- avl = gpr_avl_add(avl, box(229), box(1496));
- avl = gpr_avl_add(avl, box(237), box(1497));
+ avl = gpr_avl_add(avl, box(229), box(1496), NULL);
+ avl = gpr_avl_add(avl, box(237), box(1497), NULL);
avl = remove_int(avl, 471);
avl = remove_int(avl, 901);
- avl = gpr_avl_add(avl, box(905), box(1500));
+ avl = gpr_avl_add(avl, box(905), box(1500), NULL);
avl = remove_int(avl, 19);
avl = remove_int(avl, 896);
avl = remove_int(avl, 585);
avl = remove_int(avl, 308);
- avl = gpr_avl_add(avl, box(547), box(1505));
- avl = gpr_avl_add(avl, box(552), box(1506));
- avl = gpr_avl_add(avl, box(30), box(1507));
- avl = gpr_avl_add(avl, box(445), box(1508));
+ avl = gpr_avl_add(avl, box(547), box(1505), NULL);
+ avl = gpr_avl_add(avl, box(552), box(1506), NULL);
+ avl = gpr_avl_add(avl, box(30), box(1507), NULL);
+ avl = gpr_avl_add(avl, box(445), box(1508), NULL);
avl = remove_int(avl, 785);
avl = remove_int(avl, 185);
- avl = gpr_avl_add(avl, box(405), box(1511));
- avl = gpr_avl_add(avl, box(733), box(1512));
- avl = gpr_avl_add(avl, box(573), box(1513));
- avl = gpr_avl_add(avl, box(492), box(1514));
- avl = gpr_avl_add(avl, box(343), box(1515));
- avl = gpr_avl_add(avl, box(527), box(1516));
- avl = gpr_avl_add(avl, box(596), box(1517));
- avl = gpr_avl_add(avl, box(519), box(1518));
+ avl = gpr_avl_add(avl, box(405), box(1511), NULL);
+ avl = gpr_avl_add(avl, box(733), box(1512), NULL);
+ avl = gpr_avl_add(avl, box(573), box(1513), NULL);
+ avl = gpr_avl_add(avl, box(492), box(1514), NULL);
+ avl = gpr_avl_add(avl, box(343), box(1515), NULL);
+ avl = gpr_avl_add(avl, box(527), box(1516), NULL);
+ avl = gpr_avl_add(avl, box(596), box(1517), NULL);
+ avl = gpr_avl_add(avl, box(519), box(1518), NULL);
avl = remove_int(avl, 243);
avl = remove_int(avl, 722);
- avl = gpr_avl_add(avl, box(772), box(1521));
+ avl = gpr_avl_add(avl, box(772), box(1521), NULL);
avl = remove_int(avl, 152);
avl = remove_int(avl, 305);
- avl = gpr_avl_add(avl, box(754), box(1524));
- avl = gpr_avl_add(avl, box(373), box(1525));
+ avl = gpr_avl_add(avl, box(754), box(1524), NULL);
+ avl = gpr_avl_add(avl, box(373), box(1525), NULL);
avl = remove_int(avl, 995);
- avl = gpr_avl_add(avl, box(329), box(1527));
+ avl = gpr_avl_add(avl, box(329), box(1527), NULL);
avl = remove_int(avl, 397);
- avl = gpr_avl_add(avl, box(884), box(1529));
+ avl = gpr_avl_add(avl, box(884), box(1529), NULL);
avl = remove_int(avl, 329);
avl = remove_int(avl, 240);
- avl = gpr_avl_add(avl, box(566), box(1532));
- avl = gpr_avl_add(avl, box(232), box(1533));
+ avl = gpr_avl_add(avl, box(566), box(1532), NULL);
+ avl = gpr_avl_add(avl, box(232), box(1533), NULL);
avl = remove_int(avl, 993);
- avl = gpr_avl_add(avl, box(888), box(1535));
+ avl = gpr_avl_add(avl, box(888), box(1535), NULL);
avl = remove_int(avl, 242);
- avl = gpr_avl_add(avl, box(941), box(1537));
+ avl = gpr_avl_add(avl, box(941), box(1537), NULL);
avl = remove_int(avl, 415);
- avl = gpr_avl_add(avl, box(992), box(1539));
+ avl = gpr_avl_add(avl, box(992), box(1539), NULL);
avl = remove_int(avl, 289);
- avl = gpr_avl_add(avl, box(60), box(1541));
- avl = gpr_avl_add(avl, box(97), box(1542));
+ avl = gpr_avl_add(avl, box(60), box(1541), NULL);
+ avl = gpr_avl_add(avl, box(97), box(1542), NULL);
avl = remove_int(avl, 965);
avl = remove_int(avl, 267);
avl = remove_int(avl, 360);
- avl = gpr_avl_add(avl, box(5), box(1546));
+ avl = gpr_avl_add(avl, box(5), box(1546), NULL);
avl = remove_int(avl, 429);
- avl = gpr_avl_add(avl, box(412), box(1548));
+ avl = gpr_avl_add(avl, box(412), box(1548), NULL);
avl = remove_int(avl, 632);
avl = remove_int(avl, 113);
- avl = gpr_avl_add(avl, box(48), box(1551));
- avl = gpr_avl_add(avl, box(108), box(1552));
- avl = gpr_avl_add(avl, box(750), box(1553));
+ avl = gpr_avl_add(avl, box(48), box(1551), NULL);
+ avl = gpr_avl_add(avl, box(108), box(1552), NULL);
+ avl = gpr_avl_add(avl, box(750), box(1553), NULL);
avl = remove_int(avl, 188);
- avl = gpr_avl_add(avl, box(668), box(1555));
+ avl = gpr_avl_add(avl, box(668), box(1555), NULL);
avl = remove_int(avl, 37);
avl = remove_int(avl, 737);
- avl = gpr_avl_add(avl, box(93), box(1558));
- avl = gpr_avl_add(avl, box(628), box(1559));
- avl = gpr_avl_add(avl, box(480), box(1560));
+ avl = gpr_avl_add(avl, box(93), box(1558), NULL);
+ avl = gpr_avl_add(avl, box(628), box(1559), NULL);
+ avl = gpr_avl_add(avl, box(480), box(1560), NULL);
avl = remove_int(avl, 958);
avl = remove_int(avl, 565);
avl = remove_int(avl, 32);
avl = remove_int(avl, 1);
avl = remove_int(avl, 335);
- avl = gpr_avl_add(avl, box(136), box(1566));
- avl = gpr_avl_add(avl, box(469), box(1567));
+ avl = gpr_avl_add(avl, box(136), box(1566), NULL);
+ avl = gpr_avl_add(avl, box(469), box(1567), NULL);
avl = remove_int(avl, 349);
- avl = gpr_avl_add(avl, box(768), box(1569));
- avl = gpr_avl_add(avl, box(915), box(1570));
+ avl = gpr_avl_add(avl, box(768), box(1569), NULL);
+ avl = gpr_avl_add(avl, box(915), box(1570), NULL);
avl = remove_int(avl, 1014);
- avl = gpr_avl_add(avl, box(117), box(1572));
+ avl = gpr_avl_add(avl, box(117), box(1572), NULL);
avl = remove_int(avl, 62);
- avl = gpr_avl_add(avl, box(382), box(1574));
+ avl = gpr_avl_add(avl, box(382), box(1574), NULL);
avl = remove_int(avl, 571);
- avl = gpr_avl_add(avl, box(655), box(1576));
- avl = gpr_avl_add(avl, box(323), box(1577));
+ avl = gpr_avl_add(avl, box(655), box(1576), NULL);
+ avl = gpr_avl_add(avl, box(323), box(1577), NULL);
avl = remove_int(avl, 869);
avl = remove_int(avl, 151);
- avl = gpr_avl_add(avl, box(1019), box(1580));
- avl = gpr_avl_add(avl, box(984), box(1581));
- avl = gpr_avl_add(avl, box(870), box(1582));
- avl = gpr_avl_add(avl, box(376), box(1583));
+ avl = gpr_avl_add(avl, box(1019), box(1580), NULL);
+ avl = gpr_avl_add(avl, box(984), box(1581), NULL);
+ avl = gpr_avl_add(avl, box(870), box(1582), NULL);
+ avl = gpr_avl_add(avl, box(376), box(1583), NULL);
avl = remove_int(avl, 625);
- avl = gpr_avl_add(avl, box(733), box(1585));
+ avl = gpr_avl_add(avl, box(733), box(1585), NULL);
avl = remove_int(avl, 532);
avl = remove_int(avl, 444);
- avl = gpr_avl_add(avl, box(428), box(1588));
- avl = gpr_avl_add(avl, box(860), box(1589));
- avl = gpr_avl_add(avl, box(173), box(1590));
+ avl = gpr_avl_add(avl, box(428), box(1588), NULL);
+ avl = gpr_avl_add(avl, box(860), box(1589), NULL);
+ avl = gpr_avl_add(avl, box(173), box(1590), NULL);
avl = remove_int(avl, 649);
avl = remove_int(avl, 913);
avl = remove_int(avl, 1);
avl = remove_int(avl, 304);
- avl = gpr_avl_add(avl, box(604), box(1595));
- avl = gpr_avl_add(avl, box(639), box(1596));
+ avl = gpr_avl_add(avl, box(604), box(1595), NULL);
+ avl = gpr_avl_add(avl, box(639), box(1596), NULL);
avl = remove_int(avl, 431);
- avl = gpr_avl_add(avl, box(993), box(1598));
+ avl = gpr_avl_add(avl, box(993), box(1598), NULL);
avl = remove_int(avl, 681);
avl = remove_int(avl, 927);
- avl = gpr_avl_add(avl, box(87), box(1601));
- avl = gpr_avl_add(avl, box(91), box(1602));
+ avl = gpr_avl_add(avl, box(87), box(1601), NULL);
+ avl = gpr_avl_add(avl, box(91), box(1602), NULL);
avl = remove_int(avl, 61);
avl = remove_int(avl, 14);
avl = remove_int(avl, 305);
avl = remove_int(avl, 304);
avl = remove_int(avl, 1016);
- avl = gpr_avl_add(avl, box(903), box(1608));
- avl = gpr_avl_add(avl, box(951), box(1609));
- avl = gpr_avl_add(avl, box(146), box(1610));
- avl = gpr_avl_add(avl, box(482), box(1611));
- avl = gpr_avl_add(avl, box(71), box(1612));
+ avl = gpr_avl_add(avl, box(903), box(1608), NULL);
+ avl = gpr_avl_add(avl, box(951), box(1609), NULL);
+ avl = gpr_avl_add(avl, box(146), box(1610), NULL);
+ avl = gpr_avl_add(avl, box(482), box(1611), NULL);
+ avl = gpr_avl_add(avl, box(71), box(1612), NULL);
avl = remove_int(avl, 246);
avl = remove_int(avl, 696);
- avl = gpr_avl_add(avl, box(636), box(1615));
- avl = gpr_avl_add(avl, box(295), box(1616));
+ avl = gpr_avl_add(avl, box(636), box(1615), NULL);
+ avl = gpr_avl_add(avl, box(295), box(1616), NULL);
avl = remove_int(avl, 11);
avl = remove_int(avl, 231);
- avl = gpr_avl_add(avl, box(905), box(1619));
- avl = gpr_avl_add(avl, box(993), box(1620));
- avl = gpr_avl_add(avl, box(433), box(1621));
- avl = gpr_avl_add(avl, box(117), box(1622));
- avl = gpr_avl_add(avl, box(467), box(1623));
+ avl = gpr_avl_add(avl, box(905), box(1619), NULL);
+ avl = gpr_avl_add(avl, box(993), box(1620), NULL);
+ avl = gpr_avl_add(avl, box(433), box(1621), NULL);
+ avl = gpr_avl_add(avl, box(117), box(1622), NULL);
+ avl = gpr_avl_add(avl, box(467), box(1623), NULL);
avl = remove_int(avl, 419);
- avl = gpr_avl_add(avl, box(179), box(1625));
+ avl = gpr_avl_add(avl, box(179), box(1625), NULL);
avl = remove_int(avl, 926);
avl = remove_int(avl, 326);
- avl = gpr_avl_add(avl, box(551), box(1628));
+ avl = gpr_avl_add(avl, box(551), box(1628), NULL);
avl = remove_int(avl, 14);
avl = remove_int(avl, 476);
avl = remove_int(avl, 823);
- avl = gpr_avl_add(avl, box(350), box(1632));
- avl = gpr_avl_add(avl, box(133), box(1633));
+ avl = gpr_avl_add(avl, box(350), box(1632), NULL);
+ avl = gpr_avl_add(avl, box(133), box(1633), NULL);
avl = remove_int(avl, 906);
- avl = gpr_avl_add(avl, box(827), box(1635));
- avl = gpr_avl_add(avl, box(201), box(1636));
+ avl = gpr_avl_add(avl, box(827), box(1635), NULL);
+ avl = gpr_avl_add(avl, box(201), box(1636), NULL);
avl = remove_int(avl, 124);
avl = remove_int(avl, 662);
- avl = gpr_avl_add(avl, box(314), box(1639));
- avl = gpr_avl_add(avl, box(986), box(1640));
- avl = gpr_avl_add(avl, box(622), box(1641));
+ avl = gpr_avl_add(avl, box(314), box(1639), NULL);
+ avl = gpr_avl_add(avl, box(986), box(1640), NULL);
+ avl = gpr_avl_add(avl, box(622), box(1641), NULL);
avl = remove_int(avl, 130);
- avl = gpr_avl_add(avl, box(861), box(1643));
+ avl = gpr_avl_add(avl, box(861), box(1643), NULL);
avl = remove_int(avl, 497);
avl = remove_int(avl, 905);
- avl = gpr_avl_add(avl, box(502), box(1646));
+ avl = gpr_avl_add(avl, box(502), box(1646), NULL);
avl = remove_int(avl, 721);
- avl = gpr_avl_add(avl, box(514), box(1648));
- avl = gpr_avl_add(avl, box(410), box(1649));
+ avl = gpr_avl_add(avl, box(514), box(1648), NULL);
+ avl = gpr_avl_add(avl, box(410), box(1649), NULL);
avl = remove_int(avl, 869);
avl = remove_int(avl, 247);
- avl = gpr_avl_add(avl, box(450), box(1652));
+ avl = gpr_avl_add(avl, box(450), box(1652), NULL);
avl = remove_int(avl, 364);
- avl = gpr_avl_add(avl, box(963), box(1654));
- avl = gpr_avl_add(avl, box(146), box(1655));
+ avl = gpr_avl_add(avl, box(963), box(1654), NULL);
+ avl = gpr_avl_add(avl, box(146), box(1655), NULL);
avl = remove_int(avl, 147);
avl = remove_int(avl, 789);
- avl = gpr_avl_add(avl, box(693), box(1658));
- avl = gpr_avl_add(avl, box(959), box(1659));
+ avl = gpr_avl_add(avl, box(693), box(1658), NULL);
+ avl = gpr_avl_add(avl, box(959), box(1659), NULL);
avl = remove_int(avl, 478);
- avl = gpr_avl_add(avl, box(116), box(1661));
- avl = gpr_avl_add(avl, box(520), box(1662));
- avl = gpr_avl_add(avl, box(809), box(1663));
- avl = gpr_avl_add(avl, box(667), box(1664));
- avl = gpr_avl_add(avl, box(406), box(1665));
+ avl = gpr_avl_add(avl, box(116), box(1661), NULL);
+ avl = gpr_avl_add(avl, box(520), box(1662), NULL);
+ avl = gpr_avl_add(avl, box(809), box(1663), NULL);
+ avl = gpr_avl_add(avl, box(667), box(1664), NULL);
+ avl = gpr_avl_add(avl, box(406), box(1665), NULL);
avl = remove_int(avl, 409);
- avl = gpr_avl_add(avl, box(558), box(1667));
- avl = gpr_avl_add(avl, box(0), box(1668));
- avl = gpr_avl_add(avl, box(948), box(1669));
- avl = gpr_avl_add(avl, box(576), box(1670));
+ avl = gpr_avl_add(avl, box(558), box(1667), NULL);
+ avl = gpr_avl_add(avl, box(0), box(1668), NULL);
+ avl = gpr_avl_add(avl, box(948), box(1669), NULL);
+ avl = gpr_avl_add(avl, box(576), box(1670), NULL);
avl = remove_int(avl, 864);
avl = remove_int(avl, 840);
avl = remove_int(avl, 1001);
- avl = gpr_avl_add(avl, box(232), box(1674));
+ avl = gpr_avl_add(avl, box(232), box(1674), NULL);
avl = remove_int(avl, 676);
avl = remove_int(avl, 752);
avl = remove_int(avl, 667);
avl = remove_int(avl, 605);
- avl = gpr_avl_add(avl, box(258), box(1679));
- avl = gpr_avl_add(avl, box(648), box(1680));
- avl = gpr_avl_add(avl, box(761), box(1681));
+ avl = gpr_avl_add(avl, box(258), box(1679), NULL);
+ avl = gpr_avl_add(avl, box(648), box(1680), NULL);
+ avl = gpr_avl_add(avl, box(761), box(1681), NULL);
avl = remove_int(avl, 293);
avl = remove_int(avl, 893);
- avl = gpr_avl_add(avl, box(194), box(1684));
+ avl = gpr_avl_add(avl, box(194), box(1684), NULL);
avl = remove_int(avl, 233);
- avl = gpr_avl_add(avl, box(888), box(1686));
+ avl = gpr_avl_add(avl, box(888), box(1686), NULL);
avl = remove_int(avl, 470);
avl = remove_int(avl, 703);
avl = remove_int(avl, 190);
avl = remove_int(avl, 359);
- avl = gpr_avl_add(avl, box(621), box(1691));
+ avl = gpr_avl_add(avl, box(621), box(1691), NULL);
avl = remove_int(avl, 634);
avl = remove_int(avl, 335);
- avl = gpr_avl_add(avl, box(718), box(1694));
- avl = gpr_avl_add(avl, box(463), box(1695));
- avl = gpr_avl_add(avl, box(233), box(1696));
+ avl = gpr_avl_add(avl, box(718), box(1694), NULL);
+ avl = gpr_avl_add(avl, box(463), box(1695), NULL);
+ avl = gpr_avl_add(avl, box(233), box(1696), NULL);
avl = remove_int(avl, 376);
avl = remove_int(avl, 496);
avl = remove_int(avl, 819);
avl = remove_int(avl, 38);
avl = remove_int(avl, 436);
avl = remove_int(avl, 102);
- avl = gpr_avl_add(avl, box(607), box(1703));
+ avl = gpr_avl_add(avl, box(607), box(1703), NULL);
avl = remove_int(avl, 329);
- avl = gpr_avl_add(avl, box(716), box(1705));
+ avl = gpr_avl_add(avl, box(716), box(1705), NULL);
avl = remove_int(avl, 639);
avl = remove_int(avl, 775);
avl = remove_int(avl, 578);
@@ -2849,402 +2851,402 @@ static void test_badcase3(void) {
avl = remove_int(avl, 679);
avl = remove_int(avl, 615);
avl = remove_int(avl, 104);
- avl = gpr_avl_add(avl, box(414), box(1713));
- avl = gpr_avl_add(avl, box(212), box(1714));
- avl = gpr_avl_add(avl, box(266), box(1715));
- avl = gpr_avl_add(avl, box(238), box(1716));
+ avl = gpr_avl_add(avl, box(414), box(1713), NULL);
+ avl = gpr_avl_add(avl, box(212), box(1714), NULL);
+ avl = gpr_avl_add(avl, box(266), box(1715), NULL);
+ avl = gpr_avl_add(avl, box(238), box(1716), NULL);
avl = remove_int(avl, 153);
- avl = gpr_avl_add(avl, box(585), box(1718));
+ avl = gpr_avl_add(avl, box(585), box(1718), NULL);
avl = remove_int(avl, 121);
- avl = gpr_avl_add(avl, box(534), box(1720));
+ avl = gpr_avl_add(avl, box(534), box(1720), NULL);
avl = remove_int(avl, 579);
- avl = gpr_avl_add(avl, box(127), box(1722));
- avl = gpr_avl_add(avl, box(399), box(1723));
+ avl = gpr_avl_add(avl, box(127), box(1722), NULL);
+ avl = gpr_avl_add(avl, box(399), box(1723), NULL);
avl = remove_int(avl, 417);
- avl = gpr_avl_add(avl, box(978), box(1725));
- avl = gpr_avl_add(avl, box(768), box(1726));
+ avl = gpr_avl_add(avl, box(978), box(1725), NULL);
+ avl = gpr_avl_add(avl, box(768), box(1726), NULL);
avl = remove_int(avl, 985);
- avl = gpr_avl_add(avl, box(536), box(1728));
- avl = gpr_avl_add(avl, box(449), box(1729));
- avl = gpr_avl_add(avl, box(586), box(1730));
+ avl = gpr_avl_add(avl, box(536), box(1728), NULL);
+ avl = gpr_avl_add(avl, box(449), box(1729), NULL);
+ avl = gpr_avl_add(avl, box(586), box(1730), NULL);
avl = remove_int(avl, 998);
avl = remove_int(avl, 394);
avl = remove_int(avl, 141);
- avl = gpr_avl_add(avl, box(889), box(1734));
- avl = gpr_avl_add(avl, box(871), box(1735));
- avl = gpr_avl_add(avl, box(76), box(1736));
- avl = gpr_avl_add(avl, box(549), box(1737));
- avl = gpr_avl_add(avl, box(757), box(1738));
+ avl = gpr_avl_add(avl, box(889), box(1734), NULL);
+ avl = gpr_avl_add(avl, box(871), box(1735), NULL);
+ avl = gpr_avl_add(avl, box(76), box(1736), NULL);
+ avl = gpr_avl_add(avl, box(549), box(1737), NULL);
+ avl = gpr_avl_add(avl, box(757), box(1738), NULL);
avl = remove_int(avl, 908);
- avl = gpr_avl_add(avl, box(789), box(1740));
+ avl = gpr_avl_add(avl, box(789), box(1740), NULL);
avl = remove_int(avl, 224);
- avl = gpr_avl_add(avl, box(407), box(1742));
- avl = gpr_avl_add(avl, box(381), box(1743));
- avl = gpr_avl_add(avl, box(561), box(1744));
- avl = gpr_avl_add(avl, box(667), box(1745));
- avl = gpr_avl_add(avl, box(522), box(1746));
- avl = gpr_avl_add(avl, box(948), box(1747));
+ avl = gpr_avl_add(avl, box(407), box(1742), NULL);
+ avl = gpr_avl_add(avl, box(381), box(1743), NULL);
+ avl = gpr_avl_add(avl, box(561), box(1744), NULL);
+ avl = gpr_avl_add(avl, box(667), box(1745), NULL);
+ avl = gpr_avl_add(avl, box(522), box(1746), NULL);
+ avl = gpr_avl_add(avl, box(948), box(1747), NULL);
avl = remove_int(avl, 770);
- avl = gpr_avl_add(avl, box(872), box(1749));
- avl = gpr_avl_add(avl, box(327), box(1750));
+ avl = gpr_avl_add(avl, box(872), box(1749), NULL);
+ avl = gpr_avl_add(avl, box(327), box(1750), NULL);
avl = remove_int(avl, 10);
- avl = gpr_avl_add(avl, box(122), box(1752));
+ avl = gpr_avl_add(avl, box(122), box(1752), NULL);
avl = remove_int(avl, 606);
- avl = gpr_avl_add(avl, box(485), box(1754));
+ avl = gpr_avl_add(avl, box(485), box(1754), NULL);
avl = remove_int(avl, 6);
- avl = gpr_avl_add(avl, box(329), box(1756));
- avl = gpr_avl_add(avl, box(783), box(1757));
+ avl = gpr_avl_add(avl, box(329), box(1756), NULL);
+ avl = gpr_avl_add(avl, box(783), box(1757), NULL);
avl = remove_int(avl, 416);
- avl = gpr_avl_add(avl, box(656), box(1759));
- avl = gpr_avl_add(avl, box(971), box(1760));
- avl = gpr_avl_add(avl, box(77), box(1761));
- avl = gpr_avl_add(avl, box(942), box(1762));
+ avl = gpr_avl_add(avl, box(656), box(1759), NULL);
+ avl = gpr_avl_add(avl, box(971), box(1760), NULL);
+ avl = gpr_avl_add(avl, box(77), box(1761), NULL);
+ avl = gpr_avl_add(avl, box(942), box(1762), NULL);
avl = remove_int(avl, 361);
- avl = gpr_avl_add(avl, box(66), box(1764));
- avl = gpr_avl_add(avl, box(299), box(1765));
- avl = gpr_avl_add(avl, box(929), box(1766));
- avl = gpr_avl_add(avl, box(797), box(1767));
+ avl = gpr_avl_add(avl, box(66), box(1764), NULL);
+ avl = gpr_avl_add(avl, box(299), box(1765), NULL);
+ avl = gpr_avl_add(avl, box(929), box(1766), NULL);
+ avl = gpr_avl_add(avl, box(797), box(1767), NULL);
avl = remove_int(avl, 869);
avl = remove_int(avl, 907);
- avl = gpr_avl_add(avl, box(870), box(1770));
+ avl = gpr_avl_add(avl, box(870), box(1770), NULL);
avl = remove_int(avl, 580);
avl = remove_int(avl, 120);
- avl = gpr_avl_add(avl, box(913), box(1773));
+ avl = gpr_avl_add(avl, box(913), box(1773), NULL);
avl = remove_int(avl, 480);
- avl = gpr_avl_add(avl, box(489), box(1775));
+ avl = gpr_avl_add(avl, box(489), box(1775), NULL);
avl = remove_int(avl, 845);
- avl = gpr_avl_add(avl, box(896), box(1777));
+ avl = gpr_avl_add(avl, box(896), box(1777), NULL);
avl = remove_int(avl, 567);
avl = remove_int(avl, 427);
- avl = gpr_avl_add(avl, box(443), box(1780));
- avl = gpr_avl_add(avl, box(3), box(1781));
+ avl = gpr_avl_add(avl, box(443), box(1780), NULL);
+ avl = gpr_avl_add(avl, box(3), box(1781), NULL);
avl = remove_int(avl, 12);
- avl = gpr_avl_add(avl, box(376), box(1783));
- avl = gpr_avl_add(avl, box(155), box(1784));
- avl = gpr_avl_add(avl, box(188), box(1785));
- avl = gpr_avl_add(avl, box(149), box(1786));
- avl = gpr_avl_add(avl, box(178), box(1787));
+ avl = gpr_avl_add(avl, box(376), box(1783), NULL);
+ avl = gpr_avl_add(avl, box(155), box(1784), NULL);
+ avl = gpr_avl_add(avl, box(188), box(1785), NULL);
+ avl = gpr_avl_add(avl, box(149), box(1786), NULL);
+ avl = gpr_avl_add(avl, box(178), box(1787), NULL);
avl = remove_int(avl, 84);
- avl = gpr_avl_add(avl, box(805), box(1789));
- avl = gpr_avl_add(avl, box(612), box(1790));
+ avl = gpr_avl_add(avl, box(805), box(1789), NULL);
+ avl = gpr_avl_add(avl, box(612), box(1790), NULL);
avl = remove_int(avl, 991);
- avl = gpr_avl_add(avl, box(837), box(1792));
+ avl = gpr_avl_add(avl, box(837), box(1792), NULL);
avl = remove_int(avl, 173);
avl = remove_int(avl, 72);
- avl = gpr_avl_add(avl, box(1014), box(1795));
+ avl = gpr_avl_add(avl, box(1014), box(1795), NULL);
avl = remove_int(avl, 303);
- avl = gpr_avl_add(avl, box(865), box(1797));
- avl = gpr_avl_add(avl, box(793), box(1798));
+ avl = gpr_avl_add(avl, box(865), box(1797), NULL);
+ avl = gpr_avl_add(avl, box(793), box(1798), NULL);
avl = remove_int(avl, 173);
avl = remove_int(avl, 477);
- avl = gpr_avl_add(avl, box(950), box(1801));
- avl = gpr_avl_add(avl, box(105), box(1802));
- avl = gpr_avl_add(avl, box(895), box(1803));
- avl = gpr_avl_add(avl, box(171), box(1804));
- avl = gpr_avl_add(avl, box(753), box(1805));
- avl = gpr_avl_add(avl, box(946), box(1806));
+ avl = gpr_avl_add(avl, box(950), box(1801), NULL);
+ avl = gpr_avl_add(avl, box(105), box(1802), NULL);
+ avl = gpr_avl_add(avl, box(895), box(1803), NULL);
+ avl = gpr_avl_add(avl, box(171), box(1804), NULL);
+ avl = gpr_avl_add(avl, box(753), box(1805), NULL);
+ avl = gpr_avl_add(avl, box(946), box(1806), NULL);
avl = remove_int(avl, 194);
avl = remove_int(avl, 559);
avl = remove_int(avl, 116);
- avl = gpr_avl_add(avl, box(968), box(1810));
+ avl = gpr_avl_add(avl, box(968), box(1810), NULL);
avl = remove_int(avl, 124);
avl = remove_int(avl, 99);
- avl = gpr_avl_add(avl, box(563), box(1813));
+ avl = gpr_avl_add(avl, box(563), box(1813), NULL);
avl = remove_int(avl, 182);
- avl = gpr_avl_add(avl, box(816), box(1815));
+ avl = gpr_avl_add(avl, box(816), box(1815), NULL);
avl = remove_int(avl, 73);
avl = remove_int(avl, 261);
- avl = gpr_avl_add(avl, box(847), box(1818));
- avl = gpr_avl_add(avl, box(368), box(1819));
- avl = gpr_avl_add(avl, box(808), box(1820));
- avl = gpr_avl_add(avl, box(779), box(1821));
+ avl = gpr_avl_add(avl, box(847), box(1818), NULL);
+ avl = gpr_avl_add(avl, box(368), box(1819), NULL);
+ avl = gpr_avl_add(avl, box(808), box(1820), NULL);
+ avl = gpr_avl_add(avl, box(779), box(1821), NULL);
avl = remove_int(avl, 818);
- avl = gpr_avl_add(avl, box(466), box(1823));
+ avl = gpr_avl_add(avl, box(466), box(1823), NULL);
avl = remove_int(avl, 316);
- avl = gpr_avl_add(avl, box(986), box(1825));
- avl = gpr_avl_add(avl, box(688), box(1826));
- avl = gpr_avl_add(avl, box(509), box(1827));
- avl = gpr_avl_add(avl, box(51), box(1828));
+ avl = gpr_avl_add(avl, box(986), box(1825), NULL);
+ avl = gpr_avl_add(avl, box(688), box(1826), NULL);
+ avl = gpr_avl_add(avl, box(509), box(1827), NULL);
+ avl = gpr_avl_add(avl, box(51), box(1828), NULL);
avl = remove_int(avl, 655);
avl = remove_int(avl, 785);
avl = remove_int(avl, 893);
- avl = gpr_avl_add(avl, box(167), box(1832));
+ avl = gpr_avl_add(avl, box(167), box(1832), NULL);
avl = remove_int(avl, 13);
avl = remove_int(avl, 263);
- avl = gpr_avl_add(avl, box(1009), box(1835));
+ avl = gpr_avl_add(avl, box(1009), box(1835), NULL);
avl = remove_int(avl, 480);
avl = remove_int(avl, 778);
avl = remove_int(avl, 713);
avl = remove_int(avl, 628);
- avl = gpr_avl_add(avl, box(803), box(1840));
+ avl = gpr_avl_add(avl, box(803), box(1840), NULL);
avl = remove_int(avl, 267);
- avl = gpr_avl_add(avl, box(676), box(1842));
- avl = gpr_avl_add(avl, box(231), box(1843));
- avl = gpr_avl_add(avl, box(824), box(1844));
+ avl = gpr_avl_add(avl, box(676), box(1842), NULL);
+ avl = gpr_avl_add(avl, box(231), box(1843), NULL);
+ avl = gpr_avl_add(avl, box(824), box(1844), NULL);
avl = remove_int(avl, 961);
- avl = gpr_avl_add(avl, box(311), box(1846));
- avl = gpr_avl_add(avl, box(420), box(1847));
- avl = gpr_avl_add(avl, box(960), box(1848));
- avl = gpr_avl_add(avl, box(468), box(1849));
- avl = gpr_avl_add(avl, box(815), box(1850));
+ avl = gpr_avl_add(avl, box(311), box(1846), NULL);
+ avl = gpr_avl_add(avl, box(420), box(1847), NULL);
+ avl = gpr_avl_add(avl, box(960), box(1848), NULL);
+ avl = gpr_avl_add(avl, box(468), box(1849), NULL);
+ avl = gpr_avl_add(avl, box(815), box(1850), NULL);
avl = remove_int(avl, 247);
avl = remove_int(avl, 194);
- avl = gpr_avl_add(avl, box(546), box(1853));
+ avl = gpr_avl_add(avl, box(546), box(1853), NULL);
avl = remove_int(avl, 222);
avl = remove_int(avl, 914);
avl = remove_int(avl, 741);
- avl = gpr_avl_add(avl, box(470), box(1857));
- avl = gpr_avl_add(avl, box(933), box(1858));
- avl = gpr_avl_add(avl, box(97), box(1859));
+ avl = gpr_avl_add(avl, box(470), box(1857), NULL);
+ avl = gpr_avl_add(avl, box(933), box(1858), NULL);
+ avl = gpr_avl_add(avl, box(97), box(1859), NULL);
avl = remove_int(avl, 564);
avl = remove_int(avl, 295);
- avl = gpr_avl_add(avl, box(864), box(1862));
+ avl = gpr_avl_add(avl, box(864), box(1862), NULL);
avl = remove_int(avl, 329);
- avl = gpr_avl_add(avl, box(124), box(1864));
- avl = gpr_avl_add(avl, box(1000), box(1865));
- avl = gpr_avl_add(avl, box(228), box(1866));
- avl = gpr_avl_add(avl, box(187), box(1867));
+ avl = gpr_avl_add(avl, box(124), box(1864), NULL);
+ avl = gpr_avl_add(avl, box(1000), box(1865), NULL);
+ avl = gpr_avl_add(avl, box(228), box(1866), NULL);
+ avl = gpr_avl_add(avl, box(187), box(1867), NULL);
avl = remove_int(avl, 224);
avl = remove_int(avl, 306);
avl = remove_int(avl, 884);
- avl = gpr_avl_add(avl, box(449), box(1871));
- avl = gpr_avl_add(avl, box(353), box(1872));
- avl = gpr_avl_add(avl, box(994), box(1873));
- avl = gpr_avl_add(avl, box(596), box(1874));
- avl = gpr_avl_add(avl, box(996), box(1875));
- avl = gpr_avl_add(avl, box(101), box(1876));
- avl = gpr_avl_add(avl, box(1012), box(1877));
- avl = gpr_avl_add(avl, box(982), box(1878));
- avl = gpr_avl_add(avl, box(742), box(1879));
+ avl = gpr_avl_add(avl, box(449), box(1871), NULL);
+ avl = gpr_avl_add(avl, box(353), box(1872), NULL);
+ avl = gpr_avl_add(avl, box(994), box(1873), NULL);
+ avl = gpr_avl_add(avl, box(596), box(1874), NULL);
+ avl = gpr_avl_add(avl, box(996), box(1875), NULL);
+ avl = gpr_avl_add(avl, box(101), box(1876), NULL);
+ avl = gpr_avl_add(avl, box(1012), box(1877), NULL);
+ avl = gpr_avl_add(avl, box(982), box(1878), NULL);
+ avl = gpr_avl_add(avl, box(742), box(1879), NULL);
avl = remove_int(avl, 92);
avl = remove_int(avl, 1022);
- avl = gpr_avl_add(avl, box(941), box(1882));
+ avl = gpr_avl_add(avl, box(941), box(1882), NULL);
avl = remove_int(avl, 742);
avl = remove_int(avl, 919);
- avl = gpr_avl_add(avl, box(588), box(1885));
+ avl = gpr_avl_add(avl, box(588), box(1885), NULL);
avl = remove_int(avl, 221);
- avl = gpr_avl_add(avl, box(356), box(1887));
- avl = gpr_avl_add(avl, box(932), box(1888));
+ avl = gpr_avl_add(avl, box(356), box(1887), NULL);
+ avl = gpr_avl_add(avl, box(932), box(1888), NULL);
avl = remove_int(avl, 837);
- avl = gpr_avl_add(avl, box(394), box(1890));
- avl = gpr_avl_add(avl, box(642), box(1891));
- avl = gpr_avl_add(avl, box(52), box(1892));
- avl = gpr_avl_add(avl, box(437), box(1893));
- avl = gpr_avl_add(avl, box(948), box(1894));
- avl = gpr_avl_add(avl, box(93), box(1895));
+ avl = gpr_avl_add(avl, box(394), box(1890), NULL);
+ avl = gpr_avl_add(avl, box(642), box(1891), NULL);
+ avl = gpr_avl_add(avl, box(52), box(1892), NULL);
+ avl = gpr_avl_add(avl, box(437), box(1893), NULL);
+ avl = gpr_avl_add(avl, box(948), box(1894), NULL);
+ avl = gpr_avl_add(avl, box(93), box(1895), NULL);
avl = remove_int(avl, 873);
avl = remove_int(avl, 336);
avl = remove_int(avl, 277);
avl = remove_int(avl, 932);
- avl = gpr_avl_add(avl, box(80), box(1900));
- avl = gpr_avl_add(avl, box(952), box(1901));
- avl = gpr_avl_add(avl, box(510), box(1902));
+ avl = gpr_avl_add(avl, box(80), box(1900), NULL);
+ avl = gpr_avl_add(avl, box(952), box(1901), NULL);
+ avl = gpr_avl_add(avl, box(510), box(1902), NULL);
avl = remove_int(avl, 876);
avl = remove_int(avl, 612);
- avl = gpr_avl_add(avl, box(923), box(1905));
- avl = gpr_avl_add(avl, box(475), box(1906));
+ avl = gpr_avl_add(avl, box(923), box(1905), NULL);
+ avl = gpr_avl_add(avl, box(475), box(1906), NULL);
avl = remove_int(avl, 478);
avl = remove_int(avl, 148);
- avl = gpr_avl_add(avl, box(538), box(1909));
+ avl = gpr_avl_add(avl, box(538), box(1909), NULL);
avl = remove_int(avl, 47);
- avl = gpr_avl_add(avl, box(89), box(1911));
+ avl = gpr_avl_add(avl, box(89), box(1911), NULL);
avl = remove_int(avl, 723);
- avl = gpr_avl_add(avl, box(687), box(1913));
- avl = gpr_avl_add(avl, box(480), box(1914));
- avl = gpr_avl_add(avl, box(149), box(1915));
+ avl = gpr_avl_add(avl, box(687), box(1913), NULL);
+ avl = gpr_avl_add(avl, box(480), box(1914), NULL);
+ avl = gpr_avl_add(avl, box(149), box(1915), NULL);
avl = remove_int(avl, 68);
avl = remove_int(avl, 862);
avl = remove_int(avl, 363);
- avl = gpr_avl_add(avl, box(996), box(1919));
+ avl = gpr_avl_add(avl, box(996), box(1919), NULL);
avl = remove_int(avl, 380);
- avl = gpr_avl_add(avl, box(957), box(1921));
+ avl = gpr_avl_add(avl, box(957), box(1921), NULL);
avl = remove_int(avl, 413);
- avl = gpr_avl_add(avl, box(360), box(1923));
- avl = gpr_avl_add(avl, box(304), box(1924));
- avl = gpr_avl_add(avl, box(634), box(1925));
- avl = gpr_avl_add(avl, box(506), box(1926));
+ avl = gpr_avl_add(avl, box(360), box(1923), NULL);
+ avl = gpr_avl_add(avl, box(304), box(1924), NULL);
+ avl = gpr_avl_add(avl, box(634), box(1925), NULL);
+ avl = gpr_avl_add(avl, box(506), box(1926), NULL);
avl = remove_int(avl, 248);
- avl = gpr_avl_add(avl, box(124), box(1928));
- avl = gpr_avl_add(avl, box(181), box(1929));
+ avl = gpr_avl_add(avl, box(124), box(1928), NULL);
+ avl = gpr_avl_add(avl, box(181), box(1929), NULL);
avl = remove_int(avl, 507);
- avl = gpr_avl_add(avl, box(141), box(1931));
+ avl = gpr_avl_add(avl, box(141), box(1931), NULL);
avl = remove_int(avl, 409);
avl = remove_int(avl, 129);
avl = remove_int(avl, 694);
avl = remove_int(avl, 723);
- avl = gpr_avl_add(avl, box(998), box(1936));
- avl = gpr_avl_add(avl, box(906), box(1937));
- avl = gpr_avl_add(avl, box(44), box(1938));
+ avl = gpr_avl_add(avl, box(998), box(1936), NULL);
+ avl = gpr_avl_add(avl, box(906), box(1937), NULL);
+ avl = gpr_avl_add(avl, box(44), box(1938), NULL);
avl = remove_int(avl, 949);
avl = remove_int(avl, 117);
- avl = gpr_avl_add(avl, box(700), box(1941));
- avl = gpr_avl_add(avl, box(258), box(1942));
+ avl = gpr_avl_add(avl, box(700), box(1941), NULL);
+ avl = gpr_avl_add(avl, box(258), box(1942), NULL);
avl = remove_int(avl, 828);
- avl = gpr_avl_add(avl, box(860), box(1944));
- avl = gpr_avl_add(avl, box(987), box(1945));
- avl = gpr_avl_add(avl, box(316), box(1946));
- avl = gpr_avl_add(avl, box(919), box(1947));
+ avl = gpr_avl_add(avl, box(860), box(1944), NULL);
+ avl = gpr_avl_add(avl, box(987), box(1945), NULL);
+ avl = gpr_avl_add(avl, box(316), box(1946), NULL);
+ avl = gpr_avl_add(avl, box(919), box(1947), NULL);
avl = remove_int(avl, 84);
- avl = gpr_avl_add(avl, box(473), box(1949));
+ avl = gpr_avl_add(avl, box(473), box(1949), NULL);
avl = remove_int(avl, 127);
avl = remove_int(avl, 829);
avl = remove_int(avl, 829);
- avl = gpr_avl_add(avl, box(488), box(1953));
- avl = gpr_avl_add(avl, box(954), box(1954));
+ avl = gpr_avl_add(avl, box(488), box(1953), NULL);
+ avl = gpr_avl_add(avl, box(954), box(1954), NULL);
avl = remove_int(avl, 198);
avl = remove_int(avl, 972);
avl = remove_int(avl, 670);
- avl = gpr_avl_add(avl, box(822), box(1958));
+ avl = gpr_avl_add(avl, box(822), box(1958), NULL);
avl = remove_int(avl, 589);
avl = remove_int(avl, 459);
- avl = gpr_avl_add(avl, box(1003), box(1961));
- avl = gpr_avl_add(avl, box(657), box(1962));
- avl = gpr_avl_add(avl, box(477), box(1963));
- avl = gpr_avl_add(avl, box(923), box(1964));
+ avl = gpr_avl_add(avl, box(1003), box(1961), NULL);
+ avl = gpr_avl_add(avl, box(657), box(1962), NULL);
+ avl = gpr_avl_add(avl, box(477), box(1963), NULL);
+ avl = gpr_avl_add(avl, box(923), box(1964), NULL);
avl = remove_int(avl, 496);
avl = remove_int(avl, 99);
- avl = gpr_avl_add(avl, box(127), box(1967));
- avl = gpr_avl_add(avl, box(1013), box(1968));
- avl = gpr_avl_add(avl, box(778), box(1969));
+ avl = gpr_avl_add(avl, box(127), box(1967), NULL);
+ avl = gpr_avl_add(avl, box(1013), box(1968), NULL);
+ avl = gpr_avl_add(avl, box(778), box(1969), NULL);
avl = remove_int(avl, 5);
avl = remove_int(avl, 990);
avl = remove_int(avl, 850);
avl = remove_int(avl, 160);
avl = remove_int(avl, 86);
- avl = gpr_avl_add(avl, box(283), box(1975));
+ avl = gpr_avl_add(avl, box(283), box(1975), NULL);
avl = remove_int(avl, 278);
avl = remove_int(avl, 297);
avl = remove_int(avl, 137);
avl = remove_int(avl, 653);
- avl = gpr_avl_add(avl, box(702), box(1980));
+ avl = gpr_avl_add(avl, box(702), box(1980), NULL);
avl = remove_int(avl, 63);
avl = remove_int(avl, 427);
avl = remove_int(avl, 706);
avl = remove_int(avl, 806);
- avl = gpr_avl_add(avl, box(335), box(1985));
- avl = gpr_avl_add(avl, box(412), box(1986));
+ avl = gpr_avl_add(avl, box(335), box(1985), NULL);
+ avl = gpr_avl_add(avl, box(412), box(1986), NULL);
avl = remove_int(avl, 766);
avl = remove_int(avl, 937);
avl = remove_int(avl, 886);
avl = remove_int(avl, 652);
- avl = gpr_avl_add(avl, box(545), box(1991));
- avl = gpr_avl_add(avl, box(408), box(1992));
- avl = gpr_avl_add(avl, box(841), box(1993));
+ avl = gpr_avl_add(avl, box(545), box(1991), NULL);
+ avl = gpr_avl_add(avl, box(408), box(1992), NULL);
+ avl = gpr_avl_add(avl, box(841), box(1993), NULL);
avl = remove_int(avl, 593);
- avl = gpr_avl_add(avl, box(582), box(1995));
- avl = gpr_avl_add(avl, box(597), box(1996));
+ avl = gpr_avl_add(avl, box(582), box(1995), NULL);
+ avl = gpr_avl_add(avl, box(597), box(1996), NULL);
avl = remove_int(avl, 49);
avl = remove_int(avl, 835);
- avl = gpr_avl_add(avl, box(417), box(1999));
- avl = gpr_avl_add(avl, box(191), box(2000));
+ avl = gpr_avl_add(avl, box(417), box(1999), NULL);
+ avl = gpr_avl_add(avl, box(191), box(2000), NULL);
avl = remove_int(avl, 406);
- avl = gpr_avl_add(avl, box(30), box(2002));
+ avl = gpr_avl_add(avl, box(30), box(2002), NULL);
avl = remove_int(avl, 841);
avl = remove_int(avl, 50);
- avl = gpr_avl_add(avl, box(967), box(2005));
- avl = gpr_avl_add(avl, box(849), box(2006));
+ avl = gpr_avl_add(avl, box(967), box(2005), NULL);
+ avl = gpr_avl_add(avl, box(849), box(2006), NULL);
avl = remove_int(avl, 608);
- avl = gpr_avl_add(avl, box(306), box(2008));
+ avl = gpr_avl_add(avl, box(306), box(2008), NULL);
avl = remove_int(avl, 779);
- avl = gpr_avl_add(avl, box(897), box(2010));
- avl = gpr_avl_add(avl, box(147), box(2011));
+ avl = gpr_avl_add(avl, box(897), box(2010), NULL);
+ avl = gpr_avl_add(avl, box(147), box(2011), NULL);
avl = remove_int(avl, 982);
- avl = gpr_avl_add(avl, box(470), box(2013));
+ avl = gpr_avl_add(avl, box(470), box(2013), NULL);
avl = remove_int(avl, 951);
- avl = gpr_avl_add(avl, box(388), box(2015));
+ avl = gpr_avl_add(avl, box(388), box(2015), NULL);
avl = remove_int(avl, 616);
avl = remove_int(avl, 721);
avl = remove_int(avl, 942);
avl = remove_int(avl, 589);
- avl = gpr_avl_add(avl, box(218), box(2020));
+ avl = gpr_avl_add(avl, box(218), box(2020), NULL);
avl = remove_int(avl, 671);
- avl = gpr_avl_add(avl, box(1020), box(2022));
+ avl = gpr_avl_add(avl, box(1020), box(2022), NULL);
avl = remove_int(avl, 277);
- avl = gpr_avl_add(avl, box(681), box(2024));
- avl = gpr_avl_add(avl, box(179), box(2025));
- avl = gpr_avl_add(avl, box(370), box(2026));
- avl = gpr_avl_add(avl, box(0), box(2027));
+ avl = gpr_avl_add(avl, box(681), box(2024), NULL);
+ avl = gpr_avl_add(avl, box(179), box(2025), NULL);
+ avl = gpr_avl_add(avl, box(370), box(2026), NULL);
+ avl = gpr_avl_add(avl, box(0), box(2027), NULL);
avl = remove_int(avl, 523);
- avl = gpr_avl_add(avl, box(99), box(2029));
- avl = gpr_avl_add(avl, box(334), box(2030));
- avl = gpr_avl_add(avl, box(569), box(2031));
- avl = gpr_avl_add(avl, box(257), box(2032));
+ avl = gpr_avl_add(avl, box(99), box(2029), NULL);
+ avl = gpr_avl_add(avl, box(334), box(2030), NULL);
+ avl = gpr_avl_add(avl, box(569), box(2031), NULL);
+ avl = gpr_avl_add(avl, box(257), box(2032), NULL);
avl = remove_int(avl, 572);
- avl = gpr_avl_add(avl, box(805), box(2034));
- avl = gpr_avl_add(avl, box(143), box(2035));
- avl = gpr_avl_add(avl, box(670), box(2036));
+ avl = gpr_avl_add(avl, box(805), box(2034), NULL);
+ avl = gpr_avl_add(avl, box(143), box(2035), NULL);
+ avl = gpr_avl_add(avl, box(670), box(2036), NULL);
avl = remove_int(avl, 42);
- avl = gpr_avl_add(avl, box(46), box(2038));
+ avl = gpr_avl_add(avl, box(46), box(2038), NULL);
avl = remove_int(avl, 970);
- avl = gpr_avl_add(avl, box(353), box(2040));
+ avl = gpr_avl_add(avl, box(353), box(2040), NULL);
avl = remove_int(avl, 258);
- avl = gpr_avl_add(avl, box(451), box(2042));
- avl = gpr_avl_add(avl, box(28), box(2043));
- avl = gpr_avl_add(avl, box(729), box(2044));
- avl = gpr_avl_add(avl, box(401), box(2045));
- avl = gpr_avl_add(avl, box(614), box(2046));
+ avl = gpr_avl_add(avl, box(451), box(2042), NULL);
+ avl = gpr_avl_add(avl, box(28), box(2043), NULL);
+ avl = gpr_avl_add(avl, box(729), box(2044), NULL);
+ avl = gpr_avl_add(avl, box(401), box(2045), NULL);
+ avl = gpr_avl_add(avl, box(614), box(2046), NULL);
avl = remove_int(avl, 990);
avl = remove_int(avl, 212);
avl = remove_int(avl, 22);
avl = remove_int(avl, 677);
- avl = gpr_avl_add(avl, box(1016), box(2051));
- avl = gpr_avl_add(avl, box(980), box(2052));
- avl = gpr_avl_add(avl, box(990), box(2053));
- avl = gpr_avl_add(avl, box(355), box(2054));
+ avl = gpr_avl_add(avl, box(1016), box(2051), NULL);
+ avl = gpr_avl_add(avl, box(980), box(2052), NULL);
+ avl = gpr_avl_add(avl, box(990), box(2053), NULL);
+ avl = gpr_avl_add(avl, box(355), box(2054), NULL);
avl = remove_int(avl, 730);
avl = remove_int(avl, 37);
- avl = gpr_avl_add(avl, box(407), box(2057));
- avl = gpr_avl_add(avl, box(222), box(2058));
- avl = gpr_avl_add(avl, box(439), box(2059));
- avl = gpr_avl_add(avl, box(563), box(2060));
+ avl = gpr_avl_add(avl, box(407), box(2057), NULL);
+ avl = gpr_avl_add(avl, box(222), box(2058), NULL);
+ avl = gpr_avl_add(avl, box(439), box(2059), NULL);
+ avl = gpr_avl_add(avl, box(563), box(2060), NULL);
avl = remove_int(avl, 992);
avl = remove_int(avl, 786);
- avl = gpr_avl_add(avl, box(1), box(2063));
- avl = gpr_avl_add(avl, box(473), box(2064));
- avl = gpr_avl_add(avl, box(992), box(2065));
+ avl = gpr_avl_add(avl, box(1), box(2063), NULL);
+ avl = gpr_avl_add(avl, box(473), box(2064), NULL);
+ avl = gpr_avl_add(avl, box(992), box(2065), NULL);
avl = remove_int(avl, 190);
avl = remove_int(avl, 450);
avl = remove_int(avl, 1020);
avl = remove_int(avl, 149);
- avl = gpr_avl_add(avl, box(329), box(2070));
- avl = gpr_avl_add(avl, box(35), box(2071));
+ avl = gpr_avl_add(avl, box(329), box(2070), NULL);
+ avl = gpr_avl_add(avl, box(35), box(2071), NULL);
avl = remove_int(avl, 843);
- avl = gpr_avl_add(avl, box(855), box(2073));
+ avl = gpr_avl_add(avl, box(855), box(2073), NULL);
avl = remove_int(avl, 878);
- avl = gpr_avl_add(avl, box(993), box(2075));
- avl = gpr_avl_add(avl, box(87), box(2076));
- avl = gpr_avl_add(avl, box(572), box(2077));
+ avl = gpr_avl_add(avl, box(993), box(2075), NULL);
+ avl = gpr_avl_add(avl, box(87), box(2076), NULL);
+ avl = gpr_avl_add(avl, box(572), box(2077), NULL);
avl = remove_int(avl, 896);
- avl = gpr_avl_add(avl, box(849), box(2079));
+ avl = gpr_avl_add(avl, box(849), box(2079), NULL);
avl = remove_int(avl, 597);
- avl = gpr_avl_add(avl, box(472), box(2081));
+ avl = gpr_avl_add(avl, box(472), box(2081), NULL);
avl = remove_int(avl, 778);
avl = remove_int(avl, 934);
avl = remove_int(avl, 314);
- avl = gpr_avl_add(avl, box(101), box(2085));
+ avl = gpr_avl_add(avl, box(101), box(2085), NULL);
avl = remove_int(avl, 938);
avl = remove_int(avl, 1010);
- avl = gpr_avl_add(avl, box(579), box(2088));
+ avl = gpr_avl_add(avl, box(579), box(2088), NULL);
avl = remove_int(avl, 798);
avl = remove_int(avl, 88);
- avl = gpr_avl_add(avl, box(851), box(2091));
+ avl = gpr_avl_add(avl, box(851), box(2091), NULL);
avl = remove_int(avl, 705);
- avl = gpr_avl_add(avl, box(26), box(2093));
+ avl = gpr_avl_add(avl, box(26), box(2093), NULL);
avl = remove_int(avl, 973);
- avl = gpr_avl_add(avl, box(923), box(2095));
+ avl = gpr_avl_add(avl, box(923), box(2095), NULL);
avl = remove_int(avl, 668);
- avl = gpr_avl_add(avl, box(310), box(2097));
- avl = gpr_avl_add(avl, box(269), box(2098));
+ avl = gpr_avl_add(avl, box(310), box(2097), NULL);
+ avl = gpr_avl_add(avl, box(269), box(2098), NULL);
avl = remove_int(avl, 173);
- avl = gpr_avl_add(avl, box(279), box(2100));
+ avl = gpr_avl_add(avl, box(279), box(2100), NULL);
avl = remove_int(avl, 203);
- avl = gpr_avl_add(avl, box(411), box(2102));
+ avl = gpr_avl_add(avl, box(411), box(2102), NULL);
avl = remove_int(avl, 950);
- avl = gpr_avl_add(avl, box(6), box(2104));
+ avl = gpr_avl_add(avl, box(6), box(2104), NULL);
avl = remove_int(avl, 400);
avl = remove_int(avl, 468);
avl = remove_int(avl, 271);
- avl = gpr_avl_add(avl, box(627), box(2108));
+ avl = gpr_avl_add(avl, box(627), box(2108), NULL);
avl = remove_int(avl, 727);
avl = remove_int(avl, 148);
avl = remove_int(avl, 98);
@@ -3253,259 +3255,259 @@ static void test_badcase3(void) {
avl = remove_int(avl, 628);
avl = remove_int(avl, 826);
avl = remove_int(avl, 664);
- avl = gpr_avl_add(avl, box(76), box(2117));
+ avl = gpr_avl_add(avl, box(76), box(2117), NULL);
avl = remove_int(avl, 194);
avl = remove_int(avl, 18);
- avl = gpr_avl_add(avl, box(727), box(2120));
+ avl = gpr_avl_add(avl, box(727), box(2120), NULL);
avl = remove_int(avl, 295);
- avl = gpr_avl_add(avl, box(645), box(2122));
+ avl = gpr_avl_add(avl, box(645), box(2122), NULL);
avl = remove_int(avl, 321);
avl = remove_int(avl, 863);
- avl = gpr_avl_add(avl, box(824), box(2125));
- avl = gpr_avl_add(avl, box(651), box(2126));
- avl = gpr_avl_add(avl, box(804), box(2127));
+ avl = gpr_avl_add(avl, box(824), box(2125), NULL);
+ avl = gpr_avl_add(avl, box(651), box(2126), NULL);
+ avl = gpr_avl_add(avl, box(804), box(2127), NULL);
avl = remove_int(avl, 307);
- avl = gpr_avl_add(avl, box(867), box(2129));
+ avl = gpr_avl_add(avl, box(867), box(2129), NULL);
avl = remove_int(avl, 384);
- avl = gpr_avl_add(avl, box(819), box(2131));
+ avl = gpr_avl_add(avl, box(819), box(2131), NULL);
avl = remove_int(avl, 674);
- avl = gpr_avl_add(avl, box(76), box(2133));
+ avl = gpr_avl_add(avl, box(76), box(2133), NULL);
avl = remove_int(avl, 898);
- avl = gpr_avl_add(avl, box(45), box(2135));
- avl = gpr_avl_add(avl, box(512), box(2136));
+ avl = gpr_avl_add(avl, box(45), box(2135), NULL);
+ avl = gpr_avl_add(avl, box(512), box(2136), NULL);
avl = remove_int(avl, 773);
avl = remove_int(avl, 907);
avl = remove_int(avl, 382);
avl = remove_int(avl, 95);
avl = remove_int(avl, 734);
avl = remove_int(avl, 81);
- avl = gpr_avl_add(avl, box(348), box(2143));
+ avl = gpr_avl_add(avl, box(348), box(2143), NULL);
avl = remove_int(avl, 509);
avl = remove_int(avl, 301);
- avl = gpr_avl_add(avl, box(861), box(2146));
- avl = gpr_avl_add(avl, box(918), box(2147));
+ avl = gpr_avl_add(avl, box(861), box(2146), NULL);
+ avl = gpr_avl_add(avl, box(918), box(2147), NULL);
avl = remove_int(avl, 992);
- avl = gpr_avl_add(avl, box(356), box(2149));
+ avl = gpr_avl_add(avl, box(356), box(2149), NULL);
avl = remove_int(avl, 64);
avl = remove_int(avl, 444);
avl = remove_int(avl, 741);
- avl = gpr_avl_add(avl, box(710), box(2153));
- avl = gpr_avl_add(avl, box(264), box(2154));
+ avl = gpr_avl_add(avl, box(710), box(2153), NULL);
+ avl = gpr_avl_add(avl, box(264), box(2154), NULL);
avl = remove_int(avl, 347);
avl = remove_int(avl, 250);
- avl = gpr_avl_add(avl, box(82), box(2157));
- avl = gpr_avl_add(avl, box(571), box(2158));
+ avl = gpr_avl_add(avl, box(82), box(2157), NULL);
+ avl = gpr_avl_add(avl, box(571), box(2158), NULL);
avl = remove_int(avl, 721);
avl = remove_int(avl, 622);
- avl = gpr_avl_add(avl, box(950), box(2161));
- avl = gpr_avl_add(avl, box(94), box(2162));
+ avl = gpr_avl_add(avl, box(950), box(2161), NULL);
+ avl = gpr_avl_add(avl, box(94), box(2162), NULL);
avl = remove_int(avl, 970);
- avl = gpr_avl_add(avl, box(815), box(2164));
+ avl = gpr_avl_add(avl, box(815), box(2164), NULL);
avl = remove_int(avl, 930);
avl = remove_int(avl, 703);
- avl = gpr_avl_add(avl, box(432), box(2167));
+ avl = gpr_avl_add(avl, box(432), box(2167), NULL);
avl = remove_int(avl, 544);
- avl = gpr_avl_add(avl, box(21), box(2169));
- avl = gpr_avl_add(avl, box(186), box(2170));
+ avl = gpr_avl_add(avl, box(21), box(2169), NULL);
+ avl = gpr_avl_add(avl, box(186), box(2170), NULL);
avl = remove_int(avl, 143);
- avl = gpr_avl_add(avl, box(425), box(2172));
+ avl = gpr_avl_add(avl, box(425), box(2172), NULL);
avl = remove_int(avl, 769);
- avl = gpr_avl_add(avl, box(656), box(2174));
+ avl = gpr_avl_add(avl, box(656), box(2174), NULL);
avl = remove_int(avl, 29);
- avl = gpr_avl_add(avl, box(464), box(2176));
+ avl = gpr_avl_add(avl, box(464), box(2176), NULL);
avl = remove_int(avl, 713);
- avl = gpr_avl_add(avl, box(800), box(2178));
+ avl = gpr_avl_add(avl, box(800), box(2178), NULL);
avl = remove_int(avl, 621);
- avl = gpr_avl_add(avl, box(962), box(2180));
+ avl = gpr_avl_add(avl, box(962), box(2180), NULL);
avl = remove_int(avl, 448);
- avl = gpr_avl_add(avl, box(878), box(2182));
+ avl = gpr_avl_add(avl, box(878), box(2182), NULL);
avl = remove_int(avl, 39);
avl = remove_int(avl, 999);
- avl = gpr_avl_add(avl, box(182), box(2185));
- avl = gpr_avl_add(avl, box(429), box(2186));
- avl = gpr_avl_add(avl, box(598), box(2187));
+ avl = gpr_avl_add(avl, box(182), box(2185), NULL);
+ avl = gpr_avl_add(avl, box(429), box(2186), NULL);
+ avl = gpr_avl_add(avl, box(598), box(2187), NULL);
avl = remove_int(avl, 551);
- avl = gpr_avl_add(avl, box(827), box(2189));
- avl = gpr_avl_add(avl, box(809), box(2190));
+ avl = gpr_avl_add(avl, box(827), box(2189), NULL);
+ avl = gpr_avl_add(avl, box(809), box(2190), NULL);
avl = remove_int(avl, 438);
avl = remove_int(avl, 811);
- avl = gpr_avl_add(avl, box(808), box(2193));
- avl = gpr_avl_add(avl, box(788), box(2194));
+ avl = gpr_avl_add(avl, box(808), box(2193), NULL);
+ avl = gpr_avl_add(avl, box(788), box(2194), NULL);
avl = remove_int(avl, 156);
- avl = gpr_avl_add(avl, box(933), box(2196));
- avl = gpr_avl_add(avl, box(344), box(2197));
+ avl = gpr_avl_add(avl, box(933), box(2196), NULL);
+ avl = gpr_avl_add(avl, box(344), box(2197), NULL);
avl = remove_int(avl, 460);
- avl = gpr_avl_add(avl, box(161), box(2199));
- avl = gpr_avl_add(avl, box(444), box(2200));
+ avl = gpr_avl_add(avl, box(161), box(2199), NULL);
+ avl = gpr_avl_add(avl, box(444), box(2200), NULL);
avl = remove_int(avl, 597);
avl = remove_int(avl, 668);
- avl = gpr_avl_add(avl, box(703), box(2203));
+ avl = gpr_avl_add(avl, box(703), box(2203), NULL);
avl = remove_int(avl, 515);
- avl = gpr_avl_add(avl, box(380), box(2205));
- avl = gpr_avl_add(avl, box(338), box(2206));
+ avl = gpr_avl_add(avl, box(380), box(2205), NULL);
+ avl = gpr_avl_add(avl, box(338), box(2206), NULL);
avl = remove_int(avl, 550);
avl = remove_int(avl, 946);
avl = remove_int(avl, 714);
avl = remove_int(avl, 739);
- avl = gpr_avl_add(avl, box(413), box(2211));
+ avl = gpr_avl_add(avl, box(413), box(2211), NULL);
avl = remove_int(avl, 450);
- avl = gpr_avl_add(avl, box(411), box(2213));
- avl = gpr_avl_add(avl, box(117), box(2214));
- avl = gpr_avl_add(avl, box(322), box(2215));
- avl = gpr_avl_add(avl, box(915), box(2216));
- avl = gpr_avl_add(avl, box(410), box(2217));
- avl = gpr_avl_add(avl, box(66), box(2218));
+ avl = gpr_avl_add(avl, box(411), box(2213), NULL);
+ avl = gpr_avl_add(avl, box(117), box(2214), NULL);
+ avl = gpr_avl_add(avl, box(322), box(2215), NULL);
+ avl = gpr_avl_add(avl, box(915), box(2216), NULL);
+ avl = gpr_avl_add(avl, box(410), box(2217), NULL);
+ avl = gpr_avl_add(avl, box(66), box(2218), NULL);
avl = remove_int(avl, 756);
avl = remove_int(avl, 596);
- avl = gpr_avl_add(avl, box(882), box(2221));
- avl = gpr_avl_add(avl, box(930), box(2222));
- avl = gpr_avl_add(avl, box(36), box(2223));
+ avl = gpr_avl_add(avl, box(882), box(2221), NULL);
+ avl = gpr_avl_add(avl, box(930), box(2222), NULL);
+ avl = gpr_avl_add(avl, box(36), box(2223), NULL);
avl = remove_int(avl, 742);
- avl = gpr_avl_add(avl, box(539), box(2225));
- avl = gpr_avl_add(avl, box(596), box(2226));
+ avl = gpr_avl_add(avl, box(539), box(2225), NULL);
+ avl = gpr_avl_add(avl, box(596), box(2226), NULL);
avl = remove_int(avl, 82);
avl = remove_int(avl, 686);
avl = remove_int(avl, 933);
avl = remove_int(avl, 42);
avl = remove_int(avl, 340);
- avl = gpr_avl_add(avl, box(126), box(2232));
- avl = gpr_avl_add(avl, box(493), box(2233));
- avl = gpr_avl_add(avl, box(839), box(2234));
+ avl = gpr_avl_add(avl, box(126), box(2232), NULL);
+ avl = gpr_avl_add(avl, box(493), box(2233), NULL);
+ avl = gpr_avl_add(avl, box(839), box(2234), NULL);
avl = remove_int(avl, 774);
- avl = gpr_avl_add(avl, box(337), box(2236));
+ avl = gpr_avl_add(avl, box(337), box(2236), NULL);
avl = remove_int(avl, 322);
- avl = gpr_avl_add(avl, box(16), box(2238));
+ avl = gpr_avl_add(avl, box(16), box(2238), NULL);
avl = remove_int(avl, 73);
avl = remove_int(avl, 85);
avl = remove_int(avl, 191);
avl = remove_int(avl, 541);
- avl = gpr_avl_add(avl, box(704), box(2243));
+ avl = gpr_avl_add(avl, box(704), box(2243), NULL);
avl = remove_int(avl, 767);
avl = remove_int(avl, 1006);
avl = remove_int(avl, 844);
avl = remove_int(avl, 742);
- avl = gpr_avl_add(avl, box(48), box(2248));
- avl = gpr_avl_add(avl, box(138), box(2249));
- avl = gpr_avl_add(avl, box(437), box(2250));
- avl = gpr_avl_add(avl, box(275), box(2251));
+ avl = gpr_avl_add(avl, box(48), box(2248), NULL);
+ avl = gpr_avl_add(avl, box(138), box(2249), NULL);
+ avl = gpr_avl_add(avl, box(437), box(2250), NULL);
+ avl = gpr_avl_add(avl, box(275), box(2251), NULL);
avl = remove_int(avl, 520);
- avl = gpr_avl_add(avl, box(1019), box(2253));
+ avl = gpr_avl_add(avl, box(1019), box(2253), NULL);
avl = remove_int(avl, 955);
- avl = gpr_avl_add(avl, box(270), box(2255));
+ avl = gpr_avl_add(avl, box(270), box(2255), NULL);
avl = remove_int(avl, 680);
avl = remove_int(avl, 698);
- avl = gpr_avl_add(avl, box(735), box(2258));
- avl = gpr_avl_add(avl, box(400), box(2259));
+ avl = gpr_avl_add(avl, box(735), box(2258), NULL);
+ avl = gpr_avl_add(avl, box(400), box(2259), NULL);
avl = remove_int(avl, 991);
- avl = gpr_avl_add(avl, box(263), box(2261));
+ avl = gpr_avl_add(avl, box(263), box(2261), NULL);
avl = remove_int(avl, 704);
- avl = gpr_avl_add(avl, box(757), box(2263));
+ avl = gpr_avl_add(avl, box(757), box(2263), NULL);
avl = remove_int(avl, 194);
avl = remove_int(avl, 616);
avl = remove_int(avl, 784);
- avl = gpr_avl_add(avl, box(382), box(2267));
- avl = gpr_avl_add(avl, box(464), box(2268));
- avl = gpr_avl_add(avl, box(817), box(2269));
+ avl = gpr_avl_add(avl, box(382), box(2267), NULL);
+ avl = gpr_avl_add(avl, box(464), box(2268), NULL);
+ avl = gpr_avl_add(avl, box(817), box(2269), NULL);
avl = remove_int(avl, 445);
- avl = gpr_avl_add(avl, box(412), box(2271));
+ avl = gpr_avl_add(avl, box(412), box(2271), NULL);
avl = remove_int(avl, 525);
- avl = gpr_avl_add(avl, box(299), box(2273));
- avl = gpr_avl_add(avl, box(464), box(2274));
- avl = gpr_avl_add(avl, box(715), box(2275));
+ avl = gpr_avl_add(avl, box(299), box(2273), NULL);
+ avl = gpr_avl_add(avl, box(464), box(2274), NULL);
+ avl = gpr_avl_add(avl, box(715), box(2275), NULL);
avl = remove_int(avl, 58);
avl = remove_int(avl, 218);
- avl = gpr_avl_add(avl, box(961), box(2278));
- avl = gpr_avl_add(avl, box(491), box(2279));
+ avl = gpr_avl_add(avl, box(961), box(2278), NULL);
+ avl = gpr_avl_add(avl, box(491), box(2279), NULL);
avl = remove_int(avl, 846);
- avl = gpr_avl_add(avl, box(762), box(2281));
+ avl = gpr_avl_add(avl, box(762), box(2281), NULL);
avl = remove_int(avl, 974);
avl = remove_int(avl, 887);
- avl = gpr_avl_add(avl, box(498), box(2284));
+ avl = gpr_avl_add(avl, box(498), box(2284), NULL);
avl = remove_int(avl, 810);
avl = remove_int(avl, 743);
avl = remove_int(avl, 22);
avl = remove_int(avl, 284);
- avl = gpr_avl_add(avl, box(482), box(2289));
- avl = gpr_avl_add(avl, box(1021), box(2290));
+ avl = gpr_avl_add(avl, box(482), box(2289), NULL);
+ avl = gpr_avl_add(avl, box(1021), box(2290), NULL);
avl = remove_int(avl, 155);
avl = remove_int(avl, 128);
- avl = gpr_avl_add(avl, box(819), box(2293));
- avl = gpr_avl_add(avl, box(324), box(2294));
+ avl = gpr_avl_add(avl, box(819), box(2293), NULL);
+ avl = gpr_avl_add(avl, box(324), box(2294), NULL);
avl = remove_int(avl, 196);
avl = remove_int(avl, 370);
avl = remove_int(avl, 753);
avl = remove_int(avl, 56);
avl = remove_int(avl, 735);
- avl = gpr_avl_add(avl, box(272), box(2300));
- avl = gpr_avl_add(avl, box(474), box(2301));
- avl = gpr_avl_add(avl, box(719), box(2302));
- avl = gpr_avl_add(avl, box(236), box(2303));
+ avl = gpr_avl_add(avl, box(272), box(2300), NULL);
+ avl = gpr_avl_add(avl, box(474), box(2301), NULL);
+ avl = gpr_avl_add(avl, box(719), box(2302), NULL);
+ avl = gpr_avl_add(avl, box(236), box(2303), NULL);
avl = remove_int(avl, 818);
- avl = gpr_avl_add(avl, box(727), box(2305));
+ avl = gpr_avl_add(avl, box(727), box(2305), NULL);
avl = remove_int(avl, 892);
avl = remove_int(avl, 871);
avl = remove_int(avl, 231);
- avl = gpr_avl_add(avl, box(62), box(2309));
- avl = gpr_avl_add(avl, box(953), box(2310));
+ avl = gpr_avl_add(avl, box(62), box(2309), NULL);
+ avl = gpr_avl_add(avl, box(953), box(2310), NULL);
avl = remove_int(avl, 701);
- avl = gpr_avl_add(avl, box(193), box(2312));
+ avl = gpr_avl_add(avl, box(193), box(2312), NULL);
avl = remove_int(avl, 619);
avl = remove_int(avl, 22);
avl = remove_int(avl, 804);
avl = remove_int(avl, 851);
- avl = gpr_avl_add(avl, box(286), box(2317));
- avl = gpr_avl_add(avl, box(751), box(2318));
+ avl = gpr_avl_add(avl, box(286), box(2317), NULL);
+ avl = gpr_avl_add(avl, box(751), box(2318), NULL);
avl = remove_int(avl, 525);
- avl = gpr_avl_add(avl, box(217), box(2320));
+ avl = gpr_avl_add(avl, box(217), box(2320), NULL);
avl = remove_int(avl, 336);
- avl = gpr_avl_add(avl, box(86), box(2322));
- avl = gpr_avl_add(avl, box(81), box(2323));
- avl = gpr_avl_add(avl, box(850), box(2324));
+ avl = gpr_avl_add(avl, box(86), box(2322), NULL);
+ avl = gpr_avl_add(avl, box(81), box(2323), NULL);
+ avl = gpr_avl_add(avl, box(850), box(2324), NULL);
avl = remove_int(avl, 872);
- avl = gpr_avl_add(avl, box(402), box(2326));
- avl = gpr_avl_add(avl, box(54), box(2327));
- avl = gpr_avl_add(avl, box(980), box(2328));
- avl = gpr_avl_add(avl, box(845), box(2329));
+ avl = gpr_avl_add(avl, box(402), box(2326), NULL);
+ avl = gpr_avl_add(avl, box(54), box(2327), NULL);
+ avl = gpr_avl_add(avl, box(980), box(2328), NULL);
+ avl = gpr_avl_add(avl, box(845), box(2329), NULL);
avl = remove_int(avl, 1004);
avl = remove_int(avl, 273);
avl = remove_int(avl, 879);
- avl = gpr_avl_add(avl, box(354), box(2333));
- avl = gpr_avl_add(avl, box(58), box(2334));
- avl = gpr_avl_add(avl, box(127), box(2335));
+ avl = gpr_avl_add(avl, box(354), box(2333), NULL);
+ avl = gpr_avl_add(avl, box(58), box(2334), NULL);
+ avl = gpr_avl_add(avl, box(127), box(2335), NULL);
avl = remove_int(avl, 84);
- avl = gpr_avl_add(avl, box(360), box(2337));
+ avl = gpr_avl_add(avl, box(360), box(2337), NULL);
avl = remove_int(avl, 648);
avl = remove_int(avl, 488);
avl = remove_int(avl, 585);
avl = remove_int(avl, 230);
- avl = gpr_avl_add(avl, box(887), box(2342));
+ avl = gpr_avl_add(avl, box(887), box(2342), NULL);
avl = remove_int(avl, 558);
avl = remove_int(avl, 958);
- avl = gpr_avl_add(avl, box(822), box(2345));
+ avl = gpr_avl_add(avl, box(822), box(2345), NULL);
avl = remove_int(avl, 1004);
avl = remove_int(avl, 747);
- avl = gpr_avl_add(avl, box(631), box(2348));
- avl = gpr_avl_add(avl, box(442), box(2349));
+ avl = gpr_avl_add(avl, box(631), box(2348), NULL);
+ avl = gpr_avl_add(avl, box(442), box(2349), NULL);
avl = remove_int(avl, 957);
avl = remove_int(avl, 964);
- avl = gpr_avl_add(avl, box(10), box(2352));
+ avl = gpr_avl_add(avl, box(10), box(2352), NULL);
avl = remove_int(avl, 189);
- avl = gpr_avl_add(avl, box(742), box(2354));
+ avl = gpr_avl_add(avl, box(742), box(2354), NULL);
avl = remove_int(avl, 108);
- avl = gpr_avl_add(avl, box(1014), box(2356));
+ avl = gpr_avl_add(avl, box(1014), box(2356), NULL);
avl = remove_int(avl, 266);
avl = remove_int(avl, 623);
avl = remove_int(avl, 697);
- avl = gpr_avl_add(avl, box(180), box(2360));
+ avl = gpr_avl_add(avl, box(180), box(2360), NULL);
avl = remove_int(avl, 472);
- avl = gpr_avl_add(avl, box(567), box(2362));
+ avl = gpr_avl_add(avl, box(567), box(2362), NULL);
avl = remove_int(avl, 1020);
avl = remove_int(avl, 273);
- avl = gpr_avl_add(avl, box(864), box(2365));
- avl = gpr_avl_add(avl, box(1009), box(2366));
+ avl = gpr_avl_add(avl, box(864), box(2365), NULL);
+ avl = gpr_avl_add(avl, box(1009), box(2366), NULL);
avl = remove_int(avl, 224);
avl = remove_int(avl, 81);
- avl = gpr_avl_add(avl, box(653), box(2369));
+ avl = gpr_avl_add(avl, box(653), box(2369), NULL);
avl = remove_int(avl, 67);
avl = remove_int(avl, 102);
avl = remove_int(avl, 76);
@@ -3513,51 +3515,51 @@ static void test_badcase3(void) {
avl = remove_int(avl, 169);
avl = remove_int(avl, 232);
avl = remove_int(avl, 79);
- avl = gpr_avl_add(avl, box(509), box(2377));
+ avl = gpr_avl_add(avl, box(509), box(2377), NULL);
avl = remove_int(avl, 900);
avl = remove_int(avl, 822);
avl = remove_int(avl, 945);
avl = remove_int(avl, 356);
- avl = gpr_avl_add(avl, box(443), box(2382));
- avl = gpr_avl_add(avl, box(925), box(2383));
+ avl = gpr_avl_add(avl, box(443), box(2382), NULL);
+ avl = gpr_avl_add(avl, box(925), box(2383), NULL);
avl = remove_int(avl, 994);
avl = remove_int(avl, 324);
- avl = gpr_avl_add(avl, box(291), box(2386));
+ avl = gpr_avl_add(avl, box(291), box(2386), NULL);
avl = remove_int(avl, 94);
avl = remove_int(avl, 795);
avl = remove_int(avl, 42);
- avl = gpr_avl_add(avl, box(613), box(2390));
+ avl = gpr_avl_add(avl, box(613), box(2390), NULL);
avl = remove_int(avl, 289);
- avl = gpr_avl_add(avl, box(980), box(2392));
+ avl = gpr_avl_add(avl, box(980), box(2392), NULL);
avl = remove_int(avl, 316);
- avl = gpr_avl_add(avl, box(281), box(2394));
- avl = gpr_avl_add(avl, box(1006), box(2395));
+ avl = gpr_avl_add(avl, box(281), box(2394), NULL);
+ avl = gpr_avl_add(avl, box(1006), box(2395), NULL);
avl = remove_int(avl, 776);
- avl = gpr_avl_add(avl, box(108), box(2397));
- avl = gpr_avl_add(avl, box(918), box(2398));
+ avl = gpr_avl_add(avl, box(108), box(2397), NULL);
+ avl = gpr_avl_add(avl, box(918), box(2398), NULL);
avl = remove_int(avl, 721);
avl = remove_int(avl, 563);
- avl = gpr_avl_add(avl, box(925), box(2401));
+ avl = gpr_avl_add(avl, box(925), box(2401), NULL);
avl = remove_int(avl, 448);
avl = remove_int(avl, 198);
avl = remove_int(avl, 1);
- avl = gpr_avl_add(avl, box(160), box(2405));
+ avl = gpr_avl_add(avl, box(160), box(2405), NULL);
avl = remove_int(avl, 515);
- avl = gpr_avl_add(avl, box(284), box(2407));
- avl = gpr_avl_add(avl, box(225), box(2408));
+ avl = gpr_avl_add(avl, box(284), box(2407), NULL);
+ avl = gpr_avl_add(avl, box(225), box(2408), NULL);
avl = remove_int(avl, 304);
- avl = gpr_avl_add(avl, box(714), box(2410));
- avl = gpr_avl_add(avl, box(708), box(2411));
- avl = gpr_avl_add(avl, box(624), box(2412));
+ avl = gpr_avl_add(avl, box(714), box(2410), NULL);
+ avl = gpr_avl_add(avl, box(708), box(2411), NULL);
+ avl = gpr_avl_add(avl, box(624), box(2412), NULL);
avl = remove_int(avl, 662);
avl = remove_int(avl, 825);
avl = remove_int(avl, 383);
avl = remove_int(avl, 381);
- avl = gpr_avl_add(avl, box(194), box(2417));
+ avl = gpr_avl_add(avl, box(194), box(2417), NULL);
avl = remove_int(avl, 280);
avl = remove_int(avl, 25);
avl = remove_int(avl, 633);
- avl = gpr_avl_add(avl, box(897), box(2421));
+ avl = gpr_avl_add(avl, box(897), box(2421), NULL);
avl = remove_int(avl, 636);
avl = remove_int(avl, 596);
avl = remove_int(avl, 757);
@@ -3567,33 +3569,33 @@ static void test_badcase3(void) {
avl = remove_int(avl, 843);
avl = remove_int(avl, 280);
avl = remove_int(avl, 911);
- avl = gpr_avl_add(avl, box(1008), box(2431));
+ avl = gpr_avl_add(avl, box(1008), box(2431), NULL);
avl = remove_int(avl, 948);
avl = remove_int(avl, 74);
avl = remove_int(avl, 571);
- avl = gpr_avl_add(avl, box(486), box(2435));
- avl = gpr_avl_add(avl, box(285), box(2436));
+ avl = gpr_avl_add(avl, box(486), box(2435), NULL);
+ avl = gpr_avl_add(avl, box(285), box(2436), NULL);
avl = remove_int(avl, 304);
avl = remove_int(avl, 516);
- avl = gpr_avl_add(avl, box(758), box(2439));
- avl = gpr_avl_add(avl, box(776), box(2440));
+ avl = gpr_avl_add(avl, box(758), box(2439), NULL);
+ avl = gpr_avl_add(avl, box(776), box(2440), NULL);
avl = remove_int(avl, 696);
- avl = gpr_avl_add(avl, box(104), box(2442));
- avl = gpr_avl_add(avl, box(700), box(2443));
- avl = gpr_avl_add(avl, box(114), box(2444));
- avl = gpr_avl_add(avl, box(567), box(2445));
+ avl = gpr_avl_add(avl, box(104), box(2442), NULL);
+ avl = gpr_avl_add(avl, box(700), box(2443), NULL);
+ avl = gpr_avl_add(avl, box(114), box(2444), NULL);
+ avl = gpr_avl_add(avl, box(567), box(2445), NULL);
avl = remove_int(avl, 620);
- avl = gpr_avl_add(avl, box(270), box(2447));
+ avl = gpr_avl_add(avl, box(270), box(2447), NULL);
avl = remove_int(avl, 730);
- avl = gpr_avl_add(avl, box(749), box(2449));
- avl = gpr_avl_add(avl, box(443), box(2450));
+ avl = gpr_avl_add(avl, box(749), box(2449), NULL);
+ avl = gpr_avl_add(avl, box(443), box(2450), NULL);
avl = remove_int(avl, 457);
- avl = gpr_avl_add(avl, box(571), box(2452));
- avl = gpr_avl_add(avl, box(626), box(2453));
+ avl = gpr_avl_add(avl, box(571), box(2452), NULL);
+ avl = gpr_avl_add(avl, box(626), box(2453), NULL);
avl = remove_int(avl, 638);
avl = remove_int(avl, 313);
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
static void test_stress(int amount_of_stress) {
@@ -3616,9 +3618,9 @@ static void test_stress(int amount_of_stress) {
GPR_ASSERT(i);
if (rand() < RAND_MAX / 2) {
added[idx] = i;
- printf("avl = gpr_avl_add(avl, box(%d), box(%d)); /* d=%d */\n", idx, i,
- deletions);
- avl = gpr_avl_add(avl, box(idx), box(i));
+ printf("avl = gpr_avl_add(avl, box(%d), box(%d), NULL); /* d=%d */\n",
+ idx, i, deletions);
+ avl = gpr_avl_add(avl, box(idx), box(i), NULL);
} else {
deletions += (added[idx] != 0);
added[idx] = 0;
@@ -3634,7 +3636,7 @@ static void test_stress(int amount_of_stress) {
}
}
- gpr_avl_unref(avl);
+ gpr_avl_unref(avl, NULL);
}
int main(int argc, char *argv[]) {
diff --git a/test/core/surface/completion_queue_test.c b/test/core/surface/completion_queue_test.c
index f9d88d6327..e6372a379c 100644
--- a/test/core/surface/completion_queue_test.c
+++ b/test/core/surface/completion_queue_test.c
@@ -144,7 +144,7 @@ static void test_cq_end_op(void) {
cc = grpc_completion_queue_create(
grpc_completion_queue_factory_lookup(&attr), &attr, NULL);
- grpc_cq_begin_op(cc, tag);
+ GPR_ASSERT(grpc_cq_begin_op(cc, tag));
grpc_cq_end_op(&exec_ctx, cc, tag, GRPC_ERROR_NONE,
do_nothing_end_completion, NULL, &completion);
@@ -233,7 +233,7 @@ static void test_pluck(void) {
grpc_completion_queue_factory_lookup(&attr), &attr, NULL);
for (i = 0; i < GPR_ARRAY_SIZE(tags); i++) {
- grpc_cq_begin_op(cc, tags[i]);
+ GPR_ASSERT(grpc_cq_begin_op(cc, tags[i]));
grpc_cq_end_op(&exec_ctx, cc, tags[i], GRPC_ERROR_NONE,
do_nothing_end_completion, NULL, &completions[i]);
}
@@ -245,7 +245,7 @@ static void test_pluck(void) {
}
for (i = 0; i < GPR_ARRAY_SIZE(tags); i++) {
- grpc_cq_begin_op(cc, tags[i]);
+ GPR_ASSERT(grpc_cq_begin_op(cc, tags[i]));
grpc_cq_end_op(&exec_ctx, cc, tags[i], GRPC_ERROR_NONE,
do_nothing_end_completion, NULL, &completions[i]);
}
diff --git a/test/core/surface/completion_queue_threading_test.c b/test/core/surface/completion_queue_threading_test.c
index 99d0fa4980..9996b6b840 100644
--- a/test/core/surface/completion_queue_threading_test.c
+++ b/test/core/surface/completion_queue_threading_test.c
@@ -107,7 +107,7 @@ static void test_too_many_plucks(void) {
GPR_ASSERT(ev.type == GRPC_QUEUE_TIMEOUT);
for (i = 0; i < GPR_ARRAY_SIZE(tags); i++) {
- grpc_cq_begin_op(cc, tags[i]);
+ GPR_ASSERT(grpc_cq_begin_op(cc, tags[i]));
grpc_cq_end_op(&exec_ctx, cc, tags[i], GRPC_ERROR_NONE,
do_nothing_end_completion, NULL, &completions[i]);
}
@@ -153,7 +153,7 @@ static void producer_thread(void *arg) {
gpr_log(GPR_INFO, "producer %d phase 1", opt->id);
for (i = 0; i < TEST_THREAD_EVENTS; i++) {
- grpc_cq_begin_op(opt->cc, (void *)(intptr_t)1);
+ GPR_ASSERT(grpc_cq_begin_op(opt->cc, (void *)(intptr_t)1));
}
gpr_log(GPR_INFO, "producer %d phase 1 done", opt->id);
diff --git a/test/core/transport/BUILD b/test/core/transport/BUILD
index 8091cf9c63..040c0c35c2 100644
--- a/test/core/transport/BUILD
+++ b/test/core/transport/BUILD
@@ -36,6 +36,18 @@ grpc_cc_test(
)
grpc_cc_test(
+ name = "byte_stream_test",
+ srcs = ["byte_stream_test.c"],
+ language = "C",
+ deps = [
+ "//:gpr",
+ "//:grpc",
+ "//test/core/util:gpr_test_util",
+ "//test/core/util:grpc_test_util",
+ ],
+)
+
+grpc_cc_test(
name = "connectivity_state_test",
srcs = ["connectivity_state_test.c"],
language = "C",
diff --git a/test/core/transport/byte_stream_test.c b/test/core/transport/byte_stream_test.c
new file mode 100644
index 0000000000..a0c5f961cf
--- /dev/null
+++ b/test/core/transport/byte_stream_test.c
@@ -0,0 +1,279 @@
+/*
+ *
+ * Copyright 2017 gRPC authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include "src/core/lib/transport/byte_stream.h"
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/useful.h>
+
+#include "src/core/lib/slice/slice_internal.h"
+
+#include "test/core/util/test_config.h"
+
+//
+// grpc_slice_buffer_stream tests
+//
+
+static void not_called_closure(grpc_exec_ctx *exec_ctx, void *arg,
+ grpc_error *error) {
+ GPR_ASSERT(false);
+}
+
+static void test_slice_buffer_stream_basic(void) {
+ gpr_log(GPR_DEBUG, "test_slice_buffer_stream_basic");
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ // Create and populate slice buffer.
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+ grpc_slice input[] = {
+ grpc_slice_from_static_string("foo"),
+ grpc_slice_from_static_string("bar"),
+ };
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ grpc_slice_buffer_add(&buffer, input[i]);
+ }
+ // Create byte stream.
+ grpc_slice_buffer_stream stream;
+ grpc_slice_buffer_stream_init(&stream, &buffer, 0);
+ GPR_ASSERT(stream.base.length == 6);
+ grpc_closure closure;
+ GRPC_CLOSURE_INIT(&closure, not_called_closure, NULL,
+ grpc_schedule_on_exec_ctx);
+ // Read each slice. Note that next() always returns synchronously.
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ grpc_slice output;
+ grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[i], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ }
+ // Clean up.
+ grpc_byte_stream_destroy(&exec_ctx, &stream.base);
+ grpc_slice_buffer_destroy_internal(&exec_ctx, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static void test_slice_buffer_stream_shutdown(void) {
+ gpr_log(GPR_DEBUG, "test_slice_buffer_stream_shutdown");
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ // Create and populate slice buffer.
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+ grpc_slice input[] = {
+ grpc_slice_from_static_string("foo"),
+ grpc_slice_from_static_string("bar"),
+ };
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ grpc_slice_buffer_add(&buffer, input[i]);
+ }
+ // Create byte stream.
+ grpc_slice_buffer_stream stream;
+ grpc_slice_buffer_stream_init(&stream, &buffer, 0);
+ GPR_ASSERT(stream.base.length == 6);
+ grpc_closure closure;
+ GRPC_CLOSURE_INIT(&closure, not_called_closure, NULL,
+ grpc_schedule_on_exec_ctx);
+ // Read the first slice.
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ grpc_slice output;
+ grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[0], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ // Now shutdown.
+ grpc_error *shutdown_error =
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("shutdown error");
+ grpc_byte_stream_shutdown(&exec_ctx, &stream.base,
+ GRPC_ERROR_REF(shutdown_error));
+ // After shutdown, the next pull() should return the error.
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == shutdown_error);
+ GRPC_ERROR_UNREF(error);
+ GRPC_ERROR_UNREF(shutdown_error);
+ // Clean up.
+ grpc_byte_stream_destroy(&exec_ctx, &stream.base);
+ grpc_slice_buffer_destroy_internal(&exec_ctx, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+//
+// grpc_caching_byte_stream tests
+//
+
+static void test_caching_byte_stream_basic(void) {
+ gpr_log(GPR_DEBUG, "test_caching_byte_stream_basic");
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ // Create and populate slice buffer byte stream.
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+ grpc_slice input[] = {
+ grpc_slice_from_static_string("foo"),
+ grpc_slice_from_static_string("bar"),
+ };
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ grpc_slice_buffer_add(&buffer, input[i]);
+ }
+ grpc_slice_buffer_stream underlying_stream;
+ grpc_slice_buffer_stream_init(&underlying_stream, &buffer, 0);
+ // Create cache and caching stream.
+ grpc_byte_stream_cache cache;
+ grpc_byte_stream_cache_init(&cache, &underlying_stream.base);
+ grpc_caching_byte_stream stream;
+ grpc_caching_byte_stream_init(&stream, &cache);
+ grpc_closure closure;
+ GRPC_CLOSURE_INIT(&closure, not_called_closure, NULL,
+ grpc_schedule_on_exec_ctx);
+ // Read each slice. Note that next() always returns synchronously,
+ // because the underlying byte stream always does.
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ grpc_slice output;
+ grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[i], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ }
+ // Clean up.
+ grpc_byte_stream_destroy(&exec_ctx, &stream.base);
+ grpc_byte_stream_cache_destroy(&exec_ctx, &cache);
+ grpc_slice_buffer_destroy_internal(&exec_ctx, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static void test_caching_byte_stream_reset(void) {
+ gpr_log(GPR_DEBUG, "test_caching_byte_stream_reset");
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ // Create and populate slice buffer byte stream.
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+ grpc_slice input[] = {
+ grpc_slice_from_static_string("foo"),
+ grpc_slice_from_static_string("bar"),
+ };
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ grpc_slice_buffer_add(&buffer, input[i]);
+ }
+ grpc_slice_buffer_stream underlying_stream;
+ grpc_slice_buffer_stream_init(&underlying_stream, &buffer, 0);
+ // Create cache and caching stream.
+ grpc_byte_stream_cache cache;
+ grpc_byte_stream_cache_init(&cache, &underlying_stream.base);
+ grpc_caching_byte_stream stream;
+ grpc_caching_byte_stream_init(&stream, &cache);
+ grpc_closure closure;
+ GRPC_CLOSURE_INIT(&closure, not_called_closure, NULL,
+ grpc_schedule_on_exec_ctx);
+ // Read one slice.
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ grpc_slice output;
+ grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[0], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ // Reset the caching stream. The reads should start over from the
+ // first slice.
+ grpc_caching_byte_stream_reset(&stream);
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream.base, ~(size_t)0, &closure));
+ error = grpc_byte_stream_pull(&exec_ctx, &stream.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[i], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ }
+ // Clean up.
+ grpc_byte_stream_destroy(&exec_ctx, &stream.base);
+ grpc_byte_stream_cache_destroy(&exec_ctx, &cache);
+ grpc_slice_buffer_destroy_internal(&exec_ctx, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+static void test_caching_byte_stream_shared_cache(void) {
+ gpr_log(GPR_DEBUG, "test_caching_byte_stream_shared_cache");
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ // Create and populate slice buffer byte stream.
+ grpc_slice_buffer buffer;
+ grpc_slice_buffer_init(&buffer);
+ grpc_slice input[] = {
+ grpc_slice_from_static_string("foo"),
+ grpc_slice_from_static_string("bar"),
+ };
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ grpc_slice_buffer_add(&buffer, input[i]);
+ }
+ grpc_slice_buffer_stream underlying_stream;
+ grpc_slice_buffer_stream_init(&underlying_stream, &buffer, 0);
+ // Create cache and two caching streams.
+ grpc_byte_stream_cache cache;
+ grpc_byte_stream_cache_init(&cache, &underlying_stream.base);
+ grpc_caching_byte_stream stream1;
+ grpc_caching_byte_stream_init(&stream1, &cache);
+ grpc_caching_byte_stream stream2;
+ grpc_caching_byte_stream_init(&stream2, &cache);
+ grpc_closure closure;
+ GRPC_CLOSURE_INIT(&closure, not_called_closure, NULL,
+ grpc_schedule_on_exec_ctx);
+ // Read one slice from stream1.
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream1.base, ~(size_t)0, &closure));
+ grpc_slice output;
+ grpc_error *error = grpc_byte_stream_pull(&exec_ctx, &stream1.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[0], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ // Read all slices from stream2.
+ for (size_t i = 0; i < GPR_ARRAY_SIZE(input); ++i) {
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream2.base, ~(size_t)0, &closure));
+ error = grpc_byte_stream_pull(&exec_ctx, &stream2.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[i], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ }
+ // Now read the second slice from stream1.
+ GPR_ASSERT(
+ grpc_byte_stream_next(&exec_ctx, &stream1.base, ~(size_t)0, &closure));
+ error = grpc_byte_stream_pull(&exec_ctx, &stream1.base, &output);
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
+ GPR_ASSERT(grpc_slice_eq(input[1], output));
+ grpc_slice_unref_internal(&exec_ctx, output);
+ // Clean up.
+ grpc_byte_stream_destroy(&exec_ctx, &stream1.base);
+ grpc_byte_stream_destroy(&exec_ctx, &stream2.base);
+ grpc_byte_stream_cache_destroy(&exec_ctx, &cache);
+ grpc_slice_buffer_destroy_internal(&exec_ctx, &buffer);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+int main(int argc, char **argv) {
+ grpc_test_init(argc, argv);
+ test_slice_buffer_stream_basic();
+ test_slice_buffer_stream_shutdown();
+ test_caching_byte_stream_basic();
+ test_caching_byte_stream_reset();
+ test_caching_byte_stream_shared_cache();
+ return 0;
+}
diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc
index 1f3255d18d..4fef535506 100644
--- a/test/cpp/end2end/grpclb_end2end_test.cc
+++ b/test/cpp/end2end/grpclb_end2end_test.cc
@@ -45,6 +45,7 @@ extern "C" {
#include "src/proto/grpc/lb/v1/load_balancer.grpc.pb.h"
#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include <gmock/gmock.h>
#include <gtest/gtest.h>
// TODO(dgq): Other scenarios in need of testing:
@@ -131,6 +132,19 @@ class BackendServiceImpl : public BackendService {
IncreaseResponseCount();
return status;
}
+
+ // Returns true on its first invocation, false otherwise.
+ bool Shutdown() {
+ std::unique_lock<std::mutex> lock(mu_);
+ const bool prev = !shutdown_;
+ shutdown_ = true;
+ gpr_log(GPR_INFO, "Backend: shut down");
+ return prev;
+ }
+
+ private:
+ std::mutex mu_;
+ bool shutdown_ = false;
};
grpc::string Ip4ToPackedString(const char* ip_str) {
@@ -142,22 +156,20 @@ grpc::string Ip4ToPackedString(const char* ip_str) {
struct ClientStats {
size_t num_calls_started = 0;
size_t num_calls_finished = 0;
- size_t num_calls_finished_with_drop_for_rate_limiting = 0;
- size_t num_calls_finished_with_drop_for_load_balancing = 0;
size_t num_calls_finished_with_client_failed_to_send = 0;
size_t num_calls_finished_known_received = 0;
+ std::map<grpc::string, size_t> drop_token_counts;
ClientStats& operator+=(const ClientStats& other) {
num_calls_started += other.num_calls_started;
num_calls_finished += other.num_calls_finished;
- num_calls_finished_with_drop_for_rate_limiting +=
- other.num_calls_finished_with_drop_for_rate_limiting;
- num_calls_finished_with_drop_for_load_balancing +=
- other.num_calls_finished_with_drop_for_load_balancing;
num_calls_finished_with_client_failed_to_send +=
other.num_calls_finished_with_client_failed_to_send;
num_calls_finished_known_received +=
other.num_calls_finished_known_received;
+ for (const auto& p : other.drop_token_counts) {
+ drop_token_counts[p.first] += p.second;
+ }
return *this;
}
};
@@ -173,11 +185,12 @@ class BalancerServiceImpl : public BalancerService {
shutdown_(false) {}
Status BalanceLoad(ServerContext* context, Stream* stream) override {
- gpr_log(GPR_INFO, "LB: BalanceLoad");
+ gpr_log(GPR_INFO, "LB[%p]: BalanceLoad", this);
LoadBalanceRequest request;
stream->Read(&request);
IncreaseRequestCount();
- gpr_log(GPR_INFO, "LB: recv msg '%s'", request.DebugString().c_str());
+ gpr_log(GPR_INFO, "LB[%p]: recv msg '%s'", this,
+ request.DebugString().c_str());
if (client_load_reporting_interval_seconds_ > 0) {
LoadBalanceResponse initial_response;
@@ -208,7 +221,7 @@ class BalancerServiceImpl : public BalancerService {
if (client_load_reporting_interval_seconds_ > 0) {
request.Clear();
stream->Read(&request);
- gpr_log(GPR_INFO, "LB: recv client load report msg: '%s'",
+ gpr_log(GPR_INFO, "LB[%p]: recv client load report msg: '%s'", this,
request.DebugString().c_str());
GPR_ASSERT(request.has_client_stats());
// We need to acquire the lock here in order to prevent the notify_one
@@ -218,21 +231,21 @@ class BalancerServiceImpl : public BalancerService {
request.client_stats().num_calls_started();
client_stats_.num_calls_finished +=
request.client_stats().num_calls_finished();
- client_stats_.num_calls_finished_with_drop_for_rate_limiting +=
- request.client_stats()
- .num_calls_finished_with_drop_for_rate_limiting();
- client_stats_.num_calls_finished_with_drop_for_load_balancing +=
- request.client_stats()
- .num_calls_finished_with_drop_for_load_balancing();
client_stats_.num_calls_finished_with_client_failed_to_send +=
request.client_stats()
.num_calls_finished_with_client_failed_to_send();
client_stats_.num_calls_finished_known_received +=
request.client_stats().num_calls_finished_known_received();
+ for (const auto& drop_token_count :
+ request.client_stats().calls_finished_with_drop()) {
+ client_stats_
+ .drop_token_counts[drop_token_count.load_balance_token()] +=
+ drop_token_count.num_calls();
+ }
load_report_cond_.notify_one();
}
done:
- gpr_log(GPR_INFO, "LB: done");
+ gpr_log(GPR_INFO, "LB[%p]: done", this);
return Status::OK;
}
@@ -247,21 +260,20 @@ class BalancerServiceImpl : public BalancerService {
std::unique_lock<std::mutex> lock(mu_);
const bool prev = !shutdown_;
shutdown_ = true;
- gpr_log(GPR_INFO, "LB: shut down");
+ gpr_log(GPR_INFO, "LB[%p]: shut down", this);
return prev;
}
static LoadBalanceResponse BuildResponseForBackends(
- const std::vector<int>& backend_ports, int num_drops_for_rate_limiting,
- int num_drops_for_load_balancing) {
+ const std::vector<int>& backend_ports,
+ const std::map<grpc::string, size_t>& drop_token_counts) {
LoadBalanceResponse response;
- for (int i = 0; i < num_drops_for_rate_limiting; ++i) {
- auto* server = response.mutable_server_list()->add_servers();
- server->set_drop_for_rate_limiting(true);
- }
- for (int i = 0; i < num_drops_for_load_balancing; ++i) {
- auto* server = response.mutable_server_list()->add_servers();
- server->set_drop_for_load_balancing(true);
+ for (const auto& drop_token_count : drop_token_counts) {
+ for (size_t i = 0; i < drop_token_count.second; ++i) {
+ auto* server = response.mutable_server_list()->add_servers();
+ server->set_drop(true);
+ server->set_load_balance_token(drop_token_count.first);
+ }
}
for (const int& backend_port : backend_ports) {
auto* server = response.mutable_server_list()->add_servers();
@@ -285,13 +297,13 @@ class BalancerServiceImpl : public BalancerService {
private:
void SendResponse(Stream* stream, const LoadBalanceResponse& response,
int delay_ms) {
- gpr_log(GPR_INFO, "LB: sleeping for %d ms...", delay_ms);
+ gpr_log(GPR_INFO, "LB[%p]: sleeping for %d ms...", this, delay_ms);
if (delay_ms > 0) {
gpr_sleep_until(
gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
gpr_time_from_millis(delay_ms, GPR_TIMESPAN)));
}
- gpr_log(GPR_INFO, "LB: Woke up! Sending response '%s'",
+ gpr_log(GPR_INFO, "LB[%p]: Woke up! Sending response '%s'", this,
response.DebugString().c_str());
IncreaseResponseCount();
stream->Write(response);
@@ -341,7 +353,7 @@ class GrpclbEnd2endTest : public ::testing::Test {
void TearDown() override {
for (size_t i = 0; i < backends_.size(); ++i) {
- backend_servers_[i].Shutdown();
+ if (backends_[i]->Shutdown()) backend_servers_[i].Shutdown();
}
for (size_t i = 0; i < balancers_.size(); ++i) {
if (balancers_[i]->Shutdown()) balancer_servers_[i].Shutdown();
@@ -499,7 +511,7 @@ class SingleBalancerTest : public GrpclbEnd2endTest {
TEST_F(SingleBalancerTest, Vanilla) {
const size_t kNumRpcsPerAddress = 100;
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
0);
// Make sure that trying to connect works without a call.
channel_->GetState(true /* try_to_connect */);
@@ -538,7 +550,7 @@ TEST_F(SingleBalancerTest, InitiallyEmptyServerlist) {
ScheduleResponseForBalancer(0, LoadBalanceResponse(), 0);
// Send non-empty serverlist only after kServerlistDelayMs
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
kServerlistDelayMs);
const auto t0 = system_clock::now();
@@ -580,11 +592,11 @@ TEST_F(SingleBalancerTest, RepeatedServerlist) {
// Send a serverlist right away.
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
0);
// ... and the same one a bit later.
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
kServerlistDelayMs);
// Send num_backends/2 requests.
@@ -639,6 +651,61 @@ TEST_F(SingleBalancerTest, RepeatedServerlist) {
EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
}
+TEST_F(SingleBalancerTest, BackendsRestart) {
+ const size_t kNumRpcsPerAddress = 100;
+ ScheduleResponseForBalancer(
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
+ 0);
+ // Make sure that trying to connect works without a call.
+ channel_->GetState(true /* try_to_connect */);
+ // Send 100 RPCs per server.
+ auto statuses_and_responses =
+ SendRpc(kMessage_, kNumRpcsPerAddress * num_backends_);
+ for (const auto& status_and_response : statuses_and_responses) {
+ const Status& status = status_and_response.first;
+ const EchoResponse& response = status_and_response.second;
+ EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
+ << " message=" << status.error_message();
+ EXPECT_EQ(response.message(), kMessage_);
+ }
+ // Each backend should have gotten 100 requests.
+ for (size_t i = 0; i < backends_.size(); ++i) {
+ EXPECT_EQ(kNumRpcsPerAddress,
+ backend_servers_[i].service_->request_count());
+ }
+ balancers_[0]->NotifyDoneWithServerlists();
+ // The balancer got a single request.
+ EXPECT_EQ(1U, balancer_servers_[0].service_->request_count());
+ // and sent a single response.
+ EXPECT_EQ(1U, balancer_servers_[0].service_->response_count());
+ for (size_t i = 0; i < backends_.size(); ++i) {
+ if (backends_[i]->Shutdown()) backend_servers_[i].Shutdown();
+ }
+ statuses_and_responses = SendRpc(kMessage_, 1);
+ for (const auto& status_and_response : statuses_and_responses) {
+ const Status& status = status_and_response.first;
+ EXPECT_FALSE(status.ok());
+ }
+ for (size_t i = 0; i < num_backends_; ++i) {
+ backends_.emplace_back(new BackendServiceImpl());
+ backend_servers_.emplace_back(ServerThread<BackendService>(
+ "backend", server_host_, backends_.back().get()));
+ }
+ // The following RPC will fail due to the backend ports having changed. It
+ // will nonetheless exercise the grpclb-roundrobin handling of the RR policy
+ // having gone into shutdown.
+ // TODO(dgq): implement the "backend restart" component as well. We need extra
+ // machinery to either update the LB responses "on the fly" or instruct
+ // backends which ports to restart on.
+ statuses_and_responses = SendRpc(kMessage_, 1);
+ for (const auto& status_and_response : statuses_and_responses) {
+ const Status& status = status_and_response.first;
+ EXPECT_FALSE(status.ok());
+ }
+ // Check LB policy name for the channel.
+ EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
+}
+
class UpdatesTest : public GrpclbEnd2endTest {
public:
UpdatesTest() : GrpclbEnd2endTest(4, 3, 0) {}
@@ -648,10 +715,9 @@ TEST_F(UpdatesTest, UpdateBalancers) {
const std::vector<int> first_backend{GetBackendPorts()[0]};
const std::vector<int> second_backend{GetBackendPorts()[1]};
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, 0, 0), 0);
+ 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
ScheduleResponseForBalancer(
- 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, 0, 0),
- 0);
+ 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
// Start servers and send 10 RPCs per server.
gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
@@ -726,10 +792,9 @@ TEST_F(UpdatesTest, UpdateBalancersRepeated) {
const std::vector<int> second_backend{GetBackendPorts()[0]};
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, 0, 0), 0);
+ 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
ScheduleResponseForBalancer(
- 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, 0, 0),
- 0);
+ 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
// Start servers and send 10 RPCs per server.
gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
@@ -809,10 +874,9 @@ TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) {
const std::vector<int> second_backend{GetBackendPorts()[1]};
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, 0, 0), 0);
+ 0, BalancerServiceImpl::BuildResponseForBackends(first_backend, {}), 0);
ScheduleResponseForBalancer(
- 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, 0, 0),
- 0);
+ 1, BalancerServiceImpl::BuildResponseForBackends(second_backend, {}), 0);
// Start servers and send 10 RPCs per server.
gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
@@ -901,7 +965,8 @@ TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) {
TEST_F(SingleBalancerTest, Drop) {
const size_t kNumRpcsPerAddress = 100;
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 1, 2),
+ 0, BalancerServiceImpl::BuildResponseForBackends(
+ GetBackendPorts(), {{"rate_limiting", 1}, {"load_balancing", 2}}),
0);
// Send 100 RPCs for each server and drop address.
const auto& statuses_and_responses =
@@ -936,7 +1001,9 @@ TEST_F(SingleBalancerTest, Drop) {
TEST_F(SingleBalancerTest, DropAllFirst) {
// All registered addresses are marked as "drop".
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends({}, 1, 1), 0);
+ 0, BalancerServiceImpl::BuildResponseForBackends(
+ {}, {{"rate_limiting", 1}, {"load_balancing", 1}}),
+ 0);
const auto& statuses_and_responses = SendRpc(kMessage_, 1);
for (const auto& status_and_response : statuses_and_responses) {
const Status& status = status_and_response.first;
@@ -947,10 +1014,12 @@ TEST_F(SingleBalancerTest, DropAllFirst) {
TEST_F(SingleBalancerTest, DropAll) {
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
0);
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends({}, 1, 1), 1000);
+ 0, BalancerServiceImpl::BuildResponseForBackends(
+ {}, {{"rate_limiting", 1}, {"load_balancing", 1}}),
+ 1000);
// First call succeeds.
auto statuses_and_responses = SendRpc(kMessage_, 1);
@@ -980,7 +1049,7 @@ class SingleBalancerWithClientLoadReportingTest : public GrpclbEnd2endTest {
TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) {
const size_t kNumRpcsPerAddress = 100;
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 0, 0),
+ 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), {}),
0);
// Send 100 RPCs per server.
const auto& statuses_and_responses =
@@ -1009,17 +1078,17 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) {
EXPECT_EQ(kNumRpcsPerAddress * num_backends_, client_stats.num_calls_started);
EXPECT_EQ(kNumRpcsPerAddress * num_backends_,
client_stats.num_calls_finished);
- EXPECT_EQ(0U, client_stats.num_calls_finished_with_drop_for_rate_limiting);
- EXPECT_EQ(0U, client_stats.num_calls_finished_with_drop_for_load_balancing);
EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
EXPECT_EQ(kNumRpcsPerAddress * num_backends_,
client_stats.num_calls_finished_known_received);
+ EXPECT_THAT(client_stats.drop_token_counts, ::testing::ElementsAre());
}
TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) {
const size_t kNumRpcsPerAddress = 3;
ScheduleResponseForBalancer(
- 0, BalancerServiceImpl::BuildResponseForBackends(GetBackendPorts(), 2, 1),
+ 0, BalancerServiceImpl::BuildResponseForBackends(
+ GetBackendPorts(), {{"rate_limiting", 2}, {"load_balancing", 1}}),
0);
// Send 100 RPCs for each server and drop address.
const auto& statuses_and_responses =
@@ -1056,13 +1125,13 @@ TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) {
client_stats.num_calls_started);
EXPECT_EQ(kNumRpcsPerAddress * (num_backends_ + 3),
client_stats.num_calls_finished);
- EXPECT_EQ(kNumRpcsPerAddress * 2,
- client_stats.num_calls_finished_with_drop_for_rate_limiting);
- EXPECT_EQ(kNumRpcsPerAddress,
- client_stats.num_calls_finished_with_drop_for_load_balancing);
EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
EXPECT_EQ(kNumRpcsPerAddress * num_backends_,
client_stats.num_calls_finished_known_received);
+ EXPECT_THAT(client_stats.drop_token_counts,
+ ::testing::ElementsAre(
+ ::testing::Pair("load_balancing", kNumRpcsPerAddress),
+ ::testing::Pair("rate_limiting", kNumRpcsPerAddress * 2)));
}
} // namespace
diff --git a/test/cpp/grpclb/grpclb_api_test.cc b/test/cpp/grpclb/grpclb_api_test.cc
index cec9666503..6b0350e1f9 100644
--- a/test/cpp/grpclb/grpclb_api_test.cc
+++ b/test/cpp/grpclb/grpclb_api_test.cc
@@ -91,13 +91,13 @@ TEST_F(GrpclbTest, ParseResponseServerList) {
auto* server = serverlist->add_servers();
server->set_ip_address(Ip4ToPackedString("127.0.0.1"));
server->set_port(12345);
- server->set_drop_for_rate_limiting(true);
- server->set_drop_for_load_balancing(false);
+ server->set_load_balance_token("rate_limting");
+ server->set_drop(true);
server = response.mutable_server_list()->add_servers();
server->set_ip_address(Ip4ToPackedString("10.0.0.1"));
server->set_port(54321);
- server->set_drop_for_rate_limiting(false);
- server->set_drop_for_load_balancing(true);
+ server->set_load_balance_token("load_balancing");
+ server->set_drop(true);
auto* expiration_interval = serverlist->mutable_expiration_interval();
expiration_interval->set_seconds(888);
expiration_interval->set_nanos(999);
@@ -112,14 +112,14 @@ TEST_F(GrpclbTest, ParseResponseServerList) {
EXPECT_EQ(PackedStringToIp(c_serverlist->servers[0]->ip_address),
"127.0.0.1");
EXPECT_EQ(c_serverlist->servers[0]->port, 12345);
- EXPECT_TRUE(c_serverlist->servers[0]->drop_for_rate_limiting);
- EXPECT_FALSE(c_serverlist->servers[0]->drop_for_load_balancing);
+ EXPECT_STREQ(c_serverlist->servers[0]->load_balance_token, "rate_limting");
+ EXPECT_TRUE(c_serverlist->servers[0]->drop);
EXPECT_TRUE(c_serverlist->servers[1]->has_ip_address);
EXPECT_EQ(PackedStringToIp(c_serverlist->servers[1]->ip_address), "10.0.0.1");
EXPECT_EQ(c_serverlist->servers[1]->port, 54321);
- EXPECT_FALSE(c_serverlist->servers[1]->drop_for_rate_limiting);
- EXPECT_TRUE(c_serverlist->servers[1]->drop_for_load_balancing);
+ EXPECT_STREQ(c_serverlist->servers[1]->load_balance_token, "load_balancing");
+ EXPECT_TRUE(c_serverlist->servers[1]->drop);
EXPECT_TRUE(c_serverlist->expiration_interval.has_seconds);
EXPECT_EQ(c_serverlist->expiration_interval.seconds, 888);
diff --git a/test/cpp/microbenchmarks/bm_cq.cc b/test/cpp/microbenchmarks/bm_cq.cc
index 18308a2e16..a0c0414f2f 100644
--- a/test/cpp/microbenchmarks/bm_cq.cc
+++ b/test/cpp/microbenchmarks/bm_cq.cc
@@ -23,6 +23,7 @@
#include <grpc++/completion_queue.h>
#include <grpc++/impl/grpc_library.h>
#include <grpc/grpc.h>
+#include <grpc/support/log.h>
#include "test/cpp/microbenchmarks/helpers.h"
extern "C" {
@@ -82,7 +83,7 @@ static void BM_Pass1Cpp(benchmark::State& state) {
grpc_cq_completion completion;
DummyTag dummy_tag;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_cq_begin_op(c_cq, &dummy_tag);
+ GPR_ASSERT(grpc_cq_begin_op(c_cq, &dummy_tag));
grpc_cq_end_op(&exec_ctx, c_cq, &dummy_tag, GRPC_ERROR_NONE,
DoneWithCompletionOnStack, NULL, &completion);
grpc_exec_ctx_finish(&exec_ctx);
@@ -102,7 +103,7 @@ static void BM_Pass1Core(benchmark::State& state) {
while (state.KeepRunning()) {
grpc_cq_completion completion;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_cq_begin_op(cq, NULL);
+ GPR_ASSERT(grpc_cq_begin_op(cq, NULL));
grpc_cq_end_op(&exec_ctx, cq, NULL, GRPC_ERROR_NONE,
DoneWithCompletionOnStack, NULL, &completion);
grpc_exec_ctx_finish(&exec_ctx);
@@ -121,7 +122,7 @@ static void BM_Pluck1Core(benchmark::State& state) {
while (state.KeepRunning()) {
grpc_cq_completion completion;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
- grpc_cq_begin_op(cq, NULL);
+ GPR_ASSERT(grpc_cq_begin_op(cq, NULL));
grpc_cq_end_op(&exec_ctx, cq, NULL, GRPC_ERROR_NONE,
DoneWithCompletionOnStack, NULL, &completion);
grpc_exec_ctx_finish(&exec_ctx);
diff --git a/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc b/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
index f79db15a47..f109fe6251 100644
--- a/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
+++ b/test/cpp/microbenchmarks/bm_cq_multiple_threads.cc
@@ -78,7 +78,7 @@ static grpc_error* pollset_work(grpc_exec_ctx* exec_ctx, grpc_pollset* ps,
}
gpr_mu_unlock(&ps->mu);
- grpc_cq_begin_op(g_cq, g_tag);
+ GPR_ASSERT(grpc_cq_begin_op(g_cq, g_tag));
grpc_cq_end_op(exec_ctx, g_cq, g_tag, GRPC_ERROR_NONE, cq_done_cb, NULL,
(grpc_cq_completion*)gpr_malloc(sizeof(grpc_cq_completion)));
grpc_exec_ctx_flush(exec_ctx);
diff --git a/test/cpp/qps/server.h b/test/cpp/qps/server.h
index c0dac96d8b..df27a4368e 100644
--- a/test/cpp/qps/server.h
+++ b/test/cpp/qps/server.h
@@ -80,8 +80,11 @@ class Server {
return false;
}
payload->set_type(type);
- std::unique_ptr<char[]> body(new char[size]());
- payload->set_body(body.get(), size);
+ // Don't waste time creating a new payload of identical size.
+ if (payload->body().length() != (size_t)size) {
+ std::unique_ptr<char[]> body(new char[size]());
+ payload->set_body(body.get(), size);
+ }
return true;
}
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index b747da3a67..6e7f92717d 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1131,6 +1131,7 @@ src/core/lib/iomgr/load_file.c \
src/core/lib/iomgr/load_file.h \
src/core/lib/iomgr/lockfree_event.c \
src/core/lib/iomgr/lockfree_event.h \
+src/core/lib/iomgr/nameser.h \
src/core/lib/iomgr/network_status_tracker.c \
src/core/lib/iomgr/network_status_tracker.h \
src/core/lib/iomgr/polling_entity.c \
diff --git a/tools/internal_ci/helper_scripts/gen_report_index.sh b/tools/internal_ci/helper_scripts/gen_report_index.sh
new file mode 100755
index 0000000000..0af89c331c
--- /dev/null
+++ b/tools/internal_ci/helper_scripts/gen_report_index.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# Generates index.html that will contain links to various test results on kokoro.
+set -e
+
+# change to grpc repo root
+cd $(dirname $0)/../../..
+
+# Kororo URLs are in the form "grpc/job/macos/job/master/job/grpc_build_artifacts"
+KOKORO_JOB_PATH=$(echo "${KOKORO_JOB_NAME}" | sed "s|/|/job/|g")
+
+mkdir -p reports
+
+echo '<html><head></head><body>' > reports/kokoro_index.html
+echo '<h1>'${KOKORO_JOB_NAME}', build '#${KOKORO_BUILD_NUMBER}'</h1>' >> reports/kokoro_index.html
+echo '<h2><a href="https://kokoro.corp.google.com/job/'${KOKORO_JOB_PATH}'/'${KOKORO_BUILD_NUMBER}'/">Kokoro build dashboard (internal only)</a></h2>' >> reports/kokoro_index.html
+echo '<h2><a href="https://sponge.corp.google.com/invocation?id='${KOKORO_BUILD_ID}'&searchFor=">Test result dashboard (internal only)</a></h2>' >> reports/kokoro_index.html
+echo '<h2><a href="test_report.html">HTML test report (Not available yet)</a></h2>' >> reports/kokoro_index.html
+echo '<h2><a href="test_log.txt">Test log (Not available yet)</a></h2>' >> reports/kokoro_index.html
+echo '</body></html>' >> reports/kokoro_index.html
+
+echo 'Created reports/kokoro_index.html report index'
diff --git a/tools/internal_ci/helper_scripts/prepare_build_linux_rc b/tools/internal_ci/helper_scripts/prepare_build_linux_rc
index 7b7db19389..049db33ec3 100644
--- a/tools/internal_ci/helper_scripts/prepare_build_linux_rc
+++ b/tools/internal_ci/helper_scripts/prepare_build_linux_rc
@@ -15,6 +15,8 @@
# Source this rc script to prepare the environment for linux builds
+tools/internal_ci/helper_scripts/gen_report_index.sh
+
# Need to increase open files limit for c tests
ulimit -n 32768
diff --git a/tools/internal_ci/helper_scripts/prepare_build_macos_rc b/tools/internal_ci/helper_scripts/prepare_build_macos_rc
index 57463e6f6d..00105d4838 100644
--- a/tools/internal_ci/helper_scripts/prepare_build_macos_rc
+++ b/tools/internal_ci/helper_scripts/prepare_build_macos_rc
@@ -15,6 +15,8 @@
# Source this rc script to prepare the environment for macos builds
+tools/internal_ci/helper_scripts/gen_report_index.sh
+
sudo launchctl limit maxfiles unlimited unlimited
# show current maxfiles
@@ -25,6 +27,11 @@ ulimit -n 10000
# show current limits
ulimit -a
+# Add GCP credentials for BQ access
+# pip does not install google-api-python-client properly, so use easy_install
+sudo easy_install --upgrade google-api-python-client
+export GOOGLE_APPLICATION_CREDENTIALS=${KOKORO_GFILE_DIR}/GrpcTesting-d0eeee2db331.json
+gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS
# required to build protobuf
brew install gflags
diff --git a/tools/internal_ci/windows/grpc_portability_master.bat b/tools/internal_ci/helper_scripts/prepare_build_windows.bat
index cb6b1fe133..69e087e1db 100644
--- a/tools/internal_ci/windows/grpc_portability_master.bat
+++ b/tools/internal_ci/helper_scripts/prepare_build_windows.bat
@@ -16,13 +16,16 @@
@rem set path to python 2.7
set PATH=C:\tools\msys64\usr\bin;C:\Python27;%PATH%
-@rem enter repo root
-cd /d %~dp0\..\..\..
+bash tools/internal_ci/helper_scripts/gen_report_index.sh
-git submodule update --init
+@rem Update DNS settings to:
+@rem 1. allow resolving metadata.google.internal hostname
+@rem 2. make fetching default GCE credential by oauth2client work
+netsh interface ip set dns "Local Area Connection 8" static 169.254.169.254 primary
+netsh interface ip add dnsservers "Local Area Connection 8" 8.8.8.8 index=2
+netsh interface ip add dnsservers "Local Area Connection 8" 8.8.4.4 index=3
-python tools/run_tests/run_tests_matrix.py -f portability windows -j 1 --inner_jobs 8 --internal_ci || goto :error
-goto :EOF
+@rem Needed for big_query_utils
+python -m pip install google-api-python-client
-:error
-exit /b %errorlevel%
+git submodule update --init
diff --git a/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg b/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg
index ca547a0a4f..4a0badf43b 100644
--- a/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg
+++ b/tools/internal_ci/linux/grpc_basictests_c_cpp_dbg.cfg
@@ -20,6 +20,7 @@ timeout_mins: 240
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg b/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg
index 62f05cef2e..a2cfe021e1 100644
--- a/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg
+++ b/tools/internal_ci/linux/grpc_basictests_c_cpp_opt.cfg
@@ -20,6 +20,7 @@ timeout_mins: 240
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_basictests_multilang.cfg b/tools/internal_ci/linux/grpc_basictests_multilang.cfg
index be099d78c7..4433d14cd7 100644
--- a/tools/internal_ci/linux/grpc_basictests_multilang.cfg
+++ b/tools/internal_ci/linux/grpc_basictests_multilang.cfg
@@ -20,6 +20,7 @@ timeout_mins: 240
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_build_artifacts.cfg b/tools/internal_ci/linux/grpc_build_artifacts.cfg
index eb37b5b0cd..88fc6b7b35 100644
--- a/tools/internal_ci/linux/grpc_build_artifacts.cfg
+++ b/tools/internal_ci/linux/grpc_build_artifacts.cfg
@@ -20,6 +20,7 @@ timeout_mins: 120
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
regex: "github/grpc/artifacts/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_build_artifacts.sh b/tools/internal_ci/linux/grpc_build_artifacts.sh
index 3997a13087..985243e91b 100755
--- a/tools/internal_ci/linux/grpc_build_artifacts.sh
+++ b/tools/internal_ci/linux/grpc_build_artifacts.sh
@@ -26,4 +26,4 @@ set -e # rvm commands are very verbose
rvm --default use ruby-2.4.1
set -ex
-tools/run_tests/task_runner.py -f artifact linux
+tools/run_tests/task_runner.py -f artifact linux -j 6
diff --git a/tools/internal_ci/linux/grpc_interop_badserver_java.cfg b/tools/internal_ci/linux/grpc_interop_badserver_java.cfg
index 0aadb56c7c..dc2114273e 100644
--- a/tools/internal_ci/linux/grpc_interop_badserver_java.cfg
+++ b/tools/internal_ci/linux/grpc_interop_badserver_java.cfg
@@ -20,7 +20,7 @@ build_file: "grpc/tools/internal_ci/linux/grpc_interop_badserver_java.sh"
timeout_mins: 480
action {
define_artifacts {
- regex: "**/report.xml",
+ regex: "**/report.xml"
regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_interop_badserver_python.cfg b/tools/internal_ci/linux/grpc_interop_badserver_python.cfg
index 29c5c635f9..ec738fcf74 100644
--- a/tools/internal_ci/linux/grpc_interop_badserver_python.cfg
+++ b/tools/internal_ci/linux/grpc_interop_badserver_python.cfg
@@ -20,7 +20,7 @@ build_file: "grpc/tools/internal_ci/linux/grpc_interop_badserver_python.sh"
timeout_mins: 480
action {
define_artifacts {
- regex: "**/report.xml",
+ regex: "**/report.xml"
regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_interop_matrix.cfg b/tools/internal_ci/linux/grpc_interop_matrix.cfg
index 2fa3e8f897..a7fd479a73 100644
--- a/tools/internal_ci/linux/grpc_interop_matrix.cfg
+++ b/tools/internal_ci/linux/grpc_interop_matrix.cfg
@@ -21,5 +21,6 @@ timeout_mins: 60
action {
define_artifacts {
regex: "**/sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_interop_tocloud.cfg b/tools/internal_ci/linux/grpc_interop_tocloud.cfg
index 0c31b497af..c613f668d9 100644
--- a/tools/internal_ci/linux/grpc_interop_tocloud.cfg
+++ b/tools/internal_ci/linux/grpc_interop_tocloud.cfg
@@ -21,5 +21,6 @@ timeout_mins: 480
action {
define_artifacts {
regex: "**/sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_interop_toprod.cfg b/tools/internal_ci/linux/grpc_interop_toprod.cfg
index 18978b87e5..903480a3d1 100644
--- a/tools/internal_ci/linux/grpc_interop_toprod.cfg
+++ b/tools/internal_ci/linux/grpc_interop_toprod.cfg
@@ -21,6 +21,7 @@ timeout_mins: 60
action {
define_artifacts {
regex: "**/sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_portability.cfg b/tools/internal_ci/linux/grpc_portability.cfg
index c5bfd3bb40..8c120be6b9 100644
--- a/tools/internal_ci/linux/grpc_portability.cfg
+++ b/tools/internal_ci/linux/grpc_portability.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_portability_build_only.cfg b/tools/internal_ci/linux/grpc_portability_build_only.cfg
index fce914c612..501223c0c7 100644
--- a/tools/internal_ci/linux/grpc_portability_build_only.cfg
+++ b/tools/internal_ci/linux/grpc_portability_build_only.cfg
@@ -20,6 +20,7 @@ timeout_mins: 180
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_pull_request_sanity.cfg b/tools/internal_ci/linux/grpc_pull_request_sanity.cfg
index 6c76a929c0..b20d2ffba8 100644
--- a/tools/internal_ci/linux/grpc_pull_request_sanity.cfg
+++ b/tools/internal_ci/linux/grpc_pull_request_sanity.cfg
@@ -20,6 +20,7 @@ timeout_mins: 30
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/grpc_sanity.cfg b/tools/internal_ci/linux/grpc_sanity.cfg
index 8dfeda0d45..24e7984f3a 100644
--- a/tools/internal_ci/linux/grpc_sanity.cfg
+++ b/tools/internal_ci/linux/grpc_sanity.cfg
@@ -20,6 +20,7 @@ timeout_mins: 20
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_dbg.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_dbg.cfg
new file mode 100644
index 0000000000..dcc6265b34
--- /dev/null
+++ b/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_dbg.cfg
@@ -0,0 +1,30 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_run_tests_matrix.sh"
+timeout_mins: 240
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests linux corelang dbg --inner_jobs 16 -j 1 --internal_ci"
+}
diff --git a/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_opt.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_opt.cfg
new file mode 100644
index 0000000000..f60beaf15c
--- /dev/null
+++ b/tools/internal_ci/linux/pull_request/grpc_basictests_c_cpp_opt.cfg
@@ -0,0 +1,30 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/linux/grpc_run_tests_matrix.sh"
+timeout_mins: 240
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests linux corelang opt --inner_jobs 16 -j 1 --internal_ci"
+}
diff --git a/tools/internal_ci/linux/grpc_master.cfg b/tools/internal_ci/linux/pull_request/grpc_basictests_multilang.cfg
index 8bcc668ba9..7c16cf6a10 100644
--- a/tools/internal_ci/linux/grpc_master.cfg
+++ b/tools/internal_ci/linux/pull_request/grpc_basictests_multilang.cfg
@@ -20,10 +20,11 @@ timeout_mins: 240
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
env_vars {
key: "RUN_TESTS_FLAGS"
- value: "-f basictests linux --inner_jobs 16 -j 1 --internal_ci --bq_result_table aggregate_results"
+ value: "-f basictests linux multilang --inner_jobs 16 -j 2 --internal_ci"
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg
index c4beaacf6b..06a4372ce2 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_c_asan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg
index 0197966f32..f875327c1b 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_c_msan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg
index 243eb99fbb..6658a804d8 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_c_tsan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg
index 24c7bf8a4c..957a91ef2b 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_c_ubsan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg b/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg
index f12366cb0a..dbbfce90cb 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_cpp_asan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg b/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg
index ca807aed16..fb0cefa160 100644
--- a/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/grpc_cpp_tsan.cfg
@@ -20,6 +20,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg
index 98eb4d0139..649d93d0a1 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_asan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg
index e47762ca88..d5ba2031fc 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_msan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg
index c3803aff56..67d4356821 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_tsan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg
index 831cfb53ba..c162d1d1d0 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_c_ubsan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg
index c332443182..29f1fce568 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_asan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg
index 92cd93fcac..331f73b3c7 100644
--- a/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg
+++ b/tools/internal_ci/linux/sanitizer/pull_request/grpc_cpp_tsan.cfg
@@ -21,6 +21,7 @@ timeout_mins: 1440
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/macos/grpc_basictests.cfg b/tools/internal_ci/macos/grpc_basictests.cfg
new file mode 100644
index 0000000000..e10c2e36b2
--- /dev/null
+++ b/tools/internal_ci/macos/grpc_basictests.cfg
@@ -0,0 +1,31 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/macos/grpc_run_tests_matrix.sh"
+gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
+timeout_mins: 240
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests macos --internal_ci -j 2 --inner_jobs 4 --bq_result_table aggregate_results"
+}
diff --git a/tools/internal_ci/macos/grpc_build_artifacts.cfg b/tools/internal_ci/macos/grpc_build_artifacts.cfg
index 1999380947..4da61faed3 100644
--- a/tools/internal_ci/macos/grpc_build_artifacts.cfg
+++ b/tools/internal_ci/macos/grpc_build_artifacts.cfg
@@ -16,10 +16,12 @@
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/macos/grpc_build_artifacts.sh"
+gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
timeout_mins: 120
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
regex: "github/grpc/artifacts/**"
}
}
diff --git a/tools/internal_ci/macos/grpc_interop.cfg b/tools/internal_ci/macos/grpc_interop.cfg
index 25bac2f123..b4b1b15cb4 100644
--- a/tools/internal_ci/macos/grpc_interop.cfg
+++ b/tools/internal_ci/macos/grpc_interop.cfg
@@ -16,10 +16,11 @@
# Location of the continuous shell script in repository.
build_file: "grpc/tools/internal_ci/macos/grpc_interop.sh"
+gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
timeout_mins: 240
action {
define_artifacts {
- regex: "**/*sponge_log.xml",
+ regex: "**/*sponge_log.xml"
regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/macos/grpc_master.sh b/tools/internal_ci/macos/grpc_run_tests_matrix.sh
index c64666b2de..9a43e4869b 100755
--- a/tools/internal_ci/macos/grpc_master.sh
+++ b/tools/internal_ci/macos/grpc_run_tests_matrix.sh
@@ -20,7 +20,7 @@ cd $(dirname $0)/../../..
source tools/internal_ci/helper_scripts/prepare_build_macos_rc
-tools/run_tests/run_tests_matrix.py -f basictests macos --internal_ci -j 2 --inner_jobs 4 || FAILED="true"
+tools/run_tests/run_tests_matrix.py $RUN_TESTS_FLAGS || FAILED="true"
# kill port_server.py to prevent the build from hanging
ps aux | grep port_server\\.py | awk '{print $2}' | xargs kill -9
diff --git a/tools/internal_ci/macos/pull_request/grpc_basictests.cfg b/tools/internal_ci/macos/pull_request/grpc_basictests.cfg
new file mode 100644
index 0000000000..e297091560
--- /dev/null
+++ b/tools/internal_ci/macos/pull_request/grpc_basictests.cfg
@@ -0,0 +1,31 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/macos/grpc_run_tests_matrix.sh"
+gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
+timeout_mins: 240
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests macos --internal_ci -j 2 --inner_jobs 4"
+}
diff --git a/tools/internal_ci/macos/grpc_master.cfg b/tools/internal_ci/macos/pull_request/grpc_interop.cfg
index 1c34979d01..b4b1b15cb4 100644
--- a/tools/internal_ci/macos/grpc_master.cfg
+++ b/tools/internal_ci/macos/pull_request/grpc_interop.cfg
@@ -15,10 +15,12 @@
# Config file for the internal CI (in protobuf text format)
# Location of the continuous shell script in repository.
-build_file: "grpc/tools/internal_ci/macos/grpc_master.sh"
+build_file: "grpc/tools/internal_ci/macos/grpc_interop.sh"
+gfile_resources: "/bigstore/grpc-testing-secrets/gcp_credentials/GrpcTesting-d0eeee2db331.json"
timeout_mins: 240
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
diff --git a/tools/internal_ci/windows/grpc_basictests.cfg b/tools/internal_ci/windows/grpc_basictests.cfg
new file mode 100644
index 0000000000..396d29ef09
--- /dev/null
+++ b/tools/internal_ci/windows/grpc_basictests.cfg
@@ -0,0 +1,30 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
+timeout_mins: 360
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests windows -j 1 --inner_jobs 8 --internal_ci --bq_result_table aggregate_results"
+}
diff --git a/tools/internal_ci/windows/grpc_build_artifacts.bat b/tools/internal_ci/windows/grpc_build_artifacts.bat
index 8cfa2fb0be..29c876dd35 100644
--- a/tools/internal_ci/windows/grpc_build_artifacts.bat
+++ b/tools/internal_ci/windows/grpc_build_artifacts.bat
@@ -12,7 +12,7 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
-@rem Move python installation from _32bit to _32bits where they are expected python artifact builder
+@rem Move python installation from _32bit to _32bits where they are expected by python artifact builder
@rem TODO(jtattermusch): get rid of this hack
rename C:\Python27_32bit Python27_32bits
rename C:\Python34_32bit Python34_32bits
@@ -21,15 +21,10 @@ rename C:\Python36_32bit Python36_32bits
pacman -S --noconfirm mingw64/mingw-w64-x86_64-gcc mingw32/mingw-w64-i686-gcc
-@rem make sure msys binaries are preferred over cygwin binaries
-@rem set path to python 2.7
-set PATH=C:\tools\msys64\usr\bin;C:\Python27;%PATH%
-
-
@rem enter repo root
cd /d %~dp0\..\..\..
-git submodule update --init
+call tools/internal_ci/helper_scripts/prepare_build_windows.bat
python tools/run_tests/task_runner.py -f artifact windows || goto :error
goto :EOF
diff --git a/tools/internal_ci/windows/grpc_build_artifacts.cfg b/tools/internal_ci/windows/grpc_build_artifacts.cfg
index da359ca05a..38b0abd519 100644
--- a/tools/internal_ci/windows/grpc_build_artifacts.cfg
+++ b/tools/internal_ci/windows/grpc_build_artifacts.cfg
@@ -20,6 +20,7 @@ timeout_mins: 120
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
regex: "github/grpc/artifacts/**"
}
}
diff --git a/tools/internal_ci/windows/grpc_portability.cfg b/tools/internal_ci/windows/grpc_portability.cfg
new file mode 100644
index 0000000000..c395cb4a94
--- /dev/null
+++ b/tools/internal_ci/windows/grpc_portability.cfg
@@ -0,0 +1,30 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
+timeout_mins: 360
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f portability windows -j 1 --inner_jobs 8 --internal_ci"
+}
diff --git a/tools/internal_ci/windows/grpc_portability_master.cfg b/tools/internal_ci/windows/grpc_portability_master.cfg
index cb48d35de9..c395cb4a94 100644
--- a/tools/internal_ci/windows/grpc_portability_master.cfg
+++ b/tools/internal_ci/windows/grpc_portability_master.cfg
@@ -15,10 +15,16 @@
# Config file for the internal CI (in protobuf text format)
# Location of the continuous shell script in repository.
-build_file: "grpc/tools/internal_ci/windows/grpc_portability_master.bat"
+build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
timeout_mins: 360
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f portability windows -j 1 --inner_jobs 8 --internal_ci"
+}
diff --git a/tools/internal_ci/windows/grpc_master.bat b/tools/internal_ci/windows/grpc_run_tests_matrix.bat
index 3984b81075..08d834f8b0 100644
--- a/tools/internal_ci/windows/grpc_master.bat
+++ b/tools/internal_ci/windows/grpc_run_tests_matrix.bat
@@ -12,16 +12,12 @@
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
-@rem make sure msys binaries are preferred over cygwin binaries
-@rem set path to python 2.7
-set PATH=C:\tools\msys64\usr\bin;C:\Python27;%PATH%
-
@rem enter repo root
cd /d %~dp0\..\..\..
-git submodule update --init
+call tools/internal_ci/helper_scripts/prepare_build_windows.bat
-python tools/run_tests/run_tests_matrix.py -f basictests windows -j 1 --inner_jobs 8 --internal_ci || goto :error
+python tools/run_tests/run_tests_matrix.py %RUN_TESTS_FLAGS% || goto :error
goto :EOF
:error
diff --git a/tools/internal_ci/windows/grpc_master.cfg b/tools/internal_ci/windows/pull_request/grpc_basictests.cfg
index 80abea6c38..a116738651 100644
--- a/tools/internal_ci/windows/grpc_master.cfg
+++ b/tools/internal_ci/windows/pull_request/grpc_basictests.cfg
@@ -15,10 +15,16 @@
# Config file for the internal CI (in protobuf text format)
# Location of the continuous shell script in repository.
-build_file: "grpc/tools/internal_ci/windows/grpc_master.bat"
+build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
timeout_mins: 360
action {
define_artifacts {
regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
}
}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f basictests windows -j 1 --inner_jobs 8 --internal_ci"
+}
diff --git a/tools/internal_ci/windows/pull_request/grpc_portability.cfg b/tools/internal_ci/windows/pull_request/grpc_portability.cfg
new file mode 100644
index 0000000000..c395cb4a94
--- /dev/null
+++ b/tools/internal_ci/windows/pull_request/grpc_portability.cfg
@@ -0,0 +1,30 @@
+# Copyright 2017 gRPC authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Config file for the internal CI (in protobuf text format)
+
+# Location of the continuous shell script in repository.
+build_file: "grpc/tools/internal_ci/windows/grpc_run_tests_matrix.bat"
+timeout_mins: 360
+action {
+ define_artifacts {
+ regex: "**/*sponge_log.xml"
+ regex: "github/grpc/reports/**"
+ }
+}
+
+env_vars {
+ key: "RUN_TESTS_FLAGS"
+ value: "-f portability windows -j 1 --inner_jobs 8 --internal_ci"
+}
diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json
index 24e7ff2b7b..8d57ea2ede 100644
--- a/tools/run_tests/generated/sources_and_headers.json
+++ b/tools/run_tests/generated/sources_and_headers.json
@@ -174,6 +174,23 @@
"headers": [],
"is_filegroup": false,
"language": "c",
+ "name": "byte_stream_test",
+ "src": [
+ "test/core/transport/byte_stream_test.c"
+ ],
+ "third_party": false,
+ "type": "target"
+ },
+ {
+ "deps": [
+ "gpr",
+ "gpr_test_util",
+ "grpc",
+ "grpc_test_util"
+ ],
+ "headers": [],
+ "is_filegroup": false,
+ "language": "c",
"name": "census_context_test",
"src": [
"test/core/census/context_test.c"
@@ -7744,6 +7761,7 @@
"src/core/lib/iomgr/is_epollexclusive_available.h",
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/lockfree_event.h",
+ "src/core/lib/iomgr/nameser.h",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.h",
"src/core/lib/iomgr/pollset.h",
@@ -7909,6 +7927,7 @@
"src/core/lib/iomgr/load_file.h",
"src/core/lib/iomgr/lockfree_event.c",
"src/core/lib/iomgr/lockfree_event.h",
+ "src/core/lib/iomgr/nameser.h",
"src/core/lib/iomgr/network_status_tracker.c",
"src/core/lib/iomgr/network_status_tracker.h",
"src/core/lib/iomgr/polling_entity.c",
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index ebf30717d4..83781f941e 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -215,6 +215,28 @@
"flaky": false,
"gtest": false,
"language": "c",
+ "name": "byte_stream_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ]
+ },
+ {
+ "args": [],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "exclude_iomgrs": [],
+ "flaky": false,
+ "gtest": false,
+ "language": "c",
"name": "census_context_test",
"platforms": [
"linux",
diff --git a/tools/run_tests/performance/scenario_result_schema.json b/tools/run_tests/performance/scenario_result_schema.json
index 245861f8c2..d7e2e292a7 100644
--- a/tools/run_tests/performance/scenario_result_schema.json
+++ b/tools/run_tests/performance/scenario_result_schema.json
@@ -216,6 +216,16 @@
"name": "serverPollsPerRequest",
"type": "FLOAT",
"mode": "NULLABLE"
+ },
+ {
+ "name": "serverQueriesPerCpuSec",
+ "type": "FLOAT",
+ "mode": "NULLABLE"
+ },
+ {
+ "name": "clientQueriesPerCpuSec",
+ "type": "FLOAT",
+ "mode": "NULLABLE"
}
]
},
diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln
index 55de734b42..6f13039cac 100644
--- a/vsprojects/buildtests_c.sln
+++ b/vsprojects/buildtests_c.sln
@@ -118,6 +118,17 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bin_encoder_test", "vcxproj
{29D16885-7228-4C31-81ED-5F9187C7F2A9} = {29D16885-7228-4C31-81ED-5F9187C7F2A9}
EndProjectSection
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "byte_stream_test", "vcxproj\test\byte_stream_test\byte_stream_test.vcxproj", "{9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}"
+ ProjectSection(myProperties) = preProject
+ lib = "False"
+ EndProjectSection
+ ProjectSection(ProjectDependencies) = postProject
+ {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}") = "census_context_test", "vcxproj\test\census_context_test\census_context_test.vcxproj", "{5C1CFC2D-AF3C-D7CB-BA74-D267E91CBC73}"
ProjectSection(myProperties) = preProject
lib = "False"
@@ -1940,6 +1951,22 @@ Global
{D5C70922-D68E-0E9D-9988-995E0F9A79AE}.Release-DLL|Win32.Build.0 = Release|Win32
{D5C70922-D68E-0E9D-9988-995E0F9A79AE}.Release-DLL|x64.ActiveCfg = Release|x64
{D5C70922-D68E-0E9D-9988-995E0F9A79AE}.Release-DLL|x64.Build.0 = Release|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug|Win32.ActiveCfg = Debug|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug|x64.ActiveCfg = Debug|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release|Win32.ActiveCfg = Release|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release|x64.ActiveCfg = Release|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug|Win32.Build.0 = Debug|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug|x64.Build.0 = Debug|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release|Win32.Build.0 = Release|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release|x64.Build.0 = Release|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug-DLL|Win32.ActiveCfg = Debug|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug-DLL|Win32.Build.0 = Debug|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug-DLL|x64.ActiveCfg = Debug|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Debug-DLL|x64.Build.0 = Debug|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release-DLL|Win32.ActiveCfg = Release|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release-DLL|Win32.Build.0 = Release|Win32
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release-DLL|x64.ActiveCfg = Release|x64
+ {9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}.Release-DLL|x64.Build.0 = Release|x64
{5C1CFC2D-AF3C-D7CB-BA74-D267E91CBC73}.Debug|Win32.ActiveCfg = Debug|Win32
{5C1CFC2D-AF3C-D7CB-BA74-D267E91CBC73}.Debug|x64.ActiveCfg = Debug|x64
{5C1CFC2D-AF3C-D7CB-BA74-D267E91CBC73}.Release|Win32.ActiveCfg = Release|Win32
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
index 57c0ac7bc4..ff2e26e0af 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -338,6 +338,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\is_epollexclusive_available.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h" />
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
index e9bb52defa..70824a51b8 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -971,6 +971,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h">
+ <Filter>src\core\lib\iomgr</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
diff --git a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj
index 64bf54e557..13d56d58a8 100644
--- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj
+++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj
@@ -233,6 +233,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\is_epollexclusive_available.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h" />
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 35fd87a4c5..fb7197fa95 100644
--- a/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_test_util/grpc_test_util.vcxproj.filters
@@ -695,6 +695,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h">
+ <Filter>src\core\lib\iomgr</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
index 4ed59780a4..b9e0c896e1 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -328,6 +328,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\is_epollexclusive_available.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\load_file.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\polling_entity.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\pollset.h" />
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
index 2c3319beae..ed3384d5d2 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -878,6 +878,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\lockfree_event.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\nameser.h">
+ <Filter>src\core\lib\iomgr</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\lib\iomgr\network_status_tracker.h">
<Filter>src\core\lib\iomgr</Filter>
</ClInclude>
diff --git a/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj b/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj
new file mode 100644
index 0000000000..5d656471b1
--- /dev/null
+++ b/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj
@@ -0,0 +1,199 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" />
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{9AEDA345-E3E8-BFE9-11BF-64949EF41C9C}</ProjectGuid>
+ <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
+ <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration">
+ <PlatformToolset>v100</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration">
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration">
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration">
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(SolutionDir)\..\vsprojects\global.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\openssl.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\zlib.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <TargetName>byte_stream_test</TargetName>
+ <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
+ <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
+ <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
+ <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <TargetName>byte_stream_test</TargetName>
+ <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
+ <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
+ <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
+ <Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemGroup>
+ <ClCompile Include="$(SolutionDir)\..\test\core\transport\byte_stream_test.c">
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util\grpc_test_util.vcxproj">
+ <Project>{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
+ <Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr_test_util\gpr_test_util.vcxproj">
+ <Project>{EAB0A629-17A9-44DB-B5FF-E91A721FE037}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
+ <Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+ </ImportGroup>
+ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+ <PropertyGroup>
+ <ErrorText>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}.</ErrorText>
+ </PropertyGroup>
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" />
+ </Target>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj.filters b/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj.filters
new file mode 100644
index 0000000000..65e35b7429
--- /dev/null
+++ b/vsprojects/vcxproj/test/byte_stream_test/byte_stream_test.vcxproj.filters
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="$(SolutionDir)\..\test\core\transport\byte_stream_test.c">
+ <Filter>test\core\transport</Filter>
+ </ClCompile>
+ </ItemGroup>
+
+ <ItemGroup>
+ <Filter Include="test">
+ <UniqueIdentifier>{f172d292-4ad6-342a-f27a-096c06d43a31}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="test\core">
+ <UniqueIdentifier>{d7f690de-dfe0-56fc-ff3b-38eec3931699}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="test\core\transport">
+ <UniqueIdentifier>{f78f56ef-47df-c99d-18f0-86277f7013f3}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+</Project>
+