From 53bfe69f707e3729cd5845091a1282771b7e45ee Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Thu, 4 Jan 2018 16:39:08 -0800 Subject: Connected subchannel refactoring --- BUILD | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'BUILD') diff --git a/BUILD b/BUILD index dba6592f17..290f4c5621 100644 --- a/BUILD +++ b/BUILD @@ -544,24 +544,24 @@ grpc_cc_library( grpc_cc_library( name = "debug_location", - public_hdrs = ["src/core/lib/support/debug_location.h"], language = "c++", + public_hdrs = ["src/core/lib/support/debug_location.h"], ) grpc_cc_library( name = "ref_counted", - public_hdrs = ["src/core/lib/support/ref_counted.h"], language = "c++", + public_hdrs = ["src/core/lib/support/ref_counted.h"], deps = [ - "grpc_trace", "debug_location", + "grpc_trace", ], ) grpc_cc_library( name = "ref_counted_ptr", - public_hdrs = ["src/core/lib/support/ref_counted_ptr.h"], language = "c++", + public_hdrs = ["src/core/lib/support/ref_counted_ptr.h"], ) grpc_cc_library( @@ -919,6 +919,7 @@ grpc_cc_library( deps = [ "grpc_base", "grpc_deadline_filter", + "ref_counted", ], ) -- cgit v1.2.3 From 9809ce38e9f79b4e9a0b1ec1c076cce0beee1e98 Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Tue, 19 Dec 2017 09:09:52 -0800 Subject: Use appropriate preprocessor guards to allow building without exceptions --- BUILD | 18 ++++++++++++++---- bazel/grpc_build_system.bzl | 4 ++++ include/grpc++/impl/codegen/method_handler_impl.h | 10 +++++++--- include/grpc/impl/codegen/port_platform.h | 15 +++++++++++++++ test/cpp/end2end/exception_test.cc | 4 ++++ 5 files changed, 44 insertions(+), 7 deletions(-) (limited to 'BUILD') diff --git a/BUILD b/BUILD index dba6592f17..ebd198275e 100644 --- a/BUILD +++ b/BUILD @@ -38,6 +38,16 @@ config_setting( values = {"define": "grpc_no_ares=true"}, ) +config_setting( + name = "grpc_allow_exceptions", + values = {"define": "GRPC_ALLOW_EXCEPTIONS=1"}, +) + +config_setting( + name = "grpc_disallow_exceptions", + values = {"define": "GRPC_ALLOW_EXCEPTIONS=0"}, +) + config_setting( name = "remote_execution", values = {"define": "GRPC_PORT_ISOLATED_RUNTIME=1"}, @@ -544,24 +554,24 @@ grpc_cc_library( grpc_cc_library( name = "debug_location", - public_hdrs = ["src/core/lib/support/debug_location.h"], language = "c++", + public_hdrs = ["src/core/lib/support/debug_location.h"], ) grpc_cc_library( name = "ref_counted", - public_hdrs = ["src/core/lib/support/ref_counted.h"], language = "c++", + public_hdrs = ["src/core/lib/support/ref_counted.h"], deps = [ - "grpc_trace", "debug_location", + "grpc_trace", ], ) grpc_cc_library( name = "ref_counted_ptr", - public_hdrs = ["src/core/lib/support/ref_counted_ptr.h"], language = "c++", + public_hdrs = ["src/core/lib/support/ref_counted_ptr.h"], ) grpc_cc_library( diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl index d146ca9c2c..d61eced2d9 100644 --- a/bazel/grpc_build_system.bzl +++ b/bazel/grpc_build_system.bzl @@ -60,6 +60,10 @@ def grpc_cc_library(name, srcs = [], public_hdrs = [], hdrs = [], defines = select({"//:grpc_no_ares": ["GRPC_ARES=0"], "//conditions:default": [],}) + select({"//:remote_execution": ["GRPC_PORT_ISOLATED_RUNTIME=1"], + "//conditions:default": [],} + + select({"//:grpc_allow_exceptions": ["GRPC_ALLOW_EXCEPTIONS=1"], + "//:grpc_disallow_exceptions": + ["GRPC_ALLOW_EXCEPTIONS=0"], "//conditions:default": [],}), hdrs = _maybe_update_cc_library_hdrs(hdrs + public_hdrs), deps = deps + _get_external_deps(external_deps), diff --git a/include/grpc++/impl/codegen/method_handler_impl.h b/include/grpc++/impl/codegen/method_handler_impl.h index b72dceb1b4..41c287231f 100644 --- a/include/grpc++/impl/codegen/method_handler_impl.h +++ b/include/grpc++/impl/codegen/method_handler_impl.h @@ -35,15 +35,19 @@ namespace internal { // so this process doesn't require additional overhead in the common case. // Additionally, we don't need to return if we caught an exception or not; // the handling is the same in either case. -template -Status CatchingFunctionHandler(F&& callable) { +template +Status CatchingFunctionHandler(Callable&& handler) { +#if GRPC_ALLOW_EXCEPTIONS try { - return callable(); + return handler(); } catch (const std::exception& e) { return Status(StatusCode::UNKNOWN, e.what()); } catch (...) { return Status(StatusCode::UNKNOWN, "Exception in method handler"); } +#else + return handler(); +#endif } /// A wrapper class of an application provided rpc method handler. diff --git a/include/grpc/impl/codegen/port_platform.h b/include/grpc/impl/codegen/port_platform.h index e6bee73ef1..becb16b5b8 100644 --- a/include/grpc/impl/codegen/port_platform.h +++ b/include/grpc/impl/codegen/port_platform.h @@ -477,6 +477,21 @@ typedef unsigned __int64 uint64_t; #endif /* GPR_ATTRIBUTE_NO_TSAN (2) */ #endif /* GPR_ATTRIBUTE_NO_TSAN (1) */ +/* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */ +#ifndef GRPC_ALLOW_EXCEPTIONS +/* If not already set, set to 1 on Windows (style guide standard) but to + * 0 on non-Windows platforms unless the compiler defines __EXCEPTIONS */ +#ifdef GPR_WINDOWS +#define GRPC_ALLOW_EXCEPTIONS 1 +#else +#ifdef __EXCEPTIONS +#define GRPC_ALLOW_EXCEPTIONS 1 +#else +#define GRPC_ALLOW_EXCEPTIONS 0 +#endif +#endif +#endif + #ifndef __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS #endif diff --git a/test/cpp/end2end/exception_test.cc b/test/cpp/end2end/exception_test.cc index 6545ffa530..7e0d5c7951 100644 --- a/test/cpp/end2end/exception_test.cc +++ b/test/cpp/end2end/exception_test.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/util/test_config.h" @@ -35,6 +36,7 @@ namespace testing { const char* kErrorMessage = "This service caused an exception"; +#if GRPC_ALLOW_EXCEPTIONS class ExceptingServiceImpl : public ::grpc::testing::EchoTestService::Service { public: Status Echo(ServerContext* server_context, const EchoRequest* request, @@ -106,6 +108,8 @@ TEST_F(ExceptionTest, RequestStream) { EXPECT_EQ(s.error_message(), kErrorMessage); } +#endif + } // namespace testing } // namespace grpc -- cgit v1.2.3 From 1d91362f8124751ecfc1929df207006cabb41dae Mon Sep 17 00:00:00 2001 From: Vijay Pai Date: Wed, 10 Jan 2018 15:59:05 -0800 Subject: exec_ctx_fwd.h should never have been in public headers --- BUILD | 1 - CMakeLists.txt | 10 --------- Makefile | 10 --------- build.yaml | 1 - gRPC-Core.podspec | 1 - grpc.gemspec | 1 - include/grpc/impl/codegen/exec_ctx_fwd.h | 26 ---------------------- include/grpc/impl/codegen/grpc_types.h | 1 - include/grpc/impl/codegen/slice.h | 1 - include/grpc/module.modulemap | 1 - package.xml | 1 - src/core/lib/iomgr/closure.h | 1 - src/core/lib/iomgr/iomgr.h | 1 - test/core/surface/public_headers_must_be_c89.c | 1 - tools/doxygen/Doxyfile.c++ | 1 - tools/doxygen/Doxyfile.c++.internal | 1 - tools/doxygen/Doxyfile.core | 1 - tools/doxygen/Doxyfile.core.internal | 1 - tools/run_tests/generated/sources_and_headers.json | 2 -- 19 files changed, 63 deletions(-) delete mode 100644 include/grpc/impl/codegen/exec_ctx_fwd.h (limited to 'BUILD') diff --git a/BUILD b/BUILD index dba6592f17..804c6cee02 100644 --- a/BUILD +++ b/BUILD @@ -1006,7 +1006,6 @@ grpc_cc_library( "include/grpc/impl/codegen/byte_buffer_reader.h", "include/grpc/impl/codegen/compression_types.h", "include/grpc/impl/codegen/connectivity_state.h", - "include/grpc/impl/codegen/exec_ctx_fwd.h", "include/grpc/impl/codegen/grpc_types.h", "include/grpc/impl/codegen/propagation_bits.h", "include/grpc/impl/codegen/status.h", diff --git a/CMakeLists.txt b/CMakeLists.txt index eed1205268..fa020e009d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1080,7 +1080,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -1394,7 +1393,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -1680,7 +1678,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -1950,7 +1947,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -2239,7 +2235,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -2552,7 +2547,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -3038,7 +3032,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -3438,7 +3431,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -3579,7 +3571,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h @@ -3784,7 +3775,6 @@ foreach(_hdr include/grpc/impl/codegen/byte_buffer_reader.h include/grpc/impl/codegen/compression_types.h include/grpc/impl/codegen/connectivity_state.h - include/grpc/impl/codegen/exec_ctx_fwd.h include/grpc/impl/codegen/grpc_types.h include/grpc/impl/codegen/propagation_bits.h include/grpc/impl/codegen/slice.h diff --git a/Makefile b/Makefile index 38b40804d6..10c6530313 100644 --- a/Makefile +++ b/Makefile @@ -3226,7 +3226,6 @@ PUBLIC_HEADERS_C += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -3540,7 +3539,6 @@ PUBLIC_HEADERS_C += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -3827,7 +3825,6 @@ PUBLIC_HEADERS_C += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -4088,7 +4085,6 @@ PUBLIC_HEADERS_C += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -4354,7 +4350,6 @@ PUBLIC_HEADERS_C += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -4646,7 +4641,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -5133,7 +5127,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -5526,7 +5519,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -5644,7 +5636,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ @@ -5854,7 +5845,6 @@ PUBLIC_HEADERS_CXX += \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ - include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/grpc_types.h \ include/grpc/impl/codegen/propagation_bits.h \ include/grpc/impl/codegen/slice.h \ diff --git a/build.yaml b/build.yaml index fef7d6189f..9aff5585e0 100644 --- a/build.yaml +++ b/build.yaml @@ -485,7 +485,6 @@ filegroups: - include/grpc/impl/codegen/byte_buffer_reader.h - include/grpc/impl/codegen/compression_types.h - include/grpc/impl/codegen/connectivity_state.h - - include/grpc/impl/codegen/exec_ctx_fwd.h - include/grpc/impl/codegen/grpc_types.h - include/grpc/impl/codegen/propagation_bits.h - include/grpc/impl/codegen/slice.h diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index c127660dd5..c007348c81 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -152,7 +152,6 @@ Pod::Spec.new do |s| 'include/grpc/impl/codegen/byte_buffer_reader.h', 'include/grpc/impl/codegen/compression_types.h', 'include/grpc/impl/codegen/connectivity_state.h', - 'include/grpc/impl/codegen/exec_ctx_fwd.h', 'include/grpc/impl/codegen/grpc_types.h', 'include/grpc/impl/codegen/propagation_bits.h', 'include/grpc/impl/codegen/slice.h', diff --git a/grpc.gemspec b/grpc.gemspec index d185995261..c7302785c7 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -149,7 +149,6 @@ Gem::Specification.new do |s| s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h ) s.files += %w( include/grpc/impl/codegen/compression_types.h ) s.files += %w( include/grpc/impl/codegen/connectivity_state.h ) - s.files += %w( include/grpc/impl/codegen/exec_ctx_fwd.h ) s.files += %w( include/grpc/impl/codegen/grpc_types.h ) s.files += %w( include/grpc/impl/codegen/propagation_bits.h ) s.files += %w( include/grpc/impl/codegen/slice.h ) diff --git a/include/grpc/impl/codegen/exec_ctx_fwd.h b/include/grpc/impl/codegen/exec_ctx_fwd.h deleted file mode 100644 index 005ff14e7e..0000000000 --- a/include/grpc/impl/codegen/exec_ctx_fwd.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * - * Copyright 2016 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_IMPL_CODEGEN_EXEC_CTX_FWD_H -#define GRPC_IMPL_CODEGEN_EXEC_CTX_FWD_H - -/* forward declaration for exec_ctx.h */ -struct grpc_exec_ctx; -typedef struct grpc_exec_ctx grpc_exec_ctx; - -#endif /* GRPC_IMPL_CODEGEN_EXEC_CTX_FWD_H */ diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index fcbc8ac5a1..d481a70ab9 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -22,7 +22,6 @@ #include #include -#include #include #include #include diff --git a/include/grpc/impl/codegen/slice.h b/include/grpc/impl/codegen/slice.h index ad026b685e..a3cd1f1bbe 100644 --- a/include/grpc/impl/codegen/slice.h +++ b/include/grpc/impl/codegen/slice.h @@ -23,7 +23,6 @@ #include -#include #include typedef struct grpc_slice grpc_slice; diff --git a/include/grpc/module.modulemap b/include/grpc/module.modulemap index 67136cba8a..da95515d8e 100644 --- a/include/grpc/module.modulemap +++ b/include/grpc/module.modulemap @@ -30,7 +30,6 @@ framework module grpc { header "impl/codegen/byte_buffer_reader.h" header "impl/codegen/compression_types.h" header "impl/codegen/connectivity_state.h" - header "impl/codegen/exec_ctx_fwd.h" header "impl/codegen/grpc_types.h" header "impl/codegen/propagation_bits.h" header "impl/codegen/slice.h" diff --git a/package.xml b/package.xml index b4d8c88693..adc98330de 100644 --- a/package.xml +++ b/package.xml @@ -161,7 +161,6 @@ - diff --git a/src/core/lib/iomgr/closure.h b/src/core/lib/iomgr/closure.h index 88af76006a..4c58c0e4bf 100644 --- a/src/core/lib/iomgr/closure.h +++ b/src/core/lib/iomgr/closure.h @@ -22,7 +22,6 @@ #include #include -#include #include #include #include diff --git a/src/core/lib/iomgr/iomgr.h b/src/core/lib/iomgr/iomgr.h index 3f238c660a..c7cde7ea59 100644 --- a/src/core/lib/iomgr/iomgr.h +++ b/src/core/lib/iomgr/iomgr.h @@ -19,7 +19,6 @@ #ifndef GRPC_CORE_LIB_IOMGR_IOMGR_H #define GRPC_CORE_LIB_IOMGR_IOMGR_H -#include #include "src/core/lib/iomgr/port.h" /** Initializes the iomgr. */ diff --git a/test/core/surface/public_headers_must_be_c89.c b/test/core/surface/public_headers_must_be_c89.c index 8d2384ba61..7fd36a241a 100644 --- a/test/core/surface/public_headers_must_be_c89.c +++ b/test/core/surface/public_headers_must_be_c89.c @@ -29,7 +29,6 @@ #include #include #include -#include #include #include #include diff --git a/tools/doxygen/Doxyfile.c++ b/tools/doxygen/Doxyfile.c++ index e62278cb9f..5bdbcd71f5 100644 --- a/tools/doxygen/Doxyfile.c++ +++ b/tools/doxygen/Doxyfile.c++ @@ -887,7 +887,6 @@ include/grpc/impl/codegen/byte_buffer.h \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ -include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/gpr_slice.h \ include/grpc/impl/codegen/gpr_types.h \ diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index d09b325c97..b57674ba8e 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -888,7 +888,6 @@ include/grpc/impl/codegen/byte_buffer.h \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ -include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/gpr_slice.h \ include/grpc/impl/codegen/gpr_types.h \ diff --git a/tools/doxygen/Doxyfile.core b/tools/doxygen/Doxyfile.core index 6ce9041747..916d3b1e49 100644 --- a/tools/doxygen/Doxyfile.core +++ b/tools/doxygen/Doxyfile.core @@ -818,7 +818,6 @@ include/grpc/impl/codegen/byte_buffer.h \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ -include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/gpr_slice.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 1aff0075a6..e41123abf6 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -818,7 +818,6 @@ include/grpc/impl/codegen/byte_buffer.h \ include/grpc/impl/codegen/byte_buffer_reader.h \ include/grpc/impl/codegen/compression_types.h \ include/grpc/impl/codegen/connectivity_state.h \ -include/grpc/impl/codegen/exec_ctx_fwd.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/fork.h \ include/grpc/impl/codegen/gpr_slice.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index d432bd0e53..f7898a90a9 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -8505,7 +8505,6 @@ "include/grpc/impl/codegen/byte_buffer_reader.h", "include/grpc/impl/codegen/compression_types.h", "include/grpc/impl/codegen/connectivity_state.h", - "include/grpc/impl/codegen/exec_ctx_fwd.h", "include/grpc/impl/codegen/grpc_types.h", "include/grpc/impl/codegen/propagation_bits.h", "include/grpc/impl/codegen/slice.h", @@ -8519,7 +8518,6 @@ "include/grpc/impl/codegen/byte_buffer_reader.h", "include/grpc/impl/codegen/compression_types.h", "include/grpc/impl/codegen/connectivity_state.h", - "include/grpc/impl/codegen/exec_ctx_fwd.h", "include/grpc/impl/codegen/grpc_types.h", "include/grpc/impl/codegen/propagation_bits.h", "include/grpc/impl/codegen/slice.h", -- cgit v1.2.3 From 324703db51b43e150d9d8ffbcceb9d2096e26a9f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 11 Jan 2018 07:41:31 -0800 Subject: Fix existing ref counting classes and add new ones. --- BUILD | 10 ++ CMakeLists.txt | 40 +++++ Makefile | 48 ++++++ build.yaml | 15 ++ gRPC-Core.podspec | 2 + grpc.gemspec | 1 + package.xml | 1 + src/core/lib/support/abstract.h | 5 + src/core/lib/support/orphanable.h | 166 +++++++++++++++++++++ src/core/lib/support/ref_counted.h | 13 +- test/core/support/BUILD | 13 ++ test/core/support/orphanable_test.cc | 114 ++++++++++++++ test/core/support/ref_counted_test.cc | 4 +- tools/doxygen/Doxyfile.c++.internal | 1 + tools/doxygen/Doxyfile.core.internal | 1 + tools/run_tests/generated/sources_and_headers.json | 21 +++ tools/run_tests/generated/tests.json | 24 +++ 17 files changed, 477 insertions(+), 2 deletions(-) create mode 100644 src/core/lib/support/orphanable.h create mode 100644 test/core/support/orphanable_test.cc (limited to 'BUILD') diff --git a/BUILD b/BUILD index 804c6cee02..f478652df2 100644 --- a/BUILD +++ b/BUILD @@ -548,6 +548,16 @@ grpc_cc_library( language = "c++", ) +grpc_cc_library( + name = "orphanable", + public_hdrs = ["src/core/lib/support/orphanable.h"], + language = "c++", + deps = [ + "grpc_trace", + "debug_location", + ], +) + grpc_cc_library( name = "ref_counted", public_hdrs = ["src/core/lib/support/ref_counted.h"], diff --git a/CMakeLists.txt b/CMakeLists.txt index 78ccfb2132..863c192a87 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -558,6 +558,7 @@ add_dependencies(buildtests_cxx memory_test) add_dependencies(buildtests_cxx metrics_client) add_dependencies(buildtests_cxx mock_test) add_dependencies(buildtests_cxx noop-benchmark) +add_dependencies(buildtests_cxx orphanable_test) add_dependencies(buildtests_cxx proto_server_reflection_test) add_dependencies(buildtests_cxx proto_utils_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -11328,6 +11329,45 @@ target_link_libraries(noop-benchmark endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) +add_executable(orphanable_test + test/core/support/orphanable_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + + +target_include_directories(orphanable_test + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${_gRPC_SSL_INCLUDE_DIR} + PRIVATE ${PROTOBUF_ROOT_DIR}/src + PRIVATE ${BENCHMARK_ROOT_DIR}/include + PRIVATE ${ZLIB_ROOT_DIR} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/zlib + PRIVATE ${CARES_INCLUDE_DIR} + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/cares/cares + PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/third_party/gflags/include + PRIVATE third_party/googletest/googletest/include + PRIVATE third_party/googletest/googletest + PRIVATE third_party/googletest/googlemock/include + PRIVATE third_party/googletest/googlemock + PRIVATE ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(orphanable_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr_test_util + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) + add_executable(proto_server_reflection_test test/cpp/end2end/proto_server_reflection_test.cc third_party/googletest/googletest/src/gtest-all.cc diff --git a/Makefile b/Makefile index f50163efdc..9e60130f67 100644 --- a/Makefile +++ b/Makefile @@ -1154,6 +1154,7 @@ memory_test: $(BINDIR)/$(CONFIG)/memory_test metrics_client: $(BINDIR)/$(CONFIG)/metrics_client mock_test: $(BINDIR)/$(CONFIG)/mock_test noop-benchmark: $(BINDIR)/$(CONFIG)/noop-benchmark +orphanable_test: $(BINDIR)/$(CONFIG)/orphanable_test proto_server_reflection_test: $(BINDIR)/$(CONFIG)/proto_server_reflection_test proto_utils_test: $(BINDIR)/$(CONFIG)/proto_utils_test qps_interarrival_test: $(BINDIR)/$(CONFIG)/qps_interarrival_test @@ -1595,6 +1596,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/metrics_client \ $(BINDIR)/$(CONFIG)/mock_test \ $(BINDIR)/$(CONFIG)/noop-benchmark \ + $(BINDIR)/$(CONFIG)/orphanable_test \ $(BINDIR)/$(CONFIG)/proto_server_reflection_test \ $(BINDIR)/$(CONFIG)/proto_utils_test \ $(BINDIR)/$(CONFIG)/qps_interarrival_test \ @@ -1725,6 +1727,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/metrics_client \ $(BINDIR)/$(CONFIG)/mock_test \ $(BINDIR)/$(CONFIG)/noop-benchmark \ + $(BINDIR)/$(CONFIG)/orphanable_test \ $(BINDIR)/$(CONFIG)/proto_server_reflection_test \ $(BINDIR)/$(CONFIG)/proto_utils_test \ $(BINDIR)/$(CONFIG)/qps_interarrival_test \ @@ -2132,6 +2135,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/mock_test || ( echo test mock_test failed ; exit 1 ) $(E) "[RUN] Testing noop-benchmark" $(Q) $(BINDIR)/$(CONFIG)/noop-benchmark || ( echo test noop-benchmark failed ; exit 1 ) + $(E) "[RUN] Testing orphanable_test" + $(Q) $(BINDIR)/$(CONFIG)/orphanable_test || ( echo test orphanable_test failed ; exit 1 ) $(E) "[RUN] Testing proto_server_reflection_test" $(Q) $(BINDIR)/$(CONFIG)/proto_server_reflection_test || ( echo test proto_server_reflection_test failed ; exit 1 ) $(E) "[RUN] Testing proto_utils_test" @@ -16088,6 +16093,49 @@ endif endif +ORPHANABLE_TEST_SRC = \ + test/core/support/orphanable_test.cc \ + +ORPHANABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ORPHANABLE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/orphanable_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/orphanable_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/orphanable_test: $(PROTOBUF_DEP) $(ORPHANABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(ORPHANABLE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/orphanable_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/support/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_orphanable_test: $(ORPHANABLE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(ORPHANABLE_TEST_OBJS:.o=.dep) +endif +endif + + PROTO_SERVER_REFLECTION_TEST_SRC = \ test/cpp/end2end/proto_server_reflection_test.cc \ diff --git a/build.yaml b/build.yaml index db2ff8828b..8a34ade959 100644 --- a/build.yaml +++ b/build.yaml @@ -397,6 +397,7 @@ filegroups: - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_string_helpers.h - src/core/lib/support/debug_location.h + - src/core/lib/support/orphanable.h - src/core/lib/support/ref_counted.h - src/core/lib/support/ref_counted_ptr.h - src/core/lib/support/vector.h @@ -4390,6 +4391,20 @@ targets: deps: - benchmark defaults: benchmark +- name: orphanable_test + gtest: true + build: test + language: c++ + src: + - test/core/support/orphanable_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr_test_util + - gpr + uses: + - grpc++_test - name: proto_server_reflection_test gtest: true build: test diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 358fad3d98..d064ac80ae 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -420,6 +420,7 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_string_helpers.h', 'src/core/lib/support/debug_location.h', + 'src/core/lib/support/orphanable.h', 'src/core/lib/support/ref_counted.h', 'src/core/lib/support/ref_counted_ptr.h', 'src/core/lib/support/vector.h', @@ -901,6 +902,7 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_string_helpers.h', 'src/core/lib/support/debug_location.h', + 'src/core/lib/support/orphanable.h', 'src/core/lib/support/ref_counted.h', 'src/core/lib/support/ref_counted_ptr.h', 'src/core/lib/support/vector.h', diff --git a/grpc.gemspec b/grpc.gemspec index 7547bc85de..f8afaa5803 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -346,6 +346,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/slice/slice_internal.h ) s.files += %w( src/core/lib/slice/slice_string_helpers.h ) s.files += %w( src/core/lib/support/debug_location.h ) + s.files += %w( src/core/lib/support/orphanable.h ) s.files += %w( src/core/lib/support/ref_counted.h ) s.files += %w( src/core/lib/support/ref_counted_ptr.h ) s.files += %w( src/core/lib/support/vector.h ) diff --git a/package.xml b/package.xml index ff3d0797ab..8c590348b6 100644 --- a/package.xml +++ b/package.xml @@ -358,6 +358,7 @@ + diff --git a/src/core/lib/support/abstract.h b/src/core/lib/support/abstract.h index 5498769a7d..1dffa30128 100644 --- a/src/core/lib/support/abstract.h +++ b/src/core/lib/support/abstract.h @@ -26,4 +26,9 @@ #define GRPC_ABSTRACT_BASE_CLASS \ static void operator delete(void* p) { abort(); } +// gRPC currently can't depend on libstdc++, so we can't use "= 0" for +// pure virtual methods. Instead, we use this macro. +#define GRPC_ABSTRACT \ + { GPR_ASSERT(false); } + #endif /* GRPC_CORE_LIB_SUPPORT_ABSTRACT_H */ diff --git a/src/core/lib/support/orphanable.h b/src/core/lib/support/orphanable.h new file mode 100644 index 0000000000..63eda2e08b --- /dev/null +++ b/src/core/lib/support/orphanable.h @@ -0,0 +1,166 @@ +/* + * + * 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_SUPPORT_ORPHANABLE_H +#define GRPC_CORE_LIB_SUPPORT_ORPHANABLE_H + +#include +#include + +#include + +#include "src/core/lib/debug/trace.h" +#include "src/core/lib/support/abstract.h" +#include "src/core/lib/support/debug_location.h" +#include "src/core/lib/support/memory.h" + +namespace grpc_core { + +// A base class for orphanable objects. +class Orphanable { + public: + // Gives up ownership of the object. The implementation must arrange + // to destroy the object without further interaction from the caller. + virtual void Orphan() GRPC_ABSTRACT; + + // Not copyable or movable. + Orphanable(const Orphanable&) = delete; + Orphanable& operator=(const Orphanable&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + Orphanable() {} + virtual ~Orphanable() {} +}; + +template +class OrphanableDelete { + public: + void operator()(T* p) { p->Orphan(); } +}; + +template > +using OrphanablePtr = std::unique_ptr; + +template +inline OrphanablePtr MakeOrphanable(Args&&... args) { + return OrphanablePtr(New(std::forward(args)...)); +} + +// A type of Orphanable with internal ref-counting. +class InternallyRefCounted : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCounted(const InternallyRefCounted&) = delete; + InternallyRefCounted& operator=(const InternallyRefCounted&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + InternallyRefCounted() { gpr_ref_init(&refs_, 1); } + virtual ~InternallyRefCounted() {} + + void Ref() { gpr_ref(&refs_); } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + private: + gpr_refcount refs_; +}; + +// An alternative version of the InternallyRefCounted base class that +// supports tracing. This is intended to be used in cases where the +// object will be handled both by idiomatic C++ code using smart +// pointers and legacy code that is manually calling Ref() and Unref(). +// Once all of our code is converted to idiomatic C++, we may be able to +// eliminate this class. +class InternallyRefCountedWithTracing : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCountedWithTracing(const InternallyRefCountedWithTracing&) = + delete; + InternallyRefCountedWithTracing& operator=( + const InternallyRefCountedWithTracing&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + InternallyRefCountedWithTracing() + : InternallyRefCountedWithTracing(static_cast(nullptr)) {} + + explicit InternallyRefCountedWithTracing(TraceFlag* trace_flag) + : trace_flag_(trace_flag) { + gpr_ref_init(&refs_, 1); + } + +#ifdef NDEBUG + explicit InternallyRefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : InternallyRefCountedWithTracing() {} +#endif + + virtual ~InternallyRefCountedWithTracing() {} + + void Ref() { gpr_ref(&refs_); } + + void Ref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs + 1, reason); + } + Ref(); + } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + void Unref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs - 1, reason); + } + Unref(); + } + + private: + TraceFlag* trace_flag_ = nullptr; + gpr_refcount refs_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_SUPPORT_ORPHANABLE_H */ diff --git a/src/core/lib/support/ref_counted.h b/src/core/lib/support/ref_counted.h index 4c662f9119..48c11f7bbf 100644 --- a/src/core/lib/support/ref_counted.h +++ b/src/core/lib/support/ref_counted.h @@ -23,6 +23,7 @@ #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/support/abstract.h" #include "src/core/lib/support/debug_location.h" #include "src/core/lib/support/memory.h" @@ -45,6 +46,8 @@ class RefCounted { RefCounted(const RefCounted&) = delete; RefCounted& operator=(const RefCounted&) = delete; + GRPC_ABSTRACT_BASE_CLASS + protected: // Allow Delete() to access destructor. template @@ -98,18 +101,26 @@ class RefCountedWithTracing { RefCountedWithTracing(const RefCountedWithTracing&) = delete; RefCountedWithTracing& operator=(const RefCountedWithTracing&) = delete; + GRPC_ABSTRACT_BASE_CLASS + protected: // Allow Delete() to access destructor. template friend void Delete(T*); - RefCountedWithTracing() : RefCountedWithTracing(nullptr) {} + RefCountedWithTracing() + : RefCountedWithTracing(static_cast(nullptr)) {} explicit RefCountedWithTracing(TraceFlag* trace_flag) : trace_flag_(trace_flag) { gpr_ref_init(&refs_, 1); } +#ifdef NDEBUG + explicit RefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : RefCountedWithTracing() {} +#endif + virtual ~RefCountedWithTracing() {} private: diff --git a/test/core/support/BUILD b/test/core/support/BUILD index 4372b49b54..c8fa046da1 100644 --- a/test/core/support/BUILD +++ b/test/core/support/BUILD @@ -214,6 +214,19 @@ grpc_cc_test( ], ) +grpc_cc_test( + name = "orphanable_test", + srcs = ["orphanable_test.cc"], + language = "C++", + deps = [ + "//:orphanable", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) + grpc_cc_test( name = "ref_counted_test", srcs = ["ref_counted_test.cc"], diff --git a/test/core/support/orphanable_test.cc b/test/core/support/orphanable_test.cc new file mode 100644 index 0000000000..e07017ab1e --- /dev/null +++ b/test/core/support/orphanable_test.cc @@ -0,0 +1,114 @@ +/* + * + * 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/support/orphanable.h" + +#include + +#include "src/core/lib/support/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public Orphanable { + public: + Foo() : Foo(0) {} + explicit Foo(int value) : value_(value) {} + void Orphan() override { Delete(this); } + int value() const { return value_; } + + private: + int value_; +}; + +TEST(Orphanable, Basic) { + Foo* foo = New(); + foo->Orphan(); +} + +TEST(OrphanablePtr, Basic) { + OrphanablePtr foo(New()); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, DefaultConstructor) { + auto foo = MakeOrphanable(); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, WithParameters) { + auto foo = MakeOrphanable(5); + EXPECT_EQ(5, foo->value()); +} + +class Bar : public InternallyRefCounted { + public: + Bar() : Bar(0) {} + explicit Bar(int value) : value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(); } + void FinishWork() { Unref(); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCounted) { + auto bar = MakeOrphanable(); + bar->StartWork(); + bar->FinishWork(); +} + +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag baz_tracer(true, "baz"); + +class Baz : public InternallyRefCountedWithTracing { + public: + Baz() : Baz(0) {} + explicit Baz(int value) + : InternallyRefCountedWithTracing(&baz_tracer), value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(DEBUG_LOCATION, "work"); } + void FinishWork() { Unref(DEBUG_LOCATION, "work"); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCountedWithTracing) { + auto baz = MakeOrphanable(); + baz->StartWork(); + baz->FinishWork(); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/support/ref_counted_test.cc b/test/core/support/ref_counted_test.cc index be9b6ff7c2..0629e3ff5f 100644 --- a/test/core/support/ref_counted_test.cc +++ b/test/core/support/ref_counted_test.cc @@ -44,7 +44,9 @@ TEST(RefCounted, ExtraRef) { foo->Unref(); } -TraceFlag foo_tracer(true, "foo"); +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag foo_tracer(true, "foo"); class FooWithTracing : public RefCountedWithTracing { public: diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index d9184f49a2..85bbeed088 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1038,6 +1038,7 @@ src/core/lib/support/manual_constructor.h \ src/core/lib/support/memory.h \ src/core/lib/support/mpscq.h \ src/core/lib/support/murmur_hash.h \ +src/core/lib/support/orphanable.h \ src/core/lib/support/ref_counted.h \ src/core/lib/support/ref_counted_ptr.h \ src/core/lib/support/spinlock.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 3d3c6711d0..4bf0fc74d1 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1304,6 +1304,7 @@ src/core/lib/support/mpscq.cc \ src/core/lib/support/mpscq.h \ src/core/lib/support/murmur_hash.cc \ src/core/lib/support/murmur_hash.h \ +src/core/lib/support/orphanable.h \ src/core/lib/support/ref_counted.h \ src/core/lib/support/ref_counted_ptr.h \ src/core/lib/support/spinlock.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 51f0ac7ca6..a20acb1fef 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -3688,6 +3688,25 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc++", + "grpc++_test", + "grpc_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c++", + "name": "orphanable_test", + "src": [ + "test/core/support/orphanable_test.cc" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "gpr", @@ -8267,6 +8286,7 @@ "src/core/lib/slice/slice_internal.h", "src/core/lib/slice/slice_string_helpers.h", "src/core/lib/support/debug_location.h", + "src/core/lib/support/orphanable.h", "src/core/lib/support/ref_counted.h", "src/core/lib/support/ref_counted_ptr.h", "src/core/lib/support/vector.h", @@ -8407,6 +8427,7 @@ "src/core/lib/slice/slice_internal.h", "src/core/lib/slice/slice_string_helpers.h", "src/core/lib/support/debug_location.h", + "src/core/lib/support/orphanable.h", "src/core/lib/support/ref_counted.h", "src/core/lib/support/ref_counted_ptr.h", "src/core/lib/support/vector.h", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index 6b83cecd41..57b934d9c6 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -4053,6 +4053,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "orphanable_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [], "benchmark": false, -- cgit v1.2.3 From 4adad9997164a901cd2e5d1b7a636d940a86d581 Mon Sep 17 00:00:00 2001 From: David Garcia Quintas Date: Wed, 17 Jan 2018 13:50:39 -0800 Subject: fix BUILD --- BUILD | 1 + 1 file changed, 1 insertion(+) (limited to 'BUILD') diff --git a/BUILD b/BUILD index 5e48a2106d..186d664395 100644 --- a/BUILD +++ b/BUILD @@ -940,6 +940,7 @@ grpc_cc_library( "grpc_base", "grpc_deadline_filter", "ref_counted", + "ref_counted_ptr", ], ) -- cgit v1.2.3 From dbdf495f61d099521bab45cf93f6f7d8dfb5c06f Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 18 Jan 2018 11:21:12 -0800 Subject: Split lib/support into lib/gpr and lib/gpr++. --- BUILD | 158 +- CMakeLists.txt | 204 +- Makefile | 268 +- build.yaml | 200 +- config.m4 | 86 +- config.w32 | 86 +- gRPC-Core.podspec | 178 +- grpc.gemspec | 128 +- grpc.gyp | 84 +- package.xml | 128 +- .../ext/filters/client_channel/backup_poller.cc | 4 +- .../ext/filters/client_channel/client_channel.cc | 2 +- .../client_channel/http_connect_handshaker.cc | 4 +- src/core/ext/filters/client_channel/http_proxy.cc | 4 +- src/core/ext/filters/client_channel/lb_policy.h | 2 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 4 +- .../lb_policy/grpclb/grpclb_channel.cc | 2 +- .../lb_policy/grpclb/grpclb_channel_secure.cc | 2 +- .../lb_policy/round_robin/round_robin.cc | 2 +- .../client_channel/lb_policy/subchannel_list.h | 2 +- .../filters/client_channel/lb_policy_registry.cc | 2 +- .../ext/filters/client_channel/parse_address.cc | 2 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 6 +- .../dns/c_ares/grpc_ares_ev_driver_posix.cc | 2 +- .../resolver/dns/c_ares/grpc_ares_wrapper.cc | 2 +- .../resolver/dns/native/dns_resolver.cc | 6 +- .../client_channel/resolver/fake/fake_resolver.cc | 2 +- .../resolver/sockaddr/sockaddr_resolver.cc | 2 +- src/core/ext/filters/client_channel/subchannel.cc | 4 +- src/core/ext/filters/client_channel/subchannel.h | 6 +- src/core/ext/filters/client_channel/uri_parser.cc | 2 +- .../ext/filters/http/client/http_client_filter.cc | 2 +- .../message_compress/message_compress_filter.cc | 2 +- .../filters/message_size/message_size_filter.cc | 2 +- .../ext/transport/chttp2/transport/bin_decoder.cc | 2 +- .../transport/chttp2/transport/chttp2_plugin.cc | 2 +- .../transport/chttp2/transport/chttp2_transport.cc | 4 +- .../ext/transport/chttp2/transport/flow_control.cc | 2 +- .../ext/transport/chttp2/transport/flow_control.h | 4 +- .../ext/transport/chttp2/transport/frame_data.cc | 2 +- .../ext/transport/chttp2/transport/hpack_parser.cc | 2 +- .../ext/transport/chttp2/transport/hpack_table.cc | 2 +- src/core/ext/transport/chttp2/transport/internal.h | 2 +- .../transport/cronet/transport/cronet_transport.cc | 2 +- src/core/lib/channel/channel_args.cc | 2 +- src/core/lib/channel/channel_stack.h | 2 +- src/core/lib/channel/connected_channel.cc | 2 +- src/core/lib/debug/stats.cc | 2 +- src/core/lib/debug/trace.cc | 2 +- src/core/lib/gpr++/README.md | 16 + src/core/lib/gpr++/abstract.h | 34 + src/core/lib/gpr++/atomic.h | 30 + src/core/lib/gpr++/atomic_with_atm.h | 55 + src/core/lib/gpr++/atomic_with_std.h | 33 + src/core/lib/gpr++/debug_location.h | 52 + src/core/lib/gpr++/inlined_vector.h | 112 + src/core/lib/gpr++/manual_constructor.h | 211 ++ src/core/lib/gpr++/memory.h | 100 + src/core/lib/gpr++/orphanable.h | 171 + src/core/lib/gpr++/ref_counted.h | 133 + src/core/lib/gpr++/ref_counted_ptr.h | 99 + src/core/lib/gpr/README.md | 8 + src/core/lib/gpr/alloc.cc | 102 + src/core/lib/gpr/arena.cc | 83 + src/core/lib/gpr/arena.h | 39 + src/core/lib/gpr/atm.cc | 32 + src/core/lib/gpr/avl.cc | 300 ++ src/core/lib/gpr/cmdline.cc | 330 ++ src/core/lib/gpr/cpu_iphone.cc | 36 + src/core/lib/gpr/cpu_linux.cc | 78 + src/core/lib/gpr/cpu_posix.cc | 80 + src/core/lib/gpr/cpu_windows.cc | 33 + src/core/lib/gpr/env.h | 41 + src/core/lib/gpr/env_linux.cc | 82 + src/core/lib/gpr/env_posix.cc | 47 + src/core/lib/gpr/env_windows.cc | 72 + src/core/lib/gpr/fork.cc | 62 + src/core/lib/gpr/fork.h | 35 + src/core/lib/gpr/host_port.cc | 95 + src/core/lib/gpr/log.cc | 94 + src/core/lib/gpr/log_android.cc | 72 + src/core/lib/gpr/log_linux.cc | 92 + src/core/lib/gpr/log_posix.cc | 90 + src/core/lib/gpr/log_windows.cc | 97 + src/core/lib/gpr/mpscq.cc | 114 + src/core/lib/gpr/mpscq.h | 84 + src/core/lib/gpr/murmur_hash.cc | 78 + src/core/lib/gpr/murmur_hash.h | 29 + src/core/lib/gpr/spinlock.h | 44 + src/core/lib/gpr/string.cc | 315 ++ src/core/lib/gpr/string.h | 109 + src/core/lib/gpr/string_posix.cc | 72 + src/core/lib/gpr/string_util_windows.cc | 82 + src/core/lib/gpr/string_windows.cc | 69 + src/core/lib/gpr/string_windows.h | 32 + src/core/lib/gpr/subprocess_posix.cc | 99 + src/core/lib/gpr/subprocess_windows.cc | 126 + src/core/lib/gpr/sync.cc | 122 + src/core/lib/gpr/sync_posix.cc | 111 + src/core/lib/gpr/sync_windows.cc | 118 + src/core/lib/gpr/thd.cc | 49 + src/core/lib/gpr/thd_internal.h | 30 + src/core/lib/gpr/thd_posix.cc | 152 + src/core/lib/gpr/thd_windows.cc | 105 + src/core/lib/gpr/time.cc | 247 ++ src/core/lib/gpr/time_posix.cc | 166 + src/core/lib/gpr/time_precise.cc | 76 + src/core/lib/gpr/time_precise.h | 27 + src/core/lib/gpr/time_windows.cc | 98 + src/core/lib/gpr/tls_pthread.cc | 30 + src/core/lib/gpr/tmpfile.h | 30 + src/core/lib/gpr/tmpfile_msys.cc | 58 + src/core/lib/gpr/tmpfile_posix.cc | 70 + src/core/lib/gpr/tmpfile_windows.cc | 69 + src/core/lib/gpr/wrap_memcpy.cc | 42 + src/core/lib/http/format_request.cc | 2 +- src/core/lib/http/httpcli.cc | 2 +- src/core/lib/http/httpcli_security_connector.cc | 2 +- src/core/lib/iomgr/call_combiner.h | 2 +- src/core/lib/iomgr/closure.h | 2 +- src/core/lib/iomgr/combiner.h | 2 +- src/core/lib/iomgr/endpoint_pair_posix.cc | 2 +- src/core/lib/iomgr/ev_epoll1_linux.cc | 4 +- src/core/lib/iomgr/ev_epollex_linux.cc | 4 +- src/core/lib/iomgr/ev_epollsig_linux.cc | 2 +- src/core/lib/iomgr/ev_poll_posix.cc | 2 +- src/core/lib/iomgr/ev_posix.cc | 2 +- src/core/lib/iomgr/executor.cc | 2 +- src/core/lib/iomgr/fork_posix.cc | 6 +- src/core/lib/iomgr/iomgr.cc | 4 +- src/core/lib/iomgr/load_file.cc | 2 +- src/core/lib/iomgr/resolve_address_posix.cc | 2 +- src/core/lib/iomgr/resolve_address_windows.cc | 2 +- src/core/lib/iomgr/sockaddr_utils.cc | 2 +- src/core/lib/iomgr/socket_utils_common_posix.cc | 2 +- src/core/lib/iomgr/tcp_client_posix.cc | 2 +- src/core/lib/iomgr/tcp_posix.cc | 2 +- src/core/lib/iomgr/tcp_server_posix.cc | 2 +- src/core/lib/iomgr/tcp_uv.cc | 2 +- src/core/lib/iomgr/timer_generic.cc | 2 +- src/core/lib/iomgr/udp_server.cc | 2 +- src/core/lib/profiling/basic_timers.cc | 2 +- src/core/lib/security/context/security_context.cc | 2 +- src/core/lib/security/credentials/credentials.cc | 2 +- .../security/credentials/fake/fake_credentials.cc | 2 +- .../google_default/credentials_generic.cc | 4 +- .../google_default/google_default_credentials.cc | 4 +- .../lib/security/credentials/jwt/json_token.cc | 2 +- .../lib/security/credentials/jwt/jwt_verifier.cc | 2 +- .../lib/security/transport/client_auth_filter.cc | 2 +- src/core/lib/security/transport/secure_endpoint.cc | 2 +- .../lib/security/transport/security_connector.cc | 4 +- src/core/lib/slice/slice_intern.cc | 2 +- src/core/lib/slice/slice_string_helpers.cc | 2 +- src/core/lib/slice/slice_string_helpers.h | 2 +- src/core/lib/support/abstract.h | 34 - src/core/lib/support/alloc.cc | 102 - src/core/lib/support/arena.cc | 83 - src/core/lib/support/arena.h | 39 - src/core/lib/support/atm.cc | 32 - src/core/lib/support/atomic.h | 30 - src/core/lib/support/atomic_with_atm.h | 55 - src/core/lib/support/atomic_with_std.h | 33 - src/core/lib/support/avl.cc | 300 -- src/core/lib/support/cmdline.cc | 330 -- src/core/lib/support/cpu_iphone.cc | 36 - src/core/lib/support/cpu_linux.cc | 78 - src/core/lib/support/cpu_posix.cc | 80 - src/core/lib/support/cpu_windows.cc | 33 - src/core/lib/support/debug_location.h | 52 - src/core/lib/support/env.h | 41 - src/core/lib/support/env_linux.cc | 82 - src/core/lib/support/env_posix.cc | 47 - src/core/lib/support/env_windows.cc | 72 - src/core/lib/support/fork.cc | 62 - src/core/lib/support/fork.h | 35 - src/core/lib/support/host_port.cc | 95 - src/core/lib/support/log.cc | 94 - src/core/lib/support/log_android.cc | 72 - src/core/lib/support/log_linux.cc | 92 - src/core/lib/support/log_posix.cc | 90 - src/core/lib/support/log_windows.cc | 97 - src/core/lib/support/manual_constructor.h | 211 -- src/core/lib/support/memory.h | 100 - src/core/lib/support/mpscq.cc | 114 - src/core/lib/support/mpscq.h | 84 - src/core/lib/support/murmur_hash.cc | 78 - src/core/lib/support/murmur_hash.h | 29 - src/core/lib/support/orphanable.h | 171 - src/core/lib/support/ref_counted.h | 133 - src/core/lib/support/ref_counted_ptr.h | 99 - src/core/lib/support/spinlock.h | 44 - src/core/lib/support/string.cc | 315 -- src/core/lib/support/string.h | 109 - src/core/lib/support/string_posix.cc | 72 - src/core/lib/support/string_util_windows.cc | 82 - src/core/lib/support/string_windows.cc | 69 - src/core/lib/support/string_windows.h | 32 - src/core/lib/support/subprocess_posix.cc | 99 - src/core/lib/support/subprocess_windows.cc | 126 - src/core/lib/support/sync.cc | 122 - src/core/lib/support/sync_posix.cc | 111 - src/core/lib/support/sync_windows.cc | 118 - src/core/lib/support/thd.cc | 49 - src/core/lib/support/thd_internal.h | 30 - src/core/lib/support/thd_posix.cc | 152 - src/core/lib/support/thd_windows.cc | 105 - src/core/lib/support/time.cc | 247 -- src/core/lib/support/time_posix.cc | 166 - src/core/lib/support/time_precise.cc | 76 - src/core/lib/support/time_precise.h | 27 - src/core/lib/support/time_windows.cc | 98 - src/core/lib/support/tls_pthread.cc | 30 - src/core/lib/support/tmpfile.h | 30 - src/core/lib/support/tmpfile_msys.cc | 58 - src/core/lib/support/tmpfile_posix.cc | 70 - src/core/lib/support/tmpfile_windows.cc | 69 - src/core/lib/support/vector.h | 112 - src/core/lib/support/wrap_memcpy.cc | 42 - src/core/lib/surface/call.cc | 4 +- src/core/lib/surface/call_log_batch.cc | 2 +- src/core/lib/surface/channel.cc | 2 +- src/core/lib/surface/completion_queue.cc | 4 +- src/core/lib/surface/event_string.cc | 2 +- src/core/lib/surface/init.cc | 4 +- src/core/lib/surface/lame_client.cc | 4 +- src/core/lib/surface/server.cc | 6 +- src/core/lib/transport/metadata.cc | 4 +- src/core/lib/transport/service_config.cc | 2 +- src/core/lib/transport/timeout_encoding.cc | 2 +- src/core/lib/transport/timeout_encoding.h | 2 +- src/core/lib/transport/transport.cc | 2 +- src/core/lib/transport/transport.h | 2 +- src/core/lib/transport/transport_op_string.cc | 2 +- src/cpp/client/channel_cc.cc | 4 +- src/csharp/ext/grpc_csharp_ext.c | 2 +- src/objective-c/examples/Sample/Podfile | 2 +- src/objective-c/examples/SwiftSample/Podfile | 2 +- src/objective-c/tests/Connectivity/Podfile | 2 +- .../CoreCronetEnd2EndTests.mm | 6 +- .../tests/CronetUnitTests/CronetUnitTests.m | 6 +- src/objective-c/tests/Podfile | 2 +- src/python/grpcio/grpc_core_dependencies.py | 84 +- templates/gRPC-Core.podspec.template | 2 +- test/core/bad_client/bad_client.cc | 4 +- test/core/bad_client/tests/large_metadata.cc | 2 +- test/core/bad_ssl/bad_ssl_test.cc | 4 +- test/core/channel/minimal_stack_is_minimal_test.cc | 2 +- test/core/client_channel/lb_policies_test.cc | 2 +- test/core/compression/message_compress_test.cc | 2 +- test/core/end2end/bad_server_response_test.cc | 2 +- test/core/end2end/cq_verifier.cc | 2 +- test/core/end2end/dualstack_socket_test.cc | 2 +- test/core/end2end/fixtures/h2_full+trace.cc | 2 +- test/core/end2end/fixtures/h2_http_proxy.cc | 2 +- test/core/end2end/fixtures/h2_sockpair+trace.cc | 2 +- test/core/end2end/fixtures/h2_ssl.cc | 6 +- test/core/end2end/fixtures/h2_ssl_proxy.cc | 6 +- test/core/end2end/fixtures/h2_uds.cc | 2 +- test/core/end2end/fixtures/http_proxy_fixture.cc | 2 +- test/core/end2end/fuzzers/api_fuzzer.cc | 2 +- test/core/end2end/h2_ssl_cert_test.cc | 6 +- test/core/end2end/tests/bad_hostname.cc | 2 +- test/core/end2end/tests/call_creds.cc | 2 +- test/core/end2end/tests/cancel_with_status.cc | 2 +- test/core/end2end/tests/default_host.cc | 2 +- test/core/end2end/tests/empty_batch.cc | 2 +- test/core/end2end/tests/high_initial_seqno.cc | 2 +- test/core/end2end/tests/hpack_size.cc | 2 +- test/core/end2end/tests/idempotent_request.cc | 2 +- test/core/end2end/tests/keepalive_timeout.cc | 2 +- test/core/end2end/tests/negative_deadline.cc | 2 +- test/core/end2end/tests/no_logging.cc | 2 +- test/core/end2end/tests/proxy_auth.cc | 2 +- test/core/end2end/tests/registered_call.cc | 2 +- test/core/end2end/tests/server_finishes_request.cc | 2 +- test/core/end2end/tests/simple_request.cc | 2 +- test/core/fling/fling_stream_test.cc | 2 +- test/core/fling/fling_test.cc | 2 +- test/core/gpr++/BUILD | 95 + test/core/gpr++/inlined_vector_test.cc | 74 + test/core/gpr++/manual_constructor_test.cc | 99 + test/core/gpr++/memory_test.cc | 74 + test/core/gpr++/orphanable_test.cc | 114 + test/core/gpr++/ref_counted_ptr_test.cc | 185 + test/core/gpr++/ref_counted_test.cc | 74 + test/core/gpr/BUILD | 179 + test/core/gpr/alloc_test.cc | 55 + test/core/gpr/arena_test.cc | 129 + test/core/gpr/avl_test.cc | 3659 ++++++++++++++++++++ test/core/gpr/cmdline_test.cc | 491 +++ test/core/gpr/cpu_test.cc | 139 + test/core/gpr/env_test.cc | 49 + test/core/gpr/host_port_test.cc | 58 + test/core/gpr/log_test.cc | 108 + test/core/gpr/mpscq_test.cc | 194 ++ test/core/gpr/murmur_hash_test.cc | 73 + test/core/gpr/spinlock_test.cc | 152 + test/core/gpr/string_test.cc | 312 ++ test/core/gpr/sync_test.cc | 457 +++ test/core/gpr/thd_test.cc | 102 + test/core/gpr/time_test.cc | 266 ++ test/core/gpr/tls_test.cc | 68 + test/core/gpr/useful_test.cc | 58 + test/core/iomgr/load_file_test.cc | 4 +- test/core/iomgr/wakeup_fd_cv_test.cc | 2 +- test/core/json/json_test.cc | 2 +- test/core/memory_usage/client.cc | 4 +- test/core/memory_usage/memory_usage_test.cc | 2 +- test/core/security/auth_context_test.cc | 2 +- test/core/security/credentials_test.cc | 6 +- .../security/print_google_default_creds_token.cc | 2 +- test/core/security/security_connector_test.cc | 6 +- test/core/slice/percent_encoding_test.cc | 2 +- test/core/slice/slice_string_helpers_test.cc | 2 +- test/core/support/BUILD | 255 -- test/core/support/alloc_test.cc | 55 - test/core/support/arena_test.cc | 129 - test/core/support/avl_test.cc | 3659 -------------------- test/core/support/cmdline_test.cc | 491 --- test/core/support/cpu_test.cc | 139 - test/core/support/env_test.cc | 49 - test/core/support/host_port_test.cc | 58 - test/core/support/log_test.cc | 108 - test/core/support/manual_constructor_test.cc | 99 - test/core/support/memory_test.cc | 74 - test/core/support/mpscq_test.cc | 194 -- test/core/support/murmur_hash_test.cc | 73 - test/core/support/orphanable_test.cc | 114 - test/core/support/ref_counted_ptr_test.cc | 185 - test/core/support/ref_counted_test.cc | 74 - test/core/support/spinlock_test.cc | 152 - test/core/support/string_test.cc | 312 -- test/core/support/sync_test.cc | 457 --- test/core/support/thd_test.cc | 102 - test/core/support/time_test.cc | 266 -- test/core/support/tls_test.cc | 68 - test/core/support/useful_test.cc | 58 - test/core/support/vector_test.cc | 74 - test/core/transport/bdp_estimator_test.cc | 2 +- test/core/transport/chttp2/bin_decoder_test.cc | 2 +- test/core/transport/chttp2/bin_encoder_test.cc | 2 +- test/core/transport/chttp2/hpack_encoder_test.cc | 2 +- test/core/transport/chttp2/hpack_table_test.cc | 2 +- test/core/transport/metadata_test.cc | 2 +- test/core/transport/pid_controller_test.cc | 2 +- test/core/transport/timeout_encoding_test.cc | 4 +- test/core/tsi/transport_security_test.cc | 2 +- test/core/util/test_config.cc | 4 +- test/cpp/end2end/async_end2end_test.cc | 2 +- test/cpp/end2end/client_lb_end2end_test.cc | 2 +- test/cpp/end2end/end2end_test.cc | 2 +- test/cpp/end2end/grpclb_end2end_test.cc | 2 +- test/cpp/end2end/shutdown_test.cc | 2 +- test/cpp/grpclb/grpclb_test.cc | 6 +- test/cpp/interop/client.cc | 2 +- test/cpp/interop/http2_client.cc | 2 +- test/cpp/interop/interop_server.cc | 2 +- test/cpp/interop/interop_test.cc | 2 +- test/cpp/microbenchmarks/bm_arena.cc | 2 +- test/cpp/microbenchmarks/bm_closure.cc | 2 +- test/cpp/naming/resolver_component_test.cc | 4 +- .../resolver_component_tests_runner_invoker.cc | 2 +- test/cpp/qps/driver.cc | 2 +- test/cpp/qps/json_run_localhost.cc | 2 +- tools/doxygen/Doxyfile.c++.internal | 44 +- tools/doxygen/Doxyfile.core.internal | 130 +- tools/run_tests/generated/sources_and_headers.json | 260 +- tools/run_tests/generated/tests.json | 48 +- tools/run_tests/sanity/core_banned_functions.py | 4 +- 370 files changed, 14450 insertions(+), 14377 deletions(-) create mode 100644 src/core/lib/gpr++/README.md create mode 100644 src/core/lib/gpr++/abstract.h create mode 100644 src/core/lib/gpr++/atomic.h create mode 100644 src/core/lib/gpr++/atomic_with_atm.h create mode 100644 src/core/lib/gpr++/atomic_with_std.h create mode 100644 src/core/lib/gpr++/debug_location.h create mode 100644 src/core/lib/gpr++/inlined_vector.h create mode 100644 src/core/lib/gpr++/manual_constructor.h create mode 100644 src/core/lib/gpr++/memory.h create mode 100644 src/core/lib/gpr++/orphanable.h create mode 100644 src/core/lib/gpr++/ref_counted.h create mode 100644 src/core/lib/gpr++/ref_counted_ptr.h create mode 100644 src/core/lib/gpr/README.md create mode 100644 src/core/lib/gpr/alloc.cc create mode 100644 src/core/lib/gpr/arena.cc create mode 100644 src/core/lib/gpr/arena.h create mode 100644 src/core/lib/gpr/atm.cc create mode 100644 src/core/lib/gpr/avl.cc create mode 100644 src/core/lib/gpr/cmdline.cc create mode 100644 src/core/lib/gpr/cpu_iphone.cc create mode 100644 src/core/lib/gpr/cpu_linux.cc create mode 100644 src/core/lib/gpr/cpu_posix.cc create mode 100644 src/core/lib/gpr/cpu_windows.cc create mode 100644 src/core/lib/gpr/env.h create mode 100644 src/core/lib/gpr/env_linux.cc create mode 100644 src/core/lib/gpr/env_posix.cc create mode 100644 src/core/lib/gpr/env_windows.cc create mode 100644 src/core/lib/gpr/fork.cc create mode 100644 src/core/lib/gpr/fork.h create mode 100644 src/core/lib/gpr/host_port.cc create mode 100644 src/core/lib/gpr/log.cc create mode 100644 src/core/lib/gpr/log_android.cc create mode 100644 src/core/lib/gpr/log_linux.cc create mode 100644 src/core/lib/gpr/log_posix.cc create mode 100644 src/core/lib/gpr/log_windows.cc create mode 100644 src/core/lib/gpr/mpscq.cc create mode 100644 src/core/lib/gpr/mpscq.h create mode 100644 src/core/lib/gpr/murmur_hash.cc create mode 100644 src/core/lib/gpr/murmur_hash.h create mode 100644 src/core/lib/gpr/spinlock.h create mode 100644 src/core/lib/gpr/string.cc create mode 100644 src/core/lib/gpr/string.h create mode 100644 src/core/lib/gpr/string_posix.cc create mode 100644 src/core/lib/gpr/string_util_windows.cc create mode 100644 src/core/lib/gpr/string_windows.cc create mode 100644 src/core/lib/gpr/string_windows.h create mode 100644 src/core/lib/gpr/subprocess_posix.cc create mode 100644 src/core/lib/gpr/subprocess_windows.cc create mode 100644 src/core/lib/gpr/sync.cc create mode 100644 src/core/lib/gpr/sync_posix.cc create mode 100644 src/core/lib/gpr/sync_windows.cc create mode 100644 src/core/lib/gpr/thd.cc create mode 100644 src/core/lib/gpr/thd_internal.h create mode 100644 src/core/lib/gpr/thd_posix.cc create mode 100644 src/core/lib/gpr/thd_windows.cc create mode 100644 src/core/lib/gpr/time.cc create mode 100644 src/core/lib/gpr/time_posix.cc create mode 100644 src/core/lib/gpr/time_precise.cc create mode 100644 src/core/lib/gpr/time_precise.h create mode 100644 src/core/lib/gpr/time_windows.cc create mode 100644 src/core/lib/gpr/tls_pthread.cc create mode 100644 src/core/lib/gpr/tmpfile.h create mode 100644 src/core/lib/gpr/tmpfile_msys.cc create mode 100644 src/core/lib/gpr/tmpfile_posix.cc create mode 100644 src/core/lib/gpr/tmpfile_windows.cc create mode 100644 src/core/lib/gpr/wrap_memcpy.cc delete mode 100644 src/core/lib/support/abstract.h delete mode 100644 src/core/lib/support/alloc.cc delete mode 100644 src/core/lib/support/arena.cc delete mode 100644 src/core/lib/support/arena.h delete mode 100644 src/core/lib/support/atm.cc delete mode 100644 src/core/lib/support/atomic.h delete mode 100644 src/core/lib/support/atomic_with_atm.h delete mode 100644 src/core/lib/support/atomic_with_std.h delete mode 100644 src/core/lib/support/avl.cc delete mode 100644 src/core/lib/support/cmdline.cc delete mode 100644 src/core/lib/support/cpu_iphone.cc delete mode 100644 src/core/lib/support/cpu_linux.cc delete mode 100644 src/core/lib/support/cpu_posix.cc delete mode 100644 src/core/lib/support/cpu_windows.cc delete mode 100644 src/core/lib/support/debug_location.h delete mode 100644 src/core/lib/support/env.h delete mode 100644 src/core/lib/support/env_linux.cc delete mode 100644 src/core/lib/support/env_posix.cc delete mode 100644 src/core/lib/support/env_windows.cc delete mode 100644 src/core/lib/support/fork.cc delete mode 100644 src/core/lib/support/fork.h delete mode 100644 src/core/lib/support/host_port.cc delete mode 100644 src/core/lib/support/log.cc delete mode 100644 src/core/lib/support/log_android.cc delete mode 100644 src/core/lib/support/log_linux.cc delete mode 100644 src/core/lib/support/log_posix.cc delete mode 100644 src/core/lib/support/log_windows.cc delete mode 100644 src/core/lib/support/manual_constructor.h delete mode 100644 src/core/lib/support/memory.h delete mode 100644 src/core/lib/support/mpscq.cc delete mode 100644 src/core/lib/support/mpscq.h delete mode 100644 src/core/lib/support/murmur_hash.cc delete mode 100644 src/core/lib/support/murmur_hash.h delete mode 100644 src/core/lib/support/orphanable.h delete mode 100644 src/core/lib/support/ref_counted.h delete mode 100644 src/core/lib/support/ref_counted_ptr.h delete mode 100644 src/core/lib/support/spinlock.h delete mode 100644 src/core/lib/support/string.cc delete mode 100644 src/core/lib/support/string.h delete mode 100644 src/core/lib/support/string_posix.cc delete mode 100644 src/core/lib/support/string_util_windows.cc delete mode 100644 src/core/lib/support/string_windows.cc delete mode 100644 src/core/lib/support/string_windows.h delete mode 100644 src/core/lib/support/subprocess_posix.cc delete mode 100644 src/core/lib/support/subprocess_windows.cc delete mode 100644 src/core/lib/support/sync.cc delete mode 100644 src/core/lib/support/sync_posix.cc delete mode 100644 src/core/lib/support/sync_windows.cc delete mode 100644 src/core/lib/support/thd.cc delete mode 100644 src/core/lib/support/thd_internal.h delete mode 100644 src/core/lib/support/thd_posix.cc delete mode 100644 src/core/lib/support/thd_windows.cc delete mode 100644 src/core/lib/support/time.cc delete mode 100644 src/core/lib/support/time_posix.cc delete mode 100644 src/core/lib/support/time_precise.cc delete mode 100644 src/core/lib/support/time_precise.h delete mode 100644 src/core/lib/support/time_windows.cc delete mode 100644 src/core/lib/support/tls_pthread.cc delete mode 100644 src/core/lib/support/tmpfile.h delete mode 100644 src/core/lib/support/tmpfile_msys.cc delete mode 100644 src/core/lib/support/tmpfile_posix.cc delete mode 100644 src/core/lib/support/tmpfile_windows.cc delete mode 100644 src/core/lib/support/vector.h delete mode 100644 src/core/lib/support/wrap_memcpy.cc create mode 100644 test/core/gpr++/BUILD create mode 100644 test/core/gpr++/inlined_vector_test.cc create mode 100644 test/core/gpr++/manual_constructor_test.cc create mode 100644 test/core/gpr++/memory_test.cc create mode 100644 test/core/gpr++/orphanable_test.cc create mode 100644 test/core/gpr++/ref_counted_ptr_test.cc create mode 100644 test/core/gpr++/ref_counted_test.cc create mode 100644 test/core/gpr/BUILD create mode 100644 test/core/gpr/alloc_test.cc create mode 100644 test/core/gpr/arena_test.cc create mode 100644 test/core/gpr/avl_test.cc create mode 100644 test/core/gpr/cmdline_test.cc create mode 100644 test/core/gpr/cpu_test.cc create mode 100644 test/core/gpr/env_test.cc create mode 100644 test/core/gpr/host_port_test.cc create mode 100644 test/core/gpr/log_test.cc create mode 100644 test/core/gpr/mpscq_test.cc create mode 100644 test/core/gpr/murmur_hash_test.cc create mode 100644 test/core/gpr/spinlock_test.cc create mode 100644 test/core/gpr/string_test.cc create mode 100644 test/core/gpr/sync_test.cc create mode 100644 test/core/gpr/thd_test.cc create mode 100644 test/core/gpr/time_test.cc create mode 100644 test/core/gpr/tls_test.cc create mode 100644 test/core/gpr/useful_test.cc delete mode 100644 test/core/support/BUILD delete mode 100644 test/core/support/alloc_test.cc delete mode 100644 test/core/support/arena_test.cc delete mode 100644 test/core/support/avl_test.cc delete mode 100644 test/core/support/cmdline_test.cc delete mode 100644 test/core/support/cpu_test.cc delete mode 100644 test/core/support/env_test.cc delete mode 100644 test/core/support/host_port_test.cc delete mode 100644 test/core/support/log_test.cc delete mode 100644 test/core/support/manual_constructor_test.cc delete mode 100644 test/core/support/memory_test.cc delete mode 100644 test/core/support/mpscq_test.cc delete mode 100644 test/core/support/murmur_hash_test.cc delete mode 100644 test/core/support/orphanable_test.cc delete mode 100644 test/core/support/ref_counted_ptr_test.cc delete mode 100644 test/core/support/ref_counted_test.cc delete mode 100644 test/core/support/spinlock_test.cc delete mode 100644 test/core/support/string_test.cc delete mode 100644 test/core/support/sync_test.cc delete mode 100644 test/core/support/thd_test.cc delete mode 100644 test/core/support/time_test.cc delete mode 100644 test/core/support/tls_test.cc delete mode 100644 test/core/support/useful_test.cc delete mode 100644 test/core/support/vector_test.cc (limited to 'BUILD') diff --git a/BUILD b/BUILD index 186d664395..c52a95cf91 100644 --- a/BUILD +++ b/BUILD @@ -448,75 +448,67 @@ grpc_cc_library( srcs = [ "src/core/lib/profiling/basic_timers.cc", "src/core/lib/profiling/stap_timers.cc", - "src/core/lib/support/alloc.cc", - "src/core/lib/support/arena.cc", - "src/core/lib/support/atm.cc", - "src/core/lib/support/avl.cc", - "src/core/lib/support/cmdline.cc", - "src/core/lib/support/cpu_iphone.cc", - "src/core/lib/support/cpu_linux.cc", - "src/core/lib/support/cpu_posix.cc", - "src/core/lib/support/cpu_windows.cc", - "src/core/lib/support/env_linux.cc", - "src/core/lib/support/env_posix.cc", - "src/core/lib/support/env_windows.cc", - "src/core/lib/support/fork.cc", - "src/core/lib/support/host_port.cc", - "src/core/lib/support/log.cc", - "src/core/lib/support/log_android.cc", - "src/core/lib/support/log_linux.cc", - "src/core/lib/support/log_posix.cc", - "src/core/lib/support/log_windows.cc", - "src/core/lib/support/mpscq.cc", - "src/core/lib/support/murmur_hash.cc", - "src/core/lib/support/string.cc", - "src/core/lib/support/string_posix.cc", - "src/core/lib/support/string_util_windows.cc", - "src/core/lib/support/string_windows.cc", - "src/core/lib/support/subprocess_posix.cc", - "src/core/lib/support/subprocess_windows.cc", - "src/core/lib/support/sync.cc", - "src/core/lib/support/sync_posix.cc", - "src/core/lib/support/sync_windows.cc", - "src/core/lib/support/thd.cc", - "src/core/lib/support/thd_posix.cc", - "src/core/lib/support/thd_windows.cc", - "src/core/lib/support/time.cc", - "src/core/lib/support/time_posix.cc", - "src/core/lib/support/time_precise.cc", - "src/core/lib/support/time_windows.cc", - "src/core/lib/support/tls_pthread.cc", - "src/core/lib/support/tmpfile_msys.cc", - "src/core/lib/support/tmpfile_posix.cc", - "src/core/lib/support/tmpfile_windows.cc", - "src/core/lib/support/wrap_memcpy.cc", + "src/core/lib/gpr/alloc.cc", + "src/core/lib/gpr/arena.cc", + "src/core/lib/gpr/atm.cc", + "src/core/lib/gpr/avl.cc", + "src/core/lib/gpr/cmdline.cc", + "src/core/lib/gpr/cpu_iphone.cc", + "src/core/lib/gpr/cpu_linux.cc", + "src/core/lib/gpr/cpu_posix.cc", + "src/core/lib/gpr/cpu_windows.cc", + "src/core/lib/gpr/env_linux.cc", + "src/core/lib/gpr/env_posix.cc", + "src/core/lib/gpr/env_windows.cc", + "src/core/lib/gpr/fork.cc", + "src/core/lib/gpr/host_port.cc", + "src/core/lib/gpr/log.cc", + "src/core/lib/gpr/log_android.cc", + "src/core/lib/gpr/log_linux.cc", + "src/core/lib/gpr/log_posix.cc", + "src/core/lib/gpr/log_windows.cc", + "src/core/lib/gpr/mpscq.cc", + "src/core/lib/gpr/murmur_hash.cc", + "src/core/lib/gpr/string.cc", + "src/core/lib/gpr/string_posix.cc", + "src/core/lib/gpr/string_util_windows.cc", + "src/core/lib/gpr/string_windows.cc", + "src/core/lib/gpr/subprocess_posix.cc", + "src/core/lib/gpr/subprocess_windows.cc", + "src/core/lib/gpr/sync.cc", + "src/core/lib/gpr/sync_posix.cc", + "src/core/lib/gpr/sync_windows.cc", + "src/core/lib/gpr/thd.cc", + "src/core/lib/gpr/thd_posix.cc", + "src/core/lib/gpr/thd_windows.cc", + "src/core/lib/gpr/time.cc", + "src/core/lib/gpr/time_posix.cc", + "src/core/lib/gpr/time_precise.cc", + "src/core/lib/gpr/time_windows.cc", + "src/core/lib/gpr/tls_pthread.cc", + "src/core/lib/gpr/tmpfile_msys.cc", + "src/core/lib/gpr/tmpfile_posix.cc", + "src/core/lib/gpr/tmpfile_windows.cc", + "src/core/lib/gpr/wrap_memcpy.cc", ], hdrs = [ "src/core/lib/profiling/timers.h", - "src/core/lib/support/abstract.h", - "src/core/lib/support/arena.h", - "src/core/lib/support/atomic.h", - "src/core/lib/support/atomic_with_atm.h", - "src/core/lib/support/atomic_with_std.h", - "src/core/lib/support/env.h", - "src/core/lib/support/fork.h", - "src/core/lib/support/manual_constructor.h", - "src/core/lib/support/memory.h", - "src/core/lib/support/mpscq.h", - "src/core/lib/support/murmur_hash.h", - "src/core/lib/support/spinlock.h", - "src/core/lib/support/string.h", - "src/core/lib/support/string_windows.h", - "src/core/lib/support/thd_internal.h", - "src/core/lib/support/time_precise.h", - "src/core/lib/support/tmpfile.h", - "src/core/lib/support/vector.h", + "src/core/lib/gpr/arena.h", + "src/core/lib/gpr/env.h", + "src/core/lib/gpr/fork.h", + "src/core/lib/gpr/mpscq.h", + "src/core/lib/gpr/murmur_hash.h", + "src/core/lib/gpr/spinlock.h", + "src/core/lib/gpr/string.h", + "src/core/lib/gpr/string_windows.h", + "src/core/lib/gpr/thd_internal.h", + "src/core/lib/gpr/time_precise.h", + "src/core/lib/gpr/tmpfile.h", ], language = "c++", public_hdrs = GPR_PUBLIC_HDRS, deps = [ "gpr_codegen", - "@com_google_absl//absl/container:inlined_vector", ], ) @@ -552,16 +544,49 @@ grpc_cc_library( ], ) +grpc_cc_library( + name = "gpr++_base", + language = "c++", + public_hdrs = [ + "src/core/lib/gpr++/abstract.h", + "src/core/lib/gpr++/manual_constructor.h", + "src/core/lib/gpr++/memory.h", + ], +) + +grpc_cc_library( + name = "atomic", + language = "c++", + public_hdrs = [ + "src/core/lib/gpr++/atomic.h", + ], + hdrs = [ + "src/core/lib/gpr++/atomic_with_atm.h", + "src/core/lib/gpr++/atomic_with_std.h", + ], + deps = [ + "gpr", + ], +) + +grpc_cc_library( + name = "inlined_vector", + language = "c++", + public_hdrs = [ + "src/core/lib/gpr++/inlined_vector.h", + ], +) + grpc_cc_library( name = "debug_location", language = "c++", - public_hdrs = ["src/core/lib/support/debug_location.h"], + public_hdrs = ["src/core/lib/gpr++/debug_location.h"], ) grpc_cc_library( name = "orphanable", language = "c++", - public_hdrs = ["src/core/lib/support/orphanable.h"], + public_hdrs = ["src/core/lib/gpr++/orphanable.h"], deps = [ "debug_location", "grpc_trace", @@ -571,7 +596,7 @@ grpc_cc_library( grpc_cc_library( name = "ref_counted", language = "c++", - public_hdrs = ["src/core/lib/support/ref_counted.h"], + public_hdrs = ["src/core/lib/gpr++/ref_counted.h"], deps = [ "debug_location", "grpc_trace", @@ -581,7 +606,7 @@ grpc_cc_library( grpc_cc_library( name = "ref_counted_ptr", language = "c++", - public_hdrs = ["src/core/lib/support/ref_counted_ptr.h"], + public_hdrs = ["src/core/lib/gpr++/ref_counted_ptr.h"], ) grpc_cc_library( @@ -848,6 +873,7 @@ grpc_cc_library( public_hdrs = GRPC_PUBLIC_HDRS, deps = [ "gpr_base", + "gpr++_base", "grpc_codegen", "grpc_trace", ], @@ -860,6 +886,7 @@ grpc_cc_library( ], language = "c++", deps = [ + "atomic", "grpc_base_c", ], ) @@ -1320,6 +1347,7 @@ grpc_cc_library( ], language = "c++", deps = [ + "gpr++_base", "grpc_base", "grpc_http_filters", "grpc_transport_chttp2_alpn", diff --git a/CMakeLists.txt b/CMakeLists.txt index 97d68cc62c..4450a73e9d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -544,6 +544,7 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx http2_client) endif() add_dependencies(buildtests_cxx hybrid_end2end_test) +add_dependencies(buildtests_cxx inlined_vector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx inproc_sync_unary_ping_pong_test) endif() @@ -600,7 +601,6 @@ add_dependencies(buildtests_cxx stress_test) add_dependencies(buildtests_cxx thread_manager_test) add_dependencies(buildtests_cxx thread_stress_test) add_dependencies(buildtests_cxx transport_pid_controller_test) -add_dependencies(buildtests_cxx vector_test) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) add_dependencies(buildtests_cxx writes_per_rpc_test) endif() @@ -623,50 +623,50 @@ endif (gRPC_BUILD_TESTS) add_library(gpr + src/core/lib/gpr/alloc.cc + src/core/lib/gpr/arena.cc + src/core/lib/gpr/atm.cc + src/core/lib/gpr/avl.cc + src/core/lib/gpr/cmdline.cc + src/core/lib/gpr/cpu_iphone.cc + src/core/lib/gpr/cpu_linux.cc + src/core/lib/gpr/cpu_posix.cc + src/core/lib/gpr/cpu_windows.cc + src/core/lib/gpr/env_linux.cc + src/core/lib/gpr/env_posix.cc + src/core/lib/gpr/env_windows.cc + src/core/lib/gpr/fork.cc + src/core/lib/gpr/host_port.cc + src/core/lib/gpr/log.cc + src/core/lib/gpr/log_android.cc + src/core/lib/gpr/log_linux.cc + src/core/lib/gpr/log_posix.cc + src/core/lib/gpr/log_windows.cc + src/core/lib/gpr/mpscq.cc + src/core/lib/gpr/murmur_hash.cc + src/core/lib/gpr/string.cc + src/core/lib/gpr/string_posix.cc + src/core/lib/gpr/string_util_windows.cc + src/core/lib/gpr/string_windows.cc + src/core/lib/gpr/subprocess_posix.cc + src/core/lib/gpr/subprocess_windows.cc + src/core/lib/gpr/sync.cc + src/core/lib/gpr/sync_posix.cc + src/core/lib/gpr/sync_windows.cc + src/core/lib/gpr/thd.cc + src/core/lib/gpr/thd_posix.cc + src/core/lib/gpr/thd_windows.cc + src/core/lib/gpr/time.cc + src/core/lib/gpr/time_posix.cc + src/core/lib/gpr/time_precise.cc + src/core/lib/gpr/time_windows.cc + src/core/lib/gpr/tls_pthread.cc + src/core/lib/gpr/tmpfile_msys.cc + src/core/lib/gpr/tmpfile_posix.cc + src/core/lib/gpr/tmpfile_windows.cc + src/core/lib/gpr/wrap_memcpy.cc src/core/lib/profiling/basic_timers.cc src/core/lib/profiling/stap_timers.cc - src/core/lib/support/alloc.cc - src/core/lib/support/arena.cc - src/core/lib/support/atm.cc - src/core/lib/support/avl.cc - src/core/lib/support/cmdline.cc - src/core/lib/support/cpu_iphone.cc - src/core/lib/support/cpu_linux.cc - src/core/lib/support/cpu_posix.cc - src/core/lib/support/cpu_windows.cc - src/core/lib/support/env_linux.cc - src/core/lib/support/env_posix.cc - src/core/lib/support/env_windows.cc - src/core/lib/support/fork.cc - src/core/lib/support/host_port.cc - src/core/lib/support/log.cc - src/core/lib/support/log_android.cc - src/core/lib/support/log_linux.cc - src/core/lib/support/log_posix.cc - src/core/lib/support/log_windows.cc - src/core/lib/support/mpscq.cc - src/core/lib/support/murmur_hash.cc - src/core/lib/support/string.cc - src/core/lib/support/string_posix.cc - src/core/lib/support/string_util_windows.cc - src/core/lib/support/string_windows.cc - src/core/lib/support/subprocess_posix.cc - src/core/lib/support/subprocess_windows.cc - src/core/lib/support/sync.cc - src/core/lib/support/sync_posix.cc - src/core/lib/support/sync_windows.cc - src/core/lib/support/thd.cc - src/core/lib/support/thd_posix.cc - src/core/lib/support/thd_windows.cc - src/core/lib/support/time.cc - src/core/lib/support/time_posix.cc - src/core/lib/support/time_precise.cc - src/core/lib/support/time_windows.cc - src/core/lib/support/tls_pthread.cc - src/core/lib/support/tmpfile_msys.cc - src/core/lib/support/tmpfile_posix.cc - src/core/lib/support/tmpfile_windows.cc - src/core/lib/support/wrap_memcpy.cc ) if(WIN32 AND MSVC) @@ -4784,7 +4784,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(alloc_test - test/core/support/alloc_test.cc + test/core/gpr/alloc_test.cc ) @@ -4836,7 +4836,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(arena_test - test/core/support/arena_test.cc + test/core/gpr/arena_test.cc ) @@ -5635,7 +5635,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_avl_test - test/core/support/avl_test.cc + test/core/gpr/avl_test.cc ) @@ -5660,7 +5660,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_cmdline_test - test/core/support/cmdline_test.cc + test/core/gpr/cmdline_test.cc ) @@ -5685,7 +5685,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_cpu_test - test/core/support/cpu_test.cc + test/core/gpr/cpu_test.cc ) @@ -5710,7 +5710,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_env_test - test/core/support/env_test.cc + test/core/gpr/env_test.cc ) @@ -5735,7 +5735,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_host_port_test - test/core/support/host_port_test.cc + test/core/gpr/host_port_test.cc ) @@ -5760,7 +5760,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_log_test - test/core/support/log_test.cc + test/core/gpr/log_test.cc ) @@ -5785,7 +5785,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_manual_constructor_test - test/core/support/manual_constructor_test.cc + test/core/gpr++/manual_constructor_test.cc ) @@ -5810,7 +5810,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_mpscq_test - test/core/support/mpscq_test.cc + test/core/gpr/mpscq_test.cc ) @@ -5835,7 +5835,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_spinlock_test - test/core/support/spinlock_test.cc + test/core/gpr/spinlock_test.cc ) @@ -5860,7 +5860,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_string_test - test/core/support/string_test.cc + test/core/gpr/string_test.cc ) @@ -5885,7 +5885,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_sync_test - test/core/support/sync_test.cc + test/core/gpr/sync_test.cc ) @@ -5910,7 +5910,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_thd_test - test/core/support/thd_test.cc + test/core/gpr/thd_test.cc ) @@ -5935,7 +5935,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_time_test - test/core/support/time_test.cc + test/core/gpr/time_test.cc ) @@ -5960,7 +5960,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_tls_test - test/core/support/tls_test.cc + test/core/gpr/tls_test.cc ) @@ -5985,7 +5985,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_useful_test - test/core/support/useful_test.cc + test/core/gpr/useful_test.cc ) @@ -7202,7 +7202,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(murmur_hash_test - test/core/support/murmur_hash_test.cc + test/core/gpr/murmur_hash_test.cc ) @@ -10552,6 +10552,43 @@ target_link_libraries(hybrid_end2end_test ${_gRPC_GFLAGS_LIBRARIES} ) +endif (gRPC_BUILD_TESTS) +if (gRPC_BUILD_TESTS) + +add_executable(inlined_vector_test + test/core/gpr++/inlined_vector_test.cc + third_party/googletest/googletest/src/gtest-all.cc + third_party/googletest/googlemock/src/gmock-all.cc +) + + +target_include_directories(inlined_vector_test + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include + PRIVATE ${_gRPC_SSL_INCLUDE_DIR} + PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR} + PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR} + PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR} + PRIVATE ${_gRPC_CARES_INCLUDE_DIR} + PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR} + PRIVATE third_party/googletest/googletest/include + PRIVATE third_party/googletest/googletest + PRIVATE third_party/googletest/googlemock/include + PRIVATE third_party/googletest/googlemock + PRIVATE ${_gRPC_PROTO_GENS_DIR} +) + +target_link_libraries(inlined_vector_test + ${_gRPC_PROTOBUF_LIBRARIES} + ${_gRPC_ALLTARGETS_LIBRARIES} + grpc_test_util + grpc++ + grpc + gpr_test_util + gpr + ${_gRPC_GFLAGS_LIBRARIES} +) + endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) @@ -10764,7 +10801,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(memory_test - test/core/support/memory_test.cc + test/core/gpr++/memory_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -10915,7 +10952,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(orphanable_test - test/core/support/orphanable_test.cc + test/core/gpr++/orphanable_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -11315,7 +11352,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(ref_counted_ptr_test - test/core/support/ref_counted_ptr_test.cc + test/core/gpr++/ref_counted_ptr_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -11352,7 +11389,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(ref_counted_test - test/core/support/ref_counted_test.cc + test/core/gpr++/ref_counted_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -12057,43 +12094,6 @@ target_link_libraries(transport_pid_controller_test ${_gRPC_GFLAGS_LIBRARIES} ) -endif (gRPC_BUILD_TESTS) -if (gRPC_BUILD_TESTS) - -add_executable(vector_test - test/core/support/vector_test.cc - third_party/googletest/googletest/src/gtest-all.cc - third_party/googletest/googlemock/src/gmock-all.cc -) - - -target_include_directories(vector_test - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include - PRIVATE ${_gRPC_SSL_INCLUDE_DIR} - PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR} - PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR} - PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR} - PRIVATE ${_gRPC_CARES_INCLUDE_DIR} - PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR} - PRIVATE third_party/googletest/googletest/include - PRIVATE third_party/googletest/googletest - PRIVATE third_party/googletest/googlemock/include - PRIVATE third_party/googletest/googlemock - PRIVATE ${_gRPC_PROTO_GENS_DIR} -) - -target_link_libraries(vector_test - ${_gRPC_PROTOBUF_LIBRARIES} - ${_gRPC_ALLTARGETS_LIBRARIES} - grpc_test_util - grpc++ - grpc - gpr_test_util - gpr - ${_gRPC_GFLAGS_LIBRARIES} -) - endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_MAC OR _gRPC_PLATFORM_POSIX) diff --git a/Makefile b/Makefile index 3265cea362..69a68a6d66 100644 --- a/Makefile +++ b/Makefile @@ -1151,6 +1151,7 @@ h2_ssl_cert_test: $(BINDIR)/$(CONFIG)/h2_ssl_cert_test health_service_end2end_test: $(BINDIR)/$(CONFIG)/health_service_end2end_test http2_client: $(BINDIR)/$(CONFIG)/http2_client hybrid_end2end_test: $(BINDIR)/$(CONFIG)/hybrid_end2end_test +inlined_vector_test: $(BINDIR)/$(CONFIG)/inlined_vector_test inproc_sync_unary_ping_pong_test: $(BINDIR)/$(CONFIG)/inproc_sync_unary_ping_pong_test interop_client: $(BINDIR)/$(CONFIG)/interop_client interop_server: $(BINDIR)/$(CONFIG)/interop_server @@ -1187,7 +1188,6 @@ stress_test: $(BINDIR)/$(CONFIG)/stress_test thread_manager_test: $(BINDIR)/$(CONFIG)/thread_manager_test thread_stress_test: $(BINDIR)/$(CONFIG)/thread_stress_test transport_pid_controller_test: $(BINDIR)/$(CONFIG)/transport_pid_controller_test -vector_test: $(BINDIR)/$(CONFIG)/vector_test writes_per_rpc_test: $(BINDIR)/$(CONFIG)/writes_per_rpc_test public_headers_must_be_c89: $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 gen_hpack_tables: $(BINDIR)/$(CONFIG)/gen_hpack_tables @@ -1594,6 +1594,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/health_service_end2end_test \ $(BINDIR)/$(CONFIG)/http2_client \ $(BINDIR)/$(CONFIG)/hybrid_end2end_test \ + $(BINDIR)/$(CONFIG)/inlined_vector_test \ $(BINDIR)/$(CONFIG)/inproc_sync_unary_ping_pong_test \ $(BINDIR)/$(CONFIG)/interop_client \ $(BINDIR)/$(CONFIG)/interop_server \ @@ -1630,7 +1631,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/thread_manager_test \ $(BINDIR)/$(CONFIG)/thread_stress_test \ $(BINDIR)/$(CONFIG)/transport_pid_controller_test \ - $(BINDIR)/$(CONFIG)/vector_test \ $(BINDIR)/$(CONFIG)/writes_per_rpc_test \ $(BINDIR)/$(CONFIG)/boringssl_aes_test \ $(BINDIR)/$(CONFIG)/boringssl_asn1_test \ @@ -1726,6 +1726,7 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/health_service_end2end_test \ $(BINDIR)/$(CONFIG)/http2_client \ $(BINDIR)/$(CONFIG)/hybrid_end2end_test \ + $(BINDIR)/$(CONFIG)/inlined_vector_test \ $(BINDIR)/$(CONFIG)/inproc_sync_unary_ping_pong_test \ $(BINDIR)/$(CONFIG)/interop_client \ $(BINDIR)/$(CONFIG)/interop_server \ @@ -1762,7 +1763,6 @@ buildtests_cxx: privatelibs_cxx \ $(BINDIR)/$(CONFIG)/thread_manager_test \ $(BINDIR)/$(CONFIG)/thread_stress_test \ $(BINDIR)/$(CONFIG)/transport_pid_controller_test \ - $(BINDIR)/$(CONFIG)/vector_test \ $(BINDIR)/$(CONFIG)/writes_per_rpc_test \ $(BINDIR)/$(CONFIG)/resolver_component_test_unsecure \ $(BINDIR)/$(CONFIG)/resolver_component_test \ @@ -2135,6 +2135,8 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/h2_ssl_cert_test || ( echo test h2_ssl_cert_test failed ; exit 1 ) $(E) "[RUN] Testing health_service_end2end_test" $(Q) $(BINDIR)/$(CONFIG)/health_service_end2end_test || ( echo test health_service_end2end_test failed ; exit 1 ) + $(E) "[RUN] Testing inlined_vector_test" + $(Q) $(BINDIR)/$(CONFIG)/inlined_vector_test || ( echo test inlined_vector_test failed ; exit 1 ) $(E) "[RUN] Testing inproc_sync_unary_ping_pong_test" $(Q) $(BINDIR)/$(CONFIG)/inproc_sync_unary_ping_pong_test || ( echo test inproc_sync_unary_ping_pong_test failed ; exit 1 ) $(E) "[RUN] Testing interop_test" @@ -2185,8 +2187,6 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/thread_stress_test || ( echo test thread_stress_test failed ; exit 1 ) $(E) "[RUN] Testing transport_pid_controller_test" $(Q) $(BINDIR)/$(CONFIG)/transport_pid_controller_test || ( echo test transport_pid_controller_test failed ; exit 1 ) - $(E) "[RUN] Testing vector_test" - $(Q) $(BINDIR)/$(CONFIG)/vector_test || ( echo test vector_test failed ; exit 1 ) $(E) "[RUN] Testing writes_per_rpc_test" $(Q) $(BINDIR)/$(CONFIG)/writes_per_rpc_test || ( echo test writes_per_rpc_test failed ; exit 1 ) $(E) "[RUN] Testing resolver_component_tests_runner_invoker_unsecure" @@ -2840,50 +2840,50 @@ clean: LIBGPR_SRC = \ + src/core/lib/gpr/alloc.cc \ + src/core/lib/gpr/arena.cc \ + src/core/lib/gpr/atm.cc \ + src/core/lib/gpr/avl.cc \ + src/core/lib/gpr/cmdline.cc \ + src/core/lib/gpr/cpu_iphone.cc \ + src/core/lib/gpr/cpu_linux.cc \ + src/core/lib/gpr/cpu_posix.cc \ + src/core/lib/gpr/cpu_windows.cc \ + src/core/lib/gpr/env_linux.cc \ + src/core/lib/gpr/env_posix.cc \ + src/core/lib/gpr/env_windows.cc \ + src/core/lib/gpr/fork.cc \ + src/core/lib/gpr/host_port.cc \ + src/core/lib/gpr/log.cc \ + src/core/lib/gpr/log_android.cc \ + src/core/lib/gpr/log_linux.cc \ + src/core/lib/gpr/log_posix.cc \ + src/core/lib/gpr/log_windows.cc \ + src/core/lib/gpr/mpscq.cc \ + src/core/lib/gpr/murmur_hash.cc \ + src/core/lib/gpr/string.cc \ + src/core/lib/gpr/string_posix.cc \ + src/core/lib/gpr/string_util_windows.cc \ + src/core/lib/gpr/string_windows.cc \ + src/core/lib/gpr/subprocess_posix.cc \ + src/core/lib/gpr/subprocess_windows.cc \ + src/core/lib/gpr/sync.cc \ + src/core/lib/gpr/sync_posix.cc \ + src/core/lib/gpr/sync_windows.cc \ + src/core/lib/gpr/thd.cc \ + src/core/lib/gpr/thd_posix.cc \ + src/core/lib/gpr/thd_windows.cc \ + src/core/lib/gpr/time.cc \ + src/core/lib/gpr/time_posix.cc \ + src/core/lib/gpr/time_precise.cc \ + src/core/lib/gpr/time_windows.cc \ + src/core/lib/gpr/tls_pthread.cc \ + src/core/lib/gpr/tmpfile_msys.cc \ + src/core/lib/gpr/tmpfile_posix.cc \ + src/core/lib/gpr/tmpfile_windows.cc \ + src/core/lib/gpr/wrap_memcpy.cc \ src/core/lib/profiling/basic_timers.cc \ src/core/lib/profiling/stap_timers.cc \ - src/core/lib/support/alloc.cc \ - src/core/lib/support/arena.cc \ - src/core/lib/support/atm.cc \ - src/core/lib/support/avl.cc \ - src/core/lib/support/cmdline.cc \ - src/core/lib/support/cpu_iphone.cc \ - src/core/lib/support/cpu_linux.cc \ - src/core/lib/support/cpu_posix.cc \ - src/core/lib/support/cpu_windows.cc \ - src/core/lib/support/env_linux.cc \ - src/core/lib/support/env_posix.cc \ - src/core/lib/support/env_windows.cc \ - src/core/lib/support/fork.cc \ - src/core/lib/support/host_port.cc \ - src/core/lib/support/log.cc \ - src/core/lib/support/log_android.cc \ - src/core/lib/support/log_linux.cc \ - src/core/lib/support/log_posix.cc \ - src/core/lib/support/log_windows.cc \ - src/core/lib/support/mpscq.cc \ - src/core/lib/support/murmur_hash.cc \ - src/core/lib/support/string.cc \ - src/core/lib/support/string_posix.cc \ - src/core/lib/support/string_util_windows.cc \ - src/core/lib/support/string_windows.cc \ - src/core/lib/support/subprocess_posix.cc \ - src/core/lib/support/subprocess_windows.cc \ - src/core/lib/support/sync.cc \ - src/core/lib/support/sync_posix.cc \ - src/core/lib/support/sync_windows.cc \ - src/core/lib/support/thd.cc \ - src/core/lib/support/thd_posix.cc \ - src/core/lib/support/thd_windows.cc \ - src/core/lib/support/time.cc \ - src/core/lib/support/time_posix.cc \ - src/core/lib/support/time_precise.cc \ - src/core/lib/support/time_windows.cc \ - src/core/lib/support/tls_pthread.cc \ - src/core/lib/support/tmpfile_msys.cc \ - src/core/lib/support/tmpfile_posix.cc \ - src/core/lib/support/tmpfile_windows.cc \ - src/core/lib/support/wrap_memcpy.cc \ PUBLIC_HEADERS_C += \ include/grpc/support/alloc.h \ @@ -8798,7 +8798,7 @@ endif ALLOC_TEST_SRC = \ - test/core/support/alloc_test.cc \ + test/core/gpr/alloc_test.cc \ ALLOC_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALLOC_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -8818,7 +8818,7 @@ $(BINDIR)/$(CONFIG)/alloc_test: $(ALLOC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_te endif -$(OBJDIR)/$(CONFIG)/test/core/support/alloc_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/alloc_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_alloc_test: $(ALLOC_TEST_OBJS:.o=.dep) @@ -8894,7 +8894,7 @@ endif ARENA_TEST_SRC = \ - test/core/support/arena_test.cc \ + test/core/gpr/arena_test.cc \ ARENA_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ARENA_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -8914,7 +8914,7 @@ $(BINDIR)/$(CONFIG)/arena_test: $(ARENA_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgpr_te endif -$(OBJDIR)/$(CONFIG)/test/core/support/arena_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/arena_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_arena_test: $(ARENA_TEST_OBJS:.o=.dep) @@ -9857,7 +9857,7 @@ endif GPR_AVL_TEST_SRC = \ - test/core/support/avl_test.cc \ + test/core/gpr/avl_test.cc \ GPR_AVL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_AVL_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -9877,7 +9877,7 @@ $(BINDIR)/$(CONFIG)/gpr_avl_test: $(GPR_AVL_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/avl_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/avl_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_avl_test: $(GPR_AVL_TEST_OBJS:.o=.dep) @@ -9889,7 +9889,7 @@ endif GPR_CMDLINE_TEST_SRC = \ - test/core/support/cmdline_test.cc \ + test/core/gpr/cmdline_test.cc \ GPR_CMDLINE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_CMDLINE_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -9909,7 +9909,7 @@ $(BINDIR)/$(CONFIG)/gpr_cmdline_test: $(GPR_CMDLINE_TEST_OBJS) $(LIBDIR)/$(CONFI endif -$(OBJDIR)/$(CONFIG)/test/core/support/cmdline_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/cmdline_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_cmdline_test: $(GPR_CMDLINE_TEST_OBJS:.o=.dep) @@ -9921,7 +9921,7 @@ endif GPR_CPU_TEST_SRC = \ - test/core/support/cpu_test.cc \ + test/core/gpr/cpu_test.cc \ GPR_CPU_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_CPU_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -9941,7 +9941,7 @@ $(BINDIR)/$(CONFIG)/gpr_cpu_test: $(GPR_CPU_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/cpu_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/cpu_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_cpu_test: $(GPR_CPU_TEST_OBJS:.o=.dep) @@ -9953,7 +9953,7 @@ endif GPR_ENV_TEST_SRC = \ - test/core/support/env_test.cc \ + test/core/gpr/env_test.cc \ GPR_ENV_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_ENV_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -9973,7 +9973,7 @@ $(BINDIR)/$(CONFIG)/gpr_env_test: $(GPR_ENV_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/env_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/env_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_env_test: $(GPR_ENV_TEST_OBJS:.o=.dep) @@ -9985,7 +9985,7 @@ endif GPR_HOST_PORT_TEST_SRC = \ - test/core/support/host_port_test.cc \ + test/core/gpr/host_port_test.cc \ GPR_HOST_PORT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_HOST_PORT_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10005,7 +10005,7 @@ $(BINDIR)/$(CONFIG)/gpr_host_port_test: $(GPR_HOST_PORT_TEST_OBJS) $(LIBDIR)/$(C endif -$(OBJDIR)/$(CONFIG)/test/core/support/host_port_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/host_port_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_host_port_test: $(GPR_HOST_PORT_TEST_OBJS:.o=.dep) @@ -10017,7 +10017,7 @@ endif GPR_LOG_TEST_SRC = \ - test/core/support/log_test.cc \ + test/core/gpr/log_test.cc \ GPR_LOG_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_LOG_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10037,7 +10037,7 @@ $(BINDIR)/$(CONFIG)/gpr_log_test: $(GPR_LOG_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/log_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/log_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_log_test: $(GPR_LOG_TEST_OBJS:.o=.dep) @@ -10049,7 +10049,7 @@ endif GPR_MANUAL_CONSTRUCTOR_TEST_SRC = \ - test/core/support/manual_constructor_test.cc \ + test/core/gpr++/manual_constructor_test.cc \ GPR_MANUAL_CONSTRUCTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_MANUAL_CONSTRUCTOR_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10069,7 +10069,7 @@ $(BINDIR)/$(CONFIG)/gpr_manual_constructor_test: $(GPR_MANUAL_CONSTRUCTOR_TEST_O endif -$(OBJDIR)/$(CONFIG)/test/core/support/manual_constructor_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr++/manual_constructor_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_manual_constructor_test: $(GPR_MANUAL_CONSTRUCTOR_TEST_OBJS:.o=.dep) @@ -10081,7 +10081,7 @@ endif GPR_MPSCQ_TEST_SRC = \ - test/core/support/mpscq_test.cc \ + test/core/gpr/mpscq_test.cc \ GPR_MPSCQ_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_MPSCQ_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10101,7 +10101,7 @@ $(BINDIR)/$(CONFIG)/gpr_mpscq_test: $(GPR_MPSCQ_TEST_OBJS) $(LIBDIR)/$(CONFIG)/l endif -$(OBJDIR)/$(CONFIG)/test/core/support/mpscq_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/mpscq_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_mpscq_test: $(GPR_MPSCQ_TEST_OBJS:.o=.dep) @@ -10113,7 +10113,7 @@ endif GPR_SPINLOCK_TEST_SRC = \ - test/core/support/spinlock_test.cc \ + test/core/gpr/spinlock_test.cc \ GPR_SPINLOCK_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_SPINLOCK_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10133,7 +10133,7 @@ $(BINDIR)/$(CONFIG)/gpr_spinlock_test: $(GPR_SPINLOCK_TEST_OBJS) $(LIBDIR)/$(CON endif -$(OBJDIR)/$(CONFIG)/test/core/support/spinlock_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/spinlock_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_spinlock_test: $(GPR_SPINLOCK_TEST_OBJS:.o=.dep) @@ -10145,7 +10145,7 @@ endif GPR_STRING_TEST_SRC = \ - test/core/support/string_test.cc \ + test/core/gpr/string_test.cc \ GPR_STRING_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_STRING_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10165,7 +10165,7 @@ $(BINDIR)/$(CONFIG)/gpr_string_test: $(GPR_STRING_TEST_OBJS) $(LIBDIR)/$(CONFIG) endif -$(OBJDIR)/$(CONFIG)/test/core/support/string_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/string_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_string_test: $(GPR_STRING_TEST_OBJS:.o=.dep) @@ -10177,7 +10177,7 @@ endif GPR_SYNC_TEST_SRC = \ - test/core/support/sync_test.cc \ + test/core/gpr/sync_test.cc \ GPR_SYNC_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_SYNC_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10197,7 +10197,7 @@ $(BINDIR)/$(CONFIG)/gpr_sync_test: $(GPR_SYNC_TEST_OBJS) $(LIBDIR)/$(CONFIG)/lib endif -$(OBJDIR)/$(CONFIG)/test/core/support/sync_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/sync_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_sync_test: $(GPR_SYNC_TEST_OBJS:.o=.dep) @@ -10209,7 +10209,7 @@ endif GPR_THD_TEST_SRC = \ - test/core/support/thd_test.cc \ + test/core/gpr/thd_test.cc \ GPR_THD_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_THD_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10229,7 +10229,7 @@ $(BINDIR)/$(CONFIG)/gpr_thd_test: $(GPR_THD_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/thd_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/thd_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_thd_test: $(GPR_THD_TEST_OBJS:.o=.dep) @@ -10241,7 +10241,7 @@ endif GPR_TIME_TEST_SRC = \ - test/core/support/time_test.cc \ + test/core/gpr/time_test.cc \ GPR_TIME_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_TIME_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10261,7 +10261,7 @@ $(BINDIR)/$(CONFIG)/gpr_time_test: $(GPR_TIME_TEST_OBJS) $(LIBDIR)/$(CONFIG)/lib endif -$(OBJDIR)/$(CONFIG)/test/core/support/time_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/time_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_time_test: $(GPR_TIME_TEST_OBJS:.o=.dep) @@ -10273,7 +10273,7 @@ endif GPR_TLS_TEST_SRC = \ - test/core/support/tls_test.cc \ + test/core/gpr/tls_test.cc \ GPR_TLS_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_TLS_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10293,7 +10293,7 @@ $(BINDIR)/$(CONFIG)/gpr_tls_test: $(GPR_TLS_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgp endif -$(OBJDIR)/$(CONFIG)/test/core/support/tls_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/tls_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_tls_test: $(GPR_TLS_TEST_OBJS:.o=.dep) @@ -10305,7 +10305,7 @@ endif GPR_USEFUL_TEST_SRC = \ - test/core/support/useful_test.cc \ + test/core/gpr/useful_test.cc \ GPR_USEFUL_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_USEFUL_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10325,7 +10325,7 @@ $(BINDIR)/$(CONFIG)/gpr_useful_test: $(GPR_USEFUL_TEST_OBJS) $(LIBDIR)/$(CONFIG) endif -$(OBJDIR)/$(CONFIG)/test/core/support/useful_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/useful_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_useful_test: $(GPR_USEFUL_TEST_OBJS:.o=.dep) @@ -11879,7 +11879,7 @@ endif MURMUR_HASH_TEST_SRC = \ - test/core/support/murmur_hash_test.cc \ + test/core/gpr/murmur_hash_test.cc \ MURMUR_HASH_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MURMUR_HASH_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -11899,7 +11899,7 @@ $(BINDIR)/$(CONFIG)/murmur_hash_test: $(MURMUR_HASH_TEST_OBJS) $(LIBDIR)/$(CONFI endif -$(OBJDIR)/$(CONFIG)/test/core/support/murmur_hash_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr/murmur_hash_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_murmur_hash_test: $(MURMUR_HASH_TEST_OBJS:.o=.dep) @@ -15778,6 +15778,49 @@ endif endif +INLINED_VECTOR_TEST_SRC = \ + test/core/gpr++/inlined_vector_test.cc \ + +INLINED_VECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INLINED_VECTOR_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/inlined_vector_test: openssl_dep_error + +else + + + + +ifeq ($(NO_PROTOBUF),true) + +# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. + +$(BINDIR)/$(CONFIG)/inlined_vector_test: protobuf_dep_error + +else + +$(BINDIR)/$(CONFIG)/inlined_vector_test: $(PROTOBUF_DEP) $(INLINED_VECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(INLINED_VECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/inlined_vector_test + +endif + +endif + +$(OBJDIR)/$(CONFIG)/test/core/gpr++/inlined_vector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_inlined_vector_test: $(INLINED_VECTOR_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(INLINED_VECTOR_TEST_OBJS:.o=.dep) +endif +endif + + INPROC_SYNC_UNARY_PING_PONG_TEST_SRC = \ test/cpp/qps/inproc_sync_unary_ping_pong_test.cc \ @@ -15970,7 +16013,7 @@ endif MEMORY_TEST_SRC = \ - test/core/support/memory_test.cc \ + test/core/gpr++/memory_test.cc \ MEMORY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MEMORY_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16001,7 +16044,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/support/memory_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr++/memory_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_memory_test: $(MEMORY_TEST_OBJS:.o=.dep) @@ -16147,7 +16190,7 @@ endif ORPHANABLE_TEST_SRC = \ - test/core/support/orphanable_test.cc \ + test/core/gpr++/orphanable_test.cc \ ORPHANABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ORPHANABLE_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16178,7 +16221,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/support/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr++/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_orphanable_test: $(ORPHANABLE_TEST_OBJS:.o=.dep) @@ -16554,7 +16597,7 @@ $(OBJDIR)/$(CONFIG)/test/cpp/interop/reconnect_interop_server.o: $(GENDIR)/src/p REF_COUNTED_PTR_TEST_SRC = \ - test/core/support/ref_counted_ptr_test.cc \ + test/core/gpr++/ref_counted_ptr_test.cc \ REF_COUNTED_PTR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_PTR_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16585,7 +16628,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/support/ref_counted_ptr_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr++/ref_counted_ptr_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_ref_counted_ptr_test: $(REF_COUNTED_PTR_TEST_OBJS:.o=.dep) @@ -16597,7 +16640,7 @@ endif REF_COUNTED_TEST_SRC = \ - test/core/support/ref_counted_test.cc \ + test/core/gpr++/ref_counted_test.cc \ REF_COUNTED_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16628,7 +16671,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/support/ref_counted_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gpr++/ref_counted_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_ref_counted_test: $(REF_COUNTED_TEST_OBJS:.o=.dep) @@ -17366,49 +17409,6 @@ endif endif -VECTOR_TEST_SRC = \ - test/core/support/vector_test.cc \ - -VECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(VECTOR_TEST_SRC)))) -ifeq ($(NO_SECURE),true) - -# You can't build secure targets if you don't have OpenSSL. - -$(BINDIR)/$(CONFIG)/vector_test: openssl_dep_error - -else - - - - -ifeq ($(NO_PROTOBUF),true) - -# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+. - -$(BINDIR)/$(CONFIG)/vector_test: protobuf_dep_error - -else - -$(BINDIR)/$(CONFIG)/vector_test: $(PROTOBUF_DEP) $(VECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - $(E) "[LD] Linking $@" - $(Q) mkdir -p `dirname $@` - $(Q) $(LDXX) $(LDFLAGS) $(VECTOR_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/vector_test - -endif - -endif - -$(OBJDIR)/$(CONFIG)/test/core/support/vector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a - -deps_vector_test: $(VECTOR_TEST_OBJS:.o=.dep) - -ifneq ($(NO_SECURE),true) -ifneq ($(NO_DEPS),true) --include $(VECTOR_TEST_OBJS:.o=.dep) -endif -endif - - WRITES_PER_RPC_TEST_SRC = \ test/cpp/performance/writes_per_rpc_test.cc \ diff --git a/build.yaml b/build.yaml index c9adc9b44e..a8639a8b0b 100644 --- a/build.yaml +++ b/build.yaml @@ -26,50 +26,50 @@ filegroups: - nanopb - name: gpr_base src: + - src/core/lib/gpr/alloc.cc + - src/core/lib/gpr/arena.cc + - src/core/lib/gpr/atm.cc + - src/core/lib/gpr/avl.cc + - src/core/lib/gpr/cmdline.cc + - src/core/lib/gpr/cpu_iphone.cc + - src/core/lib/gpr/cpu_linux.cc + - src/core/lib/gpr/cpu_posix.cc + - src/core/lib/gpr/cpu_windows.cc + - src/core/lib/gpr/env_linux.cc + - src/core/lib/gpr/env_posix.cc + - src/core/lib/gpr/env_windows.cc + - src/core/lib/gpr/fork.cc + - src/core/lib/gpr/host_port.cc + - src/core/lib/gpr/log.cc + - src/core/lib/gpr/log_android.cc + - src/core/lib/gpr/log_linux.cc + - src/core/lib/gpr/log_posix.cc + - src/core/lib/gpr/log_windows.cc + - src/core/lib/gpr/mpscq.cc + - src/core/lib/gpr/murmur_hash.cc + - src/core/lib/gpr/string.cc + - src/core/lib/gpr/string_posix.cc + - src/core/lib/gpr/string_util_windows.cc + - src/core/lib/gpr/string_windows.cc + - src/core/lib/gpr/subprocess_posix.cc + - src/core/lib/gpr/subprocess_windows.cc + - src/core/lib/gpr/sync.cc + - src/core/lib/gpr/sync_posix.cc + - src/core/lib/gpr/sync_windows.cc + - src/core/lib/gpr/thd.cc + - src/core/lib/gpr/thd_posix.cc + - src/core/lib/gpr/thd_windows.cc + - src/core/lib/gpr/time.cc + - src/core/lib/gpr/time_posix.cc + - src/core/lib/gpr/time_precise.cc + - src/core/lib/gpr/time_windows.cc + - src/core/lib/gpr/tls_pthread.cc + - src/core/lib/gpr/tmpfile_msys.cc + - src/core/lib/gpr/tmpfile_posix.cc + - src/core/lib/gpr/tmpfile_windows.cc + - src/core/lib/gpr/wrap_memcpy.cc - src/core/lib/profiling/basic_timers.cc - src/core/lib/profiling/stap_timers.cc - - src/core/lib/support/alloc.cc - - src/core/lib/support/arena.cc - - src/core/lib/support/atm.cc - - src/core/lib/support/avl.cc - - src/core/lib/support/cmdline.cc - - src/core/lib/support/cpu_iphone.cc - - src/core/lib/support/cpu_linux.cc - - src/core/lib/support/cpu_posix.cc - - src/core/lib/support/cpu_windows.cc - - src/core/lib/support/env_linux.cc - - src/core/lib/support/env_posix.cc - - src/core/lib/support/env_windows.cc - - src/core/lib/support/fork.cc - - src/core/lib/support/host_port.cc - - src/core/lib/support/log.cc - - src/core/lib/support/log_android.cc - - src/core/lib/support/log_linux.cc - - src/core/lib/support/log_posix.cc - - src/core/lib/support/log_windows.cc - - src/core/lib/support/mpscq.cc - - src/core/lib/support/murmur_hash.cc - - src/core/lib/support/string.cc - - src/core/lib/support/string_posix.cc - - src/core/lib/support/string_util_windows.cc - - src/core/lib/support/string_windows.cc - - src/core/lib/support/subprocess_posix.cc - - src/core/lib/support/subprocess_windows.cc - - src/core/lib/support/sync.cc - - src/core/lib/support/sync_posix.cc - - src/core/lib/support/sync_windows.cc - - src/core/lib/support/thd.cc - - src/core/lib/support/thd_posix.cc - - src/core/lib/support/thd_windows.cc - - src/core/lib/support/time.cc - - src/core/lib/support/time_posix.cc - - src/core/lib/support/time_precise.cc - - src/core/lib/support/time_windows.cc - - src/core/lib/support/tls_pthread.cc - - src/core/lib/support/tmpfile_msys.cc - - src/core/lib/support/tmpfile_posix.cc - - src/core/lib/support/tmpfile_windows.cc - - src/core/lib/support/wrap_memcpy.cc uses: - gpr_base_headers - name: gpr_base_headers @@ -101,24 +101,24 @@ filegroups: - include/grpc/support/tls_pthread.h - include/grpc/support/useful.h headers: + - src/core/lib/gpr++/abstract.h + - src/core/lib/gpr++/atomic.h + - src/core/lib/gpr++/atomic_with_atm.h + - src/core/lib/gpr++/atomic_with_std.h + - src/core/lib/gpr++/manual_constructor.h + - src/core/lib/gpr++/memory.h + - src/core/lib/gpr/arena.h + - src/core/lib/gpr/env.h + - src/core/lib/gpr/fork.h + - src/core/lib/gpr/mpscq.h + - src/core/lib/gpr/murmur_hash.h + - src/core/lib/gpr/spinlock.h + - src/core/lib/gpr/string.h + - src/core/lib/gpr/string_windows.h + - src/core/lib/gpr/thd_internal.h + - src/core/lib/gpr/time_precise.h + - src/core/lib/gpr/tmpfile.h - src/core/lib/profiling/timers.h - - src/core/lib/support/abstract.h - - src/core/lib/support/arena.h - - src/core/lib/support/atomic.h - - src/core/lib/support/atomic_with_atm.h - - src/core/lib/support/atomic_with_std.h - - src/core/lib/support/env.h - - src/core/lib/support/fork.h - - src/core/lib/support/manual_constructor.h - - src/core/lib/support/memory.h - - src/core/lib/support/mpscq.h - - src/core/lib/support/murmur_hash.h - - src/core/lib/support/spinlock.h - - src/core/lib/support/string.h - - src/core/lib/support/string_windows.h - - src/core/lib/support/thd_internal.h - - src/core/lib/support/time_precise.h - - src/core/lib/support/tmpfile.h uses: - gpr_codegen - name: gpr_codegen @@ -321,6 +321,11 @@ filegroups: - src/core/lib/compression/stream_compression_identity.h - src/core/lib/debug/stats.h - src/core/lib/debug/stats_data.h + - src/core/lib/gpr++/debug_location.h + - src/core/lib/gpr++/inlined_vector.h + - src/core/lib/gpr++/orphanable.h + - src/core/lib/gpr++/ref_counted.h + - src/core/lib/gpr++/ref_counted_ptr.h - src/core/lib/http/format_request.h - src/core/lib/http/httpcli.h - src/core/lib/http/parser.h @@ -396,11 +401,6 @@ filegroups: - src/core/lib/slice/slice_hash_table.h - src/core/lib/slice/slice_internal.h - src/core/lib/slice/slice_string_helpers.h - - src/core/lib/support/debug_location.h - - src/core/lib/support/orphanable.h - - src/core/lib/support/ref_counted.h - - src/core/lib/support/ref_counted_ptr.h - - src/core/lib/support/vector.h - src/core/lib/surface/alarm_internal.h - src/core/lib/surface/api_trace.h - src/core/lib/surface/call.h @@ -1732,7 +1732,7 @@ targets: build: test language: c src: - - test/core/support/alloc_test.cc + - test/core/gpr/alloc_test.cc deps: - gpr_test_util - gpr @@ -1765,7 +1765,7 @@ targets: build: test language: c src: - - test/core/support/arena_test.cc + - test/core/gpr/arena_test.cc deps: - gpr_test_util - gpr @@ -2132,7 +2132,7 @@ targets: build: test language: c src: - - test/core/support/avl_test.cc + - test/core/gpr/avl_test.cc deps: - gpr_test_util - gpr @@ -2141,7 +2141,7 @@ targets: build: test language: c src: - - test/core/support/cmdline_test.cc + - test/core/gpr/cmdline_test.cc deps: - gpr_test_util - gpr @@ -2151,7 +2151,7 @@ targets: build: test language: c src: - - test/core/support/cpu_test.cc + - test/core/gpr/cpu_test.cc deps: - gpr_test_util - gpr @@ -2160,7 +2160,7 @@ targets: build: test language: c src: - - test/core/support/env_test.cc + - test/core/gpr/env_test.cc deps: - gpr_test_util - gpr @@ -2169,7 +2169,7 @@ targets: build: test language: c src: - - test/core/support/host_port_test.cc + - test/core/gpr/host_port_test.cc deps: - gpr_test_util - gpr @@ -2178,7 +2178,7 @@ targets: build: test language: c src: - - test/core/support/log_test.cc + - test/core/gpr/log_test.cc deps: - gpr_test_util - gpr @@ -2188,7 +2188,7 @@ targets: build: test language: c src: - - test/core/support/manual_constructor_test.cc + - test/core/gpr++/manual_constructor_test.cc deps: - gpr_test_util - gpr @@ -2198,7 +2198,7 @@ targets: build: test language: c src: - - test/core/support/mpscq_test.cc + - test/core/gpr/mpscq_test.cc deps: - gpr_test_util - gpr @@ -2208,7 +2208,7 @@ targets: build: test language: c src: - - test/core/support/spinlock_test.cc + - test/core/gpr/spinlock_test.cc deps: - gpr_test_util - gpr @@ -2217,7 +2217,7 @@ targets: build: test language: c src: - - test/core/support/string_test.cc + - test/core/gpr/string_test.cc deps: - gpr_test_util - gpr @@ -2227,7 +2227,7 @@ targets: build: test language: c src: - - test/core/support/sync_test.cc + - test/core/gpr/sync_test.cc deps: - gpr_test_util - gpr @@ -2237,7 +2237,7 @@ targets: build: test language: c src: - - test/core/support/thd_test.cc + - test/core/gpr/thd_test.cc deps: - gpr_test_util - gpr @@ -2246,7 +2246,7 @@ targets: build: test language: c src: - - test/core/support/time_test.cc + - test/core/gpr/time_test.cc deps: - gpr_test_util - gpr @@ -2255,7 +2255,7 @@ targets: build: test language: c src: - - test/core/support/tls_test.cc + - test/core/gpr/tls_test.cc deps: - gpr_test_util - gpr @@ -2264,7 +2264,7 @@ targets: build: test language: c src: - - test/core/support/useful_test.cc + - test/core/gpr/useful_test.cc deps: - gpr_test_util - gpr @@ -2833,7 +2833,7 @@ targets: build: test language: c src: - - test/core/support/murmur_hash_test.cc + - test/core/gpr/murmur_hash_test.cc deps: - gpr_test_util - gpr @@ -4260,6 +4260,20 @@ targets: - grpc - gpr_test_util - gpr +- name: inlined_vector_test + gtest: true + build: test + language: c++ + src: + - test/core/gpr++/inlined_vector_test.cc + deps: + - grpc_test_util + - grpc++ + - grpc + - gpr_test_util + - gpr + uses: + - grpc++_test - name: inproc_sync_unary_ping_pong_test build: test language: c++ @@ -4357,7 +4371,7 @@ targets: build: test language: c++ src: - - test/core/support/memory_test.cc + - test/core/gpr++/memory_test.cc deps: - grpc_test_util - grpc++ @@ -4409,7 +4423,7 @@ targets: build: test language: c++ src: - - test/core/support/orphanable_test.cc + - test/core/gpr++/orphanable_test.cc deps: - grpc_test_util - grpc++ @@ -4562,7 +4576,7 @@ targets: build: test language: c++ src: - - test/core/support/ref_counted_ptr_test.cc + - test/core/gpr++/ref_counted_ptr_test.cc deps: - grpc_test_util - grpc++ @@ -4576,7 +4590,7 @@ targets: build: test language: c++ src: - - test/core/support/ref_counted_test.cc + - test/core/gpr++/ref_counted_test.cc deps: - grpc_test_util - grpc++ @@ -4826,20 +4840,6 @@ targets: - grpc - gpr_test_util - gpr -- name: vector_test - gtest: true - build: test - language: c++ - src: - - test/core/support/vector_test.cc - deps: - - grpc_test_util - - grpc++ - - grpc - - gpr_test_util - - gpr - uses: - - grpc++_test - name: writes_per_rpc_test gtest: true cpu_cost: 0.5 diff --git a/config.m4 b/config.m4 index c026b83f35..54e29cc41d 100644 --- a/config.m4 +++ b/config.m4 @@ -39,50 +39,50 @@ if test "$PHP_GRPC" != "no"; then src/php/ext/grpc/server.c \ src/php/ext/grpc/server_credentials.c \ src/php/ext/grpc/timeval.c \ + src/core/lib/gpr/alloc.cc \ + src/core/lib/gpr/arena.cc \ + src/core/lib/gpr/atm.cc \ + src/core/lib/gpr/avl.cc \ + src/core/lib/gpr/cmdline.cc \ + src/core/lib/gpr/cpu_iphone.cc \ + src/core/lib/gpr/cpu_linux.cc \ + src/core/lib/gpr/cpu_posix.cc \ + src/core/lib/gpr/cpu_windows.cc \ + src/core/lib/gpr/env_linux.cc \ + src/core/lib/gpr/env_posix.cc \ + src/core/lib/gpr/env_windows.cc \ + src/core/lib/gpr/fork.cc \ + src/core/lib/gpr/host_port.cc \ + src/core/lib/gpr/log.cc \ + src/core/lib/gpr/log_android.cc \ + src/core/lib/gpr/log_linux.cc \ + src/core/lib/gpr/log_posix.cc \ + src/core/lib/gpr/log_windows.cc \ + src/core/lib/gpr/mpscq.cc \ + src/core/lib/gpr/murmur_hash.cc \ + src/core/lib/gpr/string.cc \ + src/core/lib/gpr/string_posix.cc \ + src/core/lib/gpr/string_util_windows.cc \ + src/core/lib/gpr/string_windows.cc \ + src/core/lib/gpr/subprocess_posix.cc \ + src/core/lib/gpr/subprocess_windows.cc \ + src/core/lib/gpr/sync.cc \ + src/core/lib/gpr/sync_posix.cc \ + src/core/lib/gpr/sync_windows.cc \ + src/core/lib/gpr/thd.cc \ + src/core/lib/gpr/thd_posix.cc \ + src/core/lib/gpr/thd_windows.cc \ + src/core/lib/gpr/time.cc \ + src/core/lib/gpr/time_posix.cc \ + src/core/lib/gpr/time_precise.cc \ + src/core/lib/gpr/time_windows.cc \ + src/core/lib/gpr/tls_pthread.cc \ + src/core/lib/gpr/tmpfile_msys.cc \ + src/core/lib/gpr/tmpfile_posix.cc \ + src/core/lib/gpr/tmpfile_windows.cc \ + src/core/lib/gpr/wrap_memcpy.cc \ src/core/lib/profiling/basic_timers.cc \ src/core/lib/profiling/stap_timers.cc \ - src/core/lib/support/alloc.cc \ - src/core/lib/support/arena.cc \ - src/core/lib/support/atm.cc \ - src/core/lib/support/avl.cc \ - src/core/lib/support/cmdline.cc \ - src/core/lib/support/cpu_iphone.cc \ - src/core/lib/support/cpu_linux.cc \ - src/core/lib/support/cpu_posix.cc \ - src/core/lib/support/cpu_windows.cc \ - src/core/lib/support/env_linux.cc \ - src/core/lib/support/env_posix.cc \ - src/core/lib/support/env_windows.cc \ - src/core/lib/support/fork.cc \ - src/core/lib/support/host_port.cc \ - src/core/lib/support/log.cc \ - src/core/lib/support/log_android.cc \ - src/core/lib/support/log_linux.cc \ - src/core/lib/support/log_posix.cc \ - src/core/lib/support/log_windows.cc \ - src/core/lib/support/mpscq.cc \ - src/core/lib/support/murmur_hash.cc \ - src/core/lib/support/string.cc \ - src/core/lib/support/string_posix.cc \ - src/core/lib/support/string_util_windows.cc \ - src/core/lib/support/string_windows.cc \ - src/core/lib/support/subprocess_posix.cc \ - src/core/lib/support/subprocess_windows.cc \ - src/core/lib/support/sync.cc \ - src/core/lib/support/sync_posix.cc \ - src/core/lib/support/sync_windows.cc \ - src/core/lib/support/thd.cc \ - src/core/lib/support/thd_posix.cc \ - src/core/lib/support/thd_windows.cc \ - src/core/lib/support/time.cc \ - src/core/lib/support/time_posix.cc \ - src/core/lib/support/time_precise.cc \ - src/core/lib/support/time_windows.cc \ - src/core/lib/support/tls_pthread.cc \ - src/core/lib/support/tmpfile_msys.cc \ - src/core/lib/support/tmpfile_posix.cc \ - src/core/lib/support/tmpfile_windows.cc \ - src/core/lib/support/wrap_memcpy.cc \ src/core/lib/surface/init.cc \ src/core/lib/backoff/backoff.cc \ src/core/lib/channel/channel_args.cc \ @@ -678,6 +678,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/channel) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/compression) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/debug) + PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/gpr) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/http) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/iomgr) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/json) @@ -695,7 +696,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/transport) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/security/util) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/slice) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/support) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/surface) PHP_ADD_BUILD_DIR($ext_builddir/src/core/lib/transport) PHP_ADD_BUILD_DIR($ext_builddir/src/core/plugin_registry) diff --git a/config.w32 b/config.w32 index cd3a16a465..c8003140d8 100644 --- a/config.w32 +++ b/config.w32 @@ -16,50 +16,50 @@ if (PHP_GRPC != "no") { "src\\php\\ext\\grpc\\server.c " + "src\\php\\ext\\grpc\\server_credentials.c " + "src\\php\\ext\\grpc\\timeval.c " + + "src\\core\\lib\\gpr\\alloc.cc " + + "src\\core\\lib\\gpr\\arena.cc " + + "src\\core\\lib\\gpr\\atm.cc " + + "src\\core\\lib\\gpr\\avl.cc " + + "src\\core\\lib\\gpr\\cmdline.cc " + + "src\\core\\lib\\gpr\\cpu_iphone.cc " + + "src\\core\\lib\\gpr\\cpu_linux.cc " + + "src\\core\\lib\\gpr\\cpu_posix.cc " + + "src\\core\\lib\\gpr\\cpu_windows.cc " + + "src\\core\\lib\\gpr\\env_linux.cc " + + "src\\core\\lib\\gpr\\env_posix.cc " + + "src\\core\\lib\\gpr\\env_windows.cc " + + "src\\core\\lib\\gpr\\fork.cc " + + "src\\core\\lib\\gpr\\host_port.cc " + + "src\\core\\lib\\gpr\\log.cc " + + "src\\core\\lib\\gpr\\log_android.cc " + + "src\\core\\lib\\gpr\\log_linux.cc " + + "src\\core\\lib\\gpr\\log_posix.cc " + + "src\\core\\lib\\gpr\\log_windows.cc " + + "src\\core\\lib\\gpr\\mpscq.cc " + + "src\\core\\lib\\gpr\\murmur_hash.cc " + + "src\\core\\lib\\gpr\\string.cc " + + "src\\core\\lib\\gpr\\string_posix.cc " + + "src\\core\\lib\\gpr\\string_util_windows.cc " + + "src\\core\\lib\\gpr\\string_windows.cc " + + "src\\core\\lib\\gpr\\subprocess_posix.cc " + + "src\\core\\lib\\gpr\\subprocess_windows.cc " + + "src\\core\\lib\\gpr\\sync.cc " + + "src\\core\\lib\\gpr\\sync_posix.cc " + + "src\\core\\lib\\gpr\\sync_windows.cc " + + "src\\core\\lib\\gpr\\thd.cc " + + "src\\core\\lib\\gpr\\thd_posix.cc " + + "src\\core\\lib\\gpr\\thd_windows.cc " + + "src\\core\\lib\\gpr\\time.cc " + + "src\\core\\lib\\gpr\\time_posix.cc " + + "src\\core\\lib\\gpr\\time_precise.cc " + + "src\\core\\lib\\gpr\\time_windows.cc " + + "src\\core\\lib\\gpr\\tls_pthread.cc " + + "src\\core\\lib\\gpr\\tmpfile_msys.cc " + + "src\\core\\lib\\gpr\\tmpfile_posix.cc " + + "src\\core\\lib\\gpr\\tmpfile_windows.cc " + + "src\\core\\lib\\gpr\\wrap_memcpy.cc " + "src\\core\\lib\\profiling\\basic_timers.cc " + "src\\core\\lib\\profiling\\stap_timers.cc " + - "src\\core\\lib\\support\\alloc.cc " + - "src\\core\\lib\\support\\arena.cc " + - "src\\core\\lib\\support\\atm.cc " + - "src\\core\\lib\\support\\avl.cc " + - "src\\core\\lib\\support\\cmdline.cc " + - "src\\core\\lib\\support\\cpu_iphone.cc " + - "src\\core\\lib\\support\\cpu_linux.cc " + - "src\\core\\lib\\support\\cpu_posix.cc " + - "src\\core\\lib\\support\\cpu_windows.cc " + - "src\\core\\lib\\support\\env_linux.cc " + - "src\\core\\lib\\support\\env_posix.cc " + - "src\\core\\lib\\support\\env_windows.cc " + - "src\\core\\lib\\support\\fork.cc " + - "src\\core\\lib\\support\\host_port.cc " + - "src\\core\\lib\\support\\log.cc " + - "src\\core\\lib\\support\\log_android.cc " + - "src\\core\\lib\\support\\log_linux.cc " + - "src\\core\\lib\\support\\log_posix.cc " + - "src\\core\\lib\\support\\log_windows.cc " + - "src\\core\\lib\\support\\mpscq.cc " + - "src\\core\\lib\\support\\murmur_hash.cc " + - "src\\core\\lib\\support\\string.cc " + - "src\\core\\lib\\support\\string_posix.cc " + - "src\\core\\lib\\support\\string_util_windows.cc " + - "src\\core\\lib\\support\\string_windows.cc " + - "src\\core\\lib\\support\\subprocess_posix.cc " + - "src\\core\\lib\\support\\subprocess_windows.cc " + - "src\\core\\lib\\support\\sync.cc " + - "src\\core\\lib\\support\\sync_posix.cc " + - "src\\core\\lib\\support\\sync_windows.cc " + - "src\\core\\lib\\support\\thd.cc " + - "src\\core\\lib\\support\\thd_posix.cc " + - "src\\core\\lib\\support\\thd_windows.cc " + - "src\\core\\lib\\support\\time.cc " + - "src\\core\\lib\\support\\time_posix.cc " + - "src\\core\\lib\\support\\time_precise.cc " + - "src\\core\\lib\\support\\time_windows.cc " + - "src\\core\\lib\\support\\tls_pthread.cc " + - "src\\core\\lib\\support\\tmpfile_msys.cc " + - "src\\core\\lib\\support\\tmpfile_posix.cc " + - "src\\core\\lib\\support\\tmpfile_windows.cc " + - "src\\core\\lib\\support\\wrap_memcpy.cc " + "src\\core\\lib\\surface\\init.cc " + "src\\core\\lib\\backoff\\backoff.cc " + "src\\core\\lib\\channel\\channel_args.cc " + @@ -690,6 +690,7 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\channel"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\compression"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\debug"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\gpr"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\http"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\iomgr"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\json"); @@ -708,7 +709,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\transport"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\security\\util"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\slice"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\support"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\surface"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\lib\\transport"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\plugin_registry"); diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index df5a4112a7..ccaa21194b 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -84,7 +84,7 @@ Pod::Spec.new do |s| 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', @@ -192,68 +192,68 @@ Pod::Spec.new do |s| ss.dependency 'nanopb', '~> 0.3' # To save you from scrolling, this is the last part of the podspec. - ss.source_files = 'src/core/lib/profiling/timers.h', - 'src/core/lib/support/abstract.h', - 'src/core/lib/support/arena.h', - 'src/core/lib/support/atomic.h', - 'src/core/lib/support/atomic_with_atm.h', - 'src/core/lib/support/atomic_with_std.h', - 'src/core/lib/support/env.h', - 'src/core/lib/support/fork.h', - 'src/core/lib/support/manual_constructor.h', - 'src/core/lib/support/memory.h', - 'src/core/lib/support/mpscq.h', - 'src/core/lib/support/murmur_hash.h', - 'src/core/lib/support/spinlock.h', - 'src/core/lib/support/string.h', - 'src/core/lib/support/string_windows.h', - 'src/core/lib/support/thd_internal.h', - 'src/core/lib/support/time_precise.h', - 'src/core/lib/support/tmpfile.h', + ss.source_files = 'src/core/lib/gpr++/abstract.h', + 'src/core/lib/gpr++/atomic.h', + 'src/core/lib/gpr++/atomic_with_atm.h', + 'src/core/lib/gpr++/atomic_with_std.h', + 'src/core/lib/gpr++/manual_constructor.h', + 'src/core/lib/gpr++/memory.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/fork.h', + 'src/core/lib/gpr/mpscq.h', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/thd_internal.h', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/profiling/timers.h', + 'src/core/lib/gpr/alloc.cc', + 'src/core/lib/gpr/arena.cc', + 'src/core/lib/gpr/atm.cc', + 'src/core/lib/gpr/avl.cc', + 'src/core/lib/gpr/cmdline.cc', + 'src/core/lib/gpr/cpu_iphone.cc', + 'src/core/lib/gpr/cpu_linux.cc', + 'src/core/lib/gpr/cpu_posix.cc', + 'src/core/lib/gpr/cpu_windows.cc', + 'src/core/lib/gpr/env_linux.cc', + 'src/core/lib/gpr/env_posix.cc', + 'src/core/lib/gpr/env_windows.cc', + 'src/core/lib/gpr/fork.cc', + 'src/core/lib/gpr/host_port.cc', + 'src/core/lib/gpr/log.cc', + 'src/core/lib/gpr/log_android.cc', + 'src/core/lib/gpr/log_linux.cc', + 'src/core/lib/gpr/log_posix.cc', + 'src/core/lib/gpr/log_windows.cc', + 'src/core/lib/gpr/mpscq.cc', + 'src/core/lib/gpr/murmur_hash.cc', + 'src/core/lib/gpr/string.cc', + 'src/core/lib/gpr/string_posix.cc', + 'src/core/lib/gpr/string_util_windows.cc', + 'src/core/lib/gpr/string_windows.cc', + 'src/core/lib/gpr/subprocess_posix.cc', + 'src/core/lib/gpr/subprocess_windows.cc', + 'src/core/lib/gpr/sync.cc', + 'src/core/lib/gpr/sync_posix.cc', + 'src/core/lib/gpr/sync_windows.cc', + 'src/core/lib/gpr/thd.cc', + 'src/core/lib/gpr/thd_posix.cc', + 'src/core/lib/gpr/thd_windows.cc', + 'src/core/lib/gpr/time.cc', + 'src/core/lib/gpr/time_posix.cc', + 'src/core/lib/gpr/time_precise.cc', + 'src/core/lib/gpr/time_windows.cc', + 'src/core/lib/gpr/tls_pthread.cc', + 'src/core/lib/gpr/tmpfile_msys.cc', + 'src/core/lib/gpr/tmpfile_posix.cc', + 'src/core/lib/gpr/tmpfile_windows.cc', + 'src/core/lib/gpr/wrap_memcpy.cc', 'src/core/lib/profiling/basic_timers.cc', 'src/core/lib/profiling/stap_timers.cc', - 'src/core/lib/support/alloc.cc', - 'src/core/lib/support/arena.cc', - 'src/core/lib/support/atm.cc', - 'src/core/lib/support/avl.cc', - 'src/core/lib/support/cmdline.cc', - 'src/core/lib/support/cpu_iphone.cc', - 'src/core/lib/support/cpu_linux.cc', - 'src/core/lib/support/cpu_posix.cc', - 'src/core/lib/support/cpu_windows.cc', - 'src/core/lib/support/env_linux.cc', - 'src/core/lib/support/env_posix.cc', - 'src/core/lib/support/env_windows.cc', - 'src/core/lib/support/fork.cc', - 'src/core/lib/support/host_port.cc', - 'src/core/lib/support/log.cc', - 'src/core/lib/support/log_android.cc', - 'src/core/lib/support/log_linux.cc', - 'src/core/lib/support/log_posix.cc', - 'src/core/lib/support/log_windows.cc', - 'src/core/lib/support/mpscq.cc', - 'src/core/lib/support/murmur_hash.cc', - 'src/core/lib/support/string.cc', - 'src/core/lib/support/string_posix.cc', - 'src/core/lib/support/string_util_windows.cc', - 'src/core/lib/support/string_windows.cc', - 'src/core/lib/support/subprocess_posix.cc', - 'src/core/lib/support/subprocess_windows.cc', - 'src/core/lib/support/sync.cc', - 'src/core/lib/support/sync_posix.cc', - 'src/core/lib/support/sync_windows.cc', - 'src/core/lib/support/thd.cc', - 'src/core/lib/support/thd_posix.cc', - 'src/core/lib/support/thd_windows.cc', - 'src/core/lib/support/time.cc', - 'src/core/lib/support/time_posix.cc', - 'src/core/lib/support/time_precise.cc', - 'src/core/lib/support/time_windows.cc', - 'src/core/lib/support/tls_pthread.cc', - 'src/core/lib/support/tmpfile_msys.cc', - 'src/core/lib/support/tmpfile_posix.cc', - 'src/core/lib/support/tmpfile_windows.cc', - 'src/core/lib/support/wrap_memcpy.cc', 'src/core/ext/transport/chttp2/transport/bin_decoder.h', 'src/core/ext/transport/chttp2/transport/bin_encoder.h', 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', @@ -344,6 +344,11 @@ Pod::Spec.new do |s| 'src/core/lib/compression/stream_compression_identity.h', 'src/core/lib/debug/stats.h', 'src/core/lib/debug/stats_data.h', + 'src/core/lib/gpr++/debug_location.h', + 'src/core/lib/gpr++/inlined_vector.h', + 'src/core/lib/gpr++/orphanable.h', + 'src/core/lib/gpr++/ref_counted.h', + 'src/core/lib/gpr++/ref_counted_ptr.h', 'src/core/lib/http/format_request.h', 'src/core/lib/http/httpcli.h', 'src/core/lib/http/parser.h', @@ -419,11 +424,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_hash_table.h', 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/support/debug_location.h', - 'src/core/lib/support/orphanable.h', - 'src/core/lib/support/ref_counted.h', - 'src/core/lib/support/ref_counted_ptr.h', - 'src/core/lib/support/vector.h', 'src/core/lib/surface/alarm_internal.h', 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/call.h', @@ -718,24 +718,24 @@ Pod::Spec.new do |s| 'src/core/ext/filters/workarounds/workaround_utils.cc', 'src/core/plugin_registry/grpc_plugin_registry.cc' - ss.private_header_files = 'src/core/lib/profiling/timers.h', - 'src/core/lib/support/abstract.h', - 'src/core/lib/support/arena.h', - 'src/core/lib/support/atomic.h', - 'src/core/lib/support/atomic_with_atm.h', - 'src/core/lib/support/atomic_with_std.h', - 'src/core/lib/support/env.h', - 'src/core/lib/support/fork.h', - 'src/core/lib/support/manual_constructor.h', - 'src/core/lib/support/memory.h', - 'src/core/lib/support/mpscq.h', - 'src/core/lib/support/murmur_hash.h', - 'src/core/lib/support/spinlock.h', - 'src/core/lib/support/string.h', - 'src/core/lib/support/string_windows.h', - 'src/core/lib/support/thd_internal.h', - 'src/core/lib/support/time_precise.h', - 'src/core/lib/support/tmpfile.h', + ss.private_header_files = 'src/core/lib/gpr++/abstract.h', + 'src/core/lib/gpr++/atomic.h', + 'src/core/lib/gpr++/atomic_with_atm.h', + 'src/core/lib/gpr++/atomic_with_std.h', + 'src/core/lib/gpr++/manual_constructor.h', + 'src/core/lib/gpr++/memory.h', + 'src/core/lib/gpr/arena.h', + 'src/core/lib/gpr/env.h', + 'src/core/lib/gpr/fork.h', + 'src/core/lib/gpr/mpscq.h', + 'src/core/lib/gpr/murmur_hash.h', + 'src/core/lib/gpr/spinlock.h', + 'src/core/lib/gpr/string.h', + 'src/core/lib/gpr/string_windows.h', + 'src/core/lib/gpr/thd_internal.h', + 'src/core/lib/gpr/time_precise.h', + 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/profiling/timers.h', 'src/core/ext/transport/chttp2/transport/bin_decoder.h', 'src/core/ext/transport/chttp2/transport/bin_encoder.h', 'src/core/ext/transport/chttp2/transport/chttp2_transport.h', @@ -826,6 +826,11 @@ Pod::Spec.new do |s| 'src/core/lib/compression/stream_compression_identity.h', 'src/core/lib/debug/stats.h', 'src/core/lib/debug/stats_data.h', + 'src/core/lib/gpr++/debug_location.h', + 'src/core/lib/gpr++/inlined_vector.h', + 'src/core/lib/gpr++/orphanable.h', + 'src/core/lib/gpr++/ref_counted.h', + 'src/core/lib/gpr++/ref_counted_ptr.h', 'src/core/lib/http/format_request.h', 'src/core/lib/http/httpcli.h', 'src/core/lib/http/parser.h', @@ -901,11 +906,6 @@ Pod::Spec.new do |s| 'src/core/lib/slice/slice_hash_table.h', 'src/core/lib/slice/slice_internal.h', 'src/core/lib/slice/slice_string_helpers.h', - 'src/core/lib/support/debug_location.h', - 'src/core/lib/support/orphanable.h', - 'src/core/lib/support/ref_counted.h', - 'src/core/lib/support/ref_counted_ptr.h', - 'src/core/lib/support/vector.h', 'src/core/lib/surface/alarm_internal.h', 'src/core/lib/surface/api_trace.h', 'src/core/lib/surface/call.h', diff --git a/grpc.gemspec b/grpc.gemspec index f8afaa5803..5b1aebeaaa 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -83,68 +83,68 @@ Gem::Specification.new do |s| s.files += %w( include/grpc/impl/codegen/sync_generic.h ) s.files += %w( include/grpc/impl/codegen/sync_posix.h ) s.files += %w( include/grpc/impl/codegen/sync_windows.h ) + s.files += %w( src/core/lib/gpr++/abstract.h ) + s.files += %w( src/core/lib/gpr++/atomic.h ) + s.files += %w( src/core/lib/gpr++/atomic_with_atm.h ) + s.files += %w( src/core/lib/gpr++/atomic_with_std.h ) + s.files += %w( src/core/lib/gpr++/manual_constructor.h ) + s.files += %w( src/core/lib/gpr++/memory.h ) + s.files += %w( src/core/lib/gpr/arena.h ) + s.files += %w( src/core/lib/gpr/env.h ) + s.files += %w( src/core/lib/gpr/fork.h ) + s.files += %w( src/core/lib/gpr/mpscq.h ) + s.files += %w( src/core/lib/gpr/murmur_hash.h ) + s.files += %w( src/core/lib/gpr/spinlock.h ) + s.files += %w( src/core/lib/gpr/string.h ) + s.files += %w( src/core/lib/gpr/string_windows.h ) + s.files += %w( src/core/lib/gpr/thd_internal.h ) + s.files += %w( src/core/lib/gpr/time_precise.h ) + s.files += %w( src/core/lib/gpr/tmpfile.h ) s.files += %w( src/core/lib/profiling/timers.h ) - s.files += %w( src/core/lib/support/abstract.h ) - s.files += %w( src/core/lib/support/arena.h ) - s.files += %w( src/core/lib/support/atomic.h ) - s.files += %w( src/core/lib/support/atomic_with_atm.h ) - s.files += %w( src/core/lib/support/atomic_with_std.h ) - s.files += %w( src/core/lib/support/env.h ) - s.files += %w( src/core/lib/support/fork.h ) - s.files += %w( src/core/lib/support/manual_constructor.h ) - s.files += %w( src/core/lib/support/memory.h ) - s.files += %w( src/core/lib/support/mpscq.h ) - s.files += %w( src/core/lib/support/murmur_hash.h ) - s.files += %w( src/core/lib/support/spinlock.h ) - s.files += %w( src/core/lib/support/string.h ) - s.files += %w( src/core/lib/support/string_windows.h ) - s.files += %w( src/core/lib/support/thd_internal.h ) - s.files += %w( src/core/lib/support/time_precise.h ) - s.files += %w( src/core/lib/support/tmpfile.h ) + s.files += %w( src/core/lib/gpr/alloc.cc ) + s.files += %w( src/core/lib/gpr/arena.cc ) + s.files += %w( src/core/lib/gpr/atm.cc ) + s.files += %w( src/core/lib/gpr/avl.cc ) + s.files += %w( src/core/lib/gpr/cmdline.cc ) + s.files += %w( src/core/lib/gpr/cpu_iphone.cc ) + s.files += %w( src/core/lib/gpr/cpu_linux.cc ) + s.files += %w( src/core/lib/gpr/cpu_posix.cc ) + s.files += %w( src/core/lib/gpr/cpu_windows.cc ) + s.files += %w( src/core/lib/gpr/env_linux.cc ) + s.files += %w( src/core/lib/gpr/env_posix.cc ) + s.files += %w( src/core/lib/gpr/env_windows.cc ) + s.files += %w( src/core/lib/gpr/fork.cc ) + s.files += %w( src/core/lib/gpr/host_port.cc ) + s.files += %w( src/core/lib/gpr/log.cc ) + s.files += %w( src/core/lib/gpr/log_android.cc ) + s.files += %w( src/core/lib/gpr/log_linux.cc ) + s.files += %w( src/core/lib/gpr/log_posix.cc ) + s.files += %w( src/core/lib/gpr/log_windows.cc ) + s.files += %w( src/core/lib/gpr/mpscq.cc ) + s.files += %w( src/core/lib/gpr/murmur_hash.cc ) + s.files += %w( src/core/lib/gpr/string.cc ) + s.files += %w( src/core/lib/gpr/string_posix.cc ) + s.files += %w( src/core/lib/gpr/string_util_windows.cc ) + s.files += %w( src/core/lib/gpr/string_windows.cc ) + s.files += %w( src/core/lib/gpr/subprocess_posix.cc ) + s.files += %w( src/core/lib/gpr/subprocess_windows.cc ) + s.files += %w( src/core/lib/gpr/sync.cc ) + s.files += %w( src/core/lib/gpr/sync_posix.cc ) + s.files += %w( src/core/lib/gpr/sync_windows.cc ) + s.files += %w( src/core/lib/gpr/thd.cc ) + s.files += %w( src/core/lib/gpr/thd_posix.cc ) + s.files += %w( src/core/lib/gpr/thd_windows.cc ) + s.files += %w( src/core/lib/gpr/time.cc ) + s.files += %w( src/core/lib/gpr/time_posix.cc ) + s.files += %w( src/core/lib/gpr/time_precise.cc ) + s.files += %w( src/core/lib/gpr/time_windows.cc ) + s.files += %w( src/core/lib/gpr/tls_pthread.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_msys.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_posix.cc ) + s.files += %w( src/core/lib/gpr/tmpfile_windows.cc ) + s.files += %w( src/core/lib/gpr/wrap_memcpy.cc ) s.files += %w( src/core/lib/profiling/basic_timers.cc ) s.files += %w( src/core/lib/profiling/stap_timers.cc ) - s.files += %w( src/core/lib/support/alloc.cc ) - s.files += %w( src/core/lib/support/arena.cc ) - s.files += %w( src/core/lib/support/atm.cc ) - s.files += %w( src/core/lib/support/avl.cc ) - s.files += %w( src/core/lib/support/cmdline.cc ) - s.files += %w( src/core/lib/support/cpu_iphone.cc ) - s.files += %w( src/core/lib/support/cpu_linux.cc ) - s.files += %w( src/core/lib/support/cpu_posix.cc ) - s.files += %w( src/core/lib/support/cpu_windows.cc ) - s.files += %w( src/core/lib/support/env_linux.cc ) - s.files += %w( src/core/lib/support/env_posix.cc ) - s.files += %w( src/core/lib/support/env_windows.cc ) - s.files += %w( src/core/lib/support/fork.cc ) - s.files += %w( src/core/lib/support/host_port.cc ) - s.files += %w( src/core/lib/support/log.cc ) - s.files += %w( src/core/lib/support/log_android.cc ) - s.files += %w( src/core/lib/support/log_linux.cc ) - s.files += %w( src/core/lib/support/log_posix.cc ) - s.files += %w( src/core/lib/support/log_windows.cc ) - s.files += %w( src/core/lib/support/mpscq.cc ) - s.files += %w( src/core/lib/support/murmur_hash.cc ) - s.files += %w( src/core/lib/support/string.cc ) - s.files += %w( src/core/lib/support/string_posix.cc ) - s.files += %w( src/core/lib/support/string_util_windows.cc ) - s.files += %w( src/core/lib/support/string_windows.cc ) - s.files += %w( src/core/lib/support/subprocess_posix.cc ) - s.files += %w( src/core/lib/support/subprocess_windows.cc ) - s.files += %w( src/core/lib/support/sync.cc ) - s.files += %w( src/core/lib/support/sync_posix.cc ) - s.files += %w( src/core/lib/support/sync_windows.cc ) - s.files += %w( src/core/lib/support/thd.cc ) - s.files += %w( src/core/lib/support/thd_posix.cc ) - s.files += %w( src/core/lib/support/thd_windows.cc ) - s.files += %w( src/core/lib/support/time.cc ) - s.files += %w( src/core/lib/support/time_posix.cc ) - s.files += %w( src/core/lib/support/time_precise.cc ) - s.files += %w( src/core/lib/support/time_windows.cc ) - s.files += %w( src/core/lib/support/tls_pthread.cc ) - s.files += %w( src/core/lib/support/tmpfile_msys.cc ) - s.files += %w( src/core/lib/support/tmpfile_posix.cc ) - s.files += %w( src/core/lib/support/tmpfile_windows.cc ) - s.files += %w( src/core/lib/support/wrap_memcpy.cc ) s.files += %w( include/grpc/impl/codegen/byte_buffer.h ) s.files += %w( include/grpc/impl/codegen/byte_buffer_reader.h ) s.files += %w( include/grpc/impl/codegen/compression_types.h ) @@ -270,6 +270,11 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/compression/stream_compression_identity.h ) s.files += %w( src/core/lib/debug/stats.h ) s.files += %w( src/core/lib/debug/stats_data.h ) + s.files += %w( src/core/lib/gpr++/debug_location.h ) + s.files += %w( src/core/lib/gpr++/inlined_vector.h ) + s.files += %w( src/core/lib/gpr++/orphanable.h ) + s.files += %w( src/core/lib/gpr++/ref_counted.h ) + s.files += %w( src/core/lib/gpr++/ref_counted_ptr.h ) s.files += %w( src/core/lib/http/format_request.h ) s.files += %w( src/core/lib/http/httpcli.h ) s.files += %w( src/core/lib/http/parser.h ) @@ -345,11 +350,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/slice/slice_hash_table.h ) s.files += %w( src/core/lib/slice/slice_internal.h ) s.files += %w( src/core/lib/slice/slice_string_helpers.h ) - s.files += %w( src/core/lib/support/debug_location.h ) - s.files += %w( src/core/lib/support/orphanable.h ) - s.files += %w( src/core/lib/support/ref_counted.h ) - s.files += %w( src/core/lib/support/ref_counted_ptr.h ) - s.files += %w( src/core/lib/support/vector.h ) s.files += %w( src/core/lib/surface/alarm_internal.h ) s.files += %w( src/core/lib/surface/api_trace.h ) s.files += %w( src/core/lib/surface/call.h ) diff --git a/grpc.gyp b/grpc.gyp index 281fbfa8a6..49dcdf93a2 100644 --- a/grpc.gyp +++ b/grpc.gyp @@ -161,50 +161,50 @@ 'dependencies': [ ], 'sources': [ + 'src/core/lib/gpr/alloc.cc', + 'src/core/lib/gpr/arena.cc', + 'src/core/lib/gpr/atm.cc', + 'src/core/lib/gpr/avl.cc', + 'src/core/lib/gpr/cmdline.cc', + 'src/core/lib/gpr/cpu_iphone.cc', + 'src/core/lib/gpr/cpu_linux.cc', + 'src/core/lib/gpr/cpu_posix.cc', + 'src/core/lib/gpr/cpu_windows.cc', + 'src/core/lib/gpr/env_linux.cc', + 'src/core/lib/gpr/env_posix.cc', + 'src/core/lib/gpr/env_windows.cc', + 'src/core/lib/gpr/fork.cc', + 'src/core/lib/gpr/host_port.cc', + 'src/core/lib/gpr/log.cc', + 'src/core/lib/gpr/log_android.cc', + 'src/core/lib/gpr/log_linux.cc', + 'src/core/lib/gpr/log_posix.cc', + 'src/core/lib/gpr/log_windows.cc', + 'src/core/lib/gpr/mpscq.cc', + 'src/core/lib/gpr/murmur_hash.cc', + 'src/core/lib/gpr/string.cc', + 'src/core/lib/gpr/string_posix.cc', + 'src/core/lib/gpr/string_util_windows.cc', + 'src/core/lib/gpr/string_windows.cc', + 'src/core/lib/gpr/subprocess_posix.cc', + 'src/core/lib/gpr/subprocess_windows.cc', + 'src/core/lib/gpr/sync.cc', + 'src/core/lib/gpr/sync_posix.cc', + 'src/core/lib/gpr/sync_windows.cc', + 'src/core/lib/gpr/thd.cc', + 'src/core/lib/gpr/thd_posix.cc', + 'src/core/lib/gpr/thd_windows.cc', + 'src/core/lib/gpr/time.cc', + 'src/core/lib/gpr/time_posix.cc', + 'src/core/lib/gpr/time_precise.cc', + 'src/core/lib/gpr/time_windows.cc', + 'src/core/lib/gpr/tls_pthread.cc', + 'src/core/lib/gpr/tmpfile_msys.cc', + 'src/core/lib/gpr/tmpfile_posix.cc', + 'src/core/lib/gpr/tmpfile_windows.cc', + 'src/core/lib/gpr/wrap_memcpy.cc', 'src/core/lib/profiling/basic_timers.cc', 'src/core/lib/profiling/stap_timers.cc', - 'src/core/lib/support/alloc.cc', - 'src/core/lib/support/arena.cc', - 'src/core/lib/support/atm.cc', - 'src/core/lib/support/avl.cc', - 'src/core/lib/support/cmdline.cc', - 'src/core/lib/support/cpu_iphone.cc', - 'src/core/lib/support/cpu_linux.cc', - 'src/core/lib/support/cpu_posix.cc', - 'src/core/lib/support/cpu_windows.cc', - 'src/core/lib/support/env_linux.cc', - 'src/core/lib/support/env_posix.cc', - 'src/core/lib/support/env_windows.cc', - 'src/core/lib/support/fork.cc', - 'src/core/lib/support/host_port.cc', - 'src/core/lib/support/log.cc', - 'src/core/lib/support/log_android.cc', - 'src/core/lib/support/log_linux.cc', - 'src/core/lib/support/log_posix.cc', - 'src/core/lib/support/log_windows.cc', - 'src/core/lib/support/mpscq.cc', - 'src/core/lib/support/murmur_hash.cc', - 'src/core/lib/support/string.cc', - 'src/core/lib/support/string_posix.cc', - 'src/core/lib/support/string_util_windows.cc', - 'src/core/lib/support/string_windows.cc', - 'src/core/lib/support/subprocess_posix.cc', - 'src/core/lib/support/subprocess_windows.cc', - 'src/core/lib/support/sync.cc', - 'src/core/lib/support/sync_posix.cc', - 'src/core/lib/support/sync_windows.cc', - 'src/core/lib/support/thd.cc', - 'src/core/lib/support/thd_posix.cc', - 'src/core/lib/support/thd_windows.cc', - 'src/core/lib/support/time.cc', - 'src/core/lib/support/time_posix.cc', - 'src/core/lib/support/time_precise.cc', - 'src/core/lib/support/time_windows.cc', - 'src/core/lib/support/tls_pthread.cc', - 'src/core/lib/support/tmpfile_msys.cc', - 'src/core/lib/support/tmpfile_posix.cc', - 'src/core/lib/support/tmpfile_windows.cc', - 'src/core/lib/support/wrap_memcpy.cc', ], }, { diff --git a/package.xml b/package.xml index 8c590348b6..f1282964c2 100644 --- a/package.xml +++ b/package.xml @@ -95,68 +95,68 @@ + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -282,6 +282,11 @@ + + + + + @@ -357,11 +362,6 @@ - - - - - diff --git a/src/core/ext/filters/client_channel/backup_poller.cc b/src/core/ext/filters/client_channel/backup_poller.cc index 4ee5e9c109..906a72b662 100644 --- a/src/core/ext/filters/client_channel/backup_poller.cc +++ b/src/core/ext/filters/client_channel/backup_poller.cc @@ -23,11 +23,11 @@ #include #include #include "src/core/ext/filters/client_channel/client_channel.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/timer.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/completion_queue.h" diff --git a/src/core/ext/filters/client_channel/client_channel.cc b/src/core/ext/filters/client_channel/client_channel.cc index bb29f65af9..a8a7a37be0 100644 --- a/src/core/ext/filters/client_channel/client_channel.cc +++ b/src/core/ext/filters/client_channel/client_channel.cc @@ -41,12 +41,12 @@ #include "src/core/ext/filters/deadline/deadline_filter.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/connected_channel.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata.h" diff --git a/src/core/ext/filters/client_channel/http_connect_handshaker.cc b/src/core/ext/filters/client_channel/http_connect_handshaker.cc index 556a3bc6a1..6bfd038887 100644 --- a/src/core/ext/filters/client_channel/http_connect_handshaker.cc +++ b/src/core/ext/filters/client_channel/http_connect_handshaker.cc @@ -30,11 +30,11 @@ #include "src/core/ext/filters/client_channel/uri_parser.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/handshaker_registry.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/format_request.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" typedef struct http_connect_handshaker { // Base class. Must be first. diff --git a/src/core/ext/filters/client_channel/http_proxy.cc b/src/core/ext/filters/client_channel/http_proxy.cc index 2eafeee702..037c65822a 100644 --- a/src/core/ext/filters/client_channel/http_proxy.cc +++ b/src/core/ext/filters/client_channel/http_proxy.cc @@ -30,9 +30,9 @@ #include "src/core/ext/filters/client_channel/proxy_mapper_registry.h" #include "src/core/ext/filters/client_channel/uri_parser.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/b64.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" /** * Parses the 'http_proxy' env var and returns the proxy hostname to resolve or diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index 0cc0cb59c3..e19726efb3 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -20,8 +20,8 @@ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_H #include "src/core/ext/filters/client_channel/subchannel.h" +#include "src/core/lib/gpr++/ref_counted_ptr.h" #include "src/core/lib/iomgr/polling_entity.h" -#include "src/core/lib/support/ref_counted_ptr.h" #include "src/core/lib/transport/connectivity_state.h" /** A load balancing policy: specified by a vtable and a struct (which diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index a8c5fb9c1b..eb5ced4c20 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -106,6 +106,8 @@ #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -113,8 +115,6 @@ #include "src/core/lib/slice/slice_hash_table.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/manual_constructor.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_init.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc index a8ecea4212..1e7f34bdc7 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.cc @@ -22,8 +22,8 @@ #include "src/core/ext/filters/client_channel/client_channel.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/string.h" grpc_channel* grpc_lb_policy_grpclb_create_lb_channel( const char* lb_service_target_addresses, diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc index 76bcddf945..15233d371c 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc @@ -22,11 +22,11 @@ #include "src/core/ext/filters/client_channel/client_channel.h" #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/transport/lb_targets_info.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" grpc_channel* grpc_lb_policy_grpclb_create_lb_channel( const char* lb_service_target_addresses, diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index 5a36acaa57..e217a0b0c0 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -34,9 +34,9 @@ #include "src/core/ext/filters/client_channel/subchannel_index.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr++/ref_counted_ptr.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/ref_counted_ptr.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/static_metadata.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index f146c724e0..f4e345def6 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -22,7 +22,7 @@ #include "src/core/ext/filters/client_channel/lb_policy_registry.h" #include "src/core/ext/filters/client_channel/subchannel.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/support/ref_counted_ptr.h" +#include "src/core/lib/gpr++/ref_counted_ptr.h" #include "src/core/lib/transport/connectivity_state.h" // TODO(roth): This code is intended to be shared between pick_first and diff --git a/src/core/ext/filters/client_channel/lb_policy_registry.cc b/src/core/ext/filters/client_channel/lb_policy_registry.cc index edd0330c6a..8414504e8f 100644 --- a/src/core/ext/filters/client_channel/lb_policy_registry.cc +++ b/src/core/ext/filters/client_channel/lb_policy_registry.cc @@ -20,7 +20,7 @@ #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #define MAX_POLICIES 10 diff --git a/src/core/ext/filters/client_channel/parse_address.cc b/src/core/ext/filters/client_channel/parse_address.cc index 39b1237c77..c3309e36a3 100644 --- a/src/core/ext/filters/client_channel/parse_address.cc +++ b/src/core/ext/filters/client_channel/parse_address.cc @@ -29,7 +29,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #ifdef GRPC_HAVE_UNIX_SOCKET diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 4659a5f3ed..7ea3cdd6e1 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -34,14 +34,14 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/gethostname.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/json/json.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/manual_constructor.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/service_config.h" #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1 diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc index 40e264504c..2eb2a9b59d 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc @@ -30,10 +30,10 @@ #include #include #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/string.h" typedef struct fd_node { /** the owner of this fd node */ diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc index 3a870b2d06..2b35bdb605 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc @@ -36,12 +36,12 @@ #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/gpr/string.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" static gpr_once g_basic_init = GPR_ONCE_INIT; static gpr_mu g_init_mu; diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index 1c2cfc08e7..93a1fe87a2 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -29,12 +29,12 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/manual_constructor.h" -#include "src/core/lib/support/string.h" #define GRPC_DNS_INITIAL_CONNECT_BACKOFF_SECONDS 1 #define GRPC_DNS_RECONNECT_BACKOFF_MULTIPLIER 1.6 diff --git a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc index fe3ad1403c..eaa5e6ac49 100644 --- a/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc @@ -32,13 +32,13 @@ #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" diff --git a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc index 7d1e283fa3..99ad78e23c 100644 --- a/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc @@ -30,12 +30,12 @@ #include "src/core/ext/filters/client_channel/parse_address.h" #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" typedef struct { /** base class: must be first */ diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index 5b8a14b9e7..fe4fcbbb7d 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -37,12 +37,12 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/connected_channel.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr++/debug_location.h" +#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/debug_location.h" -#include "src/core/lib/support/manual_constructor.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel_init.h" #include "src/core/lib/transport/connectivity_state.h" diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index 3bcc5c2432..f2a5c1e273 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -21,10 +21,10 @@ #include "src/core/ext/filters/client_channel/connector.h" #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/gpr++/ref_counted.h" +#include "src/core/lib/gpr++/ref_counted_ptr.h" +#include "src/core/lib/gpr/arena.h" #include "src/core/lib/iomgr/polling_entity.h" -#include "src/core/lib/support/arena.h" -#include "src/core/lib/support/ref_counted.h" -#include "src/core/lib/support/ref_counted_ptr.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata.h" diff --git a/src/core/ext/filters/client_channel/uri_parser.cc b/src/core/ext/filters/client_channel/uri_parser.cc index 3428f4b54c..c5f2d6822c 100644 --- a/src/core/ext/filters/client_channel/uri_parser.cc +++ b/src/core/ext/filters/client_channel/uri_parser.cc @@ -26,10 +26,10 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/percent_encoding.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" /** a size_t default value... maps to all 1's */ #define NOT_SET (~(size_t)0) diff --git a/src/core/ext/filters/http/client/http_client_filter.cc b/src/core/ext/filters/http/client/http_client_filter.cc index 6dbd8c2a6d..5584d50018 100644 --- a/src/core/ext/filters/http/client/http_client_filter.cc +++ b/src/core/ext/filters/http/client/http_client_filter.cc @@ -20,12 +20,12 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/b64.h" #include "src/core/lib/slice/percent_encoding.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/static_metadata.h" #include "src/core/lib/transport/transport_impl.h" diff --git a/src/core/ext/filters/http/message_compress/message_compress_filter.cc b/src/core/ext/filters/http/message_compress/message_compress_filter.cc index 92d1716200..d0b9750497 100644 --- a/src/core/ext/filters/http/message_compress/message_compress_filter.cc +++ b/src/core/ext/filters/http/message_compress/message_compress_filter.cc @@ -28,10 +28,10 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/compression/algorithm_metadata.h" #include "src/core/lib/compression/message_compress.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/transport/static_metadata.h" diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index 3cb7b136c0..8d76c4a837 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -26,7 +26,7 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack_builder.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/channel_init.h" #include "src/core/lib/transport/service_config.h" diff --git a/src/core/ext/transport/chttp2/transport/bin_decoder.cc b/src/core/ext/transport/chttp2/transport/bin_decoder.cc index 984cd4ca78..74778ac046 100644 --- a/src/core/ext/transport/chttp2/transport/bin_decoder.cc +++ b/src/core/ext/transport/chttp2/transport/bin_decoder.cc @@ -19,9 +19,9 @@ #include "src/core/ext/transport/chttp2/transport/bin_decoder.h" #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" static uint8_t decode_table[] = { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, diff --git a/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc b/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc index 3aca61fdac..a69908116a 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc @@ -18,7 +18,7 @@ #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/transport/metadata.h" void grpc_chttp2_plugin_init(void) { diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index 835de6aa0f..e067b696a1 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -38,14 +38,14 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/compression/stream_compression.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/error_utils.h" #include "src/core/lib/transport/http2_errors.h" #include "src/core/lib/transport/static_metadata.h" diff --git a/src/core/ext/transport/chttp2/transport/flow_control.cc b/src/core/ext/transport/chttp2/transport/flow_control.cc index 3013db23f7..581241d392 100644 --- a/src/core/ext/transport/chttp2/transport/flow_control.cc +++ b/src/core/ext/transport/chttp2/transport/flow_control.cc @@ -29,7 +29,7 @@ #include #include "src/core/ext/transport/chttp2/transport/internal.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" grpc_core::TraceFlag grpc_flowctl_trace(false, "flowctl"); diff --git a/src/core/ext/transport/chttp2/transport/flow_control.h b/src/core/ext/transport/chttp2/transport/flow_control.h index 38b9f50c8d..7e83ea05cd 100644 --- a/src/core/ext/transport/chttp2/transport/flow_control.h +++ b/src/core/ext/transport/chttp2/transport/flow_control.h @@ -24,8 +24,8 @@ #include #include "src/core/ext/transport/chttp2/transport/http2_settings.h" -#include "src/core/lib/support/abstract.h" -#include "src/core/lib/support/manual_constructor.h" +#include "src/core/lib/gpr++/abstract.h" +#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/transport/bdp_estimator.h" #include "src/core/lib/transport/pid_controller.h" diff --git a/src/core/ext/transport/chttp2/transport/frame_data.cc b/src/core/ext/transport/chttp2/transport/frame_data.cc index 9b3a6acc9e..043b80a3cb 100644 --- a/src/core/ext/transport/chttp2/transport/frame_data.cc +++ b/src/core/ext/transport/chttp2/transport/frame_data.cc @@ -25,9 +25,9 @@ #include #include #include "src/core/ext/transport/chttp2/transport/internal.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/transport.h" grpc_error* grpc_chttp2_data_parser_init(grpc_chttp2_data_parser* parser) { diff --git a/src/core/ext/transport/chttp2/transport/hpack_parser.cc b/src/core/ext/transport/chttp2/transport/hpack_parser.cc index a395ab234c..ebee5913cb 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_parser.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_parser.cc @@ -31,10 +31,10 @@ #include "src/core/ext/transport/chttp2/transport/bin_encoder.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/http2_errors.h" typedef enum { diff --git a/src/core/ext/transport/chttp2/transport/hpack_table.cc b/src/core/ext/transport/chttp2/transport/hpack_table.cc index c325465daa..9fad158d27 100644 --- a/src/core/ext/transport/chttp2/transport/hpack_table.cc +++ b/src/core/ext/transport/chttp2/transport/hpack_table.cc @@ -26,7 +26,7 @@ #include #include "src/core/lib/debug/trace.h" -#include "src/core/lib/support/murmur_hash.h" +#include "src/core/lib/gpr/murmur_hash.h" extern grpc_core::TraceFlag grpc_http_trace; diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index 8852d9ee2b..de901f0ce8 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -35,10 +35,10 @@ #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" #include "src/core/ext/transport/chttp2/transport/stream_map.h" #include "src/core/lib/compression/stream_compression.h" +#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/timer.h" -#include "src/core/lib/support/manual_constructor.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/transport_impl.h" diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.cc b/src/core/ext/transport/cronet/transport/cronet_transport.cc index 5723da5f9d..5b1c6ab3f9 100644 --- a/src/core/ext/transport/cronet/transport/cronet_transport.cc +++ b/src/core/ext/transport/cronet/transport/cronet_transport.cc @@ -28,11 +28,11 @@ #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" #include "src/core/ext/transport/cronet/transport/cronet_transport.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/transport/static_metadata.h" diff --git a/src/core/lib/channel/channel_args.cc b/src/core/lib/channel/channel_args.cc index 578475b248..634286d403 100644 --- a/src/core/lib/channel/channel_args.cc +++ b/src/core/lib/channel/channel_args.cc @@ -29,7 +29,7 @@ #include #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" static grpc_arg copy_arg(const grpc_arg* src) { grpc_arg dst; diff --git a/src/core/lib/channel/channel_stack.h b/src/core/lib/channel/channel_stack.h index 716866be26..b9f9748001 100644 --- a/src/core/lib/channel/channel_stack.h +++ b/src/core/lib/channel/channel_stack.h @@ -40,9 +40,9 @@ #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/arena.h" #include "src/core/lib/iomgr/call_combiner.h" #include "src/core/lib/iomgr/polling_entity.h" -#include "src/core/lib/support/arena.h" #include "src/core/lib/transport/transport.h" typedef struct grpc_channel_element grpc_channel_element; diff --git a/src/core/lib/channel/connected_channel.cc b/src/core/lib/channel/connected_channel.cc index 9d07cfff4e..fb26bdf586 100644 --- a/src/core/lib/channel/connected_channel.cc +++ b/src/core/lib/channel/connected_channel.cc @@ -26,8 +26,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/transport.h" #define MAX_BUFFER_LENGTH 8192 diff --git a/src/core/lib/debug/stats.cc b/src/core/lib/debug/stats.cc index 0b39b2b1e7..465c76114d 100644 --- a/src/core/lib/debug/stats.cc +++ b/src/core/lib/debug/stats.cc @@ -25,7 +25,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" grpc_stats_data* grpc_stats_per_cpu_storage = nullptr; static size_t g_num_cores; diff --git a/src/core/lib/debug/trace.cc b/src/core/lib/debug/trace.cc index a76c1afb4c..d870bbc5e7 100644 --- a/src/core/lib/debug/trace.cc +++ b/src/core/lib/debug/trace.cc @@ -23,7 +23,7 @@ #include #include #include -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" int grpc_tracer_set_enabled(const char* name, int enabled); diff --git a/src/core/lib/gpr++/README.md b/src/core/lib/gpr++/README.md new file mode 100644 index 0000000000..eab018bb31 --- /dev/null +++ b/src/core/lib/gpr++/README.md @@ -0,0 +1,16 @@ +# GPR++ - Google Portable Runtime for C++ + +The files in this directory contain various utility code for C++ code. +None of this code is gRPC-specific; anything here may also be useful +for other open source projects written in C++. + +Note that this is one of the few places in src/core where we allow +the use of portability macros. + +Note that this is the only place in src/core where we allow +use of the C++ standard library (i.e., anything in the `std::` +namespace). And for now, we require that any use of the +standard library is build-time-only -- i.e., we do not allow +run-time dependencies on libstdc++. For more details, see +[gRFC L6](/grpc/proposal/blob/master/L6-allow-c%2B%2B-in-grpc-core.md) and +[Moving gRPC core to C++](/grpc/grpc/blob/master/doc/core/moving-to-c%2B%2B.md). diff --git a/src/core/lib/gpr++/abstract.h b/src/core/lib/gpr++/abstract.h new file mode 100644 index 0000000000..51d7572302 --- /dev/null +++ b/src/core/lib/gpr++/abstract.h @@ -0,0 +1,34 @@ +/* + * + * 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_GPRXX_ABSTRACT_H +#define GRPC_CORE_LIB_GPRXX_ABSTRACT_H + +// This is needed to support abstract base classes in the c core. Since gRPC +// doesn't have a c++ runtime, it will hit a linker error on delete unless +// we define a virtual operator delete. See this blog for more info: +// https://eli.thegreenplace.net/2015/c-deleting-destructors-and-virtual-operator-delete/ +#define GRPC_ABSTRACT_BASE_CLASS \ + static void operator delete(void* p) { abort(); } + +// gRPC currently can't depend on libstdc++, so we can't use "= 0" for +// pure virtual methods. Instead, we use this macro. +#define GRPC_ABSTRACT \ + { GPR_ASSERT(false); } + +#endif /* GRPC_CORE_LIB_GPRXX_ABSTRACT_H */ diff --git a/src/core/lib/gpr++/atomic.h b/src/core/lib/gpr++/atomic.h new file mode 100644 index 0000000000..d68ccea864 --- /dev/null +++ b/src/core/lib/gpr++/atomic.h @@ -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. + * + */ + +#ifndef GRPC_CORE_LIB_GPRXX_ATOMIC_H +#define GRPC_CORE_LIB_GPRXX_ATOMIC_H + +#include + +#ifdef GPR_HAS_CXX11_ATOMIC +#include "src/core/lib/gpr++/atomic_with_std.h" +#else +#include "src/core/lib/gpr++/atomic_with_atm.h" +#endif + +#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_H */ diff --git a/src/core/lib/gpr++/atomic_with_atm.h b/src/core/lib/gpr++/atomic_with_atm.h new file mode 100644 index 0000000000..09490e8148 --- /dev/null +++ b/src/core/lib/gpr++/atomic_with_atm.h @@ -0,0 +1,55 @@ +/* + * + * 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_GPRXX_ATOMIC_WITH_ATM_H +#define GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_ATM_H + +#include + +namespace grpc_core { + +enum MemoryOrderRelaxed { memory_order_relaxed }; + +template +class atomic; + +template <> +class atomic { + public: + atomic() { gpr_atm_no_barrier_store(&x_, static_cast(false)); } + explicit atomic(bool x) { + gpr_atm_no_barrier_store(&x_, static_cast(x)); + } + + bool compare_exchange_strong(bool& expected, bool update, MemoryOrderRelaxed, + MemoryOrderRelaxed) { + if (!gpr_atm_no_barrier_cas(&x_, static_cast(expected), + static_cast(update))) { + expected = gpr_atm_no_barrier_load(&x_) != 0; + return false; + } + return true; + } + + private: + gpr_atm x_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_ATM_H */ diff --git a/src/core/lib/gpr++/atomic_with_std.h b/src/core/lib/gpr++/atomic_with_std.h new file mode 100644 index 0000000000..b6ff90655e --- /dev/null +++ b/src/core/lib/gpr++/atomic_with_std.h @@ -0,0 +1,33 @@ +/* + * + * 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_GPRXX_ATOMIC_WITH_STD_H +#define GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_STD_H + +#include + +namespace grpc_core { + +template +using atomic = std::atomic; + +typedef std::memory_order memory_order; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_STD_H */ diff --git a/src/core/lib/gpr++/debug_location.h b/src/core/lib/gpr++/debug_location.h new file mode 100644 index 0000000000..5a8665ce19 --- /dev/null +++ b/src/core/lib/gpr++/debug_location.h @@ -0,0 +1,52 @@ +/* + * + * 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_GPRXX_DEBUG_LOCATION_H +#define GRPC_CORE_LIB_GPRXX_DEBUG_LOCATION_H + +namespace grpc_core { + +// Used for tracking file and line where a call is made for debug builds. +// No-op for non-debug builds. +// Callers can use the DEBUG_LOCATION macro in either case. +#ifndef NDEBUG +class DebugLocation { + public: + DebugLocation(const char* file, int line) : file_(file), line_(line) {} + bool Log() const { return true; } + const char* file() const { return file_; } + int line() const { return line_; } + + private: + const char* file_; + const int line_; +}; +#define DEBUG_LOCATION ::grpc_core::DebugLocation(__FILE__, __LINE__) +#else +class DebugLocation { + public: + bool Log() const { return false; } + const char* file() const { return nullptr; } + int line() const { return -1; } +}; +#define DEBUG_LOCATION ::grpc_core::DebugLocation() +#endif + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_DEBUG_LOCATION_H */ diff --git a/src/core/lib/gpr++/inlined_vector.h b/src/core/lib/gpr++/inlined_vector.h new file mode 100644 index 0000000000..17ee9e16bb --- /dev/null +++ b/src/core/lib/gpr++/inlined_vector.h @@ -0,0 +1,112 @@ +/* + * + * 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_GPRXX_INLINED_VECTOR_H +#define GRPC_CORE_LIB_GPRXX_INLINED_VECTOR_H + +#include + +#include "src/core/lib/gpr++/memory.h" + +namespace grpc_core { + +// NOTE: We eventually want to use absl::InlinedVector here. However, +// there are currently build problems that prevent us from using absl. +// In the interim, we define a custom implementation as a place-holder, +// with the intent to eventually replace this with the absl +// implementation. +// +// This place-holder implementation does not implement the full set of +// functionality from the absl version; it has just the methods that we +// currently happen to need in gRPC. If additional functionality is +// needed before this gets replaced with the absl version, it can be +// added, with the following proviso: +// +// ANY METHOD ADDED HERE MUST COMPLY WITH THE INTERFACE IN THE absl +// IMPLEMENTATION! +// +// TODO(ctiller, nnoble, roth): Replace this with absl::InlinedVector +// once we integrate absl into the gRPC build system in a usable way. +template +class InlinedVector { + public: + InlinedVector() {} + ~InlinedVector() { + for (size_t i = 0; i < size_ && i < N; ++i) { + T& value = *reinterpret_cast(inline_ + i); + value.~T(); + } + if (size_ > N) { // Avoid subtracting two signed values. + for (size_t i = 0; i < size_ - N; ++i) { + dynamic_[i].~T(); + } + } + gpr_free(dynamic_); + } + + // For now, we do not support copying. + InlinedVector(const InlinedVector&) = delete; + InlinedVector& operator=(const InlinedVector&) = delete; + + T& operator[](size_t offset) { + assert(offset < size_); + if (offset < N) { + return *reinterpret_cast(inline_ + offset); + } else { + return dynamic_[offset - N]; + } + } + + template + void emplace_back(Args&&... args) { + if (size_ < N) { + new (&inline_[size_]) T(std::forward(args)...); + } else { + if (size_ - N == dynamic_capacity_) { + size_t new_capacity = + dynamic_capacity_ == 0 ? 2 : dynamic_capacity_ * 2; + T* new_dynamic = static_cast(gpr_malloc(sizeof(T) * new_capacity)); + for (size_t i = 0; i < dynamic_capacity_; ++i) { + new (&new_dynamic[i]) T(std::move(dynamic_[i])); + dynamic_[i].~T(); + } + gpr_free(dynamic_); + dynamic_ = new_dynamic; + dynamic_capacity_ = new_capacity; + } + new (&dynamic_[size_ - N]) T(std::forward(args)...); + } + ++size_; + } + + void push_back(const T& value) { emplace_back(value); } + + void push_back(T&& value) { emplace_back(std::move(value)); } + + size_t size() const { return size_; } + + private: + typename std::aligned_storage::type inline_[N]; + T* dynamic_ = nullptr; + size_t size_ = 0; + size_t dynamic_capacity_ = 0; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_INLINED_VECTOR_H */ diff --git a/src/core/lib/gpr++/manual_constructor.h b/src/core/lib/gpr++/manual_constructor.h new file mode 100644 index 0000000000..a3f006da34 --- /dev/null +++ b/src/core/lib/gpr++/manual_constructor.h @@ -0,0 +1,211 @@ +/* + * + * Copyright 2016 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_GPRXX_MANUAL_CONSTRUCTOR_H +#define GRPC_CORE_LIB_GPRXX_MANUAL_CONSTRUCTOR_H + +// manually construct a region of memory with some type + +#include +#include +#include +#include +#include + +#include + +namespace grpc_core { + +// this contains templated helpers needed to implement the ManualConstructors +// in this file. +namespace manual_ctor_impl { + +// is_one_of returns true it a class, Member, is present in a variadic list of +// classes, List. +template +class is_one_of; + +template +class is_one_of { + public: + static constexpr const bool value = true; +}; + +template +class is_one_of { + public: + static constexpr const bool value = is_one_of::value; +}; + +template +class is_one_of { + public: + static constexpr const bool value = false; +}; + +// max_size_of returns sizeof(Type) for the largest type in the variadic list +// of classes, Types. +template +class max_size_of; + +template +class max_size_of { + public: + static constexpr const size_t value = sizeof(A); +}; + +template +class max_size_of { + public: + static constexpr const size_t value = sizeof(A) > max_size_of::value + ? sizeof(A) + : max_size_of::value; +}; + +// max_size_of returns alignof(Type) for the largest type in the variadic list +// of classes, Types. +template +class max_align_of; + +template +class max_align_of { + public: + static constexpr const size_t value = alignof(A); +}; + +template +class max_align_of { + public: + static constexpr const size_t value = alignof(A) > max_align_of::value + ? alignof(A) + : max_align_of::value; +}; + +} // namespace manual_ctor_impl + +template +class PolymorphicManualConstructor { + public: + // No constructor or destructor because one of the most useful uses of + // this class is as part of a union, and members of a union could not have + // constructors or destructors till C++11. And, anyway, the whole point of + // this class is to bypass constructor and destructor. + + BaseType* get() { return reinterpret_cast(&space_); } + const BaseType* get() const { + return reinterpret_cast(&space_); + } + + BaseType* operator->() { return get(); } + const BaseType* operator->() const { return get(); } + + BaseType& operator*() { return *get(); } + const BaseType& operator*() const { return *get(); } + + template + void Init() { + FinishInit(new (&space_) DerivedType); + } + + // Init() constructs the Type instance using the given arguments + // (which are forwarded to Type's constructor). + // + // Note that Init() with no arguments performs default-initialization, + // not zero-initialization (i.e it behaves the same as "new Type;", not + // "new Type();"), so it will leave non-class types uninitialized. + template + void Init(Ts&&... args) { + FinishInit(new (&space_) DerivedType(std::forward(args)...)); + } + + // Init() that is equivalent to copy and move construction. + // Enables usage like this: + // ManualConstructor> v; + // v.Init({1, 2, 3}); + template + void Init(const DerivedType& x) { + FinishInit(new (&space_) DerivedType(x)); + } + template + void Init(DerivedType&& x) { + FinishInit(new (&space_) DerivedType(std::move(x))); + } + + void Destroy() { get()->~BaseType(); } + + private: + template + void FinishInit(DerivedType* p) { + static_assert( + manual_ctor_impl::is_one_of::value, + "DerivedType must be one of the predeclared DerivedTypes"); + GPR_ASSERT(reinterpret_cast(static_cast(p)) == p); + } + + typename std::aligned_storage< + grpc_core::manual_ctor_impl::max_size_of::value, + grpc_core::manual_ctor_impl::max_align_of::value>::type + space_; +}; + +template +class ManualConstructor { + public: + // No constructor or destructor because one of the most useful uses of + // this class is as part of a union, and members of a union could not have + // constructors or destructors till C++11. And, anyway, the whole point of + // this class is to bypass constructor and destructor. + + Type* get() { return reinterpret_cast(&space_); } + const Type* get() const { return reinterpret_cast(&space_); } + + Type* operator->() { return get(); } + const Type* operator->() const { return get(); } + + Type& operator*() { return *get(); } + const Type& operator*() const { return *get(); } + + void Init() { new (&space_) Type; } + + // Init() constructs the Type instance using the given arguments + // (which are forwarded to Type's constructor). + // + // Note that Init() with no arguments performs default-initialization, + // not zero-initialization (i.e it behaves the same as "new Type;", not + // "new Type();"), so it will leave non-class types uninitialized. + template + void Init(Ts&&... args) { + new (&space_) Type(std::forward(args)...); + } + + // Init() that is equivalent to copy and move construction. + // Enables usage like this: + // ManualConstructor> v; + // v.Init({1, 2, 3}); + void Init(const Type& x) { new (&space_) Type(x); } + void Init(Type&& x) { new (&space_) Type(std::move(x)); } + + void Destroy() { get()->~Type(); } + + private: + typename std::aligned_storage::type space_; +}; + +} // namespace grpc_core + +#endif diff --git a/src/core/lib/gpr++/memory.h b/src/core/lib/gpr++/memory.h new file mode 100644 index 0000000000..75ed3d6cea --- /dev/null +++ b/src/core/lib/gpr++/memory.h @@ -0,0 +1,100 @@ +/* + * + * 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_GPRXX_MEMORY_H +#define GRPC_CORE_LIB_GPRXX_MEMORY_H + +#include + +#include +#include +#include + +namespace grpc_core { + +// Alternative to new, since we cannot use it (for fear of libstdc++) +template +inline T* New(Args&&... args) { + void* p = gpr_malloc(sizeof(T)); + return new (p) T(std::forward(args)...); +} + +// Alternative to delete, since we cannot use it (for fear of libstdc++) +template +inline void Delete(T* p) { + p->~T(); + gpr_free(p); +} + +template +class DefaultDelete { + public: + void operator()(T* p) { Delete(p); } +}; + +template > +using UniquePtr = std::unique_ptr; + +template +inline UniquePtr MakeUnique(Args&&... args) { + return UniquePtr(New(std::forward(args)...)); +} + +// an allocator that uses gpr_malloc/gpr_free +template +class Allocator { + public: + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef std::false_type propagate_on_container_move_assignment; + template + struct rebind { + typedef Allocator other; + }; + typedef std::true_type is_always_equal; + + pointer address(reference x) const { return &x; } + const_pointer address(const_reference x) const { return &x; } + pointer allocate(std::size_t n, + std::allocator::const_pointer hint = nullptr) { + return static_cast(gpr_malloc(n * sizeof(T))); + } + void deallocate(T* p, std::size_t n) { gpr_free(p); } + size_t max_size() const { + return std::numeric_limits::max() / sizeof(value_type); + } + void construct(pointer p, const_reference val) { new ((void*)p) T(val); } + template + void construct(U* p, Args&&... args) { + ::new ((void*)p) U(std::forward(args)...); + } + void destroy(pointer p) { p->~T(); } + template + void destroy(U* p) { + p->~U(); + } +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_MEMORY_H */ diff --git a/src/core/lib/gpr++/orphanable.h b/src/core/lib/gpr++/orphanable.h new file mode 100644 index 0000000000..f106e74dde --- /dev/null +++ b/src/core/lib/gpr++/orphanable.h @@ -0,0 +1,171 @@ +/* + * + * 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_GPRXX_ORPHANABLE_H +#define GRPC_CORE_LIB_GPRXX_ORPHANABLE_H + +#include +#include + +#include + +#include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr++/abstract.h" +#include "src/core/lib/gpr++/debug_location.h" +#include "src/core/lib/gpr++/memory.h" + +namespace grpc_core { + +// A base class for orphanable objects, which have one external owner +// but are not necessarily destroyed immediately when the external owner +// gives up ownership. Instead, the owner calls the object's Orphan() +// method, and the object then takes responsibility for its own cleanup +// and destruction. +class Orphanable { + public: + // Gives up ownership of the object. The implementation must arrange + // to eventually destroy the object without further interaction from the + // caller. + virtual void Orphan() GRPC_ABSTRACT; + + // Not copyable or movable. + Orphanable(const Orphanable&) = delete; + Orphanable& operator=(const Orphanable&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + Orphanable() {} + virtual ~Orphanable() {} +}; + +template +class OrphanableDelete { + public: + void operator()(T* p) { p->Orphan(); } +}; + +template > +using OrphanablePtr = std::unique_ptr; + +template +inline OrphanablePtr MakeOrphanable(Args&&... args) { + return OrphanablePtr(New(std::forward(args)...)); +} + +// A type of Orphanable with internal ref-counting. +class InternallyRefCounted : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCounted(const InternallyRefCounted&) = delete; + InternallyRefCounted& operator=(const InternallyRefCounted&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + InternallyRefCounted() { gpr_ref_init(&refs_, 1); } + virtual ~InternallyRefCounted() {} + + void Ref() { gpr_ref(&refs_); } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + private: + gpr_refcount refs_; +}; + +// An alternative version of the InternallyRefCounted base class that +// supports tracing. This is intended to be used in cases where the +// object will be handled both by idiomatic C++ code using smart +// pointers and legacy code that is manually calling Ref() and Unref(). +// Once all of our code is converted to idiomatic C++, we may be able to +// eliminate this class. +class InternallyRefCountedWithTracing : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCountedWithTracing(const InternallyRefCountedWithTracing&) = + delete; + InternallyRefCountedWithTracing& operator=( + const InternallyRefCountedWithTracing&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + InternallyRefCountedWithTracing() + : InternallyRefCountedWithTracing(static_cast(nullptr)) {} + + explicit InternallyRefCountedWithTracing(TraceFlag* trace_flag) + : trace_flag_(trace_flag) { + gpr_ref_init(&refs_, 1); + } + +#ifdef NDEBUG + explicit InternallyRefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : InternallyRefCountedWithTracing() {} +#endif + + virtual ~InternallyRefCountedWithTracing() {} + + void Ref() { gpr_ref(&refs_); } + + void Ref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs + 1, reason); + } + Ref(); + } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + void Unref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs - 1, reason); + } + Unref(); + } + + private: + TraceFlag* trace_flag_ = nullptr; + gpr_refcount refs_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_ORPHANABLE_H */ diff --git a/src/core/lib/gpr++/ref_counted.h b/src/core/lib/gpr++/ref_counted.h new file mode 100644 index 0000000000..c2ae76c0ae --- /dev/null +++ b/src/core/lib/gpr++/ref_counted.h @@ -0,0 +1,133 @@ +/* + * + * 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_GPRXX_REF_COUNTED_H +#define GRPC_CORE_LIB_GPRXX_REF_COUNTED_H + +#include +#include + +#include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr++/abstract.h" +#include "src/core/lib/gpr++/debug_location.h" +#include "src/core/lib/gpr++/memory.h" + +namespace grpc_core { + +// A base class for reference-counted objects. +// New objects should be created via New() and start with a refcount of 1. +// When the refcount reaches 0, the object will be deleted via Delete(). +class RefCounted { + public: + void Ref() { gpr_ref(&refs_); } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + // Not copyable nor movable. + RefCounted(const RefCounted&) = delete; + RefCounted& operator=(const RefCounted&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + RefCounted() { gpr_ref_init(&refs_, 1); } + + virtual ~RefCounted() {} + + private: + gpr_refcount refs_; +}; + +// An alternative version of the RefCounted base class that +// supports tracing. This is intended to be used in cases where the +// object will be handled both by idiomatic C++ code using smart +// pointers and legacy code that is manually calling Ref() and Unref(). +// Once all of our code is converted to idiomatic C++, we may be able to +// eliminate this class. +class RefCountedWithTracing { + public: + void Ref() { gpr_ref(&refs_); } + + void Ref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs + 1, reason); + } + Ref(); + } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + void Unref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs - 1, reason); + } + Unref(); + } + + // Not copyable nor movable. + RefCountedWithTracing(const RefCountedWithTracing&) = delete; + RefCountedWithTracing& operator=(const RefCountedWithTracing&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + RefCountedWithTracing() + : RefCountedWithTracing(static_cast(nullptr)) {} + + explicit RefCountedWithTracing(TraceFlag* trace_flag) + : trace_flag_(trace_flag) { + gpr_ref_init(&refs_, 1); + } + +#ifdef NDEBUG + explicit RefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : RefCountedWithTracing() {} +#endif + + virtual ~RefCountedWithTracing() {} + + private: + TraceFlag* trace_flag_ = nullptr; + gpr_refcount refs_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_REF_COUNTED_H */ diff --git a/src/core/lib/gpr++/ref_counted_ptr.h b/src/core/lib/gpr++/ref_counted_ptr.h new file mode 100644 index 0000000000..862294d1aa --- /dev/null +++ b/src/core/lib/gpr++/ref_counted_ptr.h @@ -0,0 +1,99 @@ +/* + * + * 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_GPRXX_REF_COUNTED_PTR_H +#define GRPC_CORE_LIB_GPRXX_REF_COUNTED_PTR_H + +#include + +#include "src/core/lib/gpr++/memory.h" + +namespace grpc_core { + +// A smart pointer class for objects that provide Ref() and Unref() methods, +// such as those provided by the RefCounted base class. +template +class RefCountedPtr { + public: + RefCountedPtr() {} + + // If value is non-null, we take ownership of a ref to it. + explicit RefCountedPtr(T* value) { value_ = value; } + + // Move support. + RefCountedPtr(RefCountedPtr&& other) { + value_ = other.value_; + other.value_ = nullptr; + } + RefCountedPtr& operator=(RefCountedPtr&& other) { + if (value_ != nullptr) value_->Unref(); + value_ = other.value_; + other.value_ = nullptr; + return *this; + } + + // Copy support. + RefCountedPtr(const RefCountedPtr& other) { + if (other.value_ != nullptr) other.value_->Ref(); + value_ = other.value_; + } + RefCountedPtr& operator=(const RefCountedPtr& other) { + // Note: Order of reffing and unreffing is important here in case value_ + // and other.value_ are the same object. + if (other.value_ != nullptr) other.value_->Ref(); + if (value_ != nullptr) value_->Unref(); + value_ = other.value_; + return *this; + } + + ~RefCountedPtr() { + if (value_ != nullptr) value_->Unref(); + } + + // If value is non-null, we take ownership of a ref to it. + void reset(T* value = nullptr) { + if (value_ != nullptr) value_->Unref(); + value_ = value; + } + + T* get() const { return value_; } + + T& operator*() const { return *value_; } + T* operator->() const { return value_; } + + bool operator==(const RefCountedPtr& other) const { + return value_ == other.value_; + } + bool operator==(const T* other) const { return value_ == other; } + bool operator!=(const RefCountedPtr& other) const { + return value_ != other.value_; + } + bool operator!=(const T* other) const { return value_ != other; } + + private: + T* value_ = nullptr; +}; + +template +inline RefCountedPtr MakeRefCounted(Args&&... args) { + return RefCountedPtr(New(std::forward(args)...)); +} + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRXX_REF_COUNTED_PTR_H */ diff --git a/src/core/lib/gpr/README.md b/src/core/lib/gpr/README.md new file mode 100644 index 0000000000..21fb0c796d --- /dev/null +++ b/src/core/lib/gpr/README.md @@ -0,0 +1,8 @@ +# GPR - Google Portable Runtime for C + +The files in this directory contain basic utility code and platform +abstractions for C code. None of this code is gRPC-specific; anything +here may also be useful for other open source projects written in C. + +Note that this is one of the few places in src/core where we allow +the use of portability macros. diff --git a/src/core/lib/gpr/alloc.cc b/src/core/lib/gpr/alloc.cc new file mode 100644 index 0000000000..518bdb99f7 --- /dev/null +++ b/src/core/lib/gpr/alloc.cc @@ -0,0 +1,102 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include +#include +#include +#include "src/core/lib/profiling/timers.h" + +static void* zalloc_with_calloc(size_t sz) { return calloc(sz, 1); } + +static void* zalloc_with_gpr_malloc(size_t sz) { + void* p = gpr_malloc(sz); + memset(p, 0, sz); + return p; +} + +static gpr_allocation_functions g_alloc_functions = {malloc, zalloc_with_calloc, + realloc, free}; + +gpr_allocation_functions gpr_get_allocation_functions() { + return g_alloc_functions; +} + +void gpr_set_allocation_functions(gpr_allocation_functions functions) { + GPR_ASSERT(functions.malloc_fn != nullptr); + GPR_ASSERT(functions.realloc_fn != nullptr); + GPR_ASSERT(functions.free_fn != nullptr); + if (functions.zalloc_fn == nullptr) { + functions.zalloc_fn = zalloc_with_gpr_malloc; + } + g_alloc_functions = functions; +} + +void* gpr_malloc(size_t size) { + void* p; + if (size == 0) return nullptr; + GPR_TIMER_BEGIN("gpr_malloc", 0); + p = g_alloc_functions.malloc_fn(size); + if (!p) { + abort(); + } + GPR_TIMER_END("gpr_malloc", 0); + return p; +} + +void* gpr_zalloc(size_t size) { + void* p; + if (size == 0) return nullptr; + GPR_TIMER_BEGIN("gpr_zalloc", 0); + p = g_alloc_functions.zalloc_fn(size); + if (!p) { + abort(); + } + GPR_TIMER_END("gpr_zalloc", 0); + return p; +} + +void gpr_free(void* p) { + GPR_TIMER_BEGIN("gpr_free", 0); + g_alloc_functions.free_fn(p); + GPR_TIMER_END("gpr_free", 0); +} + +void* gpr_realloc(void* p, size_t size) { + if ((size == 0) && (p == nullptr)) return nullptr; + GPR_TIMER_BEGIN("gpr_realloc", 0); + p = g_alloc_functions.realloc_fn(p, size); + if (!p) { + abort(); + } + GPR_TIMER_END("gpr_realloc", 0); + return p; +} + +void* gpr_malloc_aligned(size_t size, size_t alignment_log) { + size_t alignment = ((size_t)1) << alignment_log; + size_t extra = alignment - 1 + sizeof(void*); + void* p = gpr_malloc(size + extra); + void** ret = (void**)(((uintptr_t)p + extra) & ~(alignment - 1)); + ret[-1] = p; + return (void*)ret; +} + +void gpr_free_aligned(void* ptr) { gpr_free(((void**)ptr)[-1]); } diff --git a/src/core/lib/gpr/arena.cc b/src/core/lib/gpr/arena.cc new file mode 100644 index 0000000000..177c176732 --- /dev/null +++ b/src/core/lib/gpr/arena.cc @@ -0,0 +1,83 @@ +/* + * + * 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/gpr/arena.h" +#include +#include +#include +#include + +#define ROUND_UP_TO_ALIGNMENT_SIZE(x) \ + (((x) + GPR_MAX_ALIGNMENT - 1u) & ~(GPR_MAX_ALIGNMENT - 1u)) + +typedef struct zone { + size_t size_begin; + size_t size_end; + gpr_atm next_atm; +} zone; + +struct gpr_arena { + gpr_atm size_so_far; + zone initial_zone; +}; + +gpr_arena* gpr_arena_create(size_t initial_size) { + initial_size = ROUND_UP_TO_ALIGNMENT_SIZE(initial_size); + gpr_arena* a = (gpr_arena*)gpr_zalloc(sizeof(gpr_arena) + initial_size); + a->initial_zone.size_end = initial_size; + return a; +} + +size_t gpr_arena_destroy(gpr_arena* arena) { + gpr_atm size = gpr_atm_no_barrier_load(&arena->size_so_far); + zone* z = (zone*)gpr_atm_no_barrier_load(&arena->initial_zone.next_atm); + gpr_free(arena); + while (z) { + zone* next_z = (zone*)gpr_atm_no_barrier_load(&z->next_atm); + gpr_free(z); + z = next_z; + } + return (size_t)size; +} + +void* gpr_arena_alloc(gpr_arena* arena, size_t size) { + size = ROUND_UP_TO_ALIGNMENT_SIZE(size); + size_t start = + (size_t)gpr_atm_no_barrier_fetch_add(&arena->size_so_far, size); + zone* z = &arena->initial_zone; + while (start > z->size_end) { + zone* next_z = (zone*)gpr_atm_acq_load(&z->next_atm); + if (next_z == nullptr) { + size_t next_z_size = (size_t)gpr_atm_no_barrier_load(&arena->size_so_far); + next_z = (zone*)gpr_zalloc(sizeof(zone) + next_z_size); + next_z->size_begin = z->size_end; + next_z->size_end = z->size_end + next_z_size; + if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { + gpr_free(next_z); + next_z = (zone*)gpr_atm_acq_load(&z->next_atm); + } + } + z = next_z; + } + if (start + size > z->size_end) { + return gpr_arena_alloc(arena, size); + } + GPR_ASSERT(start >= z->size_begin); + GPR_ASSERT(start + size <= z->size_end); + return ((char*)(z + 1)) + start - z->size_begin; +} diff --git a/src/core/lib/gpr/arena.h b/src/core/lib/gpr/arena.h new file mode 100644 index 0000000000..339771c0e3 --- /dev/null +++ b/src/core/lib/gpr/arena.h @@ -0,0 +1,39 @@ +/* + * + * 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. + * + */ + +// \file Arena based allocator +// Allows very fast allocation of memory, but that memory cannot be freed until +// the arena as a whole is freed +// Tracks the total memory allocated against it, so that future arenas can +// pre-allocate the right amount of memory + +#ifndef GRPC_CORE_LIB_GPR_ARENA_H +#define GRPC_CORE_LIB_GPR_ARENA_H + +#include + +typedef struct gpr_arena gpr_arena; + +// Create an arena, with \a initial_size bytes in the first allocated buffer +gpr_arena* gpr_arena_create(size_t initial_size); +// Allocate \a size bytes from the arena +void* gpr_arena_alloc(gpr_arena* arena, size_t size); +// Destroy an arena, returning the total number of bytes allocated +size_t gpr_arena_destroy(gpr_arena* arena); + +#endif /* GRPC_CORE_LIB_GPR_ARENA_H */ diff --git a/src/core/lib/gpr/atm.cc b/src/core/lib/gpr/atm.cc new file mode 100644 index 0000000000..15bfe52d64 --- /dev/null +++ b/src/core/lib/gpr/atm.cc @@ -0,0 +1,32 @@ +/* + * + * 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 +#include + +gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, + gpr_atm min, gpr_atm max) { + gpr_atm current_value; + gpr_atm new_value; + do { + current_value = gpr_atm_no_barrier_load(value); + new_value = GPR_CLAMP(current_value + delta, min, max); + if (new_value == current_value) break; + } while (!gpr_atm_no_barrier_cas(value, current_value, new_value)); + return new_value; +} diff --git a/src/core/lib/gpr/avl.cc b/src/core/lib/gpr/avl.cc new file mode 100644 index 0000000000..0b67a21f2f --- /dev/null +++ b/src/core/lib/gpr/avl.cc @@ -0,0 +1,300 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include + +#include +#include +#include + +gpr_avl gpr_avl_create(const gpr_avl_vtable* vtable) { + gpr_avl out; + out.vtable = vtable; + out.root = nullptr; + return out; +} + +static gpr_avl_node* ref_node(gpr_avl_node* node) { + if (node) { + gpr_ref(&node->refs); + } + return node; +} + +static void unref_node(const gpr_avl_vtable* vtable, gpr_avl_node* node, + void* user_data) { + if (node == nullptr) { + return; + } + if (gpr_unref(&node->refs)) { + 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); + } +} + +static long node_height(gpr_avl_node* node) { + return node == nullptr ? 0 : node->height; +} + +#ifndef NDEBUG +static long calculate_height(gpr_avl_node* node) { + return node == nullptr ? 0 + : 1 + GPR_MAX(calculate_height(node->left), + calculate_height(node->right)); +} + +static gpr_avl_node* assert_invariants(gpr_avl_node* n) { + if (n == nullptr) return nullptr; + assert_invariants(n->left); + assert_invariants(n->right); + assert(calculate_height(n) == n->height); + assert(labs(node_height(n->left) - node_height(n->right)) <= 1); + return n; +} +#else +static gpr_avl_node* assert_invariants(gpr_avl_node* n) { return n; } +#endif + +gpr_avl_node* new_node(void* key, void* value, gpr_avl_node* left, + gpr_avl_node* right) { + gpr_avl_node* node = (gpr_avl_node*)gpr_malloc(sizeof(*node)); + gpr_ref_init(&node->refs, 1); + node->key = key; + node->value = value; + node->left = assert_invariants(left); + node->right = assert_invariants(right); + node->height = 1 + GPR_MAX(node_height(left), node_height(right)); + return node; +} + +static gpr_avl_node* get(const gpr_avl_vtable* vtable, gpr_avl_node* node, + void* key, void* user_data) { + long cmp; + + if (node == nullptr) { + return nullptr; + } + + cmp = vtable->compare_keys(node->key, key, user_data); + if (cmp == 0) { + return node; + } else if (cmp > 0) { + return get(vtable, node->left, key, user_data); + } else { + return get(vtable, node->right, key, user_data); + } +} + +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 : nullptr; +} + +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 != nullptr) { + *value = node->value; + return 1; + } + return 0; +} + +static gpr_avl_node* rotate_left(const gpr_avl_vtable* vtable, void* key, + void* value, gpr_avl_node* left, + 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, 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, void* user_data) { + /* rotate_right(..., rotate_left(left), right) */ + 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, void* user_data) { + /* rotate_left(..., left, rotate_right(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, 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, user_data)); + } else { + 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, user_data)); + } else { + return assert_invariants( + rotate_left(vtable, key, value, left, right, user_data)); + } + default: + return assert_invariants(new_node(key, value, left, right)); + } +} + +static gpr_avl_node* add_key(const gpr_avl_vtable* vtable, gpr_avl_node* node, + void* key, void* value, void* user_data) { + long cmp; + if (node == nullptr) { + return new_node(key, value, nullptr, nullptr); + } + 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, 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, 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, void* user_data) { + gpr_avl_node* old_root = avl.root; + avl.root = add_key(avl.vtable, avl.root, key, value, user_data); + assert_invariants(avl.root); + unref_node(avl.vtable, old_root, user_data); + return avl; +} + +static gpr_avl_node* in_order_head(gpr_avl_node* node) { + while (node->left != nullptr) { + node = node->left; + } + return node; +} + +static gpr_avl_node* in_order_tail(gpr_avl_node* node) { + while (node->right != nullptr) { + node = node->right; + } + return node; +} + +static gpr_avl_node* remove_key(const gpr_avl_vtable* vtable, + gpr_avl_node* node, void* key, + void* user_data) { + long cmp; + if (node == nullptr) { + return nullptr; + } + cmp = vtable->compare_keys(node->key, key, user_data); + if (cmp == 0) { + if (node->left == nullptr) { + return ref_node(node->right); + } else if (node->right == nullptr) { + 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, 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, 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, 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, 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, void* user_data) { + gpr_avl_node* old_root = avl.root; + avl.root = remove_key(avl.vtable, avl.root, key, user_data); + assert_invariants(avl.root); + unref_node(avl.vtable, old_root, user_data); + return 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, void* user_data) { + unref_node(avl.vtable, avl.root, user_data); +} + +int gpr_avl_is_empty(gpr_avl avl) { return avl.root == nullptr; } diff --git a/src/core/lib/gpr/cmdline.cc b/src/core/lib/gpr/cmdline.cc new file mode 100644 index 0000000000..4118f9a72a --- /dev/null +++ b/src/core/lib/gpr/cmdline.cc @@ -0,0 +1,330 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include "src/core/lib/gpr/string.h" + +typedef enum { ARGTYPE_INT, ARGTYPE_BOOL, ARGTYPE_STRING } argtype; + +typedef struct arg { + const char* name; + const char* help; + argtype type; + void* value; + struct arg* next; +} arg; + +struct gpr_cmdline { + const char* description; + arg* args; + const char* argv0; + + const char* extra_arg_name; + const char* extra_arg_help; + void (*extra_arg)(void* user_data, const char* arg); + void* extra_arg_user_data; + + int (*state)(gpr_cmdline* cl, char* arg); + arg* cur_arg; + + int survive_failure; +}; + +static int normal_state(gpr_cmdline* cl, char* arg); + +gpr_cmdline* gpr_cmdline_create(const char* description) { + gpr_cmdline* cl = (gpr_cmdline*)gpr_zalloc(sizeof(gpr_cmdline)); + + cl->description = description; + cl->state = normal_state; + + return cl; +} + +void gpr_cmdline_set_survive_failure(gpr_cmdline* cl) { + cl->survive_failure = 1; +} + +void gpr_cmdline_destroy(gpr_cmdline* cl) { + while (cl->args) { + arg* a = cl->args; + cl->args = a->next; + gpr_free(a); + } + gpr_free(cl); +} + +static void add_arg(gpr_cmdline* cl, const char* name, const char* help, + argtype type, void* value) { + arg* a; + + for (a = cl->args; a; a = a->next) { + GPR_ASSERT(0 != strcmp(a->name, name)); + } + + a = (arg*)gpr_zalloc(sizeof(arg)); + a->name = name; + a->help = help; + a->type = type; + a->value = value; + a->next = cl->args; + cl->args = a; +} + +void gpr_cmdline_add_int(gpr_cmdline* cl, const char* name, const char* help, + int* value) { + add_arg(cl, name, help, ARGTYPE_INT, value); +} + +void gpr_cmdline_add_flag(gpr_cmdline* cl, const char* name, const char* help, + int* value) { + add_arg(cl, name, help, ARGTYPE_BOOL, value); +} + +void gpr_cmdline_add_string(gpr_cmdline* cl, const char* name, const char* help, + const char** value) { + add_arg(cl, name, help, ARGTYPE_STRING, value); +} + +void gpr_cmdline_on_extra_arg( + gpr_cmdline* cl, const char* name, const char* help, + void (*on_extra_arg)(void* user_data, const char* arg), void* user_data) { + GPR_ASSERT(!cl->extra_arg); + GPR_ASSERT(on_extra_arg); + + cl->extra_arg = on_extra_arg; + cl->extra_arg_user_data = user_data; + cl->extra_arg_name = name; + cl->extra_arg_help = help; +} + +/* recursively descend argument list, adding the last element + to s first - so that arguments are added in the order they were + added to the list by api calls */ +static void add_args_to_usage(gpr_strvec* s, arg* a) { + char* tmp; + + if (!a) return; + add_args_to_usage(s, a->next); + + switch (a->type) { + case ARGTYPE_BOOL: + gpr_asprintf(&tmp, " [--%s|--no-%s]", a->name, a->name); + gpr_strvec_add(s, tmp); + break; + case ARGTYPE_STRING: + gpr_asprintf(&tmp, " [--%s=string]", a->name); + gpr_strvec_add(s, tmp); + break; + case ARGTYPE_INT: + gpr_asprintf(&tmp, " [--%s=int]", a->name); + gpr_strvec_add(s, tmp); + break; + } +} + +char* gpr_cmdline_usage_string(gpr_cmdline* cl, const char* argv0) { + /* TODO(ctiller): make this prettier */ + gpr_strvec s; + char* tmp; + const char* name = strrchr(argv0, '/'); + + if (name) { + name++; + } else { + name = argv0; + } + + gpr_strvec_init(&s); + + gpr_asprintf(&tmp, "Usage: %s", name); + gpr_strvec_add(&s, tmp); + add_args_to_usage(&s, cl->args); + if (cl->extra_arg) { + gpr_asprintf(&tmp, " [%s...]", cl->extra_arg_name); + gpr_strvec_add(&s, tmp); + } + gpr_strvec_add(&s, gpr_strdup("\n")); + + tmp = gpr_strvec_flatten(&s, nullptr); + gpr_strvec_destroy(&s); + return tmp; +} + +static int print_usage_and_die(gpr_cmdline* cl) { + char* usage = gpr_cmdline_usage_string(cl, cl->argv0); + fprintf(stderr, "%s", usage); + gpr_free(usage); + if (!cl->survive_failure) { + exit(1); + } + return 0; +} + +static int extra_state(gpr_cmdline* cl, char* str) { + if (!cl->extra_arg) { + return print_usage_and_die(cl); + } + cl->extra_arg(cl->extra_arg_user_data, str); + return 1; +} + +static arg* find_arg(gpr_cmdline* cl, char* name) { + arg* a; + + for (a = cl->args; a; a = a->next) { + if (0 == strcmp(a->name, name)) { + break; + } + } + + if (!a) { + fprintf(stderr, "Unknown argument: %s\n", name); + return nullptr; + } + + return a; +} + +static int value_state(gpr_cmdline* cl, char* str) { + long intval; + char* end; + + GPR_ASSERT(cl->cur_arg); + + switch (cl->cur_arg->type) { + case ARGTYPE_INT: + intval = strtol(str, &end, 0); + if (*end || intval < INT_MIN || intval > INT_MAX) { + fprintf(stderr, "expected integer, got '%s' for %s\n", str, + cl->cur_arg->name); + return print_usage_and_die(cl); + } + *(int*)cl->cur_arg->value = (int)intval; + break; + case ARGTYPE_BOOL: + if (0 == strcmp(str, "1") || 0 == strcmp(str, "true")) { + *(int*)cl->cur_arg->value = 1; + } else if (0 == strcmp(str, "0") || 0 == strcmp(str, "false")) { + *(int*)cl->cur_arg->value = 0; + } else { + fprintf(stderr, "expected boolean, got '%s' for %s\n", str, + cl->cur_arg->name); + return print_usage_and_die(cl); + } + break; + case ARGTYPE_STRING: + *(char**)cl->cur_arg->value = str; + break; + } + + cl->state = normal_state; + return 1; +} + +static int normal_state(gpr_cmdline* cl, char* str) { + char* eq = nullptr; + char* tmp = nullptr; + char* arg_name = nullptr; + int r = 1; + + if (0 == strcmp(str, "-help") || 0 == strcmp(str, "--help") || + 0 == strcmp(str, "-h")) { + return print_usage_and_die(cl); + } + + cl->cur_arg = nullptr; + + if (str[0] == '-') { + if (str[1] == '-') { + if (str[2] == 0) { + /* handle '--' to move to just extra args */ + cl->state = extra_state; + return 1; + } + str += 2; + } else { + str += 1; + } + /* first byte of str is now past the leading '-' or '--' */ + if (str[0] == 'n' && str[1] == 'o' && str[2] == '-') { + /* str is of the form '--no-foo' - it's a flag disable */ + str += 3; + cl->cur_arg = find_arg(cl, str); + if (cl->cur_arg == nullptr) { + return print_usage_and_die(cl); + } + if (cl->cur_arg->type != ARGTYPE_BOOL) { + fprintf(stderr, "%s is not a flag argument\n", str); + return print_usage_and_die(cl); + } + *(int*)cl->cur_arg->value = 0; + return 1; /* early out */ + } + eq = strchr(str, '='); + if (eq != nullptr) { + /* copy the string into a temp buffer and extract the name */ + tmp = arg_name = (char*)gpr_malloc((size_t)(eq - str + 1)); + memcpy(arg_name, str, (size_t)(eq - str)); + arg_name[eq - str] = 0; + } else { + arg_name = str; + } + cl->cur_arg = find_arg(cl, arg_name); + if (cl->cur_arg == nullptr) { + return print_usage_and_die(cl); + } + if (eq != nullptr) { + /* str was of the type --foo=value, parse the value */ + r = value_state(cl, eq + 1); + } else if (cl->cur_arg->type != ARGTYPE_BOOL) { + /* flag types don't have a '--foo value' variant, other types do */ + cl->state = value_state; + } else { + /* flag parameter: just set the value */ + *(int*)cl->cur_arg->value = 1; + } + } else { + r = extra_state(cl, str); + } + + gpr_free(tmp); + return r; +} + +int gpr_cmdline_parse(gpr_cmdline* cl, int argc, char** argv) { + int i; + + GPR_ASSERT(argc >= 1); + cl->argv0 = argv[0]; + + for (i = 1; i < argc; i++) { + if (!cl->state(cl, argv[i])) { + return 0; + } + } + return 1; +} diff --git a/src/core/lib/gpr/cpu_iphone.cc b/src/core/lib/gpr/cpu_iphone.cc new file mode 100644 index 0000000000..2847e03ba5 --- /dev/null +++ b/src/core/lib/gpr/cpu_iphone.cc @@ -0,0 +1,36 @@ +/* + * + * 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. + * + */ + +#include + +#include + +#ifdef GPR_CPU_IPHONE + +/* Probably 2 instead of 1, but see comment on gpr_cpu_current_cpu. */ +unsigned gpr_cpu_num_cores(void) { return 1; } + +/* Most code that's using this is using it to shard across work queues. So + unless profiling shows it's a problem or there appears a way to detect the + currently running CPU core, let's have it shard the default way. + Note that the interface in cpu.h lets gpr_cpu_num_cores return 0, but doing + it makes it impossible for gpr_cpu_current_cpu to satisfy its stated range, + and some code might be relying on it. */ +unsigned gpr_cpu_current_cpu(void) { return 0; } + +#endif /* GPR_CPU_IPHONE */ diff --git a/src/core/lib/gpr/cpu_linux.cc b/src/core/lib/gpr/cpu_linux.cc new file mode 100644 index 0000000000..21b1a71dc9 --- /dev/null +++ b/src/core/lib/gpr/cpu_linux.cc @@ -0,0 +1,78 @@ +/* + * + * 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. + * + */ + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif /* _GNU_SOURCE */ + +#include + +#ifdef GPR_CPU_LINUX + +#include +#include +#include +#include + +#include +#include +#include + +static int ncpus = 0; + +static void init_num_cpus() { +#ifndef GPR_MUSL_LIBC_COMPAT + if (sched_getcpu() < 0) { + gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); + ncpus = 1; + return; + } +#endif + /* This must be signed. sysconf returns -1 when the number cannot be + determined */ + ncpus = (int)sysconf(_SC_NPROCESSORS_ONLN); + if (ncpus < 1) { + gpr_log(GPR_ERROR, "Cannot determine number of CPUs: assuming 1"); + ncpus = 1; + } +} + +unsigned gpr_cpu_num_cores(void) { + static gpr_once once = GPR_ONCE_INIT; + gpr_once_init(&once, init_num_cpus); + return (unsigned)ncpus; +} + +unsigned gpr_cpu_current_cpu(void) { +#ifdef GPR_MUSL_LIBC_COMPAT + // sched_getcpu() is undefined on musl + return 0; +#else + if (gpr_cpu_num_cores() == 1) { + return 0; + } + int cpu = sched_getcpu(); + if (cpu < 0) { + gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); + return 0; + } + return (unsigned)cpu; +#endif +} + +#endif /* GPR_CPU_LINUX */ diff --git a/src/core/lib/gpr/cpu_posix.cc b/src/core/lib/gpr/cpu_posix.cc new file mode 100644 index 0000000000..bca14a0c12 --- /dev/null +++ b/src/core/lib/gpr/cpu_posix.cc @@ -0,0 +1,80 @@ +/* + * + * 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. + * + */ + +#include + +#if defined(GPR_CPU_POSIX) + +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +static long ncpus = 0; + +static pthread_key_t thread_id_key; + +static void init_ncpus() { + ncpus = sysconf(_SC_NPROCESSORS_ONLN); + if (ncpus < 1 || ncpus > INT32_MAX) { + gpr_log(GPR_ERROR, "Cannot determine number of CPUs: assuming 1"); + ncpus = 1; + } +} + +unsigned gpr_cpu_num_cores(void) { + static gpr_once once = GPR_ONCE_INIT; + gpr_once_init(&once, init_ncpus); + return (unsigned)ncpus; +} + +static void delete_thread_id(void* value) { + if (value) { + gpr_free(value); + } +} + +static void init_thread_id_key(void) { + pthread_key_create(&thread_id_key, delete_thread_id); +} + +unsigned gpr_cpu_current_cpu(void) { + /* NOTE: there's no way I know to return the actual cpu index portably... + most code that's using this is using it to shard across work queues though, + so here we use thread identity instead to achieve a similar though not + identical effect */ + static gpr_once once = GPR_ONCE_INIT; + gpr_once_init(&once, init_thread_id_key); + + unsigned int* thread_id = + static_cast(pthread_getspecific(thread_id_key)); + if (thread_id == nullptr) { + thread_id = static_cast(gpr_malloc(sizeof(unsigned int))); + pthread_setspecific(thread_id_key, thread_id); + } + + return (unsigned)GPR_HASH_POINTER(thread_id, gpr_cpu_num_cores()); +} + +#endif /* GPR_CPU_POSIX */ diff --git a/src/core/lib/gpr/cpu_windows.cc b/src/core/lib/gpr/cpu_windows.cc new file mode 100644 index 0000000000..8d89453403 --- /dev/null +++ b/src/core/lib/gpr/cpu_windows.cc @@ -0,0 +1,33 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_WINDOWS +#include +#include + +unsigned gpr_cpu_num_cores(void) { + SYSTEM_INFO si; + GetSystemInfo(&si); + return si.dwNumberOfProcessors; +} + +unsigned gpr_cpu_current_cpu(void) { return GetCurrentProcessorNumber(); } + +#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/gpr/env.h b/src/core/lib/gpr/env.h new file mode 100644 index 0000000000..7f35104be3 --- /dev/null +++ b/src/core/lib/gpr/env.h @@ -0,0 +1,41 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_ENV_H +#define GRPC_CORE_LIB_GPR_ENV_H + +#include + +/* Env utility functions */ + +/* Gets the environment variable value with the specified name. + Returns a newly allocated string. It is the responsability of the caller to + gpr_free the return value if not NULL (which means that the environment + variable exists). */ +char* gpr_getenv(const char* name); + +/* Sets the the environment with the specified name to the specified value. */ +void gpr_setenv(const char* name, const char* value); + +/* This is a version of gpr_getenv that does not produce any output if it has to + use an insecure version of the function. It is ONLY to be used to solve the + problem in which we need to check an env variable to configure the verbosity + level of logging. So DO NOT USE THIS. */ +const char* gpr_getenv_silent(const char* name, char** dst); + +#endif /* GRPC_CORE_LIB_GPR_ENV_H */ diff --git a/src/core/lib/gpr/env_linux.cc b/src/core/lib/gpr/env_linux.cc new file mode 100644 index 0000000000..17902c3d0b --- /dev/null +++ b/src/core/lib/gpr/env_linux.cc @@ -0,0 +1,82 @@ +/* + * + * 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. + * + */ + +/* for secure_getenv. */ +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include + +#ifdef GPR_LINUX_ENV + +#include "src/core/lib/gpr/env.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/gpr/string.h" + +const char* gpr_getenv_silent(const char* name, char** dst) { + const char* insecure_func_used = nullptr; + char* result = nullptr; +#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE) + typedef char* (*getenv_type)(const char*); + static getenv_type getenv_func = NULL; + /* Check to see which getenv variant is supported (go from most + * to least secure) */ + const char* names[] = {"secure_getenv", "__secure_getenv", "getenv"}; + for (size_t i = 0; getenv_func == NULL && i < GPR_ARRAY_SIZE(names); i++) { + getenv_func = (getenv_type)dlsym(RTLD_DEFAULT, names[i]); + if (getenv_func != NULL && strstr(names[i], "secure") == NULL) { + insecure_func_used = names[i]; + } + } + result = getenv_func(name); +#elif __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17) + result = secure_getenv(name); +#else + result = getenv(name); + insecure_func_used = "getenv"; +#endif + *dst = result == nullptr ? result : gpr_strdup(result); + return insecure_func_used; +} + +char* gpr_getenv(const char* name) { + char* result = nullptr; + const char* insecure_func_used = gpr_getenv_silent(name, &result); + if (insecure_func_used != nullptr) { + gpr_log(GPR_DEBUG, "Warning: insecure environment read function '%s' used", + insecure_func_used); + } + return result; +} + +void gpr_setenv(const char* name, const char* value) { + int res = setenv(name, value, 1); + GPR_ASSERT(res == 0); +} + +#endif /* GPR_LINUX_ENV */ diff --git a/src/core/lib/gpr/env_posix.cc b/src/core/lib/gpr/env_posix.cc new file mode 100644 index 0000000000..599f85aa72 --- /dev/null +++ b/src/core/lib/gpr/env_posix.cc @@ -0,0 +1,47 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_ENV + +#include "src/core/lib/gpr/env.h" + +#include + +#include + +#include +#include "src/core/lib/gpr/string.h" + +const char* gpr_getenv_silent(const char* name, char** dst) { + *dst = gpr_getenv(name); + return nullptr; +} + +char* gpr_getenv(const char* name) { + char* result = getenv(name); + return result == nullptr ? result : gpr_strdup(result); +} + +void gpr_setenv(const char* name, const char* value) { + int res = setenv(name, value, 1); + GPR_ASSERT(res == 0); +} + +#endif /* GPR_POSIX_ENV */ diff --git a/src/core/lib/gpr/env_windows.cc b/src/core/lib/gpr/env_windows.cc new file mode 100644 index 0000000000..9ca1e02d03 --- /dev/null +++ b/src/core/lib/gpr/env_windows.cc @@ -0,0 +1,72 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_WINDOWS_ENV + +#include + +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/string_windows.h" + +#include +#include +#include + +const char* gpr_getenv_silent(const char* name, char** dst) { + *dst = gpr_getenv(name); + return NULL; +} + +char* gpr_getenv(const char* name) { + char* result = NULL; + DWORD size; + LPTSTR tresult = NULL; + LPTSTR tname = gpr_char_to_tchar(name); + DWORD ret; + + ret = GetEnvironmentVariable(tname, NULL, 0); + if (ret == 0) { + gpr_free(tname); + return NULL; + } + size = ret * (DWORD)sizeof(TCHAR); + tresult = (LPTSTR)gpr_malloc(size); + ret = GetEnvironmentVariable(tname, tresult, size); + gpr_free(tname); + if (ret == 0) { + gpr_free(tresult); + return NULL; + } + result = gpr_tchar_to_char(tresult); + gpr_free(tresult); + return result; +} + +void gpr_setenv(const char* name, const char* value) { + LPTSTR tname = gpr_char_to_tchar(name); + LPTSTR tvalue = gpr_char_to_tchar(value); + BOOL res = SetEnvironmentVariable(tname, tvalue); + gpr_free(tname); + gpr_free(tvalue); + GPR_ASSERT(res); +} + +#endif /* GPR_WINDOWS_ENV */ diff --git a/src/core/lib/gpr/fork.cc b/src/core/lib/gpr/fork.cc new file mode 100644 index 0000000000..c47e686378 --- /dev/null +++ b/src/core/lib/gpr/fork.cc @@ -0,0 +1,62 @@ +/* + * + * 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/gpr/fork.h" + +#include + +#include +#include + +#include "src/core/lib/gpr/env.h" + +/* + * NOTE: FORKING IS NOT GENERALLY SUPPORTED, THIS IS ONLY INTENDED TO WORK + * AROUND VERY SPECIFIC USE CASES. + */ + +static int override_fork_support_enabled = -1; +static int fork_support_enabled; + +void grpc_fork_support_init() { +#ifdef GRPC_ENABLE_FORK_SUPPORT + fork_support_enabled = 1; +#else + fork_support_enabled = 0; + char* env = gpr_getenv("GRPC_ENABLE_FORK_SUPPORT"); + if (env != nullptr) { + static const char* truthy[] = {"yes", "Yes", "YES", "true", + "True", "TRUE", "1"}; + for (size_t i = 0; i < GPR_ARRAY_SIZE(truthy); i++) { + if (0 == strcmp(env, truthy[i])) { + fork_support_enabled = 1; + } + } + gpr_free(env); + } +#endif + if (override_fork_support_enabled != -1) { + fork_support_enabled = override_fork_support_enabled; + } +} + +int grpc_fork_support_enabled() { return fork_support_enabled; } + +void grpc_enable_fork_support(int enable) { + override_fork_support_enabled = enable; +} diff --git a/src/core/lib/gpr/fork.h b/src/core/lib/gpr/fork.h new file mode 100644 index 0000000000..94c61bb836 --- /dev/null +++ b/src/core/lib/gpr/fork.h @@ -0,0 +1,35 @@ +/* + * + * 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_GPR_FORK_H +#define GRPC_CORE_LIB_GPR_FORK_H + +/* + * NOTE: FORKING IS NOT GENERALLY SUPPORTED, THIS IS ONLY INTENDED TO WORK + * AROUND VERY SPECIFIC USE CASES. + */ + +void grpc_fork_support_init(void); + +int grpc_fork_support_enabled(void); + +// Test only: Must be called before grpc_init(), and overrides +// environment variables/compile flags +void grpc_enable_fork_support(int enable); + +#endif /* GRPC_CORE_LIB_GPR_FORK_H */ diff --git a/src/core/lib/gpr/host_port.cc b/src/core/lib/gpr/host_port.cc new file mode 100644 index 0000000000..29178279d3 --- /dev/null +++ b/src/core/lib/gpr/host_port.cc @@ -0,0 +1,95 @@ +/* + * + * 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. + * + */ + +#include + +#include + +#include +#include +#include +#include "src/core/lib/gpr/string.h" + +int gpr_join_host_port(char** out, const char* host, int port) { + if (host[0] != '[' && strchr(host, ':') != nullptr) { + /* IPv6 literals must be enclosed in brackets. */ + return gpr_asprintf(out, "[%s]:%d", host, port); + } else { + /* Ordinary non-bracketed host:port. */ + return gpr_asprintf(out, "%s:%d", host, port); + } +} + +int gpr_split_host_port(const char* name, char** host, char** port) { + const char* host_start; + size_t host_len; + const char* port_start; + + *host = nullptr; + *port = nullptr; + + if (name[0] == '[') { + /* Parse a bracketed host, typically an IPv6 literal. */ + const char* rbracket = strchr(name, ']'); + if (rbracket == nullptr) { + /* Unmatched [ */ + return 0; + } + if (rbracket[1] == '\0') { + /* ] */ + port_start = nullptr; + } else if (rbracket[1] == ':') { + /* ]: */ + port_start = rbracket + 2; + } else { + /* ] */ + return 0; + } + host_start = name + 1; + host_len = (size_t)(rbracket - host_start); + if (memchr(host_start, ':', host_len) == nullptr) { + /* Require all bracketed hosts to contain a colon, because a hostname or + IPv4 address should never use brackets. */ + return 0; + } + } else { + const char* colon = strchr(name, ':'); + if (colon != nullptr && strchr(colon + 1, ':') == nullptr) { + /* Exactly 1 colon. Split into host:port. */ + host_start = name; + host_len = (size_t)(colon - name); + port_start = colon + 1; + } else { + /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */ + host_start = name; + host_len = strlen(name); + port_start = nullptr; + } + } + + /* Allocate return values. */ + *host = (char*)gpr_malloc(host_len + 1); + memcpy(*host, host_start, host_len); + (*host)[host_len] = '\0'; + + if (port_start != nullptr) { + *port = gpr_strdup(port_start); + } + + return 1; +} diff --git a/src/core/lib/gpr/log.cc b/src/core/lib/gpr/log.cc new file mode 100644 index 0000000000..19c0f6c34d --- /dev/null +++ b/src/core/lib/gpr/log.cc @@ -0,0 +1,94 @@ +/* + * + * 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. + * + */ + +#include +#include +#include +#include + +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" + +#include +#include + +void gpr_default_log(gpr_log_func_args* args); +static gpr_atm g_log_func = (gpr_atm)gpr_default_log; +static gpr_atm g_min_severity_to_print = GPR_LOG_VERBOSITY_UNSET; + +const char* gpr_log_severity_string(gpr_log_severity severity) { + switch (severity) { + case GPR_LOG_SEVERITY_DEBUG: + return "D"; + case GPR_LOG_SEVERITY_INFO: + return "I"; + case GPR_LOG_SEVERITY_ERROR: + return "E"; + } + GPR_UNREACHABLE_CODE(return "UNKNOWN"); +} + +void gpr_log_message(const char* file, int line, gpr_log_severity severity, + const char* message) { + if ((gpr_atm)severity < gpr_atm_no_barrier_load(&g_min_severity_to_print)) { + return; + } + + gpr_log_func_args lfargs; + memset(&lfargs, 0, sizeof(lfargs)); + lfargs.file = file; + lfargs.line = line; + lfargs.severity = severity; + lfargs.message = message; + ((gpr_log_func)gpr_atm_no_barrier_load(&g_log_func))(&lfargs); +} + +void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print) { + gpr_atm_no_barrier_store(&g_min_severity_to_print, + (gpr_atm)min_severity_to_print); +} + +void gpr_log_verbosity_init() { + char* verbosity = nullptr; + const char* insecure_getenv = gpr_getenv_silent("GRPC_VERBOSITY", &verbosity); + + gpr_atm min_severity_to_print = GPR_LOG_SEVERITY_ERROR; + if (verbosity != nullptr) { + if (gpr_stricmp(verbosity, "DEBUG") == 0) { + min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_DEBUG; + } else if (gpr_stricmp(verbosity, "INFO") == 0) { + min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_INFO; + } else if (gpr_stricmp(verbosity, "ERROR") == 0) { + min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_ERROR; + } + gpr_free(verbosity); + } + if ((gpr_atm_no_barrier_load(&g_min_severity_to_print)) == + GPR_LOG_VERBOSITY_UNSET) { + gpr_atm_no_barrier_store(&g_min_severity_to_print, min_severity_to_print); + } + + if (insecure_getenv != nullptr) { + gpr_log(GPR_DEBUG, "Warning: insecure environment read function '%s' used", + insecure_getenv); + } +} + +void gpr_set_log_function(gpr_log_func f) { + gpr_atm_no_barrier_store(&g_log_func, (gpr_atm)(f ? f : gpr_default_log)); +} diff --git a/src/core/lib/gpr/log_android.cc b/src/core/lib/gpr/log_android.cc new file mode 100644 index 0000000000..0d3ac0fe52 --- /dev/null +++ b/src/core/lib/gpr/log_android.cc @@ -0,0 +1,72 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_ANDROID + +#include +#include +#include +#include +#include +#include + +static android_LogPriority severity_to_log_priority(gpr_log_severity severity) { + switch (severity) { + case GPR_LOG_SEVERITY_DEBUG: + return ANDROID_LOG_DEBUG; + case GPR_LOG_SEVERITY_INFO: + return ANDROID_LOG_INFO; + case GPR_LOG_SEVERITY_ERROR: + return ANDROID_LOG_ERROR; + } + return ANDROID_LOG_DEFAULT; +} + +void gpr_log(const char* file, int line, gpr_log_severity severity, + const char* format, ...) { + char* message = NULL; + va_list args; + va_start(args, format); + vasprintf(&message, format, args); + va_end(args); + gpr_log_message(file, line, severity, message); + free(message); +} + +void gpr_default_log(gpr_log_func_args* args) { + const char* final_slash; + const char* display_file; + char* output = NULL; + + final_slash = strrchr(args->file, '/'); + if (final_slash == NULL) + display_file = args->file; + else + display_file = final_slash + 1; + + asprintf(&output, "%s:%d] %s", display_file, args->line, args->message); + + __android_log_write(severity_to_log_priority(args->severity), "GRPC", output); + + /* allocated by asprintf => use free, not gpr_free */ + free(output); +} + +#endif /* GPR_ANDROID */ diff --git a/src/core/lib/gpr/log_linux.cc b/src/core/lib/gpr/log_linux.cc new file mode 100644 index 0000000000..6b1f1c71e4 --- /dev/null +++ b/src/core/lib/gpr/log_linux.cc @@ -0,0 +1,92 @@ +/* + * + * 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. + * + */ + +#ifndef _POSIX_SOURCE +#define _POSIX_SOURCE +#endif + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include + +#ifdef GPR_LINUX_LOG + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static long gettid(void) { return syscall(__NR_gettid); } + +void gpr_log(const char* file, int line, gpr_log_severity severity, + const char* format, ...) { + char* message = nullptr; + va_list args; + va_start(args, format); + if (vasprintf(&message, format, args) == -1) { + va_end(args); + return; + } + va_end(args); + gpr_log_message(file, line, severity, message); + /* message has been allocated by vasprintf above, and needs free */ + free(message); +} + +void gpr_default_log(gpr_log_func_args* args) { + const char* final_slash; + char* prefix; + const char* display_file; + char time_buffer[64]; + time_t timer; + gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); + struct tm tm; + static __thread long tid = 0; + if (tid == 0) tid = gettid(); + + timer = (time_t)now.tv_sec; + final_slash = strrchr(args->file, '/'); + if (final_slash == nullptr) + display_file = args->file; + else + display_file = final_slash + 1; + + if (!localtime_r(&timer, &tm)) { + strcpy(time_buffer, "error:localtime"); + } else if (0 == + strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { + strcpy(time_buffer, "error:strftime"); + } + + gpr_asprintf(&prefix, "%s%s.%09" PRId32 " %7ld %s:%d]", + gpr_log_severity_string(args->severity), time_buffer, + now.tv_nsec, tid, display_file, args->line); + + fprintf(stderr, "%-60s %s\n", prefix, args->message); + gpr_free(prefix); +} + +#endif /* GPR_LINUX_LOG */ diff --git a/src/core/lib/gpr/log_posix.cc b/src/core/lib/gpr/log_posix.cc new file mode 100644 index 0000000000..6f93cdefcd --- /dev/null +++ b/src/core/lib/gpr/log_posix.cc @@ -0,0 +1,90 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_LOG + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static intptr_t gettid(void) { return (intptr_t)pthread_self(); } + +void gpr_log(const char* file, int line, gpr_log_severity severity, + const char* format, ...) { + char buf[64]; + char* allocated = nullptr; + char* message = nullptr; + int ret; + va_list args; + va_start(args, format); + ret = vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + if (ret < 0) { + message = nullptr; + } else if ((size_t)ret <= sizeof(buf) - 1) { + message = buf; + } else { + message = allocated = (char*)gpr_malloc((size_t)ret + 1); + va_start(args, format); + vsnprintf(message, (size_t)(ret + 1), format, args); + va_end(args); + } + gpr_log_message(file, line, severity, message); + gpr_free(allocated); +} + +void gpr_default_log(gpr_log_func_args* args) { + const char* final_slash; + const char* display_file; + char time_buffer[64]; + time_t timer; + gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); + struct tm tm; + + timer = (time_t)now.tv_sec; + final_slash = strrchr(args->file, '/'); + if (final_slash == nullptr) + display_file = args->file; + else + display_file = final_slash + 1; + + if (!localtime_r(&timer, &tm)) { + strcpy(time_buffer, "error:localtime"); + } else if (0 == + strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { + strcpy(time_buffer, "error:strftime"); + } + + char* prefix; + gpr_asprintf(&prefix, "%s%s.%09d %7tu %s:%d]", + gpr_log_severity_string(args->severity), time_buffer, + (int)(now.tv_nsec), gettid(), display_file, args->line); + + fprintf(stderr, "%-70s %s\n", prefix, args->message); + gpr_free(prefix); +} + +#endif /* defined(GPR_POSIX_LOG) */ diff --git a/src/core/lib/gpr/log_windows.cc b/src/core/lib/gpr/log_windows.cc new file mode 100644 index 0000000000..caaa973f5a --- /dev/null +++ b/src/core/lib/gpr/log_windows.cc @@ -0,0 +1,97 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_WINDOWS_LOG + +#include +#include + +#include +#include +#include +#include +#include + +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/string_windows.h" + +void gpr_log(const char* file, int line, gpr_log_severity severity, + const char* format, ...) { + char* message = NULL; + va_list args; + int ret; + + /* Determine the length. */ + va_start(args, format); + ret = _vscprintf(format, args); + va_end(args); + if (ret < 0) { + message = NULL; + } else { + /* Allocate a new buffer, with space for the NUL terminator. */ + size_t strp_buflen = (size_t)ret + 1; + message = (char*)gpr_malloc(strp_buflen); + + /* Print to the buffer. */ + va_start(args, format); + ret = vsnprintf_s(message, strp_buflen, _TRUNCATE, format, args); + va_end(args); + if ((size_t)ret != strp_buflen - 1) { + /* This should never happen. */ + gpr_free(message); + message = NULL; + } + } + + gpr_log_message(file, line, severity, message); + gpr_free(message); +} + +/* Simple starter implementation */ +void gpr_default_log(gpr_log_func_args* args) { + const char* final_slash; + const char* display_file; + char time_buffer[64]; + time_t timer; + gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); + struct tm tm; + + timer = (time_t)now.tv_sec; + final_slash = strrchr(args->file, '\\'); + if (final_slash == NULL) + display_file = args->file; + else + display_file = final_slash + 1; + + if (localtime_s(&tm, &timer)) { + strcpy(time_buffer, "error:localtime"); + } else if (0 == + strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { + strcpy(time_buffer, "error:strftime"); + } + + fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n", + gpr_log_severity_string(args->severity), time_buffer, + (int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line, + args->message); + fflush(stderr); +} + +#endif /* GPR_WINDOWS_LOG */ diff --git a/src/core/lib/gpr/mpscq.cc b/src/core/lib/gpr/mpscq.cc new file mode 100644 index 0000000000..34fc050a11 --- /dev/null +++ b/src/core/lib/gpr/mpscq.cc @@ -0,0 +1,114 @@ +/* + * + * Copyright 2016 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/gpr/mpscq.h" + +#include + +void gpr_mpscq_init(gpr_mpscq* q) { + gpr_atm_no_barrier_store(&q->head, (gpr_atm)&q->stub); + q->tail = &q->stub; + gpr_atm_no_barrier_store(&q->stub.next, (gpr_atm)NULL); +} + +void gpr_mpscq_destroy(gpr_mpscq* q) { + GPR_ASSERT(gpr_atm_no_barrier_load(&q->head) == (gpr_atm)&q->stub); + GPR_ASSERT(q->tail == &q->stub); +} + +bool gpr_mpscq_push(gpr_mpscq* q, gpr_mpscq_node* n) { + gpr_atm_no_barrier_store(&n->next, (gpr_atm)NULL); + gpr_mpscq_node* prev = + (gpr_mpscq_node*)gpr_atm_full_xchg(&q->head, (gpr_atm)n); + gpr_atm_rel_store(&prev->next, (gpr_atm)n); + return prev == &q->stub; +} + +gpr_mpscq_node* gpr_mpscq_pop(gpr_mpscq* q) { + bool empty; + return gpr_mpscq_pop_and_check_end(q, &empty); +} + +gpr_mpscq_node* gpr_mpscq_pop_and_check_end(gpr_mpscq* q, bool* empty) { + gpr_mpscq_node* tail = q->tail; + gpr_mpscq_node* next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); + if (tail == &q->stub) { + // indicates the list is actually (ephemerally) empty + if (next == nullptr) { + *empty = true; + return nullptr; + } + q->tail = next; + tail = next; + next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); + } + if (next != nullptr) { + *empty = false; + q->tail = next; + return tail; + } + gpr_mpscq_node* head = (gpr_mpscq_node*)gpr_atm_acq_load(&q->head); + if (tail != head) { + *empty = false; + // indicates a retry is in order: we're still adding + return nullptr; + } + gpr_mpscq_push(q, &q->stub); + next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); + if (next != nullptr) { + q->tail = next; + return tail; + } + // indicates a retry is in order: we're still adding + *empty = false; + return nullptr; +} + +void gpr_locked_mpscq_init(gpr_locked_mpscq* q) { + gpr_mpscq_init(&q->queue); + gpr_mu_init(&q->mu); +} + +void gpr_locked_mpscq_destroy(gpr_locked_mpscq* q) { + gpr_mpscq_destroy(&q->queue); + gpr_mu_destroy(&q->mu); +} + +bool gpr_locked_mpscq_push(gpr_locked_mpscq* q, gpr_mpscq_node* n) { + return gpr_mpscq_push(&q->queue, n); +} + +gpr_mpscq_node* gpr_locked_mpscq_try_pop(gpr_locked_mpscq* q) { + if (gpr_mu_trylock(&q->mu)) { + gpr_mpscq_node* n = gpr_mpscq_pop(&q->queue); + gpr_mu_unlock(&q->mu); + return n; + } + return nullptr; +} + +gpr_mpscq_node* gpr_locked_mpscq_pop(gpr_locked_mpscq* q) { + gpr_mu_lock(&q->mu); + bool empty = false; + gpr_mpscq_node* n; + do { + n = gpr_mpscq_pop_and_check_end(&q->queue, &empty); + } while (n == nullptr && !empty); + gpr_mu_unlock(&q->mu); + return n; +} diff --git a/src/core/lib/gpr/mpscq.h b/src/core/lib/gpr/mpscq.h new file mode 100644 index 0000000000..4409c5c9f5 --- /dev/null +++ b/src/core/lib/gpr/mpscq.h @@ -0,0 +1,84 @@ +/* + * + * Copyright 2016 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_GPR_MPSCQ_H +#define GRPC_CORE_LIB_GPR_MPSCQ_H + +#include +#include +#include +#include + +// Multiple-producer single-consumer lock free queue, based upon the +// implementation from Dmitry Vyukov here: +// http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue + +// List node (include this in a data structure at the top, and add application +// fields after it - to simulate inheritance) +typedef struct gpr_mpscq_node { + gpr_atm next; +} gpr_mpscq_node; + +// Actual queue type +typedef struct gpr_mpscq { + gpr_atm head; + // make sure head & tail don't share a cacheline + char padding[GPR_CACHELINE_SIZE]; + gpr_mpscq_node* tail; + gpr_mpscq_node stub; +} gpr_mpscq; + +void gpr_mpscq_init(gpr_mpscq* q); +void gpr_mpscq_destroy(gpr_mpscq* q); +// Push a node +// Thread safe - can be called from multiple threads concurrently +// Returns true if this was possibly the first node (may return true +// sporadically, will not return false sporadically) +bool gpr_mpscq_push(gpr_mpscq* q, gpr_mpscq_node* n); +// Pop a node (returns NULL if no node is ready - which doesn't indicate that +// the queue is empty!!) +// Thread compatible - can only be called from one thread at a time +gpr_mpscq_node* gpr_mpscq_pop(gpr_mpscq* q); +// Pop a node; sets *empty to true if the queue is empty, or false if it is not +gpr_mpscq_node* gpr_mpscq_pop_and_check_end(gpr_mpscq* q, bool* empty); + +// An mpscq with a lock: it's safe to pop from multiple threads, but doing +// only one thread will succeed concurrently +typedef struct gpr_locked_mpscq { + gpr_mpscq queue; + gpr_mu mu; +} gpr_locked_mpscq; + +void gpr_locked_mpscq_init(gpr_locked_mpscq* q); +void gpr_locked_mpscq_destroy(gpr_locked_mpscq* q); +// Push a node +// Thread safe - can be called from multiple threads concurrently +// Returns true if this was possibly the first node (may return true +// sporadically, will not return false sporadically) +bool gpr_locked_mpscq_push(gpr_locked_mpscq* q, gpr_mpscq_node* n); + +// Pop a node (returns NULL if no node is ready - which doesn't indicate that +// the queue is empty!!) +// Thread safe - can be called from multiple threads concurrently +gpr_mpscq_node* gpr_locked_mpscq_try_pop(gpr_locked_mpscq* q); + +// Pop a node. Returns NULL only if the queue was empty at some point after +// calling this function +gpr_mpscq_node* gpr_locked_mpscq_pop(gpr_locked_mpscq* q); + +#endif /* GRPC_CORE_LIB_GPR_MPSCQ_H */ diff --git a/src/core/lib/gpr/murmur_hash.cc b/src/core/lib/gpr/murmur_hash.cc new file mode 100644 index 0000000000..3f5e04d211 --- /dev/null +++ b/src/core/lib/gpr/murmur_hash.cc @@ -0,0 +1,78 @@ +/* + * + * 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. + * + */ + +#include "src/core/lib/gpr/murmur_hash.h" + +#include + +#define ROTL32(x, r) ((x) << (r)) | ((x) >> (32 - (r))) + +#define FMIX32(h) \ + (h) ^= (h) >> 16; \ + (h) *= 0x85ebca6b; \ + (h) ^= (h) >> 13; \ + (h) *= 0xc2b2ae35; \ + (h) ^= (h) >> 16; + +uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed) { + uint32_t h1 = seed; + uint32_t k1; + + const uint32_t c1 = 0xcc9e2d51; + const uint32_t c2 = 0x1b873593; + + const uint8_t* keyptr = (const uint8_t*)key; + const size_t bsize = sizeof(k1); + const size_t nblocks = len / bsize; + + /* body */ + for (size_t i = 0; i < nblocks; i++, keyptr += bsize) { + memcpy(&k1, keyptr, bsize); + + k1 *= c1; + k1 = ROTL32(k1, 15); + k1 *= c2; + + h1 ^= k1; + h1 = ROTL32(h1, 13); + h1 = h1 * 5 + 0xe6546b64; + } + + k1 = 0; + + /* tail */ + switch (len & 3) { + case 3: + k1 ^= ((uint32_t)keyptr[2]) << 16; + /* fallthrough */ + case 2: + k1 ^= ((uint32_t)keyptr[1]) << 8; + /* fallthrough */ + case 1: + k1 ^= keyptr[0]; + k1 *= c1; + k1 = ROTL32(k1, 15); + k1 *= c2; + h1 ^= k1; + }; + + /* finalization */ + h1 ^= (uint32_t)len; + FMIX32(h1); + return h1; +} diff --git a/src/core/lib/gpr/murmur_hash.h b/src/core/lib/gpr/murmur_hash.h new file mode 100644 index 0000000000..8004889a9a --- /dev/null +++ b/src/core/lib/gpr/murmur_hash.h @@ -0,0 +1,29 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_MURMUR_HASH_H +#define GRPC_CORE_LIB_GPR_MURMUR_HASH_H + +#include + +#include + +/* compute the hash of key (length len) */ +uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed); + +#endif /* GRPC_CORE_LIB_GPR_MURMUR_HASH_H */ diff --git a/src/core/lib/gpr/spinlock.h b/src/core/lib/gpr/spinlock.h new file mode 100644 index 0000000000..f03be1d791 --- /dev/null +++ b/src/core/lib/gpr/spinlock.h @@ -0,0 +1,44 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_SPINLOCK_H +#define GRPC_CORE_LIB_GPR_SPINLOCK_H + +#include + +/* Simple spinlock. No backoff strategy, gpr_spinlock_lock is almost always + a concurrency code smell. */ +typedef struct { + gpr_atm atm; +} gpr_spinlock; + +#ifdef __cplusplus +#define GPR_SPINLOCK_INITIALIZER (gpr_spinlock{0}) +#else +#define GPR_SPINLOCK_INITIALIZER ((gpr_spinlock){0}) +#endif +#define GPR_SPINLOCK_STATIC_INITIALIZER \ + { 0 } + +#define gpr_spinlock_trylock(lock) (gpr_atm_acq_cas(&(lock)->atm, 0, 1)) +#define gpr_spinlock_unlock(lock) (gpr_atm_rel_store(&(lock)->atm, 0)) +#define gpr_spinlock_lock(lock) \ + do { \ + } while (!gpr_spinlock_trylock((lock))) + +#endif /* GRPC_CORE_LIB_GPR_SPINLOCK_H */ diff --git a/src/core/lib/gpr/string.cc b/src/core/lib/gpr/string.cc new file mode 100644 index 0000000000..919d957d1b --- /dev/null +++ b/src/core/lib/gpr/string.cc @@ -0,0 +1,315 @@ +/* + * + * 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. + * + */ + +#include "src/core/lib/gpr/string.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +char* gpr_strdup(const char* src) { + char* dst; + size_t len; + + if (!src) { + return nullptr; + } + + len = strlen(src) + 1; + dst = (char*)gpr_malloc(len); + + memcpy(dst, src, len); + + return dst; +} + +typedef struct { + size_t capacity; + size_t length; + char* data; +} dump_out; + +static dump_out dump_out_create(void) { + dump_out r = {0, 0, nullptr}; + return r; +} + +static void dump_out_append(dump_out* out, char c) { + if (out->length == out->capacity) { + out->capacity = GPR_MAX(8, 2 * out->capacity); + out->data = (char*)gpr_realloc(out->data, out->capacity); + } + out->data[out->length++] = c; +} + +static void hexdump(dump_out* out, const char* buf, size_t len) { + static const char* hex = "0123456789abcdef"; + + const uint8_t* const beg = (const uint8_t*)buf; + const uint8_t* const end = beg + len; + const uint8_t* cur; + + for (cur = beg; cur != end; ++cur) { + if (cur != beg) dump_out_append(out, ' '); + dump_out_append(out, hex[*cur >> 4]); + dump_out_append(out, hex[*cur & 0xf]); + } +} + +static void asciidump(dump_out* out, const char* buf, size_t len) { + const uint8_t* const beg = (const uint8_t*)buf; + const uint8_t* const end = beg + len; + const uint8_t* cur; + int out_was_empty = (out->length == 0); + if (!out_was_empty) { + dump_out_append(out, ' '); + dump_out_append(out, '\''); + } + for (cur = beg; cur != end; ++cur) { + dump_out_append(out, (char)(isprint(*cur) ? *(char*)cur : '.')); + } + if (!out_was_empty) { + dump_out_append(out, '\''); + } +} + +char* gpr_dump(const char* buf, size_t len, uint32_t flags) { + dump_out out = dump_out_create(); + if (flags & GPR_DUMP_HEX) { + hexdump(&out, buf, len); + } + if (flags & GPR_DUMP_ASCII) { + asciidump(&out, buf, len); + } + dump_out_append(&out, 0); + return out.data; +} + +int gpr_parse_bytes_to_uint32(const char* buf, size_t len, uint32_t* result) { + uint32_t out = 0; + uint32_t new_val; + size_t i; + + if (len == 0) return 0; /* must have some bytes */ + + for (i = 0; i < len; i++) { + if (buf[i] < '0' || buf[i] > '9') return 0; /* bad char */ + new_val = 10 * out + (uint32_t)(buf[i] - '0'); + if (new_val < out) return 0; /* overflow */ + out = new_val; + } + + *result = out; + return 1; +} + +void gpr_reverse_bytes(char* str, int len) { + char *p1, *p2; + for (p1 = str, p2 = str + len - 1; p2 > p1; ++p1, --p2) { + char temp = *p1; + *p1 = *p2; + *p2 = temp; + } +} + +int gpr_ltoa(long value, char* string) { + long sign; + int i = 0; + + if (value == 0) { + string[0] = '0'; + string[1] = 0; + return 1; + } + + sign = value < 0 ? -1 : 1; + while (value) { + string[i++] = (char)('0' + sign * (value % 10)); + value /= 10; + } + if (sign < 0) string[i++] = '-'; + gpr_reverse_bytes(string, i); + string[i] = 0; + return i; +} + +int int64_ttoa(int64_t value, char* string) { + int64_t sign; + int i = 0; + + if (value == 0) { + string[0] = '0'; + string[1] = 0; + return 1; + } + + sign = value < 0 ? -1 : 1; + while (value) { + string[i++] = (char)('0' + sign * (value % 10)); + value /= 10; + } + if (sign < 0) string[i++] = '-'; + gpr_reverse_bytes(string, i); + string[i] = 0; + return i; +} + +int gpr_parse_nonnegative_int(const char* value) { + char* end; + long result = strtol(value, &end, 0); + if (*end != '\0' || result < 0 || result > INT_MAX) return -1; + return (int)result; +} + +char* gpr_leftpad(const char* str, char flag, size_t length) { + const size_t str_length = strlen(str); + const size_t out_length = str_length > length ? str_length : length; + char* out = (char*)gpr_malloc(out_length + 1); + memset(out, flag, out_length - str_length); + memcpy(out + out_length - str_length, str, str_length); + out[out_length] = 0; + return out; +} + +char* gpr_strjoin(const char** strs, size_t nstrs, size_t* final_length) { + return gpr_strjoin_sep(strs, nstrs, "", final_length); +} + +char* gpr_strjoin_sep(const char** strs, size_t nstrs, const char* sep, + size_t* final_length) { + const size_t sep_len = strlen(sep); + size_t out_length = 0; + size_t i; + char* out; + for (i = 0; i < nstrs; i++) { + out_length += strlen(strs[i]); + } + out_length += 1; /* null terminator */ + if (nstrs > 0) { + out_length += sep_len * (nstrs - 1); /* separators */ + } + out = (char*)gpr_malloc(out_length); + out_length = 0; + for (i = 0; i < nstrs; i++) { + const size_t slen = strlen(strs[i]); + if (i != 0) { + memcpy(out + out_length, sep, sep_len); + out_length += sep_len; + } + memcpy(out + out_length, strs[i], slen); + out_length += slen; + } + out[out_length] = 0; + if (final_length != nullptr) { + *final_length = out_length; + } + return out; +} + +void gpr_strvec_init(gpr_strvec* sv) { memset(sv, 0, sizeof(*sv)); } + +void gpr_strvec_destroy(gpr_strvec* sv) { + size_t i; + for (i = 0; i < sv->count; i++) { + gpr_free(sv->strs[i]); + } + gpr_free(sv->strs); +} + +void gpr_strvec_add(gpr_strvec* sv, char* str) { + if (sv->count == sv->capacity) { + sv->capacity = GPR_MAX(sv->capacity + 8, sv->capacity * 2); + sv->strs = (char**)gpr_realloc(sv->strs, sizeof(char*) * sv->capacity); + } + sv->strs[sv->count++] = str; +} + +char* gpr_strvec_flatten(gpr_strvec* sv, size_t* final_length) { + return gpr_strjoin((const char**)sv->strs, sv->count, final_length); +} + +int gpr_stricmp(const char* a, const char* b) { + int ca, cb; + do { + ca = tolower(*a); + cb = tolower(*b); + ++a; + ++b; + } while (ca == cb && ca && cb); + return ca - cb; +} + +static void add_string_to_split(const char* beg, const char* end, char*** strs, + size_t* nstrs, size_t* capstrs) { + char* out = (char*)gpr_malloc((size_t)(end - beg) + 1); + memcpy(out, beg, (size_t)(end - beg)); + out[end - beg] = 0; + if (*nstrs == *capstrs) { + *capstrs = GPR_MAX(8, 2 * *capstrs); + *strs = (char**)gpr_realloc(*strs, sizeof(*strs) * *capstrs); + } + (*strs)[*nstrs] = out; + ++*nstrs; +} + +void gpr_string_split(const char* input, const char* sep, char*** strs, + size_t* nstrs) { + const char* next; + *strs = nullptr; + *nstrs = 0; + size_t capstrs = 0; + while ((next = strstr(input, sep))) { + add_string_to_split(input, next, strs, nstrs, &capstrs); + input = next + strlen(sep); + } + add_string_to_split(input, input + strlen(input), strs, nstrs, &capstrs); +} + +void* gpr_memrchr(const void* s, int c, size_t n) { + if (s == nullptr) return nullptr; + char* b = (char*)s; + size_t i; + for (i = 0; i < n; i++) { + if (b[n - i - 1] == c) { + return &b[n - i - 1]; + } + } + return nullptr; +} + +bool gpr_is_true(const char* s) { + size_t i; + if (s == nullptr) { + return false; + } + static const char* truthy[] = {"yes", "true", "1"}; + for (i = 0; i < GPR_ARRAY_SIZE(truthy); i++) { + if (0 == gpr_stricmp(s, truthy[i])) { + return true; + } + } + return false; +} diff --git a/src/core/lib/gpr/string.h b/src/core/lib/gpr/string.h new file mode 100644 index 0000000000..ef3a8c6086 --- /dev/null +++ b/src/core/lib/gpr/string.h @@ -0,0 +1,109 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_STRING_H +#define GRPC_CORE_LIB_GPR_STRING_H + +#include +#include + +#include + +/* String utility functions */ + +/* Flags for gpr_dump function. */ +#define GPR_DUMP_HEX 0x00000001 +#define GPR_DUMP_ASCII 0x00000002 + +/* Converts array buf, of length len, into a C string according to the flags. + Result should be freed with gpr_free() */ +char* gpr_dump(const char* buf, size_t len, uint32_t flags); + +/* Parses an array of bytes into an integer (base 10). Returns 1 on success, + 0 on failure. */ +int gpr_parse_bytes_to_uint32(const char* data, size_t length, + uint32_t* result); + +/* Minimum buffer size for calling ltoa */ +#define GPR_LTOA_MIN_BUFSIZE (3 * sizeof(long)) + +/* Convert a long to a string in base 10; returns the length of the + output string (or 0 on failure). + output must be at least GPR_LTOA_MIN_BUFSIZE bytes long. */ +int gpr_ltoa(long value, char* output); + +/* Minimum buffer size for calling int64toa */ +#define GPR_INT64TOA_MIN_BUFSIZE (3 * sizeof(int64_t)) + +/* Convert an int64 to a string in base 10; returns the length of the +output string (or 0 on failure). +output must be at least GPR_INT64TOA_MIN_BUFSIZE bytes long. +NOTE: This function ensures sufficient bit width even on Win x64, +where long is 32bit is size.*/ +int int64_ttoa(int64_t value, char* output); + +// Parses a non-negative number from a value string. Returns -1 on error. +int gpr_parse_nonnegative_int(const char* value); + +/* Reverse a run of bytes */ +void gpr_reverse_bytes(char* str, int len); + +/* Pad a string with flag characters. The given length specifies the minimum + field width. The input string is never truncated. */ +char* gpr_leftpad(const char* str, char flag, size_t length); + +/* Join a set of strings, returning the resulting string. + Total combined length (excluding null terminator) is returned in total_length + if it is non-null. */ +char* gpr_strjoin(const char** strs, size_t nstrs, size_t* total_length); + +/* Join a set of strings using a separator, returning the resulting string. + Total combined length (excluding null terminator) is returned in total_length + if it is non-null. */ +char* gpr_strjoin_sep(const char** strs, size_t nstrs, const char* sep, + size_t* total_length); + +void gpr_string_split(const char* input, const char* sep, char*** strs, + size_t* nstrs); + +/* A vector of strings... for building up a final string one piece at a time */ +typedef struct { + char** strs; + size_t count; + size_t capacity; +} gpr_strvec; + +/* Initialize/destroy */ +void gpr_strvec_init(gpr_strvec* strs); +void gpr_strvec_destroy(gpr_strvec* strs); +/* Add a string to a strvec, takes ownership of the string */ +void gpr_strvec_add(gpr_strvec* strs, char* add); +/* Return a joined string with all added substrings, optionally setting + total_length as per gpr_strjoin */ +char* gpr_strvec_flatten(gpr_strvec* strs, size_t* total_length); + +/** Case insensitive string comparison... return <0 if lower(a)0 if lower(a)>lower(b) */ +int gpr_stricmp(const char* a, const char* b); + +void* gpr_memrchr(const void* s, int c, size_t n); + +/** Return true if lower(s) equals "true", "yes" or "1", otherwise false. */ +bool gpr_is_true(const char* s); + +#endif /* GRPC_CORE_LIB_GPR_STRING_H */ diff --git a/src/core/lib/gpr/string_posix.cc b/src/core/lib/gpr/string_posix.cc new file mode 100644 index 0000000000..8b818e39b9 --- /dev/null +++ b/src/core/lib/gpr/string_posix.cc @@ -0,0 +1,72 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_STRING + +#include +#include +#include + +#include +#include + +int gpr_asprintf(char** strp, const char* format, ...) { + va_list args; + int ret; + char buf[64]; + size_t strp_buflen; + + /* Use a constant-sized buffer to determine the length. */ + va_start(args, format); + ret = vsnprintf(buf, sizeof(buf), format, args); + va_end(args); + if (ret < 0) { + *strp = nullptr; + return -1; + } + + /* Allocate a new buffer, with space for the NUL terminator. */ + strp_buflen = (size_t)ret + 1; + if ((*strp = (char*)gpr_malloc(strp_buflen)) == nullptr) { + /* This shouldn't happen, because gpr_malloc() calls abort(). */ + return -1; + } + + /* Return early if we have all the bytes. */ + if (strp_buflen <= sizeof(buf)) { + memcpy(*strp, buf, strp_buflen); + return ret; + } + + /* Try again using the larger buffer. */ + va_start(args, format); + ret = vsnprintf(*strp, strp_buflen, format, args); + va_end(args); + if ((size_t)ret == strp_buflen - 1) { + return ret; + } + + /* This should never happen. */ + gpr_free(*strp); + *strp = nullptr; + return -1; +} + +#endif /* GPR_POSIX_STRING */ diff --git a/src/core/lib/gpr/string_util_windows.cc b/src/core/lib/gpr/string_util_windows.cc new file mode 100644 index 0000000000..8c8c99cd21 --- /dev/null +++ b/src/core/lib/gpr/string_util_windows.cc @@ -0,0 +1,82 @@ +/* + * + * Copyright 2016 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. + * + */ + +/* Posix code for gpr snprintf support. */ + +#include + +#ifdef GPR_WINDOWS + +/* Some platforms (namely msys) need wchar to be included BEFORE + anything else, especially strsafe.h. */ +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/string_windows.h" + +#if defined UNICODE || defined _UNICODE +LPTSTR +gpr_char_to_tchar(LPCSTR input) { + LPTSTR ret; + int needed = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); + if (needed <= 0) return NULL; + ret = (LPTSTR)gpr_malloc((unsigned)needed * sizeof(TCHAR)); + MultiByteToWideChar(CP_UTF8, 0, input, -1, ret, needed); + return ret; +} + +LPSTR +gpr_tchar_to_char(LPCTSTR input) { + LPSTR ret; + int needed = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); + if (needed <= 0) return NULL; + ret = (LPSTR)gpr_malloc((unsigned)needed); + WideCharToMultiByte(CP_UTF8, 0, input, -1, ret, needed, NULL, NULL); + return ret; +} +#else +LPSTR gpr_tchar_to_char(LPCTSTR input) { return (LPSTR)gpr_strdup(input); } + +LPTSTR gpr_char_to_tchar(LPCTSTR input) { return (LPTSTR)gpr_strdup(input); } +#endif + +char* gpr_format_message(int messageid) { + LPTSTR tmessage; + char* message; + DWORD status = FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, (DWORD)messageid, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), + (LPTSTR)(&tmessage), 0, NULL); + if (status == 0) return gpr_strdup("Unable to retrieve error string"); + message = gpr_tchar_to_char(tmessage); + LocalFree(tmessage); + return message; +} + +#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/gpr/string_windows.cc b/src/core/lib/gpr/string_windows.cc new file mode 100644 index 0000000000..25bfd412e4 --- /dev/null +++ b/src/core/lib/gpr/string_windows.cc @@ -0,0 +1,69 @@ +/* + * + * 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. + * + */ + +/* Windows code for gpr snprintf support. */ + +#include + +#ifdef GPR_WINDOWS_STRING + +#include +#include +#include + +#include +#include + +#include "src/core/lib/gpr/string.h" + +int gpr_asprintf(char** strp, const char* format, ...) { + va_list args; + int ret; + size_t strp_buflen; + + /* Determine the length. */ + va_start(args, format); + ret = _vscprintf(format, args); + va_end(args); + if (ret < 0) { + *strp = NULL; + return -1; + } + + /* Allocate a new buffer, with space for the NUL terminator. */ + strp_buflen = (size_t)ret + 1; + if ((*strp = (char*)gpr_malloc(strp_buflen)) == NULL) { + /* This shouldn't happen, because gpr_malloc() calls abort(). */ + return -1; + } + + /* Print to the buffer. */ + va_start(args, format); + ret = vsnprintf_s(*strp, strp_buflen, _TRUNCATE, format, args); + va_end(args); + if ((size_t)ret == strp_buflen - 1) { + return ret; + } + + /* This should never happen. */ + gpr_free(*strp); + *strp = NULL; + return -1; +} + +#endif /* GPR_WINDOWS_STRING */ diff --git a/src/core/lib/gpr/string_windows.h b/src/core/lib/gpr/string_windows.h new file mode 100644 index 0000000000..e370f802cf --- /dev/null +++ b/src/core/lib/gpr/string_windows.h @@ -0,0 +1,32 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_STRING_WINDOWS_H +#define GRPC_CORE_LIB_GPR_STRING_WINDOWS_H + +#include + +#ifdef GPR_WINDOWS + +/* These allocate new strings using gpr_malloc to convert from and to utf-8. */ +LPTSTR gpr_char_to_tchar(LPCSTR input); +LPSTR gpr_tchar_to_char(LPCTSTR input); + +#endif /* GPR_WINDOWS */ + +#endif /* GRPC_CORE_LIB_GPR_STRING_WINDOWS_H */ diff --git a/src/core/lib/gpr/subprocess_posix.cc b/src/core/lib/gpr/subprocess_posix.cc new file mode 100644 index 0000000000..dc046b6499 --- /dev/null +++ b/src/core/lib/gpr/subprocess_posix.cc @@ -0,0 +1,99 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_SUBPROCESS + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +struct gpr_subprocess { + int pid; + bool joined; +}; + +const char* gpr_subprocess_binary_extension() { return ""; } + +gpr_subprocess* gpr_subprocess_create(int argc, const char** argv) { + gpr_subprocess* r; + int pid; + char** exec_args; + + pid = fork(); + if (pid == -1) { + return nullptr; + } else if (pid == 0) { + exec_args = (char**)gpr_malloc(((size_t)argc + 1) * sizeof(char*)); + memcpy(exec_args, argv, (size_t)argc * sizeof(char*)); + exec_args[argc] = nullptr; + execv(exec_args[0], exec_args); + /* if we reach here, an error has occurred */ + gpr_log(GPR_ERROR, "execv '%s' failed: %s", exec_args[0], strerror(errno)); + _exit(1); + return nullptr; + } else { + r = (gpr_subprocess*)gpr_zalloc(sizeof(gpr_subprocess)); + r->pid = pid; + return r; + } +} + +void gpr_subprocess_destroy(gpr_subprocess* p) { + if (!p->joined) { + kill(p->pid, SIGKILL); + gpr_subprocess_join(p); + } + gpr_free(p); +} + +int gpr_subprocess_join(gpr_subprocess* p) { + int status; +retry: + if (waitpid(p->pid, &status, 0) == -1) { + if (errno == EINTR) { + goto retry; + } + gpr_log(GPR_ERROR, "waitpid failed for pid %d: %s", p->pid, + strerror(errno)); + return -1; + } + p->joined = true; + return status; +} + +void gpr_subprocess_interrupt(gpr_subprocess* p) { + if (!p->joined) { + kill(p->pid, SIGINT); + } +} + +#endif /* GPR_POSIX_SUBPROCESS */ diff --git a/src/core/lib/gpr/subprocess_windows.cc b/src/core/lib/gpr/subprocess_windows.cc new file mode 100644 index 0000000000..1947d475e3 --- /dev/null +++ b/src/core/lib/gpr/subprocess_windows.cc @@ -0,0 +1,126 @@ +/* + * + * Copyright 2016 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 + +#ifdef GPR_WINDOWS_SUBPROCESS + +#include +#include +#include + +#include +#include +#include +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/string_windows.h" + +struct gpr_subprocess { + PROCESS_INFORMATION pi; + int joined; + int interrupted; +}; + +const char* gpr_subprocess_binary_extension() { return ".exe"; } + +gpr_subprocess* gpr_subprocess_create(int argc, const char** argv) { + gpr_subprocess* r; + + STARTUPINFO si; + PROCESS_INFORMATION pi; + + char* args = gpr_strjoin_sep(argv, (size_t)argc, " ", NULL); + TCHAR* args_tchar; + + args_tchar = gpr_char_to_tchar(args); + gpr_free(args); + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + memset(&pi, 0, sizeof(pi)); + + if (!CreateProcess(NULL, args_tchar, NULL, NULL, FALSE, + CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi)) { + gpr_free(args_tchar); + return NULL; + } + gpr_free(args_tchar); + + r = (gpr_subprocess*)gpr_malloc(sizeof(gpr_subprocess)); + memset(r, 0, sizeof(*r)); + r->pi = pi; + return r; +} + +void gpr_subprocess_destroy(gpr_subprocess* p) { + if (p) { + if (!p->joined) { + gpr_subprocess_interrupt(p); + gpr_subprocess_join(p); + } + if (p->pi.hProcess) { + CloseHandle(p->pi.hProcess); + } + if (p->pi.hThread) { + CloseHandle(p->pi.hThread); + } + gpr_free(p); + } +} + +int gpr_subprocess_join(gpr_subprocess* p) { + DWORD dwExitCode; + if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { + if (dwExitCode == STILL_ACTIVE) { + if (WaitForSingleObject(p->pi.hProcess, INFINITE) == WAIT_OBJECT_0) { + p->joined = 1; + goto getExitCode; + } + return -1; // failed to join + } else { + goto getExitCode; + } + } else { + return -1; // failed to get exit code + } + +getExitCode: + if (p->interrupted) { + return 0; + } + if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { + return (int)dwExitCode; + } else { + return -1; // failed to get exit code + } +} + +void gpr_subprocess_interrupt(gpr_subprocess* p) { + DWORD dwExitCode; + if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { + if (dwExitCode == STILL_ACTIVE) { + gpr_log(GPR_INFO, "sending ctrl-break"); + GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, p->pi.dwProcessId); + p->joined = 1; + p->interrupted = 1; + } + } + return; +} + +#endif /* GPR_WINDOWS_SUBPROCESS */ diff --git a/src/core/lib/gpr/sync.cc b/src/core/lib/gpr/sync.cc new file mode 100644 index 0000000000..347ffcd00e --- /dev/null +++ b/src/core/lib/gpr/sync.cc @@ -0,0 +1,122 @@ +/* + * + * 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. + * + */ + +/* Generic implementation of synchronization primitives. */ + +#include +#include +#include + +#include + +/* Number of mutexes to allocate for events, to avoid lock contention. + Should be a prime. */ +enum { event_sync_partitions = 31 }; + +/* Events are partitioned by address to avoid lock contention. */ +static struct sync_array_s { + gpr_mu mu; + gpr_cv cv; +} sync_array[event_sync_partitions]; + +/* This routine is executed once on first use, via event_once */ +static gpr_once event_once = GPR_ONCE_INIT; +static void event_initialize(void) { + int i; + for (i = 0; i != event_sync_partitions; i++) { + gpr_mu_init(&sync_array[i].mu); + gpr_cv_init(&sync_array[i].cv); + } +} + +/* Hash ev into an element of sync_array[]. */ +static struct sync_array_s* hash(gpr_event* ev) { + return &sync_array[((uintptr_t)ev) % event_sync_partitions]; +} + +void gpr_event_init(gpr_event* ev) { + gpr_once_init(&event_once, &event_initialize); + ev->state = 0; +} + +void gpr_event_set(gpr_event* ev, void* value) { + struct sync_array_s* s = hash(ev); + gpr_mu_lock(&s->mu); + GPR_ASSERT(gpr_atm_acq_load(&ev->state) == 0); + gpr_atm_rel_store(&ev->state, (gpr_atm)value); + gpr_cv_broadcast(&s->cv); + gpr_mu_unlock(&s->mu); + GPR_ASSERT(value != nullptr); +} + +void* gpr_event_get(gpr_event* ev) { + return (void*)gpr_atm_acq_load(&ev->state); +} + +void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline) { + void* result = (void*)gpr_atm_acq_load(&ev->state); + if (result == nullptr) { + struct sync_array_s* s = hash(ev); + gpr_mu_lock(&s->mu); + do { + result = (void*)gpr_atm_acq_load(&ev->state); + } while (result == nullptr && !gpr_cv_wait(&s->cv, &s->mu, abs_deadline)); + gpr_mu_unlock(&s->mu); + } + return result; +} + +void gpr_ref_init(gpr_refcount* r, int n) { gpr_atm_rel_store(&r->count, n); } + +void gpr_ref(gpr_refcount* r) { gpr_atm_no_barrier_fetch_add(&r->count, 1); } + +void gpr_ref_non_zero(gpr_refcount* r) { +#ifndef NDEBUG + gpr_atm prior = gpr_atm_no_barrier_fetch_add(&r->count, 1); + assert(prior > 0); +#else + gpr_ref(r); +#endif +} + +void gpr_refn(gpr_refcount* r, int n) { + gpr_atm_no_barrier_fetch_add(&r->count, n); +} + +int gpr_unref(gpr_refcount* r) { + gpr_atm prior = gpr_atm_full_fetch_add(&r->count, -1); + GPR_ASSERT(prior > 0); + return prior == 1; +} + +int gpr_ref_is_unique(gpr_refcount* r) { + return gpr_atm_acq_load(&r->count) == 1; +} + +void gpr_stats_init(gpr_stats_counter* c, intptr_t n) { + gpr_atm_rel_store(&c->value, n); +} + +void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc) { + gpr_atm_no_barrier_fetch_add(&c->value, inc); +} + +intptr_t gpr_stats_read(const gpr_stats_counter* c) { + /* don't need acquire-load, but we have no no-barrier load yet */ + return gpr_atm_acq_load(&c->value); +} diff --git a/src/core/lib/gpr/sync_posix.cc b/src/core/lib/gpr/sync_posix.cc new file mode 100644 index 0000000000..c3f6b10463 --- /dev/null +++ b/src/core/lib/gpr/sync_posix.cc @@ -0,0 +1,111 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_SYNC + +#include +#include +#include +#include +#include +#include "src/core/lib/profiling/timers.h" + +#ifdef GPR_LOW_LEVEL_COUNTERS +gpr_atm gpr_mu_locks = 0; +gpr_atm gpr_counter_atm_cas = 0; +gpr_atm gpr_counter_atm_add = 0; +#endif + +void gpr_mu_init(gpr_mu* mu) { + GPR_ASSERT(pthread_mutex_init(mu, nullptr) == 0); +} + +void gpr_mu_destroy(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_destroy(mu) == 0); } + +void gpr_mu_lock(gpr_mu* mu) { +#ifdef GPR_LOW_LEVEL_COUNTERS + GPR_ATM_INC_COUNTER(gpr_mu_locks); +#endif + GPR_TIMER_BEGIN("gpr_mu_lock", 0); + GPR_ASSERT(pthread_mutex_lock(mu) == 0); + GPR_TIMER_END("gpr_mu_lock", 0); +} + +void gpr_mu_unlock(gpr_mu* mu) { + GPR_TIMER_BEGIN("gpr_mu_unlock", 0); + GPR_ASSERT(pthread_mutex_unlock(mu) == 0); + GPR_TIMER_END("gpr_mu_unlock", 0); +} + +int gpr_mu_trylock(gpr_mu* mu) { + int err; + GPR_TIMER_BEGIN("gpr_mu_trylock", 0); + err = pthread_mutex_trylock(mu); + GPR_ASSERT(err == 0 || err == EBUSY); + GPR_TIMER_END("gpr_mu_trylock", 0); + return err == 0; +} + +/*----------------------------------------*/ + +void gpr_cv_init(gpr_cv* cv) { + pthread_condattr_t attr; + GPR_ASSERT(pthread_condattr_init(&attr) == 0); +#if GPR_LINUX + GPR_ASSERT(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) == 0); +#endif // GPR_LINUX + GPR_ASSERT(pthread_cond_init(cv, &attr) == 0); +} + +void gpr_cv_destroy(gpr_cv* cv) { GPR_ASSERT(pthread_cond_destroy(cv) == 0); } + +int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) { + int err = 0; + if (gpr_time_cmp(abs_deadline, gpr_inf_future(abs_deadline.clock_type)) == + 0) { + err = pthread_cond_wait(cv, mu); + } else { + struct timespec abs_deadline_ts; +#if GPR_LINUX + abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_MONOTONIC); +#else + abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_REALTIME); +#endif // GPR_LINUX + abs_deadline_ts.tv_sec = (time_t)abs_deadline.tv_sec; + abs_deadline_ts.tv_nsec = abs_deadline.tv_nsec; + err = pthread_cond_timedwait(cv, mu, &abs_deadline_ts); + } + GPR_ASSERT(err == 0 || err == ETIMEDOUT || err == EAGAIN); + return err == ETIMEDOUT; +} + +void gpr_cv_signal(gpr_cv* cv) { GPR_ASSERT(pthread_cond_signal(cv) == 0); } + +void gpr_cv_broadcast(gpr_cv* cv) { + GPR_ASSERT(pthread_cond_broadcast(cv) == 0); +} + +/*----------------------------------------*/ + +void gpr_once_init(gpr_once* once, void (*init_function)(void)) { + GPR_ASSERT(pthread_once(once, init_function) == 0); +} + +#endif /* GRP_POSIX_SYNC */ diff --git a/src/core/lib/gpr/sync_windows.cc b/src/core/lib/gpr/sync_windows.cc new file mode 100644 index 0000000000..7cd41633d5 --- /dev/null +++ b/src/core/lib/gpr/sync_windows.cc @@ -0,0 +1,118 @@ +/* + * + * 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. + * + */ + +/* Win32 code for gpr synchronization support. */ + +#include + +#ifdef GPR_WINDOWS + +#include +#include +#include + +void gpr_mu_init(gpr_mu* mu) { + InitializeCriticalSection(&mu->cs); + mu->locked = 0; +} + +void gpr_mu_destroy(gpr_mu* mu) { DeleteCriticalSection(&mu->cs); } + +void gpr_mu_lock(gpr_mu* mu) { + EnterCriticalSection(&mu->cs); + GPR_ASSERT(!mu->locked); + mu->locked = 1; +} + +void gpr_mu_unlock(gpr_mu* mu) { + mu->locked = 0; + LeaveCriticalSection(&mu->cs); +} + +int gpr_mu_trylock(gpr_mu* mu) { + int result = TryEnterCriticalSection(&mu->cs); + if (result) { + if (mu->locked) { /* This thread already holds the lock. */ + LeaveCriticalSection(&mu->cs); /* Decrement lock count. */ + result = 0; /* Indicate failure */ + } + mu->locked = 1; + } + return result; +} + +/*----------------------------------------*/ + +void gpr_cv_init(gpr_cv* cv) { InitializeConditionVariable(cv); } + +void gpr_cv_destroy(gpr_cv* cv) { + /* Condition variables don't need destruction in Win32. */ +} + +int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) { + int timeout = 0; + DWORD timeout_max_ms; + mu->locked = 0; + if (gpr_time_cmp(abs_deadline, gpr_inf_future(abs_deadline.clock_type)) == + 0) { + SleepConditionVariableCS(cv, &mu->cs, INFINITE); + } else { + abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_REALTIME); + gpr_timespec now = gpr_now(abs_deadline.clock_type); + int64_t now_ms = (int64_t)now.tv_sec * 1000 + now.tv_nsec / 1000000; + int64_t deadline_ms = + (int64_t)abs_deadline.tv_sec * 1000 + abs_deadline.tv_nsec / 1000000; + if (now_ms >= deadline_ms) { + timeout = 1; + } else { + if ((deadline_ms - now_ms) >= INFINITE) { + timeout_max_ms = INFINITE - 1; + } else { + timeout_max_ms = (DWORD)(deadline_ms - now_ms); + } + timeout = (SleepConditionVariableCS(cv, &mu->cs, timeout_max_ms) == 0 && + GetLastError() == ERROR_TIMEOUT); + } + } + mu->locked = 1; + return timeout; +} + +void gpr_cv_signal(gpr_cv* cv) { WakeConditionVariable(cv); } + +void gpr_cv_broadcast(gpr_cv* cv) { WakeAllConditionVariable(cv); } + +/*----------------------------------------*/ + +static void* dummy; +struct run_once_func_arg { + void (*init_function)(void); +}; +static BOOL CALLBACK run_once_func(gpr_once* once, void* v, void** pv) { + struct run_once_func_arg* arg = (struct run_once_func_arg*)v; + (*arg->init_function)(); + return 1; +} + +void gpr_once_init(gpr_once* once, void (*init_function)(void)) { + struct run_once_func_arg arg; + arg.init_function = init_function; + InitOnceExecuteOnce(once, run_once_func, &arg, &dummy); +} + +#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/gpr/thd.cc b/src/core/lib/gpr/thd.cc new file mode 100644 index 0000000000..ca62615d65 --- /dev/null +++ b/src/core/lib/gpr/thd.cc @@ -0,0 +1,49 @@ +/* + * + * 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. + * + */ + +/* Posix implementation for gpr threads. */ + +#include + +#include + +enum { GPR_THD_JOINABLE = 1 }; + +gpr_thd_options gpr_thd_options_default(void) { + gpr_thd_options options; + memset(&options, 0, sizeof(options)); + return options; +} + +void gpr_thd_options_set_detached(gpr_thd_options* options) { + options->flags &= ~GPR_THD_JOINABLE; +} + +void gpr_thd_options_set_joinable(gpr_thd_options* options) { + options->flags |= GPR_THD_JOINABLE; +} + +int gpr_thd_options_is_detached(const gpr_thd_options* options) { + if (!options) return 1; + return (options->flags & GPR_THD_JOINABLE) == 0; +} + +int gpr_thd_options_is_joinable(const gpr_thd_options* options) { + if (!options) return 0; + return (options->flags & GPR_THD_JOINABLE) == GPR_THD_JOINABLE; +} diff --git a/src/core/lib/gpr/thd_internal.h b/src/core/lib/gpr/thd_internal.h new file mode 100644 index 0000000000..692c00c8e1 --- /dev/null +++ b/src/core/lib/gpr/thd_internal.h @@ -0,0 +1,30 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_THD_INTERNAL_H +#define GRPC_CORE_LIB_GPR_THD_INTERNAL_H + +#include + +/* Internal interfaces between modules within the gpr support library. */ +void gpr_thd_init(); + +/* Wait for all outstanding threads to finish, up to deadline */ +int gpr_await_threads(gpr_timespec deadline); + +#endif /* GRPC_CORE_LIB_GPR_THD_INTERNAL_H */ diff --git a/src/core/lib/gpr/thd_posix.cc b/src/core/lib/gpr/thd_posix.cc new file mode 100644 index 0000000000..cfff0df6de --- /dev/null +++ b/src/core/lib/gpr/thd_posix.cc @@ -0,0 +1,152 @@ +/* + * + * 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. + * + */ + +/* Posix implementation for gpr threads. */ + +#include + +#ifdef GPR_POSIX_SYNC + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/core/lib/gpr/fork.h" + +static gpr_mu g_mu; +static gpr_cv g_cv; +static int g_thread_count; +static int g_awaiting_threads; + +struct thd_arg { + void (*body)(void* arg); /* body of a thread */ + void* arg; /* argument to a thread */ + const char* name; /* name of thread. Can be nullptr. */ +}; + +static void inc_thd_count(); +static void dec_thd_count(); + +/* Body of every thread started via gpr_thd_new. */ +static void* thread_body(void* v) { + struct thd_arg a = *(struct thd_arg*)v; + free(v); + if (a.name != nullptr) { +#if GPR_APPLE_PTHREAD_NAME + /* Apple supports 64 characters, and will truncate if it's longer. */ + pthread_setname_np(a.name); +#elif GPR_LINUX_PTHREAD_NAME + /* Linux supports 16 characters max, and will error if it's longer. */ + char buf[16]; + size_t buf_len = GPR_ARRAY_SIZE(buf) - 1; + strncpy(buf, a.name, buf_len); + buf[buf_len] = '\0'; + pthread_setname_np(pthread_self(), buf); +#endif // GPR_APPLE_PTHREAD_NAME + } + (*a.body)(a.arg); + dec_thd_count(); + return nullptr; +} + +int gpr_thd_new(gpr_thd_id* t, const char* thd_name, + void (*thd_body)(void* arg), void* arg, + const gpr_thd_options* options) { + int thread_started; + pthread_attr_t attr; + pthread_t p; + /* don't use gpr_malloc as we may cause an infinite recursion with + * the profiling code */ + struct thd_arg* a = (struct thd_arg*)malloc(sizeof(*a)); + GPR_ASSERT(a != nullptr); + a->body = thd_body; + a->arg = arg; + a->name = thd_name; + inc_thd_count(); + + GPR_ASSERT(pthread_attr_init(&attr) == 0); + if (gpr_thd_options_is_detached(options)) { + GPR_ASSERT(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == + 0); + } else { + GPR_ASSERT(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE) == + 0); + } + thread_started = (pthread_create(&p, &attr, &thread_body, a) == 0); + GPR_ASSERT(pthread_attr_destroy(&attr) == 0); + if (!thread_started) { + /* don't use gpr_free, as this was allocated using malloc (see above) */ + free(a); + dec_thd_count(); + } + *t = (gpr_thd_id)p; + return thread_started; +} + +gpr_thd_id gpr_thd_currentid(void) { return (gpr_thd_id)pthread_self(); } + +void gpr_thd_join(gpr_thd_id t) { pthread_join((pthread_t)t, nullptr); } + +/***************************************** + * Only used when fork support is enabled + */ + +static void inc_thd_count() { + if (grpc_fork_support_enabled()) { + gpr_mu_lock(&g_mu); + g_thread_count++; + gpr_mu_unlock(&g_mu); + } +} + +static void dec_thd_count() { + if (grpc_fork_support_enabled()) { + gpr_mu_lock(&g_mu); + g_thread_count--; + if (g_awaiting_threads && g_thread_count == 0) { + gpr_cv_signal(&g_cv); + } + gpr_mu_unlock(&g_mu); + } +} + +void gpr_thd_init() { + gpr_mu_init(&g_mu); + gpr_cv_init(&g_cv); + g_thread_count = 0; + g_awaiting_threads = 0; +} + +int gpr_await_threads(gpr_timespec deadline) { + gpr_mu_lock(&g_mu); + g_awaiting_threads = 1; + int res = 0; + if (g_thread_count > 0) { + res = gpr_cv_wait(&g_cv, &g_mu, deadline); + } + g_awaiting_threads = 0; + gpr_mu_unlock(&g_mu); + return res == 0; +} + +#endif /* GPR_POSIX_SYNC */ diff --git a/src/core/lib/gpr/thd_windows.cc b/src/core/lib/gpr/thd_windows.cc new file mode 100644 index 0000000000..f920770f32 --- /dev/null +++ b/src/core/lib/gpr/thd_windows.cc @@ -0,0 +1,105 @@ +/* + * + * 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. + * + */ + +/* Windows implementation for gpr threads. */ + +#include + +#ifdef GPR_WINDOWS + +#include +#include +#include +#include + +#if defined(_MSC_VER) +#define thread_local __declspec(thread) +#elif defined(__GNUC__) +#define thread_local __thread +#else +#error "Unknown compiler - please file a bug report" +#endif + +struct thd_info { + void (*body)(void* arg); /* body of a thread */ + void* arg; /* argument to a thread */ + HANDLE join_event; /* if joinable, the join event */ + int joinable; /* true if not detached */ +}; + +static thread_local struct thd_info* g_thd_info; + +/* Destroys a thread info */ +static void destroy_thread(struct thd_info* t) { + if (t->joinable) CloseHandle(t->join_event); + gpr_free(t); +} + +void gpr_thd_init(void) {} + +/* Body of every thread started via gpr_thd_new. */ +static DWORD WINAPI thread_body(void* v) { + g_thd_info = (struct thd_info*)v; + g_thd_info->body(g_thd_info->arg); + if (g_thd_info->joinable) { + BOOL ret = SetEvent(g_thd_info->join_event); + GPR_ASSERT(ret); + } else { + destroy_thread(g_thd_info); + } + return 0; +} + +int gpr_thd_new(gpr_thd_id* t, const char* thd_name, + void (*thd_body)(void* arg), void* arg, + const gpr_thd_options* options) { + HANDLE handle; + struct thd_info* info = (struct thd_info*)gpr_malloc(sizeof(*info)); + info->body = thd_body; + info->arg = arg; + *t = 0; + if (gpr_thd_options_is_joinable(options)) { + info->joinable = 1; + info->join_event = CreateEvent(NULL, FALSE, FALSE, NULL); + if (info->join_event == NULL) { + gpr_free(info); + return 0; + } + } else { + info->joinable = 0; + } + handle = CreateThread(NULL, 64 * 1024, thread_body, info, 0, NULL); + if (handle == NULL) { + destroy_thread(info); + } else { + *t = (gpr_thd_id)info; + CloseHandle(handle); + } + return handle != NULL; +} + +gpr_thd_id gpr_thd_currentid(void) { return (gpr_thd_id)g_thd_info; } + +void gpr_thd_join(gpr_thd_id t) { + struct thd_info* info = (struct thd_info*)t; + DWORD ret = WaitForSingleObject(info->join_event, INFINITE); + GPR_ASSERT(ret == WAIT_OBJECT_0); + destroy_thread(info); +} + +#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/gpr/time.cc b/src/core/lib/gpr/time.cc new file mode 100644 index 0000000000..6903674d75 --- /dev/null +++ b/src/core/lib/gpr/time.cc @@ -0,0 +1,247 @@ +/* + * + * 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. + * + */ + +/* Generic implementation of time calls. */ + +#include +#include +#include +#include +#include + +int gpr_time_cmp(gpr_timespec a, gpr_timespec b) { + int cmp = (a.tv_sec > b.tv_sec) - (a.tv_sec < b.tv_sec); + GPR_ASSERT(a.clock_type == b.clock_type); + if (cmp == 0 && a.tv_sec != INT64_MAX && a.tv_sec != INT64_MIN) { + cmp = (a.tv_nsec > b.tv_nsec) - (a.tv_nsec < b.tv_nsec); + } + return cmp; +} + +gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b) { + return gpr_time_cmp(a, b) < 0 ? a : b; +} + +gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b) { + return gpr_time_cmp(a, b) > 0 ? a : b; +} + +gpr_timespec gpr_time_0(gpr_clock_type type) { + gpr_timespec out; + out.tv_sec = 0; + out.tv_nsec = 0; + out.clock_type = type; + return out; +} + +gpr_timespec gpr_inf_future(gpr_clock_type type) { + gpr_timespec out; + out.tv_sec = INT64_MAX; + out.tv_nsec = 0; + out.clock_type = type; + return out; +} + +gpr_timespec gpr_inf_past(gpr_clock_type type) { + gpr_timespec out; + out.tv_sec = INT64_MIN; + out.tv_nsec = 0; + out.clock_type = type; + return out; +} + +static gpr_timespec to_seconds_from_sub_second_time(int64_t time_in_units, + int64_t units_per_sec, + gpr_clock_type type) { + gpr_timespec out; + if (time_in_units == INT64_MAX) { + out = gpr_inf_future(type); + } else if (time_in_units == INT64_MIN) { + out = gpr_inf_past(type); + } else { + if (time_in_units >= 0) { + out.tv_sec = time_in_units / units_per_sec; + } else { + out.tv_sec = (-((units_per_sec - 1) - (time_in_units + units_per_sec)) / + units_per_sec) - + 1; + } + out.tv_nsec = (int32_t)((time_in_units - out.tv_sec * units_per_sec) * + GPR_NS_PER_SEC / units_per_sec); + out.clock_type = type; + } + return out; +} + +static gpr_timespec to_seconds_from_above_second_time(int64_t time_in_units, + int64_t secs_per_unit, + gpr_clock_type type) { + gpr_timespec out; + if (time_in_units >= INT64_MAX / secs_per_unit) { + out = gpr_inf_future(type); + } else if (time_in_units <= INT64_MIN / secs_per_unit) { + out = gpr_inf_past(type); + } else { + out.tv_sec = time_in_units * secs_per_unit; + out.tv_nsec = 0; + out.clock_type = type; + } + return out; +} + +gpr_timespec gpr_time_from_nanos(int64_t ns, gpr_clock_type type) { + return to_seconds_from_sub_second_time(ns, GPR_NS_PER_SEC, type); +} + +gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type type) { + return to_seconds_from_sub_second_time(us, GPR_US_PER_SEC, type); +} + +gpr_timespec gpr_time_from_millis(int64_t ms, gpr_clock_type type) { + return to_seconds_from_sub_second_time(ms, GPR_MS_PER_SEC, type); +} + +gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type type) { + return to_seconds_from_sub_second_time(s, 1, type); +} + +gpr_timespec gpr_time_from_minutes(int64_t m, gpr_clock_type type) { + return to_seconds_from_above_second_time(m, 60, type); +} + +gpr_timespec gpr_time_from_hours(int64_t h, gpr_clock_type type) { + return to_seconds_from_above_second_time(h, 3600, type); +} + +gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b) { + gpr_timespec sum; + int64_t inc = 0; + GPR_ASSERT(b.clock_type == GPR_TIMESPAN); + sum.clock_type = a.clock_type; + sum.tv_nsec = a.tv_nsec + b.tv_nsec; + if (sum.tv_nsec >= GPR_NS_PER_SEC) { + sum.tv_nsec -= GPR_NS_PER_SEC; + inc++; + } + if (a.tv_sec == INT64_MAX || a.tv_sec == INT64_MIN) { + sum = a; + } else if (b.tv_sec == INT64_MAX || + (b.tv_sec >= 0 && a.tv_sec >= INT64_MAX - b.tv_sec)) { + sum = gpr_inf_future(sum.clock_type); + } else if (b.tv_sec == INT64_MIN || + (b.tv_sec <= 0 && a.tv_sec <= INT64_MIN - b.tv_sec)) { + sum = gpr_inf_past(sum.clock_type); + } else { + sum.tv_sec = a.tv_sec + b.tv_sec; + if (inc != 0 && sum.tv_sec == INT64_MAX - 1) { + sum = gpr_inf_future(sum.clock_type); + } else { + sum.tv_sec += inc; + } + } + return sum; +} + +gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b) { + gpr_timespec diff; + int64_t dec = 0; + if (b.clock_type == GPR_TIMESPAN) { + diff.clock_type = a.clock_type; + } else { + GPR_ASSERT(a.clock_type == b.clock_type); + diff.clock_type = GPR_TIMESPAN; + } + diff.tv_nsec = a.tv_nsec - b.tv_nsec; + if (diff.tv_nsec < 0) { + diff.tv_nsec += GPR_NS_PER_SEC; + dec++; + } + if (a.tv_sec == INT64_MAX || a.tv_sec == INT64_MIN) { + diff = a; + } else if (b.tv_sec == INT64_MIN || + (b.tv_sec <= 0 && a.tv_sec >= INT64_MAX + b.tv_sec)) { + diff = gpr_inf_future(GPR_CLOCK_REALTIME); + } else if (b.tv_sec == INT64_MAX || + (b.tv_sec >= 0 && a.tv_sec <= INT64_MIN + b.tv_sec)) { + diff = gpr_inf_past(GPR_CLOCK_REALTIME); + } else { + diff.tv_sec = a.tv_sec - b.tv_sec; + if (dec != 0 && diff.tv_sec == INT64_MIN + 1) { + diff = gpr_inf_past(GPR_CLOCK_REALTIME); + } else { + diff.tv_sec -= dec; + } + } + return diff; +} + +int gpr_time_similar(gpr_timespec a, gpr_timespec b, gpr_timespec threshold) { + int cmp_ab; + + GPR_ASSERT(a.clock_type == b.clock_type); + GPR_ASSERT(threshold.clock_type == GPR_TIMESPAN); + + cmp_ab = gpr_time_cmp(a, b); + if (cmp_ab == 0) return 1; + if (cmp_ab < 0) { + return gpr_time_cmp(gpr_time_sub(b, a), threshold) <= 0; + } else { + return gpr_time_cmp(gpr_time_sub(a, b), threshold) <= 0; + } +} + +int32_t gpr_time_to_millis(gpr_timespec t) { + if (t.tv_sec >= 2147483) { + if (t.tv_sec == 2147483 && t.tv_nsec < 648 * GPR_NS_PER_MS) { + return 2147483 * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS; + } + return 2147483647; + } else if (t.tv_sec <= -2147483) { + /* TODO(ctiller): correct handling here (it's so far in the past do we + care?) */ + return -2147483647; + } else { + return (int32_t)(t.tv_sec * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS); + } +} + +double gpr_timespec_to_micros(gpr_timespec t) { + return (double)t.tv_sec * GPR_US_PER_SEC + t.tv_nsec * 1e-3; +} + +gpr_timespec gpr_convert_clock_type(gpr_timespec t, gpr_clock_type clock_type) { + if (t.clock_type == clock_type) { + return t; + } + + if (t.tv_sec == INT64_MAX || t.tv_sec == INT64_MIN) { + t.clock_type = clock_type; + return t; + } + + if (clock_type == GPR_TIMESPAN) { + return gpr_time_sub(t, gpr_now(t.clock_type)); + } + + if (t.clock_type == GPR_TIMESPAN) { + return gpr_time_add(gpr_now(clock_type), t); + } + + return gpr_time_add(gpr_now(clock_type), + gpr_time_sub(t, gpr_now(t.clock_type))); +} diff --git a/src/core/lib/gpr/time_posix.cc b/src/core/lib/gpr/time_posix.cc new file mode 100644 index 0000000000..9c7e86b080 --- /dev/null +++ b/src/core/lib/gpr/time_posix.cc @@ -0,0 +1,166 @@ +/* + * + * 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. + * + */ + +#include +#include "src/core/lib/gpr/time_precise.h" + +#ifdef GPR_POSIX_TIME + +#include +#include +#include +#ifdef __linux__ +#include +#endif +#include +#include +#include + +static struct timespec timespec_from_gpr(gpr_timespec gts) { + struct timespec rv; + if (sizeof(time_t) < sizeof(int64_t)) { + /* fine to assert, as this is only used in gpr_sleep_until */ + GPR_ASSERT(gts.tv_sec <= INT32_MAX && gts.tv_sec >= INT32_MIN); + } + rv.tv_sec = (time_t)gts.tv_sec; + rv.tv_nsec = gts.tv_nsec; + return rv; +} + +#if _POSIX_TIMERS > 0 || defined(__OpenBSD__) +static gpr_timespec gpr_from_timespec(struct timespec ts, + gpr_clock_type clock_type) { + /* + * timespec.tv_sec can have smaller size than gpr_timespec.tv_sec, + * but we are only using this function to implement gpr_now + * so there's no need to handle "infinity" values. + */ + gpr_timespec rv; + rv.tv_sec = ts.tv_sec; + rv.tv_nsec = (int32_t)ts.tv_nsec; + rv.clock_type = clock_type; + return rv; +} + +/** maps gpr_clock_type --> clockid_t for clock_gettime */ +static const clockid_t clockid_for_gpr_clock[] = {CLOCK_MONOTONIC, + CLOCK_REALTIME}; + +void gpr_time_init(void) { gpr_precise_clock_init(); } + +static gpr_timespec now_impl(gpr_clock_type clock_type) { + struct timespec now; + GPR_ASSERT(clock_type != GPR_TIMESPAN); + if (clock_type == GPR_CLOCK_PRECISE) { + gpr_timespec ret; + gpr_precise_clock_now(&ret); + return ret; + } else { +#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE) && defined(__linux__) + /* avoid ABI problems by invoking syscalls directly */ + syscall(SYS_clock_gettime, clockid_for_gpr_clock[clock_type], &now); +#else + clock_gettime(clockid_for_gpr_clock[clock_type], &now); +#endif + return gpr_from_timespec(now, clock_type); + } +} +#else + /* For some reason Apple's OSes haven't implemented clock_gettime. */ + +#include +#include +#include + +static double g_time_scale; +static uint64_t g_time_start; + +void gpr_time_init(void) { + mach_timebase_info_data_t tb = {0, 1}; + gpr_precise_clock_init(); + mach_timebase_info(&tb); + g_time_scale = tb.numer; + g_time_scale /= tb.denom; + g_time_start = mach_absolute_time(); +} + +static gpr_timespec now_impl(gpr_clock_type clock) { + gpr_timespec now; + struct timeval now_tv; + double now_dbl; + + now.clock_type = clock; + switch (clock) { + case GPR_CLOCK_REALTIME: + gettimeofday(&now_tv, nullptr); + now.tv_sec = now_tv.tv_sec; + now.tv_nsec = now_tv.tv_usec * 1000; + break; + case GPR_CLOCK_MONOTONIC: + now_dbl = ((double)(mach_absolute_time() - g_time_start)) * g_time_scale; + now.tv_sec = (int64_t)(now_dbl * 1e-9); + now.tv_nsec = (int32_t)(now_dbl - ((double)now.tv_sec) * 1e9); + break; + case GPR_CLOCK_PRECISE: + gpr_precise_clock_now(&now); + break; + case GPR_TIMESPAN: + abort(); + } + + return now; +} +#endif + +gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type) = now_impl; + +#ifdef GPR_LOW_LEVEL_COUNTERS +gpr_atm gpr_now_call_count; +#endif + +gpr_timespec gpr_now(gpr_clock_type clock_type) { +#ifdef GPR_LOW_LEVEL_COUNTERS + __atomic_fetch_add(&gpr_now_call_count, 1, __ATOMIC_RELAXED); +#endif + return gpr_now_impl(clock_type); +} + +void gpr_sleep_until(gpr_timespec until) { + gpr_timespec now; + gpr_timespec delta; + struct timespec delta_ts; + int ns_result; + + for (;;) { + /* We could simplify by using clock_nanosleep instead, but it might be + * slightly less portable. */ + now = gpr_now(until.clock_type); + if (gpr_time_cmp(until, now) <= 0) { + return; + } + + delta = gpr_time_sub(until, now); + delta_ts = timespec_from_gpr(delta); + ns_result = nanosleep(&delta_ts, nullptr); + if (ns_result == 0) { + break; + } + } +} + +#endif /* GPR_POSIX_TIME */ diff --git a/src/core/lib/gpr/time_precise.cc b/src/core/lib/gpr/time_precise.cc new file mode 100644 index 0000000000..3c7aaabc40 --- /dev/null +++ b/src/core/lib/gpr/time_precise.cc @@ -0,0 +1,76 @@ +/* + * + * 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. + * + */ + +#include +#include +#include + +#include "src/core/lib/gpr/time_precise.h" + +#ifdef GRPC_TIMERS_RDTSC +#if defined(__i386__) +static void gpr_get_cycle_counter(int64_t int* clk) { + int64_t int ret; + __asm__ volatile("rdtsc" : "=A"(ret)); + *clk = ret; +} + +// ---------------------------------------------------------------- +#elif defined(__x86_64__) || defined(__amd64__) +static void gpr_get_cycle_counter(int64_t* clk) { + uint64_t low, high; + __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); + *clk = (int64_t)(high << 32) | (int64_t)low; +} +#endif + +static double cycles_per_second = 0; +static int64_t start_cycle; +void gpr_precise_clock_init(void) { + time_t start; + int64_t end_cycle; + gpr_log(GPR_DEBUG, "Calibrating timers"); + start = time(NULL); + while (time(NULL) == start) + ; + gpr_get_cycle_counter(&start_cycle); + while (time(NULL) <= start + 10) + ; + gpr_get_cycle_counter(&end_cycle); + cycles_per_second = (double)(end_cycle - start_cycle) / 10.0; + gpr_log(GPR_DEBUG, "... cycles_per_second = %f\n", cycles_per_second); +} + +void gpr_precise_clock_now(gpr_timespec* clk) { + int64_t counter; + double secs; + gpr_get_cycle_counter(&counter); + secs = (double)(counter - start_cycle) / cycles_per_second; + clk->clock_type = GPR_CLOCK_PRECISE; + clk->tv_sec = (int64_t)secs; + clk->tv_nsec = (int32_t)(1e9 * (secs - (double)clk->tv_sec)); +} + +#else /* GRPC_TIMERS_RDTSC */ +void gpr_precise_clock_init(void) {} + +void gpr_precise_clock_now(gpr_timespec* clk) { + *clk = gpr_now(GPR_CLOCK_REALTIME); + clk->clock_type = GPR_CLOCK_PRECISE; +} +#endif /* GRPC_TIMERS_RDTSC */ diff --git a/src/core/lib/gpr/time_precise.h b/src/core/lib/gpr/time_precise.h new file mode 100644 index 0000000000..acc4ee3d1b --- /dev/null +++ b/src/core/lib/gpr/time_precise.h @@ -0,0 +1,27 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TIME_PRECISE_H +#define GRPC_CORE_LIB_GPR_TIME_PRECISE_H + +#include + +void gpr_precise_clock_init(void); +void gpr_precise_clock_now(gpr_timespec* clk); + +#endif /* GRPC_CORE_LIB_GPR_TIME_PRECISE_H */ diff --git a/src/core/lib/gpr/time_windows.cc b/src/core/lib/gpr/time_windows.cc new file mode 100644 index 0000000000..247cc16468 --- /dev/null +++ b/src/core/lib/gpr/time_windows.cc @@ -0,0 +1,98 @@ +/* + * + * 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. + * + */ + +/* Win32 code for gpr time support. */ + +#include + +#ifdef GPR_WINDOWS_TIME + +#include +#include +#include +#include +#include + +#include "src/core/lib/gpr/time_precise.h" + +static LARGE_INTEGER g_start_time; +static double g_time_scale; + +void gpr_time_init(void) { + LARGE_INTEGER frequency; + QueryPerformanceFrequency(&frequency); + QueryPerformanceCounter(&g_start_time); + g_time_scale = 1.0 / (double)frequency.QuadPart; +} + +static gpr_timespec now_impl(gpr_clock_type clock) { + gpr_timespec now_tv; + LONGLONG diff; + struct _timeb now_tb; + LARGE_INTEGER timestamp; + double now_dbl; + now_tv.clock_type = clock; + switch (clock) { + case GPR_CLOCK_REALTIME: + _ftime_s(&now_tb); + now_tv.tv_sec = (int64_t)now_tb.time; + now_tv.tv_nsec = now_tb.millitm * 1000000; + break; + case GPR_CLOCK_MONOTONIC: + case GPR_CLOCK_PRECISE: + QueryPerformanceCounter(×tamp); + diff = timestamp.QuadPart - g_start_time.QuadPart; + now_dbl = (double)diff * g_time_scale; + now_tv.tv_sec = (int64_t)now_dbl; + now_tv.tv_nsec = (int32_t)((now_dbl - (double)now_tv.tv_sec) * 1e9); + break; + case GPR_TIMESPAN: + abort(); + break; + } + return now_tv; +} + +gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type) = now_impl; + +gpr_timespec gpr_now(gpr_clock_type clock_type) { + return gpr_now_impl(clock_type); +} + +void gpr_sleep_until(gpr_timespec until) { + gpr_timespec now; + gpr_timespec delta; + int64_t sleep_millis; + + for (;;) { + /* We could simplify by using clock_nanosleep instead, but it might be + * slightly less portable. */ + now = gpr_now(until.clock_type); + if (gpr_time_cmp(until, now) <= 0) { + return; + } + + delta = gpr_time_sub(until, now); + sleep_millis = + delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS; + GPR_ASSERT((sleep_millis >= 0) && (sleep_millis <= INT_MAX)); + Sleep((DWORD)sleep_millis); + } +} + +#endif /* GPR_WINDOWS_TIME */ diff --git a/src/core/lib/gpr/tls_pthread.cc b/src/core/lib/gpr/tls_pthread.cc new file mode 100644 index 0000000000..ebeef2a8c2 --- /dev/null +++ b/src/core/lib/gpr/tls_pthread.cc @@ -0,0 +1,30 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_PTHREAD_TLS + +#include + +intptr_t gpr_tls_set(struct gpr_pthread_thread_local* tls, intptr_t value) { + GPR_ASSERT(0 == pthread_setspecific(tls->key, (void*)value)); + return value; +} + +#endif /* GPR_PTHREAD_TLS */ diff --git a/src/core/lib/gpr/tmpfile.h b/src/core/lib/gpr/tmpfile.h new file mode 100644 index 0000000000..f47ec7aa63 --- /dev/null +++ b/src/core/lib/gpr/tmpfile.h @@ -0,0 +1,30 @@ +/* + * + * 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. + * + */ + +#ifndef GRPC_CORE_LIB_GPR_TMPFILE_H +#define GRPC_CORE_LIB_GPR_TMPFILE_H + +#include + +/* Creates a temporary file from a prefix. + If tmp_filename is not NULL, *tmp_filename is assigned the name of the + created file and it is the responsibility of the caller to gpr_free it + unless an error occurs in which case it will be set to NULL. */ +FILE* gpr_tmpfile(const char* prefix, char** tmp_filename); + +#endif /* GRPC_CORE_LIB_GPR_TMPFILE_H */ diff --git a/src/core/lib/gpr/tmpfile_msys.cc b/src/core/lib/gpr/tmpfile_msys.cc new file mode 100644 index 0000000000..76cd886f3a --- /dev/null +++ b/src/core/lib/gpr/tmpfile_msys.cc @@ -0,0 +1,58 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_MSYS_TMPFILE + +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/gpr/string_windows.h" +#include "src/core/lib/gpr/tmpfile.h" + +FILE* gpr_tmpfile(const char* prefix, char** tmp_filename_out) { + FILE* result = NULL; + char tmp_filename[MAX_PATH]; + UINT success; + + if (tmp_filename_out != NULL) *tmp_filename_out = NULL; + + /* Generate a unique filename with our template + temporary path. */ + success = GetTempFileNameA(".", prefix, 0, tmp_filename); + fprintf(stderr, "success = %d\n", success); + + if (success) { + /* Open a file there. */ + result = fopen(tmp_filename, "wb+"); + fprintf(stderr, "result = %p\n", result); + } + if (result != NULL && tmp_filename_out) { + *tmp_filename_out = gpr_strdup(tmp_filename); + } + + return result; +} + +#endif /* GPR_MSYS_TMPFILE */ diff --git a/src/core/lib/gpr/tmpfile_posix.cc b/src/core/lib/gpr/tmpfile_posix.cc new file mode 100644 index 0000000000..ffdad335d6 --- /dev/null +++ b/src/core/lib/gpr/tmpfile_posix.cc @@ -0,0 +1,70 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_POSIX_TMPFILE + +#include "src/core/lib/gpr/tmpfile.h" + +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/gpr/string.h" + +FILE* gpr_tmpfile(const char* prefix, char** tmp_filename) { + FILE* result = nullptr; + char* filename_template; + int fd; + + if (tmp_filename != nullptr) *tmp_filename = nullptr; + + gpr_asprintf(&filename_template, "/tmp/%s_XXXXXX", prefix); + GPR_ASSERT(filename_template != nullptr); + + fd = mkstemp(filename_template); + if (fd == -1) { + gpr_log(GPR_ERROR, "mkstemp failed for filename_template %s with error %s.", + filename_template, strerror(errno)); + goto end; + } + result = fdopen(fd, "w+"); + if (result == nullptr) { + gpr_log(GPR_ERROR, "Could not open file %s from fd %d (error = %s).", + filename_template, fd, strerror(errno)); + unlink(filename_template); + close(fd); + goto end; + } + +end: + if (result != nullptr && tmp_filename != nullptr) { + *tmp_filename = filename_template; + } else { + gpr_free(filename_template); + } + return result; +} + +#endif /* GPR_POSIX_TMPFILE */ diff --git a/src/core/lib/gpr/tmpfile_windows.cc b/src/core/lib/gpr/tmpfile_windows.cc new file mode 100644 index 0000000000..d486808418 --- /dev/null +++ b/src/core/lib/gpr/tmpfile_windows.cc @@ -0,0 +1,69 @@ +/* + * + * 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. + * + */ + +#include + +#ifdef GPR_WINDOWS_TMPFILE + +#include +#include +#include +#include + +#include +#include +#include + +#include "src/core/lib/gpr/string_windows.h" +#include "src/core/lib/gpr/tmpfile.h" + +FILE* gpr_tmpfile(const char* prefix, char** tmp_filename_out) { + FILE* result = NULL; + LPTSTR template_string = NULL; + TCHAR tmp_path[MAX_PATH]; + TCHAR tmp_filename[MAX_PATH]; + DWORD status; + UINT success; + + if (tmp_filename_out != NULL) *tmp_filename_out = NULL; + + /* Convert our prefix to TCHAR. */ + template_string = gpr_char_to_tchar(prefix); + GPR_ASSERT(template_string); + + /* Get the path to the best temporary folder available. */ + status = GetTempPath(MAX_PATH, tmp_path); + if (status == 0 || status > MAX_PATH) goto end; + + /* Generate a unique filename with our template + temporary path. */ + success = GetTempFileName(tmp_path, template_string, 0, tmp_filename); + if (!success) goto end; + + /* Open a file there. */ + if (_tfopen_s(&result, tmp_filename, TEXT("wb+")) != 0) goto end; + +end: + if (result && tmp_filename_out) { + *tmp_filename_out = gpr_tchar_to_char(tmp_filename); + } + + gpr_free(template_string); + return result; +} + +#endif /* GPR_WINDOWS_TMPFILE */ diff --git a/src/core/lib/gpr/wrap_memcpy.cc b/src/core/lib/gpr/wrap_memcpy.cc new file mode 100644 index 0000000000..9b8608e056 --- /dev/null +++ b/src/core/lib/gpr/wrap_memcpy.cc @@ -0,0 +1,42 @@ +/* + * + * Copyright 2016 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 + +#include + +/* Provide a wrapped memcpy for targets that need to be backwards + * compatible with older libc's. + * + * Enable by setting LDFLAGS=-Wl,-wrap,memcpy when linking. + */ + +extern "C" { +#ifdef __linux__ +#if defined(__x86_64__) && !defined(GPR_MUSL_LIBC_COMPAT) +__asm__(".symver memcpy,memcpy@GLIBC_2.2.5"); +void* __wrap_memcpy(void* destination, const void* source, size_t num) { + return memcpy(destination, source, num); +} +#else /* !__x86_64__ */ +void* __wrap_memcpy(void* destination, const void* source, size_t num) { + return memmove(destination, source, num); +} +#endif +#endif +} diff --git a/src/core/lib/http/format_request.cc b/src/core/lib/http/format_request.cc index f3f3cbda7b..473fa71790 100644 --- a/src/core/lib/http/format_request.cc +++ b/src/core/lib/http/format_request.cc @@ -26,7 +26,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" static void fill_common_header(const grpc_httpcli_request* request, gpr_strvec* buf, bool connection_close) { diff --git a/src/core/lib/http/httpcli.cc b/src/core/lib/http/httpcli.cc index ed874c4265..c43c92b57d 100644 --- a/src/core/lib/http/httpcli.cc +++ b/src/core/lib/http/httpcli.cc @@ -26,6 +26,7 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/format_request.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/endpoint.h" @@ -34,7 +35,6 @@ #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" typedef struct { grpc_slice request_text; diff --git a/src/core/lib/http/httpcli_security_connector.cc b/src/core/lib/http/httpcli_security_connector.cc index bfb536a921..8664418144 100644 --- a/src/core/lib/http/httpcli_security_connector.cc +++ b/src/core/lib/http/httpcli_security_connector.cc @@ -26,9 +26,9 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/handshaker_registry.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/transport/security_handshaker.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "src/core/tsi/ssl_transport_security.h" #include "src/core/tsi/transport_security_adapter.h" diff --git a/src/core/lib/iomgr/call_combiner.h b/src/core/lib/iomgr/call_combiner.h index 9f7e6ce1c9..4814dbf8d2 100644 --- a/src/core/lib/iomgr/call_combiner.h +++ b/src/core/lib/iomgr/call_combiner.h @@ -23,9 +23,9 @@ #include +#include "src/core/lib/gpr/mpscq.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/mpscq.h" // A simple, lock-free mechanism for serializing activity related to a // single call. This is similar to a combiner but is more lightweight. diff --git a/src/core/lib/iomgr/closure.h b/src/core/lib/iomgr/closure.h index 4c58c0e4bf..249fca6cd6 100644 --- a/src/core/lib/iomgr/closure.h +++ b/src/core/lib/iomgr/closure.h @@ -25,9 +25,9 @@ #include #include #include +#include "src/core/lib/gpr/mpscq.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/mpscq.h" struct grpc_closure; typedef struct grpc_closure grpc_closure; diff --git a/src/core/lib/iomgr/combiner.h b/src/core/lib/iomgr/combiner.h index 46b9ac58be..c62d21a051 100644 --- a/src/core/lib/iomgr/combiner.h +++ b/src/core/lib/iomgr/combiner.h @@ -23,8 +23,8 @@ #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/mpscq.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/mpscq.h" // Provides serialized access to some resource. // Each action queued on a combiner is executed serially in a borrowed thread. diff --git a/src/core/lib/iomgr/endpoint_pair_posix.cc b/src/core/lib/iomgr/endpoint_pair_posix.cc index 0b4aefd1b7..3ad6b47756 100644 --- a/src/core/lib/iomgr/endpoint_pair_posix.cc +++ b/src/core/lib/iomgr/endpoint_pair_posix.cc @@ -33,8 +33,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/tcp_posix.h" -#include "src/core/lib/support/string.h" static void create_sockets(int sv[2]) { int flags; diff --git a/src/core/lib/iomgr/ev_epoll1_linux.cc b/src/core/lib/iomgr/ev_epoll1_linux.cc index aa14d5931a..1cb0150f45 100644 --- a/src/core/lib/iomgr/ev_epoll1_linux.cc +++ b/src/core/lib/iomgr/ev_epoll1_linux.cc @@ -43,14 +43,14 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/lockfree_event.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/manual_constructor.h" -#include "src/core/lib/support/string.h" static grpc_wakeup_fd global_wakeup_fd; diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index e4a2d67e4b..b81c00ca7a 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -41,6 +41,8 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gpr/spinlock.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/is_epollexclusive_available.h" @@ -49,8 +51,6 @@ #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/manual_constructor.h" -#include "src/core/lib/support/spinlock.h" // debug aid: create workers on the heap (allows asan to spot // use-after-destruction) diff --git a/src/core/lib/iomgr/ev_epollsig_linux.cc b/src/core/lib/iomgr/ev_epollsig_linux.cc index 3544d4f3a4..11c64d080c 100644 --- a/src/core/lib/iomgr/ev_epollsig_linux.cc +++ b/src/core/lib/iomgr/ev_epollsig_linux.cc @@ -43,6 +43,7 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" @@ -50,7 +51,6 @@ #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/manual_constructor.h" #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) diff --git a/src/core/lib/iomgr/ev_poll_posix.cc b/src/core/lib/iomgr/ev_poll_posix.cc index 08edff5159..3b79728055 100644 --- a/src/core/lib/iomgr/ev_poll_posix.cc +++ b/src/core/lib/iomgr/ev_poll_posix.cc @@ -38,12 +38,12 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/murmur_hash.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/wakeup_fd_cv.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/murmur_hash.h" #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1) diff --git a/src/core/lib/iomgr/ev_posix.cc b/src/core/lib/iomgr/ev_posix.cc index b516f93058..3a5714132d 100644 --- a/src/core/lib/iomgr/ev_posix.cc +++ b/src/core/lib/iomgr/ev_posix.cc @@ -30,11 +30,11 @@ #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/ev_epoll1_linux.h" #include "src/core/lib/iomgr/ev_epollex_linux.h" #include "src/core/lib/iomgr/ev_epollsig_linux.h" #include "src/core/lib/iomgr/ev_poll_posix.h" -#include "src/core/lib/support/env.h" grpc_core::TraceFlag grpc_polling_trace(false, "polling"); /* Disabled by default */ diff --git a/src/core/lib/iomgr/executor.cc b/src/core/lib/iomgr/executor.cc index 67a0412dc3..835dc9d0f7 100644 --- a/src/core/lib/iomgr/executor.cc +++ b/src/core/lib/iomgr/executor.cc @@ -29,8 +29,8 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/spinlock.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/spinlock.h" #define MAX_DEPTH 2 diff --git a/src/core/lib/iomgr/fork_posix.cc b/src/core/lib/iomgr/fork_posix.cc index cc131408af..9bfa79219a 100644 --- a/src/core/lib/iomgr/fork_posix.cc +++ b/src/core/lib/iomgr/fork_posix.cc @@ -27,13 +27,13 @@ #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/fork.h" +#include "src/core/lib/gpr/thd_internal.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/timer_manager.h" #include "src/core/lib/iomgr/wakeup_fd_posix.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/fork.h" -#include "src/core/lib/support/thd_internal.h" #include "src/core/lib/surface/init.h" /* diff --git a/src/core/lib/iomgr/iomgr.cc b/src/core/lib/iomgr/iomgr.cc index 70807c479d..4cd0a4f1de 100644 --- a/src/core/lib/iomgr/iomgr.cc +++ b/src/core/lib/iomgr/iomgr.cc @@ -31,14 +31,14 @@ #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/network_status_tracker.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/timer_manager.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" static gpr_mu g_mu; static gpr_cv g_rcv; diff --git a/src/core/lib/iomgr/load_file.cc b/src/core/lib/iomgr/load_file.cc index 4a05de1410..b6586fbc73 100644 --- a/src/core/lib/iomgr/load_file.cc +++ b/src/core/lib/iomgr/load_file.cc @@ -25,8 +25,8 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/block_annotate.h" -#include "src/core/lib/support/string.h" grpc_error* grpc_load_file(const char* filename, int add_null_terminator, grpc_slice* output) { diff --git a/src/core/lib/iomgr/resolve_address_posix.cc b/src/core/lib/iomgr/resolve_address_posix.cc index cc3d4fd7cf..176caee490 100644 --- a/src/core/lib/iomgr/resolve_address_posix.cc +++ b/src/core/lib/iomgr/resolve_address_posix.cc @@ -33,11 +33,11 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" -#include "src/core/lib/support/string.h" static grpc_error* blocking_resolve_address_impl( const char* name, const char* default_port, diff --git a/src/core/lib/iomgr/resolve_address_windows.cc b/src/core/lib/iomgr/resolve_address_windows.cc index ccb1dae689..e44ab396b3 100644 --- a/src/core/lib/iomgr/resolve_address_windows.cc +++ b/src/core/lib/iomgr/resolve_address_windows.cc @@ -34,11 +34,11 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/string.h" typedef struct { char* name; diff --git a/src/core/lib/iomgr/sockaddr_utils.cc b/src/core/lib/iomgr/sockaddr_utils.cc index 0c0a2fe5b2..71e3e38624 100644 --- a/src/core/lib/iomgr/sockaddr_utils.cc +++ b/src/core/lib/iomgr/sockaddr_utils.cc @@ -28,10 +28,10 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/socket_utils.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" -#include "src/core/lib/support/string.h" static const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff}; diff --git a/src/core/lib/iomgr/socket_utils_common_posix.cc b/src/core/lib/iomgr/socket_utils_common_posix.cc index 2d4b8f0add..5068a8081d 100644 --- a/src/core/lib/iomgr/socket_utils_common_posix.cc +++ b/src/core/lib/iomgr/socket_utils_common_posix.cc @@ -40,8 +40,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/string.h" /* set a socket to non blocking mode */ grpc_error* grpc_set_socket_nonblocking(int fd, int non_blocking) { diff --git a/src/core/lib/iomgr/tcp_client_posix.cc b/src/core/lib/iomgr/tcp_client_posix.cc index 8cd5f8d618..3dff624065 100644 --- a/src/core/lib/iomgr/tcp_client_posix.cc +++ b/src/core/lib/iomgr/tcp_client_posix.cc @@ -33,6 +33,7 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_posix.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -41,7 +42,6 @@ #include "src/core/lib/iomgr/tcp_posix.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" -#include "src/core/lib/support/string.h" extern grpc_core::TraceFlag grpc_tcp_trace; diff --git a/src/core/lib/iomgr/tcp_posix.cc b/src/core/lib/iomgr/tcp_posix.cc index d47a077251..0ec5926227 100644 --- a/src/core/lib/iomgr/tcp_posix.cc +++ b/src/core/lib/iomgr/tcp_posix.cc @@ -42,12 +42,12 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/stats.h" #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #ifdef GRPC_HAVE_MSG_NOSIGNAL #define SENDMSG_FLAGS MSG_NOSIGNAL diff --git a/src/core/lib/iomgr/tcp_server_posix.cc b/src/core/lib/iomgr/tcp_server_posix.cc index 99e1c6cd06..2fa00a81d2 100644 --- a/src/core/lib/iomgr/tcp_server_posix.cc +++ b/src/core/lib/iomgr/tcp_server_posix.cc @@ -45,6 +45,7 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" @@ -52,7 +53,6 @@ #include "src/core/lib/iomgr/tcp_posix.h" #include "src/core/lib/iomgr/tcp_server_utils_posix.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" -#include "src/core/lib/support/string.h" static gpr_once check_init = GPR_ONCE_INIT; static bool has_so_reuseport = false; diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index baa49d5cc5..b384623a5e 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -29,6 +29,7 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/iomgr_uv.h" #include "src/core/lib/iomgr/network_status_tracker.h" @@ -36,7 +37,6 @@ #include "src/core/lib/iomgr/tcp_uv.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" grpc_core::TraceFlag grpc_tcp_trace(false, "tcp"); diff --git a/src/core/lib/iomgr/timer_generic.cc b/src/core/lib/iomgr/timer_generic.cc index 103144eb3b..177bdec8df 100644 --- a/src/core/lib/iomgr/timer_generic.cc +++ b/src/core/lib/iomgr/timer_generic.cc @@ -32,9 +32,9 @@ #include #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/spinlock.h" #include "src/core/lib/iomgr/time_averaged_stats.h" #include "src/core/lib/iomgr/timer_heap.h" -#include "src/core/lib/support/spinlock.h" #define INVALID_HEAP_INDEX 0xffffffffu diff --git a/src/core/lib/iomgr/udp_server.cc b/src/core/lib/iomgr/udp_server.cc index 946846a8b8..27d32c59ae 100644 --- a/src/core/lib/iomgr/udp_server.cc +++ b/src/core/lib/iomgr/udp_server.cc @@ -49,6 +49,7 @@ #include #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/executor.h" @@ -58,7 +59,6 @@ #include "src/core/lib/iomgr/socket_factory_posix.h" #include "src/core/lib/iomgr/socket_utils_posix.h" #include "src/core/lib/iomgr/unix_sockets_posix.h" -#include "src/core/lib/support/string.h" /* one listening port */ typedef struct grpc_udp_listener grpc_udp_listener; diff --git a/src/core/lib/profiling/basic_timers.cc b/src/core/lib/profiling/basic_timers.cc index 87dd4ab120..d1c9fd7dec 100644 --- a/src/core/lib/profiling/basic_timers.cc +++ b/src/core/lib/profiling/basic_timers.cc @@ -30,7 +30,7 @@ #include #include -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" typedef enum { BEGIN = '{', END = '}', MARK = '.' } marker_type; diff --git a/src/core/lib/security/context/security_context.cc b/src/core/lib/security/context/security_context.cc index 0371027994..63ec42cf86 100644 --- a/src/core/lib/security/context/security_context.cc +++ b/src/core/lib/security/context/security_context.cc @@ -19,8 +19,8 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/context/security_context.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" diff --git a/src/core/lib/security/credentials/credentials.cc b/src/core/lib/security/credentials/credentials.cc index 48b459e1be..009a5ce4ec 100644 --- a/src/core/lib/security/credentials/credentials.cc +++ b/src/core/lib/security/credentials/credentials.cc @@ -22,11 +22,11 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/httpcli.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/json/json.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include diff --git a/src/core/lib/security/credentials/fake/fake_credentials.cc b/src/core/lib/security/credentials/fake/fake_credentials.cc index 99b1214951..9065325cdd 100644 --- a/src/core/lib/security/credentials/fake/fake_credentials.cc +++ b/src/core/lib/security/credentials/fake/fake_credentials.cc @@ -25,8 +25,8 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/executor.h" -#include "src/core/lib/support/string.h" /* -- Fake transport security credentials. -- */ diff --git a/src/core/lib/security/credentials/google_default/credentials_generic.cc b/src/core/lib/security/credentials/google_default/credentials_generic.cc index af103f5dc5..15ae9d6428 100644 --- a/src/core/lib/security/credentials/google_default/credentials_generic.cc +++ b/src/core/lib/security/credentials/google_default/credentials_generic.cc @@ -22,8 +22,8 @@ #include #include -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" char* grpc_get_well_known_google_credentials_file_path_impl(void) { char* result = nullptr; diff --git a/src/core/lib/security/credentials/google_default/google_default_credentials.cc b/src/core/lib/security/credentials/google_default/google_default_credentials.cc index 03d52850d9..dc19202033 100644 --- a/src/core/lib/security/credentials/google_default/google_default_credentials.cc +++ b/src/core/lib/security/credentials/google_default/google_default_credentials.cc @@ -24,6 +24,8 @@ #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/httpcli.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/load_file.h" @@ -33,8 +35,6 @@ #include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" /* -- Constants. -- */ diff --git a/src/core/lib/security/credentials/jwt/json_token.cc b/src/core/lib/security/credentials/jwt/json_token.cc index a152ddcaaf..078f04ed11 100644 --- a/src/core/lib/security/credentials/jwt/json_token.cc +++ b/src/core/lib/security/credentials/jwt/json_token.cc @@ -26,9 +26,9 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/util/json_util.h" #include "src/core/lib/slice/b64.h" -#include "src/core/lib/support/string.h" extern "C" { #include diff --git a/src/core/lib/security/credentials/jwt/jwt_verifier.cc b/src/core/lib/security/credentials/jwt/jwt_verifier.cc index 39339f07d7..860506df39 100644 --- a/src/core/lib/security/credentials/jwt/jwt_verifier.cc +++ b/src/core/lib/security/credentials/jwt/jwt_verifier.cc @@ -31,11 +31,11 @@ extern "C" { #include } +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/httpcli.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/slice/b64.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "src/core/tsi/ssl_types.h" /* --- Utils. --- */ diff --git a/src/core/lib/security/transport/client_auth_filter.cc b/src/core/lib/security/transport/client_auth_filter.cc index 6d7f89873b..045cb3e239 100644 --- a/src/core/lib/security/transport/client_auth_filter.cc +++ b/src/core/lib/security/transport/client_auth_filter.cc @@ -25,13 +25,13 @@ #include #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/security/transport/security_connector.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/transport/static_metadata.h" diff --git a/src/core/lib/security/transport/secure_endpoint.cc b/src/core/lib/security/transport/secure_endpoint.cc index e5c089de9c..bd8a6cd76a 100644 --- a/src/core/lib/security/transport/secure_endpoint.cc +++ b/src/core/lib/security/transport/secure_endpoint.cc @@ -28,12 +28,12 @@ #include #include #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/security/transport/secure_endpoint.h" #include "src/core/lib/security/transport/tsi_error.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/tsi/transport_security_grpc.h" #define STAGING_BUFFER_SIZE 8192 diff --git a/src/core/lib/security/transport/security_connector.cc b/src/core/lib/security/transport/security_connector.cc index fd139714da..1d962f94b2 100644 --- a/src/core/lib/security/transport/security_connector.cc +++ b/src/core/lib/security/transport/security_connector.cc @@ -30,6 +30,8 @@ #include "src/core/ext/transport/chttp2/alpn/alpn.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/handshaker.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/load_file.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/credentials/credentials.h" @@ -38,8 +40,6 @@ #include "src/core/lib/security/transport/lb_targets_info.h" #include "src/core/lib/security/transport/secure_endpoint.h" #include "src/core/lib/security/transport/security_handshaker.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" #include "src/core/tsi/fake_transport_security.h" #include "src/core/tsi/ssl_transport_security.h" #include "src/core/tsi/transport_security_adapter.h" diff --git a/src/core/lib/slice/slice_intern.cc b/src/core/lib/slice/slice_intern.cc index c578c6d9de..fe1770b92c 100644 --- a/src/core/lib/slice/slice_intern.cc +++ b/src/core/lib/slice/slice_intern.cc @@ -24,10 +24,10 @@ #include #include +#include "src/core/lib/gpr/murmur_hash.h" #include "src/core/lib/iomgr/iomgr_internal.h" /* for iomgr_abort_on_leaks() */ #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/murmur_hash.h" #include "src/core/lib/transport/static_metadata.h" #define LOG2_SHARD_COUNT 5 diff --git a/src/core/lib/slice/slice_string_helpers.cc b/src/core/lib/slice/slice_string_helpers.cc index 5385be9866..be0db09252 100644 --- a/src/core/lib/slice/slice_string_helpers.cc +++ b/src/core/lib/slice/slice_string_helpers.cc @@ -22,8 +22,8 @@ #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" char* grpc_dump_slice(grpc_slice s, uint32_t flags) { return gpr_dump((const char*)GRPC_SLICE_START_PTR(s), GRPC_SLICE_LENGTH(s), diff --git a/src/core/lib/slice/slice_string_helpers.h b/src/core/lib/slice/slice_string_helpers.h index 7f51b11b9c..109084be1f 100644 --- a/src/core/lib/slice/slice_string_helpers.h +++ b/src/core/lib/slice/slice_string_helpers.h @@ -26,7 +26,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" /* Calls gpr_dump on a slice. */ char* grpc_dump_slice(grpc_slice slice, uint32_t flags); diff --git a/src/core/lib/support/abstract.h b/src/core/lib/support/abstract.h deleted file mode 100644 index 1dffa30128..0000000000 --- a/src/core/lib/support/abstract.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * 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_SUPPORT_ABSTRACT_H -#define GRPC_CORE_LIB_SUPPORT_ABSTRACT_H - -// This is needed to support abstract base classes in the c core. Since gRPC -// doesn't have a c++ runtime, it will hit a linker error on delete unless -// we define a virtual operator delete. See this blog for more info: -// https://eli.thegreenplace.net/2015/c-deleting-destructors-and-virtual-operator-delete/ -#define GRPC_ABSTRACT_BASE_CLASS \ - static void operator delete(void* p) { abort(); } - -// gRPC currently can't depend on libstdc++, so we can't use "= 0" for -// pure virtual methods. Instead, we use this macro. -#define GRPC_ABSTRACT \ - { GPR_ASSERT(false); } - -#endif /* GRPC_CORE_LIB_SUPPORT_ABSTRACT_H */ diff --git a/src/core/lib/support/alloc.cc b/src/core/lib/support/alloc.cc deleted file mode 100644 index 518bdb99f7..0000000000 --- a/src/core/lib/support/alloc.cc +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include -#include -#include -#include "src/core/lib/profiling/timers.h" - -static void* zalloc_with_calloc(size_t sz) { return calloc(sz, 1); } - -static void* zalloc_with_gpr_malloc(size_t sz) { - void* p = gpr_malloc(sz); - memset(p, 0, sz); - return p; -} - -static gpr_allocation_functions g_alloc_functions = {malloc, zalloc_with_calloc, - realloc, free}; - -gpr_allocation_functions gpr_get_allocation_functions() { - return g_alloc_functions; -} - -void gpr_set_allocation_functions(gpr_allocation_functions functions) { - GPR_ASSERT(functions.malloc_fn != nullptr); - GPR_ASSERT(functions.realloc_fn != nullptr); - GPR_ASSERT(functions.free_fn != nullptr); - if (functions.zalloc_fn == nullptr) { - functions.zalloc_fn = zalloc_with_gpr_malloc; - } - g_alloc_functions = functions; -} - -void* gpr_malloc(size_t size) { - void* p; - if (size == 0) return nullptr; - GPR_TIMER_BEGIN("gpr_malloc", 0); - p = g_alloc_functions.malloc_fn(size); - if (!p) { - abort(); - } - GPR_TIMER_END("gpr_malloc", 0); - return p; -} - -void* gpr_zalloc(size_t size) { - void* p; - if (size == 0) return nullptr; - GPR_TIMER_BEGIN("gpr_zalloc", 0); - p = g_alloc_functions.zalloc_fn(size); - if (!p) { - abort(); - } - GPR_TIMER_END("gpr_zalloc", 0); - return p; -} - -void gpr_free(void* p) { - GPR_TIMER_BEGIN("gpr_free", 0); - g_alloc_functions.free_fn(p); - GPR_TIMER_END("gpr_free", 0); -} - -void* gpr_realloc(void* p, size_t size) { - if ((size == 0) && (p == nullptr)) return nullptr; - GPR_TIMER_BEGIN("gpr_realloc", 0); - p = g_alloc_functions.realloc_fn(p, size); - if (!p) { - abort(); - } - GPR_TIMER_END("gpr_realloc", 0); - return p; -} - -void* gpr_malloc_aligned(size_t size, size_t alignment_log) { - size_t alignment = ((size_t)1) << alignment_log; - size_t extra = alignment - 1 + sizeof(void*); - void* p = gpr_malloc(size + extra); - void** ret = (void**)(((uintptr_t)p + extra) & ~(alignment - 1)); - ret[-1] = p; - return (void*)ret; -} - -void gpr_free_aligned(void* ptr) { gpr_free(((void**)ptr)[-1]); } diff --git a/src/core/lib/support/arena.cc b/src/core/lib/support/arena.cc deleted file mode 100644 index 5b9dd370d8..0000000000 --- a/src/core/lib/support/arena.cc +++ /dev/null @@ -1,83 +0,0 @@ -/* - * - * 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/support/arena.h" -#include -#include -#include -#include - -#define ROUND_UP_TO_ALIGNMENT_SIZE(x) \ - (((x) + GPR_MAX_ALIGNMENT - 1u) & ~(GPR_MAX_ALIGNMENT - 1u)) - -typedef struct zone { - size_t size_begin; - size_t size_end; - gpr_atm next_atm; -} zone; - -struct gpr_arena { - gpr_atm size_so_far; - zone initial_zone; -}; - -gpr_arena* gpr_arena_create(size_t initial_size) { - initial_size = ROUND_UP_TO_ALIGNMENT_SIZE(initial_size); - gpr_arena* a = (gpr_arena*)gpr_zalloc(sizeof(gpr_arena) + initial_size); - a->initial_zone.size_end = initial_size; - return a; -} - -size_t gpr_arena_destroy(gpr_arena* arena) { - gpr_atm size = gpr_atm_no_barrier_load(&arena->size_so_far); - zone* z = (zone*)gpr_atm_no_barrier_load(&arena->initial_zone.next_atm); - gpr_free(arena); - while (z) { - zone* next_z = (zone*)gpr_atm_no_barrier_load(&z->next_atm); - gpr_free(z); - z = next_z; - } - return (size_t)size; -} - -void* gpr_arena_alloc(gpr_arena* arena, size_t size) { - size = ROUND_UP_TO_ALIGNMENT_SIZE(size); - size_t start = - (size_t)gpr_atm_no_barrier_fetch_add(&arena->size_so_far, size); - zone* z = &arena->initial_zone; - while (start > z->size_end) { - zone* next_z = (zone*)gpr_atm_acq_load(&z->next_atm); - if (next_z == nullptr) { - size_t next_z_size = (size_t)gpr_atm_no_barrier_load(&arena->size_so_far); - next_z = (zone*)gpr_zalloc(sizeof(zone) + next_z_size); - next_z->size_begin = z->size_end; - next_z->size_end = z->size_end + next_z_size; - if (!gpr_atm_rel_cas(&z->next_atm, (gpr_atm)NULL, (gpr_atm)next_z)) { - gpr_free(next_z); - next_z = (zone*)gpr_atm_acq_load(&z->next_atm); - } - } - z = next_z; - } - if (start + size > z->size_end) { - return gpr_arena_alloc(arena, size); - } - GPR_ASSERT(start >= z->size_begin); - GPR_ASSERT(start + size <= z->size_end); - return ((char*)(z + 1)) + start - z->size_begin; -} diff --git a/src/core/lib/support/arena.h b/src/core/lib/support/arena.h deleted file mode 100644 index cfe973a036..0000000000 --- a/src/core/lib/support/arena.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * - * 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. - * - */ - -// \file Arena based allocator -// Allows very fast allocation of memory, but that memory cannot be freed until -// the arena as a whole is freed -// Tracks the total memory allocated against it, so that future arenas can -// pre-allocate the right amount of memory - -#ifndef GRPC_CORE_LIB_SUPPORT_ARENA_H -#define GRPC_CORE_LIB_SUPPORT_ARENA_H - -#include - -typedef struct gpr_arena gpr_arena; - -// Create an arena, with \a initial_size bytes in the first allocated buffer -gpr_arena* gpr_arena_create(size_t initial_size); -// Allocate \a size bytes from the arena -void* gpr_arena_alloc(gpr_arena* arena, size_t size); -// Destroy an arena, returning the total number of bytes allocated -size_t gpr_arena_destroy(gpr_arena* arena); - -#endif /* GRPC_CORE_LIB_SUPPORT_ARENA_H */ diff --git a/src/core/lib/support/atm.cc b/src/core/lib/support/atm.cc deleted file mode 100644 index 15bfe52d64..0000000000 --- a/src/core/lib/support/atm.cc +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * 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 -#include - -gpr_atm gpr_atm_no_barrier_clamped_add(gpr_atm* value, gpr_atm delta, - gpr_atm min, gpr_atm max) { - gpr_atm current_value; - gpr_atm new_value; - do { - current_value = gpr_atm_no_barrier_load(value); - new_value = GPR_CLAMP(current_value + delta, min, max); - if (new_value == current_value) break; - } while (!gpr_atm_no_barrier_cas(value, current_value, new_value)); - return new_value; -} diff --git a/src/core/lib/support/atomic.h b/src/core/lib/support/atomic.h deleted file mode 100644 index 73c59ae3cd..0000000000 --- a/src/core/lib/support/atomic.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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_SUPPORT_ATOMIC_H -#define GRPC_CORE_LIB_SUPPORT_ATOMIC_H - -#include - -#ifdef GPR_HAS_CXX11_ATOMIC -#include "src/core/lib/support/atomic_with_std.h" -#else -#include "src/core/lib/support/atomic_with_atm.h" -#endif - -#endif /* GRPC_CORE_LIB_SUPPORT_ATOMIC_H */ diff --git a/src/core/lib/support/atomic_with_atm.h b/src/core/lib/support/atomic_with_atm.h deleted file mode 100644 index fe00e9b5bc..0000000000 --- a/src/core/lib/support/atomic_with_atm.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * 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_SUPPORT_ATOMIC_WITH_ATM_H -#define GRPC_CORE_LIB_SUPPORT_ATOMIC_WITH_ATM_H - -#include - -namespace grpc_core { - -enum MemoryOrderRelaxed { memory_order_relaxed }; - -template -class atomic; - -template <> -class atomic { - public: - atomic() { gpr_atm_no_barrier_store(&x_, static_cast(false)); } - explicit atomic(bool x) { - gpr_atm_no_barrier_store(&x_, static_cast(x)); - } - - bool compare_exchange_strong(bool& expected, bool update, MemoryOrderRelaxed, - MemoryOrderRelaxed) { - if (!gpr_atm_no_barrier_cas(&x_, static_cast(expected), - static_cast(update))) { - expected = gpr_atm_no_barrier_load(&x_) != 0; - return false; - } - return true; - } - - private: - gpr_atm x_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_ATOMIC_WITH_ATM_H */ diff --git a/src/core/lib/support/atomic_with_std.h b/src/core/lib/support/atomic_with_std.h deleted file mode 100644 index c7a92f7012..0000000000 --- a/src/core/lib/support/atomic_with_std.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * 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_SUPPORT_ATOMIC_WITH_STD_H -#define GRPC_CORE_LIB_SUPPORT_ATOMIC_WITH_STD_H - -#include - -namespace grpc_core { - -template -using atomic = std::atomic; - -typedef std::memory_order memory_order; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_ATOMIC_WITH_STD_H */ diff --git a/src/core/lib/support/avl.cc b/src/core/lib/support/avl.cc deleted file mode 100644 index 0b67a21f2f..0000000000 --- a/src/core/lib/support/avl.cc +++ /dev/null @@ -1,300 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include - -#include -#include -#include - -gpr_avl gpr_avl_create(const gpr_avl_vtable* vtable) { - gpr_avl out; - out.vtable = vtable; - out.root = nullptr; - return out; -} - -static gpr_avl_node* ref_node(gpr_avl_node* node) { - if (node) { - gpr_ref(&node->refs); - } - return node; -} - -static void unref_node(const gpr_avl_vtable* vtable, gpr_avl_node* node, - void* user_data) { - if (node == nullptr) { - return; - } - if (gpr_unref(&node->refs)) { - 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); - } -} - -static long node_height(gpr_avl_node* node) { - return node == nullptr ? 0 : node->height; -} - -#ifndef NDEBUG -static long calculate_height(gpr_avl_node* node) { - return node == nullptr ? 0 - : 1 + GPR_MAX(calculate_height(node->left), - calculate_height(node->right)); -} - -static gpr_avl_node* assert_invariants(gpr_avl_node* n) { - if (n == nullptr) return nullptr; - assert_invariants(n->left); - assert_invariants(n->right); - assert(calculate_height(n) == n->height); - assert(labs(node_height(n->left) - node_height(n->right)) <= 1); - return n; -} -#else -static gpr_avl_node* assert_invariants(gpr_avl_node* n) { return n; } -#endif - -gpr_avl_node* new_node(void* key, void* value, gpr_avl_node* left, - gpr_avl_node* right) { - gpr_avl_node* node = (gpr_avl_node*)gpr_malloc(sizeof(*node)); - gpr_ref_init(&node->refs, 1); - node->key = key; - node->value = value; - node->left = assert_invariants(left); - node->right = assert_invariants(right); - node->height = 1 + GPR_MAX(node_height(left), node_height(right)); - return node; -} - -static gpr_avl_node* get(const gpr_avl_vtable* vtable, gpr_avl_node* node, - void* key, void* user_data) { - long cmp; - - if (node == nullptr) { - return nullptr; - } - - cmp = vtable->compare_keys(node->key, key, user_data); - if (cmp == 0) { - return node; - } else if (cmp > 0) { - return get(vtable, node->left, key, user_data); - } else { - return get(vtable, node->right, key, user_data); - } -} - -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 : nullptr; -} - -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 != nullptr) { - *value = node->value; - return 1; - } - return 0; -} - -static gpr_avl_node* rotate_left(const gpr_avl_vtable* vtable, void* key, - void* value, gpr_avl_node* left, - 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, 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, void* user_data) { - /* rotate_right(..., rotate_left(left), right) */ - 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, void* user_data) { - /* rotate_left(..., left, rotate_right(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, 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, user_data)); - } else { - 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, user_data)); - } else { - return assert_invariants( - rotate_left(vtable, key, value, left, right, user_data)); - } - default: - return assert_invariants(new_node(key, value, left, right)); - } -} - -static gpr_avl_node* add_key(const gpr_avl_vtable* vtable, gpr_avl_node* node, - void* key, void* value, void* user_data) { - long cmp; - if (node == nullptr) { - return new_node(key, value, nullptr, nullptr); - } - 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, 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, 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, void* user_data) { - gpr_avl_node* old_root = avl.root; - avl.root = add_key(avl.vtable, avl.root, key, value, user_data); - assert_invariants(avl.root); - unref_node(avl.vtable, old_root, user_data); - return avl; -} - -static gpr_avl_node* in_order_head(gpr_avl_node* node) { - while (node->left != nullptr) { - node = node->left; - } - return node; -} - -static gpr_avl_node* in_order_tail(gpr_avl_node* node) { - while (node->right != nullptr) { - node = node->right; - } - return node; -} - -static gpr_avl_node* remove_key(const gpr_avl_vtable* vtable, - gpr_avl_node* node, void* key, - void* user_data) { - long cmp; - if (node == nullptr) { - return nullptr; - } - cmp = vtable->compare_keys(node->key, key, user_data); - if (cmp == 0) { - if (node->left == nullptr) { - return ref_node(node->right); - } else if (node->right == nullptr) { - 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, 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, 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, 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, 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, void* user_data) { - gpr_avl_node* old_root = avl.root; - avl.root = remove_key(avl.vtable, avl.root, key, user_data); - assert_invariants(avl.root); - unref_node(avl.vtable, old_root, user_data); - return 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, void* user_data) { - unref_node(avl.vtable, avl.root, user_data); -} - -int gpr_avl_is_empty(gpr_avl avl) { return avl.root == nullptr; } diff --git a/src/core/lib/support/cmdline.cc b/src/core/lib/support/cmdline.cc deleted file mode 100644 index da9f10a496..0000000000 --- a/src/core/lib/support/cmdline.cc +++ /dev/null @@ -1,330 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include -#include - -#include -#include -#include -#include "src/core/lib/support/string.h" - -typedef enum { ARGTYPE_INT, ARGTYPE_BOOL, ARGTYPE_STRING } argtype; - -typedef struct arg { - const char* name; - const char* help; - argtype type; - void* value; - struct arg* next; -} arg; - -struct gpr_cmdline { - const char* description; - arg* args; - const char* argv0; - - const char* extra_arg_name; - const char* extra_arg_help; - void (*extra_arg)(void* user_data, const char* arg); - void* extra_arg_user_data; - - int (*state)(gpr_cmdline* cl, char* arg); - arg* cur_arg; - - int survive_failure; -}; - -static int normal_state(gpr_cmdline* cl, char* arg); - -gpr_cmdline* gpr_cmdline_create(const char* description) { - gpr_cmdline* cl = (gpr_cmdline*)gpr_zalloc(sizeof(gpr_cmdline)); - - cl->description = description; - cl->state = normal_state; - - return cl; -} - -void gpr_cmdline_set_survive_failure(gpr_cmdline* cl) { - cl->survive_failure = 1; -} - -void gpr_cmdline_destroy(gpr_cmdline* cl) { - while (cl->args) { - arg* a = cl->args; - cl->args = a->next; - gpr_free(a); - } - gpr_free(cl); -} - -static void add_arg(gpr_cmdline* cl, const char* name, const char* help, - argtype type, void* value) { - arg* a; - - for (a = cl->args; a; a = a->next) { - GPR_ASSERT(0 != strcmp(a->name, name)); - } - - a = (arg*)gpr_zalloc(sizeof(arg)); - a->name = name; - a->help = help; - a->type = type; - a->value = value; - a->next = cl->args; - cl->args = a; -} - -void gpr_cmdline_add_int(gpr_cmdline* cl, const char* name, const char* help, - int* value) { - add_arg(cl, name, help, ARGTYPE_INT, value); -} - -void gpr_cmdline_add_flag(gpr_cmdline* cl, const char* name, const char* help, - int* value) { - add_arg(cl, name, help, ARGTYPE_BOOL, value); -} - -void gpr_cmdline_add_string(gpr_cmdline* cl, const char* name, const char* help, - const char** value) { - add_arg(cl, name, help, ARGTYPE_STRING, value); -} - -void gpr_cmdline_on_extra_arg( - gpr_cmdline* cl, const char* name, const char* help, - void (*on_extra_arg)(void* user_data, const char* arg), void* user_data) { - GPR_ASSERT(!cl->extra_arg); - GPR_ASSERT(on_extra_arg); - - cl->extra_arg = on_extra_arg; - cl->extra_arg_user_data = user_data; - cl->extra_arg_name = name; - cl->extra_arg_help = help; -} - -/* recursively descend argument list, adding the last element - to s first - so that arguments are added in the order they were - added to the list by api calls */ -static void add_args_to_usage(gpr_strvec* s, arg* a) { - char* tmp; - - if (!a) return; - add_args_to_usage(s, a->next); - - switch (a->type) { - case ARGTYPE_BOOL: - gpr_asprintf(&tmp, " [--%s|--no-%s]", a->name, a->name); - gpr_strvec_add(s, tmp); - break; - case ARGTYPE_STRING: - gpr_asprintf(&tmp, " [--%s=string]", a->name); - gpr_strvec_add(s, tmp); - break; - case ARGTYPE_INT: - gpr_asprintf(&tmp, " [--%s=int]", a->name); - gpr_strvec_add(s, tmp); - break; - } -} - -char* gpr_cmdline_usage_string(gpr_cmdline* cl, const char* argv0) { - /* TODO(ctiller): make this prettier */ - gpr_strvec s; - char* tmp; - const char* name = strrchr(argv0, '/'); - - if (name) { - name++; - } else { - name = argv0; - } - - gpr_strvec_init(&s); - - gpr_asprintf(&tmp, "Usage: %s", name); - gpr_strvec_add(&s, tmp); - add_args_to_usage(&s, cl->args); - if (cl->extra_arg) { - gpr_asprintf(&tmp, " [%s...]", cl->extra_arg_name); - gpr_strvec_add(&s, tmp); - } - gpr_strvec_add(&s, gpr_strdup("\n")); - - tmp = gpr_strvec_flatten(&s, nullptr); - gpr_strvec_destroy(&s); - return tmp; -} - -static int print_usage_and_die(gpr_cmdline* cl) { - char* usage = gpr_cmdline_usage_string(cl, cl->argv0); - fprintf(stderr, "%s", usage); - gpr_free(usage); - if (!cl->survive_failure) { - exit(1); - } - return 0; -} - -static int extra_state(gpr_cmdline* cl, char* str) { - if (!cl->extra_arg) { - return print_usage_and_die(cl); - } - cl->extra_arg(cl->extra_arg_user_data, str); - return 1; -} - -static arg* find_arg(gpr_cmdline* cl, char* name) { - arg* a; - - for (a = cl->args; a; a = a->next) { - if (0 == strcmp(a->name, name)) { - break; - } - } - - if (!a) { - fprintf(stderr, "Unknown argument: %s\n", name); - return nullptr; - } - - return a; -} - -static int value_state(gpr_cmdline* cl, char* str) { - long intval; - char* end; - - GPR_ASSERT(cl->cur_arg); - - switch (cl->cur_arg->type) { - case ARGTYPE_INT: - intval = strtol(str, &end, 0); - if (*end || intval < INT_MIN || intval > INT_MAX) { - fprintf(stderr, "expected integer, got '%s' for %s\n", str, - cl->cur_arg->name); - return print_usage_and_die(cl); - } - *(int*)cl->cur_arg->value = (int)intval; - break; - case ARGTYPE_BOOL: - if (0 == strcmp(str, "1") || 0 == strcmp(str, "true")) { - *(int*)cl->cur_arg->value = 1; - } else if (0 == strcmp(str, "0") || 0 == strcmp(str, "false")) { - *(int*)cl->cur_arg->value = 0; - } else { - fprintf(stderr, "expected boolean, got '%s' for %s\n", str, - cl->cur_arg->name); - return print_usage_and_die(cl); - } - break; - case ARGTYPE_STRING: - *(char**)cl->cur_arg->value = str; - break; - } - - cl->state = normal_state; - return 1; -} - -static int normal_state(gpr_cmdline* cl, char* str) { - char* eq = nullptr; - char* tmp = nullptr; - char* arg_name = nullptr; - int r = 1; - - if (0 == strcmp(str, "-help") || 0 == strcmp(str, "--help") || - 0 == strcmp(str, "-h")) { - return print_usage_and_die(cl); - } - - cl->cur_arg = nullptr; - - if (str[0] == '-') { - if (str[1] == '-') { - if (str[2] == 0) { - /* handle '--' to move to just extra args */ - cl->state = extra_state; - return 1; - } - str += 2; - } else { - str += 1; - } - /* first byte of str is now past the leading '-' or '--' */ - if (str[0] == 'n' && str[1] == 'o' && str[2] == '-') { - /* str is of the form '--no-foo' - it's a flag disable */ - str += 3; - cl->cur_arg = find_arg(cl, str); - if (cl->cur_arg == nullptr) { - return print_usage_and_die(cl); - } - if (cl->cur_arg->type != ARGTYPE_BOOL) { - fprintf(stderr, "%s is not a flag argument\n", str); - return print_usage_and_die(cl); - } - *(int*)cl->cur_arg->value = 0; - return 1; /* early out */ - } - eq = strchr(str, '='); - if (eq != nullptr) { - /* copy the string into a temp buffer and extract the name */ - tmp = arg_name = (char*)gpr_malloc((size_t)(eq - str + 1)); - memcpy(arg_name, str, (size_t)(eq - str)); - arg_name[eq - str] = 0; - } else { - arg_name = str; - } - cl->cur_arg = find_arg(cl, arg_name); - if (cl->cur_arg == nullptr) { - return print_usage_and_die(cl); - } - if (eq != nullptr) { - /* str was of the type --foo=value, parse the value */ - r = value_state(cl, eq + 1); - } else if (cl->cur_arg->type != ARGTYPE_BOOL) { - /* flag types don't have a '--foo value' variant, other types do */ - cl->state = value_state; - } else { - /* flag parameter: just set the value */ - *(int*)cl->cur_arg->value = 1; - } - } else { - r = extra_state(cl, str); - } - - gpr_free(tmp); - return r; -} - -int gpr_cmdline_parse(gpr_cmdline* cl, int argc, char** argv) { - int i; - - GPR_ASSERT(argc >= 1); - cl->argv0 = argv[0]; - - for (i = 1; i < argc; i++) { - if (!cl->state(cl, argv[i])) { - return 0; - } - } - return 1; -} diff --git a/src/core/lib/support/cpu_iphone.cc b/src/core/lib/support/cpu_iphone.cc deleted file mode 100644 index 2847e03ba5..0000000000 --- a/src/core/lib/support/cpu_iphone.cc +++ /dev/null @@ -1,36 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include - -#ifdef GPR_CPU_IPHONE - -/* Probably 2 instead of 1, but see comment on gpr_cpu_current_cpu. */ -unsigned gpr_cpu_num_cores(void) { return 1; } - -/* Most code that's using this is using it to shard across work queues. So - unless profiling shows it's a problem or there appears a way to detect the - currently running CPU core, let's have it shard the default way. - Note that the interface in cpu.h lets gpr_cpu_num_cores return 0, but doing - it makes it impossible for gpr_cpu_current_cpu to satisfy its stated range, - and some code might be relying on it. */ -unsigned gpr_cpu_current_cpu(void) { return 0; } - -#endif /* GPR_CPU_IPHONE */ diff --git a/src/core/lib/support/cpu_linux.cc b/src/core/lib/support/cpu_linux.cc deleted file mode 100644 index 21b1a71dc9..0000000000 --- a/src/core/lib/support/cpu_linux.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif /* _GNU_SOURCE */ - -#include - -#ifdef GPR_CPU_LINUX - -#include -#include -#include -#include - -#include -#include -#include - -static int ncpus = 0; - -static void init_num_cpus() { -#ifndef GPR_MUSL_LIBC_COMPAT - if (sched_getcpu() < 0) { - gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); - ncpus = 1; - return; - } -#endif - /* This must be signed. sysconf returns -1 when the number cannot be - determined */ - ncpus = (int)sysconf(_SC_NPROCESSORS_ONLN); - if (ncpus < 1) { - gpr_log(GPR_ERROR, "Cannot determine number of CPUs: assuming 1"); - ncpus = 1; - } -} - -unsigned gpr_cpu_num_cores(void) { - static gpr_once once = GPR_ONCE_INIT; - gpr_once_init(&once, init_num_cpus); - return (unsigned)ncpus; -} - -unsigned gpr_cpu_current_cpu(void) { -#ifdef GPR_MUSL_LIBC_COMPAT - // sched_getcpu() is undefined on musl - return 0; -#else - if (gpr_cpu_num_cores() == 1) { - return 0; - } - int cpu = sched_getcpu(); - if (cpu < 0) { - gpr_log(GPR_ERROR, "Error determining current CPU: %s\n", strerror(errno)); - return 0; - } - return (unsigned)cpu; -#endif -} - -#endif /* GPR_CPU_LINUX */ diff --git a/src/core/lib/support/cpu_posix.cc b/src/core/lib/support/cpu_posix.cc deleted file mode 100644 index bca14a0c12..0000000000 --- a/src/core/lib/support/cpu_posix.cc +++ /dev/null @@ -1,80 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#if defined(GPR_CPU_POSIX) - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -static long ncpus = 0; - -static pthread_key_t thread_id_key; - -static void init_ncpus() { - ncpus = sysconf(_SC_NPROCESSORS_ONLN); - if (ncpus < 1 || ncpus > INT32_MAX) { - gpr_log(GPR_ERROR, "Cannot determine number of CPUs: assuming 1"); - ncpus = 1; - } -} - -unsigned gpr_cpu_num_cores(void) { - static gpr_once once = GPR_ONCE_INIT; - gpr_once_init(&once, init_ncpus); - return (unsigned)ncpus; -} - -static void delete_thread_id(void* value) { - if (value) { - gpr_free(value); - } -} - -static void init_thread_id_key(void) { - pthread_key_create(&thread_id_key, delete_thread_id); -} - -unsigned gpr_cpu_current_cpu(void) { - /* NOTE: there's no way I know to return the actual cpu index portably... - most code that's using this is using it to shard across work queues though, - so here we use thread identity instead to achieve a similar though not - identical effect */ - static gpr_once once = GPR_ONCE_INIT; - gpr_once_init(&once, init_thread_id_key); - - unsigned int* thread_id = - static_cast(pthread_getspecific(thread_id_key)); - if (thread_id == nullptr) { - thread_id = static_cast(gpr_malloc(sizeof(unsigned int))); - pthread_setspecific(thread_id_key, thread_id); - } - - return (unsigned)GPR_HASH_POINTER(thread_id, gpr_cpu_num_cores()); -} - -#endif /* GPR_CPU_POSIX */ diff --git a/src/core/lib/support/cpu_windows.cc b/src/core/lib/support/cpu_windows.cc deleted file mode 100644 index 8d89453403..0000000000 --- a/src/core/lib/support/cpu_windows.cc +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_WINDOWS -#include -#include - -unsigned gpr_cpu_num_cores(void) { - SYSTEM_INFO si; - GetSystemInfo(&si); - return si.dwNumberOfProcessors; -} - -unsigned gpr_cpu_current_cpu(void) { return GetCurrentProcessorNumber(); } - -#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/support/debug_location.h b/src/core/lib/support/debug_location.h deleted file mode 100644 index 9b3f9220fc..0000000000 --- a/src/core/lib/support/debug_location.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * 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_SUPPORT_DEBUG_LOCATION_H -#define GRPC_CORE_LIB_SUPPORT_DEBUG_LOCATION_H - -namespace grpc_core { - -// Used for tracking file and line where a call is made for debug builds. -// No-op for non-debug builds. -// Callers can use the DEBUG_LOCATION macro in either case. -#ifndef NDEBUG -class DebugLocation { - public: - DebugLocation(const char* file, int line) : file_(file), line_(line) {} - bool Log() const { return true; } - const char* file() const { return file_; } - int line() const { return line_; } - - private: - const char* file_; - const int line_; -}; -#define DEBUG_LOCATION ::grpc_core::DebugLocation(__FILE__, __LINE__) -#else -class DebugLocation { - public: - bool Log() const { return false; } - const char* file() const { return nullptr; } - int line() const { return -1; } -}; -#define DEBUG_LOCATION ::grpc_core::DebugLocation() -#endif - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_DEBUG_LOCATION_H */ diff --git a/src/core/lib/support/env.h b/src/core/lib/support/env.h deleted file mode 100644 index 2452fd330d..0000000000 --- a/src/core/lib/support/env.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_ENV_H -#define GRPC_CORE_LIB_SUPPORT_ENV_H - -#include - -/* Env utility functions */ - -/* Gets the environment variable value with the specified name. - Returns a newly allocated string. It is the responsability of the caller to - gpr_free the return value if not NULL (which means that the environment - variable exists). */ -char* gpr_getenv(const char* name); - -/* Sets the the environment with the specified name to the specified value. */ -void gpr_setenv(const char* name, const char* value); - -/* This is a version of gpr_getenv that does not produce any output if it has to - use an insecure version of the function. It is ONLY to be used to solve the - problem in which we need to check an env variable to configure the verbosity - level of logging. So DO NOT USE THIS. */ -const char* gpr_getenv_silent(const char* name, char** dst); - -#endif /* GRPC_CORE_LIB_SUPPORT_ENV_H */ diff --git a/src/core/lib/support/env_linux.cc b/src/core/lib/support/env_linux.cc deleted file mode 100644 index 0af2de9f7e..0000000000 --- a/src/core/lib/support/env_linux.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* - * - * 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. - * - */ - -/* for secure_getenv. */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include - -#ifdef GPR_LINUX_ENV - -#include "src/core/lib/support/env.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/support/string.h" - -const char* gpr_getenv_silent(const char* name, char** dst) { - const char* insecure_func_used = nullptr; - char* result = nullptr; -#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE) - typedef char* (*getenv_type)(const char*); - static getenv_type getenv_func = NULL; - /* Check to see which getenv variant is supported (go from most - * to least secure) */ - const char* names[] = {"secure_getenv", "__secure_getenv", "getenv"}; - for (size_t i = 0; getenv_func == NULL && i < GPR_ARRAY_SIZE(names); i++) { - getenv_func = (getenv_type)dlsym(RTLD_DEFAULT, names[i]); - if (getenv_func != NULL && strstr(names[i], "secure") == NULL) { - insecure_func_used = names[i]; - } - } - result = getenv_func(name); -#elif __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 17) - result = secure_getenv(name); -#else - result = getenv(name); - insecure_func_used = "getenv"; -#endif - *dst = result == nullptr ? result : gpr_strdup(result); - return insecure_func_used; -} - -char* gpr_getenv(const char* name) { - char* result = nullptr; - const char* insecure_func_used = gpr_getenv_silent(name, &result); - if (insecure_func_used != nullptr) { - gpr_log(GPR_DEBUG, "Warning: insecure environment read function '%s' used", - insecure_func_used); - } - return result; -} - -void gpr_setenv(const char* name, const char* value) { - int res = setenv(name, value, 1); - GPR_ASSERT(res == 0); -} - -#endif /* GPR_LINUX_ENV */ diff --git a/src/core/lib/support/env_posix.cc b/src/core/lib/support/env_posix.cc deleted file mode 100644 index 8146330555..0000000000 --- a/src/core/lib/support/env_posix.cc +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_ENV - -#include "src/core/lib/support/env.h" - -#include - -#include - -#include -#include "src/core/lib/support/string.h" - -const char* gpr_getenv_silent(const char* name, char** dst) { - *dst = gpr_getenv(name); - return nullptr; -} - -char* gpr_getenv(const char* name) { - char* result = getenv(name); - return result == nullptr ? result : gpr_strdup(result); -} - -void gpr_setenv(const char* name, const char* value) { - int res = setenv(name, value, 1); - GPR_ASSERT(res == 0); -} - -#endif /* GPR_POSIX_ENV */ diff --git a/src/core/lib/support/env_windows.cc b/src/core/lib/support/env_windows.cc deleted file mode 100644 index cdb1d58ccd..0000000000 --- a/src/core/lib/support/env_windows.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_WINDOWS_ENV - -#include - -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/string_windows.h" - -#include -#include -#include - -const char* gpr_getenv_silent(const char* name, char** dst) { - *dst = gpr_getenv(name); - return NULL; -} - -char* gpr_getenv(const char* name) { - char* result = NULL; - DWORD size; - LPTSTR tresult = NULL; - LPTSTR tname = gpr_char_to_tchar(name); - DWORD ret; - - ret = GetEnvironmentVariable(tname, NULL, 0); - if (ret == 0) { - gpr_free(tname); - return NULL; - } - size = ret * (DWORD)sizeof(TCHAR); - tresult = (LPTSTR)gpr_malloc(size); - ret = GetEnvironmentVariable(tname, tresult, size); - gpr_free(tname); - if (ret == 0) { - gpr_free(tresult); - return NULL; - } - result = gpr_tchar_to_char(tresult); - gpr_free(tresult); - return result; -} - -void gpr_setenv(const char* name, const char* value) { - LPTSTR tname = gpr_char_to_tchar(name); - LPTSTR tvalue = gpr_char_to_tchar(value); - BOOL res = SetEnvironmentVariable(tname, tvalue); - gpr_free(tname); - gpr_free(tvalue); - GPR_ASSERT(res); -} - -#endif /* GPR_WINDOWS_ENV */ diff --git a/src/core/lib/support/fork.cc b/src/core/lib/support/fork.cc deleted file mode 100644 index dc291c4080..0000000000 --- a/src/core/lib/support/fork.cc +++ /dev/null @@ -1,62 +0,0 @@ -/* - * - * 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/support/fork.h" - -#include - -#include -#include - -#include "src/core/lib/support/env.h" - -/* - * NOTE: FORKING IS NOT GENERALLY SUPPORTED, THIS IS ONLY INTENDED TO WORK - * AROUND VERY SPECIFIC USE CASES. - */ - -static int override_fork_support_enabled = -1; -static int fork_support_enabled; - -void grpc_fork_support_init() { -#ifdef GRPC_ENABLE_FORK_SUPPORT - fork_support_enabled = 1; -#else - fork_support_enabled = 0; - char* env = gpr_getenv("GRPC_ENABLE_FORK_SUPPORT"); - if (env != nullptr) { - static const char* truthy[] = {"yes", "Yes", "YES", "true", - "True", "TRUE", "1"}; - for (size_t i = 0; i < GPR_ARRAY_SIZE(truthy); i++) { - if (0 == strcmp(env, truthy[i])) { - fork_support_enabled = 1; - } - } - gpr_free(env); - } -#endif - if (override_fork_support_enabled != -1) { - fork_support_enabled = override_fork_support_enabled; - } -} - -int grpc_fork_support_enabled() { return fork_support_enabled; } - -void grpc_enable_fork_support(int enable) { - override_fork_support_enabled = enable; -} diff --git a/src/core/lib/support/fork.h b/src/core/lib/support/fork.h deleted file mode 100644 index 215d4214a6..0000000000 --- a/src/core/lib/support/fork.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * - * 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_SUPPORT_FORK_H -#define GRPC_CORE_LIB_SUPPORT_FORK_H - -/* - * NOTE: FORKING IS NOT GENERALLY SUPPORTED, THIS IS ONLY INTENDED TO WORK - * AROUND VERY SPECIFIC USE CASES. - */ - -void grpc_fork_support_init(void); - -int grpc_fork_support_enabled(void); - -// Test only: Must be called before grpc_init(), and overrides -// environment variables/compile flags -void grpc_enable_fork_support(int enable); - -#endif /* GRPC_CORE_LIB_SUPPORT_FORK_H */ diff --git a/src/core/lib/support/host_port.cc b/src/core/lib/support/host_port.cc deleted file mode 100644 index cb8e3d4479..0000000000 --- a/src/core/lib/support/host_port.cc +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include - -#include -#include -#include -#include "src/core/lib/support/string.h" - -int gpr_join_host_port(char** out, const char* host, int port) { - if (host[0] != '[' && strchr(host, ':') != nullptr) { - /* IPv6 literals must be enclosed in brackets. */ - return gpr_asprintf(out, "[%s]:%d", host, port); - } else { - /* Ordinary non-bracketed host:port. */ - return gpr_asprintf(out, "%s:%d", host, port); - } -} - -int gpr_split_host_port(const char* name, char** host, char** port) { - const char* host_start; - size_t host_len; - const char* port_start; - - *host = nullptr; - *port = nullptr; - - if (name[0] == '[') { - /* Parse a bracketed host, typically an IPv6 literal. */ - const char* rbracket = strchr(name, ']'); - if (rbracket == nullptr) { - /* Unmatched [ */ - return 0; - } - if (rbracket[1] == '\0') { - /* ] */ - port_start = nullptr; - } else if (rbracket[1] == ':') { - /* ]: */ - port_start = rbracket + 2; - } else { - /* ] */ - return 0; - } - host_start = name + 1; - host_len = (size_t)(rbracket - host_start); - if (memchr(host_start, ':', host_len) == nullptr) { - /* Require all bracketed hosts to contain a colon, because a hostname or - IPv4 address should never use brackets. */ - return 0; - } - } else { - const char* colon = strchr(name, ':'); - if (colon != nullptr && strchr(colon + 1, ':') == nullptr) { - /* Exactly 1 colon. Split into host:port. */ - host_start = name; - host_len = (size_t)(colon - name); - port_start = colon + 1; - } else { - /* 0 or 2+ colons. Bare hostname or IPv6 litearal. */ - host_start = name; - host_len = strlen(name); - port_start = nullptr; - } - } - - /* Allocate return values. */ - *host = (char*)gpr_malloc(host_len + 1); - memcpy(*host, host_start, host_len); - (*host)[host_len] = '\0'; - - if (port_start != nullptr) { - *port = gpr_strdup(port_start); - } - - return 1; -} diff --git a/src/core/lib/support/log.cc b/src/core/lib/support/log.cc deleted file mode 100644 index 2a40745e97..0000000000 --- a/src/core/lib/support/log.cc +++ /dev/null @@ -1,94 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include -#include -#include - -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" - -#include -#include - -void gpr_default_log(gpr_log_func_args* args); -static gpr_atm g_log_func = (gpr_atm)gpr_default_log; -static gpr_atm g_min_severity_to_print = GPR_LOG_VERBOSITY_UNSET; - -const char* gpr_log_severity_string(gpr_log_severity severity) { - switch (severity) { - case GPR_LOG_SEVERITY_DEBUG: - return "D"; - case GPR_LOG_SEVERITY_INFO: - return "I"; - case GPR_LOG_SEVERITY_ERROR: - return "E"; - } - GPR_UNREACHABLE_CODE(return "UNKNOWN"); -} - -void gpr_log_message(const char* file, int line, gpr_log_severity severity, - const char* message) { - if ((gpr_atm)severity < gpr_atm_no_barrier_load(&g_min_severity_to_print)) { - return; - } - - gpr_log_func_args lfargs; - memset(&lfargs, 0, sizeof(lfargs)); - lfargs.file = file; - lfargs.line = line; - lfargs.severity = severity; - lfargs.message = message; - ((gpr_log_func)gpr_atm_no_barrier_load(&g_log_func))(&lfargs); -} - -void gpr_set_log_verbosity(gpr_log_severity min_severity_to_print) { - gpr_atm_no_barrier_store(&g_min_severity_to_print, - (gpr_atm)min_severity_to_print); -} - -void gpr_log_verbosity_init() { - char* verbosity = nullptr; - const char* insecure_getenv = gpr_getenv_silent("GRPC_VERBOSITY", &verbosity); - - gpr_atm min_severity_to_print = GPR_LOG_SEVERITY_ERROR; - if (verbosity != nullptr) { - if (gpr_stricmp(verbosity, "DEBUG") == 0) { - min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_DEBUG; - } else if (gpr_stricmp(verbosity, "INFO") == 0) { - min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_INFO; - } else if (gpr_stricmp(verbosity, "ERROR") == 0) { - min_severity_to_print = (gpr_atm)GPR_LOG_SEVERITY_ERROR; - } - gpr_free(verbosity); - } - if ((gpr_atm_no_barrier_load(&g_min_severity_to_print)) == - GPR_LOG_VERBOSITY_UNSET) { - gpr_atm_no_barrier_store(&g_min_severity_to_print, min_severity_to_print); - } - - if (insecure_getenv != nullptr) { - gpr_log(GPR_DEBUG, "Warning: insecure environment read function '%s' used", - insecure_getenv); - } -} - -void gpr_set_log_function(gpr_log_func f) { - gpr_atm_no_barrier_store(&g_log_func, (gpr_atm)(f ? f : gpr_default_log)); -} diff --git a/src/core/lib/support/log_android.cc b/src/core/lib/support/log_android.cc deleted file mode 100644 index 0d3ac0fe52..0000000000 --- a/src/core/lib/support/log_android.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_ANDROID - -#include -#include -#include -#include -#include -#include - -static android_LogPriority severity_to_log_priority(gpr_log_severity severity) { - switch (severity) { - case GPR_LOG_SEVERITY_DEBUG: - return ANDROID_LOG_DEBUG; - case GPR_LOG_SEVERITY_INFO: - return ANDROID_LOG_INFO; - case GPR_LOG_SEVERITY_ERROR: - return ANDROID_LOG_ERROR; - } - return ANDROID_LOG_DEFAULT; -} - -void gpr_log(const char* file, int line, gpr_log_severity severity, - const char* format, ...) { - char* message = NULL; - va_list args; - va_start(args, format); - vasprintf(&message, format, args); - va_end(args); - gpr_log_message(file, line, severity, message); - free(message); -} - -void gpr_default_log(gpr_log_func_args* args) { - const char* final_slash; - const char* display_file; - char* output = NULL; - - final_slash = strrchr(args->file, '/'); - if (final_slash == NULL) - display_file = args->file; - else - display_file = final_slash + 1; - - asprintf(&output, "%s:%d] %s", display_file, args->line, args->message); - - __android_log_write(severity_to_log_priority(args->severity), "GRPC", output); - - /* allocated by asprintf => use free, not gpr_free */ - free(output); -} - -#endif /* GPR_ANDROID */ diff --git a/src/core/lib/support/log_linux.cc b/src/core/lib/support/log_linux.cc deleted file mode 100644 index 6b1f1c71e4..0000000000 --- a/src/core/lib/support/log_linux.cc +++ /dev/null @@ -1,92 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef _POSIX_SOURCE -#define _POSIX_SOURCE -#endif - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include - -#ifdef GPR_LINUX_LOG - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static long gettid(void) { return syscall(__NR_gettid); } - -void gpr_log(const char* file, int line, gpr_log_severity severity, - const char* format, ...) { - char* message = nullptr; - va_list args; - va_start(args, format); - if (vasprintf(&message, format, args) == -1) { - va_end(args); - return; - } - va_end(args); - gpr_log_message(file, line, severity, message); - /* message has been allocated by vasprintf above, and needs free */ - free(message); -} - -void gpr_default_log(gpr_log_func_args* args) { - const char* final_slash; - char* prefix; - const char* display_file; - char time_buffer[64]; - time_t timer; - gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); - struct tm tm; - static __thread long tid = 0; - if (tid == 0) tid = gettid(); - - timer = (time_t)now.tv_sec; - final_slash = strrchr(args->file, '/'); - if (final_slash == nullptr) - display_file = args->file; - else - display_file = final_slash + 1; - - if (!localtime_r(&timer, &tm)) { - strcpy(time_buffer, "error:localtime"); - } else if (0 == - strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { - strcpy(time_buffer, "error:strftime"); - } - - gpr_asprintf(&prefix, "%s%s.%09" PRId32 " %7ld %s:%d]", - gpr_log_severity_string(args->severity), time_buffer, - now.tv_nsec, tid, display_file, args->line); - - fprintf(stderr, "%-60s %s\n", prefix, args->message); - gpr_free(prefix); -} - -#endif /* GPR_LINUX_LOG */ diff --git a/src/core/lib/support/log_posix.cc b/src/core/lib/support/log_posix.cc deleted file mode 100644 index 6f93cdefcd..0000000000 --- a/src/core/lib/support/log_posix.cc +++ /dev/null @@ -1,90 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_LOG - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static intptr_t gettid(void) { return (intptr_t)pthread_self(); } - -void gpr_log(const char* file, int line, gpr_log_severity severity, - const char* format, ...) { - char buf[64]; - char* allocated = nullptr; - char* message = nullptr; - int ret; - va_list args; - va_start(args, format); - ret = vsnprintf(buf, sizeof(buf), format, args); - va_end(args); - if (ret < 0) { - message = nullptr; - } else if ((size_t)ret <= sizeof(buf) - 1) { - message = buf; - } else { - message = allocated = (char*)gpr_malloc((size_t)ret + 1); - va_start(args, format); - vsnprintf(message, (size_t)(ret + 1), format, args); - va_end(args); - } - gpr_log_message(file, line, severity, message); - gpr_free(allocated); -} - -void gpr_default_log(gpr_log_func_args* args) { - const char* final_slash; - const char* display_file; - char time_buffer[64]; - time_t timer; - gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); - struct tm tm; - - timer = (time_t)now.tv_sec; - final_slash = strrchr(args->file, '/'); - if (final_slash == nullptr) - display_file = args->file; - else - display_file = final_slash + 1; - - if (!localtime_r(&timer, &tm)) { - strcpy(time_buffer, "error:localtime"); - } else if (0 == - strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { - strcpy(time_buffer, "error:strftime"); - } - - char* prefix; - gpr_asprintf(&prefix, "%s%s.%09d %7tu %s:%d]", - gpr_log_severity_string(args->severity), time_buffer, - (int)(now.tv_nsec), gettid(), display_file, args->line); - - fprintf(stderr, "%-70s %s\n", prefix, args->message); - gpr_free(prefix); -} - -#endif /* defined(GPR_POSIX_LOG) */ diff --git a/src/core/lib/support/log_windows.cc b/src/core/lib/support/log_windows.cc deleted file mode 100644 index 0013bf448f..0000000000 --- a/src/core/lib/support/log_windows.cc +++ /dev/null @@ -1,97 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_WINDOWS_LOG - -#include -#include - -#include -#include -#include -#include -#include - -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/string_windows.h" - -void gpr_log(const char* file, int line, gpr_log_severity severity, - const char* format, ...) { - char* message = NULL; - va_list args; - int ret; - - /* Determine the length. */ - va_start(args, format); - ret = _vscprintf(format, args); - va_end(args); - if (ret < 0) { - message = NULL; - } else { - /* Allocate a new buffer, with space for the NUL terminator. */ - size_t strp_buflen = (size_t)ret + 1; - message = (char*)gpr_malloc(strp_buflen); - - /* Print to the buffer. */ - va_start(args, format); - ret = vsnprintf_s(message, strp_buflen, _TRUNCATE, format, args); - va_end(args); - if ((size_t)ret != strp_buflen - 1) { - /* This should never happen. */ - gpr_free(message); - message = NULL; - } - } - - gpr_log_message(file, line, severity, message); - gpr_free(message); -} - -/* Simple starter implementation */ -void gpr_default_log(gpr_log_func_args* args) { - const char* final_slash; - const char* display_file; - char time_buffer[64]; - time_t timer; - gpr_timespec now = gpr_now(GPR_CLOCK_REALTIME); - struct tm tm; - - timer = (time_t)now.tv_sec; - final_slash = strrchr(args->file, '\\'); - if (final_slash == NULL) - display_file = args->file; - else - display_file = final_slash + 1; - - if (localtime_s(&tm, &timer)) { - strcpy(time_buffer, "error:localtime"); - } else if (0 == - strftime(time_buffer, sizeof(time_buffer), "%m%d %H:%M:%S", &tm)) { - strcpy(time_buffer, "error:strftime"); - } - - fprintf(stderr, "%s%s.%09u %5lu %s:%d] %s\n", - gpr_log_severity_string(args->severity), time_buffer, - (int)(now.tv_nsec), GetCurrentThreadId(), display_file, args->line, - args->message); - fflush(stderr); -} - -#endif /* GPR_WINDOWS_LOG */ diff --git a/src/core/lib/support/manual_constructor.h b/src/core/lib/support/manual_constructor.h deleted file mode 100644 index fda7653dbc..0000000000 --- a/src/core/lib/support/manual_constructor.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * - * Copyright 2016 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_SUPPORT_MANUAL_CONSTRUCTOR_H -#define GRPC_CORE_LIB_SUPPORT_MANUAL_CONSTRUCTOR_H - -// manually construct a region of memory with some type - -#include -#include -#include -#include -#include - -#include - -namespace grpc_core { - -// this contains templated helpers needed to implement the ManualConstructors -// in this file. -namespace manual_ctor_impl { - -// is_one_of returns true it a class, Member, is present in a variadic list of -// classes, List. -template -class is_one_of; - -template -class is_one_of { - public: - static constexpr const bool value = true; -}; - -template -class is_one_of { - public: - static constexpr const bool value = is_one_of::value; -}; - -template -class is_one_of { - public: - static constexpr const bool value = false; -}; - -// max_size_of returns sizeof(Type) for the largest type in the variadic list -// of classes, Types. -template -class max_size_of; - -template -class max_size_of { - public: - static constexpr const size_t value = sizeof(A); -}; - -template -class max_size_of { - public: - static constexpr const size_t value = sizeof(A) > max_size_of::value - ? sizeof(A) - : max_size_of::value; -}; - -// max_size_of returns alignof(Type) for the largest type in the variadic list -// of classes, Types. -template -class max_align_of; - -template -class max_align_of { - public: - static constexpr const size_t value = alignof(A); -}; - -template -class max_align_of { - public: - static constexpr const size_t value = alignof(A) > max_align_of::value - ? alignof(A) - : max_align_of::value; -}; - -} // namespace manual_ctor_impl - -template -class PolymorphicManualConstructor { - public: - // No constructor or destructor because one of the most useful uses of - // this class is as part of a union, and members of a union could not have - // constructors or destructors till C++11. And, anyway, the whole point of - // this class is to bypass constructor and destructor. - - BaseType* get() { return reinterpret_cast(&space_); } - const BaseType* get() const { - return reinterpret_cast(&space_); - } - - BaseType* operator->() { return get(); } - const BaseType* operator->() const { return get(); } - - BaseType& operator*() { return *get(); } - const BaseType& operator*() const { return *get(); } - - template - void Init() { - FinishInit(new (&space_) DerivedType); - } - - // Init() constructs the Type instance using the given arguments - // (which are forwarded to Type's constructor). - // - // Note that Init() with no arguments performs default-initialization, - // not zero-initialization (i.e it behaves the same as "new Type;", not - // "new Type();"), so it will leave non-class types uninitialized. - template - void Init(Ts&&... args) { - FinishInit(new (&space_) DerivedType(std::forward(args)...)); - } - - // Init() that is equivalent to copy and move construction. - // Enables usage like this: - // ManualConstructor> v; - // v.Init({1, 2, 3}); - template - void Init(const DerivedType& x) { - FinishInit(new (&space_) DerivedType(x)); - } - template - void Init(DerivedType&& x) { - FinishInit(new (&space_) DerivedType(std::move(x))); - } - - void Destroy() { get()->~BaseType(); } - - private: - template - void FinishInit(DerivedType* p) { - static_assert( - manual_ctor_impl::is_one_of::value, - "DerivedType must be one of the predeclared DerivedTypes"); - GPR_ASSERT(reinterpret_cast(static_cast(p)) == p); - } - - typename std::aligned_storage< - grpc_core::manual_ctor_impl::max_size_of::value, - grpc_core::manual_ctor_impl::max_align_of::value>::type - space_; -}; - -template -class ManualConstructor { - public: - // No constructor or destructor because one of the most useful uses of - // this class is as part of a union, and members of a union could not have - // constructors or destructors till C++11. And, anyway, the whole point of - // this class is to bypass constructor and destructor. - - Type* get() { return reinterpret_cast(&space_); } - const Type* get() const { return reinterpret_cast(&space_); } - - Type* operator->() { return get(); } - const Type* operator->() const { return get(); } - - Type& operator*() { return *get(); } - const Type& operator*() const { return *get(); } - - void Init() { new (&space_) Type; } - - // Init() constructs the Type instance using the given arguments - // (which are forwarded to Type's constructor). - // - // Note that Init() with no arguments performs default-initialization, - // not zero-initialization (i.e it behaves the same as "new Type;", not - // "new Type();"), so it will leave non-class types uninitialized. - template - void Init(Ts&&... args) { - new (&space_) Type(std::forward(args)...); - } - - // Init() that is equivalent to copy and move construction. - // Enables usage like this: - // ManualConstructor> v; - // v.Init({1, 2, 3}); - void Init(const Type& x) { new (&space_) Type(x); } - void Init(Type&& x) { new (&space_) Type(std::move(x)); } - - void Destroy() { get()->~Type(); } - - private: - typename std::aligned_storage::type space_; -}; - -} // namespace grpc_core - -#endif diff --git a/src/core/lib/support/memory.h b/src/core/lib/support/memory.h deleted file mode 100644 index 695418e3e1..0000000000 --- a/src/core/lib/support/memory.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * - * 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_SUPPORT_MEMORY_H -#define GRPC_CORE_LIB_SUPPORT_MEMORY_H - -#include - -#include -#include -#include - -namespace grpc_core { - -// Alternative to new, since we cannot use it (for fear of libstdc++) -template -inline T* New(Args&&... args) { - void* p = gpr_malloc(sizeof(T)); - return new (p) T(std::forward(args)...); -} - -// Alternative to delete, since we cannot use it (for fear of libstdc++) -template -inline void Delete(T* p) { - p->~T(); - gpr_free(p); -} - -template -class DefaultDelete { - public: - void operator()(T* p) { Delete(p); } -}; - -template > -using UniquePtr = std::unique_ptr; - -template -inline UniquePtr MakeUnique(Args&&... args) { - return UniquePtr(New(std::forward(args)...)); -} - -// an allocator that uses gpr_malloc/gpr_free -template -class Allocator { - public: - typedef T value_type; - typedef T* pointer; - typedef const T* const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef std::false_type propagate_on_container_move_assignment; - template - struct rebind { - typedef Allocator other; - }; - typedef std::true_type is_always_equal; - - pointer address(reference x) const { return &x; } - const_pointer address(const_reference x) const { return &x; } - pointer allocate(std::size_t n, - std::allocator::const_pointer hint = nullptr) { - return static_cast(gpr_malloc(n * sizeof(T))); - } - void deallocate(T* p, std::size_t n) { gpr_free(p); } - size_t max_size() const { - return std::numeric_limits::max() / sizeof(value_type); - } - void construct(pointer p, const_reference val) { new ((void*)p) T(val); } - template - void construct(U* p, Args&&... args) { - ::new ((void*)p) U(std::forward(args)...); - } - void destroy(pointer p) { p->~T(); } - template - void destroy(U* p) { - p->~U(); - } -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_MEMORY_H */ diff --git a/src/core/lib/support/mpscq.cc b/src/core/lib/support/mpscq.cc deleted file mode 100644 index 47e896d2df..0000000000 --- a/src/core/lib/support/mpscq.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* - * - * Copyright 2016 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/support/mpscq.h" - -#include - -void gpr_mpscq_init(gpr_mpscq* q) { - gpr_atm_no_barrier_store(&q->head, (gpr_atm)&q->stub); - q->tail = &q->stub; - gpr_atm_no_barrier_store(&q->stub.next, (gpr_atm)NULL); -} - -void gpr_mpscq_destroy(gpr_mpscq* q) { - GPR_ASSERT(gpr_atm_no_barrier_load(&q->head) == (gpr_atm)&q->stub); - GPR_ASSERT(q->tail == &q->stub); -} - -bool gpr_mpscq_push(gpr_mpscq* q, gpr_mpscq_node* n) { - gpr_atm_no_barrier_store(&n->next, (gpr_atm)NULL); - gpr_mpscq_node* prev = - (gpr_mpscq_node*)gpr_atm_full_xchg(&q->head, (gpr_atm)n); - gpr_atm_rel_store(&prev->next, (gpr_atm)n); - return prev == &q->stub; -} - -gpr_mpscq_node* gpr_mpscq_pop(gpr_mpscq* q) { - bool empty; - return gpr_mpscq_pop_and_check_end(q, &empty); -} - -gpr_mpscq_node* gpr_mpscq_pop_and_check_end(gpr_mpscq* q, bool* empty) { - gpr_mpscq_node* tail = q->tail; - gpr_mpscq_node* next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); - if (tail == &q->stub) { - // indicates the list is actually (ephemerally) empty - if (next == nullptr) { - *empty = true; - return nullptr; - } - q->tail = next; - tail = next; - next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); - } - if (next != nullptr) { - *empty = false; - q->tail = next; - return tail; - } - gpr_mpscq_node* head = (gpr_mpscq_node*)gpr_atm_acq_load(&q->head); - if (tail != head) { - *empty = false; - // indicates a retry is in order: we're still adding - return nullptr; - } - gpr_mpscq_push(q, &q->stub); - next = (gpr_mpscq_node*)gpr_atm_acq_load(&tail->next); - if (next != nullptr) { - q->tail = next; - return tail; - } - // indicates a retry is in order: we're still adding - *empty = false; - return nullptr; -} - -void gpr_locked_mpscq_init(gpr_locked_mpscq* q) { - gpr_mpscq_init(&q->queue); - gpr_mu_init(&q->mu); -} - -void gpr_locked_mpscq_destroy(gpr_locked_mpscq* q) { - gpr_mpscq_destroy(&q->queue); - gpr_mu_destroy(&q->mu); -} - -bool gpr_locked_mpscq_push(gpr_locked_mpscq* q, gpr_mpscq_node* n) { - return gpr_mpscq_push(&q->queue, n); -} - -gpr_mpscq_node* gpr_locked_mpscq_try_pop(gpr_locked_mpscq* q) { - if (gpr_mu_trylock(&q->mu)) { - gpr_mpscq_node* n = gpr_mpscq_pop(&q->queue); - gpr_mu_unlock(&q->mu); - return n; - } - return nullptr; -} - -gpr_mpscq_node* gpr_locked_mpscq_pop(gpr_locked_mpscq* q) { - gpr_mu_lock(&q->mu); - bool empty = false; - gpr_mpscq_node* n; - do { - n = gpr_mpscq_pop_and_check_end(&q->queue, &empty); - } while (n == nullptr && !empty); - gpr_mu_unlock(&q->mu); - return n; -} diff --git a/src/core/lib/support/mpscq.h b/src/core/lib/support/mpscq.h deleted file mode 100644 index 648ead1f5b..0000000000 --- a/src/core/lib/support/mpscq.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * - * Copyright 2016 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_SUPPORT_MPSCQ_H -#define GRPC_CORE_LIB_SUPPORT_MPSCQ_H - -#include -#include -#include -#include - -// Multiple-producer single-consumer lock free queue, based upon the -// implementation from Dmitry Vyukov here: -// http://www.1024cores.net/home/lock-free-algorithms/queues/intrusive-mpsc-node-based-queue - -// List node (include this in a data structure at the top, and add application -// fields after it - to simulate inheritance) -typedef struct gpr_mpscq_node { - gpr_atm next; -} gpr_mpscq_node; - -// Actual queue type -typedef struct gpr_mpscq { - gpr_atm head; - // make sure head & tail don't share a cacheline - char padding[GPR_CACHELINE_SIZE]; - gpr_mpscq_node* tail; - gpr_mpscq_node stub; -} gpr_mpscq; - -void gpr_mpscq_init(gpr_mpscq* q); -void gpr_mpscq_destroy(gpr_mpscq* q); -// Push a node -// Thread safe - can be called from multiple threads concurrently -// Returns true if this was possibly the first node (may return true -// sporadically, will not return false sporadically) -bool gpr_mpscq_push(gpr_mpscq* q, gpr_mpscq_node* n); -// Pop a node (returns NULL if no node is ready - which doesn't indicate that -// the queue is empty!!) -// Thread compatible - can only be called from one thread at a time -gpr_mpscq_node* gpr_mpscq_pop(gpr_mpscq* q); -// Pop a node; sets *empty to true if the queue is empty, or false if it is not -gpr_mpscq_node* gpr_mpscq_pop_and_check_end(gpr_mpscq* q, bool* empty); - -// An mpscq with a lock: it's safe to pop from multiple threads, but doing -// only one thread will succeed concurrently -typedef struct gpr_locked_mpscq { - gpr_mpscq queue; - gpr_mu mu; -} gpr_locked_mpscq; - -void gpr_locked_mpscq_init(gpr_locked_mpscq* q); -void gpr_locked_mpscq_destroy(gpr_locked_mpscq* q); -// Push a node -// Thread safe - can be called from multiple threads concurrently -// Returns true if this was possibly the first node (may return true -// sporadically, will not return false sporadically) -bool gpr_locked_mpscq_push(gpr_locked_mpscq* q, gpr_mpscq_node* n); - -// Pop a node (returns NULL if no node is ready - which doesn't indicate that -// the queue is empty!!) -// Thread safe - can be called from multiple threads concurrently -gpr_mpscq_node* gpr_locked_mpscq_try_pop(gpr_locked_mpscq* q); - -// Pop a node. Returns NULL only if the queue was empty at some point after -// calling this function -gpr_mpscq_node* gpr_locked_mpscq_pop(gpr_locked_mpscq* q); - -#endif /* GRPC_CORE_LIB_SUPPORT_MPSCQ_H */ diff --git a/src/core/lib/support/murmur_hash.cc b/src/core/lib/support/murmur_hash.cc deleted file mode 100644 index 2f0e71a53c..0000000000 --- a/src/core/lib/support/murmur_hash.cc +++ /dev/null @@ -1,78 +0,0 @@ -/* - * - * 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. - * - */ - -#include "src/core/lib/support/murmur_hash.h" - -#include - -#define ROTL32(x, r) ((x) << (r)) | ((x) >> (32 - (r))) - -#define FMIX32(h) \ - (h) ^= (h) >> 16; \ - (h) *= 0x85ebca6b; \ - (h) ^= (h) >> 13; \ - (h) *= 0xc2b2ae35; \ - (h) ^= (h) >> 16; - -uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed) { - uint32_t h1 = seed; - uint32_t k1; - - const uint32_t c1 = 0xcc9e2d51; - const uint32_t c2 = 0x1b873593; - - const uint8_t* keyptr = (const uint8_t*)key; - const size_t bsize = sizeof(k1); - const size_t nblocks = len / bsize; - - /* body */ - for (size_t i = 0; i < nblocks; i++, keyptr += bsize) { - memcpy(&k1, keyptr, bsize); - - k1 *= c1; - k1 = ROTL32(k1, 15); - k1 *= c2; - - h1 ^= k1; - h1 = ROTL32(h1, 13); - h1 = h1 * 5 + 0xe6546b64; - } - - k1 = 0; - - /* tail */ - switch (len & 3) { - case 3: - k1 ^= ((uint32_t)keyptr[2]) << 16; - /* fallthrough */ - case 2: - k1 ^= ((uint32_t)keyptr[1]) << 8; - /* fallthrough */ - case 1: - k1 ^= keyptr[0]; - k1 *= c1; - k1 = ROTL32(k1, 15); - k1 *= c2; - h1 ^= k1; - }; - - /* finalization */ - h1 ^= (uint32_t)len; - FMIX32(h1); - return h1; -} diff --git a/src/core/lib/support/murmur_hash.h b/src/core/lib/support/murmur_hash.h deleted file mode 100644 index 422770f103..0000000000 --- a/src/core/lib/support/murmur_hash.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H -#define GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H - -#include - -#include - -/* compute the hash of key (length len) */ -uint32_t gpr_murmur_hash3(const void* key, size_t len, uint32_t seed); - -#endif /* GRPC_CORE_LIB_SUPPORT_MURMUR_HASH_H */ diff --git a/src/core/lib/support/orphanable.h b/src/core/lib/support/orphanable.h deleted file mode 100644 index 2f537573fd..0000000000 --- a/src/core/lib/support/orphanable.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * - * 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_SUPPORT_ORPHANABLE_H -#define GRPC_CORE_LIB_SUPPORT_ORPHANABLE_H - -#include -#include - -#include - -#include "src/core/lib/debug/trace.h" -#include "src/core/lib/support/abstract.h" -#include "src/core/lib/support/debug_location.h" -#include "src/core/lib/support/memory.h" - -namespace grpc_core { - -// A base class for orphanable objects, which have one external owner -// but are not necessarily destroyed immediately when the external owner -// gives up ownership. Instead, the owner calls the object's Orphan() -// method, and the object then takes responsibility for its own cleanup -// and destruction. -class Orphanable { - public: - // Gives up ownership of the object. The implementation must arrange - // to eventually destroy the object without further interaction from the - // caller. - virtual void Orphan() GRPC_ABSTRACT; - - // Not copyable or movable. - Orphanable(const Orphanable&) = delete; - Orphanable& operator=(const Orphanable&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - Orphanable() {} - virtual ~Orphanable() {} -}; - -template -class OrphanableDelete { - public: - void operator()(T* p) { p->Orphan(); } -}; - -template > -using OrphanablePtr = std::unique_ptr; - -template -inline OrphanablePtr MakeOrphanable(Args&&... args) { - return OrphanablePtr(New(std::forward(args)...)); -} - -// A type of Orphanable with internal ref-counting. -class InternallyRefCounted : public Orphanable { - public: - // Not copyable nor movable. - InternallyRefCounted(const InternallyRefCounted&) = delete; - InternallyRefCounted& operator=(const InternallyRefCounted&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - InternallyRefCounted() { gpr_ref_init(&refs_, 1); } - virtual ~InternallyRefCounted() {} - - void Ref() { gpr_ref(&refs_); } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - private: - gpr_refcount refs_; -}; - -// An alternative version of the InternallyRefCounted base class that -// supports tracing. This is intended to be used in cases where the -// object will be handled both by idiomatic C++ code using smart -// pointers and legacy code that is manually calling Ref() and Unref(). -// Once all of our code is converted to idiomatic C++, we may be able to -// eliminate this class. -class InternallyRefCountedWithTracing : public Orphanable { - public: - // Not copyable nor movable. - InternallyRefCountedWithTracing(const InternallyRefCountedWithTracing&) = - delete; - InternallyRefCountedWithTracing& operator=( - const InternallyRefCountedWithTracing&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - InternallyRefCountedWithTracing() - : InternallyRefCountedWithTracing(static_cast(nullptr)) {} - - explicit InternallyRefCountedWithTracing(TraceFlag* trace_flag) - : trace_flag_(trace_flag) { - gpr_ref_init(&refs_, 1); - } - -#ifdef NDEBUG - explicit InternallyRefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) - : InternallyRefCountedWithTracing() {} -#endif - - virtual ~InternallyRefCountedWithTracing() {} - - void Ref() { gpr_ref(&refs_); } - - void Ref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs + 1, reason); - } - Ref(); - } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - void Unref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs - 1, reason); - } - Unref(); - } - - private: - TraceFlag* trace_flag_ = nullptr; - gpr_refcount refs_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_ORPHANABLE_H */ diff --git a/src/core/lib/support/ref_counted.h b/src/core/lib/support/ref_counted.h deleted file mode 100644 index 48c11f7bbf..0000000000 --- a/src/core/lib/support/ref_counted.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * 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_SUPPORT_REF_COUNTED_H -#define GRPC_CORE_LIB_SUPPORT_REF_COUNTED_H - -#include -#include - -#include "src/core/lib/debug/trace.h" -#include "src/core/lib/support/abstract.h" -#include "src/core/lib/support/debug_location.h" -#include "src/core/lib/support/memory.h" - -namespace grpc_core { - -// A base class for reference-counted objects. -// New objects should be created via New() and start with a refcount of 1. -// When the refcount reaches 0, the object will be deleted via Delete(). -class RefCounted { - public: - void Ref() { gpr_ref(&refs_); } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - // Not copyable nor movable. - RefCounted(const RefCounted&) = delete; - RefCounted& operator=(const RefCounted&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - RefCounted() { gpr_ref_init(&refs_, 1); } - - virtual ~RefCounted() {} - - private: - gpr_refcount refs_; -}; - -// An alternative version of the RefCounted base class that -// supports tracing. This is intended to be used in cases where the -// object will be handled both by idiomatic C++ code using smart -// pointers and legacy code that is manually calling Ref() and Unref(). -// Once all of our code is converted to idiomatic C++, we may be able to -// eliminate this class. -class RefCountedWithTracing { - public: - void Ref() { gpr_ref(&refs_); } - - void Ref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs + 1, reason); - } - Ref(); - } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - void Unref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs - 1, reason); - } - Unref(); - } - - // Not copyable nor movable. - RefCountedWithTracing(const RefCountedWithTracing&) = delete; - RefCountedWithTracing& operator=(const RefCountedWithTracing&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - RefCountedWithTracing() - : RefCountedWithTracing(static_cast(nullptr)) {} - - explicit RefCountedWithTracing(TraceFlag* trace_flag) - : trace_flag_(trace_flag) { - gpr_ref_init(&refs_, 1); - } - -#ifdef NDEBUG - explicit RefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) - : RefCountedWithTracing() {} -#endif - - virtual ~RefCountedWithTracing() {} - - private: - TraceFlag* trace_flag_ = nullptr; - gpr_refcount refs_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_REF_COUNTED_H */ diff --git a/src/core/lib/support/ref_counted_ptr.h b/src/core/lib/support/ref_counted_ptr.h deleted file mode 100644 index 76ff0bba66..0000000000 --- a/src/core/lib/support/ref_counted_ptr.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * 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_SUPPORT_REF_COUNTED_PTR_H -#define GRPC_CORE_LIB_SUPPORT_REF_COUNTED_PTR_H - -#include - -#include "src/core/lib/support/memory.h" - -namespace grpc_core { - -// A smart pointer class for objects that provide Ref() and Unref() methods, -// such as those provided by the RefCounted base class. -template -class RefCountedPtr { - public: - RefCountedPtr() {} - - // If value is non-null, we take ownership of a ref to it. - explicit RefCountedPtr(T* value) { value_ = value; } - - // Move support. - RefCountedPtr(RefCountedPtr&& other) { - value_ = other.value_; - other.value_ = nullptr; - } - RefCountedPtr& operator=(RefCountedPtr&& other) { - if (value_ != nullptr) value_->Unref(); - value_ = other.value_; - other.value_ = nullptr; - return *this; - } - - // Copy support. - RefCountedPtr(const RefCountedPtr& other) { - if (other.value_ != nullptr) other.value_->Ref(); - value_ = other.value_; - } - RefCountedPtr& operator=(const RefCountedPtr& other) { - // Note: Order of reffing and unreffing is important here in case value_ - // and other.value_ are the same object. - if (other.value_ != nullptr) other.value_->Ref(); - if (value_ != nullptr) value_->Unref(); - value_ = other.value_; - return *this; - } - - ~RefCountedPtr() { - if (value_ != nullptr) value_->Unref(); - } - - // If value is non-null, we take ownership of a ref to it. - void reset(T* value = nullptr) { - if (value_ != nullptr) value_->Unref(); - value_ = value; - } - - T* get() const { return value_; } - - T& operator*() const { return *value_; } - T* operator->() const { return value_; } - - bool operator==(const RefCountedPtr& other) const { - return value_ == other.value_; - } - bool operator==(const T* other) const { return value_ == other; } - bool operator!=(const RefCountedPtr& other) const { - return value_ != other.value_; - } - bool operator!=(const T* other) const { return value_ != other; } - - private: - T* value_ = nullptr; -}; - -template -inline RefCountedPtr MakeRefCounted(Args&&... args) { - return RefCountedPtr(New(std::forward(args)...)); -} - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_SUPPORT_REF_COUNTED_PTR_H */ diff --git a/src/core/lib/support/spinlock.h b/src/core/lib/support/spinlock.h deleted file mode 100644 index 8b439642e9..0000000000 --- a/src/core/lib/support/spinlock.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_SPINLOCK_H -#define GRPC_CORE_LIB_SUPPORT_SPINLOCK_H - -#include - -/* Simple spinlock. No backoff strategy, gpr_spinlock_lock is almost always - a concurrency code smell. */ -typedef struct { - gpr_atm atm; -} gpr_spinlock; - -#ifdef __cplusplus -#define GPR_SPINLOCK_INITIALIZER (gpr_spinlock{0}) -#else -#define GPR_SPINLOCK_INITIALIZER ((gpr_spinlock){0}) -#endif -#define GPR_SPINLOCK_STATIC_INITIALIZER \ - { 0 } - -#define gpr_spinlock_trylock(lock) (gpr_atm_acq_cas(&(lock)->atm, 0, 1)) -#define gpr_spinlock_unlock(lock) (gpr_atm_rel_store(&(lock)->atm, 0)) -#define gpr_spinlock_lock(lock) \ - do { \ - } while (!gpr_spinlock_trylock((lock))) - -#endif /* GRPC_CORE_LIB_SUPPORT_SPINLOCK_H */ diff --git a/src/core/lib/support/string.cc b/src/core/lib/support/string.cc deleted file mode 100644 index e31ad72c68..0000000000 --- a/src/core/lib/support/string.cc +++ /dev/null @@ -1,315 +0,0 @@ -/* - * - * 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. - * - */ - -#include "src/core/lib/support/string.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -char* gpr_strdup(const char* src) { - char* dst; - size_t len; - - if (!src) { - return nullptr; - } - - len = strlen(src) + 1; - dst = (char*)gpr_malloc(len); - - memcpy(dst, src, len); - - return dst; -} - -typedef struct { - size_t capacity; - size_t length; - char* data; -} dump_out; - -static dump_out dump_out_create(void) { - dump_out r = {0, 0, nullptr}; - return r; -} - -static void dump_out_append(dump_out* out, char c) { - if (out->length == out->capacity) { - out->capacity = GPR_MAX(8, 2 * out->capacity); - out->data = (char*)gpr_realloc(out->data, out->capacity); - } - out->data[out->length++] = c; -} - -static void hexdump(dump_out* out, const char* buf, size_t len) { - static const char* hex = "0123456789abcdef"; - - const uint8_t* const beg = (const uint8_t*)buf; - const uint8_t* const end = beg + len; - const uint8_t* cur; - - for (cur = beg; cur != end; ++cur) { - if (cur != beg) dump_out_append(out, ' '); - dump_out_append(out, hex[*cur >> 4]); - dump_out_append(out, hex[*cur & 0xf]); - } -} - -static void asciidump(dump_out* out, const char* buf, size_t len) { - const uint8_t* const beg = (const uint8_t*)buf; - const uint8_t* const end = beg + len; - const uint8_t* cur; - int out_was_empty = (out->length == 0); - if (!out_was_empty) { - dump_out_append(out, ' '); - dump_out_append(out, '\''); - } - for (cur = beg; cur != end; ++cur) { - dump_out_append(out, (char)(isprint(*cur) ? *(char*)cur : '.')); - } - if (!out_was_empty) { - dump_out_append(out, '\''); - } -} - -char* gpr_dump(const char* buf, size_t len, uint32_t flags) { - dump_out out = dump_out_create(); - if (flags & GPR_DUMP_HEX) { - hexdump(&out, buf, len); - } - if (flags & GPR_DUMP_ASCII) { - asciidump(&out, buf, len); - } - dump_out_append(&out, 0); - return out.data; -} - -int gpr_parse_bytes_to_uint32(const char* buf, size_t len, uint32_t* result) { - uint32_t out = 0; - uint32_t new_val; - size_t i; - - if (len == 0) return 0; /* must have some bytes */ - - for (i = 0; i < len; i++) { - if (buf[i] < '0' || buf[i] > '9') return 0; /* bad char */ - new_val = 10 * out + (uint32_t)(buf[i] - '0'); - if (new_val < out) return 0; /* overflow */ - out = new_val; - } - - *result = out; - return 1; -} - -void gpr_reverse_bytes(char* str, int len) { - char *p1, *p2; - for (p1 = str, p2 = str + len - 1; p2 > p1; ++p1, --p2) { - char temp = *p1; - *p1 = *p2; - *p2 = temp; - } -} - -int gpr_ltoa(long value, char* string) { - long sign; - int i = 0; - - if (value == 0) { - string[0] = '0'; - string[1] = 0; - return 1; - } - - sign = value < 0 ? -1 : 1; - while (value) { - string[i++] = (char)('0' + sign * (value % 10)); - value /= 10; - } - if (sign < 0) string[i++] = '-'; - gpr_reverse_bytes(string, i); - string[i] = 0; - return i; -} - -int int64_ttoa(int64_t value, char* string) { - int64_t sign; - int i = 0; - - if (value == 0) { - string[0] = '0'; - string[1] = 0; - return 1; - } - - sign = value < 0 ? -1 : 1; - while (value) { - string[i++] = (char)('0' + sign * (value % 10)); - value /= 10; - } - if (sign < 0) string[i++] = '-'; - gpr_reverse_bytes(string, i); - string[i] = 0; - return i; -} - -int gpr_parse_nonnegative_int(const char* value) { - char* end; - long result = strtol(value, &end, 0); - if (*end != '\0' || result < 0 || result > INT_MAX) return -1; - return (int)result; -} - -char* gpr_leftpad(const char* str, char flag, size_t length) { - const size_t str_length = strlen(str); - const size_t out_length = str_length > length ? str_length : length; - char* out = (char*)gpr_malloc(out_length + 1); - memset(out, flag, out_length - str_length); - memcpy(out + out_length - str_length, str, str_length); - out[out_length] = 0; - return out; -} - -char* gpr_strjoin(const char** strs, size_t nstrs, size_t* final_length) { - return gpr_strjoin_sep(strs, nstrs, "", final_length); -} - -char* gpr_strjoin_sep(const char** strs, size_t nstrs, const char* sep, - size_t* final_length) { - const size_t sep_len = strlen(sep); - size_t out_length = 0; - size_t i; - char* out; - for (i = 0; i < nstrs; i++) { - out_length += strlen(strs[i]); - } - out_length += 1; /* null terminator */ - if (nstrs > 0) { - out_length += sep_len * (nstrs - 1); /* separators */ - } - out = (char*)gpr_malloc(out_length); - out_length = 0; - for (i = 0; i < nstrs; i++) { - const size_t slen = strlen(strs[i]); - if (i != 0) { - memcpy(out + out_length, sep, sep_len); - out_length += sep_len; - } - memcpy(out + out_length, strs[i], slen); - out_length += slen; - } - out[out_length] = 0; - if (final_length != nullptr) { - *final_length = out_length; - } - return out; -} - -void gpr_strvec_init(gpr_strvec* sv) { memset(sv, 0, sizeof(*sv)); } - -void gpr_strvec_destroy(gpr_strvec* sv) { - size_t i; - for (i = 0; i < sv->count; i++) { - gpr_free(sv->strs[i]); - } - gpr_free(sv->strs); -} - -void gpr_strvec_add(gpr_strvec* sv, char* str) { - if (sv->count == sv->capacity) { - sv->capacity = GPR_MAX(sv->capacity + 8, sv->capacity * 2); - sv->strs = (char**)gpr_realloc(sv->strs, sizeof(char*) * sv->capacity); - } - sv->strs[sv->count++] = str; -} - -char* gpr_strvec_flatten(gpr_strvec* sv, size_t* final_length) { - return gpr_strjoin((const char**)sv->strs, sv->count, final_length); -} - -int gpr_stricmp(const char* a, const char* b) { - int ca, cb; - do { - ca = tolower(*a); - cb = tolower(*b); - ++a; - ++b; - } while (ca == cb && ca && cb); - return ca - cb; -} - -static void add_string_to_split(const char* beg, const char* end, char*** strs, - size_t* nstrs, size_t* capstrs) { - char* out = (char*)gpr_malloc((size_t)(end - beg) + 1); - memcpy(out, beg, (size_t)(end - beg)); - out[end - beg] = 0; - if (*nstrs == *capstrs) { - *capstrs = GPR_MAX(8, 2 * *capstrs); - *strs = (char**)gpr_realloc(*strs, sizeof(*strs) * *capstrs); - } - (*strs)[*nstrs] = out; - ++*nstrs; -} - -void gpr_string_split(const char* input, const char* sep, char*** strs, - size_t* nstrs) { - const char* next; - *strs = nullptr; - *nstrs = 0; - size_t capstrs = 0; - while ((next = strstr(input, sep))) { - add_string_to_split(input, next, strs, nstrs, &capstrs); - input = next + strlen(sep); - } - add_string_to_split(input, input + strlen(input), strs, nstrs, &capstrs); -} - -void* gpr_memrchr(const void* s, int c, size_t n) { - if (s == nullptr) return nullptr; - char* b = (char*)s; - size_t i; - for (i = 0; i < n; i++) { - if (b[n - i - 1] == c) { - return &b[n - i - 1]; - } - } - return nullptr; -} - -bool gpr_is_true(const char* s) { - size_t i; - if (s == nullptr) { - return false; - } - static const char* truthy[] = {"yes", "true", "1"}; - for (i = 0; i < GPR_ARRAY_SIZE(truthy); i++) { - if (0 == gpr_stricmp(s, truthy[i])) { - return true; - } - } - return false; -} diff --git a/src/core/lib/support/string.h b/src/core/lib/support/string.h deleted file mode 100644 index dd37f0b0e1..0000000000 --- a/src/core/lib/support/string.h +++ /dev/null @@ -1,109 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_STRING_H -#define GRPC_CORE_LIB_SUPPORT_STRING_H - -#include -#include - -#include - -/* String utility functions */ - -/* Flags for gpr_dump function. */ -#define GPR_DUMP_HEX 0x00000001 -#define GPR_DUMP_ASCII 0x00000002 - -/* Converts array buf, of length len, into a C string according to the flags. - Result should be freed with gpr_free() */ -char* gpr_dump(const char* buf, size_t len, uint32_t flags); - -/* Parses an array of bytes into an integer (base 10). Returns 1 on success, - 0 on failure. */ -int gpr_parse_bytes_to_uint32(const char* data, size_t length, - uint32_t* result); - -/* Minimum buffer size for calling ltoa */ -#define GPR_LTOA_MIN_BUFSIZE (3 * sizeof(long)) - -/* Convert a long to a string in base 10; returns the length of the - output string (or 0 on failure). - output must be at least GPR_LTOA_MIN_BUFSIZE bytes long. */ -int gpr_ltoa(long value, char* output); - -/* Minimum buffer size for calling int64toa */ -#define GPR_INT64TOA_MIN_BUFSIZE (3 * sizeof(int64_t)) - -/* Convert an int64 to a string in base 10; returns the length of the -output string (or 0 on failure). -output must be at least GPR_INT64TOA_MIN_BUFSIZE bytes long. -NOTE: This function ensures sufficient bit width even on Win x64, -where long is 32bit is size.*/ -int int64_ttoa(int64_t value, char* output); - -// Parses a non-negative number from a value string. Returns -1 on error. -int gpr_parse_nonnegative_int(const char* value); - -/* Reverse a run of bytes */ -void gpr_reverse_bytes(char* str, int len); - -/* Pad a string with flag characters. The given length specifies the minimum - field width. The input string is never truncated. */ -char* gpr_leftpad(const char* str, char flag, size_t length); - -/* Join a set of strings, returning the resulting string. - Total combined length (excluding null terminator) is returned in total_length - if it is non-null. */ -char* gpr_strjoin(const char** strs, size_t nstrs, size_t* total_length); - -/* Join a set of strings using a separator, returning the resulting string. - Total combined length (excluding null terminator) is returned in total_length - if it is non-null. */ -char* gpr_strjoin_sep(const char** strs, size_t nstrs, const char* sep, - size_t* total_length); - -void gpr_string_split(const char* input, const char* sep, char*** strs, - size_t* nstrs); - -/* A vector of strings... for building up a final string one piece at a time */ -typedef struct { - char** strs; - size_t count; - size_t capacity; -} gpr_strvec; - -/* Initialize/destroy */ -void gpr_strvec_init(gpr_strvec* strs); -void gpr_strvec_destroy(gpr_strvec* strs); -/* Add a string to a strvec, takes ownership of the string */ -void gpr_strvec_add(gpr_strvec* strs, char* add); -/* Return a joined string with all added substrings, optionally setting - total_length as per gpr_strjoin */ -char* gpr_strvec_flatten(gpr_strvec* strs, size_t* total_length); - -/** Case insensitive string comparison... return <0 if lower(a)0 if lower(a)>lower(b) */ -int gpr_stricmp(const char* a, const char* b); - -void* gpr_memrchr(const void* s, int c, size_t n); - -/** Return true if lower(s) equals "true", "yes" or "1", otherwise false. */ -bool gpr_is_true(const char* s); - -#endif /* GRPC_CORE_LIB_SUPPORT_STRING_H */ diff --git a/src/core/lib/support/string_posix.cc b/src/core/lib/support/string_posix.cc deleted file mode 100644 index 8b818e39b9..0000000000 --- a/src/core/lib/support/string_posix.cc +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_STRING - -#include -#include -#include - -#include -#include - -int gpr_asprintf(char** strp, const char* format, ...) { - va_list args; - int ret; - char buf[64]; - size_t strp_buflen; - - /* Use a constant-sized buffer to determine the length. */ - va_start(args, format); - ret = vsnprintf(buf, sizeof(buf), format, args); - va_end(args); - if (ret < 0) { - *strp = nullptr; - return -1; - } - - /* Allocate a new buffer, with space for the NUL terminator. */ - strp_buflen = (size_t)ret + 1; - if ((*strp = (char*)gpr_malloc(strp_buflen)) == nullptr) { - /* This shouldn't happen, because gpr_malloc() calls abort(). */ - return -1; - } - - /* Return early if we have all the bytes. */ - if (strp_buflen <= sizeof(buf)) { - memcpy(*strp, buf, strp_buflen); - return ret; - } - - /* Try again using the larger buffer. */ - va_start(args, format); - ret = vsnprintf(*strp, strp_buflen, format, args); - va_end(args); - if ((size_t)ret == strp_buflen - 1) { - return ret; - } - - /* This should never happen. */ - gpr_free(*strp); - *strp = nullptr; - return -1; -} - -#endif /* GPR_POSIX_STRING */ diff --git a/src/core/lib/support/string_util_windows.cc b/src/core/lib/support/string_util_windows.cc deleted file mode 100644 index e2b386be55..0000000000 --- a/src/core/lib/support/string_util_windows.cc +++ /dev/null @@ -1,82 +0,0 @@ -/* - * - * Copyright 2016 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. - * - */ - -/* Posix code for gpr snprintf support. */ - -#include - -#ifdef GPR_WINDOWS - -/* Some platforms (namely msys) need wchar to be included BEFORE - anything else, especially strsafe.h. */ -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/string_windows.h" - -#if defined UNICODE || defined _UNICODE -LPTSTR -gpr_char_to_tchar(LPCSTR input) { - LPTSTR ret; - int needed = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); - if (needed <= 0) return NULL; - ret = (LPTSTR)gpr_malloc((unsigned)needed * sizeof(TCHAR)); - MultiByteToWideChar(CP_UTF8, 0, input, -1, ret, needed); - return ret; -} - -LPSTR -gpr_tchar_to_char(LPCTSTR input) { - LPSTR ret; - int needed = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); - if (needed <= 0) return NULL; - ret = (LPSTR)gpr_malloc((unsigned)needed); - WideCharToMultiByte(CP_UTF8, 0, input, -1, ret, needed, NULL, NULL); - return ret; -} -#else -LPSTR gpr_tchar_to_char(LPCTSTR input) { return (LPSTR)gpr_strdup(input); } - -LPTSTR gpr_char_to_tchar(LPCTSTR input) { return (LPTSTR)gpr_strdup(input); } -#endif - -char* gpr_format_message(int messageid) { - LPTSTR tmessage; - char* message; - DWORD status = FormatMessage( - FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, (DWORD)messageid, MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), - (LPTSTR)(&tmessage), 0, NULL); - if (status == 0) return gpr_strdup("Unable to retrieve error string"); - message = gpr_tchar_to_char(tmessage); - LocalFree(tmessage); - return message; -} - -#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/support/string_windows.cc b/src/core/lib/support/string_windows.cc deleted file mode 100644 index ceb78f0054..0000000000 --- a/src/core/lib/support/string_windows.cc +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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. - * - */ - -/* Windows code for gpr snprintf support. */ - -#include - -#ifdef GPR_WINDOWS_STRING - -#include -#include -#include - -#include -#include - -#include "src/core/lib/support/string.h" - -int gpr_asprintf(char** strp, const char* format, ...) { - va_list args; - int ret; - size_t strp_buflen; - - /* Determine the length. */ - va_start(args, format); - ret = _vscprintf(format, args); - va_end(args); - if (ret < 0) { - *strp = NULL; - return -1; - } - - /* Allocate a new buffer, with space for the NUL terminator. */ - strp_buflen = (size_t)ret + 1; - if ((*strp = (char*)gpr_malloc(strp_buflen)) == NULL) { - /* This shouldn't happen, because gpr_malloc() calls abort(). */ - return -1; - } - - /* Print to the buffer. */ - va_start(args, format); - ret = vsnprintf_s(*strp, strp_buflen, _TRUNCATE, format, args); - va_end(args); - if ((size_t)ret == strp_buflen - 1) { - return ret; - } - - /* This should never happen. */ - gpr_free(*strp); - *strp = NULL; - return -1; -} - -#endif /* GPR_WINDOWS_STRING */ diff --git a/src/core/lib/support/string_windows.h b/src/core/lib/support/string_windows.h deleted file mode 100644 index 7c7f31e7aa..0000000000 --- a/src/core/lib/support/string_windows.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_STRING_WINDOWS_H -#define GRPC_CORE_LIB_SUPPORT_STRING_WINDOWS_H - -#include - -#ifdef GPR_WINDOWS - -/* These allocate new strings using gpr_malloc to convert from and to utf-8. */ -LPTSTR gpr_char_to_tchar(LPCSTR input); -LPSTR gpr_tchar_to_char(LPCTSTR input); - -#endif /* GPR_WINDOWS */ - -#endif /* GRPC_CORE_LIB_SUPPORT_STRING_WINDOWS_H */ diff --git a/src/core/lib/support/subprocess_posix.cc b/src/core/lib/support/subprocess_posix.cc deleted file mode 100644 index dc046b6499..0000000000 --- a/src/core/lib/support/subprocess_posix.cc +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_SUBPROCESS - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -struct gpr_subprocess { - int pid; - bool joined; -}; - -const char* gpr_subprocess_binary_extension() { return ""; } - -gpr_subprocess* gpr_subprocess_create(int argc, const char** argv) { - gpr_subprocess* r; - int pid; - char** exec_args; - - pid = fork(); - if (pid == -1) { - return nullptr; - } else if (pid == 0) { - exec_args = (char**)gpr_malloc(((size_t)argc + 1) * sizeof(char*)); - memcpy(exec_args, argv, (size_t)argc * sizeof(char*)); - exec_args[argc] = nullptr; - execv(exec_args[0], exec_args); - /* if we reach here, an error has occurred */ - gpr_log(GPR_ERROR, "execv '%s' failed: %s", exec_args[0], strerror(errno)); - _exit(1); - return nullptr; - } else { - r = (gpr_subprocess*)gpr_zalloc(sizeof(gpr_subprocess)); - r->pid = pid; - return r; - } -} - -void gpr_subprocess_destroy(gpr_subprocess* p) { - if (!p->joined) { - kill(p->pid, SIGKILL); - gpr_subprocess_join(p); - } - gpr_free(p); -} - -int gpr_subprocess_join(gpr_subprocess* p) { - int status; -retry: - if (waitpid(p->pid, &status, 0) == -1) { - if (errno == EINTR) { - goto retry; - } - gpr_log(GPR_ERROR, "waitpid failed for pid %d: %s", p->pid, - strerror(errno)); - return -1; - } - p->joined = true; - return status; -} - -void gpr_subprocess_interrupt(gpr_subprocess* p) { - if (!p->joined) { - kill(p->pid, SIGINT); - } -} - -#endif /* GPR_POSIX_SUBPROCESS */ diff --git a/src/core/lib/support/subprocess_windows.cc b/src/core/lib/support/subprocess_windows.cc deleted file mode 100644 index dcdafb5a63..0000000000 --- a/src/core/lib/support/subprocess_windows.cc +++ /dev/null @@ -1,126 +0,0 @@ -/* - * - * Copyright 2016 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 - -#ifdef GPR_WINDOWS_SUBPROCESS - -#include -#include -#include - -#include -#include -#include -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/string_windows.h" - -struct gpr_subprocess { - PROCESS_INFORMATION pi; - int joined; - int interrupted; -}; - -const char* gpr_subprocess_binary_extension() { return ".exe"; } - -gpr_subprocess* gpr_subprocess_create(int argc, const char** argv) { - gpr_subprocess* r; - - STARTUPINFO si; - PROCESS_INFORMATION pi; - - char* args = gpr_strjoin_sep(argv, (size_t)argc, " ", NULL); - TCHAR* args_tchar; - - args_tchar = gpr_char_to_tchar(args); - gpr_free(args); - - memset(&si, 0, sizeof(si)); - si.cb = sizeof(si); - memset(&pi, 0, sizeof(pi)); - - if (!CreateProcess(NULL, args_tchar, NULL, NULL, FALSE, - CREATE_NEW_PROCESS_GROUP, NULL, NULL, &si, &pi)) { - gpr_free(args_tchar); - return NULL; - } - gpr_free(args_tchar); - - r = (gpr_subprocess*)gpr_malloc(sizeof(gpr_subprocess)); - memset(r, 0, sizeof(*r)); - r->pi = pi; - return r; -} - -void gpr_subprocess_destroy(gpr_subprocess* p) { - if (p) { - if (!p->joined) { - gpr_subprocess_interrupt(p); - gpr_subprocess_join(p); - } - if (p->pi.hProcess) { - CloseHandle(p->pi.hProcess); - } - if (p->pi.hThread) { - CloseHandle(p->pi.hThread); - } - gpr_free(p); - } -} - -int gpr_subprocess_join(gpr_subprocess* p) { - DWORD dwExitCode; - if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { - if (dwExitCode == STILL_ACTIVE) { - if (WaitForSingleObject(p->pi.hProcess, INFINITE) == WAIT_OBJECT_0) { - p->joined = 1; - goto getExitCode; - } - return -1; // failed to join - } else { - goto getExitCode; - } - } else { - return -1; // failed to get exit code - } - -getExitCode: - if (p->interrupted) { - return 0; - } - if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { - return (int)dwExitCode; - } else { - return -1; // failed to get exit code - } -} - -void gpr_subprocess_interrupt(gpr_subprocess* p) { - DWORD dwExitCode; - if (GetExitCodeProcess(p->pi.hProcess, &dwExitCode)) { - if (dwExitCode == STILL_ACTIVE) { - gpr_log(GPR_INFO, "sending ctrl-break"); - GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, p->pi.dwProcessId); - p->joined = 1; - p->interrupted = 1; - } - } - return; -} - -#endif /* GPR_WINDOWS_SUBPROCESS */ diff --git a/src/core/lib/support/sync.cc b/src/core/lib/support/sync.cc deleted file mode 100644 index 347ffcd00e..0000000000 --- a/src/core/lib/support/sync.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* - * - * 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. - * - */ - -/* Generic implementation of synchronization primitives. */ - -#include -#include -#include - -#include - -/* Number of mutexes to allocate for events, to avoid lock contention. - Should be a prime. */ -enum { event_sync_partitions = 31 }; - -/* Events are partitioned by address to avoid lock contention. */ -static struct sync_array_s { - gpr_mu mu; - gpr_cv cv; -} sync_array[event_sync_partitions]; - -/* This routine is executed once on first use, via event_once */ -static gpr_once event_once = GPR_ONCE_INIT; -static void event_initialize(void) { - int i; - for (i = 0; i != event_sync_partitions; i++) { - gpr_mu_init(&sync_array[i].mu); - gpr_cv_init(&sync_array[i].cv); - } -} - -/* Hash ev into an element of sync_array[]. */ -static struct sync_array_s* hash(gpr_event* ev) { - return &sync_array[((uintptr_t)ev) % event_sync_partitions]; -} - -void gpr_event_init(gpr_event* ev) { - gpr_once_init(&event_once, &event_initialize); - ev->state = 0; -} - -void gpr_event_set(gpr_event* ev, void* value) { - struct sync_array_s* s = hash(ev); - gpr_mu_lock(&s->mu); - GPR_ASSERT(gpr_atm_acq_load(&ev->state) == 0); - gpr_atm_rel_store(&ev->state, (gpr_atm)value); - gpr_cv_broadcast(&s->cv); - gpr_mu_unlock(&s->mu); - GPR_ASSERT(value != nullptr); -} - -void* gpr_event_get(gpr_event* ev) { - return (void*)gpr_atm_acq_load(&ev->state); -} - -void* gpr_event_wait(gpr_event* ev, gpr_timespec abs_deadline) { - void* result = (void*)gpr_atm_acq_load(&ev->state); - if (result == nullptr) { - struct sync_array_s* s = hash(ev); - gpr_mu_lock(&s->mu); - do { - result = (void*)gpr_atm_acq_load(&ev->state); - } while (result == nullptr && !gpr_cv_wait(&s->cv, &s->mu, abs_deadline)); - gpr_mu_unlock(&s->mu); - } - return result; -} - -void gpr_ref_init(gpr_refcount* r, int n) { gpr_atm_rel_store(&r->count, n); } - -void gpr_ref(gpr_refcount* r) { gpr_atm_no_barrier_fetch_add(&r->count, 1); } - -void gpr_ref_non_zero(gpr_refcount* r) { -#ifndef NDEBUG - gpr_atm prior = gpr_atm_no_barrier_fetch_add(&r->count, 1); - assert(prior > 0); -#else - gpr_ref(r); -#endif -} - -void gpr_refn(gpr_refcount* r, int n) { - gpr_atm_no_barrier_fetch_add(&r->count, n); -} - -int gpr_unref(gpr_refcount* r) { - gpr_atm prior = gpr_atm_full_fetch_add(&r->count, -1); - GPR_ASSERT(prior > 0); - return prior == 1; -} - -int gpr_ref_is_unique(gpr_refcount* r) { - return gpr_atm_acq_load(&r->count) == 1; -} - -void gpr_stats_init(gpr_stats_counter* c, intptr_t n) { - gpr_atm_rel_store(&c->value, n); -} - -void gpr_stats_inc(gpr_stats_counter* c, intptr_t inc) { - gpr_atm_no_barrier_fetch_add(&c->value, inc); -} - -intptr_t gpr_stats_read(const gpr_stats_counter* c) { - /* don't need acquire-load, but we have no no-barrier load yet */ - return gpr_atm_acq_load(&c->value); -} diff --git a/src/core/lib/support/sync_posix.cc b/src/core/lib/support/sync_posix.cc deleted file mode 100644 index c3f6b10463..0000000000 --- a/src/core/lib/support/sync_posix.cc +++ /dev/null @@ -1,111 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_SYNC - -#include -#include -#include -#include -#include -#include "src/core/lib/profiling/timers.h" - -#ifdef GPR_LOW_LEVEL_COUNTERS -gpr_atm gpr_mu_locks = 0; -gpr_atm gpr_counter_atm_cas = 0; -gpr_atm gpr_counter_atm_add = 0; -#endif - -void gpr_mu_init(gpr_mu* mu) { - GPR_ASSERT(pthread_mutex_init(mu, nullptr) == 0); -} - -void gpr_mu_destroy(gpr_mu* mu) { GPR_ASSERT(pthread_mutex_destroy(mu) == 0); } - -void gpr_mu_lock(gpr_mu* mu) { -#ifdef GPR_LOW_LEVEL_COUNTERS - GPR_ATM_INC_COUNTER(gpr_mu_locks); -#endif - GPR_TIMER_BEGIN("gpr_mu_lock", 0); - GPR_ASSERT(pthread_mutex_lock(mu) == 0); - GPR_TIMER_END("gpr_mu_lock", 0); -} - -void gpr_mu_unlock(gpr_mu* mu) { - GPR_TIMER_BEGIN("gpr_mu_unlock", 0); - GPR_ASSERT(pthread_mutex_unlock(mu) == 0); - GPR_TIMER_END("gpr_mu_unlock", 0); -} - -int gpr_mu_trylock(gpr_mu* mu) { - int err; - GPR_TIMER_BEGIN("gpr_mu_trylock", 0); - err = pthread_mutex_trylock(mu); - GPR_ASSERT(err == 0 || err == EBUSY); - GPR_TIMER_END("gpr_mu_trylock", 0); - return err == 0; -} - -/*----------------------------------------*/ - -void gpr_cv_init(gpr_cv* cv) { - pthread_condattr_t attr; - GPR_ASSERT(pthread_condattr_init(&attr) == 0); -#if GPR_LINUX - GPR_ASSERT(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC) == 0); -#endif // GPR_LINUX - GPR_ASSERT(pthread_cond_init(cv, &attr) == 0); -} - -void gpr_cv_destroy(gpr_cv* cv) { GPR_ASSERT(pthread_cond_destroy(cv) == 0); } - -int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) { - int err = 0; - if (gpr_time_cmp(abs_deadline, gpr_inf_future(abs_deadline.clock_type)) == - 0) { - err = pthread_cond_wait(cv, mu); - } else { - struct timespec abs_deadline_ts; -#if GPR_LINUX - abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_MONOTONIC); -#else - abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_REALTIME); -#endif // GPR_LINUX - abs_deadline_ts.tv_sec = (time_t)abs_deadline.tv_sec; - abs_deadline_ts.tv_nsec = abs_deadline.tv_nsec; - err = pthread_cond_timedwait(cv, mu, &abs_deadline_ts); - } - GPR_ASSERT(err == 0 || err == ETIMEDOUT || err == EAGAIN); - return err == ETIMEDOUT; -} - -void gpr_cv_signal(gpr_cv* cv) { GPR_ASSERT(pthread_cond_signal(cv) == 0); } - -void gpr_cv_broadcast(gpr_cv* cv) { - GPR_ASSERT(pthread_cond_broadcast(cv) == 0); -} - -/*----------------------------------------*/ - -void gpr_once_init(gpr_once* once, void (*init_function)(void)) { - GPR_ASSERT(pthread_once(once, init_function) == 0); -} - -#endif /* GRP_POSIX_SYNC */ diff --git a/src/core/lib/support/sync_windows.cc b/src/core/lib/support/sync_windows.cc deleted file mode 100644 index 7cd41633d5..0000000000 --- a/src/core/lib/support/sync_windows.cc +++ /dev/null @@ -1,118 +0,0 @@ -/* - * - * 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. - * - */ - -/* Win32 code for gpr synchronization support. */ - -#include - -#ifdef GPR_WINDOWS - -#include -#include -#include - -void gpr_mu_init(gpr_mu* mu) { - InitializeCriticalSection(&mu->cs); - mu->locked = 0; -} - -void gpr_mu_destroy(gpr_mu* mu) { DeleteCriticalSection(&mu->cs); } - -void gpr_mu_lock(gpr_mu* mu) { - EnterCriticalSection(&mu->cs); - GPR_ASSERT(!mu->locked); - mu->locked = 1; -} - -void gpr_mu_unlock(gpr_mu* mu) { - mu->locked = 0; - LeaveCriticalSection(&mu->cs); -} - -int gpr_mu_trylock(gpr_mu* mu) { - int result = TryEnterCriticalSection(&mu->cs); - if (result) { - if (mu->locked) { /* This thread already holds the lock. */ - LeaveCriticalSection(&mu->cs); /* Decrement lock count. */ - result = 0; /* Indicate failure */ - } - mu->locked = 1; - } - return result; -} - -/*----------------------------------------*/ - -void gpr_cv_init(gpr_cv* cv) { InitializeConditionVariable(cv); } - -void gpr_cv_destroy(gpr_cv* cv) { - /* Condition variables don't need destruction in Win32. */ -} - -int gpr_cv_wait(gpr_cv* cv, gpr_mu* mu, gpr_timespec abs_deadline) { - int timeout = 0; - DWORD timeout_max_ms; - mu->locked = 0; - if (gpr_time_cmp(abs_deadline, gpr_inf_future(abs_deadline.clock_type)) == - 0) { - SleepConditionVariableCS(cv, &mu->cs, INFINITE); - } else { - abs_deadline = gpr_convert_clock_type(abs_deadline, GPR_CLOCK_REALTIME); - gpr_timespec now = gpr_now(abs_deadline.clock_type); - int64_t now_ms = (int64_t)now.tv_sec * 1000 + now.tv_nsec / 1000000; - int64_t deadline_ms = - (int64_t)abs_deadline.tv_sec * 1000 + abs_deadline.tv_nsec / 1000000; - if (now_ms >= deadline_ms) { - timeout = 1; - } else { - if ((deadline_ms - now_ms) >= INFINITE) { - timeout_max_ms = INFINITE - 1; - } else { - timeout_max_ms = (DWORD)(deadline_ms - now_ms); - } - timeout = (SleepConditionVariableCS(cv, &mu->cs, timeout_max_ms) == 0 && - GetLastError() == ERROR_TIMEOUT); - } - } - mu->locked = 1; - return timeout; -} - -void gpr_cv_signal(gpr_cv* cv) { WakeConditionVariable(cv); } - -void gpr_cv_broadcast(gpr_cv* cv) { WakeAllConditionVariable(cv); } - -/*----------------------------------------*/ - -static void* dummy; -struct run_once_func_arg { - void (*init_function)(void); -}; -static BOOL CALLBACK run_once_func(gpr_once* once, void* v, void** pv) { - struct run_once_func_arg* arg = (struct run_once_func_arg*)v; - (*arg->init_function)(); - return 1; -} - -void gpr_once_init(gpr_once* once, void (*init_function)(void)) { - struct run_once_func_arg arg; - arg.init_function = init_function; - InitOnceExecuteOnce(once, run_once_func, &arg, &dummy); -} - -#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/support/thd.cc b/src/core/lib/support/thd.cc deleted file mode 100644 index ca62615d65..0000000000 --- a/src/core/lib/support/thd.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * 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. - * - */ - -/* Posix implementation for gpr threads. */ - -#include - -#include - -enum { GPR_THD_JOINABLE = 1 }; - -gpr_thd_options gpr_thd_options_default(void) { - gpr_thd_options options; - memset(&options, 0, sizeof(options)); - return options; -} - -void gpr_thd_options_set_detached(gpr_thd_options* options) { - options->flags &= ~GPR_THD_JOINABLE; -} - -void gpr_thd_options_set_joinable(gpr_thd_options* options) { - options->flags |= GPR_THD_JOINABLE; -} - -int gpr_thd_options_is_detached(const gpr_thd_options* options) { - if (!options) return 1; - return (options->flags & GPR_THD_JOINABLE) == 0; -} - -int gpr_thd_options_is_joinable(const gpr_thd_options* options) { - if (!options) return 0; - return (options->flags & GPR_THD_JOINABLE) == GPR_THD_JOINABLE; -} diff --git a/src/core/lib/support/thd_internal.h b/src/core/lib/support/thd_internal.h deleted file mode 100644 index 38bffc847d..0000000000 --- a/src/core/lib/support/thd_internal.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_THD_INTERNAL_H -#define GRPC_CORE_LIB_SUPPORT_THD_INTERNAL_H - -#include - -/* Internal interfaces between modules within the gpr support library. */ -void gpr_thd_init(); - -/* Wait for all outstanding threads to finish, up to deadline */ -int gpr_await_threads(gpr_timespec deadline); - -#endif /* GRPC_CORE_LIB_SUPPORT_THD_INTERNAL_H */ diff --git a/src/core/lib/support/thd_posix.cc b/src/core/lib/support/thd_posix.cc deleted file mode 100644 index f0ed48dbfc..0000000000 --- a/src/core/lib/support/thd_posix.cc +++ /dev/null @@ -1,152 +0,0 @@ -/* - * - * 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. - * - */ - -/* Posix implementation for gpr threads. */ - -#include - -#ifdef GPR_POSIX_SYNC - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/core/lib/support/fork.h" - -static gpr_mu g_mu; -static gpr_cv g_cv; -static int g_thread_count; -static int g_awaiting_threads; - -struct thd_arg { - void (*body)(void* arg); /* body of a thread */ - void* arg; /* argument to a thread */ - const char* name; /* name of thread. Can be nullptr. */ -}; - -static void inc_thd_count(); -static void dec_thd_count(); - -/* Body of every thread started via gpr_thd_new. */ -static void* thread_body(void* v) { - struct thd_arg a = *(struct thd_arg*)v; - free(v); - if (a.name != nullptr) { -#if GPR_APPLE_PTHREAD_NAME - /* Apple supports 64 characters, and will truncate if it's longer. */ - pthread_setname_np(a.name); -#elif GPR_LINUX_PTHREAD_NAME - /* Linux supports 16 characters max, and will error if it's longer. */ - char buf[16]; - size_t buf_len = GPR_ARRAY_SIZE(buf) - 1; - strncpy(buf, a.name, buf_len); - buf[buf_len] = '\0'; - pthread_setname_np(pthread_self(), buf); -#endif // GPR_APPLE_PTHREAD_NAME - } - (*a.body)(a.arg); - dec_thd_count(); - return nullptr; -} - -int gpr_thd_new(gpr_thd_id* t, const char* thd_name, - void (*thd_body)(void* arg), void* arg, - const gpr_thd_options* options) { - int thread_started; - pthread_attr_t attr; - pthread_t p; - /* don't use gpr_malloc as we may cause an infinite recursion with - * the profiling code */ - struct thd_arg* a = (struct thd_arg*)malloc(sizeof(*a)); - GPR_ASSERT(a != nullptr); - a->body = thd_body; - a->arg = arg; - a->name = thd_name; - inc_thd_count(); - - GPR_ASSERT(pthread_attr_init(&attr) == 0); - if (gpr_thd_options_is_detached(options)) { - GPR_ASSERT(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) == - 0); - } else { - GPR_ASSERT(pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE) == - 0); - } - thread_started = (pthread_create(&p, &attr, &thread_body, a) == 0); - GPR_ASSERT(pthread_attr_destroy(&attr) == 0); - if (!thread_started) { - /* don't use gpr_free, as this was allocated using malloc (see above) */ - free(a); - dec_thd_count(); - } - *t = (gpr_thd_id)p; - return thread_started; -} - -gpr_thd_id gpr_thd_currentid(void) { return (gpr_thd_id)pthread_self(); } - -void gpr_thd_join(gpr_thd_id t) { pthread_join((pthread_t)t, nullptr); } - -/***************************************** - * Only used when fork support is enabled - */ - -static void inc_thd_count() { - if (grpc_fork_support_enabled()) { - gpr_mu_lock(&g_mu); - g_thread_count++; - gpr_mu_unlock(&g_mu); - } -} - -static void dec_thd_count() { - if (grpc_fork_support_enabled()) { - gpr_mu_lock(&g_mu); - g_thread_count--; - if (g_awaiting_threads && g_thread_count == 0) { - gpr_cv_signal(&g_cv); - } - gpr_mu_unlock(&g_mu); - } -} - -void gpr_thd_init() { - gpr_mu_init(&g_mu); - gpr_cv_init(&g_cv); - g_thread_count = 0; - g_awaiting_threads = 0; -} - -int gpr_await_threads(gpr_timespec deadline) { - gpr_mu_lock(&g_mu); - g_awaiting_threads = 1; - int res = 0; - if (g_thread_count > 0) { - res = gpr_cv_wait(&g_cv, &g_mu, deadline); - } - g_awaiting_threads = 0; - gpr_mu_unlock(&g_mu); - return res == 0; -} - -#endif /* GPR_POSIX_SYNC */ diff --git a/src/core/lib/support/thd_windows.cc b/src/core/lib/support/thd_windows.cc deleted file mode 100644 index f920770f32..0000000000 --- a/src/core/lib/support/thd_windows.cc +++ /dev/null @@ -1,105 +0,0 @@ -/* - * - * 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. - * - */ - -/* Windows implementation for gpr threads. */ - -#include - -#ifdef GPR_WINDOWS - -#include -#include -#include -#include - -#if defined(_MSC_VER) -#define thread_local __declspec(thread) -#elif defined(__GNUC__) -#define thread_local __thread -#else -#error "Unknown compiler - please file a bug report" -#endif - -struct thd_info { - void (*body)(void* arg); /* body of a thread */ - void* arg; /* argument to a thread */ - HANDLE join_event; /* if joinable, the join event */ - int joinable; /* true if not detached */ -}; - -static thread_local struct thd_info* g_thd_info; - -/* Destroys a thread info */ -static void destroy_thread(struct thd_info* t) { - if (t->joinable) CloseHandle(t->join_event); - gpr_free(t); -} - -void gpr_thd_init(void) {} - -/* Body of every thread started via gpr_thd_new. */ -static DWORD WINAPI thread_body(void* v) { - g_thd_info = (struct thd_info*)v; - g_thd_info->body(g_thd_info->arg); - if (g_thd_info->joinable) { - BOOL ret = SetEvent(g_thd_info->join_event); - GPR_ASSERT(ret); - } else { - destroy_thread(g_thd_info); - } - return 0; -} - -int gpr_thd_new(gpr_thd_id* t, const char* thd_name, - void (*thd_body)(void* arg), void* arg, - const gpr_thd_options* options) { - HANDLE handle; - struct thd_info* info = (struct thd_info*)gpr_malloc(sizeof(*info)); - info->body = thd_body; - info->arg = arg; - *t = 0; - if (gpr_thd_options_is_joinable(options)) { - info->joinable = 1; - info->join_event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (info->join_event == NULL) { - gpr_free(info); - return 0; - } - } else { - info->joinable = 0; - } - handle = CreateThread(NULL, 64 * 1024, thread_body, info, 0, NULL); - if (handle == NULL) { - destroy_thread(info); - } else { - *t = (gpr_thd_id)info; - CloseHandle(handle); - } - return handle != NULL; -} - -gpr_thd_id gpr_thd_currentid(void) { return (gpr_thd_id)g_thd_info; } - -void gpr_thd_join(gpr_thd_id t) { - struct thd_info* info = (struct thd_info*)t; - DWORD ret = WaitForSingleObject(info->join_event, INFINITE); - GPR_ASSERT(ret == WAIT_OBJECT_0); - destroy_thread(info); -} - -#endif /* GPR_WINDOWS */ diff --git a/src/core/lib/support/time.cc b/src/core/lib/support/time.cc deleted file mode 100644 index 6903674d75..0000000000 --- a/src/core/lib/support/time.cc +++ /dev/null @@ -1,247 +0,0 @@ -/* - * - * 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. - * - */ - -/* Generic implementation of time calls. */ - -#include -#include -#include -#include -#include - -int gpr_time_cmp(gpr_timespec a, gpr_timespec b) { - int cmp = (a.tv_sec > b.tv_sec) - (a.tv_sec < b.tv_sec); - GPR_ASSERT(a.clock_type == b.clock_type); - if (cmp == 0 && a.tv_sec != INT64_MAX && a.tv_sec != INT64_MIN) { - cmp = (a.tv_nsec > b.tv_nsec) - (a.tv_nsec < b.tv_nsec); - } - return cmp; -} - -gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b) { - return gpr_time_cmp(a, b) < 0 ? a : b; -} - -gpr_timespec gpr_time_max(gpr_timespec a, gpr_timespec b) { - return gpr_time_cmp(a, b) > 0 ? a : b; -} - -gpr_timespec gpr_time_0(gpr_clock_type type) { - gpr_timespec out; - out.tv_sec = 0; - out.tv_nsec = 0; - out.clock_type = type; - return out; -} - -gpr_timespec gpr_inf_future(gpr_clock_type type) { - gpr_timespec out; - out.tv_sec = INT64_MAX; - out.tv_nsec = 0; - out.clock_type = type; - return out; -} - -gpr_timespec gpr_inf_past(gpr_clock_type type) { - gpr_timespec out; - out.tv_sec = INT64_MIN; - out.tv_nsec = 0; - out.clock_type = type; - return out; -} - -static gpr_timespec to_seconds_from_sub_second_time(int64_t time_in_units, - int64_t units_per_sec, - gpr_clock_type type) { - gpr_timespec out; - if (time_in_units == INT64_MAX) { - out = gpr_inf_future(type); - } else if (time_in_units == INT64_MIN) { - out = gpr_inf_past(type); - } else { - if (time_in_units >= 0) { - out.tv_sec = time_in_units / units_per_sec; - } else { - out.tv_sec = (-((units_per_sec - 1) - (time_in_units + units_per_sec)) / - units_per_sec) - - 1; - } - out.tv_nsec = (int32_t)((time_in_units - out.tv_sec * units_per_sec) * - GPR_NS_PER_SEC / units_per_sec); - out.clock_type = type; - } - return out; -} - -static gpr_timespec to_seconds_from_above_second_time(int64_t time_in_units, - int64_t secs_per_unit, - gpr_clock_type type) { - gpr_timespec out; - if (time_in_units >= INT64_MAX / secs_per_unit) { - out = gpr_inf_future(type); - } else if (time_in_units <= INT64_MIN / secs_per_unit) { - out = gpr_inf_past(type); - } else { - out.tv_sec = time_in_units * secs_per_unit; - out.tv_nsec = 0; - out.clock_type = type; - } - return out; -} - -gpr_timespec gpr_time_from_nanos(int64_t ns, gpr_clock_type type) { - return to_seconds_from_sub_second_time(ns, GPR_NS_PER_SEC, type); -} - -gpr_timespec gpr_time_from_micros(int64_t us, gpr_clock_type type) { - return to_seconds_from_sub_second_time(us, GPR_US_PER_SEC, type); -} - -gpr_timespec gpr_time_from_millis(int64_t ms, gpr_clock_type type) { - return to_seconds_from_sub_second_time(ms, GPR_MS_PER_SEC, type); -} - -gpr_timespec gpr_time_from_seconds(int64_t s, gpr_clock_type type) { - return to_seconds_from_sub_second_time(s, 1, type); -} - -gpr_timespec gpr_time_from_minutes(int64_t m, gpr_clock_type type) { - return to_seconds_from_above_second_time(m, 60, type); -} - -gpr_timespec gpr_time_from_hours(int64_t h, gpr_clock_type type) { - return to_seconds_from_above_second_time(h, 3600, type); -} - -gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b) { - gpr_timespec sum; - int64_t inc = 0; - GPR_ASSERT(b.clock_type == GPR_TIMESPAN); - sum.clock_type = a.clock_type; - sum.tv_nsec = a.tv_nsec + b.tv_nsec; - if (sum.tv_nsec >= GPR_NS_PER_SEC) { - sum.tv_nsec -= GPR_NS_PER_SEC; - inc++; - } - if (a.tv_sec == INT64_MAX || a.tv_sec == INT64_MIN) { - sum = a; - } else if (b.tv_sec == INT64_MAX || - (b.tv_sec >= 0 && a.tv_sec >= INT64_MAX - b.tv_sec)) { - sum = gpr_inf_future(sum.clock_type); - } else if (b.tv_sec == INT64_MIN || - (b.tv_sec <= 0 && a.tv_sec <= INT64_MIN - b.tv_sec)) { - sum = gpr_inf_past(sum.clock_type); - } else { - sum.tv_sec = a.tv_sec + b.tv_sec; - if (inc != 0 && sum.tv_sec == INT64_MAX - 1) { - sum = gpr_inf_future(sum.clock_type); - } else { - sum.tv_sec += inc; - } - } - return sum; -} - -gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b) { - gpr_timespec diff; - int64_t dec = 0; - if (b.clock_type == GPR_TIMESPAN) { - diff.clock_type = a.clock_type; - } else { - GPR_ASSERT(a.clock_type == b.clock_type); - diff.clock_type = GPR_TIMESPAN; - } - diff.tv_nsec = a.tv_nsec - b.tv_nsec; - if (diff.tv_nsec < 0) { - diff.tv_nsec += GPR_NS_PER_SEC; - dec++; - } - if (a.tv_sec == INT64_MAX || a.tv_sec == INT64_MIN) { - diff = a; - } else if (b.tv_sec == INT64_MIN || - (b.tv_sec <= 0 && a.tv_sec >= INT64_MAX + b.tv_sec)) { - diff = gpr_inf_future(GPR_CLOCK_REALTIME); - } else if (b.tv_sec == INT64_MAX || - (b.tv_sec >= 0 && a.tv_sec <= INT64_MIN + b.tv_sec)) { - diff = gpr_inf_past(GPR_CLOCK_REALTIME); - } else { - diff.tv_sec = a.tv_sec - b.tv_sec; - if (dec != 0 && diff.tv_sec == INT64_MIN + 1) { - diff = gpr_inf_past(GPR_CLOCK_REALTIME); - } else { - diff.tv_sec -= dec; - } - } - return diff; -} - -int gpr_time_similar(gpr_timespec a, gpr_timespec b, gpr_timespec threshold) { - int cmp_ab; - - GPR_ASSERT(a.clock_type == b.clock_type); - GPR_ASSERT(threshold.clock_type == GPR_TIMESPAN); - - cmp_ab = gpr_time_cmp(a, b); - if (cmp_ab == 0) return 1; - if (cmp_ab < 0) { - return gpr_time_cmp(gpr_time_sub(b, a), threshold) <= 0; - } else { - return gpr_time_cmp(gpr_time_sub(a, b), threshold) <= 0; - } -} - -int32_t gpr_time_to_millis(gpr_timespec t) { - if (t.tv_sec >= 2147483) { - if (t.tv_sec == 2147483 && t.tv_nsec < 648 * GPR_NS_PER_MS) { - return 2147483 * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS; - } - return 2147483647; - } else if (t.tv_sec <= -2147483) { - /* TODO(ctiller): correct handling here (it's so far in the past do we - care?) */ - return -2147483647; - } else { - return (int32_t)(t.tv_sec * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS); - } -} - -double gpr_timespec_to_micros(gpr_timespec t) { - return (double)t.tv_sec * GPR_US_PER_SEC + t.tv_nsec * 1e-3; -} - -gpr_timespec gpr_convert_clock_type(gpr_timespec t, gpr_clock_type clock_type) { - if (t.clock_type == clock_type) { - return t; - } - - if (t.tv_sec == INT64_MAX || t.tv_sec == INT64_MIN) { - t.clock_type = clock_type; - return t; - } - - if (clock_type == GPR_TIMESPAN) { - return gpr_time_sub(t, gpr_now(t.clock_type)); - } - - if (t.clock_type == GPR_TIMESPAN) { - return gpr_time_add(gpr_now(clock_type), t); - } - - return gpr_time_add(gpr_now(clock_type), - gpr_time_sub(t, gpr_now(t.clock_type))); -} diff --git a/src/core/lib/support/time_posix.cc b/src/core/lib/support/time_posix.cc deleted file mode 100644 index b2087c93cf..0000000000 --- a/src/core/lib/support/time_posix.cc +++ /dev/null @@ -1,166 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include "src/core/lib/support/time_precise.h" - -#ifdef GPR_POSIX_TIME - -#include -#include -#include -#ifdef __linux__ -#include -#endif -#include -#include -#include - -static struct timespec timespec_from_gpr(gpr_timespec gts) { - struct timespec rv; - if (sizeof(time_t) < sizeof(int64_t)) { - /* fine to assert, as this is only used in gpr_sleep_until */ - GPR_ASSERT(gts.tv_sec <= INT32_MAX && gts.tv_sec >= INT32_MIN); - } - rv.tv_sec = (time_t)gts.tv_sec; - rv.tv_nsec = gts.tv_nsec; - return rv; -} - -#if _POSIX_TIMERS > 0 || defined(__OpenBSD__) -static gpr_timespec gpr_from_timespec(struct timespec ts, - gpr_clock_type clock_type) { - /* - * timespec.tv_sec can have smaller size than gpr_timespec.tv_sec, - * but we are only using this function to implement gpr_now - * so there's no need to handle "infinity" values. - */ - gpr_timespec rv; - rv.tv_sec = ts.tv_sec; - rv.tv_nsec = (int32_t)ts.tv_nsec; - rv.clock_type = clock_type; - return rv; -} - -/** maps gpr_clock_type --> clockid_t for clock_gettime */ -static const clockid_t clockid_for_gpr_clock[] = {CLOCK_MONOTONIC, - CLOCK_REALTIME}; - -void gpr_time_init(void) { gpr_precise_clock_init(); } - -static gpr_timespec now_impl(gpr_clock_type clock_type) { - struct timespec now; - GPR_ASSERT(clock_type != GPR_TIMESPAN); - if (clock_type == GPR_CLOCK_PRECISE) { - gpr_timespec ret; - gpr_precise_clock_now(&ret); - return ret; - } else { -#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE) && defined(__linux__) - /* avoid ABI problems by invoking syscalls directly */ - syscall(SYS_clock_gettime, clockid_for_gpr_clock[clock_type], &now); -#else - clock_gettime(clockid_for_gpr_clock[clock_type], &now); -#endif - return gpr_from_timespec(now, clock_type); - } -} -#else - /* For some reason Apple's OSes haven't implemented clock_gettime. */ - -#include -#include -#include - -static double g_time_scale; -static uint64_t g_time_start; - -void gpr_time_init(void) { - mach_timebase_info_data_t tb = {0, 1}; - gpr_precise_clock_init(); - mach_timebase_info(&tb); - g_time_scale = tb.numer; - g_time_scale /= tb.denom; - g_time_start = mach_absolute_time(); -} - -static gpr_timespec now_impl(gpr_clock_type clock) { - gpr_timespec now; - struct timeval now_tv; - double now_dbl; - - now.clock_type = clock; - switch (clock) { - case GPR_CLOCK_REALTIME: - gettimeofday(&now_tv, nullptr); - now.tv_sec = now_tv.tv_sec; - now.tv_nsec = now_tv.tv_usec * 1000; - break; - case GPR_CLOCK_MONOTONIC: - now_dbl = ((double)(mach_absolute_time() - g_time_start)) * g_time_scale; - now.tv_sec = (int64_t)(now_dbl * 1e-9); - now.tv_nsec = (int32_t)(now_dbl - ((double)now.tv_sec) * 1e9); - break; - case GPR_CLOCK_PRECISE: - gpr_precise_clock_now(&now); - break; - case GPR_TIMESPAN: - abort(); - } - - return now; -} -#endif - -gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type) = now_impl; - -#ifdef GPR_LOW_LEVEL_COUNTERS -gpr_atm gpr_now_call_count; -#endif - -gpr_timespec gpr_now(gpr_clock_type clock_type) { -#ifdef GPR_LOW_LEVEL_COUNTERS - __atomic_fetch_add(&gpr_now_call_count, 1, __ATOMIC_RELAXED); -#endif - return gpr_now_impl(clock_type); -} - -void gpr_sleep_until(gpr_timespec until) { - gpr_timespec now; - gpr_timespec delta; - struct timespec delta_ts; - int ns_result; - - for (;;) { - /* We could simplify by using clock_nanosleep instead, but it might be - * slightly less portable. */ - now = gpr_now(until.clock_type); - if (gpr_time_cmp(until, now) <= 0) { - return; - } - - delta = gpr_time_sub(until, now); - delta_ts = timespec_from_gpr(delta); - ns_result = nanosleep(&delta_ts, nullptr); - if (ns_result == 0) { - break; - } - } -} - -#endif /* GPR_POSIX_TIME */ diff --git a/src/core/lib/support/time_precise.cc b/src/core/lib/support/time_precise.cc deleted file mode 100644 index b7372df1b8..0000000000 --- a/src/core/lib/support/time_precise.cc +++ /dev/null @@ -1,76 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include -#include - -#include "src/core/lib/support/time_precise.h" - -#ifdef GRPC_TIMERS_RDTSC -#if defined(__i386__) -static void gpr_get_cycle_counter(int64_t int* clk) { - int64_t int ret; - __asm__ volatile("rdtsc" : "=A"(ret)); - *clk = ret; -} - -// ---------------------------------------------------------------- -#elif defined(__x86_64__) || defined(__amd64__) -static void gpr_get_cycle_counter(int64_t* clk) { - uint64_t low, high; - __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); - *clk = (int64_t)(high << 32) | (int64_t)low; -} -#endif - -static double cycles_per_second = 0; -static int64_t start_cycle; -void gpr_precise_clock_init(void) { - time_t start; - int64_t end_cycle; - gpr_log(GPR_DEBUG, "Calibrating timers"); - start = time(NULL); - while (time(NULL) == start) - ; - gpr_get_cycle_counter(&start_cycle); - while (time(NULL) <= start + 10) - ; - gpr_get_cycle_counter(&end_cycle); - cycles_per_second = (double)(end_cycle - start_cycle) / 10.0; - gpr_log(GPR_DEBUG, "... cycles_per_second = %f\n", cycles_per_second); -} - -void gpr_precise_clock_now(gpr_timespec* clk) { - int64_t counter; - double secs; - gpr_get_cycle_counter(&counter); - secs = (double)(counter - start_cycle) / cycles_per_second; - clk->clock_type = GPR_CLOCK_PRECISE; - clk->tv_sec = (int64_t)secs; - clk->tv_nsec = (int32_t)(1e9 * (secs - (double)clk->tv_sec)); -} - -#else /* GRPC_TIMERS_RDTSC */ -void gpr_precise_clock_init(void) {} - -void gpr_precise_clock_now(gpr_timespec* clk) { - *clk = gpr_now(GPR_CLOCK_REALTIME); - clk->clock_type = GPR_CLOCK_PRECISE; -} -#endif /* GRPC_TIMERS_RDTSC */ diff --git a/src/core/lib/support/time_precise.h b/src/core/lib/support/time_precise.h deleted file mode 100644 index 35cd154dbd..0000000000 --- a/src/core/lib/support/time_precise.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_TIME_PRECISE_H -#define GRPC_CORE_LIB_SUPPORT_TIME_PRECISE_H - -#include - -void gpr_precise_clock_init(void); -void gpr_precise_clock_now(gpr_timespec* clk); - -#endif /* GRPC_CORE_LIB_SUPPORT_TIME_PRECISE_H */ diff --git a/src/core/lib/support/time_windows.cc b/src/core/lib/support/time_windows.cc deleted file mode 100644 index fb17e5c079..0000000000 --- a/src/core/lib/support/time_windows.cc +++ /dev/null @@ -1,98 +0,0 @@ -/* - * - * 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. - * - */ - -/* Win32 code for gpr time support. */ - -#include - -#ifdef GPR_WINDOWS_TIME - -#include -#include -#include -#include -#include - -#include "src/core/lib/support/time_precise.h" - -static LARGE_INTEGER g_start_time; -static double g_time_scale; - -void gpr_time_init(void) { - LARGE_INTEGER frequency; - QueryPerformanceFrequency(&frequency); - QueryPerformanceCounter(&g_start_time); - g_time_scale = 1.0 / (double)frequency.QuadPart; -} - -static gpr_timespec now_impl(gpr_clock_type clock) { - gpr_timespec now_tv; - LONGLONG diff; - struct _timeb now_tb; - LARGE_INTEGER timestamp; - double now_dbl; - now_tv.clock_type = clock; - switch (clock) { - case GPR_CLOCK_REALTIME: - _ftime_s(&now_tb); - now_tv.tv_sec = (int64_t)now_tb.time; - now_tv.tv_nsec = now_tb.millitm * 1000000; - break; - case GPR_CLOCK_MONOTONIC: - case GPR_CLOCK_PRECISE: - QueryPerformanceCounter(×tamp); - diff = timestamp.QuadPart - g_start_time.QuadPart; - now_dbl = (double)diff * g_time_scale; - now_tv.tv_sec = (int64_t)now_dbl; - now_tv.tv_nsec = (int32_t)((now_dbl - (double)now_tv.tv_sec) * 1e9); - break; - case GPR_TIMESPAN: - abort(); - break; - } - return now_tv; -} - -gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type) = now_impl; - -gpr_timespec gpr_now(gpr_clock_type clock_type) { - return gpr_now_impl(clock_type); -} - -void gpr_sleep_until(gpr_timespec until) { - gpr_timespec now; - gpr_timespec delta; - int64_t sleep_millis; - - for (;;) { - /* We could simplify by using clock_nanosleep instead, but it might be - * slightly less portable. */ - now = gpr_now(until.clock_type); - if (gpr_time_cmp(until, now) <= 0) { - return; - } - - delta = gpr_time_sub(until, now); - sleep_millis = - delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS; - GPR_ASSERT((sleep_millis >= 0) && (sleep_millis <= INT_MAX)); - Sleep((DWORD)sleep_millis); - } -} - -#endif /* GPR_WINDOWS_TIME */ diff --git a/src/core/lib/support/tls_pthread.cc b/src/core/lib/support/tls_pthread.cc deleted file mode 100644 index ebeef2a8c2..0000000000 --- a/src/core/lib/support/tls_pthread.cc +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_PTHREAD_TLS - -#include - -intptr_t gpr_tls_set(struct gpr_pthread_thread_local* tls, intptr_t value) { - GPR_ASSERT(0 == pthread_setspecific(tls->key, (void*)value)); - return value; -} - -#endif /* GPR_PTHREAD_TLS */ diff --git a/src/core/lib/support/tmpfile.h b/src/core/lib/support/tmpfile.h deleted file mode 100644 index c5ceda8675..0000000000 --- a/src/core/lib/support/tmpfile.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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. - * - */ - -#ifndef GRPC_CORE_LIB_SUPPORT_TMPFILE_H -#define GRPC_CORE_LIB_SUPPORT_TMPFILE_H - -#include - -/* Creates a temporary file from a prefix. - If tmp_filename is not NULL, *tmp_filename is assigned the name of the - created file and it is the responsibility of the caller to gpr_free it - unless an error occurs in which case it will be set to NULL. */ -FILE* gpr_tmpfile(const char* prefix, char** tmp_filename); - -#endif /* GRPC_CORE_LIB_SUPPORT_TMPFILE_H */ diff --git a/src/core/lib/support/tmpfile_msys.cc b/src/core/lib/support/tmpfile_msys.cc deleted file mode 100644 index 430e866629..0000000000 --- a/src/core/lib/support/tmpfile_msys.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_MSYS_TMPFILE - -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/support/string_windows.h" -#include "src/core/lib/support/tmpfile.h" - -FILE* gpr_tmpfile(const char* prefix, char** tmp_filename_out) { - FILE* result = NULL; - char tmp_filename[MAX_PATH]; - UINT success; - - if (tmp_filename_out != NULL) *tmp_filename_out = NULL; - - /* Generate a unique filename with our template + temporary path. */ - success = GetTempFileNameA(".", prefix, 0, tmp_filename); - fprintf(stderr, "success = %d\n", success); - - if (success) { - /* Open a file there. */ - result = fopen(tmp_filename, "wb+"); - fprintf(stderr, "result = %p\n", result); - } - if (result != NULL && tmp_filename_out) { - *tmp_filename_out = gpr_strdup(tmp_filename); - } - - return result; -} - -#endif /* GPR_MSYS_TMPFILE */ diff --git a/src/core/lib/support/tmpfile_posix.cc b/src/core/lib/support/tmpfile_posix.cc deleted file mode 100644 index 79c5c68874..0000000000 --- a/src/core/lib/support/tmpfile_posix.cc +++ /dev/null @@ -1,70 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_POSIX_TMPFILE - -#include "src/core/lib/support/tmpfile.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/support/string.h" - -FILE* gpr_tmpfile(const char* prefix, char** tmp_filename) { - FILE* result = nullptr; - char* filename_template; - int fd; - - if (tmp_filename != nullptr) *tmp_filename = nullptr; - - gpr_asprintf(&filename_template, "/tmp/%s_XXXXXX", prefix); - GPR_ASSERT(filename_template != nullptr); - - fd = mkstemp(filename_template); - if (fd == -1) { - gpr_log(GPR_ERROR, "mkstemp failed for filename_template %s with error %s.", - filename_template, strerror(errno)); - goto end; - } - result = fdopen(fd, "w+"); - if (result == nullptr) { - gpr_log(GPR_ERROR, "Could not open file %s from fd %d (error = %s).", - filename_template, fd, strerror(errno)); - unlink(filename_template); - close(fd); - goto end; - } - -end: - if (result != nullptr && tmp_filename != nullptr) { - *tmp_filename = filename_template; - } else { - gpr_free(filename_template); - } - return result; -} - -#endif /* GPR_POSIX_TMPFILE */ diff --git a/src/core/lib/support/tmpfile_windows.cc b/src/core/lib/support/tmpfile_windows.cc deleted file mode 100644 index 2b10bcde43..0000000000 --- a/src/core/lib/support/tmpfile_windows.cc +++ /dev/null @@ -1,69 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#ifdef GPR_WINDOWS_TMPFILE - -#include -#include -#include -#include - -#include -#include -#include - -#include "src/core/lib/support/string_windows.h" -#include "src/core/lib/support/tmpfile.h" - -FILE* gpr_tmpfile(const char* prefix, char** tmp_filename_out) { - FILE* result = NULL; - LPTSTR template_string = NULL; - TCHAR tmp_path[MAX_PATH]; - TCHAR tmp_filename[MAX_PATH]; - DWORD status; - UINT success; - - if (tmp_filename_out != NULL) *tmp_filename_out = NULL; - - /* Convert our prefix to TCHAR. */ - template_string = gpr_char_to_tchar(prefix); - GPR_ASSERT(template_string); - - /* Get the path to the best temporary folder available. */ - status = GetTempPath(MAX_PATH, tmp_path); - if (status == 0 || status > MAX_PATH) goto end; - - /* Generate a unique filename with our template + temporary path. */ - success = GetTempFileName(tmp_path, template_string, 0, tmp_filename); - if (!success) goto end; - - /* Open a file there. */ - if (_tfopen_s(&result, tmp_filename, TEXT("wb+")) != 0) goto end; - -end: - if (result && tmp_filename_out) { - *tmp_filename_out = gpr_tchar_to_char(tmp_filename); - } - - gpr_free(template_string); - return result; -} - -#endif /* GPR_WINDOWS_TMPFILE */ diff --git a/src/core/lib/support/vector.h b/src/core/lib/support/vector.h deleted file mode 100644 index 2f249a5b9e..0000000000 --- a/src/core/lib/support/vector.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * 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_SUPPORT_VECTOR_H -#define GRPC_CORE_LIB_SUPPORT_VECTOR_H - -#include - -#include "src/core/lib/support/memory.h" - -namespace grpc_core { - -// NOTE: We eventually want to use absl::InlinedVector here. However, -// there are currently build problems that prevent us from using absl. -// In the interim, we define a custom implementation as a place-holder, -// with the intent to eventually replace this with the absl -// implementation. -// -// This place-holder implementation does not implement the full set of -// functionality from the absl version; it has just the methods that we -// currently happen to need in gRPC. If additional functionality is -// needed before this gets replaced with the absl version, it can be -// added, with the following proviso: -// -// ANY METHOD ADDED HERE MUST COMPLY WITH THE INTERFACE IN THE absl -// IMPLEMENTATION! -// -// TODO(ctiller, nnoble, roth): Replace this with absl::InlinedVector -// once we integrate absl into the gRPC build system in a usable way. -template -class InlinedVector { - public: - InlinedVector() {} - ~InlinedVector() { - for (size_t i = 0; i < size_ && i < N; ++i) { - T& value = *reinterpret_cast(inline_ + i); - value.~T(); - } - if (size_ > N) { // Avoid subtracting two signed values. - for (size_t i = 0; i < size_ - N; ++i) { - dynamic_[i].~T(); - } - } - gpr_free(dynamic_); - } - - // For now, we do not support copying. - InlinedVector(const InlinedVector&) = delete; - InlinedVector& operator=(const InlinedVector&) = delete; - - T& operator[](size_t offset) { - assert(offset < size_); - if (offset < N) { - return *reinterpret_cast(inline_ + offset); - } else { - return dynamic_[offset - N]; - } - } - - template - void emplace_back(Args&&... args) { - if (size_ < N) { - new (&inline_[size_]) T(std::forward(args)...); - } else { - if (size_ - N == dynamic_capacity_) { - size_t new_capacity = - dynamic_capacity_ == 0 ? 2 : dynamic_capacity_ * 2; - T* new_dynamic = static_cast(gpr_malloc(sizeof(T) * new_capacity)); - for (size_t i = 0; i < dynamic_capacity_; ++i) { - new (&new_dynamic[i]) T(std::move(dynamic_[i])); - dynamic_[i].~T(); - } - gpr_free(dynamic_); - dynamic_ = new_dynamic; - dynamic_capacity_ = new_capacity; - } - new (&dynamic_[size_ - N]) T(std::forward(args)...); - } - ++size_; - } - - void push_back(const T& value) { emplace_back(value); } - - void push_back(T&& value) { emplace_back(std::move(value)); } - - size_t size() const { return size_; } - - private: - typename std::aligned_storage::type inline_[N]; - T* dynamic_ = nullptr; - size_t size_ = 0; - size_t dynamic_capacity_ = 0; -}; - -} // namespace grpc_core - -#endif diff --git a/src/core/lib/support/wrap_memcpy.cc b/src/core/lib/support/wrap_memcpy.cc deleted file mode 100644 index 9b8608e056..0000000000 --- a/src/core/lib/support/wrap_memcpy.cc +++ /dev/null @@ -1,42 +0,0 @@ -/* - * - * Copyright 2016 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 - -#include - -/* Provide a wrapped memcpy for targets that need to be backwards - * compatible with older libc's. - * - * Enable by setting LDFLAGS=-Wl,-wrap,memcpy when linking. - */ - -extern "C" { -#ifdef __linux__ -#if defined(__x86_64__) && !defined(GPR_MUSL_LIBC_COMPAT) -__asm__(".symver memcpy,memcpy@GLIBC_2.2.5"); -void* __wrap_memcpy(void* destination, const void* source, size_t num) { - return memcpy(destination, source, num); -} -#else /* !__x86_64__ */ -void* __wrap_memcpy(void* destination, const void* source, size_t num) { - return memmove(destination, source, num); -} -#endif -#endif -} diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index d677576c14..8a579cabe7 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -33,12 +33,12 @@ #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/compression/algorithm_metadata.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/arena.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/arena.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/call_test_only.h" diff --git a/src/core/lib/surface/call_log_batch.cc b/src/core/lib/surface/call_log_batch.cc index 535a3d3282..d56ea2a932 100644 --- a/src/core/lib/surface/call_log_batch.cc +++ b/src/core/lib/surface/call_log_batch.cc @@ -22,8 +22,8 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" static void add_metadata(gpr_strvec* b, const grpc_metadata* md, size_t count) { size_t i; diff --git a/src/core/lib/surface/channel.cc b/src/core/lib/surface/channel.cc index cf5e8c2150..62db82a1d9 100644 --- a/src/core/lib/surface/channel.cc +++ b/src/core/lib/surface/channel.cc @@ -29,9 +29,9 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/channel_init.h" diff --git a/src/core/lib/surface/completion_queue.cc b/src/core/lib/surface/completion_queue.cc index aa5808da4c..e731e2139f 100644 --- a/src/core/lib/surface/completion_queue.cc +++ b/src/core/lib/surface/completion_queue.cc @@ -31,11 +31,11 @@ #include #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/spinlock.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/spinlock.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/event_string.h" diff --git a/src/core/lib/surface/event_string.cc b/src/core/lib/surface/event_string.cc index 5168edc9b5..7f40bb2405 100644 --- a/src/core/lib/surface/event_string.cc +++ b/src/core/lib/surface/event_string.cc @@ -22,7 +22,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" static void addhdr(gpr_strvec* buf, grpc_event* ev) { char* tmp; diff --git a/src/core/lib/surface/init.cc b/src/core/lib/surface/init.cc index 0f40965f16..70329b09f4 100644 --- a/src/core/lib/surface/init.cc +++ b/src/core/lib/surface/init.cc @@ -31,6 +31,8 @@ #include "src/core/lib/channel/handshaker_registry.h" #include "src/core/lib/debug/stats.h" #include "src/core/lib/debug/trace.h" +#include "src/core/lib/gpr/fork.h" +#include "src/core/lib/gpr/thd_internal.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/call_combiner.h" #include "src/core/lib/iomgr/combiner.h" @@ -40,8 +42,6 @@ #include "src/core/lib/iomgr/timer_manager.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/fork.h" -#include "src/core/lib/support/thd_internal.h" #include "src/core/lib/surface/alarm_internal.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" diff --git a/src/core/lib/surface/lame_client.cc b/src/core/lib/surface/lame_client.cc index 08611ff730..27a2a4eeb6 100644 --- a/src/core/lib/surface/lame_client.cc +++ b/src/core/lib/surface/lame_client.cc @@ -23,10 +23,10 @@ #include #include -#include "src/core/lib/support/atomic.h" +#include "src/core/lib/gpr++/atomic.h" #include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/channel.h" diff --git a/src/core/lib/surface/server.cc b/src/core/lib/surface/server.cc index ee98cf2693..c8c1db337f 100644 --- a/src/core/lib/surface/server.cc +++ b/src/core/lib/surface/server.cc @@ -30,12 +30,12 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/connected_channel.h" #include "src/core/lib/debug/stats.h" +#include "src/core/lib/gpr/mpscq.h" +#include "src/core/lib/gpr/spinlock.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/mpscq.h" -#include "src/core/lib/support/spinlock.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/api_trace.h" #include "src/core/lib/surface/call.h" #include "src/core/lib/surface/channel.h" diff --git a/src/core/lib/transport/metadata.cc b/src/core/lib/transport/metadata.cc index 5f0673e014..652222bd0b 100644 --- a/src/core/lib/transport/metadata.cc +++ b/src/core/lib/transport/metadata.cc @@ -31,12 +31,12 @@ #include #include +#include "src/core/lib/gpr/murmur_hash.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/profiling/timers.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/murmur_hash.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/static_metadata.h" /* There are two kinds of mdelem and mdstr instances. diff --git a/src/core/lib/transport/service_config.cc b/src/core/lib/transport/service_config.cc index cbafc33840..5c9930a273 100644 --- a/src/core/lib/transport/service_config.cc +++ b/src/core/lib/transport/service_config.cc @@ -23,11 +23,11 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/json/json.h" #include "src/core/lib/slice/slice_hash_table.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" // The main purpose of the code here is to parse the service config in // JSON form, which will look like this: diff --git a/src/core/lib/transport/timeout_encoding.cc b/src/core/lib/transport/timeout_encoding.cc index 86db6c8344..47f964af45 100644 --- a/src/core/lib/transport/timeout_encoding.cc +++ b/src/core/lib/transport/timeout_encoding.cc @@ -22,7 +22,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" static int64_t round_up(int64_t x, int64_t divisor) { return (x / divisor + (x % divisor != 0)) * divisor; diff --git a/src/core/lib/transport/timeout_encoding.h b/src/core/lib/transport/timeout_encoding.h index 8611f49b00..4e9268262e 100644 --- a/src/core/lib/transport/timeout_encoding.h +++ b/src/core/lib/transport/timeout_encoding.h @@ -22,8 +22,8 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/string.h" #define GRPC_HTTP2_TIMEOUT_ENCODE_MIN_BUFSIZE (GPR_LTOA_MIN_BUFSIZE + 1) diff --git a/src/core/lib/transport/transport.cc b/src/core/lib/transport/transport.cc index 08aee04ac9..ea0380e591 100644 --- a/src/core/lib/transport/transport.cc +++ b/src/core/lib/transport/transport.cc @@ -25,10 +25,10 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/transport_impl.h" grpc_core::DebugOnlyTraceFlag grpc_trace_stream_refcount(false, diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 80a7ff98be..b392c696cd 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -22,12 +22,12 @@ #include #include "src/core/lib/channel/context.h" +#include "src/core/lib/gpr/arena.h" #include "src/core/lib/iomgr/call_combiner.h" #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/pollset.h" #include "src/core/lib/iomgr/pollset_set.h" -#include "src/core/lib/support/arena.h" #include "src/core/lib/transport/byte_stream.h" #include "src/core/lib/transport/metadata_batch.h" diff --git a/src/core/lib/transport/transport_op_string.cc b/src/core/lib/transport/transport_op_string.cc index c0f82fea0d..58a21e9b60 100644 --- a/src/core/lib/transport/transport_op_string.cc +++ b/src/core/lib/transport/transport_op_string.cc @@ -28,8 +28,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/connectivity_state.h" /* These routines are here to facilitate debugging - they produce string diff --git a/src/cpp/client/channel_cc.cc b/src/cpp/client/channel_cc.cc index 08420817c8..362dff642c 100644 --- a/src/cpp/client/channel_cc.cc +++ b/src/cpp/client/channel_cc.cc @@ -42,9 +42,9 @@ #include #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" namespace grpc { diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c index 6875d40aa0..eb69b5829c 100644 --- a/src/csharp/ext/grpc_csharp_ext.c +++ b/src/csharp/ext/grpc_csharp_ext.c @@ -16,7 +16,7 @@ * */ -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include #include diff --git a/src/objective-c/examples/Sample/Podfile b/src/objective-c/examples/Sample/Podfile index f6f0c00d5d..9ea2f61927 100644 --- a/src/objective-c/examples/Sample/Podfile +++ b/src/objective-c/examples/Sample/Podfile @@ -40,7 +40,7 @@ pre_install do |installer| 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', diff --git a/src/objective-c/examples/SwiftSample/Podfile b/src/objective-c/examples/SwiftSample/Podfile index b08a346ae2..a2c2b82cc9 100644 --- a/src/objective-c/examples/SwiftSample/Podfile +++ b/src/objective-c/examples/SwiftSample/Podfile @@ -40,7 +40,7 @@ pre_install do |installer| 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', diff --git a/src/objective-c/tests/Connectivity/Podfile b/src/objective-c/tests/Connectivity/Podfile index 27ff935c54..cdbc6dde59 100644 --- a/src/objective-c/tests/Connectivity/Podfile +++ b/src/objective-c/tests/Connectivity/Podfile @@ -24,7 +24,7 @@ pre_install do |installer| 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', diff --git a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.mm b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.mm index d130971364..16940a4917 100644 --- a/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.mm +++ b/src/objective-c/tests/CoreCronetEnd2EndTests/CoreCronetEnd2EndTests.mm @@ -39,9 +39,9 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m b/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m index 92bc20e5b9..09ee062596 100644 --- a/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m +++ b/src/objective-c/tests/CronetUnitTests/CronetUnitTests.m @@ -31,9 +31,9 @@ #import #import "src/core/lib/channel/channel_args.h" -#import "src/core/lib/support/env.h" -#import "src/core/lib/support/string.h" -#import "src/core/lib/support/tmpfile.h" +#import "src/core/lib/gpr/env.h" +#import "src/core/lib/gpr/string.h" +#import "src/core/lib/gpr/tmpfile.h" #import "test/core/end2end/data/ssl_test_data.h" #import "test/core/util/test_config.h" diff --git a/src/objective-c/tests/Podfile b/src/objective-c/tests/Podfile index 8f1cb041d8..9e9db1fe6c 100644 --- a/src/objective-c/tests/Podfile +++ b/src/objective-c/tests/Podfile @@ -75,7 +75,7 @@ pre_install do |installer| 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index aea0786890..9debb22249 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -15,50 +15,50 @@ # AUTO-GENERATED FROM `$REPO_ROOT/templates/src/python/grpcio/grpc_core_dependencies.py.template`!!! CORE_SOURCE_FILES = [ + 'src/core/lib/gpr/alloc.cc', + 'src/core/lib/gpr/arena.cc', + 'src/core/lib/gpr/atm.cc', + 'src/core/lib/gpr/avl.cc', + 'src/core/lib/gpr/cmdline.cc', + 'src/core/lib/gpr/cpu_iphone.cc', + 'src/core/lib/gpr/cpu_linux.cc', + 'src/core/lib/gpr/cpu_posix.cc', + 'src/core/lib/gpr/cpu_windows.cc', + 'src/core/lib/gpr/env_linux.cc', + 'src/core/lib/gpr/env_posix.cc', + 'src/core/lib/gpr/env_windows.cc', + 'src/core/lib/gpr/fork.cc', + 'src/core/lib/gpr/host_port.cc', + 'src/core/lib/gpr/log.cc', + 'src/core/lib/gpr/log_android.cc', + 'src/core/lib/gpr/log_linux.cc', + 'src/core/lib/gpr/log_posix.cc', + 'src/core/lib/gpr/log_windows.cc', + 'src/core/lib/gpr/mpscq.cc', + 'src/core/lib/gpr/murmur_hash.cc', + 'src/core/lib/gpr/string.cc', + 'src/core/lib/gpr/string_posix.cc', + 'src/core/lib/gpr/string_util_windows.cc', + 'src/core/lib/gpr/string_windows.cc', + 'src/core/lib/gpr/subprocess_posix.cc', + 'src/core/lib/gpr/subprocess_windows.cc', + 'src/core/lib/gpr/sync.cc', + 'src/core/lib/gpr/sync_posix.cc', + 'src/core/lib/gpr/sync_windows.cc', + 'src/core/lib/gpr/thd.cc', + 'src/core/lib/gpr/thd_posix.cc', + 'src/core/lib/gpr/thd_windows.cc', + 'src/core/lib/gpr/time.cc', + 'src/core/lib/gpr/time_posix.cc', + 'src/core/lib/gpr/time_precise.cc', + 'src/core/lib/gpr/time_windows.cc', + 'src/core/lib/gpr/tls_pthread.cc', + 'src/core/lib/gpr/tmpfile_msys.cc', + 'src/core/lib/gpr/tmpfile_posix.cc', + 'src/core/lib/gpr/tmpfile_windows.cc', + 'src/core/lib/gpr/wrap_memcpy.cc', 'src/core/lib/profiling/basic_timers.cc', 'src/core/lib/profiling/stap_timers.cc', - 'src/core/lib/support/alloc.cc', - 'src/core/lib/support/arena.cc', - 'src/core/lib/support/atm.cc', - 'src/core/lib/support/avl.cc', - 'src/core/lib/support/cmdline.cc', - 'src/core/lib/support/cpu_iphone.cc', - 'src/core/lib/support/cpu_linux.cc', - 'src/core/lib/support/cpu_posix.cc', - 'src/core/lib/support/cpu_windows.cc', - 'src/core/lib/support/env_linux.cc', - 'src/core/lib/support/env_posix.cc', - 'src/core/lib/support/env_windows.cc', - 'src/core/lib/support/fork.cc', - 'src/core/lib/support/host_port.cc', - 'src/core/lib/support/log.cc', - 'src/core/lib/support/log_android.cc', - 'src/core/lib/support/log_linux.cc', - 'src/core/lib/support/log_posix.cc', - 'src/core/lib/support/log_windows.cc', - 'src/core/lib/support/mpscq.cc', - 'src/core/lib/support/murmur_hash.cc', - 'src/core/lib/support/string.cc', - 'src/core/lib/support/string_posix.cc', - 'src/core/lib/support/string_util_windows.cc', - 'src/core/lib/support/string_windows.cc', - 'src/core/lib/support/subprocess_posix.cc', - 'src/core/lib/support/subprocess_windows.cc', - 'src/core/lib/support/sync.cc', - 'src/core/lib/support/sync_posix.cc', - 'src/core/lib/support/sync_windows.cc', - 'src/core/lib/support/thd.cc', - 'src/core/lib/support/thd_posix.cc', - 'src/core/lib/support/thd_windows.cc', - 'src/core/lib/support/time.cc', - 'src/core/lib/support/time_posix.cc', - 'src/core/lib/support/time_precise.cc', - 'src/core/lib/support/time_windows.cc', - 'src/core/lib/support/tls_pthread.cc', - 'src/core/lib/support/tmpfile_msys.cc', - 'src/core/lib/support/tmpfile_posix.cc', - 'src/core/lib/support/tmpfile_windows.cc', - 'src/core/lib/support/wrap_memcpy.cc', 'src/core/lib/surface/init.cc', 'src/core/lib/backoff/backoff.cc', 'src/core/lib/channel/channel_args.cc', diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index da404e2fef..2be7692e04 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -135,7 +135,7 @@ 'HEADER_SEARCH_PATHS' => '"$(inherited)" "$(GRPC_SRC_ROOT)/include"', 'USER_HEADER_SEARCH_PATHS' => '"$(GRPC_SRC_ROOT)"', # If we don't set these two settings, `include/grpc/support/time.h` and - # `src/core/lib/support/string.h` shadow the system `` and ``, breaking the + # `src/core/lib/gpr/string.h` shadow the system `` and ``, breaking the # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', diff --git a/test/core/bad_client/bad_client.cc b/test/core/bad_client/bad_client.cc index 4c1642aa5d..dd8d88170e 100644 --- a/test/core/bad_client/bad_client.cc +++ b/test/core/bad_client/bad_client.cc @@ -28,10 +28,10 @@ #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/gpr/murmur_hash.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/endpoint_pair.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/murmur_hash.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/surface/completion_queue.h" #include "src/core/lib/surface/server.h" diff --git a/test/core/bad_client/tests/large_metadata.cc b/test/core/bad_client/tests/large_metadata.cc index 1ce0f28967..ff3e9eb932 100644 --- a/test/core/bad_client/tests/large_metadata.cc +++ b/test/core/bad_client/tests/large_metadata.cc @@ -22,7 +22,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/server.h" #include "test/core/end2end/cq_verifier.h" diff --git a/test/core/bad_ssl/bad_ssl_test.cc b/test/core/bad_ssl/bad_ssl_test.cc index 0e74a62f19..8a7960b5ed 100644 --- a/test/core/bad_ssl/bad_ssl_test.cc +++ b/test/core/bad_ssl/bad_ssl_test.cc @@ -26,8 +26,8 @@ #include #include #include -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/core/channel/minimal_stack_is_minimal_test.cc b/test/core/channel/minimal_stack_is_minimal_test.cc index 3495f603e4..f02c8180f2 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.cc +++ b/test/core/channel/minimal_stack_is_minimal_test.cc @@ -35,7 +35,7 @@ #include #include "src/core/lib/channel/channel_stack_builder.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/channel_init.h" #include "src/core/lib/surface/channel_stack_type.h" #include "src/core/lib/transport/transport_impl.h" diff --git a/test/core/client_channel/lb_policies_test.cc b/test/core/client_channel/lb_policies_test.cc index 847ea0066b..716c63b9d0 100644 --- a/test/core/client_channel/lb_policies_test.cc +++ b/test/core/client_channel/lb_policies_test.cc @@ -30,7 +30,7 @@ #include "src/core/ext/filters/client_channel/lb_policy_registry.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/server.h" #include "test/core/end2end/cq_verifier.h" diff --git a/test/core/compression/message_compress_test.cc b/test/core/compression/message_compress_test.cc index 6ca07b70c4..b03ca4c4cb 100644 --- a/test/core/compression/message_compress_test.cc +++ b/test/core/compression/message_compress_test.cc @@ -25,8 +25,8 @@ #include #include +#include "src/core/lib/gpr/murmur_hash.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/murmur_hash.h" #include "test/core/util/slice_splitter.h" #include "test/core/util/test_config.h" diff --git a/test/core/end2end/bad_server_response_test.cc b/test/core/end2end/bad_server_response_test.cc index 93809ac37a..a8e5e291c8 100644 --- a/test/core/end2end/bad_server_response_test.cc +++ b/test/core/end2end/bad_server_response_test.cc @@ -31,10 +31,10 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "test/core/end2end/cq_verifier.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/core/end2end/cq_verifier.cc b/test/core/end2end/cq_verifier.cc index 8686f4e7b7..7bf8ae0f6e 100644 --- a/test/core/end2end/cq_verifier.cc +++ b/test/core/end2end/cq_verifier.cc @@ -29,7 +29,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/event_string.h" #define ROOT_EXPECTATION 1000 diff --git a/test/core/end2end/dualstack_socket_test.cc b/test/core/end2end/dualstack_socket_test.cc index 04c727e689..bb30547cd2 100644 --- a/test/core/end2end/dualstack_socket_test.cc +++ b/test/core/end2end/dualstack_socket_test.cc @@ -29,12 +29,12 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/socket_utils_posix.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "test/core/end2end/cq_verifier.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/core/end2end/fixtures/h2_full+trace.cc b/test/core/end2end/fixtures/h2_full+trace.cc index a49de96009..7104fbc581 100644 --- a/test/core/end2end/fixtures/h2_full+trace.cc +++ b/test/core/end2end/fixtures/h2_full+trace.cc @@ -35,7 +35,7 @@ #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/connected_channel.h" -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/server.h" #include "test/core/util/port.h" diff --git a/test/core/end2end/fixtures/h2_http_proxy.cc b/test/core/end2end/fixtures/h2_http_proxy.cc index 099367d91b..e8e81f0930 100644 --- a/test/core/end2end/fixtures/h2_http_proxy.cc +++ b/test/core/end2end/fixtures/h2_http_proxy.cc @@ -31,7 +31,7 @@ #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/connected_channel.h" -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/server.h" #include "test/core/end2end/fixtures/http_proxy_fixture.h" diff --git a/test/core/end2end/fixtures/h2_sockpair+trace.cc b/test/core/end2end/fixtures/h2_sockpair+trace.cc index 9807e929af..236780b8d3 100644 --- a/test/core/end2end/fixtures/h2_sockpair+trace.cc +++ b/test/core/end2end/fixtures/h2_sockpair+trace.cc @@ -36,9 +36,9 @@ #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/connected_channel.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/endpoint_pair.h" #include "src/core/lib/iomgr/iomgr.h" -#include "src/core/lib/support/env.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/completion_queue.h" #include "src/core/lib/surface/server.h" diff --git a/test/core/end2end/fixtures/h2_ssl.cc b/test/core/end2end/fixtures/h2_ssl.cc index 9a0680c40e..8c5c8a2f3f 100644 --- a/test/core/end2end/fixtures/h2_ssl.cc +++ b/test/core/end2end/fixtures/h2_ssl.cc @@ -26,10 +26,10 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/core/end2end/fixtures/h2_ssl_proxy.cc b/test/core/end2end/fixtures/h2_ssl_proxy.cc index 5ddbdefc8c..3f0646cf0f 100644 --- a/test/core/end2end/fixtures/h2_ssl_proxy.cc +++ b/test/core/end2end/fixtures/h2_ssl_proxy.cc @@ -26,10 +26,10 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/end2end/fixtures/proxy.h" #include "test/core/util/port.h" diff --git a/test/core/end2end/fixtures/h2_uds.cc b/test/core/end2end/fixtures/h2_uds.cc index 28f0a50e15..1944dd84a3 100644 --- a/test/core/end2end/fixtures/h2_uds.cc +++ b/test/core/end2end/fixtures/h2_uds.cc @@ -33,7 +33,7 @@ #include "src/core/ext/filters/http/server/http_server_filter.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/connected_channel.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/server.h" #include "test/core/util/port.h" diff --git a/test/core/end2end/fixtures/http_proxy_fixture.cc b/test/core/end2end/fixtures/http_proxy_fixture.cc index 137f7c9fa3..8ec97df3e4 100644 --- a/test/core/end2end/fixtures/http_proxy_fixture.cc +++ b/test/core/end2end/fixtures/http_proxy_fixture.cc @@ -34,6 +34,7 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/http/parser.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/combiner.h" @@ -49,7 +50,6 @@ #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/slice/b64.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "test/core/util/port.h" struct grpc_end2end_http_proxy { diff --git a/test/core/end2end/fuzzers/api_fuzzer.cc b/test/core/end2end/fuzzers/api_fuzzer.cc index 43c9fa19c6..14c155502a 100644 --- a/test/core/end2end/fuzzers/api_fuzzer.cc +++ b/test/core/end2end/fuzzers/api_fuzzer.cc @@ -28,13 +28,13 @@ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/ext/transport/chttp2/transport/chttp2_transport.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/tcp_client.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/iomgr/timer_manager.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/env.h" #include "src/core/lib/surface/server.h" #include "src/core/lib/transport/metadata.h" #include "test/core/end2end/data/ssl_test_data.h" diff --git a/test/core/end2end/h2_ssl_cert_test.cc b/test/core/end2end/h2_ssl_cert_test.cc index d50d1f4d81..3383d6d5d1 100644 --- a/test/core/end2end/h2_ssl_cert_test.cc +++ b/test/core/end2end/h2_ssl_cert_test.cc @@ -26,10 +26,10 @@ #include #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "test/core/end2end/cq_verifier.h" #include "test/core/end2end/data/ssl_test_data.h" #include "test/core/util/port.h" diff --git a/test/core/end2end/tests/bad_hostname.cc b/test/core/end2end/tests/bad_hostname.cc index 97ef62b5e3..85e9ba1307 100644 --- a/test/core/end2end/tests/bad_hostname.cc +++ b/test/core/end2end/tests/bad_hostname.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/call_creds.cc b/test/core/end2end/tests/call_creds.cc index e1c868232c..c5ea101c53 100644 --- a/test/core/end2end/tests/call_creds.cc +++ b/test/core/end2end/tests/call_creds.cc @@ -27,8 +27,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/string.h" #include "test/core/end2end/cq_verifier.h" static const char iam_token[] = "token"; diff --git a/test/core/end2end/tests/cancel_with_status.cc b/test/core/end2end/tests/cancel_with_status.cc index c867751d53..7937fd161f 100644 --- a/test/core/end2end/tests/cancel_with_status.cc +++ b/test/core/end2end/tests/cancel_with_status.cc @@ -28,7 +28,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/default_host.cc b/test/core/end2end/tests/default_host.cc index 85f92b0ab0..7c94420540 100644 --- a/test/core/end2end/tests/default_host.cc +++ b/test/core/end2end/tests/default_host.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/empty_batch.cc b/test/core/end2end/tests/empty_batch.cc index b249c141de..c41e65ddd2 100644 --- a/test/core/end2end/tests/empty_batch.cc +++ b/test/core/end2end/tests/empty_batch.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/high_initial_seqno.cc b/test/core/end2end/tests/high_initial_seqno.cc index d390a954e5..d4d4f5a817 100644 --- a/test/core/end2end/tests/high_initial_seqno.cc +++ b/test/core/end2end/tests/high_initial_seqno.cc @@ -29,7 +29,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/hpack_size.cc b/test/core/end2end/tests/hpack_size.cc index 7ac5fefa22..0d6ec01e36 100644 --- a/test/core/end2end/tests/hpack_size.cc +++ b/test/core/end2end/tests/hpack_size.cc @@ -29,7 +29,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/idempotent_request.cc b/test/core/end2end/tests/idempotent_request.cc index e39975382a..7487e4d83d 100644 --- a/test/core/end2end/tests/idempotent_request.cc +++ b/test/core/end2end/tests/idempotent_request.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/keepalive_timeout.cc b/test/core/end2end/tests/keepalive_timeout.cc index 822565510f..6482b86825 100644 --- a/test/core/end2end/tests/keepalive_timeout.cc +++ b/test/core/end2end/tests/keepalive_timeout.cc @@ -28,8 +28,8 @@ #include #include "src/core/ext/transport/chttp2/transport/frame_ping.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/env.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/negative_deadline.cc b/test/core/end2end/tests/negative_deadline.cc index b793964b48..b752bf9482 100644 --- a/test/core/end2end/tests/negative_deadline.cc +++ b/test/core/end2end/tests/negative_deadline.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/no_logging.cc b/test/core/end2end/tests/no_logging.cc index bf8651221a..d89918bd3e 100644 --- a/test/core/end2end/tests/no_logging.cc +++ b/test/core/end2end/tests/no_logging.cc @@ -28,8 +28,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/error.h" -#include "src/core/lib/support/string.h" #include "test/core/end2end/cq_verifier.h" enum { TIMEOUT = 200000 }; diff --git a/test/core/end2end/tests/proxy_auth.cc b/test/core/end2end/tests/proxy_auth.cc index e4b91ab879..495151b592 100644 --- a/test/core/end2end/tests/proxy_auth.cc +++ b/test/core/end2end/tests/proxy_auth.cc @@ -32,7 +32,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/registered_call.cc b/test/core/end2end/tests/registered_call.cc index 440d817cf1..cefa89db4d 100644 --- a/test/core/end2end/tests/registered_call.cc +++ b/test/core/end2end/tests/registered_call.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/server_finishes_request.cc b/test/core/end2end/tests/server_finishes_request.cc index 46b874b569..743b3aeb91 100644 --- a/test/core/end2end/tests/server_finishes_request.cc +++ b/test/core/end2end/tests/server_finishes_request.cc @@ -27,7 +27,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/end2end/tests/simple_request.cc b/test/core/end2end/tests/simple_request.cc index 7eb7467981..ae93f79c9d 100644 --- a/test/core/end2end/tests/simple_request.cc +++ b/test/core/end2end/tests/simple_request.cc @@ -28,7 +28,7 @@ #include #include #include "src/core/lib/debug/stats.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/end2end/cq_verifier.h" static void* tag(intptr_t t) { return (void*)t; } diff --git a/test/core/fling/fling_stream_test.cc b/test/core/fling/fling_stream_test.cc index b476f2e128..b5a5ce816e 100644 --- a/test/core/fling/fling_stream_test.cc +++ b/test/core/fling/fling_stream_test.cc @@ -23,7 +23,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/port.h" int main(int argc, char** argv) { diff --git a/test/core/fling/fling_test.cc b/test/core/fling/fling_test.cc index 0e8b3c1028..3792e45c42 100644 --- a/test/core/fling/fling_test.cc +++ b/test/core/fling/fling_test.cc @@ -23,7 +23,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/port.h" int main(int argc, const char** argv) { diff --git a/test/core/gpr++/BUILD b/test/core/gpr++/BUILD new file mode 100644 index 0000000000..93324a378b --- /dev/null +++ b/test/core/gpr++/BUILD @@ -0,0 +1,95 @@ +# Copyright 2016 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. + +load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_cc_binary", "grpc_package") + +licenses(["notice"]) # Apache v2 + +grpc_package(name = "test/core/gpr++") + +grpc_cc_test( + name = "manual_constructor_test", + srcs = ["manual_constructor_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "memory_test", + srcs = ["memory_test.cc"], + external_deps = [ + "gtest", + ], + language = "C++", + deps = [ + "//:grpc", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "inlined_vector_test", + srcs = ["inlined_vector_test.cc"], + external_deps = [ + "gtest", + ], + language = "C++", + deps = [ + "//:grpc", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "orphanable_test", + srcs = ["orphanable_test.cc"], + language = "C++", + deps = [ + "//:orphanable", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) + +grpc_cc_test( + name = "ref_counted_test", + srcs = ["ref_counted_test.cc"], + language = "C++", + deps = [ + "//:ref_counted", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) + +grpc_cc_test( + name = "ref_counted_ptr_test", + srcs = ["ref_counted_ptr_test.cc"], + language = "C++", + deps = [ + "//:ref_counted", + "//:ref_counted_ptr", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) diff --git a/test/core/gpr++/inlined_vector_test.cc b/test/core/gpr++/inlined_vector_test.cc new file mode 100644 index 0000000000..09d5453a56 --- /dev/null +++ b/test/core/gpr++/inlined_vector_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gpr++/inlined_vector.h" +#include +#include "src/core/lib/gpr++/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { + +TEST(InlinedVectorTest, CreateAndIterate) { + const int kNumElements = 9; + InlinedVector v; + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + } + EXPECT_EQ(static_cast(kNumElements), v.size()); + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } +} + +TEST(InlinedVectorTest, ValuesAreInlined) { + const int kNumElements = 5; + InlinedVector v; + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + } + EXPECT_EQ(static_cast(kNumElements), v.size()); + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } +} + +TEST(InlinedVectorTest, PushBackWithMove) { + InlinedVector, 1> v; + UniquePtr i = MakeUnique(3); + v.push_back(std::move(i)); + EXPECT_EQ(nullptr, i.get()); + EXPECT_EQ(1UL, v.size()); + EXPECT_EQ(3, *v[0]); +} + +TEST(InlinedVectorTest, EmplaceBack) { + InlinedVector, 1> v; + v.emplace_back(New(3)); + EXPECT_EQ(1UL, v.size()); + EXPECT_EQ(3, *v[0]); +} + +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gpr++/manual_constructor_test.cc b/test/core/gpr++/manual_constructor_test.cc new file mode 100644 index 0000000000..e049b793f6 --- /dev/null +++ b/test/core/gpr++/manual_constructor_test.cc @@ -0,0 +1,99 @@ +/* + * + * 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. + * + */ + +/* Test of gpr synchronization support. */ + +#include "src/core/lib/gpr++/manual_constructor.h" +#include +#include +#include +#include +#include +#include +#include +#include "src/core/lib/gpr++/abstract.h" +#include "test/core/util/test_config.h" + +class A { + public: + A() {} + virtual ~A() {} + virtual const char* foo() { return "A_foo"; } + virtual const char* bar() { return "A_bar"; } + GRPC_ABSTRACT_BASE_CLASS +}; + +class B : public A { + public: + B() {} + ~B() {} + const char* foo() override { return "B_foo"; } + char get_junk() { return junk[0]; } + + private: + char junk[1000]; +}; + +class C : public B { + public: + C() {} + ~C() {} + virtual const char* bar() { return "C_bar"; } + char get_more_junk() { return more_junk[0]; } + + private: + char more_junk[1000]; +}; + +class D : public A { + public: + virtual const char* bar() { return "D_bar"; } +}; + +static void basic_test() { + grpc_core::PolymorphicManualConstructor poly; + poly.Init(); + GPR_ASSERT(!strcmp(poly->foo(), "B_foo")); + GPR_ASSERT(!strcmp(poly->bar(), "A_bar")); +} + +static void complex_test() { + grpc_core::PolymorphicManualConstructor polyB; + polyB.Init(); + GPR_ASSERT(!strcmp(polyB->foo(), "B_foo")); + GPR_ASSERT(!strcmp(polyB->bar(), "A_bar")); + + grpc_core::PolymorphicManualConstructor polyC; + polyC.Init(); + GPR_ASSERT(!strcmp(polyC->foo(), "B_foo")); + GPR_ASSERT(!strcmp(polyC->bar(), "C_bar")); + + grpc_core::PolymorphicManualConstructor polyD; + polyD.Init(); + GPR_ASSERT(!strcmp(polyD->foo(), "A_foo")); + GPR_ASSERT(!strcmp(polyD->bar(), "D_bar")); +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + basic_test(); + complex_test(); + return 0; +} diff --git a/test/core/gpr++/memory_test.cc b/test/core/gpr++/memory_test.cc new file mode 100644 index 0000000000..3553e119e3 --- /dev/null +++ b/test/core/gpr++/memory_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gpr++/memory.h" +#include +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { + +struct Foo { + Foo(int p, int q) : a(p), b(q) {} + int a; + int b; +}; + +TEST(MemoryTest, NewDeleteTest) { Delete(New()); } + +TEST(MemoryTest, NewDeleteWithArgTest) { + int* i = New(42); + EXPECT_EQ(42, *i); + Delete(i); +} + +TEST(MemoryTest, NewDeleteWithArgsTest) { + Foo* p = New(1, 2); + EXPECT_EQ(1, p->a); + EXPECT_EQ(2, p->b); + Delete(p); +} + +TEST(MemoryTest, MakeUniqueTest) { MakeUnique(); } + +TEST(MemoryTest, MakeUniqueWithArgTest) { + auto i = MakeUnique(42); + EXPECT_EQ(42, *i); +} + +TEST(MemoryTest, UniquePtrWithCustomDeleter) { + int n = 0; + class IncrementingDeleter { + public: + void operator()(int* p) { ++*p; } + }; + { + UniquePtr p(&n); + EXPECT_EQ(0, n); + } + EXPECT_EQ(1, n); +} + +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gpr++/orphanable_test.cc b/test/core/gpr++/orphanable_test.cc new file mode 100644 index 0000000000..4513d25da1 --- /dev/null +++ b/test/core/gpr++/orphanable_test.cc @@ -0,0 +1,114 @@ +/* + * + * 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/gpr++/orphanable.h" + +#include + +#include "src/core/lib/gpr++/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public Orphanable { + public: + Foo() : Foo(0) {} + explicit Foo(int value) : value_(value) {} + void Orphan() override { Delete(this); } + int value() const { return value_; } + + private: + int value_; +}; + +TEST(Orphanable, Basic) { + Foo* foo = New(); + foo->Orphan(); +} + +TEST(OrphanablePtr, Basic) { + OrphanablePtr foo(New()); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, DefaultConstructor) { + auto foo = MakeOrphanable(); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, WithParameters) { + auto foo = MakeOrphanable(5); + EXPECT_EQ(5, foo->value()); +} + +class Bar : public InternallyRefCounted { + public: + Bar() : Bar(0) {} + explicit Bar(int value) : value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(); } + void FinishWork() { Unref(); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCounted) { + auto bar = MakeOrphanable(); + bar->StartWork(); + bar->FinishWork(); +} + +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag baz_tracer(true, "baz"); + +class Baz : public InternallyRefCountedWithTracing { + public: + Baz() : Baz(0) {} + explicit Baz(int value) + : InternallyRefCountedWithTracing(&baz_tracer), value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(DEBUG_LOCATION, "work"); } + void FinishWork() { Unref(DEBUG_LOCATION, "work"); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCountedWithTracing) { + auto baz = MakeOrphanable(); + baz->StartWork(); + baz->FinishWork(); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gpr++/ref_counted_ptr_test.cc b/test/core/gpr++/ref_counted_ptr_test.cc new file mode 100644 index 0000000000..e897b2859c --- /dev/null +++ b/test/core/gpr++/ref_counted_ptr_test.cc @@ -0,0 +1,185 @@ +/* + * + * 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/gpr++/ref_counted_ptr.h" + +#include + +#include + +#include "src/core/lib/gpr++/memory.h" +#include "src/core/lib/gpr++/ref_counted.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public RefCounted { + public: + Foo() : value_(0) {} + + explicit Foo(int value) : value_(value) {} + + int value() const { return value_; } + + private: + int value_; +}; + +TEST(RefCountedPtr, DefaultConstructor) { RefCountedPtr foo; } + +TEST(RefCountedPtr, ExplicitConstructorEmpty) { + RefCountedPtr foo(nullptr); +} + +TEST(RefCountedPtr, ExplicitConstructor) { RefCountedPtr foo(New()); } + +TEST(RefCountedPtr, MoveConstructor) { + RefCountedPtr foo(New()); + RefCountedPtr foo2(std::move(foo)); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, MoveAssignment) { + RefCountedPtr foo(New()); + RefCountedPtr foo2 = std::move(foo); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, CopyConstructor) { + RefCountedPtr foo(New()); + RefCountedPtr foo2(foo); + EXPECT_NE(nullptr, foo.get()); + EXPECT_EQ(foo.get(), foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignment) { + RefCountedPtr foo(New()); + RefCountedPtr foo2 = foo; + EXPECT_NE(nullptr, foo.get()); + EXPECT_EQ(foo.get(), foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignmentWhenEmpty) { + RefCountedPtr foo; + RefCountedPtr foo2; + foo2 = foo; + EXPECT_EQ(nullptr, foo.get()); + EXPECT_EQ(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignmentToSelf) { + RefCountedPtr foo(New()); + foo = foo; +} + +TEST(RefCountedPtr, EnclosedScope) { + RefCountedPtr foo(New()); + { + RefCountedPtr foo2(std::move(foo)); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); + } + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNullToNonNull) { + RefCountedPtr foo; + EXPECT_EQ(nullptr, foo.get()); + foo.reset(New()); + EXPECT_NE(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNonNullToNonNull) { + RefCountedPtr foo(New()); + EXPECT_NE(nullptr, foo.get()); + Foo* original = foo.get(); + foo.reset(New()); + EXPECT_NE(nullptr, foo.get()); + EXPECT_NE(original, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNonNullToNull) { + RefCountedPtr foo(New()); + EXPECT_NE(nullptr, foo.get()); + foo.reset(); + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNullToNull) { + RefCountedPtr foo; + EXPECT_EQ(nullptr, foo.get()); + foo.reset(nullptr); + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, DerefernceOperators) { + RefCountedPtr foo(New()); + foo->value(); + Foo& foo_ref = *foo; + foo_ref.value(); +} + +TEST(RefCountedPtr, EqualityOperators) { + RefCountedPtr foo(New()); + RefCountedPtr bar = foo; + RefCountedPtr empty; + // Test equality between RefCountedPtrs. + EXPECT_EQ(foo, bar); + EXPECT_NE(foo, empty); + // Test equality with bare pointers. + EXPECT_EQ(foo, foo.get()); + EXPECT_EQ(empty, nullptr); + EXPECT_NE(foo, nullptr); +} + +TEST(MakeRefCounted, NoArgs) { + RefCountedPtr foo = MakeRefCounted(); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeRefCounted, Args) { + RefCountedPtr foo = MakeRefCounted(3); + EXPECT_EQ(3, foo->value()); +} + +TraceFlag foo_tracer(true, "foo"); + +class FooWithTracing : public RefCountedWithTracing { + public: + FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} +}; + +TEST(RefCountedPtr, RefCountedWithTracing) { + RefCountedPtr foo(New()); + foo->Ref(DEBUG_LOCATION, "foo"); + foo->Unref(DEBUG_LOCATION, "foo"); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gpr++/ref_counted_test.cc b/test/core/gpr++/ref_counted_test.cc new file mode 100644 index 0000000000..568ec51c64 --- /dev/null +++ b/test/core/gpr++/ref_counted_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gpr++/ref_counted.h" + +#include + +#include "src/core/lib/gpr++/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public RefCounted { + public: + Foo() {} +}; + +TEST(RefCounted, Basic) { + Foo* foo = New(); + foo->Unref(); +} + +TEST(RefCounted, ExtraRef) { + Foo* foo = New(); + foo->Ref(); + foo->Unref(); + foo->Unref(); +} + +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag foo_tracer(true, "foo"); + +class FooWithTracing : public RefCountedWithTracing { + public: + FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} +}; + +TEST(RefCountedWithTracing, Basic) { + FooWithTracing* foo = New(); + foo->Ref(DEBUG_LOCATION, "extra_ref"); + foo->Unref(DEBUG_LOCATION, "extra_ref"); + // Can use the no-argument methods, too. + foo->Ref(); + foo->Unref(); + foo->Unref(DEBUG_LOCATION, "original_ref"); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gpr/BUILD b/test/core/gpr/BUILD new file mode 100644 index 0000000000..1be1036d04 --- /dev/null +++ b/test/core/gpr/BUILD @@ -0,0 +1,179 @@ +# Copyright 2016 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. + +load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_cc_binary", "grpc_package") + +licenses(["notice"]) # Apache v2 + +grpc_package(name = "test/core/gpr") + +grpc_cc_test( + name = "alloc_test", + srcs = ["alloc_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "avl_test", + srcs = ["avl_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "cmdline_test", + srcs = ["cmdline_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "cpu_test", + srcs = ["cpu_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "env_test", + srcs = ["env_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "host_port_test", + srcs = ["host_port_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "log_test", + srcs = ["log_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "mpscq_test", + srcs = ["mpscq_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "murmur_hash_test", + srcs = ["murmur_hash_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "string_test", + srcs = ["string_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "spinlock_test", + srcs = ["spinlock_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "sync_test", + srcs = ["sync_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "thd_test", + srcs = ["thd_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "time_test", + srcs = ["time_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "tls_test", + srcs = ["tls_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "useful_test", + srcs = ["useful_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//test/core/util:gpr_test_util", + ], +) diff --git a/test/core/gpr/alloc_test.cc b/test/core/gpr/alloc_test.cc new file mode 100644 index 0000000000..6074c6e6e7 --- /dev/null +++ b/test/core/gpr/alloc_test.cc @@ -0,0 +1,55 @@ +/* + * + * 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. + * + */ + +#include +#include +#include "test/core/util/test_config.h" + +static void* fake_malloc(size_t size) { return (void*)size; } + +static void* fake_realloc(void* addr, size_t size) { return (void*)size; } + +static void fake_free(void* addr) { *((intptr_t*)addr) = (intptr_t)0xdeadd00d; } + +static void test_custom_allocs() { + const gpr_allocation_functions default_fns = gpr_get_allocation_functions(); + intptr_t addr_to_free = 0; + char* i; + gpr_allocation_functions fns = {fake_malloc, nullptr, fake_realloc, + fake_free}; + + gpr_set_allocation_functions(fns); + GPR_ASSERT((void*)(size_t)0xdeadbeef == gpr_malloc(0xdeadbeef)); + GPR_ASSERT((void*)(size_t)0xcafed00d == gpr_realloc(nullptr, 0xcafed00d)); + + gpr_free(&addr_to_free); + GPR_ASSERT(addr_to_free == (intptr_t)0xdeadd00d); + + /* Restore and check we don't get funky values and that we don't leak */ + gpr_set_allocation_functions(default_fns); + GPR_ASSERT((void*)sizeof(*i) != + (i = static_cast(gpr_malloc(sizeof(*i))))); + GPR_ASSERT((void*)2 != (i = static_cast(gpr_realloc(i, 2)))); + gpr_free(i); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + test_custom_allocs(); + return 0; +} diff --git a/test/core/gpr/arena_test.cc b/test/core/gpr/arena_test.cc new file mode 100644 index 0000000000..59ea04c0ed --- /dev/null +++ b/test/core/gpr/arena_test.cc @@ -0,0 +1,129 @@ +/* + * + * 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/gpr/arena.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/core/lib/gpr/string.h" +#include "test/core/util/test_config.h" + +static void test_noop(void) { gpr_arena_destroy(gpr_arena_create(1)); } + +static void test(const char* name, size_t init_size, const size_t* allocs, + size_t nallocs) { + gpr_strvec v; + char* s; + gpr_strvec_init(&v); + gpr_asprintf(&s, "test '%s': %" PRIdPTR " <- {", name, init_size); + gpr_strvec_add(&v, s); + for (size_t i = 0; i < nallocs; i++) { + gpr_asprintf(&s, "%" PRIdPTR ",", allocs[i]); + gpr_strvec_add(&v, s); + } + gpr_strvec_add(&v, gpr_strdup("}")); + s = gpr_strvec_flatten(&v, nullptr); + gpr_strvec_destroy(&v); + gpr_log(GPR_INFO, "%s", s); + gpr_free(s); + + gpr_arena* a = gpr_arena_create(init_size); + void** ps = static_cast(gpr_zalloc(sizeof(*ps) * nallocs)); + for (size_t i = 0; i < nallocs; i++) { + ps[i] = gpr_arena_alloc(a, allocs[i]); + // ensure no duplicate results + for (size_t j = 0; j < i; j++) { + GPR_ASSERT(ps[i] != ps[j]); + } + // ensure writable + memset(ps[i], 1, allocs[i]); + } + gpr_arena_destroy(a); + gpr_free(ps); +} + +#define TEST(name, init_size, ...) \ + static const size_t allocs_##name[] = {__VA_ARGS__}; \ + test(#name, init_size, allocs_##name, GPR_ARRAY_SIZE(allocs_##name)) + +#define CONCURRENT_TEST_THREADS 100 + +size_t concurrent_test_iterations() { + if (sizeof(void*) < 8) return 1000; + return 100000; +} + +typedef struct { + gpr_event ev_start; + gpr_arena* arena; +} concurrent_test_args; + +static void concurrent_test_body(void* arg) { + concurrent_test_args* a = static_cast(arg); + gpr_event_wait(&a->ev_start, gpr_inf_future(GPR_CLOCK_REALTIME)); + for (size_t i = 0; i < concurrent_test_iterations(); i++) { + *(char*)gpr_arena_alloc(a->arena, 1) = (char)i; + } +} + +static void concurrent_test(void) { + gpr_log(GPR_DEBUG, "concurrent_test"); + + concurrent_test_args args; + gpr_event_init(&args.ev_start); + args.arena = gpr_arena_create(1024); + + gpr_thd_id thds[CONCURRENT_TEST_THREADS]; + + for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { + gpr_thd_options opt = gpr_thd_options_default(); + gpr_thd_options_set_joinable(&opt); + gpr_thd_new(&thds[i], "grpc_concurrent_test", concurrent_test_body, &args, + &opt); + } + + gpr_event_set(&args.ev_start, (void*)1); + + for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { + gpr_thd_join(thds[i]); + } + + gpr_arena_destroy(args.arena); +} + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + + test_noop(); + TEST(0_1, 0, 1); + TEST(1_1, 1, 1); + TEST(1_2, 1, 2); + TEST(1_3, 1, 3); + TEST(1_inc, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); + TEST(6_123, 6, 1, 2, 3); + concurrent_test(); + + return 0; +} diff --git a/test/core/gpr/avl_test.cc b/test/core/gpr/avl_test.cc new file mode 100644 index 0000000000..345db557b9 --- /dev/null +++ b/test/core/gpr/avl_test.cc @@ -0,0 +1,3659 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include + +#include +#include +#include + +#include "test/core/util/test_config.h" + +static int* box(int x) { + int* b = static_cast(gpr_malloc(sizeof(*b))); + *b = x; + return b; +} + +static long int_compare(void* int1, void* int2, void* unused) { + return (*(int*)int1) - (*(int*)int2); +} +static void* int_copy(void* p, void* unused) { return box(*(int*)p); } + +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, nullptr) == value); + gpr_free(k); +} + +static void check_negget(gpr_avl avl, int key) { + int* k = box(key); + GPR_ASSERT(gpr_avl_get(avl, k, nullptr) == nullptr); + gpr_free(k); +} + +static gpr_avl remove_int(gpr_avl avl, int key) { + int* k = box(key); + avl = gpr_avl_remove(avl, k, nullptr); + gpr_free(k); + return avl; +} + +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), nullptr); + avl = gpr_avl_add(avl, box(2), box(22), nullptr); + avl = gpr_avl_add(avl, box(3), box(33), nullptr); + check_get(avl, 1, 11); + check_get(avl, 2, 22); + check_get(avl, 3, 33); + check_negget(avl, 4); + gpr_avl_unref(avl, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(4), box(2), nullptr); + avl = gpr_avl_add(avl, box(3), box(3), nullptr); + 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, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(3), box(2), nullptr); + avl = gpr_avl_add(avl, box(4), box(3), nullptr); + 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, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(4), box(2), nullptr); + avl = gpr_avl_add(avl, box(5), box(3), nullptr); + 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, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(5), box(2), nullptr); + avl = gpr_avl_add(avl, box(4), box(3), nullptr); + 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, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(4), box(2), nullptr); + avl = gpr_avl_add(avl, box(3), box(3), nullptr); + avl = gpr_avl_add(avl, box(2), box(4), nullptr); + avl = gpr_avl_add(avl, box(1), box(5), nullptr); + 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, nullptr); +} + +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), nullptr); + avl = gpr_avl_add(avl, box(1), box(2), nullptr); + check_get(avl, 1, 2); + check_negget(avl, 2); + gpr_avl_unref(avl, nullptr); +} + +static void test_remove(void) { + gpr_avl avl; + 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), nullptr); + avl = gpr_avl_add(avl, box(4), box(2), nullptr); + avl = gpr_avl_add(avl, box(5), box(3), nullptr); + + avl3 = remove_int(gpr_avl_ref(avl, nullptr), 3); + avl4 = remove_int(gpr_avl_ref(avl, nullptr), 4); + avl5 = remove_int(gpr_avl_ref(avl, nullptr), 5); + avln = remove_int(gpr_avl_ref(avl, nullptr), 1); + + gpr_avl_unref(avl, nullptr); + + check_negget(avl3, 3); + check_get(avl3, 4, 2); + check_get(avl3, 5, 3); + gpr_avl_unref(avl3, nullptr); + + check_get(avl4, 3, 1); + check_negget(avl4, 4); + check_get(avl4, 5, 3); + gpr_avl_unref(avl4, nullptr); + + check_get(avl5, 3, 1); + check_get(avl5, 4, 2); + check_negget(avl5, 5); + gpr_avl_unref(avl5, nullptr); + + check_get(avln, 3, 1); + check_get(avln, 4, 2); + check_get(avln, 5, 3); + gpr_avl_unref(avln, nullptr); +} + +static void test_badcase1(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase1"); + + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(88), box(1), nullptr); + avl = remove_int(avl, 643); + avl = remove_int(avl, 983); + avl = gpr_avl_add(avl, box(985), box(4), nullptr); + avl = gpr_avl_add(avl, box(640), box(5), nullptr); + avl = gpr_avl_add(avl, box(41), box(6), nullptr); + avl = gpr_avl_add(avl, box(112), box(7), nullptr); + avl = gpr_avl_add(avl, box(342), box(8), nullptr); + avl = remove_int(avl, 1013); + avl = gpr_avl_add(avl, box(434), box(10), nullptr); + avl = gpr_avl_add(avl, box(520), box(11), nullptr); + avl = gpr_avl_add(avl, box(231), box(12), nullptr); + avl = gpr_avl_add(avl, box(852), box(13), nullptr); + avl = remove_int(avl, 461); + avl = gpr_avl_add(avl, box(108), box(15), nullptr); + avl = gpr_avl_add(avl, box(806), box(16), nullptr); + avl = gpr_avl_add(avl, box(827), box(17), nullptr); + avl = remove_int(avl, 796); + avl = gpr_avl_add(avl, box(340), box(19), nullptr); + avl = gpr_avl_add(avl, box(498), box(20), nullptr); + avl = gpr_avl_add(avl, box(203), box(21), nullptr); + avl = gpr_avl_add(avl, box(751), box(22), nullptr); + avl = gpr_avl_add(avl, box(150), box(23), nullptr); + avl = remove_int(avl, 237); + avl = gpr_avl_add(avl, box(830), box(25), nullptr); + avl = remove_int(avl, 1007); + avl = remove_int(avl, 394); + avl = gpr_avl_add(avl, box(65), box(28), nullptr); + avl = remove_int(avl, 904); + avl = remove_int(avl, 123); + avl = gpr_avl_add(avl, box(238), box(31), nullptr); + avl = gpr_avl_add(avl, box(184), box(32), nullptr); + avl = remove_int(avl, 331); + avl = gpr_avl_add(avl, box(827), box(34), nullptr); + + check_get(avl, 830, 25); + + gpr_avl_unref(avl, nullptr); +} + +static void test_badcase2(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase2"); + + avl = gpr_avl_create(&int_int_vtable); + avl = gpr_avl_add(avl, box(288), box(1), nullptr); + avl = remove_int(avl, 415); + avl = gpr_avl_add(avl, box(953), box(3), nullptr); + avl = gpr_avl_add(avl, box(101), box(4), nullptr); + avl = gpr_avl_add(avl, box(516), box(5), nullptr); + avl = gpr_avl_add(avl, box(547), box(6), nullptr); + avl = gpr_avl_add(avl, box(467), box(7), nullptr); + avl = gpr_avl_add(avl, box(793), box(8), nullptr); + avl = remove_int(avl, 190); + avl = gpr_avl_add(avl, box(687), box(10), nullptr); + avl = gpr_avl_add(avl, box(242), box(11), nullptr); + avl = gpr_avl_add(avl, box(142), box(12), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(622), box(18), nullptr); + avl = remove_int(avl, 513); + avl = remove_int(avl, 429); + avl = gpr_avl_add(avl, box(205), box(21), nullptr); + avl = remove_int(avl, 663); + avl = remove_int(avl, 953); + avl = remove_int(avl, 892); + avl = gpr_avl_add(avl, box(236), box(25), nullptr); + avl = remove_int(avl, 982); + avl = remove_int(avl, 201); + avl = remove_int(avl, 684); + avl = gpr_avl_add(avl, box(572), box(29), nullptr); + avl = remove_int(avl, 817); + avl = gpr_avl_add(avl, box(970), box(31), nullptr); + avl = remove_int(avl, 347); + avl = remove_int(avl, 574); + avl = gpr_avl_add(avl, box(752), box(34), nullptr); + avl = gpr_avl_add(avl, box(670), box(35), nullptr); + avl = gpr_avl_add(avl, box(69), box(36), nullptr); + avl = remove_int(avl, 111); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(141), box(39), nullptr); + avl = remove_int(avl, 159); + avl = gpr_avl_add(avl, box(947), box(41), nullptr); + avl = gpr_avl_add(avl, box(855), box(42), nullptr); + avl = remove_int(avl, 218); + avl = remove_int(avl, 6); + avl = gpr_avl_add(avl, box(753), box(45), nullptr); + avl = remove_int(avl, 82); + avl = remove_int(avl, 799); + avl = gpr_avl_add(avl, box(572), box(48), nullptr); + avl = remove_int(avl, 376); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(458), box(51), nullptr); + avl = remove_int(avl, 897); + avl = gpr_avl_add(avl, box(191), box(53), nullptr); + avl = gpr_avl_add(avl, box(609), box(54), nullptr); + 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), nullptr); + avl = remove_int(avl, 641); + avl = gpr_avl_add(avl, box(462), box(62), nullptr); + avl = remove_int(avl, 359); + avl = remove_int(avl, 767); + avl = gpr_avl_add(avl, box(310), box(65), nullptr); + avl = remove_int(avl, 757); + avl = remove_int(avl, 639); + avl = remove_int(avl, 314); + avl = gpr_avl_add(avl, box(2), box(69), nullptr); + avl = remove_int(avl, 138); + avl = gpr_avl_add(avl, box(669), box(71), nullptr); + avl = remove_int(avl, 477); + avl = gpr_avl_add(avl, box(366), box(73), nullptr); + avl = gpr_avl_add(avl, box(612), box(74), nullptr); + avl = gpr_avl_add(avl, box(106), box(75), nullptr); + avl = remove_int(avl, 161); + avl = gpr_avl_add(avl, box(388), box(77), nullptr); + avl = gpr_avl_add(avl, box(141), box(78), nullptr); + avl = remove_int(avl, 633); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(40), box(81), nullptr); + avl = remove_int(avl, 689); + avl = gpr_avl_add(avl, box(823), box(83), nullptr); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(903), box(85), nullptr); + avl = gpr_avl_add(avl, box(592), box(86), nullptr); + avl = remove_int(avl, 448); + avl = gpr_avl_add(avl, box(56), box(88), nullptr); + avl = remove_int(avl, 333); + avl = gpr_avl_add(avl, box(189), box(90), nullptr); + avl = gpr_avl_add(avl, box(103), box(91), nullptr); + avl = remove_int(avl, 164); + avl = remove_int(avl, 974); + avl = gpr_avl_add(avl, box(215), box(94), nullptr); + avl = remove_int(avl, 189); + avl = remove_int(avl, 504); + avl = gpr_avl_add(avl, box(868), box(97), nullptr); + avl = remove_int(avl, 909); + avl = remove_int(avl, 148); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(994), box(101), nullptr); + avl = gpr_avl_add(avl, box(576), box(102), nullptr); + avl = remove_int(avl, 82); + avl = remove_int(avl, 209); + avl = gpr_avl_add(avl, box(276), box(105), nullptr); + avl = remove_int(avl, 856); + avl = gpr_avl_add(avl, box(750), box(107), nullptr); + avl = remove_int(avl, 871); + avl = gpr_avl_add(avl, box(301), box(109), nullptr); + avl = remove_int(avl, 260); + avl = remove_int(avl, 737); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(933), box(113), nullptr); + avl = gpr_avl_add(avl, box(225), box(114), nullptr); + avl = gpr_avl_add(avl, box(975), box(115), nullptr); + avl = gpr_avl_add(avl, box(86), box(116), nullptr); + avl = remove_int(avl, 732); + avl = gpr_avl_add(avl, box(340), box(118), nullptr); + avl = gpr_avl_add(avl, box(271), box(119), nullptr); + avl = remove_int(avl, 206); + avl = gpr_avl_add(avl, box(949), box(121), nullptr); + avl = gpr_avl_add(avl, box(927), box(122), nullptr); + avl = gpr_avl_add(avl, box(34), box(123), nullptr); + avl = gpr_avl_add(avl, box(351), box(124), nullptr); + avl = remove_int(avl, 836); + avl = gpr_avl_add(avl, box(825), box(126), nullptr); + avl = gpr_avl_add(avl, box(352), box(127), nullptr); + avl = remove_int(avl, 107); + avl = remove_int(avl, 101); + avl = gpr_avl_add(avl, box(320), box(130), nullptr); + avl = gpr_avl_add(avl, box(3), box(131), nullptr); + avl = remove_int(avl, 998); + avl = remove_int(avl, 44); + avl = gpr_avl_add(avl, box(525), box(134), nullptr); + avl = gpr_avl_add(avl, box(864), box(135), nullptr); + avl = gpr_avl_add(avl, box(863), box(136), nullptr); + avl = remove_int(avl, 770); + avl = gpr_avl_add(avl, box(440), box(138), nullptr); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(116), box(140), nullptr); + avl = remove_int(avl, 380); + avl = gpr_avl_add(avl, box(878), box(142), nullptr); + avl = remove_int(avl, 439); + avl = gpr_avl_add(avl, box(994), box(144), nullptr); + avl = remove_int(avl, 294); + avl = remove_int(avl, 593); + avl = gpr_avl_add(avl, box(696), box(147), nullptr); + avl = remove_int(avl, 8); + avl = gpr_avl_add(avl, box(881), box(149), nullptr); + avl = remove_int(avl, 32); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(487), box(152), nullptr); + avl = gpr_avl_add(avl, box(637), box(153), nullptr); + avl = gpr_avl_add(avl, box(793), box(154), nullptr); + avl = gpr_avl_add(avl, box(696), box(155), nullptr); + avl = remove_int(avl, 458); + avl = gpr_avl_add(avl, box(828), box(157), nullptr); + avl = remove_int(avl, 784); + avl = remove_int(avl, 274); + avl = gpr_avl_add(avl, box(783), box(160), nullptr); + avl = remove_int(avl, 21); + avl = gpr_avl_add(avl, box(866), box(162), nullptr); + avl = remove_int(avl, 919); + avl = gpr_avl_add(avl, box(435), box(164), nullptr); + avl = remove_int(avl, 385); + avl = gpr_avl_add(avl, box(475), box(166), nullptr); + avl = remove_int(avl, 339); + avl = gpr_avl_add(avl, box(615), box(168), nullptr); + avl = remove_int(avl, 866); + avl = remove_int(avl, 82); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(590), box(172), nullptr); + avl = gpr_avl_add(avl, box(852), box(173), nullptr); + avl = remove_int(avl, 318); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(672), box(176), nullptr); + avl = remove_int(avl, 430); + avl = gpr_avl_add(avl, box(821), box(178), nullptr); + avl = gpr_avl_add(avl, box(365), box(179), nullptr); + avl = remove_int(avl, 78); + avl = gpr_avl_add(avl, box(700), box(181), nullptr); + avl = gpr_avl_add(avl, box(353), box(182), nullptr); + avl = remove_int(avl, 492); + avl = gpr_avl_add(avl, box(991), box(184), nullptr); + avl = remove_int(avl, 330); + avl = gpr_avl_add(avl, box(873), box(186), nullptr); + avl = remove_int(avl, 589); + avl = gpr_avl_add(avl, box(676), box(188), nullptr); + avl = gpr_avl_add(avl, box(790), box(189), nullptr); + avl = remove_int(avl, 521); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(976), box(192), nullptr); + avl = gpr_avl_add(avl, box(683), box(193), nullptr); + avl = remove_int(avl, 803); + avl = remove_int(avl, 1006); + avl = gpr_avl_add(avl, box(775), box(196), nullptr); + avl = gpr_avl_add(avl, box(411), box(197), nullptr); + avl = gpr_avl_add(avl, box(697), box(198), nullptr); + avl = remove_int(avl, 50); + avl = gpr_avl_add(avl, box(213), box(200), nullptr); + avl = remove_int(avl, 714); + avl = gpr_avl_add(avl, box(981), box(202), nullptr); + avl = gpr_avl_add(avl, box(502), box(203), nullptr); + avl = gpr_avl_add(avl, box(697), box(204), nullptr); + avl = gpr_avl_add(avl, box(603), box(205), nullptr); + avl = gpr_avl_add(avl, box(117), box(206), nullptr); + avl = remove_int(avl, 363); + avl = gpr_avl_add(avl, box(104), box(208), nullptr); + avl = remove_int(avl, 842); + avl = gpr_avl_add(avl, box(48), box(210), nullptr); + avl = remove_int(avl, 764); + avl = gpr_avl_add(avl, box(482), box(212), nullptr); + avl = gpr_avl_add(avl, box(928), box(213), nullptr); + avl = gpr_avl_add(avl, box(30), box(214), nullptr); + avl = gpr_avl_add(avl, box(820), box(215), nullptr); + avl = gpr_avl_add(avl, box(334), box(216), nullptr); + avl = remove_int(avl, 306); + avl = gpr_avl_add(avl, box(789), box(218), nullptr); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(53), box(220), nullptr); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(130), box(222), nullptr); + avl = gpr_avl_add(avl, box(239), box(223), nullptr); + avl = remove_int(avl, 20); + avl = gpr_avl_add(avl, box(117), box(225), nullptr); + avl = remove_int(avl, 882); + avl = remove_int(avl, 891); + avl = gpr_avl_add(avl, box(9), box(228), nullptr); + avl = gpr_avl_add(avl, box(496), box(229), nullptr); + avl = gpr_avl_add(avl, box(750), box(230), nullptr); + avl = gpr_avl_add(avl, box(283), box(231), nullptr); + avl = gpr_avl_add(avl, box(802), box(232), nullptr); + avl = remove_int(avl, 352); + avl = gpr_avl_add(avl, box(374), box(234), nullptr); + avl = gpr_avl_add(avl, box(6), box(235), nullptr); + avl = gpr_avl_add(avl, box(756), box(236), nullptr); + avl = gpr_avl_add(avl, box(597), box(237), nullptr); + avl = gpr_avl_add(avl, box(661), box(238), nullptr); + avl = remove_int(avl, 96); + avl = gpr_avl_add(avl, box(894), box(240), nullptr); + avl = remove_int(avl, 749); + avl = gpr_avl_add(avl, box(71), box(242), nullptr); + avl = remove_int(avl, 68); + avl = gpr_avl_add(avl, box(388), box(244), nullptr); + avl = remove_int(avl, 119); + avl = remove_int(avl, 856); + avl = gpr_avl_add(avl, box(176), box(247), nullptr); + avl = gpr_avl_add(avl, box(993), box(248), nullptr); + avl = remove_int(avl, 178); + avl = remove_int(avl, 781); + avl = remove_int(avl, 771); + avl = remove_int(avl, 848); + avl = remove_int(avl, 376); + avl = remove_int(avl, 157); + avl = remove_int(avl, 142); + avl = remove_int(avl, 686); + avl = gpr_avl_add(avl, box(779), box(257), nullptr); + avl = gpr_avl_add(avl, box(484), box(258), nullptr); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(388), box(260), nullptr); + avl = remove_int(avl, 987); + avl = gpr_avl_add(avl, box(336), box(262), nullptr); + avl = remove_int(avl, 855); + avl = gpr_avl_add(avl, box(668), box(264), nullptr); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(193), box(266), nullptr); + avl = remove_int(avl, 939); + avl = gpr_avl_add(avl, box(740), box(268), nullptr); + avl = gpr_avl_add(avl, box(503), box(269), nullptr); + avl = gpr_avl_add(avl, box(765), box(270), nullptr); + avl = remove_int(avl, 924); + avl = remove_int(avl, 513); + avl = gpr_avl_add(avl, box(161), box(273), nullptr); + avl = gpr_avl_add(avl, box(502), box(274), nullptr); + avl = gpr_avl_add(avl, box(846), box(275), nullptr); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(87), box(277), nullptr); + avl = gpr_avl_add(avl, box(949), box(278), nullptr); + avl = gpr_avl_add(avl, box(548), box(279), nullptr); + avl = gpr_avl_add(avl, box(951), box(280), nullptr); + avl = remove_int(avl, 1018); + avl = remove_int(avl, 568); + avl = gpr_avl_add(avl, box(138), box(283), nullptr); + avl = gpr_avl_add(avl, box(202), box(284), nullptr); + avl = gpr_avl_add(avl, box(157), box(285), nullptr); + avl = gpr_avl_add(avl, box(264), box(286), nullptr); + avl = gpr_avl_add(avl, box(370), box(287), nullptr); + avl = remove_int(avl, 736); + avl = remove_int(avl, 751); + avl = remove_int(avl, 506); + avl = remove_int(avl, 81); + avl = remove_int(avl, 358); + avl = remove_int(avl, 657); + avl = remove_int(avl, 86); + avl = gpr_avl_add(avl, box(876), box(295), nullptr); + avl = remove_int(avl, 354); + avl = gpr_avl_add(avl, box(134), box(297), nullptr); + avl = remove_int(avl, 781); + avl = remove_int(avl, 183); + avl = gpr_avl_add(avl, box(914), box(300), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(699), box(307), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(265), box(315), nullptr); + avl = gpr_avl_add(avl, box(268), box(316), nullptr); + avl = gpr_avl_add(avl, box(103), box(317), nullptr); + avl = gpr_avl_add(avl, box(440), box(318), nullptr); + avl = remove_int(avl, 777); + avl = gpr_avl_add(avl, box(670), box(320), nullptr); + avl = remove_int(avl, 506); + avl = remove_int(avl, 487); + avl = gpr_avl_add(avl, box(421), box(323), nullptr); + avl = remove_int(avl, 514); + avl = gpr_avl_add(avl, box(701), box(325), nullptr); + avl = remove_int(avl, 949); + avl = remove_int(avl, 872); + avl = remove_int(avl, 139); + avl = gpr_avl_add(avl, box(781), box(329), nullptr); + avl = gpr_avl_add(avl, box(543), box(330), nullptr); + avl = gpr_avl_add(avl, box(147), box(331), nullptr); + avl = remove_int(avl, 190); + avl = gpr_avl_add(avl, box(453), box(333), nullptr); + 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), nullptr); + avl = remove_int(avl, 812); + avl = gpr_avl_add(avl, box(431), box(340), nullptr); + avl = gpr_avl_add(avl, box(8), box(341), nullptr); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(831), box(343), nullptr); + avl = remove_int(avl, 472); + avl = remove_int(avl, 157); + avl = gpr_avl_add(avl, box(612), box(346), nullptr); + avl = gpr_avl_add(avl, box(802), box(347), nullptr); + avl = remove_int(avl, 554); + avl = gpr_avl_add(avl, box(409), box(349), nullptr); + avl = gpr_avl_add(avl, box(439), box(350), nullptr); + avl = gpr_avl_add(avl, box(725), box(351), nullptr); + avl = gpr_avl_add(avl, box(568), box(352), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(950), box(358), nullptr); + avl = gpr_avl_add(avl, box(532), box(359), nullptr); + avl = gpr_avl_add(avl, box(832), box(360), nullptr); + avl = remove_int(avl, 390); + avl = gpr_avl_add(avl, box(993), box(362), nullptr); + avl = remove_int(avl, 198); + avl = remove_int(avl, 401); + avl = gpr_avl_add(avl, box(316), box(365), nullptr); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(541), box(367), nullptr); + avl = gpr_avl_add(avl, box(505), box(368), nullptr); + avl = remove_int(avl, 445); + avl = remove_int(avl, 256); + avl = gpr_avl_add(avl, box(232), box(371), nullptr); + avl = remove_int(avl, 577); + avl = remove_int(avl, 558); + avl = gpr_avl_add(avl, box(910), box(374), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(655), box(381), nullptr); + avl = remove_int(avl, 557); + avl = remove_int(avl, 102); + avl = remove_int(avl, 165); + avl = gpr_avl_add(avl, box(191), box(385), nullptr); + avl = remove_int(avl, 30); + avl = gpr_avl_add(avl, box(406), box(387), nullptr); + avl = gpr_avl_add(avl, box(66), box(388), nullptr); + avl = gpr_avl_add(avl, box(87), box(389), nullptr); + avl = remove_int(avl, 7); + avl = remove_int(avl, 671); + avl = gpr_avl_add(avl, box(234), box(392), nullptr); + avl = remove_int(avl, 463); + avl = gpr_avl_add(avl, box(75), box(394), nullptr); + avl = gpr_avl_add(avl, box(487), box(395), nullptr); + avl = remove_int(avl, 203); + avl = gpr_avl_add(avl, box(711), box(397), nullptr); + avl = remove_int(avl, 291); + avl = remove_int(avl, 798); + avl = remove_int(avl, 337); + avl = gpr_avl_add(avl, box(877), box(401), nullptr); + avl = gpr_avl_add(avl, box(388), box(402), nullptr); + avl = remove_int(avl, 975); + avl = gpr_avl_add(avl, box(200), box(404), nullptr); + avl = gpr_avl_add(avl, box(408), box(405), nullptr); + avl = gpr_avl_add(avl, box(3), box(406), nullptr); + avl = gpr_avl_add(avl, box(971), box(407), nullptr); + 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), nullptr); + avl = remove_int(avl, 14); + avl = remove_int(avl, 364); + avl = gpr_avl_add(avl, box(215), box(415), nullptr); + avl = remove_int(avl, 778); + avl = remove_int(avl, 45); + avl = gpr_avl_add(avl, box(328), box(418), nullptr); + avl = gpr_avl_add(avl, box(597), box(419), nullptr); + avl = remove_int(avl, 34); + avl = gpr_avl_add(avl, box(736), box(421), nullptr); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(275), box(423), nullptr); + avl = gpr_avl_add(avl, box(70), box(424), nullptr); + avl = gpr_avl_add(avl, box(771), box(425), nullptr); + avl = remove_int(avl, 536); + avl = remove_int(avl, 421); + avl = gpr_avl_add(avl, box(186), box(428), nullptr); + avl = gpr_avl_add(avl, box(788), box(429), nullptr); + avl = gpr_avl_add(avl, box(224), box(430), nullptr); + avl = remove_int(avl, 228); + avl = gpr_avl_add(avl, box(48), box(432), nullptr); + avl = gpr_avl_add(avl, box(120), box(433), nullptr); + avl = gpr_avl_add(avl, box(269), box(434), nullptr); + avl = gpr_avl_add(avl, box(904), box(435), nullptr); + avl = remove_int(avl, 699); + avl = gpr_avl_add(avl, box(340), box(437), nullptr); + avl = remove_int(avl, 276); + avl = gpr_avl_add(avl, box(591), box(439), nullptr); + avl = gpr_avl_add(avl, box(778), box(440), nullptr); + avl = remove_int(avl, 490); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(294), box(443), nullptr); + avl = gpr_avl_add(avl, box(323), box(444), nullptr); + avl = remove_int(avl, 685); + avl = gpr_avl_add(avl, box(38), box(446), nullptr); + avl = gpr_avl_add(avl, box(525), box(447), nullptr); + avl = remove_int(avl, 162); + avl = gpr_avl_add(avl, box(462), box(449), nullptr); + avl = gpr_avl_add(avl, box(340), box(450), nullptr); + avl = remove_int(avl, 734); + avl = remove_int(avl, 959); + avl = gpr_avl_add(avl, box(752), box(453), nullptr); + avl = gpr_avl_add(avl, box(667), box(454), nullptr); + avl = remove_int(avl, 558); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(711), box(457), nullptr); + avl = remove_int(avl, 937); + avl = gpr_avl_add(avl, box(741), box(459), nullptr); + avl = gpr_avl_add(avl, box(40), box(460), nullptr); + avl = remove_int(avl, 784); + avl = gpr_avl_add(avl, box(292), box(462), nullptr); + avl = remove_int(avl, 164); + avl = remove_int(avl, 931); + avl = remove_int(avl, 886); + avl = gpr_avl_add(avl, box(968), box(466), nullptr); + avl = remove_int(avl, 263); + avl = gpr_avl_add(avl, box(647), box(468), nullptr); + avl = gpr_avl_add(avl, box(92), box(469), nullptr); + avl = remove_int(avl, 310); + avl = gpr_avl_add(avl, box(711), box(471), nullptr); + avl = gpr_avl_add(avl, box(675), box(472), nullptr); + avl = remove_int(avl, 549); + avl = gpr_avl_add(avl, box(380), box(474), nullptr); + avl = remove_int(avl, 825); + avl = gpr_avl_add(avl, box(668), box(476), nullptr); + avl = remove_int(avl, 498); + avl = gpr_avl_add(avl, box(870), box(478), nullptr); + avl = gpr_avl_add(avl, box(391), box(479), nullptr); + avl = gpr_avl_add(avl, box(264), box(480), nullptr); + 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), nullptr); + avl = remove_int(avl, 849); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(299), box(490), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(524), box(496), nullptr); + avl = remove_int(avl, 210); + avl = remove_int(avl, 299); + avl = gpr_avl_add(avl, box(823), box(499), nullptr); + avl = remove_int(avl, 479); + avl = remove_int(avl, 96); + avl = remove_int(avl, 1013); + avl = gpr_avl_add(avl, box(768), box(503), nullptr); + avl = remove_int(avl, 638); + avl = remove_int(avl, 20); + avl = gpr_avl_add(avl, box(663), box(506), nullptr); + avl = remove_int(avl, 882); + avl = gpr_avl_add(avl, box(745), box(508), nullptr); + avl = remove_int(avl, 352); + avl = gpr_avl_add(avl, box(10), box(510), nullptr); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(420), box(512), nullptr); + avl = gpr_avl_add(avl, box(884), box(513), nullptr); + avl = gpr_avl_add(avl, box(993), box(514), nullptr); + avl = gpr_avl_add(avl, box(251), box(515), nullptr); + avl = remove_int(avl, 222); + avl = gpr_avl_add(avl, box(734), box(517), nullptr); + avl = gpr_avl_add(avl, box(952), box(518), nullptr); + 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), nullptr); + avl = remove_int(avl, 897); + avl = gpr_avl_add(avl, box(719), box(526), nullptr); + avl = gpr_avl_add(avl, box(622), box(527), nullptr); + avl = remove_int(avl, 28); + avl = remove_int(avl, 836); + avl = remove_int(avl, 142); + avl = gpr_avl_add(avl, box(445), box(531), nullptr); + avl = gpr_avl_add(avl, box(410), box(532), nullptr); + avl = remove_int(avl, 575); + avl = gpr_avl_add(avl, box(634), box(534), nullptr); + avl = gpr_avl_add(avl, box(906), box(535), nullptr); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(813), box(537), nullptr); + avl = remove_int(avl, 702); + avl = remove_int(avl, 732); + avl = gpr_avl_add(avl, box(105), box(540), nullptr); + avl = gpr_avl_add(avl, box(867), box(541), nullptr); + avl = remove_int(avl, 964); + avl = remove_int(avl, 941); + avl = gpr_avl_add(avl, box(947), box(544), nullptr); + avl = remove_int(avl, 990); + avl = gpr_avl_add(avl, box(816), box(546), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(786), box(552), nullptr); + avl = gpr_avl_add(avl, box(526), box(553), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(749), box(559), nullptr); + avl = gpr_avl_add(avl, box(194), box(560), nullptr); + avl = remove_int(avl, 517); + avl = gpr_avl_add(avl, box(102), box(562), nullptr); + avl = remove_int(avl, 189); + avl = gpr_avl_add(avl, box(927), box(564), nullptr); + avl = remove_int(avl, 846); + avl = remove_int(avl, 130); + avl = gpr_avl_add(avl, box(694), box(567), nullptr); + avl = remove_int(avl, 750); + avl = gpr_avl_add(avl, box(357), box(569), nullptr); + avl = remove_int(avl, 431); + avl = remove_int(avl, 91); + avl = gpr_avl_add(avl, box(640), box(572), nullptr); + avl = remove_int(avl, 4); + avl = gpr_avl_add(avl, box(81), box(574), nullptr); + avl = gpr_avl_add(avl, box(595), box(575), nullptr); + avl = remove_int(avl, 444); + avl = remove_int(avl, 262); + avl = remove_int(avl, 11); + avl = gpr_avl_add(avl, box(192), box(579), nullptr); + avl = gpr_avl_add(avl, box(158), box(580), nullptr); + avl = remove_int(avl, 401); + avl = remove_int(avl, 918); + avl = gpr_avl_add(avl, box(180), box(583), nullptr); + avl = remove_int(avl, 268); + avl = gpr_avl_add(avl, box(1012), box(585), nullptr); + avl = gpr_avl_add(avl, box(90), box(586), nullptr); + avl = gpr_avl_add(avl, box(946), box(587), nullptr); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(874), box(589), nullptr); + avl = gpr_avl_add(avl, box(679), box(590), nullptr); + avl = remove_int(avl, 53); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(646), box(593), nullptr); + avl = gpr_avl_add(avl, box(767), box(594), nullptr); + avl = gpr_avl_add(avl, box(460), box(595), nullptr); + avl = gpr_avl_add(avl, box(852), box(596), nullptr); + avl = gpr_avl_add(avl, box(189), box(597), nullptr); + avl = remove_int(avl, 932); + avl = remove_int(avl, 366); + avl = remove_int(avl, 907); + avl = gpr_avl_add(avl, box(875), box(601), nullptr); + avl = gpr_avl_add(avl, box(434), box(602), nullptr); + avl = gpr_avl_add(avl, box(704), box(603), nullptr); + avl = gpr_avl_add(avl, box(724), box(604), nullptr); + avl = gpr_avl_add(avl, box(930), box(605), nullptr); + avl = gpr_avl_add(avl, box(1000), box(606), nullptr); + avl = remove_int(avl, 479); + avl = gpr_avl_add(avl, box(275), box(608), nullptr); + avl = remove_int(avl, 32); + avl = gpr_avl_add(avl, box(939), box(610), nullptr); + avl = remove_int(avl, 943); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(490), box(613), nullptr); + 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), nullptr); + avl = remove_int(avl, 751); + avl = gpr_avl_add(avl, box(568), box(620), nullptr); + avl = gpr_avl_add(avl, box(120), box(621), nullptr); + avl = gpr_avl_add(avl, box(617), box(622), nullptr); + avl = gpr_avl_add(avl, box(32), box(623), nullptr); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(910), box(625), nullptr); + 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), nullptr); + 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), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(6), box(642), nullptr); + avl = gpr_avl_add(avl, box(680), box(643), nullptr); + avl = remove_int(avl, 741); + avl = remove_int(avl, 309); + avl = remove_int(avl, 272); + avl = gpr_avl_add(avl, box(249), box(647), nullptr); + avl = remove_int(avl, 97); + avl = remove_int(avl, 850); + avl = gpr_avl_add(avl, box(915), box(650), nullptr); + avl = gpr_avl_add(avl, box(816), box(651), nullptr); + avl = gpr_avl_add(avl, box(45), box(652), nullptr); + avl = gpr_avl_add(avl, box(168), box(653), nullptr); + avl = remove_int(avl, 153); + avl = remove_int(avl, 239); + avl = gpr_avl_add(avl, box(684), box(656), nullptr); + avl = gpr_avl_add(avl, box(208), box(657), nullptr); + avl = gpr_avl_add(avl, box(681), box(658), nullptr); + avl = gpr_avl_add(avl, box(609), box(659), nullptr); + avl = gpr_avl_add(avl, box(645), box(660), nullptr); + avl = remove_int(avl, 799); + avl = gpr_avl_add(avl, box(955), box(662), nullptr); + avl = gpr_avl_add(avl, box(946), box(663), nullptr); + avl = gpr_avl_add(avl, box(744), box(664), nullptr); + avl = gpr_avl_add(avl, box(201), box(665), nullptr); + avl = gpr_avl_add(avl, box(136), box(666), nullptr); + avl = remove_int(avl, 357); + avl = gpr_avl_add(avl, box(974), box(668), nullptr); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(1009), box(670), nullptr); + avl = gpr_avl_add(avl, box(517), box(671), nullptr); + avl = remove_int(avl, 491); + avl = gpr_avl_add(avl, box(336), box(673), nullptr); + avl = gpr_avl_add(avl, box(589), box(674), nullptr); + 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), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(25), box(685), nullptr); + avl = remove_int(avl, 278); + avl = gpr_avl_add(avl, box(191), box(687), nullptr); + avl = remove_int(avl, 243); + avl = remove_int(avl, 918); + avl = remove_int(avl, 449); + avl = gpr_avl_add(avl, box(19), box(691), nullptr); + avl = gpr_avl_add(avl, box(762), box(692), nullptr); + avl = gpr_avl_add(avl, box(13), box(693), nullptr); + avl = gpr_avl_add(avl, box(151), box(694), nullptr); + avl = gpr_avl_add(avl, box(152), box(695), nullptr); + avl = gpr_avl_add(avl, box(793), box(696), nullptr); + avl = remove_int(avl, 862); + avl = remove_int(avl, 890); + avl = gpr_avl_add(avl, box(687), box(699), nullptr); + avl = gpr_avl_add(avl, box(509), box(700), nullptr); + avl = gpr_avl_add(avl, box(973), box(701), nullptr); + avl = remove_int(avl, 230); + avl = gpr_avl_add(avl, box(532), box(703), nullptr); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(281), box(705), nullptr); + avl = gpr_avl_add(avl, box(867), box(706), nullptr); + avl = gpr_avl_add(avl, box(359), box(707), nullptr); + avl = remove_int(avl, 425); + avl = gpr_avl_add(avl, box(691), box(709), nullptr); + avl = gpr_avl_add(avl, box(163), box(710), nullptr); + avl = gpr_avl_add(avl, box(502), box(711), nullptr); + avl = remove_int(avl, 674); + avl = gpr_avl_add(avl, box(697), box(713), nullptr); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(968), box(715), nullptr); + avl = gpr_avl_add(avl, box(48), box(716), nullptr); + avl = remove_int(avl, 543); + avl = gpr_avl_add(avl, box(35), box(718), nullptr); + avl = gpr_avl_add(avl, box(751), box(719), nullptr); + avl = gpr_avl_add(avl, box(478), box(720), nullptr); + avl = remove_int(avl, 797); + avl = remove_int(avl, 309); + avl = gpr_avl_add(avl, box(927), box(723), nullptr); + avl = remove_int(avl, 504); + avl = gpr_avl_add(avl, box(286), box(725), nullptr); + avl = gpr_avl_add(avl, box(413), box(726), nullptr); + avl = gpr_avl_add(avl, box(599), box(727), nullptr); + avl = remove_int(avl, 105); + avl = remove_int(avl, 605); + avl = gpr_avl_add(avl, box(632), box(730), nullptr); + avl = gpr_avl_add(avl, box(133), box(731), nullptr); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(958), box(733), nullptr); + avl = gpr_avl_add(avl, box(729), box(734), nullptr); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(694), box(736), nullptr); + avl = gpr_avl_add(avl, box(505), box(737), nullptr); + avl = remove_int(avl, 63); + avl = remove_int(avl, 714); + avl = gpr_avl_add(avl, box(1002), box(740), nullptr); + avl = remove_int(avl, 211); + avl = gpr_avl_add(avl, box(765), box(742), nullptr); + avl = gpr_avl_add(avl, box(455), box(743), nullptr); + avl = remove_int(avl, 59); + avl = remove_int(avl, 224); + avl = gpr_avl_add(avl, box(586), box(746), nullptr); + avl = gpr_avl_add(avl, box(348), box(747), nullptr); + avl = remove_int(avl, 10); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(968), box(750), nullptr); + avl = gpr_avl_add(avl, box(923), box(751), nullptr); + avl = remove_int(avl, 573); + avl = remove_int(avl, 617); + avl = gpr_avl_add(avl, box(812), box(754), nullptr); + avl = gpr_avl_add(avl, box(179), box(755), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(927), box(761), nullptr); + avl = gpr_avl_add(avl, box(454), box(762), nullptr); + avl = gpr_avl_add(avl, box(217), box(763), nullptr); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(180), box(765), nullptr); + avl = gpr_avl_add(avl, box(319), box(766), nullptr); + avl = remove_int(avl, 92); + avl = gpr_avl_add(avl, box(483), box(768), nullptr); + 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), nullptr); + avl = remove_int(avl, 807); + avl = gpr_avl_add(avl, box(463), box(775), nullptr); + avl = gpr_avl_add(avl, box(271), box(776), nullptr); + avl = gpr_avl_add(avl, box(644), box(777), nullptr); + avl = remove_int(avl, 618); + avl = gpr_avl_add(avl, box(166), box(779), nullptr); + avl = gpr_avl_add(avl, box(538), box(780), nullptr); + avl = remove_int(avl, 606); + avl = gpr_avl_add(avl, box(425), box(782), nullptr); + avl = remove_int(avl, 725); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(155), box(785), nullptr); + avl = remove_int(avl, 889); + avl = gpr_avl_add(avl, box(653), box(787), nullptr); + avl = remove_int(avl, 386); + avl = gpr_avl_add(avl, box(142), box(789), nullptr); + avl = remove_int(avl, 107); + avl = remove_int(avl, 603); + avl = remove_int(avl, 971); + avl = gpr_avl_add(avl, box(80), box(793), nullptr); + avl = gpr_avl_add(avl, box(61), box(794), nullptr); + avl = gpr_avl_add(avl, box(693), box(795), nullptr); + avl = gpr_avl_add(avl, box(592), box(796), nullptr); + avl = gpr_avl_add(avl, box(433), box(797), nullptr); + avl = gpr_avl_add(avl, box(973), box(798), nullptr); + avl = remove_int(avl, 901); + avl = remove_int(avl, 340); + avl = remove_int(avl, 709); + avl = gpr_avl_add(avl, box(224), box(802), nullptr); + avl = remove_int(avl, 120); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(780), box(805), nullptr); + avl = gpr_avl_add(avl, box(867), box(806), nullptr); + avl = gpr_avl_add(avl, box(756), box(807), nullptr); + avl = gpr_avl_add(avl, box(583), box(808), nullptr); + avl = gpr_avl_add(avl, box(356), box(809), nullptr); + avl = gpr_avl_add(avl, box(58), box(810), nullptr); + avl = remove_int(avl, 219); + avl = gpr_avl_add(avl, box(301), box(812), nullptr); + avl = remove_int(avl, 643); + avl = remove_int(avl, 787); + avl = remove_int(avl, 583); + avl = remove_int(avl, 552); + avl = remove_int(avl, 308); + avl = remove_int(avl, 608); + avl = remove_int(avl, 363); + avl = remove_int(avl, 690); + avl = gpr_avl_add(avl, box(233), box(821), nullptr); + avl = gpr_avl_add(avl, box(479), box(822), nullptr); + avl = gpr_avl_add(avl, box(323), box(823), nullptr); + avl = gpr_avl_add(avl, box(802), box(824), nullptr); + avl = remove_int(avl, 682); + avl = remove_int(avl, 705); + avl = remove_int(avl, 487); + avl = gpr_avl_add(avl, box(530), box(828), nullptr); + avl = gpr_avl_add(avl, box(232), box(829), nullptr); + avl = remove_int(avl, 627); + avl = gpr_avl_add(avl, box(396), box(831), nullptr); + avl = gpr_avl_add(avl, box(61), box(832), nullptr); + avl = gpr_avl_add(avl, box(932), box(833), nullptr); + avl = gpr_avl_add(avl, box(108), box(834), nullptr); + avl = gpr_avl_add(avl, box(524), box(835), nullptr); + avl = remove_int(avl, 390); + avl = remove_int(avl, 307); + avl = gpr_avl_add(avl, box(722), box(838), nullptr); + avl = gpr_avl_add(avl, box(907), box(839), nullptr); + avl = remove_int(avl, 286); + avl = remove_int(avl, 337); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(973), box(843), nullptr); + avl = remove_int(avl, 930); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(997), box(846), nullptr); + avl = gpr_avl_add(avl, box(689), box(847), nullptr); + avl = remove_int(avl, 318); + avl = gpr_avl_add(avl, box(703), box(849), nullptr); + avl = gpr_avl_add(avl, box(868), box(850), nullptr); + avl = gpr_avl_add(avl, box(200), box(851), nullptr); + avl = gpr_avl_add(avl, box(960), box(852), nullptr); + avl = gpr_avl_add(avl, box(80), box(853), nullptr); + avl = remove_int(avl, 113); + avl = gpr_avl_add(avl, box(135), box(855), nullptr); + avl = remove_int(avl, 529); + avl = gpr_avl_add(avl, box(366), box(857), nullptr); + avl = remove_int(avl, 272); + avl = gpr_avl_add(avl, box(921), box(859), nullptr); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(712), box(861), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(29), box(867), nullptr); + avl = gpr_avl_add(avl, box(180), box(868), nullptr); + avl = gpr_avl_add(avl, box(983), box(869), nullptr); + avl = gpr_avl_add(avl, box(72), box(870), nullptr); + avl = gpr_avl_add(avl, box(693), box(871), nullptr); + avl = gpr_avl_add(avl, box(567), box(872), nullptr); + avl = remove_int(avl, 549); + avl = remove_int(avl, 351); + avl = gpr_avl_add(avl, box(1019), box(875), nullptr); + avl = remove_int(avl, 585); + avl = remove_int(avl, 294); + avl = remove_int(avl, 61); + avl = gpr_avl_add(avl, box(409), box(879), nullptr); + avl = gpr_avl_add(avl, box(984), box(880), nullptr); + avl = gpr_avl_add(avl, box(830), box(881), nullptr); + avl = remove_int(avl, 579); + avl = gpr_avl_add(avl, box(672), box(883), nullptr); + avl = remove_int(avl, 968); + + gpr_avl_unref(avl, nullptr); +} + +static void test_badcase3(void) { + gpr_avl avl; + + gpr_log(GPR_DEBUG, "test_badcase3"); + + avl = gpr_avl_create(&int_int_vtable); + avl = remove_int(avl, 624); + avl = gpr_avl_add(avl, box(59), box(2), nullptr); + avl = gpr_avl_add(avl, box(494), box(3), nullptr); + avl = gpr_avl_add(avl, box(226), box(4), nullptr); + avl = remove_int(avl, 524); + avl = gpr_avl_add(avl, box(540), box(6), nullptr); + avl = remove_int(avl, 1008); + avl = gpr_avl_add(avl, box(502), box(8), nullptr); + avl = remove_int(avl, 267); + avl = remove_int(avl, 764); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(8), box(12), nullptr); + avl = remove_int(avl, 291); + avl = remove_int(avl, 796); + avl = remove_int(avl, 1002); + avl = gpr_avl_add(avl, box(778), box(16), nullptr); + avl = remove_int(avl, 621); + avl = remove_int(avl, 891); + avl = remove_int(avl, 880); + avl = gpr_avl_add(avl, box(197), box(20), nullptr); + avl = gpr_avl_add(avl, box(441), box(21), nullptr); + avl = gpr_avl_add(avl, box(719), box(22), nullptr); + avl = remove_int(avl, 109); + avl = gpr_avl_add(avl, box(458), box(24), nullptr); + avl = remove_int(avl, 86); + avl = gpr_avl_add(avl, box(897), box(26), nullptr); + avl = gpr_avl_add(avl, box(997), box(27), nullptr); + avl = remove_int(avl, 235); + avl = remove_int(avl, 425); + avl = remove_int(avl, 186); + avl = gpr_avl_add(avl, box(887), box(31), nullptr); + avl = gpr_avl_add(avl, box(1005), box(32), nullptr); + avl = gpr_avl_add(avl, box(778), box(33), nullptr); + avl = gpr_avl_add(avl, box(575), box(34), nullptr); + avl = remove_int(avl, 966); + avl = remove_int(avl, 1015); + avl = gpr_avl_add(avl, box(486), box(37), nullptr); + avl = gpr_avl_add(avl, box(809), box(38), nullptr); + avl = gpr_avl_add(avl, box(907), box(39), nullptr); + avl = gpr_avl_add(avl, box(971), box(40), nullptr); + avl = remove_int(avl, 441); + avl = remove_int(avl, 498); + avl = gpr_avl_add(avl, box(727), box(43), nullptr); + avl = remove_int(avl, 679); + avl = remove_int(avl, 740); + avl = remove_int(avl, 532); + avl = gpr_avl_add(avl, box(805), box(47), nullptr); + avl = remove_int(avl, 64); + avl = gpr_avl_add(avl, box(362), box(49), nullptr); + avl = gpr_avl_add(avl, box(170), box(50), nullptr); + avl = gpr_avl_add(avl, box(389), box(51), nullptr); + avl = gpr_avl_add(avl, box(689), box(52), nullptr); + avl = remove_int(avl, 871); + avl = gpr_avl_add(avl, box(447), box(54), nullptr); + avl = remove_int(avl, 718); + avl = gpr_avl_add(avl, box(724), box(56), nullptr); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(550), box(58), nullptr); + avl = remove_int(avl, 932); + avl = gpr_avl_add(avl, box(47), box(60), nullptr); + avl = remove_int(avl, 46); + avl = remove_int(avl, 229); + avl = gpr_avl_add(avl, box(68), box(63), nullptr); + avl = gpr_avl_add(avl, box(387), box(64), nullptr); + avl = remove_int(avl, 933); + avl = remove_int(avl, 736); + avl = remove_int(avl, 719); + avl = gpr_avl_add(avl, box(150), box(68), nullptr); + avl = remove_int(avl, 875); + avl = remove_int(avl, 298); + avl = gpr_avl_add(avl, box(991), box(71), nullptr); + avl = remove_int(avl, 705); + avl = gpr_avl_add(avl, box(197), box(73), nullptr); + avl = gpr_avl_add(avl, box(101), box(74), nullptr); + avl = remove_int(avl, 436); + avl = gpr_avl_add(avl, box(755), box(76), nullptr); + avl = gpr_avl_add(avl, box(727), box(77), nullptr); + avl = remove_int(avl, 309); + avl = remove_int(avl, 253); + avl = gpr_avl_add(avl, box(203), box(80), nullptr); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(461), box(82), nullptr); + avl = remove_int(avl, 316); + avl = remove_int(avl, 493); + avl = gpr_avl_add(avl, box(184), box(85), nullptr); + avl = remove_int(avl, 737); + avl = gpr_avl_add(avl, box(790), box(87), nullptr); + avl = gpr_avl_add(avl, box(335), box(88), nullptr); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(69), box(90), nullptr); + avl = remove_int(avl, 585); + avl = remove_int(avl, 543); + avl = gpr_avl_add(avl, box(784), box(93), nullptr); + avl = gpr_avl_add(avl, box(60), box(94), nullptr); + avl = gpr_avl_add(avl, box(525), box(95), nullptr); + avl = gpr_avl_add(avl, box(177), box(96), nullptr); + avl = gpr_avl_add(avl, box(178), box(97), nullptr); + avl = gpr_avl_add(avl, box(683), box(98), nullptr); + avl = gpr_avl_add(avl, box(226), box(99), nullptr); + avl = gpr_avl_add(avl, box(662), box(100), nullptr); + avl = remove_int(avl, 944); + avl = gpr_avl_add(avl, box(562), box(102), nullptr); + avl = gpr_avl_add(avl, box(793), box(103), nullptr); + avl = remove_int(avl, 673); + avl = gpr_avl_add(avl, box(310), box(105), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(483), box(111), nullptr); + avl = gpr_avl_add(avl, box(84), box(112), nullptr); + avl = remove_int(avl, 109); + avl = gpr_avl_add(avl, box(132), box(114), nullptr); + avl = gpr_avl_add(avl, box(920), box(115), nullptr); + avl = remove_int(avl, 746); + avl = gpr_avl_add(avl, box(145), box(117), nullptr); + avl = gpr_avl_add(avl, box(526), box(118), nullptr); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(332), box(120), nullptr); + avl = gpr_avl_add(avl, box(918), box(121), nullptr); + avl = remove_int(avl, 339); + avl = gpr_avl_add(avl, box(809), box(123), nullptr); + avl = gpr_avl_add(avl, box(742), box(124), nullptr); + avl = gpr_avl_add(avl, box(718), box(125), nullptr); + avl = remove_int(avl, 988); + avl = remove_int(avl, 531); + avl = remove_int(avl, 840); + avl = gpr_avl_add(avl, box(816), box(129), nullptr); + avl = gpr_avl_add(avl, box(976), box(130), nullptr); + avl = remove_int(avl, 743); + avl = remove_int(avl, 528); + avl = remove_int(avl, 982); + avl = gpr_avl_add(avl, box(803), box(134), nullptr); + avl = gpr_avl_add(avl, box(205), box(135), nullptr); + avl = gpr_avl_add(avl, box(584), box(136), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(333), box(143), nullptr); + avl = remove_int(avl, 439); + avl = gpr_avl_add(avl, box(35), box(145), nullptr); + avl = gpr_avl_add(avl, box(837), box(146), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(116), box(154), nullptr); + avl = gpr_avl_add(avl, box(446), box(155), nullptr); + avl = remove_int(avl, 91); + avl = remove_int(avl, 721); + avl = remove_int(avl, 537); + avl = gpr_avl_add(avl, box(448), box(159), nullptr); + avl = remove_int(avl, 155); + avl = remove_int(avl, 344); + avl = remove_int(avl, 237); + avl = gpr_avl_add(avl, box(309), box(163), nullptr); + avl = gpr_avl_add(avl, box(434), box(164), nullptr); + avl = gpr_avl_add(avl, box(277), box(165), nullptr); + avl = remove_int(avl, 233); + avl = gpr_avl_add(avl, box(275), box(167), nullptr); + avl = gpr_avl_add(avl, box(218), box(168), nullptr); + avl = gpr_avl_add(avl, box(76), box(169), nullptr); + avl = gpr_avl_add(avl, box(898), box(170), nullptr); + avl = remove_int(avl, 771); + avl = gpr_avl_add(avl, box(237), box(172), nullptr); + avl = remove_int(avl, 327); + avl = gpr_avl_add(avl, box(499), box(174), nullptr); + 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), nullptr); + avl = remove_int(avl, 389); + avl = gpr_avl_add(avl, box(708), box(183), nullptr); + avl = gpr_avl_add(avl, box(594), box(184), nullptr); + avl = gpr_avl_add(avl, box(942), box(185), nullptr); + avl = gpr_avl_add(avl, box(282), box(186), nullptr); + avl = remove_int(avl, 434); + avl = remove_int(avl, 134); + avl = remove_int(avl, 270); + avl = remove_int(avl, 512); + avl = remove_int(avl, 265); + avl = remove_int(avl, 21); + avl = remove_int(avl, 193); + avl = remove_int(avl, 797); + avl = remove_int(avl, 347); + avl = gpr_avl_add(avl, box(99), box(196), nullptr); + avl = gpr_avl_add(avl, box(161), box(197), nullptr); + avl = remove_int(avl, 484); + avl = gpr_avl_add(avl, box(72), box(199), nullptr); + avl = remove_int(avl, 629); + avl = gpr_avl_add(avl, box(522), box(201), nullptr); + avl = remove_int(avl, 679); + avl = gpr_avl_add(avl, box(407), box(203), nullptr); + avl = remove_int(avl, 693); + avl = gpr_avl_add(avl, box(424), box(205), nullptr); + avl = gpr_avl_add(avl, box(651), box(206), nullptr); + avl = gpr_avl_add(avl, box(927), box(207), nullptr); + avl = remove_int(avl, 553); + avl = gpr_avl_add(avl, box(128), box(209), nullptr); + avl = gpr_avl_add(avl, box(616), box(210), nullptr); + avl = gpr_avl_add(avl, box(690), box(211), nullptr); + avl = remove_int(avl, 241); + avl = remove_int(avl, 179); + avl = gpr_avl_add(avl, box(697), box(214), nullptr); + avl = remove_int(avl, 779); + avl = gpr_avl_add(avl, box(241), box(216), nullptr); + avl = remove_int(avl, 190); + avl = remove_int(avl, 210); + avl = gpr_avl_add(avl, box(711), box(219), nullptr); + avl = remove_int(avl, 251); + avl = remove_int(avl, 61); + avl = gpr_avl_add(avl, box(800), box(222), nullptr); + avl = remove_int(avl, 551); + avl = gpr_avl_add(avl, box(61), box(224), nullptr); + avl = gpr_avl_add(avl, box(656), box(225), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(125), box(231), nullptr); + avl = remove_int(avl, 107); + avl = gpr_avl_add(avl, box(938), box(233), nullptr); + avl = gpr_avl_add(avl, box(914), box(234), nullptr); + avl = gpr_avl_add(avl, box(197), box(235), nullptr); + avl = remove_int(avl, 736); + avl = gpr_avl_add(avl, box(20), box(237), nullptr); + avl = remove_int(avl, 224); + avl = remove_int(avl, 841); + avl = gpr_avl_add(avl, box(226), box(240), nullptr); + avl = remove_int(avl, 963); + avl = remove_int(avl, 796); + avl = remove_int(avl, 728); + avl = gpr_avl_add(avl, box(855), box(244), nullptr); + avl = gpr_avl_add(avl, box(769), box(245), nullptr); + avl = gpr_avl_add(avl, box(631), box(246), nullptr); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(187), box(248), nullptr); + avl = gpr_avl_add(avl, box(31), box(249), nullptr); + avl = remove_int(avl, 163); + avl = gpr_avl_add(avl, box(218), box(251), nullptr); + avl = gpr_avl_add(avl, box(488), box(252), nullptr); + avl = gpr_avl_add(avl, box(387), box(253), nullptr); + avl = gpr_avl_add(avl, box(809), box(254), nullptr); + avl = gpr_avl_add(avl, box(997), box(255), nullptr); + avl = remove_int(avl, 678); + avl = gpr_avl_add(avl, box(368), box(257), nullptr); + avl = gpr_avl_add(avl, box(220), box(258), nullptr); + avl = gpr_avl_add(avl, box(373), box(259), nullptr); + 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), nullptr); + avl = remove_int(avl, 254); + avl = remove_int(avl, 456); + avl = gpr_avl_add(avl, box(906), box(267), nullptr); + avl = remove_int(avl, 711); + avl = gpr_avl_add(avl, box(632), box(269), nullptr); + avl = remove_int(avl, 474); + avl = gpr_avl_add(avl, box(508), box(271), nullptr); + avl = gpr_avl_add(avl, box(518), box(272), nullptr); + avl = remove_int(avl, 579); + avl = remove_int(avl, 948); + avl = gpr_avl_add(avl, box(789), box(275), nullptr); + avl = gpr_avl_add(avl, box(48), box(276), nullptr); + avl = gpr_avl_add(avl, box(256), box(277), nullptr); + avl = gpr_avl_add(avl, box(754), box(278), nullptr); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(679), box(280), nullptr); + avl = gpr_avl_add(avl, box(606), box(281), nullptr); + avl = remove_int(avl, 941); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(758), box(284), nullptr); + avl = remove_int(avl, 101); + avl = gpr_avl_add(avl, box(244), box(286), nullptr); + avl = gpr_avl_add(avl, box(337), box(287), nullptr); + avl = gpr_avl_add(avl, box(461), box(288), nullptr); + avl = remove_int(avl, 476); + avl = gpr_avl_add(avl, box(845), box(290), nullptr); + avl = remove_int(avl, 160); + avl = gpr_avl_add(avl, box(690), box(292), nullptr); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(869), box(294), nullptr); + avl = gpr_avl_add(avl, box(1019), box(295), nullptr); + avl = remove_int(avl, 591); + avl = remove_int(avl, 635); + avl = remove_int(avl, 67); + avl = gpr_avl_add(avl, box(113), box(299), nullptr); + avl = remove_int(avl, 305); + avl = gpr_avl_add(avl, box(10), box(301), nullptr); + avl = remove_int(avl, 823); + avl = remove_int(avl, 288); + avl = remove_int(avl, 239); + avl = gpr_avl_add(avl, box(646), box(305), nullptr); + avl = gpr_avl_add(avl, box(1006), box(306), nullptr); + avl = gpr_avl_add(avl, box(954), box(307), nullptr); + avl = gpr_avl_add(avl, box(199), box(308), nullptr); + avl = gpr_avl_add(avl, box(69), box(309), nullptr); + avl = gpr_avl_add(avl, box(984), box(310), nullptr); + avl = remove_int(avl, 568); + avl = remove_int(avl, 666); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(845), box(314), nullptr); + avl = remove_int(avl, 535); + avl = remove_int(avl, 365); + avl = remove_int(avl, 676); + avl = remove_int(avl, 892); + avl = remove_int(avl, 425); + avl = remove_int(avl, 704); + avl = remove_int(avl, 168); + avl = gpr_avl_add(avl, box(853), box(322), nullptr); + avl = gpr_avl_add(avl, box(335), box(323), nullptr); + avl = gpr_avl_add(avl, box(961), box(324), nullptr); + avl = gpr_avl_add(avl, box(73), box(325), nullptr); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(449), box(327), nullptr); + avl = remove_int(avl, 821); + avl = gpr_avl_add(avl, box(845), box(329), nullptr); + avl = remove_int(avl, 637); + avl = gpr_avl_add(avl, box(769), box(331), nullptr); + avl = gpr_avl_add(avl, box(901), box(332), nullptr); + avl = remove_int(avl, 142); + avl = remove_int(avl, 361); + avl = remove_int(avl, 876); + avl = gpr_avl_add(avl, box(614), box(336), nullptr); + avl = gpr_avl_add(avl, box(729), box(337), nullptr); + avl = remove_int(avl, 120); + avl = remove_int(avl, 473); + avl = remove_int(avl, 445); + avl = gpr_avl_add(avl, box(978), box(341), nullptr); + avl = gpr_avl_add(avl, box(164), box(342), nullptr); + avl = gpr_avl_add(avl, box(1), box(343), nullptr); + avl = remove_int(avl, 890); + avl = gpr_avl_add(avl, box(605), box(345), nullptr); + avl = gpr_avl_add(avl, box(178), box(346), nullptr); + avl = gpr_avl_add(avl, box(481), box(347), nullptr); + avl = gpr_avl_add(avl, box(772), box(348), nullptr); + avl = remove_int(avl, 824); + avl = remove_int(avl, 167); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(698), box(352), nullptr); + avl = gpr_avl_add(avl, box(202), box(353), nullptr); + avl = gpr_avl_add(avl, box(921), box(354), nullptr); + avl = gpr_avl_add(avl, box(875), box(355), nullptr); + avl = remove_int(avl, 197); + avl = remove_int(avl, 232); + avl = gpr_avl_add(avl, box(209), box(358), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(113), box(365), nullptr); + avl = remove_int(avl, 767); + avl = gpr_avl_add(avl, box(586), box(367), nullptr); + avl = gpr_avl_add(avl, box(121), box(368), nullptr); + avl = remove_int(avl, 235); + avl = remove_int(avl, 439); + avl = remove_int(avl, 360); + avl = gpr_avl_add(avl, box(916), box(372), nullptr); + avl = remove_int(avl, 999); + avl = gpr_avl_add(avl, box(825), box(374), nullptr); + avl = gpr_avl_add(avl, box(177), box(375), nullptr); + avl = remove_int(avl, 204); + avl = remove_int(avl, 92); + avl = gpr_avl_add(avl, box(794), box(378), nullptr); + avl = gpr_avl_add(avl, box(463), box(379), nullptr); + avl = gpr_avl_add(avl, box(472), box(380), nullptr); + avl = remove_int(avl, 235); + avl = gpr_avl_add(avl, box(840), box(382), nullptr); + avl = remove_int(avl, 657); + avl = gpr_avl_add(avl, box(586), box(384), nullptr); + avl = gpr_avl_add(avl, box(979), box(385), nullptr); + avl = remove_int(avl, 979); + avl = gpr_avl_add(avl, box(639), box(387), nullptr); + avl = remove_int(avl, 907); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(913), box(390), nullptr); + avl = gpr_avl_add(avl, box(566), box(391), nullptr); + avl = gpr_avl_add(avl, box(883), box(392), nullptr); + avl = gpr_avl_add(avl, box(552), box(393), nullptr); + avl = gpr_avl_add(avl, box(16), box(394), nullptr); + avl = remove_int(avl, 60); + avl = gpr_avl_add(avl, box(567), box(396), nullptr); + avl = gpr_avl_add(avl, box(705), box(397), nullptr); + avl = gpr_avl_add(avl, box(94), box(398), nullptr); + avl = remove_int(avl, 321); + avl = gpr_avl_add(avl, box(207), box(400), nullptr); + avl = gpr_avl_add(avl, box(682), box(401), nullptr); + avl = gpr_avl_add(avl, box(592), box(402), nullptr); + avl = gpr_avl_add(avl, box(10), box(403), nullptr); + avl = remove_int(avl, 911); + avl = remove_int(avl, 161); + avl = gpr_avl_add(avl, box(86), box(406), nullptr); + avl = remove_int(avl, 893); + avl = remove_int(avl, 362); + avl = gpr_avl_add(avl, box(599), box(409), nullptr); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(867), box(411), nullptr); + avl = remove_int(avl, 955); + avl = gpr_avl_add(avl, box(341), box(413), nullptr); + avl = gpr_avl_add(avl, box(887), box(414), nullptr); + avl = remove_int(avl, 706); + avl = gpr_avl_add(avl, box(939), box(416), nullptr); + 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), nullptr); + avl = remove_int(avl, 848); + avl = gpr_avl_add(avl, box(235), box(423), nullptr); + avl = remove_int(avl, 617); + avl = gpr_avl_add(avl, box(565), box(425), nullptr); + avl = remove_int(avl, 469); + avl = gpr_avl_add(avl, box(988), box(427), nullptr); + avl = remove_int(avl, 957); + avl = gpr_avl_add(avl, box(426), box(429), nullptr); + avl = remove_int(avl, 967); + avl = gpr_avl_add(avl, box(890), box(431), nullptr); + avl = gpr_avl_add(avl, box(473), box(432), nullptr); + 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), nullptr); + avl = remove_int(avl, 882); + avl = remove_int(avl, 782); + avl = gpr_avl_add(avl, box(408), box(442), nullptr); + avl = gpr_avl_add(avl, box(728), box(443), nullptr); + avl = remove_int(avl, 27); + avl = gpr_avl_add(avl, box(137), box(445), nullptr); + avl = gpr_avl_add(avl, box(239), box(446), nullptr); + avl = remove_int(avl, 854); + avl = gpr_avl_add(avl, box(104), box(448), nullptr); + avl = gpr_avl_add(avl, box(823), box(449), nullptr); + avl = gpr_avl_add(avl, box(524), box(450), nullptr); + avl = gpr_avl_add(avl, box(995), box(451), nullptr); + avl = remove_int(avl, 422); + avl = remove_int(avl, 220); + avl = gpr_avl_add(avl, box(856), box(454), nullptr); + avl = remove_int(avl, 332); + avl = gpr_avl_add(avl, box(679), box(456), nullptr); + avl = remove_int(avl, 18); + avl = gpr_avl_add(avl, box(837), box(458), nullptr); + avl = remove_int(avl, 405); + avl = remove_int(avl, 877); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(547), box(462), nullptr); + avl = remove_int(avl, 805); + avl = remove_int(avl, 862); + avl = gpr_avl_add(avl, box(75), box(465), nullptr); + avl = remove_int(avl, 41); + avl = gpr_avl_add(avl, box(310), box(467), nullptr); + avl = remove_int(avl, 855); + avl = gpr_avl_add(avl, box(20), box(469), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(96), box(475), nullptr); + avl = remove_int(avl, 854); + avl = gpr_avl_add(avl, box(65), box(477), nullptr); + avl = gpr_avl_add(avl, box(573), box(478), nullptr); + avl = gpr_avl_add(avl, box(4), box(479), nullptr); + avl = gpr_avl_add(avl, box(451), box(480), nullptr); + avl = gpr_avl_add(avl, box(774), box(481), nullptr); + avl = gpr_avl_add(avl, box(126), box(482), nullptr); + avl = remove_int(avl, 956); + avl = remove_int(avl, 591); + avl = remove_int(avl, 644); + avl = gpr_avl_add(avl, box(304), box(486), nullptr); + avl = remove_int(avl, 620); + avl = remove_int(avl, 394); + avl = gpr_avl_add(avl, box(1002), box(489), nullptr); + avl = gpr_avl_add(avl, box(837), box(490), nullptr); + avl = remove_int(avl, 485); + avl = gpr_avl_add(avl, box(1005), box(492), nullptr); + avl = remove_int(avl, 21); + avl = gpr_avl_add(avl, box(396), box(494), nullptr); + avl = remove_int(avl, 966); + avl = gpr_avl_add(avl, box(105), box(496), nullptr); + avl = gpr_avl_add(avl, box(316), box(497), nullptr); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(188), box(499), nullptr); + avl = remove_int(avl, 200); + avl = gpr_avl_add(avl, box(98), box(501), nullptr); + avl = gpr_avl_add(avl, box(831), box(502), nullptr); + avl = gpr_avl_add(avl, box(227), box(503), nullptr); + avl = gpr_avl_add(avl, box(220), box(504), nullptr); + avl = remove_int(avl, 715); + avl = remove_int(avl, 279); + avl = gpr_avl_add(avl, box(701), box(507), nullptr); + avl = gpr_avl_add(avl, box(726), box(508), nullptr); + avl = gpr_avl_add(avl, box(815), box(509), nullptr); + avl = gpr_avl_add(avl, box(749), box(510), nullptr); + 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), nullptr); + avl = remove_int(avl, 59); + avl = gpr_avl_add(avl, box(168), box(517), nullptr); + avl = remove_int(avl, 337); + avl = gpr_avl_add(avl, box(69), box(519), nullptr); + avl = remove_int(avl, 600); + avl = gpr_avl_add(avl, box(591), box(521), nullptr); + avl = gpr_avl_add(avl, box(960), box(522), nullptr); + avl = gpr_avl_add(avl, box(116), box(523), nullptr); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(760), box(525), nullptr); + avl = gpr_avl_add(avl, box(664), box(526), nullptr); + avl = gpr_avl_add(avl, box(547), box(527), nullptr); + avl = remove_int(avl, 922); + avl = gpr_avl_add(avl, box(290), box(529), nullptr); + avl = gpr_avl_add(avl, box(859), box(530), nullptr); + avl = gpr_avl_add(avl, box(49), box(531), nullptr); + avl = remove_int(avl, 455); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(613), box(534), nullptr); + avl = gpr_avl_add(avl, box(326), box(535), nullptr); + avl = remove_int(avl, 615); + avl = gpr_avl_add(avl, box(45), box(537), nullptr); + avl = gpr_avl_add(avl, box(162), box(538), nullptr); + avl = gpr_avl_add(avl, box(189), box(539), nullptr); + avl = remove_int(avl, 68); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(608), box(542), nullptr); + avl = remove_int(avl, 821); + avl = gpr_avl_add(avl, box(978), box(544), nullptr); + avl = gpr_avl_add(avl, box(892), box(545), nullptr); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(708), box(547), nullptr); + avl = remove_int(avl, 135); + avl = remove_int(avl, 124); + avl = gpr_avl_add(avl, box(301), box(550), nullptr); + avl = gpr_avl_add(avl, box(939), box(551), nullptr); + avl = gpr_avl_add(avl, box(344), box(552), nullptr); + avl = remove_int(avl, 443); + avl = remove_int(avl, 122); + avl = gpr_avl_add(avl, box(636), box(555), nullptr); + avl = remove_int(avl, 558); + avl = gpr_avl_add(avl, box(923), box(557), nullptr); + avl = remove_int(avl, 827); + avl = gpr_avl_add(avl, box(649), box(559), nullptr); + avl = gpr_avl_add(avl, box(808), box(560), nullptr); + avl = remove_int(avl, 570); + avl = remove_int(avl, 434); + avl = gpr_avl_add(avl, box(40), box(563), nullptr); + avl = gpr_avl_add(avl, box(725), box(564), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(512), box(572), nullptr); + 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), nullptr); + avl = remove_int(avl, 770); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(602), box(581), nullptr); + avl = remove_int(avl, 251); + avl = gpr_avl_add(avl, box(303), box(583), nullptr); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(714), box(585), nullptr); + avl = remove_int(avl, 800); + avl = gpr_avl_add(avl, box(266), box(587), nullptr); + avl = gpr_avl_add(avl, box(555), box(588), nullptr); + avl = remove_int(avl, 604); + avl = remove_int(avl, 163); + avl = remove_int(avl, 497); + avl = gpr_avl_add(avl, box(296), box(592), nullptr); + avl = remove_int(avl, 129); + avl = gpr_avl_add(avl, box(656), box(594), nullptr); + avl = remove_int(avl, 769); + avl = remove_int(avl, 941); + avl = gpr_avl_add(avl, box(775), box(597), nullptr); + avl = gpr_avl_add(avl, box(846), box(598), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(575), box(604), nullptr); + avl = gpr_avl_add(avl, box(620), box(605), nullptr); + avl = remove_int(avl, 100); + avl = remove_int(avl, 667); + avl = gpr_avl_add(avl, box(138), box(608), nullptr); + avl = gpr_avl_add(avl, box(566), box(609), nullptr); + avl = gpr_avl_add(avl, box(673), box(610), nullptr); + avl = gpr_avl_add(avl, box(178), box(611), nullptr); + avl = remove_int(avl, 659); + avl = gpr_avl_add(avl, box(759), box(613), nullptr); + avl = gpr_avl_add(avl, box(1008), box(614), nullptr); + avl = remove_int(avl, 116); + avl = gpr_avl_add(avl, box(608), box(616), nullptr); + avl = gpr_avl_add(avl, box(339), box(617), nullptr); + avl = gpr_avl_add(avl, box(197), box(618), nullptr); + avl = remove_int(avl, 25); + avl = remove_int(avl, 628); + avl = gpr_avl_add(avl, box(487), box(621), nullptr); + avl = remove_int(avl, 739); + avl = remove_int(avl, 100); + avl = remove_int(avl, 928); + avl = gpr_avl_add(avl, box(647), box(625), nullptr); + avl = remove_int(avl, 978); + avl = remove_int(avl, 143); + avl = remove_int(avl, 755); + avl = gpr_avl_add(avl, box(71), box(629), nullptr); + avl = remove_int(avl, 205); + avl = gpr_avl_add(avl, box(501), box(631), nullptr); + 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), nullptr); + avl = remove_int(avl, 264); + avl = gpr_avl_add(avl, box(69), box(639), nullptr); + avl = remove_int(avl, 73); + avl = gpr_avl_add(avl, box(745), box(641), nullptr); + avl = remove_int(avl, 518); + avl = remove_int(avl, 641); + avl = remove_int(avl, 768); + avl = gpr_avl_add(avl, box(988), box(645), nullptr); + avl = gpr_avl_add(avl, box(899), box(646), nullptr); + avl = remove_int(avl, 763); + avl = remove_int(avl, 281); + avl = remove_int(avl, 496); + avl = gpr_avl_add(avl, box(445), box(650), nullptr); + avl = remove_int(avl, 905); + avl = gpr_avl_add(avl, box(275), box(652), nullptr); + avl = gpr_avl_add(avl, box(137), box(653), nullptr); + avl = remove_int(avl, 642); + avl = gpr_avl_add(avl, box(708), box(655), nullptr); + avl = remove_int(avl, 922); + avl = gpr_avl_add(avl, box(743), box(657), nullptr); + avl = remove_int(avl, 295); + avl = remove_int(avl, 665); + avl = remove_int(avl, 48); + avl = gpr_avl_add(avl, box(1012), box(661), nullptr); + avl = remove_int(avl, 71); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(319), box(664), nullptr); + avl = remove_int(avl, 632); + avl = gpr_avl_add(avl, box(137), box(666), nullptr); + avl = gpr_avl_add(avl, box(686), box(667), nullptr); + avl = gpr_avl_add(avl, box(724), box(668), nullptr); + avl = gpr_avl_add(avl, box(952), box(669), nullptr); + avl = gpr_avl_add(avl, box(5), box(670), nullptr); + avl = remove_int(avl, 35); + avl = gpr_avl_add(avl, box(43), box(672), nullptr); + avl = gpr_avl_add(avl, box(320), box(673), nullptr); + avl = gpr_avl_add(avl, box(115), box(674), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(605), box(680), nullptr); + avl = gpr_avl_add(avl, box(152), box(681), nullptr); + avl = gpr_avl_add(avl, box(113), box(682), nullptr); + avl = remove_int(avl, 131); + avl = remove_int(avl, 637); + avl = gpr_avl_add(avl, box(156), box(685), nullptr); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(546), box(687), nullptr); + avl = remove_int(avl, 970); + avl = remove_int(avl, 53); + avl = remove_int(avl, 827); + avl = remove_int(avl, 224); + avl = remove_int(avl, 796); + avl = remove_int(avl, 34); + avl = remove_int(avl, 922); + avl = remove_int(avl, 277); + avl = remove_int(avl, 650); + avl = remove_int(avl, 222); + avl = remove_int(avl, 244); + avl = remove_int(avl, 576); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(500), box(701), nullptr); + avl = remove_int(avl, 924); + avl = gpr_avl_add(avl, box(825), box(703), nullptr); + avl = remove_int(avl, 888); + avl = remove_int(avl, 931); + avl = gpr_avl_add(avl, box(285), box(706), nullptr); + avl = remove_int(avl, 62); + avl = remove_int(avl, 444); + avl = remove_int(avl, 946); + avl = gpr_avl_add(avl, box(122), box(710), nullptr); + avl = gpr_avl_add(avl, box(846), box(711), nullptr); + avl = remove_int(avl, 628); + avl = gpr_avl_add(avl, box(511), box(713), nullptr); + avl = gpr_avl_add(avl, box(398), box(714), nullptr); + avl = remove_int(avl, 730); + avl = gpr_avl_add(avl, box(797), box(716), nullptr); + avl = remove_int(avl, 897); + avl = remove_int(avl, 228); + avl = remove_int(avl, 544); + avl = remove_int(avl, 552); + avl = remove_int(avl, 783); + avl = remove_int(avl, 583); + avl = remove_int(avl, 894); + avl = remove_int(avl, 942); + avl = gpr_avl_add(avl, box(346), box(725), nullptr); + avl = gpr_avl_add(avl, box(1015), box(726), nullptr); + avl = remove_int(avl, 813); + avl = gpr_avl_add(avl, box(213), box(728), nullptr); + avl = remove_int(avl, 468); + avl = remove_int(avl, 365); + avl = remove_int(avl, 399); + avl = gpr_avl_add(avl, box(380), box(732), nullptr); + avl = remove_int(avl, 835); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(700), box(735), nullptr); + avl = gpr_avl_add(avl, box(807), box(736), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(332), box(744), nullptr); + avl = remove_int(avl, 686); + avl = remove_int(avl, 206); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(334), box(748), nullptr); + avl = remove_int(avl, 171); + avl = gpr_avl_add(avl, box(1002), box(750), nullptr); + avl = gpr_avl_add(avl, box(779), box(751), nullptr); + avl = gpr_avl_add(avl, box(307), box(752), nullptr); + avl = gpr_avl_add(avl, box(127), box(753), nullptr); + avl = gpr_avl_add(avl, box(251), box(754), nullptr); + 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), nullptr); + avl = remove_int(avl, 43); + avl = gpr_avl_add(avl, box(871), box(762), nullptr); + avl = gpr_avl_add(avl, box(580), box(763), nullptr); + avl = remove_int(avl, 501); + avl = remove_int(avl, 462); + avl = remove_int(avl, 599); + avl = gpr_avl_add(avl, box(240), box(767), nullptr); + avl = gpr_avl_add(avl, box(285), box(768), nullptr); + avl = gpr_avl_add(avl, box(472), box(769), nullptr); + avl = remove_int(avl, 865); + avl = remove_int(avl, 763); + avl = remove_int(avl, 245); + avl = remove_int(avl, 80); + avl = remove_int(avl, 713); + avl = remove_int(avl, 654); + avl = remove_int(avl, 1014); + avl = gpr_avl_add(avl, box(495), box(777), nullptr); + avl = gpr_avl_add(avl, box(552), box(778), nullptr); + avl = remove_int(avl, 19); + avl = remove_int(avl, 803); + avl = gpr_avl_add(avl, box(508), box(781), nullptr); + 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), nullptr); + 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), nullptr); + 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), nullptr); + avl = remove_int(avl, 38); + avl = remove_int(avl, 595); + avl = gpr_avl_add(avl, box(213), box(799), nullptr); + avl = remove_int(avl, 7); + avl = remove_int(avl, 620); + avl = gpr_avl_add(avl, box(946), box(802), nullptr); + avl = remove_int(avl, 145); + avl = gpr_avl_add(avl, box(628), box(804), nullptr); + avl = remove_int(avl, 972); + avl = gpr_avl_add(avl, box(728), box(806), nullptr); + avl = remove_int(avl, 91); + avl = gpr_avl_add(avl, box(136), box(808), nullptr); + avl = gpr_avl_add(avl, box(841), box(809), nullptr); + avl = gpr_avl_add(avl, box(265), box(810), nullptr); + avl = gpr_avl_add(avl, box(701), box(811), nullptr); + avl = gpr_avl_add(avl, box(27), box(812), nullptr); + avl = remove_int(avl, 72); + avl = remove_int(avl, 14); + avl = gpr_avl_add(avl, box(286), box(815), nullptr); + avl = remove_int(avl, 996); + avl = remove_int(avl, 998); + avl = gpr_avl_add(avl, box(466), box(818), nullptr); + avl = remove_int(avl, 1009); + avl = remove_int(avl, 741); + avl = remove_int(avl, 947); + avl = remove_int(avl, 241); + avl = remove_int(avl, 954); + avl = remove_int(avl, 183); + avl = remove_int(avl, 395); + avl = remove_int(avl, 951); + avl = gpr_avl_add(avl, box(267), box(827), nullptr); + avl = remove_int(avl, 812); + avl = gpr_avl_add(avl, box(577), box(829), nullptr); + avl = remove_int(avl, 624); + avl = remove_int(avl, 847); + avl = remove_int(avl, 745); + avl = gpr_avl_add(avl, box(491), box(833), nullptr); + avl = gpr_avl_add(avl, box(941), box(834), nullptr); + avl = remove_int(avl, 258); + avl = gpr_avl_add(avl, box(410), box(836), nullptr); + avl = gpr_avl_add(avl, box(80), box(837), nullptr); + avl = gpr_avl_add(avl, box(196), box(838), nullptr); + avl = gpr_avl_add(avl, box(5), box(839), nullptr); + avl = remove_int(avl, 782); + avl = gpr_avl_add(avl, box(827), box(841), nullptr); + avl = remove_int(avl, 472); + avl = remove_int(avl, 664); + avl = gpr_avl_add(avl, box(409), box(844), nullptr); + avl = gpr_avl_add(avl, box(62), box(845), nullptr); + 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), nullptr); + avl = remove_int(avl, 587); + avl = remove_int(avl, 350); + avl = gpr_avl_add(avl, box(980), box(855), nullptr); + avl = gpr_avl_add(avl, box(992), box(856), nullptr); + avl = gpr_avl_add(avl, box(818), box(857), nullptr); + avl = remove_int(avl, 853); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(675), box(860), nullptr); + avl = remove_int(avl, 248); + avl = remove_int(avl, 649); + avl = gpr_avl_add(avl, box(508), box(863), nullptr); + avl = remove_int(avl, 927); + avl = gpr_avl_add(avl, box(957), box(865), nullptr); + avl = gpr_avl_add(avl, box(698), box(866), nullptr); + avl = gpr_avl_add(avl, box(388), box(867), nullptr); + avl = gpr_avl_add(avl, box(532), box(868), nullptr); + avl = gpr_avl_add(avl, box(681), box(869), nullptr); + avl = remove_int(avl, 544); + avl = remove_int(avl, 991); + avl = remove_int(avl, 397); + avl = gpr_avl_add(avl, box(954), box(873), nullptr); + avl = gpr_avl_add(avl, box(219), box(874), nullptr); + avl = gpr_avl_add(avl, box(465), box(875), nullptr); + avl = remove_int(avl, 371); + avl = gpr_avl_add(avl, box(601), box(877), nullptr); + avl = gpr_avl_add(avl, box(543), box(878), nullptr); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(560), box(880), nullptr); + avl = remove_int(avl, 898); + avl = gpr_avl_add(avl, box(455), box(882), nullptr); + avl = remove_int(avl, 313); + avl = gpr_avl_add(avl, box(215), box(884), nullptr); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(608), box(886), nullptr); + avl = remove_int(avl, 248); + avl = gpr_avl_add(avl, box(575), box(888), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(329), box(894), nullptr); + avl = gpr_avl_add(avl, box(326), box(895), nullptr); + avl = remove_int(avl, 746); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(464), box(898), nullptr); + avl = gpr_avl_add(avl, box(141), box(899), nullptr); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(414), box(901), nullptr); + avl = gpr_avl_add(avl, box(777), box(902), nullptr); + avl = remove_int(avl, 972); + avl = remove_int(avl, 841); + avl = remove_int(avl, 100); + avl = gpr_avl_add(avl, box(828), box(906), nullptr); + avl = remove_int(avl, 785); + avl = gpr_avl_add(avl, box(1008), box(908), nullptr); + avl = gpr_avl_add(avl, box(46), box(909), nullptr); + avl = remove_int(avl, 399); + avl = gpr_avl_add(avl, box(178), box(911), nullptr); + avl = gpr_avl_add(avl, box(573), box(912), nullptr); + avl = remove_int(avl, 299); + avl = gpr_avl_add(avl, box(690), box(914), nullptr); + avl = gpr_avl_add(avl, box(692), box(915), nullptr); + 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), nullptr); + avl = remove_int(avl, 328); + avl = gpr_avl_add(avl, box(89), box(923), nullptr); + avl = remove_int(avl, 867); + avl = remove_int(avl, 626); + avl = remove_int(avl, 507); + avl = gpr_avl_add(avl, box(365), box(927), nullptr); + avl = gpr_avl_add(avl, box(58), box(928), nullptr); + avl = gpr_avl_add(avl, box(70), box(929), nullptr); + avl = remove_int(avl, 81); + avl = remove_int(avl, 797); + avl = gpr_avl_add(avl, box(846), box(932), nullptr); + avl = remove_int(avl, 642); + avl = gpr_avl_add(avl, box(777), box(934), nullptr); + avl = remove_int(avl, 107); + avl = gpr_avl_add(avl, box(691), box(936), nullptr); + avl = gpr_avl_add(avl, box(820), box(937), nullptr); + avl = gpr_avl_add(avl, box(202), box(938), nullptr); + avl = gpr_avl_add(avl, box(308), box(939), nullptr); + avl = gpr_avl_add(avl, box(20), box(940), nullptr); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(714), box(942), nullptr); + avl = gpr_avl_add(avl, box(584), box(943), nullptr); + avl = remove_int(avl, 294); + avl = gpr_avl_add(avl, box(496), box(945), nullptr); + avl = gpr_avl_add(avl, box(394), box(946), nullptr); + avl = gpr_avl_add(avl, box(860), box(947), nullptr); + avl = gpr_avl_add(avl, box(58), box(948), nullptr); + avl = remove_int(avl, 784); + avl = remove_int(avl, 584); + avl = remove_int(avl, 708); + avl = gpr_avl_add(avl, box(142), box(952), nullptr); + avl = gpr_avl_add(avl, box(247), box(953), nullptr); + avl = gpr_avl_add(avl, box(389), box(954), nullptr); + avl = remove_int(avl, 390); + avl = gpr_avl_add(avl, box(465), box(956), nullptr); + avl = gpr_avl_add(avl, box(936), box(957), nullptr); + avl = gpr_avl_add(avl, box(309), box(958), nullptr); + avl = remove_int(avl, 928); + avl = remove_int(avl, 128); + avl = remove_int(avl, 979); + avl = remove_int(avl, 670); + avl = remove_int(avl, 738); + avl = remove_int(avl, 271); + avl = remove_int(avl, 540); + avl = gpr_avl_add(avl, box(365), box(966), nullptr); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(728), box(968), nullptr); + avl = remove_int(avl, 852); + avl = gpr_avl_add(avl, box(884), box(970), nullptr); + avl = gpr_avl_add(avl, box(502), box(971), nullptr); + avl = remove_int(avl, 898); + avl = remove_int(avl, 481); + avl = gpr_avl_add(avl, box(911), box(974), nullptr); + avl = remove_int(avl, 787); + avl = remove_int(avl, 785); + avl = remove_int(avl, 537); + avl = remove_int(avl, 535); + avl = remove_int(avl, 136); + avl = remove_int(avl, 749); + avl = remove_int(avl, 637); + avl = remove_int(avl, 900); + avl = gpr_avl_add(avl, box(598), box(983), nullptr); + avl = remove_int(avl, 25); + avl = remove_int(avl, 697); + avl = gpr_avl_add(avl, box(645), box(986), nullptr); + avl = gpr_avl_add(avl, box(211), box(987), nullptr); + avl = gpr_avl_add(avl, box(589), box(988), nullptr); + avl = remove_int(avl, 702); + avl = gpr_avl_add(avl, box(53), box(990), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(834), box(998), nullptr); + avl = gpr_avl_add(avl, box(514), box(999), nullptr); + avl = gpr_avl_add(avl, box(75), box(1000), nullptr); + avl = remove_int(avl, 745); + avl = gpr_avl_add(avl, box(362), box(1002), nullptr); + avl = remove_int(avl, 215); + avl = gpr_avl_add(avl, box(624), box(1004), nullptr); + avl = remove_int(avl, 404); + avl = remove_int(avl, 359); + avl = remove_int(avl, 491); + avl = gpr_avl_add(avl, box(903), box(1008), nullptr); + avl = gpr_avl_add(avl, box(240), box(1009), nullptr); + avl = remove_int(avl, 95); + avl = gpr_avl_add(avl, box(119), box(1011), nullptr); + avl = gpr_avl_add(avl, box(857), box(1012), nullptr); + avl = remove_int(avl, 39); + avl = remove_int(avl, 866); + avl = gpr_avl_add(avl, box(503), box(1015), nullptr); + avl = gpr_avl_add(avl, box(740), box(1016), nullptr); + 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), nullptr); + avl = remove_int(avl, 638); + avl = gpr_avl_add(avl, box(299), box(1025), nullptr); + avl = gpr_avl_add(avl, box(584), box(1026), nullptr); + avl = remove_int(avl, 863); + avl = gpr_avl_add(avl, box(612), box(1028), nullptr); + avl = gpr_avl_add(avl, box(62), box(1029), nullptr); + avl = gpr_avl_add(avl, box(432), box(1030), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(644), box(1036), nullptr); + avl = remove_int(avl, 638); + avl = gpr_avl_add(avl, box(13), box(1038), nullptr); + avl = remove_int(avl, 66); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(362), box(1041), nullptr); + avl = gpr_avl_add(avl, box(783), box(1042), nullptr); + avl = remove_int(avl, 60); + avl = gpr_avl_add(avl, box(80), box(1044), nullptr); + avl = gpr_avl_add(avl, box(825), box(1045), nullptr); + avl = gpr_avl_add(avl, box(688), box(1046), nullptr); + avl = gpr_avl_add(avl, box(662), box(1047), nullptr); + avl = remove_int(avl, 156); + avl = remove_int(avl, 376); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(526), box(1051), nullptr); + avl = gpr_avl_add(avl, box(168), box(1052), nullptr); + avl = remove_int(avl, 646); + avl = remove_int(avl, 380); + avl = remove_int(avl, 833); + avl = gpr_avl_add(avl, box(53), box(1056), nullptr); + avl = remove_int(avl, 105); + avl = gpr_avl_add(avl, box(373), box(1058), nullptr); + avl = gpr_avl_add(avl, box(184), box(1059), nullptr); + avl = remove_int(avl, 288); + avl = gpr_avl_add(avl, box(966), box(1061), nullptr); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(406), box(1063), nullptr); + avl = remove_int(avl, 470); + avl = gpr_avl_add(avl, box(283), box(1065), nullptr); + avl = gpr_avl_add(avl, box(838), box(1066), nullptr); + avl = gpr_avl_add(avl, box(288), box(1067), nullptr); + avl = gpr_avl_add(avl, box(950), box(1068), nullptr); + avl = gpr_avl_add(avl, box(163), box(1069), nullptr); + avl = remove_int(avl, 623); + avl = remove_int(avl, 769); + avl = gpr_avl_add(avl, box(144), box(1072), nullptr); + avl = gpr_avl_add(avl, box(489), box(1073), nullptr); + avl = remove_int(avl, 15); + avl = gpr_avl_add(avl, box(971), box(1075), nullptr); + avl = remove_int(avl, 660); + avl = gpr_avl_add(avl, box(255), box(1077), nullptr); + avl = remove_int(avl, 494); + avl = gpr_avl_add(avl, box(109), box(1079), nullptr); + avl = gpr_avl_add(avl, box(420), box(1080), nullptr); + avl = gpr_avl_add(avl, box(509), box(1081), nullptr); + avl = remove_int(avl, 178); + avl = gpr_avl_add(avl, box(216), box(1083), nullptr); + avl = gpr_avl_add(avl, box(707), box(1084), nullptr); + avl = gpr_avl_add(avl, box(411), box(1085), nullptr); + avl = gpr_avl_add(avl, box(352), box(1086), nullptr); + avl = remove_int(avl, 983); + avl = gpr_avl_add(avl, box(6), box(1088), nullptr); + avl = gpr_avl_add(avl, box(1014), box(1089), nullptr); + avl = remove_int(avl, 98); + avl = remove_int(avl, 325); + avl = gpr_avl_add(avl, box(851), box(1092), nullptr); + avl = remove_int(avl, 553); + avl = gpr_avl_add(avl, box(218), box(1094), nullptr); + avl = gpr_avl_add(avl, box(261), box(1095), nullptr); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(872), box(1097), nullptr); + avl = remove_int(avl, 543); + avl = remove_int(avl, 314); + avl = remove_int(avl, 443); + avl = gpr_avl_add(avl, box(533), box(1101), nullptr); + avl = remove_int(avl, 881); + avl = remove_int(avl, 269); + avl = remove_int(avl, 940); + avl = remove_int(avl, 909); + avl = remove_int(avl, 197); + avl = remove_int(avl, 773); + avl = remove_int(avl, 790); + avl = remove_int(avl, 345); + avl = gpr_avl_add(avl, box(965), box(1110), nullptr); + avl = remove_int(avl, 622); + avl = gpr_avl_add(avl, box(352), box(1112), nullptr); + avl = remove_int(avl, 182); + avl = gpr_avl_add(avl, box(534), box(1114), nullptr); + avl = gpr_avl_add(avl, box(97), box(1115), nullptr); + avl = gpr_avl_add(avl, box(198), box(1116), nullptr); + avl = remove_int(avl, 750); + avl = gpr_avl_add(avl, box(98), box(1118), nullptr); + avl = remove_int(avl, 943); + avl = gpr_avl_add(avl, box(254), box(1120), nullptr); + avl = gpr_avl_add(avl, box(30), box(1121), nullptr); + avl = remove_int(avl, 14); + avl = remove_int(avl, 475); + avl = remove_int(avl, 82); + avl = gpr_avl_add(avl, box(789), box(1125), nullptr); + avl = gpr_avl_add(avl, box(402), box(1126), nullptr); + avl = remove_int(avl, 1019); + avl = gpr_avl_add(avl, box(858), box(1128), nullptr); + avl = gpr_avl_add(avl, box(625), box(1129), nullptr); + avl = remove_int(avl, 675); + avl = remove_int(avl, 323); + avl = gpr_avl_add(avl, box(329), box(1132), nullptr); + avl = remove_int(avl, 929); + avl = remove_int(avl, 44); + avl = gpr_avl_add(avl, box(443), box(1135), nullptr); + avl = gpr_avl_add(avl, box(653), box(1136), nullptr); + avl = gpr_avl_add(avl, box(750), box(1137), nullptr); + avl = gpr_avl_add(avl, box(252), box(1138), nullptr); + avl = gpr_avl_add(avl, box(449), box(1139), nullptr); + 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), nullptr); + avl = remove_int(avl, 806); + avl = gpr_avl_add(avl, box(455), box(1146), nullptr); + avl = remove_int(avl, 31); + avl = gpr_avl_add(avl, box(154), box(1148), nullptr); + avl = gpr_avl_add(avl, box(189), box(1149), nullptr); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(496), box(1151), nullptr); + avl = gpr_avl_add(avl, box(81), box(1152), nullptr); + avl = gpr_avl_add(avl, box(59), box(1153), nullptr); + avl = remove_int(avl, 424); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(723), box(1156), nullptr); + avl = gpr_avl_add(avl, box(822), box(1157), nullptr); + avl = gpr_avl_add(avl, box(354), box(1158), nullptr); + avl = remove_int(avl, 738); + avl = gpr_avl_add(avl, box(686), box(1160), nullptr); + avl = gpr_avl_add(avl, box(43), box(1161), nullptr); + avl = gpr_avl_add(avl, box(625), box(1162), nullptr); + avl = gpr_avl_add(avl, box(902), box(1163), nullptr); + avl = gpr_avl_add(avl, box(12), box(1164), nullptr); + avl = gpr_avl_add(avl, box(977), box(1165), nullptr); + avl = gpr_avl_add(avl, box(699), box(1166), nullptr); + avl = gpr_avl_add(avl, box(189), box(1167), nullptr); + 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), nullptr); + avl = remove_int(avl, 758); + avl = remove_int(avl, 222); + avl = gpr_avl_add(avl, box(975), box(1175), nullptr); + avl = remove_int(avl, 993); + avl = gpr_avl_add(avl, box(2), box(1177), nullptr); + avl = gpr_avl_add(avl, box(70), box(1178), nullptr); + avl = remove_int(avl, 350); + avl = remove_int(avl, 972); + avl = remove_int(avl, 880); + avl = gpr_avl_add(avl, box(753), box(1182), nullptr); + avl = remove_int(avl, 404); + avl = gpr_avl_add(avl, box(294), box(1184), nullptr); + avl = remove_int(avl, 474); + avl = gpr_avl_add(avl, box(228), box(1186), nullptr); + avl = gpr_avl_add(avl, box(484), box(1187), nullptr); + avl = remove_int(avl, 238); + avl = remove_int(avl, 53); + avl = remove_int(avl, 691); + avl = gpr_avl_add(avl, box(345), box(1191), nullptr); + avl = remove_int(avl, 0); + avl = gpr_avl_add(avl, box(230), box(1193), nullptr); + avl = remove_int(avl, 227); + avl = remove_int(avl, 152); + avl = gpr_avl_add(avl, box(884), box(1196), nullptr); + avl = remove_int(avl, 823); + avl = remove_int(avl, 53); + avl = gpr_avl_add(avl, box(1015), box(1199), nullptr); + avl = gpr_avl_add(avl, box(697), box(1200), nullptr); + avl = gpr_avl_add(avl, box(376), box(1201), nullptr); + avl = remove_int(avl, 411); + avl = gpr_avl_add(avl, box(888), box(1203), nullptr); + avl = remove_int(avl, 55); + avl = gpr_avl_add(avl, box(85), box(1205), nullptr); + avl = remove_int(avl, 947); + avl = remove_int(avl, 382); + avl = remove_int(avl, 777); + avl = gpr_avl_add(avl, box(1017), box(1209), nullptr); + avl = gpr_avl_add(avl, box(169), box(1210), nullptr); + avl = gpr_avl_add(avl, box(156), box(1211), nullptr); + avl = remove_int(avl, 153); + avl = remove_int(avl, 642); + avl = remove_int(avl, 158); + avl = gpr_avl_add(avl, box(554), box(1215), nullptr); + avl = gpr_avl_add(avl, box(76), box(1216), nullptr); + avl = gpr_avl_add(avl, box(756), box(1217), nullptr); + avl = remove_int(avl, 767); + avl = remove_int(avl, 112); + avl = remove_int(avl, 539); + avl = remove_int(avl, 544); + avl = remove_int(avl, 628); + avl = remove_int(avl, 385); + avl = remove_int(avl, 514); + avl = remove_int(avl, 362); + avl = gpr_avl_add(avl, box(523), box(1226), nullptr); + avl = gpr_avl_add(avl, box(712), box(1227), nullptr); + avl = gpr_avl_add(avl, box(474), box(1228), nullptr); + avl = gpr_avl_add(avl, box(882), box(1229), nullptr); + avl = gpr_avl_add(avl, box(965), box(1230), nullptr); + avl = remove_int(avl, 464); + avl = gpr_avl_add(avl, box(319), box(1232), nullptr); + avl = gpr_avl_add(avl, box(504), box(1233), nullptr); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(884), box(1235), nullptr); + avl = gpr_avl_add(avl, box(813), box(1236), nullptr); + avl = gpr_avl_add(avl, box(795), box(1237), nullptr); + avl = remove_int(avl, 306); + avl = gpr_avl_add(avl, box(799), box(1239), nullptr); + avl = remove_int(avl, 534); + avl = gpr_avl_add(avl, box(480), box(1241), nullptr); + avl = gpr_avl_add(avl, box(656), box(1242), nullptr); + avl = gpr_avl_add(avl, box(709), box(1243), nullptr); + avl = gpr_avl_add(avl, box(500), box(1244), nullptr); + avl = remove_int(avl, 740); + avl = gpr_avl_add(avl, box(980), box(1246), nullptr); + avl = gpr_avl_add(avl, box(458), box(1247), nullptr); + avl = remove_int(avl, 377); + avl = remove_int(avl, 338); + avl = gpr_avl_add(avl, box(554), box(1250), nullptr); + avl = gpr_avl_add(avl, box(504), box(1251), nullptr); + avl = gpr_avl_add(avl, box(603), box(1252), nullptr); + avl = gpr_avl_add(avl, box(761), box(1253), nullptr); + avl = remove_int(avl, 431); + avl = gpr_avl_add(avl, box(707), box(1255), nullptr); + avl = gpr_avl_add(avl, box(673), box(1256), nullptr); + avl = remove_int(avl, 998); + avl = remove_int(avl, 332); + avl = remove_int(avl, 413); + avl = remove_int(avl, 227); + avl = remove_int(avl, 249); + avl = remove_int(avl, 309); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(645), box(1264), nullptr); + avl = remove_int(avl, 858); + avl = remove_int(avl, 997); + avl = gpr_avl_add(avl, box(519), box(1267), nullptr); + avl = remove_int(avl, 614); + avl = remove_int(avl, 462); + avl = remove_int(avl, 792); + avl = gpr_avl_add(avl, box(987), box(1271), nullptr); + avl = gpr_avl_add(avl, box(309), box(1272), nullptr); + avl = remove_int(avl, 747); + avl = gpr_avl_add(avl, box(621), box(1274), nullptr); + avl = gpr_avl_add(avl, box(450), box(1275), nullptr); + avl = remove_int(avl, 265); + avl = remove_int(avl, 8); + avl = remove_int(avl, 383); + avl = gpr_avl_add(avl, box(238), box(1279), nullptr); + avl = remove_int(avl, 241); + avl = gpr_avl_add(avl, box(180), box(1281), nullptr); + avl = gpr_avl_add(avl, box(411), box(1282), nullptr); + avl = gpr_avl_add(avl, box(791), box(1283), nullptr); + avl = gpr_avl_add(avl, box(955), box(1284), nullptr); + avl = remove_int(avl, 24); + avl = remove_int(avl, 375); + avl = gpr_avl_add(avl, box(140), box(1287), nullptr); + avl = remove_int(avl, 949); + avl = gpr_avl_add(avl, box(301), box(1289), nullptr); + avl = gpr_avl_add(avl, box(0), box(1290), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(127), box(1296), nullptr); + avl = gpr_avl_add(avl, box(279), box(1297), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(304), box(1304), nullptr); + avl = gpr_avl_add(avl, box(1), box(1305), nullptr); + avl = gpr_avl_add(avl, box(339), box(1306), nullptr); + 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), nullptr); + avl = remove_int(avl, 85); + avl = gpr_avl_add(avl, box(964), box(1314), nullptr); + avl = gpr_avl_add(avl, box(559), box(1315), nullptr); + avl = remove_int(avl, 167); + avl = gpr_avl_add(avl, box(866), box(1317), nullptr); + avl = remove_int(avl, 275); + avl = gpr_avl_add(avl, box(173), box(1319), nullptr); + avl = gpr_avl_add(avl, box(765), box(1320), nullptr); + avl = remove_int(avl, 883); + avl = gpr_avl_add(avl, box(547), box(1322), nullptr); + avl = gpr_avl_add(avl, box(847), box(1323), nullptr); + avl = remove_int(avl, 817); + avl = remove_int(avl, 850); + avl = remove_int(avl, 718); + avl = gpr_avl_add(avl, box(806), box(1327), nullptr); + avl = gpr_avl_add(avl, box(360), box(1328), nullptr); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(493), box(1330), nullptr); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(361), box(1332), nullptr); + avl = remove_int(avl, 355); + avl = gpr_avl_add(avl, box(512), box(1334), nullptr); + avl = gpr_avl_add(avl, box(191), box(1335), nullptr); + avl = remove_int(avl, 703); + avl = gpr_avl_add(avl, box(333), box(1337), nullptr); + avl = remove_int(avl, 481); + avl = gpr_avl_add(avl, box(501), box(1339), nullptr); + avl = remove_int(avl, 532); + avl = remove_int(avl, 510); + avl = gpr_avl_add(avl, box(793), box(1342), nullptr); + avl = gpr_avl_add(avl, box(234), box(1343), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(702), box(1349), nullptr); + avl = gpr_avl_add(avl, box(149), box(1350), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(455), box(1358), nullptr); + avl = remove_int(avl, 782); + avl = remove_int(avl, 682); + avl = gpr_avl_add(avl, box(243), box(1361), nullptr); + avl = gpr_avl_add(avl, box(109), box(1362), nullptr); + avl = gpr_avl_add(avl, box(452), box(1363), nullptr); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(159), box(1365), nullptr); + avl = remove_int(avl, 1023); + avl = gpr_avl_add(avl, box(129), box(1367), nullptr); + avl = gpr_avl_add(avl, box(537), box(1368), nullptr); + avl = remove_int(avl, 321); + avl = gpr_avl_add(avl, box(740), box(1370), nullptr); + avl = remove_int(avl, 45); + avl = remove_int(avl, 136); + avl = gpr_avl_add(avl, box(229), box(1373), nullptr); + avl = remove_int(avl, 772); + avl = gpr_avl_add(avl, box(181), box(1375), nullptr); + avl = remove_int(avl, 175); + avl = gpr_avl_add(avl, box(817), box(1377), nullptr); + avl = remove_int(avl, 956); + avl = gpr_avl_add(avl, box(675), box(1379), nullptr); + avl = gpr_avl_add(avl, box(375), box(1380), nullptr); + avl = remove_int(avl, 384); + avl = gpr_avl_add(avl, box(1016), box(1382), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(293), box(1389), nullptr); + avl = remove_int(avl, 207); + avl = remove_int(avl, 46); + avl = gpr_avl_add(avl, box(899), box(1392), nullptr); + avl = gpr_avl_add(avl, box(666), box(1393), nullptr); + avl = gpr_avl_add(avl, box(85), box(1394), nullptr); + avl = gpr_avl_add(avl, box(914), box(1395), nullptr); + avl = gpr_avl_add(avl, box(128), box(1396), nullptr); + avl = gpr_avl_add(avl, box(835), box(1397), nullptr); + avl = gpr_avl_add(avl, box(787), box(1398), nullptr); + avl = gpr_avl_add(avl, box(649), box(1399), nullptr); + avl = gpr_avl_add(avl, box(723), box(1400), nullptr); + avl = remove_int(avl, 874); + avl = gpr_avl_add(avl, box(778), box(1402), nullptr); + avl = gpr_avl_add(avl, box(1015), box(1403), nullptr); + avl = gpr_avl_add(avl, box(59), box(1404), nullptr); + avl = gpr_avl_add(avl, box(259), box(1405), nullptr); + avl = gpr_avl_add(avl, box(758), box(1406), nullptr); + avl = remove_int(avl, 648); + avl = gpr_avl_add(avl, box(145), box(1408), nullptr); + avl = gpr_avl_add(avl, box(440), box(1409), nullptr); + avl = remove_int(avl, 608); + avl = remove_int(avl, 690); + avl = gpr_avl_add(avl, box(605), box(1412), nullptr); + avl = remove_int(avl, 856); + avl = remove_int(avl, 608); + avl = gpr_avl_add(avl, box(829), box(1415), nullptr); + avl = gpr_avl_add(avl, box(660), box(1416), nullptr); + avl = remove_int(avl, 596); + avl = gpr_avl_add(avl, box(519), box(1418), nullptr); + avl = gpr_avl_add(avl, box(35), box(1419), nullptr); + avl = gpr_avl_add(avl, box(871), box(1420), nullptr); + avl = remove_int(avl, 845); + avl = gpr_avl_add(avl, box(600), box(1422), nullptr); + avl = gpr_avl_add(avl, box(215), box(1423), nullptr); + avl = remove_int(avl, 761); + avl = gpr_avl_add(avl, box(975), box(1425), nullptr); + avl = remove_int(avl, 987); + avl = gpr_avl_add(avl, box(58), box(1427), nullptr); + avl = remove_int(avl, 119); + avl = gpr_avl_add(avl, box(937), box(1429), nullptr); + avl = gpr_avl_add(avl, box(372), box(1430), nullptr); + avl = gpr_avl_add(avl, box(11), box(1431), nullptr); + avl = gpr_avl_add(avl, box(398), box(1432), nullptr); + avl = gpr_avl_add(avl, box(423), box(1433), nullptr); + avl = remove_int(avl, 171); + avl = gpr_avl_add(avl, box(473), box(1435), nullptr); + 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), nullptr); + 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), nullptr); + avl = remove_int(avl, 152); + avl = gpr_avl_add(avl, box(61), box(1448), nullptr); + avl = remove_int(avl, 929); + avl = remove_int(avl, 9); + avl = gpr_avl_add(avl, box(251), box(1451), nullptr); + avl = gpr_avl_add(avl, box(672), box(1452), nullptr); + avl = gpr_avl_add(avl, box(66), box(1453), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(495), box(1459), nullptr); + avl = remove_int(avl, 450); + avl = gpr_avl_add(avl, box(533), box(1461), nullptr); + avl = gpr_avl_add(avl, box(414), box(1462), nullptr); + avl = remove_int(avl, 74); + avl = remove_int(avl, 236); + avl = gpr_avl_add(avl, box(707), box(1465), nullptr); + avl = gpr_avl_add(avl, box(357), box(1466), nullptr); + avl = gpr_avl_add(avl, box(1007), box(1467), nullptr); + avl = gpr_avl_add(avl, box(811), box(1468), nullptr); + avl = gpr_avl_add(avl, box(418), box(1469), nullptr); + avl = gpr_avl_add(avl, box(164), box(1470), nullptr); + avl = gpr_avl_add(avl, box(622), box(1471), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(202), box(1478), nullptr); + avl = gpr_avl_add(avl, box(312), box(1479), nullptr); + avl = remove_int(avl, 274); + avl = gpr_avl_add(avl, box(684), box(1481), nullptr); + avl = gpr_avl_add(avl, box(954), box(1482), nullptr); + avl = gpr_avl_add(avl, box(637), box(1483), nullptr); + avl = remove_int(avl, 716); + avl = gpr_avl_add(avl, box(198), box(1485), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(862), box(1491), nullptr); + avl = remove_int(avl, 527); + avl = gpr_avl_add(avl, box(945), box(1493), nullptr); + avl = remove_int(avl, 355); + avl = remove_int(avl, 144); + avl = gpr_avl_add(avl, box(229), box(1496), nullptr); + avl = gpr_avl_add(avl, box(237), box(1497), nullptr); + avl = remove_int(avl, 471); + avl = remove_int(avl, 901); + avl = gpr_avl_add(avl, box(905), box(1500), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(552), box(1506), nullptr); + avl = gpr_avl_add(avl, box(30), box(1507), nullptr); + avl = gpr_avl_add(avl, box(445), box(1508), nullptr); + avl = remove_int(avl, 785); + avl = remove_int(avl, 185); + avl = gpr_avl_add(avl, box(405), box(1511), nullptr); + avl = gpr_avl_add(avl, box(733), box(1512), nullptr); + avl = gpr_avl_add(avl, box(573), box(1513), nullptr); + avl = gpr_avl_add(avl, box(492), box(1514), nullptr); + avl = gpr_avl_add(avl, box(343), box(1515), nullptr); + avl = gpr_avl_add(avl, box(527), box(1516), nullptr); + avl = gpr_avl_add(avl, box(596), box(1517), nullptr); + avl = gpr_avl_add(avl, box(519), box(1518), nullptr); + avl = remove_int(avl, 243); + avl = remove_int(avl, 722); + avl = gpr_avl_add(avl, box(772), box(1521), nullptr); + avl = remove_int(avl, 152); + avl = remove_int(avl, 305); + avl = gpr_avl_add(avl, box(754), box(1524), nullptr); + avl = gpr_avl_add(avl, box(373), box(1525), nullptr); + avl = remove_int(avl, 995); + avl = gpr_avl_add(avl, box(329), box(1527), nullptr); + avl = remove_int(avl, 397); + avl = gpr_avl_add(avl, box(884), box(1529), nullptr); + avl = remove_int(avl, 329); + avl = remove_int(avl, 240); + avl = gpr_avl_add(avl, box(566), box(1532), nullptr); + avl = gpr_avl_add(avl, box(232), box(1533), nullptr); + avl = remove_int(avl, 993); + avl = gpr_avl_add(avl, box(888), box(1535), nullptr); + avl = remove_int(avl, 242); + avl = gpr_avl_add(avl, box(941), box(1537), nullptr); + avl = remove_int(avl, 415); + avl = gpr_avl_add(avl, box(992), box(1539), nullptr); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(60), box(1541), nullptr); + avl = gpr_avl_add(avl, box(97), box(1542), nullptr); + avl = remove_int(avl, 965); + avl = remove_int(avl, 267); + avl = remove_int(avl, 360); + avl = gpr_avl_add(avl, box(5), box(1546), nullptr); + avl = remove_int(avl, 429); + avl = gpr_avl_add(avl, box(412), box(1548), nullptr); + avl = remove_int(avl, 632); + avl = remove_int(avl, 113); + avl = gpr_avl_add(avl, box(48), box(1551), nullptr); + avl = gpr_avl_add(avl, box(108), box(1552), nullptr); + avl = gpr_avl_add(avl, box(750), box(1553), nullptr); + avl = remove_int(avl, 188); + avl = gpr_avl_add(avl, box(668), box(1555), nullptr); + avl = remove_int(avl, 37); + avl = remove_int(avl, 737); + avl = gpr_avl_add(avl, box(93), box(1558), nullptr); + avl = gpr_avl_add(avl, box(628), box(1559), nullptr); + avl = gpr_avl_add(avl, box(480), box(1560), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(469), box(1567), nullptr); + avl = remove_int(avl, 349); + avl = gpr_avl_add(avl, box(768), box(1569), nullptr); + avl = gpr_avl_add(avl, box(915), box(1570), nullptr); + avl = remove_int(avl, 1014); + avl = gpr_avl_add(avl, box(117), box(1572), nullptr); + avl = remove_int(avl, 62); + avl = gpr_avl_add(avl, box(382), box(1574), nullptr); + avl = remove_int(avl, 571); + avl = gpr_avl_add(avl, box(655), box(1576), nullptr); + avl = gpr_avl_add(avl, box(323), box(1577), nullptr); + avl = remove_int(avl, 869); + avl = remove_int(avl, 151); + avl = gpr_avl_add(avl, box(1019), box(1580), nullptr); + avl = gpr_avl_add(avl, box(984), box(1581), nullptr); + avl = gpr_avl_add(avl, box(870), box(1582), nullptr); + avl = gpr_avl_add(avl, box(376), box(1583), nullptr); + avl = remove_int(avl, 625); + avl = gpr_avl_add(avl, box(733), box(1585), nullptr); + avl = remove_int(avl, 532); + avl = remove_int(avl, 444); + avl = gpr_avl_add(avl, box(428), box(1588), nullptr); + avl = gpr_avl_add(avl, box(860), box(1589), nullptr); + avl = gpr_avl_add(avl, box(173), box(1590), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(639), box(1596), nullptr); + avl = remove_int(avl, 431); + avl = gpr_avl_add(avl, box(993), box(1598), nullptr); + avl = remove_int(avl, 681); + avl = remove_int(avl, 927); + avl = gpr_avl_add(avl, box(87), box(1601), nullptr); + avl = gpr_avl_add(avl, box(91), box(1602), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(951), box(1609), nullptr); + avl = gpr_avl_add(avl, box(146), box(1610), nullptr); + avl = gpr_avl_add(avl, box(482), box(1611), nullptr); + avl = gpr_avl_add(avl, box(71), box(1612), nullptr); + avl = remove_int(avl, 246); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(636), box(1615), nullptr); + avl = gpr_avl_add(avl, box(295), box(1616), nullptr); + avl = remove_int(avl, 11); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(905), box(1619), nullptr); + avl = gpr_avl_add(avl, box(993), box(1620), nullptr); + avl = gpr_avl_add(avl, box(433), box(1621), nullptr); + avl = gpr_avl_add(avl, box(117), box(1622), nullptr); + avl = gpr_avl_add(avl, box(467), box(1623), nullptr); + avl = remove_int(avl, 419); + avl = gpr_avl_add(avl, box(179), box(1625), nullptr); + avl = remove_int(avl, 926); + avl = remove_int(avl, 326); + avl = gpr_avl_add(avl, box(551), box(1628), nullptr); + avl = remove_int(avl, 14); + avl = remove_int(avl, 476); + avl = remove_int(avl, 823); + avl = gpr_avl_add(avl, box(350), box(1632), nullptr); + avl = gpr_avl_add(avl, box(133), box(1633), nullptr); + avl = remove_int(avl, 906); + avl = gpr_avl_add(avl, box(827), box(1635), nullptr); + avl = gpr_avl_add(avl, box(201), box(1636), nullptr); + avl = remove_int(avl, 124); + avl = remove_int(avl, 662); + avl = gpr_avl_add(avl, box(314), box(1639), nullptr); + avl = gpr_avl_add(avl, box(986), box(1640), nullptr); + avl = gpr_avl_add(avl, box(622), box(1641), nullptr); + avl = remove_int(avl, 130); + avl = gpr_avl_add(avl, box(861), box(1643), nullptr); + avl = remove_int(avl, 497); + avl = remove_int(avl, 905); + avl = gpr_avl_add(avl, box(502), box(1646), nullptr); + avl = remove_int(avl, 721); + avl = gpr_avl_add(avl, box(514), box(1648), nullptr); + avl = gpr_avl_add(avl, box(410), box(1649), nullptr); + avl = remove_int(avl, 869); + avl = remove_int(avl, 247); + avl = gpr_avl_add(avl, box(450), box(1652), nullptr); + avl = remove_int(avl, 364); + avl = gpr_avl_add(avl, box(963), box(1654), nullptr); + avl = gpr_avl_add(avl, box(146), box(1655), nullptr); + avl = remove_int(avl, 147); + avl = remove_int(avl, 789); + avl = gpr_avl_add(avl, box(693), box(1658), nullptr); + avl = gpr_avl_add(avl, box(959), box(1659), nullptr); + avl = remove_int(avl, 478); + avl = gpr_avl_add(avl, box(116), box(1661), nullptr); + avl = gpr_avl_add(avl, box(520), box(1662), nullptr); + avl = gpr_avl_add(avl, box(809), box(1663), nullptr); + avl = gpr_avl_add(avl, box(667), box(1664), nullptr); + avl = gpr_avl_add(avl, box(406), box(1665), nullptr); + avl = remove_int(avl, 409); + avl = gpr_avl_add(avl, box(558), box(1667), nullptr); + avl = gpr_avl_add(avl, box(0), box(1668), nullptr); + avl = gpr_avl_add(avl, box(948), box(1669), nullptr); + avl = gpr_avl_add(avl, box(576), box(1670), nullptr); + avl = remove_int(avl, 864); + avl = remove_int(avl, 840); + avl = remove_int(avl, 1001); + avl = gpr_avl_add(avl, box(232), box(1674), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(648), box(1680), nullptr); + avl = gpr_avl_add(avl, box(761), box(1681), nullptr); + avl = remove_int(avl, 293); + avl = remove_int(avl, 893); + avl = gpr_avl_add(avl, box(194), box(1684), nullptr); + avl = remove_int(avl, 233); + avl = gpr_avl_add(avl, box(888), box(1686), nullptr); + 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), nullptr); + avl = remove_int(avl, 634); + avl = remove_int(avl, 335); + avl = gpr_avl_add(avl, box(718), box(1694), nullptr); + avl = gpr_avl_add(avl, box(463), box(1695), nullptr); + avl = gpr_avl_add(avl, box(233), box(1696), nullptr); + 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), nullptr); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(716), box(1705), nullptr); + avl = remove_int(avl, 639); + avl = remove_int(avl, 775); + avl = remove_int(avl, 578); + avl = remove_int(avl, 464); + avl = remove_int(avl, 679); + avl = remove_int(avl, 615); + avl = remove_int(avl, 104); + avl = gpr_avl_add(avl, box(414), box(1713), nullptr); + avl = gpr_avl_add(avl, box(212), box(1714), nullptr); + avl = gpr_avl_add(avl, box(266), box(1715), nullptr); + avl = gpr_avl_add(avl, box(238), box(1716), nullptr); + avl = remove_int(avl, 153); + avl = gpr_avl_add(avl, box(585), box(1718), nullptr); + avl = remove_int(avl, 121); + avl = gpr_avl_add(avl, box(534), box(1720), nullptr); + avl = remove_int(avl, 579); + avl = gpr_avl_add(avl, box(127), box(1722), nullptr); + avl = gpr_avl_add(avl, box(399), box(1723), nullptr); + avl = remove_int(avl, 417); + avl = gpr_avl_add(avl, box(978), box(1725), nullptr); + avl = gpr_avl_add(avl, box(768), box(1726), nullptr); + avl = remove_int(avl, 985); + avl = gpr_avl_add(avl, box(536), box(1728), nullptr); + avl = gpr_avl_add(avl, box(449), box(1729), nullptr); + avl = gpr_avl_add(avl, box(586), box(1730), nullptr); + avl = remove_int(avl, 998); + avl = remove_int(avl, 394); + avl = remove_int(avl, 141); + avl = gpr_avl_add(avl, box(889), box(1734), nullptr); + avl = gpr_avl_add(avl, box(871), box(1735), nullptr); + avl = gpr_avl_add(avl, box(76), box(1736), nullptr); + avl = gpr_avl_add(avl, box(549), box(1737), nullptr); + avl = gpr_avl_add(avl, box(757), box(1738), nullptr); + avl = remove_int(avl, 908); + avl = gpr_avl_add(avl, box(789), box(1740), nullptr); + avl = remove_int(avl, 224); + avl = gpr_avl_add(avl, box(407), box(1742), nullptr); + avl = gpr_avl_add(avl, box(381), box(1743), nullptr); + avl = gpr_avl_add(avl, box(561), box(1744), nullptr); + avl = gpr_avl_add(avl, box(667), box(1745), nullptr); + avl = gpr_avl_add(avl, box(522), box(1746), nullptr); + avl = gpr_avl_add(avl, box(948), box(1747), nullptr); + avl = remove_int(avl, 770); + avl = gpr_avl_add(avl, box(872), box(1749), nullptr); + avl = gpr_avl_add(avl, box(327), box(1750), nullptr); + avl = remove_int(avl, 10); + avl = gpr_avl_add(avl, box(122), box(1752), nullptr); + avl = remove_int(avl, 606); + avl = gpr_avl_add(avl, box(485), box(1754), nullptr); + avl = remove_int(avl, 6); + avl = gpr_avl_add(avl, box(329), box(1756), nullptr); + avl = gpr_avl_add(avl, box(783), box(1757), nullptr); + avl = remove_int(avl, 416); + avl = gpr_avl_add(avl, box(656), box(1759), nullptr); + avl = gpr_avl_add(avl, box(971), box(1760), nullptr); + avl = gpr_avl_add(avl, box(77), box(1761), nullptr); + avl = gpr_avl_add(avl, box(942), box(1762), nullptr); + avl = remove_int(avl, 361); + avl = gpr_avl_add(avl, box(66), box(1764), nullptr); + avl = gpr_avl_add(avl, box(299), box(1765), nullptr); + avl = gpr_avl_add(avl, box(929), box(1766), nullptr); + avl = gpr_avl_add(avl, box(797), box(1767), nullptr); + avl = remove_int(avl, 869); + avl = remove_int(avl, 907); + avl = gpr_avl_add(avl, box(870), box(1770), nullptr); + avl = remove_int(avl, 580); + avl = remove_int(avl, 120); + avl = gpr_avl_add(avl, box(913), box(1773), nullptr); + avl = remove_int(avl, 480); + avl = gpr_avl_add(avl, box(489), box(1775), nullptr); + avl = remove_int(avl, 845); + avl = gpr_avl_add(avl, box(896), box(1777), nullptr); + avl = remove_int(avl, 567); + avl = remove_int(avl, 427); + avl = gpr_avl_add(avl, box(443), box(1780), nullptr); + avl = gpr_avl_add(avl, box(3), box(1781), nullptr); + avl = remove_int(avl, 12); + avl = gpr_avl_add(avl, box(376), box(1783), nullptr); + avl = gpr_avl_add(avl, box(155), box(1784), nullptr); + avl = gpr_avl_add(avl, box(188), box(1785), nullptr); + avl = gpr_avl_add(avl, box(149), box(1786), nullptr); + avl = gpr_avl_add(avl, box(178), box(1787), nullptr); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(805), box(1789), nullptr); + avl = gpr_avl_add(avl, box(612), box(1790), nullptr); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(837), box(1792), nullptr); + avl = remove_int(avl, 173); + avl = remove_int(avl, 72); + avl = gpr_avl_add(avl, box(1014), box(1795), nullptr); + avl = remove_int(avl, 303); + avl = gpr_avl_add(avl, box(865), box(1797), nullptr); + avl = gpr_avl_add(avl, box(793), box(1798), nullptr); + avl = remove_int(avl, 173); + avl = remove_int(avl, 477); + avl = gpr_avl_add(avl, box(950), box(1801), nullptr); + avl = gpr_avl_add(avl, box(105), box(1802), nullptr); + avl = gpr_avl_add(avl, box(895), box(1803), nullptr); + avl = gpr_avl_add(avl, box(171), box(1804), nullptr); + avl = gpr_avl_add(avl, box(753), box(1805), nullptr); + avl = gpr_avl_add(avl, box(946), box(1806), nullptr); + avl = remove_int(avl, 194); + avl = remove_int(avl, 559); + avl = remove_int(avl, 116); + avl = gpr_avl_add(avl, box(968), box(1810), nullptr); + avl = remove_int(avl, 124); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(563), box(1813), nullptr); + avl = remove_int(avl, 182); + avl = gpr_avl_add(avl, box(816), box(1815), nullptr); + avl = remove_int(avl, 73); + avl = remove_int(avl, 261); + avl = gpr_avl_add(avl, box(847), box(1818), nullptr); + avl = gpr_avl_add(avl, box(368), box(1819), nullptr); + avl = gpr_avl_add(avl, box(808), box(1820), nullptr); + avl = gpr_avl_add(avl, box(779), box(1821), nullptr); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(466), box(1823), nullptr); + avl = remove_int(avl, 316); + avl = gpr_avl_add(avl, box(986), box(1825), nullptr); + avl = gpr_avl_add(avl, box(688), box(1826), nullptr); + avl = gpr_avl_add(avl, box(509), box(1827), nullptr); + avl = gpr_avl_add(avl, box(51), box(1828), nullptr); + avl = remove_int(avl, 655); + avl = remove_int(avl, 785); + avl = remove_int(avl, 893); + avl = gpr_avl_add(avl, box(167), box(1832), nullptr); + avl = remove_int(avl, 13); + avl = remove_int(avl, 263); + avl = gpr_avl_add(avl, box(1009), box(1835), nullptr); + 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), nullptr); + avl = remove_int(avl, 267); + avl = gpr_avl_add(avl, box(676), box(1842), nullptr); + avl = gpr_avl_add(avl, box(231), box(1843), nullptr); + avl = gpr_avl_add(avl, box(824), box(1844), nullptr); + avl = remove_int(avl, 961); + avl = gpr_avl_add(avl, box(311), box(1846), nullptr); + avl = gpr_avl_add(avl, box(420), box(1847), nullptr); + avl = gpr_avl_add(avl, box(960), box(1848), nullptr); + avl = gpr_avl_add(avl, box(468), box(1849), nullptr); + avl = gpr_avl_add(avl, box(815), box(1850), nullptr); + avl = remove_int(avl, 247); + avl = remove_int(avl, 194); + avl = gpr_avl_add(avl, box(546), box(1853), nullptr); + avl = remove_int(avl, 222); + avl = remove_int(avl, 914); + avl = remove_int(avl, 741); + avl = gpr_avl_add(avl, box(470), box(1857), nullptr); + avl = gpr_avl_add(avl, box(933), box(1858), nullptr); + avl = gpr_avl_add(avl, box(97), box(1859), nullptr); + avl = remove_int(avl, 564); + avl = remove_int(avl, 295); + avl = gpr_avl_add(avl, box(864), box(1862), nullptr); + avl = remove_int(avl, 329); + avl = gpr_avl_add(avl, box(124), box(1864), nullptr); + avl = gpr_avl_add(avl, box(1000), box(1865), nullptr); + avl = gpr_avl_add(avl, box(228), box(1866), nullptr); + avl = gpr_avl_add(avl, box(187), box(1867), nullptr); + avl = remove_int(avl, 224); + avl = remove_int(avl, 306); + avl = remove_int(avl, 884); + avl = gpr_avl_add(avl, box(449), box(1871), nullptr); + avl = gpr_avl_add(avl, box(353), box(1872), nullptr); + avl = gpr_avl_add(avl, box(994), box(1873), nullptr); + avl = gpr_avl_add(avl, box(596), box(1874), nullptr); + avl = gpr_avl_add(avl, box(996), box(1875), nullptr); + avl = gpr_avl_add(avl, box(101), box(1876), nullptr); + avl = gpr_avl_add(avl, box(1012), box(1877), nullptr); + avl = gpr_avl_add(avl, box(982), box(1878), nullptr); + avl = gpr_avl_add(avl, box(742), box(1879), nullptr); + avl = remove_int(avl, 92); + avl = remove_int(avl, 1022); + avl = gpr_avl_add(avl, box(941), box(1882), nullptr); + avl = remove_int(avl, 742); + avl = remove_int(avl, 919); + avl = gpr_avl_add(avl, box(588), box(1885), nullptr); + avl = remove_int(avl, 221); + avl = gpr_avl_add(avl, box(356), box(1887), nullptr); + avl = gpr_avl_add(avl, box(932), box(1888), nullptr); + avl = remove_int(avl, 837); + avl = gpr_avl_add(avl, box(394), box(1890), nullptr); + avl = gpr_avl_add(avl, box(642), box(1891), nullptr); + avl = gpr_avl_add(avl, box(52), box(1892), nullptr); + avl = gpr_avl_add(avl, box(437), box(1893), nullptr); + avl = gpr_avl_add(avl, box(948), box(1894), nullptr); + avl = gpr_avl_add(avl, box(93), box(1895), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(952), box(1901), nullptr); + avl = gpr_avl_add(avl, box(510), box(1902), nullptr); + avl = remove_int(avl, 876); + avl = remove_int(avl, 612); + avl = gpr_avl_add(avl, box(923), box(1905), nullptr); + avl = gpr_avl_add(avl, box(475), box(1906), nullptr); + avl = remove_int(avl, 478); + avl = remove_int(avl, 148); + avl = gpr_avl_add(avl, box(538), box(1909), nullptr); + avl = remove_int(avl, 47); + avl = gpr_avl_add(avl, box(89), box(1911), nullptr); + avl = remove_int(avl, 723); + avl = gpr_avl_add(avl, box(687), box(1913), nullptr); + avl = gpr_avl_add(avl, box(480), box(1914), nullptr); + avl = gpr_avl_add(avl, box(149), box(1915), nullptr); + avl = remove_int(avl, 68); + avl = remove_int(avl, 862); + avl = remove_int(avl, 363); + avl = gpr_avl_add(avl, box(996), box(1919), nullptr); + avl = remove_int(avl, 380); + avl = gpr_avl_add(avl, box(957), box(1921), nullptr); + avl = remove_int(avl, 413); + avl = gpr_avl_add(avl, box(360), box(1923), nullptr); + avl = gpr_avl_add(avl, box(304), box(1924), nullptr); + avl = gpr_avl_add(avl, box(634), box(1925), nullptr); + avl = gpr_avl_add(avl, box(506), box(1926), nullptr); + avl = remove_int(avl, 248); + avl = gpr_avl_add(avl, box(124), box(1928), nullptr); + avl = gpr_avl_add(avl, box(181), box(1929), nullptr); + avl = remove_int(avl, 507); + avl = gpr_avl_add(avl, box(141), box(1931), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(906), box(1937), nullptr); + avl = gpr_avl_add(avl, box(44), box(1938), nullptr); + avl = remove_int(avl, 949); + avl = remove_int(avl, 117); + avl = gpr_avl_add(avl, box(700), box(1941), nullptr); + avl = gpr_avl_add(avl, box(258), box(1942), nullptr); + avl = remove_int(avl, 828); + avl = gpr_avl_add(avl, box(860), box(1944), nullptr); + avl = gpr_avl_add(avl, box(987), box(1945), nullptr); + avl = gpr_avl_add(avl, box(316), box(1946), nullptr); + avl = gpr_avl_add(avl, box(919), box(1947), nullptr); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(473), box(1949), nullptr); + avl = remove_int(avl, 127); + avl = remove_int(avl, 829); + avl = remove_int(avl, 829); + avl = gpr_avl_add(avl, box(488), box(1953), nullptr); + avl = gpr_avl_add(avl, box(954), box(1954), nullptr); + avl = remove_int(avl, 198); + avl = remove_int(avl, 972); + avl = remove_int(avl, 670); + avl = gpr_avl_add(avl, box(822), box(1958), nullptr); + avl = remove_int(avl, 589); + avl = remove_int(avl, 459); + avl = gpr_avl_add(avl, box(1003), box(1961), nullptr); + avl = gpr_avl_add(avl, box(657), box(1962), nullptr); + avl = gpr_avl_add(avl, box(477), box(1963), nullptr); + avl = gpr_avl_add(avl, box(923), box(1964), nullptr); + avl = remove_int(avl, 496); + avl = remove_int(avl, 99); + avl = gpr_avl_add(avl, box(127), box(1967), nullptr); + avl = gpr_avl_add(avl, box(1013), box(1968), nullptr); + avl = gpr_avl_add(avl, box(778), box(1969), nullptr); + 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), nullptr); + 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), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(412), box(1986), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(408), box(1992), nullptr); + avl = gpr_avl_add(avl, box(841), box(1993), nullptr); + avl = remove_int(avl, 593); + avl = gpr_avl_add(avl, box(582), box(1995), nullptr); + avl = gpr_avl_add(avl, box(597), box(1996), nullptr); + avl = remove_int(avl, 49); + avl = remove_int(avl, 835); + avl = gpr_avl_add(avl, box(417), box(1999), nullptr); + avl = gpr_avl_add(avl, box(191), box(2000), nullptr); + avl = remove_int(avl, 406); + avl = gpr_avl_add(avl, box(30), box(2002), nullptr); + avl = remove_int(avl, 841); + avl = remove_int(avl, 50); + avl = gpr_avl_add(avl, box(967), box(2005), nullptr); + avl = gpr_avl_add(avl, box(849), box(2006), nullptr); + avl = remove_int(avl, 608); + avl = gpr_avl_add(avl, box(306), box(2008), nullptr); + avl = remove_int(avl, 779); + avl = gpr_avl_add(avl, box(897), box(2010), nullptr); + avl = gpr_avl_add(avl, box(147), box(2011), nullptr); + avl = remove_int(avl, 982); + avl = gpr_avl_add(avl, box(470), box(2013), nullptr); + avl = remove_int(avl, 951); + avl = gpr_avl_add(avl, box(388), box(2015), nullptr); + 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), nullptr); + avl = remove_int(avl, 671); + avl = gpr_avl_add(avl, box(1020), box(2022), nullptr); + avl = remove_int(avl, 277); + avl = gpr_avl_add(avl, box(681), box(2024), nullptr); + avl = gpr_avl_add(avl, box(179), box(2025), nullptr); + avl = gpr_avl_add(avl, box(370), box(2026), nullptr); + avl = gpr_avl_add(avl, box(0), box(2027), nullptr); + avl = remove_int(avl, 523); + avl = gpr_avl_add(avl, box(99), box(2029), nullptr); + avl = gpr_avl_add(avl, box(334), box(2030), nullptr); + avl = gpr_avl_add(avl, box(569), box(2031), nullptr); + avl = gpr_avl_add(avl, box(257), box(2032), nullptr); + avl = remove_int(avl, 572); + avl = gpr_avl_add(avl, box(805), box(2034), nullptr); + avl = gpr_avl_add(avl, box(143), box(2035), nullptr); + avl = gpr_avl_add(avl, box(670), box(2036), nullptr); + avl = remove_int(avl, 42); + avl = gpr_avl_add(avl, box(46), box(2038), nullptr); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(353), box(2040), nullptr); + avl = remove_int(avl, 258); + avl = gpr_avl_add(avl, box(451), box(2042), nullptr); + avl = gpr_avl_add(avl, box(28), box(2043), nullptr); + avl = gpr_avl_add(avl, box(729), box(2044), nullptr); + avl = gpr_avl_add(avl, box(401), box(2045), nullptr); + avl = gpr_avl_add(avl, box(614), box(2046), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(980), box(2052), nullptr); + avl = gpr_avl_add(avl, box(990), box(2053), nullptr); + avl = gpr_avl_add(avl, box(355), box(2054), nullptr); + avl = remove_int(avl, 730); + avl = remove_int(avl, 37); + avl = gpr_avl_add(avl, box(407), box(2057), nullptr); + avl = gpr_avl_add(avl, box(222), box(2058), nullptr); + avl = gpr_avl_add(avl, box(439), box(2059), nullptr); + avl = gpr_avl_add(avl, box(563), box(2060), nullptr); + avl = remove_int(avl, 992); + avl = remove_int(avl, 786); + avl = gpr_avl_add(avl, box(1), box(2063), nullptr); + avl = gpr_avl_add(avl, box(473), box(2064), nullptr); + avl = gpr_avl_add(avl, box(992), box(2065), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(35), box(2071), nullptr); + avl = remove_int(avl, 843); + avl = gpr_avl_add(avl, box(855), box(2073), nullptr); + avl = remove_int(avl, 878); + avl = gpr_avl_add(avl, box(993), box(2075), nullptr); + avl = gpr_avl_add(avl, box(87), box(2076), nullptr); + avl = gpr_avl_add(avl, box(572), box(2077), nullptr); + avl = remove_int(avl, 896); + avl = gpr_avl_add(avl, box(849), box(2079), nullptr); + avl = remove_int(avl, 597); + avl = gpr_avl_add(avl, box(472), box(2081), nullptr); + avl = remove_int(avl, 778); + avl = remove_int(avl, 934); + avl = remove_int(avl, 314); + avl = gpr_avl_add(avl, box(101), box(2085), nullptr); + avl = remove_int(avl, 938); + avl = remove_int(avl, 1010); + avl = gpr_avl_add(avl, box(579), box(2088), nullptr); + avl = remove_int(avl, 798); + avl = remove_int(avl, 88); + avl = gpr_avl_add(avl, box(851), box(2091), nullptr); + avl = remove_int(avl, 705); + avl = gpr_avl_add(avl, box(26), box(2093), nullptr); + avl = remove_int(avl, 973); + avl = gpr_avl_add(avl, box(923), box(2095), nullptr); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(310), box(2097), nullptr); + avl = gpr_avl_add(avl, box(269), box(2098), nullptr); + avl = remove_int(avl, 173); + avl = gpr_avl_add(avl, box(279), box(2100), nullptr); + avl = remove_int(avl, 203); + avl = gpr_avl_add(avl, box(411), box(2102), nullptr); + avl = remove_int(avl, 950); + avl = gpr_avl_add(avl, box(6), box(2104), nullptr); + avl = remove_int(avl, 400); + avl = remove_int(avl, 468); + avl = remove_int(avl, 271); + avl = gpr_avl_add(avl, box(627), box(2108), nullptr); + avl = remove_int(avl, 727); + avl = remove_int(avl, 148); + avl = remove_int(avl, 98); + avl = remove_int(avl, 997); + avl = remove_int(avl, 215); + avl = remove_int(avl, 628); + avl = remove_int(avl, 826); + avl = remove_int(avl, 664); + avl = gpr_avl_add(avl, box(76), box(2117), nullptr); + avl = remove_int(avl, 194); + avl = remove_int(avl, 18); + avl = gpr_avl_add(avl, box(727), box(2120), nullptr); + avl = remove_int(avl, 295); + avl = gpr_avl_add(avl, box(645), box(2122), nullptr); + avl = remove_int(avl, 321); + avl = remove_int(avl, 863); + avl = gpr_avl_add(avl, box(824), box(2125), nullptr); + avl = gpr_avl_add(avl, box(651), box(2126), nullptr); + avl = gpr_avl_add(avl, box(804), box(2127), nullptr); + avl = remove_int(avl, 307); + avl = gpr_avl_add(avl, box(867), box(2129), nullptr); + avl = remove_int(avl, 384); + avl = gpr_avl_add(avl, box(819), box(2131), nullptr); + avl = remove_int(avl, 674); + avl = gpr_avl_add(avl, box(76), box(2133), nullptr); + avl = remove_int(avl, 898); + avl = gpr_avl_add(avl, box(45), box(2135), nullptr); + avl = gpr_avl_add(avl, box(512), box(2136), nullptr); + 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), nullptr); + avl = remove_int(avl, 509); + avl = remove_int(avl, 301); + avl = gpr_avl_add(avl, box(861), box(2146), nullptr); + avl = gpr_avl_add(avl, box(918), box(2147), nullptr); + avl = remove_int(avl, 992); + avl = gpr_avl_add(avl, box(356), box(2149), nullptr); + avl = remove_int(avl, 64); + avl = remove_int(avl, 444); + avl = remove_int(avl, 741); + avl = gpr_avl_add(avl, box(710), box(2153), nullptr); + avl = gpr_avl_add(avl, box(264), box(2154), nullptr); + avl = remove_int(avl, 347); + avl = remove_int(avl, 250); + avl = gpr_avl_add(avl, box(82), box(2157), nullptr); + avl = gpr_avl_add(avl, box(571), box(2158), nullptr); + avl = remove_int(avl, 721); + avl = remove_int(avl, 622); + avl = gpr_avl_add(avl, box(950), box(2161), nullptr); + avl = gpr_avl_add(avl, box(94), box(2162), nullptr); + avl = remove_int(avl, 970); + avl = gpr_avl_add(avl, box(815), box(2164), nullptr); + avl = remove_int(avl, 930); + avl = remove_int(avl, 703); + avl = gpr_avl_add(avl, box(432), box(2167), nullptr); + avl = remove_int(avl, 544); + avl = gpr_avl_add(avl, box(21), box(2169), nullptr); + avl = gpr_avl_add(avl, box(186), box(2170), nullptr); + avl = remove_int(avl, 143); + avl = gpr_avl_add(avl, box(425), box(2172), nullptr); + avl = remove_int(avl, 769); + avl = gpr_avl_add(avl, box(656), box(2174), nullptr); + avl = remove_int(avl, 29); + avl = gpr_avl_add(avl, box(464), box(2176), nullptr); + avl = remove_int(avl, 713); + avl = gpr_avl_add(avl, box(800), box(2178), nullptr); + avl = remove_int(avl, 621); + avl = gpr_avl_add(avl, box(962), box(2180), nullptr); + avl = remove_int(avl, 448); + avl = gpr_avl_add(avl, box(878), box(2182), nullptr); + avl = remove_int(avl, 39); + avl = remove_int(avl, 999); + avl = gpr_avl_add(avl, box(182), box(2185), nullptr); + avl = gpr_avl_add(avl, box(429), box(2186), nullptr); + avl = gpr_avl_add(avl, box(598), box(2187), nullptr); + avl = remove_int(avl, 551); + avl = gpr_avl_add(avl, box(827), box(2189), nullptr); + avl = gpr_avl_add(avl, box(809), box(2190), nullptr); + avl = remove_int(avl, 438); + avl = remove_int(avl, 811); + avl = gpr_avl_add(avl, box(808), box(2193), nullptr); + avl = gpr_avl_add(avl, box(788), box(2194), nullptr); + avl = remove_int(avl, 156); + avl = gpr_avl_add(avl, box(933), box(2196), nullptr); + avl = gpr_avl_add(avl, box(344), box(2197), nullptr); + avl = remove_int(avl, 460); + avl = gpr_avl_add(avl, box(161), box(2199), nullptr); + avl = gpr_avl_add(avl, box(444), box(2200), nullptr); + avl = remove_int(avl, 597); + avl = remove_int(avl, 668); + avl = gpr_avl_add(avl, box(703), box(2203), nullptr); + avl = remove_int(avl, 515); + avl = gpr_avl_add(avl, box(380), box(2205), nullptr); + avl = gpr_avl_add(avl, box(338), box(2206), nullptr); + 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), nullptr); + avl = remove_int(avl, 450); + avl = gpr_avl_add(avl, box(411), box(2213), nullptr); + avl = gpr_avl_add(avl, box(117), box(2214), nullptr); + avl = gpr_avl_add(avl, box(322), box(2215), nullptr); + avl = gpr_avl_add(avl, box(915), box(2216), nullptr); + avl = gpr_avl_add(avl, box(410), box(2217), nullptr); + avl = gpr_avl_add(avl, box(66), box(2218), nullptr); + avl = remove_int(avl, 756); + avl = remove_int(avl, 596); + avl = gpr_avl_add(avl, box(882), box(2221), nullptr); + avl = gpr_avl_add(avl, box(930), box(2222), nullptr); + avl = gpr_avl_add(avl, box(36), box(2223), nullptr); + avl = remove_int(avl, 742); + avl = gpr_avl_add(avl, box(539), box(2225), nullptr); + avl = gpr_avl_add(avl, box(596), box(2226), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(493), box(2233), nullptr); + avl = gpr_avl_add(avl, box(839), box(2234), nullptr); + avl = remove_int(avl, 774); + avl = gpr_avl_add(avl, box(337), box(2236), nullptr); + avl = remove_int(avl, 322); + avl = gpr_avl_add(avl, box(16), box(2238), nullptr); + 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), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(138), box(2249), nullptr); + avl = gpr_avl_add(avl, box(437), box(2250), nullptr); + avl = gpr_avl_add(avl, box(275), box(2251), nullptr); + avl = remove_int(avl, 520); + avl = gpr_avl_add(avl, box(1019), box(2253), nullptr); + avl = remove_int(avl, 955); + avl = gpr_avl_add(avl, box(270), box(2255), nullptr); + avl = remove_int(avl, 680); + avl = remove_int(avl, 698); + avl = gpr_avl_add(avl, box(735), box(2258), nullptr); + avl = gpr_avl_add(avl, box(400), box(2259), nullptr); + avl = remove_int(avl, 991); + avl = gpr_avl_add(avl, box(263), box(2261), nullptr); + avl = remove_int(avl, 704); + avl = gpr_avl_add(avl, box(757), box(2263), nullptr); + avl = remove_int(avl, 194); + avl = remove_int(avl, 616); + avl = remove_int(avl, 784); + avl = gpr_avl_add(avl, box(382), box(2267), nullptr); + avl = gpr_avl_add(avl, box(464), box(2268), nullptr); + avl = gpr_avl_add(avl, box(817), box(2269), nullptr); + avl = remove_int(avl, 445); + avl = gpr_avl_add(avl, box(412), box(2271), nullptr); + avl = remove_int(avl, 525); + avl = gpr_avl_add(avl, box(299), box(2273), nullptr); + avl = gpr_avl_add(avl, box(464), box(2274), nullptr); + avl = gpr_avl_add(avl, box(715), box(2275), nullptr); + avl = remove_int(avl, 58); + avl = remove_int(avl, 218); + avl = gpr_avl_add(avl, box(961), box(2278), nullptr); + avl = gpr_avl_add(avl, box(491), box(2279), nullptr); + avl = remove_int(avl, 846); + avl = gpr_avl_add(avl, box(762), box(2281), nullptr); + avl = remove_int(avl, 974); + avl = remove_int(avl, 887); + avl = gpr_avl_add(avl, box(498), box(2284), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(1021), box(2290), nullptr); + avl = remove_int(avl, 155); + avl = remove_int(avl, 128); + avl = gpr_avl_add(avl, box(819), box(2293), nullptr); + avl = gpr_avl_add(avl, box(324), box(2294), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(474), box(2301), nullptr); + avl = gpr_avl_add(avl, box(719), box(2302), nullptr); + avl = gpr_avl_add(avl, box(236), box(2303), nullptr); + avl = remove_int(avl, 818); + avl = gpr_avl_add(avl, box(727), box(2305), nullptr); + avl = remove_int(avl, 892); + avl = remove_int(avl, 871); + avl = remove_int(avl, 231); + avl = gpr_avl_add(avl, box(62), box(2309), nullptr); + avl = gpr_avl_add(avl, box(953), box(2310), nullptr); + avl = remove_int(avl, 701); + avl = gpr_avl_add(avl, box(193), box(2312), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(751), box(2318), nullptr); + avl = remove_int(avl, 525); + avl = gpr_avl_add(avl, box(217), box(2320), nullptr); + avl = remove_int(avl, 336); + avl = gpr_avl_add(avl, box(86), box(2322), nullptr); + avl = gpr_avl_add(avl, box(81), box(2323), nullptr); + avl = gpr_avl_add(avl, box(850), box(2324), nullptr); + avl = remove_int(avl, 872); + avl = gpr_avl_add(avl, box(402), box(2326), nullptr); + avl = gpr_avl_add(avl, box(54), box(2327), nullptr); + avl = gpr_avl_add(avl, box(980), box(2328), nullptr); + avl = gpr_avl_add(avl, box(845), box(2329), nullptr); + avl = remove_int(avl, 1004); + avl = remove_int(avl, 273); + avl = remove_int(avl, 879); + avl = gpr_avl_add(avl, box(354), box(2333), nullptr); + avl = gpr_avl_add(avl, box(58), box(2334), nullptr); + avl = gpr_avl_add(avl, box(127), box(2335), nullptr); + avl = remove_int(avl, 84); + avl = gpr_avl_add(avl, box(360), box(2337), nullptr); + 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), nullptr); + avl = remove_int(avl, 558); + avl = remove_int(avl, 958); + avl = gpr_avl_add(avl, box(822), box(2345), nullptr); + avl = remove_int(avl, 1004); + avl = remove_int(avl, 747); + avl = gpr_avl_add(avl, box(631), box(2348), nullptr); + avl = gpr_avl_add(avl, box(442), box(2349), nullptr); + avl = remove_int(avl, 957); + avl = remove_int(avl, 964); + avl = gpr_avl_add(avl, box(10), box(2352), nullptr); + avl = remove_int(avl, 189); + avl = gpr_avl_add(avl, box(742), box(2354), nullptr); + avl = remove_int(avl, 108); + avl = gpr_avl_add(avl, box(1014), box(2356), nullptr); + avl = remove_int(avl, 266); + avl = remove_int(avl, 623); + avl = remove_int(avl, 697); + avl = gpr_avl_add(avl, box(180), box(2360), nullptr); + avl = remove_int(avl, 472); + avl = gpr_avl_add(avl, box(567), box(2362), nullptr); + avl = remove_int(avl, 1020); + avl = remove_int(avl, 273); + avl = gpr_avl_add(avl, box(864), box(2365), nullptr); + avl = gpr_avl_add(avl, box(1009), box(2366), nullptr); + avl = remove_int(avl, 224); + avl = remove_int(avl, 81); + avl = gpr_avl_add(avl, box(653), box(2369), nullptr); + avl = remove_int(avl, 67); + avl = remove_int(avl, 102); + avl = remove_int(avl, 76); + avl = remove_int(avl, 935); + avl = remove_int(avl, 169); + avl = remove_int(avl, 232); + avl = remove_int(avl, 79); + avl = gpr_avl_add(avl, box(509), box(2377), nullptr); + 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), nullptr); + avl = gpr_avl_add(avl, box(925), box(2383), nullptr); + avl = remove_int(avl, 994); + avl = remove_int(avl, 324); + avl = gpr_avl_add(avl, box(291), box(2386), nullptr); + avl = remove_int(avl, 94); + avl = remove_int(avl, 795); + avl = remove_int(avl, 42); + avl = gpr_avl_add(avl, box(613), box(2390), nullptr); + avl = remove_int(avl, 289); + avl = gpr_avl_add(avl, box(980), box(2392), nullptr); + avl = remove_int(avl, 316); + avl = gpr_avl_add(avl, box(281), box(2394), nullptr); + avl = gpr_avl_add(avl, box(1006), box(2395), nullptr); + avl = remove_int(avl, 776); + avl = gpr_avl_add(avl, box(108), box(2397), nullptr); + avl = gpr_avl_add(avl, box(918), box(2398), nullptr); + avl = remove_int(avl, 721); + avl = remove_int(avl, 563); + avl = gpr_avl_add(avl, box(925), box(2401), nullptr); + avl = remove_int(avl, 448); + avl = remove_int(avl, 198); + avl = remove_int(avl, 1); + avl = gpr_avl_add(avl, box(160), box(2405), nullptr); + avl = remove_int(avl, 515); + avl = gpr_avl_add(avl, box(284), box(2407), nullptr); + avl = gpr_avl_add(avl, box(225), box(2408), nullptr); + avl = remove_int(avl, 304); + avl = gpr_avl_add(avl, box(714), box(2410), nullptr); + avl = gpr_avl_add(avl, box(708), box(2411), nullptr); + avl = gpr_avl_add(avl, box(624), box(2412), nullptr); + 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), nullptr); + avl = remove_int(avl, 280); + avl = remove_int(avl, 25); + avl = remove_int(avl, 633); + avl = gpr_avl_add(avl, box(897), box(2421), nullptr); + avl = remove_int(avl, 636); + avl = remove_int(avl, 596); + avl = remove_int(avl, 757); + avl = remove_int(avl, 343); + avl = remove_int(avl, 162); + avl = remove_int(avl, 913); + avl = remove_int(avl, 843); + avl = remove_int(avl, 280); + avl = remove_int(avl, 911); + avl = gpr_avl_add(avl, box(1008), box(2431), nullptr); + avl = remove_int(avl, 948); + avl = remove_int(avl, 74); + avl = remove_int(avl, 571); + avl = gpr_avl_add(avl, box(486), box(2435), nullptr); + avl = gpr_avl_add(avl, box(285), box(2436), nullptr); + avl = remove_int(avl, 304); + avl = remove_int(avl, 516); + avl = gpr_avl_add(avl, box(758), box(2439), nullptr); + avl = gpr_avl_add(avl, box(776), box(2440), nullptr); + avl = remove_int(avl, 696); + avl = gpr_avl_add(avl, box(104), box(2442), nullptr); + avl = gpr_avl_add(avl, box(700), box(2443), nullptr); + avl = gpr_avl_add(avl, box(114), box(2444), nullptr); + avl = gpr_avl_add(avl, box(567), box(2445), nullptr); + avl = remove_int(avl, 620); + avl = gpr_avl_add(avl, box(270), box(2447), nullptr); + avl = remove_int(avl, 730); + avl = gpr_avl_add(avl, box(749), box(2449), nullptr); + avl = gpr_avl_add(avl, box(443), box(2450), nullptr); + avl = remove_int(avl, 457); + avl = gpr_avl_add(avl, box(571), box(2452), nullptr); + avl = gpr_avl_add(avl, box(626), box(2453), nullptr); + avl = remove_int(avl, 638); + avl = remove_int(avl, 313); + + gpr_avl_unref(avl, nullptr); +} + +static void test_stress(int amount_of_stress) { + int added[1024]; + int i, j; + int deletions = 0; + gpr_avl avl; + + unsigned seed = (unsigned)time(nullptr); + + gpr_log(GPR_DEBUG, "test_stress amount=%d seed=%u", amount_of_stress, seed); + + srand((unsigned)time(nullptr)); + avl = gpr_avl_create(&int_int_vtable); + + memset(added, 0, sizeof(added)); + + for (i = 1; deletions < amount_of_stress; i++) { + int idx = rand() % (int)GPR_ARRAY_SIZE(added); + GPR_ASSERT(i); + if (rand() < RAND_MAX / 2) { + added[idx] = 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), nullptr); + } else { + deletions += (added[idx] != 0); + added[idx] = 0; + printf("avl = remove_int(avl, %d); /* d=%d */\n", idx, deletions); + avl = remove_int(avl, idx); + } + for (j = 0; j < (int)GPR_ARRAY_SIZE(added); j++) { + if (added[j] != 0) { + check_get(avl, j, added[j]); + } else { + check_negget(avl, j); + } + } + } + + gpr_avl_unref(avl, nullptr); +} + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + + test_get(); + test_ll(); + test_lr(); + test_rr(); + test_rl(); + test_unbalanced(); + test_replace(); + test_remove(); + test_badcase1(); + test_badcase2(); + test_badcase3(); + test_stress(10); + + return 0; +} diff --git a/test/core/gpr/cmdline_test.cc b/test/core/gpr/cmdline_test.cc new file mode 100644 index 0000000000..172efda8a0 --- /dev/null +++ b/test/core/gpr/cmdline_test.cc @@ -0,0 +1,491 @@ +/* + * + * 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. + * + */ + +#include + +#include + +#include +#include +#include +#include "test/core/util/test_config.h" + +#define LOG_TEST() gpr_log(GPR_INFO, "test at %s:%d", __FILE__, __LINE__) + +static void test_simple_int(void) { + int x = 1; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("-foo"), + const_cast("3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_int(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 1); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 3); + gpr_cmdline_destroy(cl); +} + +static void test_eq_int(void) { + int x = 1; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("-foo=3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_int(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 1); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 3); + gpr_cmdline_destroy(cl); +} + +static void test_2dash_int(void) { + int x = 1; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo"), + const_cast("3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_int(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 1); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 3); + gpr_cmdline_destroy(cl); +} + +static void test_2dash_eq_int(void) { + int x = 1; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_int(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 1); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 3); + gpr_cmdline_destroy(cl); +} + +static void test_simple_string(void) { + const char* x = nullptr; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("-foo"), + const_cast("3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "foo", nullptr, &x); + GPR_ASSERT(x == nullptr); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(0 == strcmp(x, "3")); + gpr_cmdline_destroy(cl); +} + +static void test_eq_string(void) { + const char* x = nullptr; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("-foo=3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "foo", nullptr, &x); + GPR_ASSERT(x == nullptr); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(0 == strcmp(x, "3")); + gpr_cmdline_destroy(cl); +} + +static void test_2dash_string(void) { + const char* x = nullptr; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo"), + const_cast("3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "foo", nullptr, &x); + GPR_ASSERT(x == nullptr); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(0 == strcmp(x, "3")); + gpr_cmdline_destroy(cl); +} + +static void test_2dash_eq_string(void) { + const char* x = nullptr; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=3")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "foo", nullptr, &x); + GPR_ASSERT(x == nullptr); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(0 == strcmp(x, "3")); + gpr_cmdline_destroy(cl); +} + +static void test_flag_on(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 1); + gpr_cmdline_destroy(cl); +} + +static void test_flag_no(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--no-foo")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 0); + gpr_cmdline_destroy(cl); +} + +static void test_flag_val_1(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=1")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 1); + gpr_cmdline_destroy(cl); +} + +static void test_flag_val_0(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=0")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 0); + gpr_cmdline_destroy(cl); +} + +static void test_flag_val_true(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=true")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 1); + gpr_cmdline_destroy(cl); +} + +static void test_flag_val_false(void) { + int x = 2; + gpr_cmdline* cl; + char* args[] = {(char*)__FILE__, const_cast("--foo=false")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_flag(cl, "foo", nullptr, &x); + GPR_ASSERT(x == 2); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 0); + gpr_cmdline_destroy(cl); +} + +static void test_many(void) { + const char* str = nullptr; + int x = 0; + int flag = 2; + gpr_cmdline* cl; + + char* args[] = {(char*)__FILE__, const_cast("--str"), + const_cast("hello"), const_cast("-x=4"), + const_cast("-no-flag")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(x == 4); + GPR_ASSERT(0 == strcmp(str, "hello")); + GPR_ASSERT(flag == 0); + gpr_cmdline_destroy(cl); +} + +static void extra_arg_cb(void* user_data, const char* arg) { + int* count = static_cast(user_data); + GPR_ASSERT(arg != nullptr); + GPR_ASSERT(strlen(arg) == 1); + GPR_ASSERT(arg[0] == 'a' + *count); + ++*count; +} + +static void test_extra(void) { + gpr_cmdline* cl; + int count = 0; + char* args[] = {(char*)__FILE__, const_cast("a"), + const_cast("b"), const_cast("c")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + &count); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(count == 3); + gpr_cmdline_destroy(cl); +} + +static void test_extra_dashdash(void) { + gpr_cmdline* cl; + int count = 0; + char* args[] = {(char*)__FILE__, const_cast("--"), + const_cast("a"), const_cast("b"), + const_cast("c")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + &count); + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); + GPR_ASSERT(count == 3); + gpr_cmdline_destroy(cl); +} + +static void test_usage(void) { + gpr_cmdline* cl; + char* usage; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + usage = gpr_cmdline_usage_string(cl, "test"); + GPR_ASSERT(0 == strcmp(usage, + "Usage: test [--str=string] [--x=int] " + "[--flag|--no-flag] [file...]\n")); + gpr_free(usage); + + usage = gpr_cmdline_usage_string(cl, "/foo/test"); + GPR_ASSERT(0 == strcmp(usage, + "Usage: test [--str=string] [--x=int] " + "[--flag|--no-flag] [file...]\n")); + gpr_free(usage); + + gpr_cmdline_destroy(cl); +} + +static void test_help(void) { + gpr_cmdline* cl; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + char* help[] = {(char*)__FILE__, const_cast("-h")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_set_survive_failure(cl); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(help), help)); + + gpr_cmdline_destroy(cl); +} + +static void test_badargs1(void) { + gpr_cmdline* cl; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + char* bad_arg_name[] = {(char*)__FILE__, const_cast("--y")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_set_survive_failure(cl); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + GPR_ASSERT(0 == + gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_arg_name), bad_arg_name)); + + gpr_cmdline_destroy(cl); +} + +static void test_badargs2(void) { + gpr_cmdline* cl; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + char* bad_int_value[] = {(char*)__FILE__, const_cast("--x"), + const_cast("henry")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_set_survive_failure(cl); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + GPR_ASSERT( + 0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_int_value), bad_int_value)); + + gpr_cmdline_destroy(cl); +} + +static void test_badargs3(void) { + gpr_cmdline* cl; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + char* bad_bool_value[] = {(char*)__FILE__, const_cast("--flag=henry")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_set_survive_failure(cl); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_bool_value), + bad_bool_value)); + + gpr_cmdline_destroy(cl); +} + +static void test_badargs4(void) { + gpr_cmdline* cl; + + const char* str = nullptr; + int x = 0; + int flag = 2; + + char* bad_bool_value[] = {(char*)__FILE__, const_cast("--no-str")}; + + LOG_TEST(); + + cl = gpr_cmdline_create(nullptr); + gpr_cmdline_set_survive_failure(cl); + gpr_cmdline_add_string(cl, "str", nullptr, &str); + gpr_cmdline_add_int(cl, "x", nullptr, &x); + gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); + gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, + nullptr); + + GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_bool_value), + bad_bool_value)); + + gpr_cmdline_destroy(cl); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + test_simple_int(); + test_eq_int(); + test_2dash_int(); + test_2dash_eq_int(); + test_simple_string(); + test_eq_string(); + test_2dash_string(); + test_2dash_eq_string(); + test_flag_on(); + test_flag_no(); + test_flag_val_1(); + test_flag_val_0(); + test_flag_val_true(); + test_flag_val_false(); + test_many(); + test_extra(); + test_extra_dashdash(); + test_usage(); + test_help(); + test_badargs1(); + test_badargs2(); + test_badargs3(); + test_badargs4(); + return 0; +} diff --git a/test/core/gpr/cpu_test.cc b/test/core/gpr/cpu_test.cc new file mode 100644 index 0000000000..87cdc0fb50 --- /dev/null +++ b/test/core/gpr/cpu_test.cc @@ -0,0 +1,139 @@ +/* + * + * 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. + * + */ + +/* Test gpr per-cpu support: + gpr_cpu_num_cores() + gpr_cpu_current_cpu() +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +/* Test structure is essentially: + 1) Figure out how many cores are present on the test system + 2) Create 3 times that many threads + 3) Have each thread do some amount of work (basically want to + gaurantee that all threads are running at once, and enough of them + to run on all cores). + 4) Each thread checks what core it is running on, and marks that core + as "used" in the test. + 5) Count number of "used" cores. + + The test will fail if: + 1) gpr_cpu_num_cores() == 0 + 2) Any result from gpr_cpu_current_cpu() >= gpr_cpu_num_cores() + 3) Ideally, we would fail if not all cores were seen as used. Unfortunately, + this is only probabilistically true, and depends on the OS, it's + scheduler, etc. So we just print out an indication of how many were seen; + hopefully developers can use this to sanity check their system. +*/ + +/* Status shared across threads */ +struct cpu_test { + gpr_mu mu; + int nthreads; + uint32_t ncores; + int is_done; + gpr_cv done_cv; + int* used; /* is this core used? */ + unsigned r; /* random number */ +}; + +static void worker_thread(void* arg) { + struct cpu_test* ct = (struct cpu_test*)arg; + uint32_t cpu; + unsigned r = 12345678; + unsigned i, j; + /* Avoid repetitive division calculations */ + int64_t max_i = 1000 / grpc_test_slowdown_factor(); + int64_t max_j = 1000 / grpc_test_slowdown_factor(); + for (i = 0; i < max_i; i++) { + /* run for a bit - just calculate something random. */ + for (j = 0; j < max_j; j++) { + r = (r * 17) & ((r - i) | (r * i)); + } + cpu = gpr_cpu_current_cpu(); + GPR_ASSERT(cpu < ct->ncores); + gpr_mu_lock(&ct->mu); + ct->used[cpu] = 1; + for (j = 0; j < ct->ncores; j++) { + if (!ct->used[j]) break; + } + gpr_mu_unlock(&ct->mu); + if (j == ct->ncores) { + break; /* all cpus have been used - no further use in running this test */ + } + } + gpr_mu_lock(&ct->mu); + ct->r = r; /* make it look like we care about r's value... */ + ct->nthreads--; + if (ct->nthreads == 0) { + ct->is_done = 1; + gpr_cv_signal(&ct->done_cv); + } + gpr_mu_unlock(&ct->mu); +} + +static void cpu_test(void) { + uint32_t i; + int cores_seen = 0; + struct cpu_test ct; + gpr_thd_id thd; + ct.ncores = gpr_cpu_num_cores(); + GPR_ASSERT(ct.ncores > 0); + ct.nthreads = (int)ct.ncores * 3; + ct.used = static_cast(gpr_malloc(ct.ncores * sizeof(int))); + memset(ct.used, 0, ct.ncores * sizeof(int)); + gpr_mu_init(&ct.mu); + gpr_cv_init(&ct.done_cv); + ct.is_done = 0; + for (i = 0; i < ct.ncores * 3; i++) { + GPR_ASSERT( + gpr_thd_new(&thd, "grpc_cpu_test", &worker_thread, &ct, nullptr)); + } + gpr_mu_lock(&ct.mu); + while (!ct.is_done) { + gpr_cv_wait(&ct.done_cv, &ct.mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + gpr_mu_unlock(&ct.mu); + fprintf(stderr, "Saw cores ["); + fflush(stderr); + for (i = 0; i < ct.ncores; i++) { + if (ct.used[i]) { + fprintf(stderr, "%d,", i); + fflush(stderr); + cores_seen++; + } + } + fprintf(stderr, "] (%d/%d)\n", cores_seen, ct.ncores); + fflush(stderr); + gpr_free(ct.used); +} + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + cpu_test(); + return 0; +} diff --git a/test/core/gpr/env_test.cc b/test/core/gpr/env_test.cc new file mode 100644 index 0000000000..3f4b493239 --- /dev/null +++ b/test/core/gpr/env_test.cc @@ -0,0 +1,49 @@ +/* + * + * 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. + * + */ + +#include +#include + +#include +#include + +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "test/core/util/test_config.h" + +#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) + +static void test_setenv_getenv(void) { + const char* name = "FOO"; + const char* value = "BAR"; + char* retrieved_value; + + LOG_TEST_NAME("test_setenv_getenv"); + + gpr_setenv(name, value); + retrieved_value = gpr_getenv(name); + GPR_ASSERT(retrieved_value != nullptr); + GPR_ASSERT(strcmp(value, retrieved_value) == 0); + gpr_free(retrieved_value); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + test_setenv_getenv(); + return 0; +} diff --git a/test/core/gpr/host_port_test.cc b/test/core/gpr/host_port_test.cc new file mode 100644 index 0000000000..42dd56524f --- /dev/null +++ b/test/core/gpr/host_port_test.cc @@ -0,0 +1,58 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include +#include +#include "test/core/util/test_config.h" + +static void join_host_port_expect(const char* host, int port, + const char* expected) { + char* buf; + int len; + len = gpr_join_host_port(&buf, host, port); + GPR_ASSERT(len >= 0); + GPR_ASSERT(strlen(expected) == (size_t)len); + GPR_ASSERT(strcmp(expected, buf) == 0); + gpr_free(buf); +} + +static void test_join_host_port(void) { + join_host_port_expect("foo", 101, "foo:101"); + join_host_port_expect("", 102, ":102"); + join_host_port_expect("1::2", 103, "[1::2]:103"); + join_host_port_expect("[::1]", 104, "[::1]:104"); +} + +/* Garbage in, garbage out. */ +static void test_join_host_port_garbage(void) { + join_host_port_expect("[foo]", 105, "[foo]:105"); + join_host_port_expect("[::", 106, "[:::106"); + join_host_port_expect("::]", 107, "[::]]:107"); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + + test_join_host_port(); + test_join_host_port_garbage(); + + return 0; +} diff --git a/test/core/gpr/log_test.cc b/test/core/gpr/log_test.cc new file mode 100644 index 0000000000..839ff0aef9 --- /dev/null +++ b/test/core/gpr/log_test.cc @@ -0,0 +1,108 @@ +/* + * + * 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. + * + */ + +#include + +#include +#include + +#include "src/core/lib/gpr/env.h" +#include "test/core/util/test_config.h" + +static bool log_func_reached = false; + +static void test_callback(gpr_log_func_args* args) { + GPR_ASSERT(0 == strcmp(__FILE__, args->file)); + GPR_ASSERT(args->severity == GPR_LOG_SEVERITY_INFO); + GPR_ASSERT(0 == strcmp(args->message, "hello 1 2 3")); +} + +static void test_should_log(gpr_log_func_args* args) { + log_func_reached = true; +} + +static void test_should_not_log(gpr_log_func_args* args) { GPR_ASSERT(false); } + +#define test_log_function_reached(SEVERITY) \ + gpr_set_log_function(test_should_log); \ + log_func_reached = false; \ + gpr_log_message(SEVERITY, "hello 1 2 3"); \ + GPR_ASSERT(log_func_reached); \ + log_func_reached = false; \ + gpr_log(SEVERITY, "hello %d %d %d", 1, 2, 3); \ + GPR_ASSERT(log_func_reached); + +#define test_log_function_unreached(SEVERITY) \ + gpr_set_log_function(test_should_not_log); \ + gpr_log_message(SEVERITY, "hello 1 2 3"); \ + gpr_log(SEVERITY, "hello %d %d %d", 1, 2, 3); + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + /* test logging at various verbosity levels */ + gpr_log(GPR_DEBUG, "%s", "hello world"); + gpr_log(GPR_INFO, "%s", "hello world"); + gpr_log(GPR_ERROR, "%s", "hello world"); + /* should succeed */ + GPR_ASSERT(1); + gpr_set_log_function(test_callback); + gpr_log_message(GPR_INFO, "hello 1 2 3"); + gpr_log(GPR_INFO, "hello %d %d %d", 1, 2, 3); + gpr_set_log_function(nullptr); + + /* gpr_log_verbosity_init() will be effective only once, and only before + * gpr_set_log_verbosity() is called */ + gpr_setenv("GRPC_VERBOSITY", "ERROR"); + gpr_log_verbosity_init(); + + test_log_function_reached(GPR_ERROR); + test_log_function_unreached(GPR_INFO); + test_log_function_unreached(GPR_DEBUG); + + /* gpr_log_verbosity_init() should not be effective */ + gpr_setenv("GRPC_VERBOSITY", "DEBUG"); + gpr_log_verbosity_init(); + test_log_function_reached(GPR_ERROR); + test_log_function_unreached(GPR_INFO); + test_log_function_unreached(GPR_DEBUG); + + gpr_set_log_verbosity(GPR_LOG_SEVERITY_DEBUG); + test_log_function_reached(GPR_ERROR); + test_log_function_reached(GPR_INFO); + test_log_function_reached(GPR_DEBUG); + + gpr_set_log_verbosity(GPR_LOG_SEVERITY_INFO); + test_log_function_reached(GPR_ERROR); + test_log_function_reached(GPR_INFO); + test_log_function_unreached(GPR_DEBUG); + + gpr_set_log_verbosity(GPR_LOG_SEVERITY_ERROR); + test_log_function_reached(GPR_ERROR); + test_log_function_unreached(GPR_INFO); + test_log_function_unreached(GPR_DEBUG); + + /* gpr_log_verbosity_init() should not be effective */ + gpr_setenv("GRPC_VERBOSITY", "DEBUG"); + gpr_log_verbosity_init(); + test_log_function_reached(GPR_ERROR); + test_log_function_unreached(GPR_INFO); + test_log_function_unreached(GPR_DEBUG); + + /* TODO(ctiller): should we add a GPR_ASSERT failure test here */ + return 0; +} diff --git a/test/core/gpr/mpscq_test.cc b/test/core/gpr/mpscq_test.cc new file mode 100644 index 0000000000..5a8177543c --- /dev/null +++ b/test/core/gpr/mpscq_test.cc @@ -0,0 +1,194 @@ +/* + * + * Copyright 2016 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/gpr/mpscq.h" + +#include + +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +typedef struct test_node { + gpr_mpscq_node node; + size_t i; + size_t* ctr; +} test_node; + +static test_node* new_node(size_t i, size_t* ctr) { + test_node* n = static_cast(gpr_malloc(sizeof(test_node))); + n->i = i; + n->ctr = ctr; + return n; +} + +static void test_serial(void) { + gpr_log(GPR_DEBUG, "test_serial"); + gpr_mpscq q; + gpr_mpscq_init(&q); + for (size_t i = 0; i < 10000000; i++) { + gpr_mpscq_push(&q, &new_node(i, nullptr)->node); + } + for (size_t i = 0; i < 10000000; i++) { + test_node* n = (test_node*)gpr_mpscq_pop(&q); + GPR_ASSERT(n); + GPR_ASSERT(n->i == i); + gpr_free(n); + } +} + +typedef struct { + size_t ctr; + gpr_mpscq* q; + gpr_event* start; +} thd_args; + +#define THREAD_ITERATIONS 10000 + +static void test_thread(void* args) { + thd_args* a = static_cast(args); + gpr_event_wait(a->start, gpr_inf_future(GPR_CLOCK_REALTIME)); + for (size_t i = 1; i <= THREAD_ITERATIONS; i++) { + gpr_mpscq_push(a->q, &new_node(i, &a->ctr)->node); + } +} + +static void test_mt(void) { + gpr_log(GPR_DEBUG, "test_mt"); + gpr_event start; + gpr_event_init(&start); + gpr_thd_id thds[100]; + thd_args ta[GPR_ARRAY_SIZE(thds)]; + gpr_mpscq q; + gpr_mpscq_init(&q); + for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { + gpr_thd_options options = gpr_thd_options_default(); + gpr_thd_options_set_joinable(&options); + ta[i].ctr = 0; + ta[i].q = &q; + ta[i].start = &start; + GPR_ASSERT( + gpr_thd_new(&thds[i], "grpc_mt_test", test_thread, &ta[i], &options)); + } + size_t num_done = 0; + size_t spins = 0; + gpr_event_set(&start, (void*)1); + while (num_done != GPR_ARRAY_SIZE(thds)) { + gpr_mpscq_node* n; + while ((n = gpr_mpscq_pop(&q)) == nullptr) { + spins++; + } + test_node* tn = (test_node*)n; + GPR_ASSERT(*tn->ctr == tn->i - 1); + *tn->ctr = tn->i; + if (tn->i == THREAD_ITERATIONS) num_done++; + gpr_free(tn); + } + gpr_log(GPR_DEBUG, "spins: %" PRIdPTR, spins); + for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { + gpr_thd_join(thds[i]); + } + gpr_mpscq_destroy(&q); +} + +typedef struct { + thd_args* ta; + size_t num_thds; + gpr_mu mu; + size_t num_done; + size_t spins; + gpr_mpscq* q; + gpr_event* start; +} pull_args; + +static void pull_thread(void* arg) { + pull_args* pa = static_cast(arg); + gpr_event_wait(pa->start, gpr_inf_future(GPR_CLOCK_REALTIME)); + + for (;;) { + gpr_mu_lock(&pa->mu); + if (pa->num_done == pa->num_thds) { + gpr_mu_unlock(&pa->mu); + return; + } + gpr_mpscq_node* n; + while ((n = gpr_mpscq_pop(pa->q)) == nullptr) { + pa->spins++; + } + test_node* tn = (test_node*)n; + GPR_ASSERT(*tn->ctr == tn->i - 1); + *tn->ctr = tn->i; + if (tn->i == THREAD_ITERATIONS) pa->num_done++; + gpr_free(tn); + gpr_mu_unlock(&pa->mu); + } +} + +static void test_mt_multipop(void) { + gpr_log(GPR_DEBUG, "test_mt_multipop"); + gpr_event start; + gpr_event_init(&start); + gpr_thd_id thds[100]; + gpr_thd_id pull_thds[100]; + thd_args ta[GPR_ARRAY_SIZE(thds)]; + gpr_mpscq q; + gpr_mpscq_init(&q); + for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { + gpr_thd_options options = gpr_thd_options_default(); + gpr_thd_options_set_joinable(&options); + ta[i].ctr = 0; + ta[i].q = &q; + ta[i].start = &start; + GPR_ASSERT(gpr_thd_new(&thds[i], "grpc_multipop_test", test_thread, &ta[i], + &options)); + } + pull_args pa; + pa.ta = ta; + pa.num_thds = GPR_ARRAY_SIZE(thds); + pa.spins = 0; + pa.num_done = 0; + pa.q = &q; + pa.start = &start; + gpr_mu_init(&pa.mu); + for (size_t i = 0; i < GPR_ARRAY_SIZE(pull_thds); i++) { + gpr_thd_options options = gpr_thd_options_default(); + gpr_thd_options_set_joinable(&options); + GPR_ASSERT(gpr_thd_new(&pull_thds[i], "grpc_multipop_pull", pull_thread, + &pa, &options)); + } + gpr_event_set(&start, (void*)1); + for (size_t i = 0; i < GPR_ARRAY_SIZE(pull_thds); i++) { + gpr_thd_join(pull_thds[i]); + } + gpr_log(GPR_DEBUG, "spins: %" PRIdPTR, pa.spins); + for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { + gpr_thd_join(thds[i]); + } + gpr_mpscq_destroy(&q); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + test_serial(); + test_mt(); + test_mt_multipop(); + return 0; +} diff --git a/test/core/gpr/murmur_hash_test.cc b/test/core/gpr/murmur_hash_test.cc new file mode 100644 index 0000000000..d920dd3f95 --- /dev/null +++ b/test/core/gpr/murmur_hash_test.cc @@ -0,0 +1,73 @@ +/* + * + * 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. + * + */ + +#include "src/core/lib/gpr/murmur_hash.h" +#include +#include +#include "test/core/util/test_config.h" + +#include + +typedef uint32_t (*hash_func)(const void* key, size_t len, uint32_t seed); + +/* From smhasher: + This should hopefully be a thorough and uambiguous test of whether a hash + is correctly implemented on a given platform */ + +static void verification_test(hash_func hash, uint32_t expected) { + uint8_t key[256]; + uint32_t hashes[256]; + uint32_t final = 0; + size_t i; + + memset(key, 0, sizeof(key)); + memset(hashes, 0, sizeof(hashes)); + + /* Hash keys of the form {0}, {0,1}, {0,1,2}... up to N=255,using 256-N as + the seed */ + + for (i = 0; i < 256; i++) { + key[i] = (uint8_t)i; + hashes[i] = hash(key, i, (uint32_t)(256u - i)); + } + + /* Then hash the result array */ + + final = hash(hashes, sizeof(hashes), 0); + + /* The first four bytes of that hash, interpreted as a little-endian integer, + is our + verification value */ + + if (expected != final) { + gpr_log(GPR_INFO, "Verification value 0x%08X : Failed! (Expected 0x%08x)", + final, expected); + abort(); + } else { + gpr_log(GPR_INFO, "Verification value 0x%08X : Passed!", final); + } +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + /* basic tests to verify that things don't crash */ + gpr_murmur_hash3("", 0, 0); + gpr_murmur_hash3("xyz", 3, 0); + verification_test(gpr_murmur_hash3, 0xB0F57EE3); + return 0; +} diff --git a/test/core/gpr/spinlock_test.cc b/test/core/gpr/spinlock_test.cc new file mode 100644 index 0000000000..77e3dfbede --- /dev/null +++ b/test/core/gpr/spinlock_test.cc @@ -0,0 +1,152 @@ +/* + * + * 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. + * + */ + +/* Test of gpr synchronization support. */ + +#include "src/core/lib/gpr/spinlock.h" +#include +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +/* ------------------------------------------------- */ +/* Tests for gpr_spinlock. */ +struct test { + int thread_count; /* number of threads */ + gpr_thd_id* threads; + + int64_t iterations; /* number of iterations per thread */ + int64_t counter; + int incr_step; /* how much to increment/decrement refcount each time */ + + gpr_spinlock mu; /* protects iterations, counter */ +}; + +/* Return pointer to a new struct test. */ +static struct test* test_new(int threads, int64_t iterations, int incr_step) { + struct test* m = static_cast(gpr_malloc(sizeof(*m))); + m->thread_count = threads; + m->threads = static_cast( + gpr_malloc(sizeof(*m->threads) * (size_t)threads)); + m->iterations = iterations; + m->counter = 0; + m->thread_count = 0; + m->incr_step = incr_step; + m->mu = GPR_SPINLOCK_INITIALIZER; + return m; +} + +/* Return pointer to a new struct test. */ +static void test_destroy(struct test* m) { + gpr_free(m->threads); + gpr_free(m); +} + +/* Create m->threads threads, each running (*body)(m) */ +static void test_create_threads(struct test* m, void (*body)(void* arg)) { + int i; + for (i = 0; i != m->thread_count; i++) { + gpr_thd_options opt = gpr_thd_options_default(); + gpr_thd_options_set_joinable(&opt); + GPR_ASSERT( + gpr_thd_new(&m->threads[i], "grpc_create_threads", body, m, &opt)); + } +} + +/* Wait until all threads report done. */ +static void test_wait(struct test* m) { + int i; + for (i = 0; i != m->thread_count; i++) { + gpr_thd_join(m->threads[i]); + } +} + +/* Test several threads running (*body)(struct test *m) for increasing settings + of m->iterations, until about timeout_s to 2*timeout_s seconds have elapsed. + If extra!=NULL, run (*extra)(m) in an additional thread. + incr_step controls by how much m->refcount should be incremented/decremented + (if at all) each time in the tests. + */ +static void test(const char* name, void (*body)(void* m), int timeout_s, + int incr_step) { + int64_t iterations = 1024; + struct test* m; + gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME); + gpr_timespec time_taken; + gpr_timespec deadline = gpr_time_add( + start, gpr_time_from_micros((int64_t)timeout_s * 1000000, GPR_TIMESPAN)); + fprintf(stderr, "%s:", name); + fflush(stderr); + while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0) { + if (iterations < INT64_MAX / 2) iterations <<= 1; + fprintf(stderr, " %ld", (long)iterations); + fflush(stderr); + m = test_new(10, iterations, incr_step); + test_create_threads(m, body); + test_wait(m); + if (m->counter != m->thread_count * m->iterations * m->incr_step) { + fprintf(stderr, "counter %ld threads %d iterations %ld\n", + (long)m->counter, m->thread_count, (long)m->iterations); + fflush(stderr); + GPR_ASSERT(0); + } + test_destroy(m); + } + time_taken = gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), start); + fprintf(stderr, " done %lld.%09d s\n", (long long)time_taken.tv_sec, + (int)time_taken.tv_nsec); + fflush(stderr); +} + +/* Increment m->counter on each iteration; then mark thread as done. */ +static void inc(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + gpr_spinlock_lock(&m->mu); + m->counter++; + gpr_spinlock_unlock(&m->mu); + } +} + +/* Increment m->counter under lock acquired with trylock, m->iterations times; + then mark thread as done. */ +static void inctry(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations;) { + if (gpr_spinlock_trylock(&m->mu)) { + m->counter++; + gpr_spinlock_unlock(&m->mu); + i++; + } + } +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + test("spinlock", &inc, 1, 1); + test("spinlock try", &inctry, 1, 1); + return 0; +} diff --git a/test/core/gpr/string_test.cc b/test/core/gpr/string_test.cc new file mode 100644 index 0000000000..57068eb2c9 --- /dev/null +++ b/test/core/gpr/string_test.cc @@ -0,0 +1,312 @@ +/* + * + * 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. + * + */ + +#include "src/core/lib/gpr/string.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) + +static void test_strdup(void) { + static const char* src1 = "hello world"; + char* dst1; + + LOG_TEST_NAME("test_strdup"); + + dst1 = gpr_strdup(src1); + GPR_ASSERT(0 == strcmp(src1, dst1)); + gpr_free(dst1); + + GPR_ASSERT(nullptr == gpr_strdup(nullptr)); +} + +static void expect_dump(const char* buf, size_t len, uint32_t flags, + const char* result) { + char* got = gpr_dump(buf, len, flags); + GPR_ASSERT(0 == strcmp(got, result)); + gpr_free(got); +} + +static void test_dump(void) { + LOG_TEST_NAME("test_dump"); + expect_dump("\x01", 1, GPR_DUMP_HEX, "01"); + expect_dump("\x01", 1, GPR_DUMP_HEX | GPR_DUMP_ASCII, "01 '.'"); + expect_dump("\x01\x02", 2, GPR_DUMP_HEX, "01 02"); + expect_dump("\x01\x23\x45\x67\x89\xab\xcd\xef", 8, GPR_DUMP_HEX, + "01 23 45 67 89 ab cd ef"); + expect_dump("ab", 2, GPR_DUMP_HEX | GPR_DUMP_ASCII, "61 62 'ab'"); +} + +static void test_pu32_fail(const char* s) { + uint32_t out; + GPR_ASSERT(!gpr_parse_bytes_to_uint32(s, strlen(s), &out)); +} + +static void test_pu32_succeed(const char* s, uint32_t want) { + uint32_t out; + GPR_ASSERT(gpr_parse_bytes_to_uint32(s, strlen(s), &out)); + GPR_ASSERT(out == want); +} + +static void test_parse_uint32(void) { + LOG_TEST_NAME("test_parse_uint32"); + + test_pu32_fail("-1"); + test_pu32_fail("a"); + test_pu32_fail(""); + test_pu32_succeed("0", 0); + test_pu32_succeed("1", 1); + test_pu32_succeed("2", 2); + test_pu32_succeed("3", 3); + test_pu32_succeed("4", 4); + test_pu32_succeed("5", 5); + test_pu32_succeed("6", 6); + test_pu32_succeed("7", 7); + test_pu32_succeed("8", 8); + test_pu32_succeed("9", 9); + test_pu32_succeed("10", 10); + test_pu32_succeed("11", 11); + test_pu32_succeed("12", 12); + test_pu32_succeed("13", 13); + test_pu32_succeed("14", 14); + test_pu32_succeed("15", 15); + test_pu32_succeed("16", 16); + test_pu32_succeed("17", 17); + test_pu32_succeed("18", 18); + test_pu32_succeed("19", 19); + test_pu32_succeed("1234567890", 1234567890); + test_pu32_succeed("4294967295", 4294967295u); + test_pu32_fail("4294967296"); + test_pu32_fail("4294967297"); + test_pu32_fail("4294967298"); + test_pu32_fail("4294967299"); +} + +static void test_asprintf(void) { + char* buf; + int i, j; + + LOG_TEST_NAME("test_asprintf"); + + /* Print an empty string. */ + GPR_ASSERT(gpr_asprintf(&buf, "%s", "") == 0); + GPR_ASSERT(buf[0] == '\0'); + gpr_free(buf); + + /* Print strings of various lengths. */ + for (i = 1; i < 100; i++) { + GPR_ASSERT(gpr_asprintf(&buf, "%0*d", i, 1) == i); + + /* The buffer should resemble "000001\0". */ + for (j = 0; j < i - 2; j++) { + GPR_ASSERT(buf[j] == '0'); + } + GPR_ASSERT(buf[i - 1] == '1'); + GPR_ASSERT(buf[i] == '\0'); + gpr_free(buf); + } +} + +static void test_strjoin(void) { + const char* parts[4] = {"one", "two", "three", "four"}; + size_t joined_len; + char* joined; + + LOG_TEST_NAME("test_strjoin"); + + joined = gpr_strjoin(parts, 4, &joined_len); + GPR_ASSERT(0 == strcmp("onetwothreefour", joined)); + gpr_free(joined); + + joined = gpr_strjoin(parts, 0, &joined_len); + GPR_ASSERT(0 == strcmp("", joined)); + gpr_free(joined); + + joined = gpr_strjoin(parts, 1, &joined_len); + GPR_ASSERT(0 == strcmp("one", joined)); + gpr_free(joined); +} + +static void test_strjoin_sep(void) { + const char* parts[4] = {"one", "two", "three", "four"}; + size_t joined_len; + char* joined; + + LOG_TEST_NAME("test_strjoin_sep"); + + joined = gpr_strjoin_sep(parts, 4, ", ", &joined_len); + GPR_ASSERT(0 == strcmp("one, two, three, four", joined)); + gpr_free(joined); + + /* empty separator */ + joined = gpr_strjoin_sep(parts, 4, "", &joined_len); + GPR_ASSERT(0 == strcmp("onetwothreefour", joined)); + gpr_free(joined); + + /* degenerated case specifying zero input parts */ + joined = gpr_strjoin_sep(parts, 0, ", ", &joined_len); + GPR_ASSERT(0 == strcmp("", joined)); + gpr_free(joined); + + /* single part should have no separator */ + joined = gpr_strjoin_sep(parts, 1, ", ", &joined_len); + GPR_ASSERT(0 == strcmp("one", joined)); + gpr_free(joined); +} + +static void test_ltoa() { + char* str; + char buf[GPR_LTOA_MIN_BUFSIZE]; + + LOG_TEST_NAME("test_ltoa"); + + /* zero */ + GPR_ASSERT(1 == gpr_ltoa(0, buf)); + GPR_ASSERT(0 == strcmp("0", buf)); + + /* positive number */ + GPR_ASSERT(3 == gpr_ltoa(123, buf)); + GPR_ASSERT(0 == strcmp("123", buf)); + + /* negative number */ + GPR_ASSERT(6 == gpr_ltoa(-12345, buf)); + GPR_ASSERT(0 == strcmp("-12345", buf)); + + /* large negative - we don't know the size of long in advance */ + GPR_ASSERT(gpr_asprintf(&str, "%lld", (long long)LONG_MIN)); + GPR_ASSERT(strlen(str) == (size_t)gpr_ltoa(LONG_MIN, buf)); + GPR_ASSERT(0 == strcmp(str, buf)); + gpr_free(str); +} + +static void test_int64toa() { + char buf[GPR_INT64TOA_MIN_BUFSIZE]; + + LOG_TEST_NAME("test_int64toa"); + + /* zero */ + GPR_ASSERT(1 == int64_ttoa(0, buf)); + GPR_ASSERT(0 == strcmp("0", buf)); + + /* positive */ + GPR_ASSERT(3 == int64_ttoa(123, buf)); + GPR_ASSERT(0 == strcmp("123", buf)); + + /* large positive */ + GPR_ASSERT(19 == int64_ttoa(9223372036854775807LL, buf)); + GPR_ASSERT(0 == strcmp("9223372036854775807", buf)); + + /* large negative */ + GPR_ASSERT(20 == int64_ttoa(-9223372036854775807LL - 1, buf)); + GPR_ASSERT(0 == strcmp("-9223372036854775808", buf)); +} + +static void test_leftpad() { + char* padded; + + LOG_TEST_NAME("test_leftpad"); + + padded = gpr_leftpad("foo", ' ', 5); + GPR_ASSERT(0 == strcmp(" foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", ' ', 4); + GPR_ASSERT(0 == strcmp(" foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", ' ', 3); + GPR_ASSERT(0 == strcmp("foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", ' ', 2); + GPR_ASSERT(0 == strcmp("foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", ' ', 1); + GPR_ASSERT(0 == strcmp("foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", ' ', 0); + GPR_ASSERT(0 == strcmp("foo", padded)); + gpr_free(padded); + + padded = gpr_leftpad("foo", '0', 5); + GPR_ASSERT(0 == strcmp("00foo", padded)); + gpr_free(padded); +} + +static void test_stricmp(void) { + LOG_TEST_NAME("test_stricmp"); + + GPR_ASSERT(0 == gpr_stricmp("hello", "hello")); + GPR_ASSERT(0 == gpr_stricmp("HELLO", "hello")); + GPR_ASSERT(gpr_stricmp("a", "b") < 0); + GPR_ASSERT(gpr_stricmp("b", "a") > 0); +} + +static void test_memrchr(void) { + LOG_TEST_NAME("test_memrchr"); + + GPR_ASSERT(nullptr == gpr_memrchr(nullptr, 'a', 0)); + GPR_ASSERT(nullptr == gpr_memrchr("", 'a', 0)); + GPR_ASSERT(nullptr == gpr_memrchr("hello", 'b', 5)); + GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'h', 5), "hello")); + GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'o', 5), "o")); + GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'l', 5), "lo")); +} + +static void test_is_true(void) { + LOG_TEST_NAME("test_is_true"); + + GPR_ASSERT(true == gpr_is_true("True")); + GPR_ASSERT(true == gpr_is_true("true")); + GPR_ASSERT(true == gpr_is_true("TRUE")); + GPR_ASSERT(true == gpr_is_true("Yes")); + GPR_ASSERT(true == gpr_is_true("yes")); + GPR_ASSERT(true == gpr_is_true("YES")); + GPR_ASSERT(true == gpr_is_true("1")); + GPR_ASSERT(false == gpr_is_true(nullptr)); + GPR_ASSERT(false == gpr_is_true("")); + GPR_ASSERT(false == gpr_is_true("0")); +} + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + test_strdup(); + test_dump(); + test_parse_uint32(); + test_asprintf(); + test_strjoin(); + test_strjoin_sep(); + test_ltoa(); + test_int64toa(); + test_leftpad(); + test_stricmp(); + test_memrchr(); + test_is_true(); + return 0; +} diff --git a/test/core/gpr/sync_test.cc b/test/core/gpr/sync_test.cc new file mode 100644 index 0000000000..768f96d093 --- /dev/null +++ b/test/core/gpr/sync_test.cc @@ -0,0 +1,457 @@ +/* + * + * 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. + * + */ + +/* Test of gpr synchronization support. */ + +#include +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +/* ==================Example use of interface=================== + + A producer-consumer queue of up to N integers, + illustrating the use of the calls in this interface. */ + +#define N 4 + +typedef struct queue { + gpr_cv non_empty; /* Signalled when length becomes non-zero. */ + gpr_cv non_full; /* Signalled when length becomes non-N. */ + gpr_mu mu; /* Protects all fields below. + (That is, except during initialization or + destruction, the fields below should be accessed + only by a thread that holds mu.) */ + int head; /* Index of head of queue 0..N-1. */ + int length; /* Number of valid elements in queue 0..N. */ + int elem[N]; /* elem[head .. head+length-1] are queue elements. */ +} queue; + +/* Initialize *q. */ +void queue_init(queue* q) { + gpr_mu_init(&q->mu); + gpr_cv_init(&q->non_empty); + gpr_cv_init(&q->non_full); + q->head = 0; + q->length = 0; +} + +/* Free storage associated with *q. */ +void queue_destroy(queue* q) { + gpr_mu_destroy(&q->mu); + gpr_cv_destroy(&q->non_empty); + gpr_cv_destroy(&q->non_full); +} + +/* Wait until there is room in *q, then append x to *q. */ +void queue_append(queue* q, int x) { + gpr_mu_lock(&q->mu); + /* To wait for a predicate without a deadline, loop on the negation of the + predicate, and use gpr_cv_wait(..., gpr_inf_future(GPR_CLOCK_REALTIME)) + inside the loop + to release the lock, wait, and reacquire on each iteration. Code that + makes the condition true should use gpr_cv_broadcast() on the + corresponding condition variable. The predicate must be on state + protected by the lock. */ + while (q->length == N) { + gpr_cv_wait(&q->non_full, &q->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ + /* It's normal to use gpr_cv_broadcast() or gpr_signal() while + holding the lock. */ + gpr_cv_broadcast(&q->non_empty); + } + q->elem[(q->head + q->length) % N] = x; + q->length++; + gpr_mu_unlock(&q->mu); +} + +/* If it can be done without blocking, append x to *q and return non-zero. + Otherwise return 0. */ +int queue_try_append(queue* q, int x) { + int result = 0; + if (gpr_mu_trylock(&q->mu)) { + if (q->length != N) { + if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ + gpr_cv_broadcast(&q->non_empty); + } + q->elem[(q->head + q->length) % N] = x; + q->length++; + result = 1; + } + gpr_mu_unlock(&q->mu); + } + return result; +} + +/* Wait until the *q is non-empty or deadline abs_deadline passes. If the + queue is non-empty, remove its head entry, place it in *head, and return + non-zero. Otherwise return 0. */ +int queue_remove(queue* q, int* head, gpr_timespec abs_deadline) { + int result = 0; + gpr_mu_lock(&q->mu); + /* To wait for a predicate with a deadline, loop on the negation of the + predicate or until gpr_cv_wait() returns true. Code that makes + the condition true should use gpr_cv_broadcast() on the corresponding + condition variable. The predicate must be on state protected by the + lock. */ + while (q->length == 0 && !gpr_cv_wait(&q->non_empty, &q->mu, abs_deadline)) { + } + if (q->length != 0) { /* Queue is non-empty. */ + result = 1; + if (q->length == N) { /* Wake threads blocked in queue_append(). */ + gpr_cv_broadcast(&q->non_full); + } + *head = q->elem[q->head]; + q->head = (q->head + 1) % N; + q->length--; + } /* else deadline exceeded */ + gpr_mu_unlock(&q->mu); + return result; +} + +/* ------------------------------------------------- */ +/* Tests for gpr_mu and gpr_cv, and the queue example. */ +struct test { + int threads; /* number of threads */ + + int64_t iterations; /* number of iterations per thread */ + int64_t counter; + int thread_count; /* used to allocate thread ids */ + int done; /* threads not yet completed */ + int incr_step; /* how much to increment/decrement refcount each time */ + + gpr_mu mu; /* protects iterations, counter, thread_count, done */ + + gpr_cv cv; /* signalling depends on test */ + + gpr_cv done_cv; /* signalled when done == 0 */ + + queue q; + + gpr_stats_counter stats_counter; + + gpr_refcount refcount; + gpr_refcount thread_refcount; + gpr_event event; +}; + +/* Return pointer to a new struct test. */ +static struct test* test_new(int threads, int64_t iterations, int incr_step) { + struct test* m = static_cast(gpr_malloc(sizeof(*m))); + m->threads = threads; + m->iterations = iterations; + m->counter = 0; + m->thread_count = 0; + m->done = threads; + m->incr_step = incr_step; + gpr_mu_init(&m->mu); + gpr_cv_init(&m->cv); + gpr_cv_init(&m->done_cv); + queue_init(&m->q); + gpr_stats_init(&m->stats_counter, 0); + gpr_ref_init(&m->refcount, 0); + gpr_ref_init(&m->thread_refcount, threads); + gpr_event_init(&m->event); + return m; +} + +/* Return pointer to a new struct test. */ +static void test_destroy(struct test* m) { + gpr_mu_destroy(&m->mu); + gpr_cv_destroy(&m->cv); + gpr_cv_destroy(&m->done_cv); + queue_destroy(&m->q); + gpr_free(m); +} + +/* Create m->threads threads, each running (*body)(m) */ +static void test_create_threads(struct test* m, void (*body)(void* arg)) { + gpr_thd_id id; + int i; + for (i = 0; i != m->threads; i++) { + GPR_ASSERT(gpr_thd_new(&id, "grpc_create_threads", body, m, nullptr)); + } +} + +/* Wait until all threads report done. */ +static void test_wait(struct test* m) { + gpr_mu_lock(&m->mu); + while (m->done != 0) { + gpr_cv_wait(&m->done_cv, &m->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + gpr_mu_unlock(&m->mu); +} + +/* Get an integer thread id in the raneg 0..threads-1 */ +static int thread_id(struct test* m) { + int id; + gpr_mu_lock(&m->mu); + id = m->thread_count++; + gpr_mu_unlock(&m->mu); + return id; +} + +/* Indicate that a thread is done, by decrementing m->done + and signalling done_cv if m->done==0. */ +static void mark_thread_done(struct test* m) { + gpr_mu_lock(&m->mu); + GPR_ASSERT(m->done != 0); + m->done--; + if (m->done == 0) { + gpr_cv_signal(&m->done_cv); + } + gpr_mu_unlock(&m->mu); +} + +/* Test several threads running (*body)(struct test *m) for increasing settings + of m->iterations, until about timeout_s to 2*timeout_s seconds have elapsed. + If extra!=NULL, run (*extra)(m) in an additional thread. + incr_step controls by how much m->refcount should be incremented/decremented + (if at all) each time in the tests. + */ +static void test(const char* name, void (*body)(void* m), + void (*extra)(void* m), int timeout_s, int incr_step) { + int64_t iterations = 256; + struct test* m; + gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME); + gpr_timespec time_taken; + gpr_timespec deadline = gpr_time_add( + start, gpr_time_from_micros((int64_t)timeout_s * 1000000, GPR_TIMESPAN)); + fprintf(stderr, "%s:", name); + fflush(stderr); + while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0) { + fprintf(stderr, " %ld", (long)iterations); + fflush(stderr); + m = test_new(10, iterations, incr_step); + if (extra != nullptr) { + gpr_thd_id id; + GPR_ASSERT(gpr_thd_new(&id, name, extra, m, nullptr)); + m->done++; /* one more thread to wait for */ + } + test_create_threads(m, body); + test_wait(m); + if (m->counter != m->threads * m->iterations * m->incr_step) { + fprintf(stderr, "counter %ld threads %d iterations %ld\n", + (long)m->counter, m->threads, (long)m->iterations); + fflush(stderr); + GPR_ASSERT(0); + } + test_destroy(m); + iterations <<= 1; + } + time_taken = gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), start); + fprintf(stderr, " done %lld.%09d s\n", (long long)time_taken.tv_sec, + (int)time_taken.tv_nsec); + fflush(stderr); +} + +/* Increment m->counter on each iteration; then mark thread as done. */ +static void inc(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + gpr_mu_lock(&m->mu); + m->counter++; + gpr_mu_unlock(&m->mu); + } + mark_thread_done(m); +} + +/* Increment m->counter under lock acquired with trylock, m->iterations times; + then mark thread as done. */ +static void inctry(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations;) { + if (gpr_mu_trylock(&m->mu)) { + m->counter++; + gpr_mu_unlock(&m->mu); + i++; + } + } + mark_thread_done(m); +} + +/* Increment counter only when (m->counter%m->threads)==m->thread_id; then mark + thread as done. */ +static void inc_by_turns(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + int id = thread_id(m); + for (i = 0; i != m->iterations; i++) { + gpr_mu_lock(&m->mu); + while ((m->counter % m->threads) != id) { + gpr_cv_wait(&m->cv, &m->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + m->counter++; + gpr_cv_broadcast(&m->cv); + gpr_mu_unlock(&m->mu); + } + mark_thread_done(m); +} + +/* Wait a millisecond and increment counter on each iteration; + then mark thread as done. */ +static void inc_with_1ms_delay(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + gpr_timespec deadline; + gpr_mu_lock(&m->mu); + deadline = gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), + gpr_time_from_micros(1000, GPR_TIMESPAN)); + while (!gpr_cv_wait(&m->cv, &m->mu, deadline)) { + } + m->counter++; + gpr_mu_unlock(&m->mu); + } + mark_thread_done(m); +} + +/* Wait a millisecond and increment counter on each iteration, using an event + for timing; then mark thread as done. */ +static void inc_with_1ms_delay_event(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + gpr_timespec deadline; + deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), + gpr_time_from_micros(1000, GPR_TIMESPAN)); + GPR_ASSERT(gpr_event_wait(&m->event, deadline) == nullptr); + gpr_mu_lock(&m->mu); + m->counter++; + gpr_mu_unlock(&m->mu); + } + mark_thread_done(m); +} + +/* Produce m->iterations elements on queue m->q, then mark thread as done. + Even threads use queue_append(), and odd threads use queue_try_append() + until it succeeds. */ +static void many_producers(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + int x = thread_id(m); + if ((x & 1) == 0) { + for (i = 0; i != m->iterations; i++) { + queue_append(&m->q, 1); + } + } else { + for (i = 0; i != m->iterations; i++) { + while (!queue_try_append(&m->q, 1)) { + } + } + } + mark_thread_done(m); +} + +/* Consume elements from m->q until m->threads*m->iterations are seen, + wait an extra second to confirm that no more elements are arriving, + then mark thread as done. */ +static void consumer(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t n = m->iterations * m->threads; + int64_t i; + int value; + for (i = 0; i != n; i++) { + queue_remove(&m->q, &value, gpr_inf_future(GPR_CLOCK_MONOTONIC)); + } + gpr_mu_lock(&m->mu); + m->counter = n; + gpr_mu_unlock(&m->mu); + GPR_ASSERT( + !queue_remove(&m->q, &value, + gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), + gpr_time_from_micros(1000000, GPR_TIMESPAN)))); + mark_thread_done(m); +} + +/* Increment m->stats_counter m->iterations times, transfer counter value to + m->counter, then mark thread as done. */ +static void statsinc(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + gpr_stats_inc(&m->stats_counter, 1); + } + gpr_mu_lock(&m->mu); + m->counter = gpr_stats_read(&m->stats_counter); + gpr_mu_unlock(&m->mu); + mark_thread_done(m); +} + +/* Increment m->refcount by m->incr_step for m->iterations times. Decrement + m->thread_refcount once, and if it reaches zero, set m->event to (void*)1; + then mark thread as done. */ +static void refinc(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t i; + for (i = 0; i != m->iterations; i++) { + if (m->incr_step == 1) { + gpr_ref(&m->refcount); + } else { + gpr_refn(&m->refcount, m->incr_step); + } + } + if (gpr_unref(&m->thread_refcount)) { + gpr_event_set(&m->event, (void*)1); + } + mark_thread_done(m); +} + +/* Wait until m->event is set to (void *)1, then decrement m->refcount by 1 + (m->threads * m->iterations * m->incr_step) times, and ensure that the last + decrement caused the counter to reach zero, then mark thread as done. */ +static void refcheck(void* v /*=m*/) { + struct test* m = static_cast(v); + int64_t n = m->iterations * m->threads * m->incr_step; + int64_t i; + GPR_ASSERT(gpr_event_wait(&m->event, gpr_inf_future(GPR_CLOCK_REALTIME)) == + (void*)1); + GPR_ASSERT(gpr_event_get(&m->event) == (void*)1); + for (i = 1; i != n; i++) { + GPR_ASSERT(!gpr_unref(&m->refcount)); + m->counter++; + } + GPR_ASSERT(gpr_unref(&m->refcount)); + m->counter++; + mark_thread_done(m); +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + test("mutex", &inc, nullptr, 1, 1); + test("mutex try", &inctry, nullptr, 1, 1); + test("cv", &inc_by_turns, nullptr, 1, 1); + test("timedcv", &inc_with_1ms_delay, nullptr, 1, 1); + test("queue", &many_producers, &consumer, 10, 1); + test("stats_counter", &statsinc, nullptr, 1, 1); + test("refcount by 1", &refinc, &refcheck, 1, 1); + test("refcount by 3", &refinc, &refcheck, 1, 3); /* incr_step of 3 is an + arbitrary choice. Any + number > 1 is okay here */ + test("timedevent", &inc_with_1ms_delay_event, nullptr, 1, 1); + return 0; +} diff --git a/test/core/gpr/thd_test.cc b/test/core/gpr/thd_test.cc new file mode 100644 index 0000000000..b755bf18f3 --- /dev/null +++ b/test/core/gpr/thd_test.cc @@ -0,0 +1,102 @@ +/* + * + * 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. + * + */ + +/* Test of gpr thread support. */ + +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +#define NUM_THREADS 300 + +struct test { + gpr_mu mu; + int n; + int is_done; + gpr_cv done_cv; +}; + +/* A Thread body. Decrement t->n, and if is becomes zero, set t->done. */ +static void thd_body(void* v) { + struct test* t = static_cast(v); + gpr_mu_lock(&t->mu); + t->n--; + if (t->n == 0) { + t->is_done = 1; + gpr_cv_signal(&t->done_cv); + } + gpr_mu_unlock(&t->mu); +} + +static void thd_body_joinable(void* v) {} + +/* Test thread options work as expected */ +static void test_options(void) { + gpr_thd_options options = gpr_thd_options_default(); + GPR_ASSERT(!gpr_thd_options_is_joinable(&options)); + GPR_ASSERT(gpr_thd_options_is_detached(&options)); + gpr_thd_options_set_joinable(&options); + GPR_ASSERT(gpr_thd_options_is_joinable(&options)); + GPR_ASSERT(!gpr_thd_options_is_detached(&options)); + gpr_thd_options_set_detached(&options); + GPR_ASSERT(!gpr_thd_options_is_joinable(&options)); + GPR_ASSERT(gpr_thd_options_is_detached(&options)); +} + +/* Test that we can create a number of threads and wait for them. */ +static void test(void) { + int i; + gpr_thd_id thd; + gpr_thd_id thds[NUM_THREADS]; + struct test t; + gpr_thd_options options = gpr_thd_options_default(); + gpr_mu_init(&t.mu); + gpr_cv_init(&t.done_cv); + t.n = NUM_THREADS; + t.is_done = 0; + for (i = 0; i < NUM_THREADS; i++) { + GPR_ASSERT(gpr_thd_new(&thd, "grpc_thread_test", &thd_body, &t, nullptr)); + } + gpr_mu_lock(&t.mu); + while (!t.is_done) { + gpr_cv_wait(&t.done_cv, &t.mu, gpr_inf_future(GPR_CLOCK_REALTIME)); + } + gpr_mu_unlock(&t.mu); + GPR_ASSERT(t.n == 0); + gpr_thd_options_set_joinable(&options); + for (i = 0; i < NUM_THREADS; i++) { + GPR_ASSERT(gpr_thd_new(&thds[i], "grpc_joinable_thread_test", + &thd_body_joinable, nullptr, &options)); + } + for (i = 0; i < NUM_THREADS; i++) { + gpr_thd_join(thds[i]); + } +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + test_options(); + test(); + return 0; +} diff --git a/test/core/gpr/time_test.cc b/test/core/gpr/time_test.cc new file mode 100644 index 0000000000..b2b4dce58e --- /dev/null +++ b/test/core/gpr/time_test.cc @@ -0,0 +1,266 @@ +/* + * + * 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. + * + */ + +/* Test of gpr time support. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +static void to_fp(void* arg, const char* buf, size_t len) { + fwrite(buf, 1, len, (FILE*)arg); +} + +/* Convert gpr_intmax x to ascii base b (2..16), and write with + (*writer)(arg, ...), zero padding to "chars" digits). */ +static void i_to_s(intmax_t x, int base, int chars, + void (*writer)(void* arg, const char* buf, size_t len), + void* arg) { + char buf[64]; + char fmt[32]; + GPR_ASSERT(base == 16 || base == 10); + sprintf(fmt, "%%0%d%s", chars, base == 16 ? PRIxMAX : PRIdMAX); + sprintf(buf, fmt, x); + (*writer)(arg, buf, strlen(buf)); +} + +/* Convert ts to ascii, and write with (*writer)(arg, ...). */ +static void ts_to_s(gpr_timespec t, + void (*writer)(void* arg, const char* buf, size_t len), + void* arg) { + if (t.tv_sec < 0 && t.tv_nsec != 0) { + t.tv_sec++; + t.tv_nsec = GPR_NS_PER_SEC - t.tv_nsec; + } + i_to_s(t.tv_sec, 10, 0, writer, arg); + (*writer)(arg, ".", 1); + i_to_s(t.tv_nsec, 10, 9, writer, arg); +} + +static void test_values(void) { + int i; + + gpr_timespec x = gpr_time_0(GPR_CLOCK_REALTIME); + GPR_ASSERT(x.tv_sec == 0 && x.tv_nsec == 0); + + x = gpr_inf_future(GPR_CLOCK_REALTIME); + fprintf(stderr, "far future "); + fflush(stderr); + i_to_s(x.tv_sec, 16, 16, &to_fp, stderr); + fprintf(stderr, "\n"); + GPR_ASSERT(x.tv_sec == INT64_MAX); + fprintf(stderr, "far future "); + fflush(stderr); + ts_to_s(x, &to_fp, stderr); + fprintf(stderr, "\n"); + fflush(stderr); + + x = gpr_inf_past(GPR_CLOCK_REALTIME); + fprintf(stderr, "far past "); + fflush(stderr); + i_to_s(x.tv_sec, 16, 16, &to_fp, stderr); + fprintf(stderr, "\n"); + fflush(stderr); + GPR_ASSERT(x.tv_sec == INT64_MIN); + fprintf(stderr, "far past "); + fflush(stderr); + ts_to_s(x, &to_fp, stderr); + fprintf(stderr, "\n"); + fflush(stderr); + + for (i = 1; i != 1000 * 1000 * 1000; i *= 10) { + x = gpr_time_from_micros(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec == i / GPR_US_PER_SEC && + x.tv_nsec == (i % GPR_US_PER_SEC) * GPR_NS_PER_US); + x = gpr_time_from_nanos(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec == i / GPR_NS_PER_SEC && + x.tv_nsec == (i % GPR_NS_PER_SEC)); + x = gpr_time_from_millis(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec == i / GPR_MS_PER_SEC && + x.tv_nsec == (i % GPR_MS_PER_SEC) * GPR_NS_PER_MS); + } + + /* Test possible overflow in conversion of -ve values. */ + x = gpr_time_from_micros(-(INT64_MAX - 999997), GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec < 0); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); + + x = gpr_time_from_nanos(-(INT64_MAX - 999999997), GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec < 0); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); + + x = gpr_time_from_millis(-(INT64_MAX - 997), GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec < 0); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); + + /* Test general -ve values. */ + for (i = -1; i > -1000 * 1000 * 1000; i *= 7) { + x = gpr_time_from_micros(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec * GPR_US_PER_SEC + x.tv_nsec / GPR_NS_PER_US == i); + x = gpr_time_from_nanos(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec * GPR_NS_PER_SEC + x.tv_nsec == i); + x = gpr_time_from_millis(i, GPR_TIMESPAN); + GPR_ASSERT(x.tv_sec * GPR_MS_PER_SEC + x.tv_nsec / GPR_NS_PER_MS == i); + } +} + +static void test_add_sub(void) { + int i; + int j; + int k; + /* Basic addition and subtraction. */ + for (i = -100; i <= 100; i++) { + for (j = -100; j <= 100; j++) { + for (k = 1; k <= 10000000; k *= 10) { + int sum = i + j; + int diff = i - j; + gpr_timespec it = gpr_time_from_micros(i * k, GPR_TIMESPAN); + gpr_timespec jt = gpr_time_from_micros(j * k, GPR_TIMESPAN); + gpr_timespec sumt = gpr_time_add(it, jt); + gpr_timespec difft = gpr_time_sub(it, jt); + if (gpr_time_cmp(gpr_time_from_micros(sum * k, GPR_TIMESPAN), sumt) != + 0) { + fprintf(stderr, "i %d j %d sum %d sumt ", i, j, sum); + fflush(stderr); + ts_to_s(sumt, &to_fp, stderr); + fprintf(stderr, "\n"); + fflush(stderr); + GPR_ASSERT(0); + } + if (gpr_time_cmp(gpr_time_from_micros(diff * k, GPR_TIMESPAN), difft) != + 0) { + fprintf(stderr, "i %d j %d diff %d diff ", i, j, diff); + fflush(stderr); + ts_to_s(sumt, &to_fp, stderr); + fprintf(stderr, "\n"); + fflush(stderr); + GPR_ASSERT(0); + } + } + } + } +} + +static void test_overflow(void) { + /* overflow */ + gpr_timespec x = gpr_time_from_micros(1, GPR_TIMESPAN); + do { + x = gpr_time_add(x, x); + } while (gpr_time_cmp(x, gpr_inf_future(GPR_TIMESPAN)) < 0); + GPR_ASSERT(gpr_time_cmp(x, gpr_inf_future(GPR_TIMESPAN)) == 0); + x = gpr_time_from_micros(-1, GPR_TIMESPAN); + do { + x = gpr_time_add(x, x); + } while (gpr_time_cmp(x, gpr_inf_past(GPR_TIMESPAN)) > 0); + GPR_ASSERT(gpr_time_cmp(x, gpr_inf_past(GPR_TIMESPAN)) == 0); +} + +static void test_sticky_infinities(void) { + int i; + int j; + int k; + gpr_timespec infinity[2]; + gpr_timespec addend[3]; + infinity[0] = gpr_inf_future(GPR_TIMESPAN); + infinity[1] = gpr_inf_past(GPR_TIMESPAN); + addend[0] = gpr_inf_future(GPR_TIMESPAN); + addend[1] = gpr_inf_past(GPR_TIMESPAN); + addend[2] = gpr_time_0(GPR_TIMESPAN); + + /* Infinities are sticky */ + for (i = 0; i != sizeof(infinity) / sizeof(infinity[0]); i++) { + for (j = 0; j != sizeof(addend) / sizeof(addend[0]); j++) { + gpr_timespec x = gpr_time_add(infinity[i], addend[j]); + GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); + x = gpr_time_sub(infinity[i], addend[j]); + GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); + } + for (k = -200; k <= 200; k++) { + gpr_timespec y = gpr_time_from_micros(k * 100000, GPR_TIMESPAN); + gpr_timespec x = gpr_time_add(infinity[i], y); + GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); + x = gpr_time_sub(infinity[i], y); + GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); + } + } +} + +static void test_similar(void) { + GPR_ASSERT(1 == gpr_time_similar(gpr_inf_future(GPR_TIMESPAN), + gpr_inf_future(GPR_TIMESPAN), + gpr_time_0(GPR_TIMESPAN))); + GPR_ASSERT(1 == gpr_time_similar(gpr_inf_past(GPR_TIMESPAN), + gpr_inf_past(GPR_TIMESPAN), + gpr_time_0(GPR_TIMESPAN))); + GPR_ASSERT(0 == gpr_time_similar(gpr_inf_past(GPR_TIMESPAN), + gpr_inf_future(GPR_TIMESPAN), + gpr_time_0(GPR_TIMESPAN))); + GPR_ASSERT(0 == gpr_time_similar(gpr_inf_future(GPR_TIMESPAN), + gpr_inf_past(GPR_TIMESPAN), + gpr_time_0(GPR_TIMESPAN))); + GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_0(GPR_TIMESPAN))); + GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_from_micros(15, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN))); + GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(15, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN))); + GPR_ASSERT(0 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_from_micros(25, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN))); + GPR_ASSERT(0 == gpr_time_similar(gpr_time_from_micros(25, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN), + gpr_time_from_micros(10, GPR_TIMESPAN))); +} + +static void test_convert_extreme(void) { + gpr_timespec realtime = {INT64_MAX, 1, GPR_CLOCK_REALTIME}; + gpr_timespec monotime = gpr_convert_clock_type(realtime, GPR_CLOCK_MONOTONIC); + GPR_ASSERT(monotime.tv_sec == realtime.tv_sec); + GPR_ASSERT(monotime.clock_type == GPR_CLOCK_MONOTONIC); +} + +static void test_cmp_extreme(void) { + gpr_timespec t1 = {INT64_MAX, 1, GPR_CLOCK_REALTIME}; + gpr_timespec t2 = {INT64_MAX, 2, GPR_CLOCK_REALTIME}; + GPR_ASSERT(gpr_time_cmp(t1, t2) == 0); + t1.tv_sec = INT64_MIN; + t2.tv_sec = INT64_MIN; + GPR_ASSERT(gpr_time_cmp(t1, t2) == 0); +} + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + + test_values(); + test_add_sub(); + test_overflow(); + test_sticky_infinities(); + test_similar(); + test_convert_extreme(); + test_cmp_extreme(); + return 0; +} diff --git a/test/core/gpr/tls_test.cc b/test/core/gpr/tls_test.cc new file mode 100644 index 0000000000..743b10f090 --- /dev/null +++ b/test/core/gpr/tls_test.cc @@ -0,0 +1,68 @@ +/* + * + * 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. + * + */ + +/* Test of gpr thread local storage support. */ + +#include +#include +#include +#include +#include +#include +#include "test/core/util/test_config.h" + +#define NUM_THREADS 100 + +GPR_TLS_DECL(test_var); + +static void thd_body(void* arg) { + intptr_t i; + + GPR_ASSERT(gpr_tls_get(&test_var) == 0); + + for (i = 0; i < 100000; i++) { + gpr_tls_set(&test_var, i); + GPR_ASSERT(gpr_tls_get(&test_var) == i); + } + gpr_tls_set(&test_var, 0); +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + gpr_thd_options opt = gpr_thd_options_default(); + int i; + gpr_thd_id threads[NUM_THREADS]; + + grpc_test_init(argc, argv); + + gpr_tls_init(&test_var); + + gpr_thd_options_set_joinable(&opt); + + for (i = 0; i < NUM_THREADS; i++) { + gpr_thd_new(&threads[i], "grpc_tls_test", thd_body, nullptr, &opt); + } + for (i = 0; i < NUM_THREADS; i++) { + gpr_thd_join(threads[i]); + } + + gpr_tls_destroy(&test_var); + + return 0; +} diff --git a/test/core/gpr/useful_test.cc b/test/core/gpr/useful_test.cc new file mode 100644 index 0000000000..2f86010d77 --- /dev/null +++ b/test/core/gpr/useful_test.cc @@ -0,0 +1,58 @@ +/* + * + * 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. + * + */ + +#include +#include +#include +#include "test/core/util/test_config.h" + +int main(int argc, char** argv) { + int four[4]; + int five[5]; + uint32_t bitset = 0; + grpc_test_init(argc, argv); + + GPR_ASSERT(GPR_MIN(1, 2) == 1); + GPR_ASSERT(GPR_MAX(1, 2) == 2); + GPR_ASSERT(GPR_MIN(2, 1) == 1); + GPR_ASSERT(GPR_MAX(2, 1) == 2); + GPR_ASSERT(GPR_CLAMP(1, 0, 2) == 1); + GPR_ASSERT(GPR_CLAMP(0, 0, 2) == 0); + GPR_ASSERT(GPR_CLAMP(2, 0, 2) == 2); + GPR_ASSERT(GPR_CLAMP(-1, 0, 2) == 0); + GPR_ASSERT(GPR_CLAMP(3, 0, 2) == 2); + GPR_ASSERT(GPR_ROTL((uint32_t)0x80000001, 1) == 3); + GPR_ASSERT(GPR_ROTR((uint32_t)0x80000001, 1) == 0xc0000000); + GPR_ASSERT(GPR_ARRAY_SIZE(four) == 4); + GPR_ASSERT(GPR_ARRAY_SIZE(five) == 5); + + GPR_ASSERT(GPR_BITCOUNT((1u << 31) - 1) == 31); + GPR_ASSERT(GPR_BITCOUNT(1u << 3) == 1); + GPR_ASSERT(GPR_BITCOUNT(0) == 0); + + GPR_ASSERT(GPR_BITSET(&bitset, 3) == 8); + GPR_ASSERT(GPR_BITCOUNT(bitset) == 1); + GPR_ASSERT(GPR_BITGET(bitset, 3) == 1); + GPR_ASSERT(GPR_BITSET(&bitset, 1) == 10); + GPR_ASSERT(GPR_BITCOUNT(bitset) == 2); + GPR_ASSERT(GPR_BITCLEAR(&bitset, 3) == 2); + GPR_ASSERT(GPR_BITCOUNT(bitset) == 1); + GPR_ASSERT(GPR_BITGET(bitset, 3) == 0); + + return 0; +} diff --git a/test/core/iomgr/load_file_test.cc b/test/core/iomgr/load_file_test.cc index 797d0ef1a4..38c8710535 100644 --- a/test/core/iomgr/load_file_test.cc +++ b/test/core/iomgr/load_file_test.cc @@ -24,9 +24,9 @@ #include #include +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/iomgr/load_file.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "test/core/util/test_config.h" #define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) diff --git a/test/core/iomgr/wakeup_fd_cv_test.cc b/test/core/iomgr/wakeup_fd_cv_test.cc index d4e05bd7ef..c092a8f3bf 100644 --- a/test/core/iomgr/wakeup_fd_cv_test.cc +++ b/test/core/iomgr/wakeup_fd_cv_test.cc @@ -27,9 +27,9 @@ #include #include +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_posix.h" -#include "src/core/lib/support/env.h" typedef struct poll_args { struct pollfd* fds; diff --git a/test/core/json/json_test.cc b/test/core/json/json_test.cc index 18b9c55ee7..902f1cd90e 100644 --- a/test/core/json/json_test.cc +++ b/test/core/json/json_test.cc @@ -22,8 +22,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/json/json.h" -#include "src/core/lib/support/string.h" #include "test/core/util/test_config.h" diff --git a/test/core/memory_usage/client.cc b/test/core/memory_usage/client.cc index eb90067970..ca841434aa 100644 --- a/test/core/memory_usage/client.cc +++ b/test/core/memory_usage/client.cc @@ -28,8 +28,8 @@ #include #include #include -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/memory_counters.h" #include "test/core/util/test_config.h" diff --git a/test/core/memory_usage/memory_usage_test.cc b/test/core/memory_usage/memory_usage_test.cc index 58e31c9531..fb6d290130 100644 --- a/test/core/memory_usage/memory_usage_test.cc +++ b/test/core/memory_usage/memory_usage_test.cc @@ -23,7 +23,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/port.h" int main(int argc, char** argv) { diff --git a/test/core/security/auth_context_test.cc b/test/core/security/auth_context_test.cc index d8e41326c0..58f0d8e1c2 100644 --- a/test/core/security/auth_context_test.cc +++ b/test/core/security/auth_context_test.cc @@ -18,8 +18,8 @@ #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/context/security_context.h" -#include "src/core/lib/support/string.h" #include "test/core/util/test_config.h" #include diff --git a/test/core/security/credentials_test.cc b/test/core/security/credentials_test.cc index ecc61928f5..90310469aa 100644 --- a/test/core/security/credentials_test.cc +++ b/test/core/security/credentials_test.cc @@ -31,6 +31,9 @@ #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/http/httpcli.h" #include "src/core/lib/security/credentials/composite/composite_credentials.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" @@ -38,9 +41,6 @@ #include "src/core/lib/security/credentials/jwt/jwt_credentials.h" #include "src/core/lib/security/credentials/oauth2/oauth2_credentials.h" #include "src/core/lib/security/transport/auth_filters.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "test/core/util/test_config.h" /* -- Mock channel credentials. -- */ diff --git a/test/core/security/print_google_default_creds_token.cc b/test/core/security/print_google_default_creds_token.cc index d71116d8f6..a90f997bda 100644 --- a/test/core/security/print_google_default_creds_token.cc +++ b/test/core/security/print_google_default_creds_token.cc @@ -27,10 +27,10 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/security/credentials/composite/composite_credentials.h" #include "src/core/lib/security/credentials/credentials.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" typedef struct { gpr_mu* mu; diff --git a/test/core/security/security_connector_test.cc b/test/core/security/security_connector_test.cc index 9a68e176db..6eaef2bf49 100644 --- a/test/core/security/security_connector_test.cc +++ b/test/core/security/security_connector_test.cc @@ -25,12 +25,12 @@ #include #include +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/security/context/security_context.h" #include "src/core/lib/security/transport/security_connector.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "src/core/tsi/ssl_transport_security.h" #include "src/core/tsi/transport_security.h" #include "test/core/util/test_config.h" diff --git a/test/core/slice/percent_encoding_test.cc b/test/core/slice/percent_encoding_test.cc index 11f3995f98..e8d04fcc83 100644 --- a/test/core/slice/percent_encoding_test.cc +++ b/test/core/slice/percent_encoding_test.cc @@ -22,8 +22,8 @@ #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "test/core/util/test_config.h" #define TEST_VECTOR(raw, encoded, dict) \ diff --git a/test/core/slice/slice_string_helpers_test.cc b/test/core/slice/slice_string_helpers_test.cc index f1d470461a..a443f17c69 100644 --- a/test/core/slice/slice_string_helpers_test.cc +++ b/test/core/slice/slice_string_helpers_test.cc @@ -29,7 +29,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/test_config.h" #define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) diff --git a/test/core/support/BUILD b/test/core/support/BUILD deleted file mode 100644 index c8fa046da1..0000000000 --- a/test/core/support/BUILD +++ /dev/null @@ -1,255 +0,0 @@ -# Copyright 2016 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. - -load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_cc_binary", "grpc_package") - -licenses(["notice"]) # Apache v2 - -grpc_package(name = "test/core/support") - -grpc_cc_test( - name = "alloc_test", - srcs = ["alloc_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "avl_test", - srcs = ["avl_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "cmdline_test", - srcs = ["cmdline_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "cpu_test", - srcs = ["cpu_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "env_test", - srcs = ["env_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "host_port_test", - srcs = ["host_port_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "log_test", - srcs = ["log_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "mpscq_test", - srcs = ["mpscq_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "murmur_hash_test", - srcs = ["murmur_hash_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "string_test", - srcs = ["string_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "manual_constructor_test", - srcs = ["manual_constructor_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "spinlock_test", - srcs = ["spinlock_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "sync_test", - srcs = ["sync_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "thd_test", - srcs = ["thd_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "time_test", - srcs = ["time_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "tls_test", - srcs = ["tls_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "useful_test", - srcs = ["useful_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "memory_test", - srcs = ["memory_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:grpc", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "vector_test", - srcs = ["vector_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:grpc", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "orphanable_test", - srcs = ["orphanable_test.cc"], - language = "C++", - deps = [ - "//:orphanable", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) - -grpc_cc_test( - name = "ref_counted_test", - srcs = ["ref_counted_test.cc"], - language = "C++", - deps = [ - "//:ref_counted", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) - -grpc_cc_test( - name = "ref_counted_ptr_test", - srcs = ["ref_counted_ptr_test.cc"], - language = "C++", - deps = [ - "//:ref_counted", - "//:ref_counted_ptr", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) diff --git a/test/core/support/alloc_test.cc b/test/core/support/alloc_test.cc deleted file mode 100644 index 6074c6e6e7..0000000000 --- a/test/core/support/alloc_test.cc +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include -#include "test/core/util/test_config.h" - -static void* fake_malloc(size_t size) { return (void*)size; } - -static void* fake_realloc(void* addr, size_t size) { return (void*)size; } - -static void fake_free(void* addr) { *((intptr_t*)addr) = (intptr_t)0xdeadd00d; } - -static void test_custom_allocs() { - const gpr_allocation_functions default_fns = gpr_get_allocation_functions(); - intptr_t addr_to_free = 0; - char* i; - gpr_allocation_functions fns = {fake_malloc, nullptr, fake_realloc, - fake_free}; - - gpr_set_allocation_functions(fns); - GPR_ASSERT((void*)(size_t)0xdeadbeef == gpr_malloc(0xdeadbeef)); - GPR_ASSERT((void*)(size_t)0xcafed00d == gpr_realloc(nullptr, 0xcafed00d)); - - gpr_free(&addr_to_free); - GPR_ASSERT(addr_to_free == (intptr_t)0xdeadd00d); - - /* Restore and check we don't get funky values and that we don't leak */ - gpr_set_allocation_functions(default_fns); - GPR_ASSERT((void*)sizeof(*i) != - (i = static_cast(gpr_malloc(sizeof(*i))))); - GPR_ASSERT((void*)2 != (i = static_cast(gpr_realloc(i, 2)))); - gpr_free(i); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - test_custom_allocs(); - return 0; -} diff --git a/test/core/support/arena_test.cc b/test/core/support/arena_test.cc deleted file mode 100644 index ada0f43854..0000000000 --- a/test/core/support/arena_test.cc +++ /dev/null @@ -1,129 +0,0 @@ -/* - * - * 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/support/arena.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/core/lib/support/string.h" -#include "test/core/util/test_config.h" - -static void test_noop(void) { gpr_arena_destroy(gpr_arena_create(1)); } - -static void test(const char* name, size_t init_size, const size_t* allocs, - size_t nallocs) { - gpr_strvec v; - char* s; - gpr_strvec_init(&v); - gpr_asprintf(&s, "test '%s': %" PRIdPTR " <- {", name, init_size); - gpr_strvec_add(&v, s); - for (size_t i = 0; i < nallocs; i++) { - gpr_asprintf(&s, "%" PRIdPTR ",", allocs[i]); - gpr_strvec_add(&v, s); - } - gpr_strvec_add(&v, gpr_strdup("}")); - s = gpr_strvec_flatten(&v, nullptr); - gpr_strvec_destroy(&v); - gpr_log(GPR_INFO, "%s", s); - gpr_free(s); - - gpr_arena* a = gpr_arena_create(init_size); - void** ps = static_cast(gpr_zalloc(sizeof(*ps) * nallocs)); - for (size_t i = 0; i < nallocs; i++) { - ps[i] = gpr_arena_alloc(a, allocs[i]); - // ensure no duplicate results - for (size_t j = 0; j < i; j++) { - GPR_ASSERT(ps[i] != ps[j]); - } - // ensure writable - memset(ps[i], 1, allocs[i]); - } - gpr_arena_destroy(a); - gpr_free(ps); -} - -#define TEST(name, init_size, ...) \ - static const size_t allocs_##name[] = {__VA_ARGS__}; \ - test(#name, init_size, allocs_##name, GPR_ARRAY_SIZE(allocs_##name)) - -#define CONCURRENT_TEST_THREADS 100 - -size_t concurrent_test_iterations() { - if (sizeof(void*) < 8) return 1000; - return 100000; -} - -typedef struct { - gpr_event ev_start; - gpr_arena* arena; -} concurrent_test_args; - -static void concurrent_test_body(void* arg) { - concurrent_test_args* a = static_cast(arg); - gpr_event_wait(&a->ev_start, gpr_inf_future(GPR_CLOCK_REALTIME)); - for (size_t i = 0; i < concurrent_test_iterations(); i++) { - *(char*)gpr_arena_alloc(a->arena, 1) = (char)i; - } -} - -static void concurrent_test(void) { - gpr_log(GPR_DEBUG, "concurrent_test"); - - concurrent_test_args args; - gpr_event_init(&args.ev_start); - args.arena = gpr_arena_create(1024); - - gpr_thd_id thds[CONCURRENT_TEST_THREADS]; - - for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { - gpr_thd_options opt = gpr_thd_options_default(); - gpr_thd_options_set_joinable(&opt); - gpr_thd_new(&thds[i], "grpc_concurrent_test", concurrent_test_body, &args, - &opt); - } - - gpr_event_set(&args.ev_start, (void*)1); - - for (int i = 0; i < CONCURRENT_TEST_THREADS; i++) { - gpr_thd_join(thds[i]); - } - - gpr_arena_destroy(args.arena); -} - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - - test_noop(); - TEST(0_1, 0, 1); - TEST(1_1, 1, 1); - TEST(1_2, 1, 2); - TEST(1_3, 1, 3); - TEST(1_inc, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11); - TEST(6_123, 6, 1, 2, 3); - concurrent_test(); - - return 0; -} diff --git a/test/core/support/avl_test.cc b/test/core/support/avl_test.cc deleted file mode 100644 index 345db557b9..0000000000 --- a/test/core/support/avl_test.cc +++ /dev/null @@ -1,3659 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include - -#include -#include -#include - -#include "test/core/util/test_config.h" - -static int* box(int x) { - int* b = static_cast(gpr_malloc(sizeof(*b))); - *b = x; - return b; -} - -static long int_compare(void* int1, void* int2, void* unused) { - return (*(int*)int1) - (*(int*)int2); -} -static void* int_copy(void* p, void* unused) { return box(*(int*)p); } - -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, nullptr) == value); - gpr_free(k); -} - -static void check_negget(gpr_avl avl, int key) { - int* k = box(key); - GPR_ASSERT(gpr_avl_get(avl, k, nullptr) == nullptr); - gpr_free(k); -} - -static gpr_avl remove_int(gpr_avl avl, int key) { - int* k = box(key); - avl = gpr_avl_remove(avl, k, nullptr); - gpr_free(k); - return avl; -} - -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), nullptr); - avl = gpr_avl_add(avl, box(2), box(22), nullptr); - avl = gpr_avl_add(avl, box(3), box(33), nullptr); - check_get(avl, 1, 11); - check_get(avl, 2, 22); - check_get(avl, 3, 33); - check_negget(avl, 4); - gpr_avl_unref(avl, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(4), box(2), nullptr); - avl = gpr_avl_add(avl, box(3), box(3), nullptr); - 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, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(3), box(2), nullptr); - avl = gpr_avl_add(avl, box(4), box(3), nullptr); - 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, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(4), box(2), nullptr); - avl = gpr_avl_add(avl, box(5), box(3), nullptr); - 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, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(5), box(2), nullptr); - avl = gpr_avl_add(avl, box(4), box(3), nullptr); - 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, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(4), box(2), nullptr); - avl = gpr_avl_add(avl, box(3), box(3), nullptr); - avl = gpr_avl_add(avl, box(2), box(4), nullptr); - avl = gpr_avl_add(avl, box(1), box(5), nullptr); - 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, nullptr); -} - -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), nullptr); - avl = gpr_avl_add(avl, box(1), box(2), nullptr); - check_get(avl, 1, 2); - check_negget(avl, 2); - gpr_avl_unref(avl, nullptr); -} - -static void test_remove(void) { - gpr_avl avl; - 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), nullptr); - avl = gpr_avl_add(avl, box(4), box(2), nullptr); - avl = gpr_avl_add(avl, box(5), box(3), nullptr); - - avl3 = remove_int(gpr_avl_ref(avl, nullptr), 3); - avl4 = remove_int(gpr_avl_ref(avl, nullptr), 4); - avl5 = remove_int(gpr_avl_ref(avl, nullptr), 5); - avln = remove_int(gpr_avl_ref(avl, nullptr), 1); - - gpr_avl_unref(avl, nullptr); - - check_negget(avl3, 3); - check_get(avl3, 4, 2); - check_get(avl3, 5, 3); - gpr_avl_unref(avl3, nullptr); - - check_get(avl4, 3, 1); - check_negget(avl4, 4); - check_get(avl4, 5, 3); - gpr_avl_unref(avl4, nullptr); - - check_get(avl5, 3, 1); - check_get(avl5, 4, 2); - check_negget(avl5, 5); - gpr_avl_unref(avl5, nullptr); - - check_get(avln, 3, 1); - check_get(avln, 4, 2); - check_get(avln, 5, 3); - gpr_avl_unref(avln, nullptr); -} - -static void test_badcase1(void) { - gpr_avl avl; - - gpr_log(GPR_DEBUG, "test_badcase1"); - - avl = gpr_avl_create(&int_int_vtable); - avl = gpr_avl_add(avl, box(88), box(1), nullptr); - avl = remove_int(avl, 643); - avl = remove_int(avl, 983); - avl = gpr_avl_add(avl, box(985), box(4), nullptr); - avl = gpr_avl_add(avl, box(640), box(5), nullptr); - avl = gpr_avl_add(avl, box(41), box(6), nullptr); - avl = gpr_avl_add(avl, box(112), box(7), nullptr); - avl = gpr_avl_add(avl, box(342), box(8), nullptr); - avl = remove_int(avl, 1013); - avl = gpr_avl_add(avl, box(434), box(10), nullptr); - avl = gpr_avl_add(avl, box(520), box(11), nullptr); - avl = gpr_avl_add(avl, box(231), box(12), nullptr); - avl = gpr_avl_add(avl, box(852), box(13), nullptr); - avl = remove_int(avl, 461); - avl = gpr_avl_add(avl, box(108), box(15), nullptr); - avl = gpr_avl_add(avl, box(806), box(16), nullptr); - avl = gpr_avl_add(avl, box(827), box(17), nullptr); - avl = remove_int(avl, 796); - avl = gpr_avl_add(avl, box(340), box(19), nullptr); - avl = gpr_avl_add(avl, box(498), box(20), nullptr); - avl = gpr_avl_add(avl, box(203), box(21), nullptr); - avl = gpr_avl_add(avl, box(751), box(22), nullptr); - avl = gpr_avl_add(avl, box(150), box(23), nullptr); - avl = remove_int(avl, 237); - avl = gpr_avl_add(avl, box(830), box(25), nullptr); - avl = remove_int(avl, 1007); - avl = remove_int(avl, 394); - avl = gpr_avl_add(avl, box(65), box(28), nullptr); - avl = remove_int(avl, 904); - avl = remove_int(avl, 123); - avl = gpr_avl_add(avl, box(238), box(31), nullptr); - avl = gpr_avl_add(avl, box(184), box(32), nullptr); - avl = remove_int(avl, 331); - avl = gpr_avl_add(avl, box(827), box(34), nullptr); - - check_get(avl, 830, 25); - - gpr_avl_unref(avl, nullptr); -} - -static void test_badcase2(void) { - gpr_avl avl; - - gpr_log(GPR_DEBUG, "test_badcase2"); - - avl = gpr_avl_create(&int_int_vtable); - avl = gpr_avl_add(avl, box(288), box(1), nullptr); - avl = remove_int(avl, 415); - avl = gpr_avl_add(avl, box(953), box(3), nullptr); - avl = gpr_avl_add(avl, box(101), box(4), nullptr); - avl = gpr_avl_add(avl, box(516), box(5), nullptr); - avl = gpr_avl_add(avl, box(547), box(6), nullptr); - avl = gpr_avl_add(avl, box(467), box(7), nullptr); - avl = gpr_avl_add(avl, box(793), box(8), nullptr); - avl = remove_int(avl, 190); - avl = gpr_avl_add(avl, box(687), box(10), nullptr); - avl = gpr_avl_add(avl, box(242), box(11), nullptr); - avl = gpr_avl_add(avl, box(142), box(12), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(622), box(18), nullptr); - avl = remove_int(avl, 513); - avl = remove_int(avl, 429); - avl = gpr_avl_add(avl, box(205), box(21), nullptr); - avl = remove_int(avl, 663); - avl = remove_int(avl, 953); - avl = remove_int(avl, 892); - avl = gpr_avl_add(avl, box(236), box(25), nullptr); - avl = remove_int(avl, 982); - avl = remove_int(avl, 201); - avl = remove_int(avl, 684); - avl = gpr_avl_add(avl, box(572), box(29), nullptr); - avl = remove_int(avl, 817); - avl = gpr_avl_add(avl, box(970), box(31), nullptr); - avl = remove_int(avl, 347); - avl = remove_int(avl, 574); - avl = gpr_avl_add(avl, box(752), box(34), nullptr); - avl = gpr_avl_add(avl, box(670), box(35), nullptr); - avl = gpr_avl_add(avl, box(69), box(36), nullptr); - avl = remove_int(avl, 111); - avl = remove_int(avl, 523); - avl = gpr_avl_add(avl, box(141), box(39), nullptr); - avl = remove_int(avl, 159); - avl = gpr_avl_add(avl, box(947), box(41), nullptr); - avl = gpr_avl_add(avl, box(855), box(42), nullptr); - avl = remove_int(avl, 218); - avl = remove_int(avl, 6); - avl = gpr_avl_add(avl, box(753), box(45), nullptr); - avl = remove_int(avl, 82); - avl = remove_int(avl, 799); - avl = gpr_avl_add(avl, box(572), box(48), nullptr); - avl = remove_int(avl, 376); - avl = remove_int(avl, 413); - avl = gpr_avl_add(avl, box(458), box(51), nullptr); - avl = remove_int(avl, 897); - avl = gpr_avl_add(avl, box(191), box(53), nullptr); - avl = gpr_avl_add(avl, box(609), box(54), nullptr); - 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), nullptr); - avl = remove_int(avl, 641); - avl = gpr_avl_add(avl, box(462), box(62), nullptr); - avl = remove_int(avl, 359); - avl = remove_int(avl, 767); - avl = gpr_avl_add(avl, box(310), box(65), nullptr); - avl = remove_int(avl, 757); - avl = remove_int(avl, 639); - avl = remove_int(avl, 314); - avl = gpr_avl_add(avl, box(2), box(69), nullptr); - avl = remove_int(avl, 138); - avl = gpr_avl_add(avl, box(669), box(71), nullptr); - avl = remove_int(avl, 477); - avl = gpr_avl_add(avl, box(366), box(73), nullptr); - avl = gpr_avl_add(avl, box(612), box(74), nullptr); - avl = gpr_avl_add(avl, box(106), box(75), nullptr); - avl = remove_int(avl, 161); - avl = gpr_avl_add(avl, box(388), box(77), nullptr); - avl = gpr_avl_add(avl, box(141), box(78), nullptr); - avl = remove_int(avl, 633); - avl = remove_int(avl, 459); - avl = gpr_avl_add(avl, box(40), box(81), nullptr); - avl = remove_int(avl, 689); - avl = gpr_avl_add(avl, box(823), box(83), nullptr); - avl = remove_int(avl, 485); - avl = gpr_avl_add(avl, box(903), box(85), nullptr); - avl = gpr_avl_add(avl, box(592), box(86), nullptr); - avl = remove_int(avl, 448); - avl = gpr_avl_add(avl, box(56), box(88), nullptr); - avl = remove_int(avl, 333); - avl = gpr_avl_add(avl, box(189), box(90), nullptr); - avl = gpr_avl_add(avl, box(103), box(91), nullptr); - avl = remove_int(avl, 164); - avl = remove_int(avl, 974); - avl = gpr_avl_add(avl, box(215), box(94), nullptr); - avl = remove_int(avl, 189); - avl = remove_int(avl, 504); - avl = gpr_avl_add(avl, box(868), box(97), nullptr); - avl = remove_int(avl, 909); - avl = remove_int(avl, 148); - avl = remove_int(avl, 469); - avl = gpr_avl_add(avl, box(994), box(101), nullptr); - avl = gpr_avl_add(avl, box(576), box(102), nullptr); - avl = remove_int(avl, 82); - avl = remove_int(avl, 209); - avl = gpr_avl_add(avl, box(276), box(105), nullptr); - avl = remove_int(avl, 856); - avl = gpr_avl_add(avl, box(750), box(107), nullptr); - avl = remove_int(avl, 871); - avl = gpr_avl_add(avl, box(301), box(109), nullptr); - avl = remove_int(avl, 260); - avl = remove_int(avl, 737); - avl = remove_int(avl, 719); - avl = gpr_avl_add(avl, box(933), box(113), nullptr); - avl = gpr_avl_add(avl, box(225), box(114), nullptr); - avl = gpr_avl_add(avl, box(975), box(115), nullptr); - avl = gpr_avl_add(avl, box(86), box(116), nullptr); - avl = remove_int(avl, 732); - avl = gpr_avl_add(avl, box(340), box(118), nullptr); - avl = gpr_avl_add(avl, box(271), box(119), nullptr); - avl = remove_int(avl, 206); - avl = gpr_avl_add(avl, box(949), box(121), nullptr); - avl = gpr_avl_add(avl, box(927), box(122), nullptr); - avl = gpr_avl_add(avl, box(34), box(123), nullptr); - avl = gpr_avl_add(avl, box(351), box(124), nullptr); - avl = remove_int(avl, 836); - avl = gpr_avl_add(avl, box(825), box(126), nullptr); - avl = gpr_avl_add(avl, box(352), box(127), nullptr); - avl = remove_int(avl, 107); - avl = remove_int(avl, 101); - avl = gpr_avl_add(avl, box(320), box(130), nullptr); - avl = gpr_avl_add(avl, box(3), box(131), nullptr); - avl = remove_int(avl, 998); - avl = remove_int(avl, 44); - avl = gpr_avl_add(avl, box(525), box(134), nullptr); - avl = gpr_avl_add(avl, box(864), box(135), nullptr); - avl = gpr_avl_add(avl, box(863), box(136), nullptr); - avl = remove_int(avl, 770); - avl = gpr_avl_add(avl, box(440), box(138), nullptr); - avl = remove_int(avl, 516); - avl = gpr_avl_add(avl, box(116), box(140), nullptr); - avl = remove_int(avl, 380); - avl = gpr_avl_add(avl, box(878), box(142), nullptr); - avl = remove_int(avl, 439); - avl = gpr_avl_add(avl, box(994), box(144), nullptr); - avl = remove_int(avl, 294); - avl = remove_int(avl, 593); - avl = gpr_avl_add(avl, box(696), box(147), nullptr); - avl = remove_int(avl, 8); - avl = gpr_avl_add(avl, box(881), box(149), nullptr); - avl = remove_int(avl, 32); - avl = remove_int(avl, 242); - avl = gpr_avl_add(avl, box(487), box(152), nullptr); - avl = gpr_avl_add(avl, box(637), box(153), nullptr); - avl = gpr_avl_add(avl, box(793), box(154), nullptr); - avl = gpr_avl_add(avl, box(696), box(155), nullptr); - avl = remove_int(avl, 458); - avl = gpr_avl_add(avl, box(828), box(157), nullptr); - avl = remove_int(avl, 784); - avl = remove_int(avl, 274); - avl = gpr_avl_add(avl, box(783), box(160), nullptr); - avl = remove_int(avl, 21); - avl = gpr_avl_add(avl, box(866), box(162), nullptr); - avl = remove_int(avl, 919); - avl = gpr_avl_add(avl, box(435), box(164), nullptr); - avl = remove_int(avl, 385); - avl = gpr_avl_add(avl, box(475), box(166), nullptr); - avl = remove_int(avl, 339); - avl = gpr_avl_add(avl, box(615), box(168), nullptr); - avl = remove_int(avl, 866); - avl = remove_int(avl, 82); - avl = remove_int(avl, 271); - avl = gpr_avl_add(avl, box(590), box(172), nullptr); - avl = gpr_avl_add(avl, box(852), box(173), nullptr); - avl = remove_int(avl, 318); - avl = remove_int(avl, 82); - avl = gpr_avl_add(avl, box(672), box(176), nullptr); - avl = remove_int(avl, 430); - avl = gpr_avl_add(avl, box(821), box(178), nullptr); - avl = gpr_avl_add(avl, box(365), box(179), nullptr); - avl = remove_int(avl, 78); - avl = gpr_avl_add(avl, box(700), box(181), nullptr); - avl = gpr_avl_add(avl, box(353), box(182), nullptr); - avl = remove_int(avl, 492); - avl = gpr_avl_add(avl, box(991), box(184), nullptr); - avl = remove_int(avl, 330); - avl = gpr_avl_add(avl, box(873), box(186), nullptr); - avl = remove_int(avl, 589); - avl = gpr_avl_add(avl, box(676), box(188), nullptr); - avl = gpr_avl_add(avl, box(790), box(189), nullptr); - avl = remove_int(avl, 521); - avl = remove_int(avl, 47); - avl = gpr_avl_add(avl, box(976), box(192), nullptr); - avl = gpr_avl_add(avl, box(683), box(193), nullptr); - avl = remove_int(avl, 803); - avl = remove_int(avl, 1006); - avl = gpr_avl_add(avl, box(775), box(196), nullptr); - avl = gpr_avl_add(avl, box(411), box(197), nullptr); - avl = gpr_avl_add(avl, box(697), box(198), nullptr); - avl = remove_int(avl, 50); - avl = gpr_avl_add(avl, box(213), box(200), nullptr); - avl = remove_int(avl, 714); - avl = gpr_avl_add(avl, box(981), box(202), nullptr); - avl = gpr_avl_add(avl, box(502), box(203), nullptr); - avl = gpr_avl_add(avl, box(697), box(204), nullptr); - avl = gpr_avl_add(avl, box(603), box(205), nullptr); - avl = gpr_avl_add(avl, box(117), box(206), nullptr); - avl = remove_int(avl, 363); - avl = gpr_avl_add(avl, box(104), box(208), nullptr); - avl = remove_int(avl, 842); - avl = gpr_avl_add(avl, box(48), box(210), nullptr); - avl = remove_int(avl, 764); - avl = gpr_avl_add(avl, box(482), box(212), nullptr); - avl = gpr_avl_add(avl, box(928), box(213), nullptr); - avl = gpr_avl_add(avl, box(30), box(214), nullptr); - avl = gpr_avl_add(avl, box(820), box(215), nullptr); - avl = gpr_avl_add(avl, box(334), box(216), nullptr); - avl = remove_int(avl, 306); - avl = gpr_avl_add(avl, box(789), box(218), nullptr); - avl = remove_int(avl, 924); - avl = gpr_avl_add(avl, box(53), box(220), nullptr); - avl = remove_int(avl, 657); - avl = gpr_avl_add(avl, box(130), box(222), nullptr); - avl = gpr_avl_add(avl, box(239), box(223), nullptr); - avl = remove_int(avl, 20); - avl = gpr_avl_add(avl, box(117), box(225), nullptr); - avl = remove_int(avl, 882); - avl = remove_int(avl, 891); - avl = gpr_avl_add(avl, box(9), box(228), nullptr); - avl = gpr_avl_add(avl, box(496), box(229), nullptr); - avl = gpr_avl_add(avl, box(750), box(230), nullptr); - avl = gpr_avl_add(avl, box(283), box(231), nullptr); - avl = gpr_avl_add(avl, box(802), box(232), nullptr); - avl = remove_int(avl, 352); - avl = gpr_avl_add(avl, box(374), box(234), nullptr); - avl = gpr_avl_add(avl, box(6), box(235), nullptr); - avl = gpr_avl_add(avl, box(756), box(236), nullptr); - avl = gpr_avl_add(avl, box(597), box(237), nullptr); - avl = gpr_avl_add(avl, box(661), box(238), nullptr); - avl = remove_int(avl, 96); - avl = gpr_avl_add(avl, box(894), box(240), nullptr); - avl = remove_int(avl, 749); - avl = gpr_avl_add(avl, box(71), box(242), nullptr); - avl = remove_int(avl, 68); - avl = gpr_avl_add(avl, box(388), box(244), nullptr); - avl = remove_int(avl, 119); - avl = remove_int(avl, 856); - avl = gpr_avl_add(avl, box(176), box(247), nullptr); - avl = gpr_avl_add(avl, box(993), box(248), nullptr); - avl = remove_int(avl, 178); - avl = remove_int(avl, 781); - avl = remove_int(avl, 771); - avl = remove_int(avl, 848); - avl = remove_int(avl, 376); - avl = remove_int(avl, 157); - avl = remove_int(avl, 142); - avl = remove_int(avl, 686); - avl = gpr_avl_add(avl, box(779), box(257), nullptr); - avl = gpr_avl_add(avl, box(484), box(258), nullptr); - avl = remove_int(avl, 837); - avl = gpr_avl_add(avl, box(388), box(260), nullptr); - avl = remove_int(avl, 987); - avl = gpr_avl_add(avl, box(336), box(262), nullptr); - avl = remove_int(avl, 855); - avl = gpr_avl_add(avl, box(668), box(264), nullptr); - avl = remove_int(avl, 648); - avl = gpr_avl_add(avl, box(193), box(266), nullptr); - avl = remove_int(avl, 939); - avl = gpr_avl_add(avl, box(740), box(268), nullptr); - avl = gpr_avl_add(avl, box(503), box(269), nullptr); - avl = gpr_avl_add(avl, box(765), box(270), nullptr); - avl = remove_int(avl, 924); - avl = remove_int(avl, 513); - avl = gpr_avl_add(avl, box(161), box(273), nullptr); - avl = gpr_avl_add(avl, box(502), box(274), nullptr); - avl = gpr_avl_add(avl, box(846), box(275), nullptr); - avl = remove_int(avl, 931); - avl = gpr_avl_add(avl, box(87), box(277), nullptr); - avl = gpr_avl_add(avl, box(949), box(278), nullptr); - avl = gpr_avl_add(avl, box(548), box(279), nullptr); - avl = gpr_avl_add(avl, box(951), box(280), nullptr); - avl = remove_int(avl, 1018); - avl = remove_int(avl, 568); - avl = gpr_avl_add(avl, box(138), box(283), nullptr); - avl = gpr_avl_add(avl, box(202), box(284), nullptr); - avl = gpr_avl_add(avl, box(157), box(285), nullptr); - avl = gpr_avl_add(avl, box(264), box(286), nullptr); - avl = gpr_avl_add(avl, box(370), box(287), nullptr); - avl = remove_int(avl, 736); - avl = remove_int(avl, 751); - avl = remove_int(avl, 506); - avl = remove_int(avl, 81); - avl = remove_int(avl, 358); - avl = remove_int(avl, 657); - avl = remove_int(avl, 86); - avl = gpr_avl_add(avl, box(876), box(295), nullptr); - avl = remove_int(avl, 354); - avl = gpr_avl_add(avl, box(134), box(297), nullptr); - avl = remove_int(avl, 781); - avl = remove_int(avl, 183); - avl = gpr_avl_add(avl, box(914), box(300), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(699), box(307), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(265), box(315), nullptr); - avl = gpr_avl_add(avl, box(268), box(316), nullptr); - avl = gpr_avl_add(avl, box(103), box(317), nullptr); - avl = gpr_avl_add(avl, box(440), box(318), nullptr); - avl = remove_int(avl, 777); - avl = gpr_avl_add(avl, box(670), box(320), nullptr); - avl = remove_int(avl, 506); - avl = remove_int(avl, 487); - avl = gpr_avl_add(avl, box(421), box(323), nullptr); - avl = remove_int(avl, 514); - avl = gpr_avl_add(avl, box(701), box(325), nullptr); - avl = remove_int(avl, 949); - avl = remove_int(avl, 872); - avl = remove_int(avl, 139); - avl = gpr_avl_add(avl, box(781), box(329), nullptr); - avl = gpr_avl_add(avl, box(543), box(330), nullptr); - avl = gpr_avl_add(avl, box(147), box(331), nullptr); - avl = remove_int(avl, 190); - avl = gpr_avl_add(avl, box(453), box(333), nullptr); - 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), nullptr); - avl = remove_int(avl, 812); - avl = gpr_avl_add(avl, box(431), box(340), nullptr); - avl = gpr_avl_add(avl, box(8), box(341), nullptr); - avl = remove_int(avl, 843); - avl = gpr_avl_add(avl, box(831), box(343), nullptr); - avl = remove_int(avl, 472); - avl = remove_int(avl, 157); - avl = gpr_avl_add(avl, box(612), box(346), nullptr); - avl = gpr_avl_add(avl, box(802), box(347), nullptr); - avl = remove_int(avl, 554); - avl = gpr_avl_add(avl, box(409), box(349), nullptr); - avl = gpr_avl_add(avl, box(439), box(350), nullptr); - avl = gpr_avl_add(avl, box(725), box(351), nullptr); - avl = gpr_avl_add(avl, box(568), box(352), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(950), box(358), nullptr); - avl = gpr_avl_add(avl, box(532), box(359), nullptr); - avl = gpr_avl_add(avl, box(832), box(360), nullptr); - avl = remove_int(avl, 390); - avl = gpr_avl_add(avl, box(993), box(362), nullptr); - avl = remove_int(avl, 198); - avl = remove_int(avl, 401); - avl = gpr_avl_add(avl, box(316), box(365), nullptr); - avl = remove_int(avl, 843); - avl = gpr_avl_add(avl, box(541), box(367), nullptr); - avl = gpr_avl_add(avl, box(505), box(368), nullptr); - avl = remove_int(avl, 445); - avl = remove_int(avl, 256); - avl = gpr_avl_add(avl, box(232), box(371), nullptr); - avl = remove_int(avl, 577); - avl = remove_int(avl, 558); - avl = gpr_avl_add(avl, box(910), box(374), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(655), box(381), nullptr); - avl = remove_int(avl, 557); - avl = remove_int(avl, 102); - avl = remove_int(avl, 165); - avl = gpr_avl_add(avl, box(191), box(385), nullptr); - avl = remove_int(avl, 30); - avl = gpr_avl_add(avl, box(406), box(387), nullptr); - avl = gpr_avl_add(avl, box(66), box(388), nullptr); - avl = gpr_avl_add(avl, box(87), box(389), nullptr); - avl = remove_int(avl, 7); - avl = remove_int(avl, 671); - avl = gpr_avl_add(avl, box(234), box(392), nullptr); - avl = remove_int(avl, 463); - avl = gpr_avl_add(avl, box(75), box(394), nullptr); - avl = gpr_avl_add(avl, box(487), box(395), nullptr); - avl = remove_int(avl, 203); - avl = gpr_avl_add(avl, box(711), box(397), nullptr); - avl = remove_int(avl, 291); - avl = remove_int(avl, 798); - avl = remove_int(avl, 337); - avl = gpr_avl_add(avl, box(877), box(401), nullptr); - avl = gpr_avl_add(avl, box(388), box(402), nullptr); - avl = remove_int(avl, 975); - avl = gpr_avl_add(avl, box(200), box(404), nullptr); - avl = gpr_avl_add(avl, box(408), box(405), nullptr); - avl = gpr_avl_add(avl, box(3), box(406), nullptr); - avl = gpr_avl_add(avl, box(971), box(407), nullptr); - 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), nullptr); - avl = remove_int(avl, 14); - avl = remove_int(avl, 364); - avl = gpr_avl_add(avl, box(215), box(415), nullptr); - avl = remove_int(avl, 778); - avl = remove_int(avl, 45); - avl = gpr_avl_add(avl, box(328), box(418), nullptr); - avl = gpr_avl_add(avl, box(597), box(419), nullptr); - avl = remove_int(avl, 34); - avl = gpr_avl_add(avl, box(736), box(421), nullptr); - avl = remove_int(avl, 37); - avl = gpr_avl_add(avl, box(275), box(423), nullptr); - avl = gpr_avl_add(avl, box(70), box(424), nullptr); - avl = gpr_avl_add(avl, box(771), box(425), nullptr); - avl = remove_int(avl, 536); - avl = remove_int(avl, 421); - avl = gpr_avl_add(avl, box(186), box(428), nullptr); - avl = gpr_avl_add(avl, box(788), box(429), nullptr); - avl = gpr_avl_add(avl, box(224), box(430), nullptr); - avl = remove_int(avl, 228); - avl = gpr_avl_add(avl, box(48), box(432), nullptr); - avl = gpr_avl_add(avl, box(120), box(433), nullptr); - avl = gpr_avl_add(avl, box(269), box(434), nullptr); - avl = gpr_avl_add(avl, box(904), box(435), nullptr); - avl = remove_int(avl, 699); - avl = gpr_avl_add(avl, box(340), box(437), nullptr); - avl = remove_int(avl, 276); - avl = gpr_avl_add(avl, box(591), box(439), nullptr); - avl = gpr_avl_add(avl, box(778), box(440), nullptr); - avl = remove_int(avl, 490); - avl = remove_int(avl, 973); - avl = gpr_avl_add(avl, box(294), box(443), nullptr); - avl = gpr_avl_add(avl, box(323), box(444), nullptr); - avl = remove_int(avl, 685); - avl = gpr_avl_add(avl, box(38), box(446), nullptr); - avl = gpr_avl_add(avl, box(525), box(447), nullptr); - avl = remove_int(avl, 162); - avl = gpr_avl_add(avl, box(462), box(449), nullptr); - avl = gpr_avl_add(avl, box(340), box(450), nullptr); - avl = remove_int(avl, 734); - avl = remove_int(avl, 959); - avl = gpr_avl_add(avl, box(752), box(453), nullptr); - avl = gpr_avl_add(avl, box(667), box(454), nullptr); - avl = remove_int(avl, 558); - avl = remove_int(avl, 657); - avl = gpr_avl_add(avl, box(711), box(457), nullptr); - avl = remove_int(avl, 937); - avl = gpr_avl_add(avl, box(741), box(459), nullptr); - avl = gpr_avl_add(avl, box(40), box(460), nullptr); - avl = remove_int(avl, 784); - avl = gpr_avl_add(avl, box(292), box(462), nullptr); - avl = remove_int(avl, 164); - avl = remove_int(avl, 931); - avl = remove_int(avl, 886); - avl = gpr_avl_add(avl, box(968), box(466), nullptr); - avl = remove_int(avl, 263); - avl = gpr_avl_add(avl, box(647), box(468), nullptr); - avl = gpr_avl_add(avl, box(92), box(469), nullptr); - avl = remove_int(avl, 310); - avl = gpr_avl_add(avl, box(711), box(471), nullptr); - avl = gpr_avl_add(avl, box(675), box(472), nullptr); - avl = remove_int(avl, 549); - avl = gpr_avl_add(avl, box(380), box(474), nullptr); - avl = remove_int(avl, 825); - avl = gpr_avl_add(avl, box(668), box(476), nullptr); - avl = remove_int(avl, 498); - avl = gpr_avl_add(avl, box(870), box(478), nullptr); - avl = gpr_avl_add(avl, box(391), box(479), nullptr); - avl = gpr_avl_add(avl, box(264), box(480), nullptr); - 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), nullptr); - avl = remove_int(avl, 849); - avl = remove_int(avl, 47); - avl = gpr_avl_add(avl, box(299), box(490), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(524), box(496), nullptr); - avl = remove_int(avl, 210); - avl = remove_int(avl, 299); - avl = gpr_avl_add(avl, box(823), box(499), nullptr); - avl = remove_int(avl, 479); - avl = remove_int(avl, 96); - avl = remove_int(avl, 1013); - avl = gpr_avl_add(avl, box(768), box(503), nullptr); - avl = remove_int(avl, 638); - avl = remove_int(avl, 20); - avl = gpr_avl_add(avl, box(663), box(506), nullptr); - avl = remove_int(avl, 882); - avl = gpr_avl_add(avl, box(745), box(508), nullptr); - avl = remove_int(avl, 352); - avl = gpr_avl_add(avl, box(10), box(510), nullptr); - avl = remove_int(avl, 484); - avl = gpr_avl_add(avl, box(420), box(512), nullptr); - avl = gpr_avl_add(avl, box(884), box(513), nullptr); - avl = gpr_avl_add(avl, box(993), box(514), nullptr); - avl = gpr_avl_add(avl, box(251), box(515), nullptr); - avl = remove_int(avl, 222); - avl = gpr_avl_add(avl, box(734), box(517), nullptr); - avl = gpr_avl_add(avl, box(952), box(518), nullptr); - 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), nullptr); - avl = remove_int(avl, 897); - avl = gpr_avl_add(avl, box(719), box(526), nullptr); - avl = gpr_avl_add(avl, box(622), box(527), nullptr); - avl = remove_int(avl, 28); - avl = remove_int(avl, 836); - avl = remove_int(avl, 142); - avl = gpr_avl_add(avl, box(445), box(531), nullptr); - avl = gpr_avl_add(avl, box(410), box(532), nullptr); - avl = remove_int(avl, 575); - avl = gpr_avl_add(avl, box(634), box(534), nullptr); - avl = gpr_avl_add(avl, box(906), box(535), nullptr); - avl = remove_int(avl, 649); - avl = gpr_avl_add(avl, box(813), box(537), nullptr); - avl = remove_int(avl, 702); - avl = remove_int(avl, 732); - avl = gpr_avl_add(avl, box(105), box(540), nullptr); - avl = gpr_avl_add(avl, box(867), box(541), nullptr); - avl = remove_int(avl, 964); - avl = remove_int(avl, 941); - avl = gpr_avl_add(avl, box(947), box(544), nullptr); - avl = remove_int(avl, 990); - avl = gpr_avl_add(avl, box(816), box(546), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(786), box(552), nullptr); - avl = gpr_avl_add(avl, box(526), box(553), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(749), box(559), nullptr); - avl = gpr_avl_add(avl, box(194), box(560), nullptr); - avl = remove_int(avl, 517); - avl = gpr_avl_add(avl, box(102), box(562), nullptr); - avl = remove_int(avl, 189); - avl = gpr_avl_add(avl, box(927), box(564), nullptr); - avl = remove_int(avl, 846); - avl = remove_int(avl, 130); - avl = gpr_avl_add(avl, box(694), box(567), nullptr); - avl = remove_int(avl, 750); - avl = gpr_avl_add(avl, box(357), box(569), nullptr); - avl = remove_int(avl, 431); - avl = remove_int(avl, 91); - avl = gpr_avl_add(avl, box(640), box(572), nullptr); - avl = remove_int(avl, 4); - avl = gpr_avl_add(avl, box(81), box(574), nullptr); - avl = gpr_avl_add(avl, box(595), box(575), nullptr); - avl = remove_int(avl, 444); - avl = remove_int(avl, 262); - avl = remove_int(avl, 11); - avl = gpr_avl_add(avl, box(192), box(579), nullptr); - avl = gpr_avl_add(avl, box(158), box(580), nullptr); - avl = remove_int(avl, 401); - avl = remove_int(avl, 918); - avl = gpr_avl_add(avl, box(180), box(583), nullptr); - avl = remove_int(avl, 268); - avl = gpr_avl_add(avl, box(1012), box(585), nullptr); - avl = gpr_avl_add(avl, box(90), box(586), nullptr); - avl = gpr_avl_add(avl, box(946), box(587), nullptr); - avl = remove_int(avl, 719); - avl = gpr_avl_add(avl, box(874), box(589), nullptr); - avl = gpr_avl_add(avl, box(679), box(590), nullptr); - avl = remove_int(avl, 53); - avl = remove_int(avl, 534); - avl = gpr_avl_add(avl, box(646), box(593), nullptr); - avl = gpr_avl_add(avl, box(767), box(594), nullptr); - avl = gpr_avl_add(avl, box(460), box(595), nullptr); - avl = gpr_avl_add(avl, box(852), box(596), nullptr); - avl = gpr_avl_add(avl, box(189), box(597), nullptr); - avl = remove_int(avl, 932); - avl = remove_int(avl, 366); - avl = remove_int(avl, 907); - avl = gpr_avl_add(avl, box(875), box(601), nullptr); - avl = gpr_avl_add(avl, box(434), box(602), nullptr); - avl = gpr_avl_add(avl, box(704), box(603), nullptr); - avl = gpr_avl_add(avl, box(724), box(604), nullptr); - avl = gpr_avl_add(avl, box(930), box(605), nullptr); - avl = gpr_avl_add(avl, box(1000), box(606), nullptr); - avl = remove_int(avl, 479); - avl = gpr_avl_add(avl, box(275), box(608), nullptr); - avl = remove_int(avl, 32); - avl = gpr_avl_add(avl, box(939), box(610), nullptr); - avl = remove_int(avl, 943); - avl = remove_int(avl, 329); - avl = gpr_avl_add(avl, box(490), box(613), nullptr); - 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), nullptr); - avl = remove_int(avl, 751); - avl = gpr_avl_add(avl, box(568), box(620), nullptr); - avl = gpr_avl_add(avl, box(120), box(621), nullptr); - avl = gpr_avl_add(avl, box(617), box(622), nullptr); - avl = gpr_avl_add(avl, box(32), box(623), nullptr); - avl = remove_int(avl, 701); - avl = gpr_avl_add(avl, box(910), box(625), nullptr); - 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), nullptr); - 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), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(6), box(642), nullptr); - avl = gpr_avl_add(avl, box(680), box(643), nullptr); - avl = remove_int(avl, 741); - avl = remove_int(avl, 309); - avl = remove_int(avl, 272); - avl = gpr_avl_add(avl, box(249), box(647), nullptr); - avl = remove_int(avl, 97); - avl = remove_int(avl, 850); - avl = gpr_avl_add(avl, box(915), box(650), nullptr); - avl = gpr_avl_add(avl, box(816), box(651), nullptr); - avl = gpr_avl_add(avl, box(45), box(652), nullptr); - avl = gpr_avl_add(avl, box(168), box(653), nullptr); - avl = remove_int(avl, 153); - avl = remove_int(avl, 239); - avl = gpr_avl_add(avl, box(684), box(656), nullptr); - avl = gpr_avl_add(avl, box(208), box(657), nullptr); - avl = gpr_avl_add(avl, box(681), box(658), nullptr); - avl = gpr_avl_add(avl, box(609), box(659), nullptr); - avl = gpr_avl_add(avl, box(645), box(660), nullptr); - avl = remove_int(avl, 799); - avl = gpr_avl_add(avl, box(955), box(662), nullptr); - avl = gpr_avl_add(avl, box(946), box(663), nullptr); - avl = gpr_avl_add(avl, box(744), box(664), nullptr); - avl = gpr_avl_add(avl, box(201), box(665), nullptr); - avl = gpr_avl_add(avl, box(136), box(666), nullptr); - avl = remove_int(avl, 357); - avl = gpr_avl_add(avl, box(974), box(668), nullptr); - avl = remove_int(avl, 485); - avl = gpr_avl_add(avl, box(1009), box(670), nullptr); - avl = gpr_avl_add(avl, box(517), box(671), nullptr); - avl = remove_int(avl, 491); - avl = gpr_avl_add(avl, box(336), box(673), nullptr); - avl = gpr_avl_add(avl, box(589), box(674), nullptr); - 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), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(25), box(685), nullptr); - avl = remove_int(avl, 278); - avl = gpr_avl_add(avl, box(191), box(687), nullptr); - avl = remove_int(avl, 243); - avl = remove_int(avl, 918); - avl = remove_int(avl, 449); - avl = gpr_avl_add(avl, box(19), box(691), nullptr); - avl = gpr_avl_add(avl, box(762), box(692), nullptr); - avl = gpr_avl_add(avl, box(13), box(693), nullptr); - avl = gpr_avl_add(avl, box(151), box(694), nullptr); - avl = gpr_avl_add(avl, box(152), box(695), nullptr); - avl = gpr_avl_add(avl, box(793), box(696), nullptr); - avl = remove_int(avl, 862); - avl = remove_int(avl, 890); - avl = gpr_avl_add(avl, box(687), box(699), nullptr); - avl = gpr_avl_add(avl, box(509), box(700), nullptr); - avl = gpr_avl_add(avl, box(973), box(701), nullptr); - avl = remove_int(avl, 230); - avl = gpr_avl_add(avl, box(532), box(703), nullptr); - avl = remove_int(avl, 668); - avl = gpr_avl_add(avl, box(281), box(705), nullptr); - avl = gpr_avl_add(avl, box(867), box(706), nullptr); - avl = gpr_avl_add(avl, box(359), box(707), nullptr); - avl = remove_int(avl, 425); - avl = gpr_avl_add(avl, box(691), box(709), nullptr); - avl = gpr_avl_add(avl, box(163), box(710), nullptr); - avl = gpr_avl_add(avl, box(502), box(711), nullptr); - avl = remove_int(avl, 674); - avl = gpr_avl_add(avl, box(697), box(713), nullptr); - avl = remove_int(avl, 271); - avl = gpr_avl_add(avl, box(968), box(715), nullptr); - avl = gpr_avl_add(avl, box(48), box(716), nullptr); - avl = remove_int(avl, 543); - avl = gpr_avl_add(avl, box(35), box(718), nullptr); - avl = gpr_avl_add(avl, box(751), box(719), nullptr); - avl = gpr_avl_add(avl, box(478), box(720), nullptr); - avl = remove_int(avl, 797); - avl = remove_int(avl, 309); - avl = gpr_avl_add(avl, box(927), box(723), nullptr); - avl = remove_int(avl, 504); - avl = gpr_avl_add(avl, box(286), box(725), nullptr); - avl = gpr_avl_add(avl, box(413), box(726), nullptr); - avl = gpr_avl_add(avl, box(599), box(727), nullptr); - avl = remove_int(avl, 105); - avl = remove_int(avl, 605); - avl = gpr_avl_add(avl, box(632), box(730), nullptr); - avl = gpr_avl_add(avl, box(133), box(731), nullptr); - avl = remove_int(avl, 443); - avl = gpr_avl_add(avl, box(958), box(733), nullptr); - avl = gpr_avl_add(avl, box(729), box(734), nullptr); - avl = remove_int(avl, 158); - avl = gpr_avl_add(avl, box(694), box(736), nullptr); - avl = gpr_avl_add(avl, box(505), box(737), nullptr); - avl = remove_int(avl, 63); - avl = remove_int(avl, 714); - avl = gpr_avl_add(avl, box(1002), box(740), nullptr); - avl = remove_int(avl, 211); - avl = gpr_avl_add(avl, box(765), box(742), nullptr); - avl = gpr_avl_add(avl, box(455), box(743), nullptr); - avl = remove_int(avl, 59); - avl = remove_int(avl, 224); - avl = gpr_avl_add(avl, box(586), box(746), nullptr); - avl = gpr_avl_add(avl, box(348), box(747), nullptr); - avl = remove_int(avl, 10); - avl = remove_int(avl, 484); - avl = gpr_avl_add(avl, box(968), box(750), nullptr); - avl = gpr_avl_add(avl, box(923), box(751), nullptr); - avl = remove_int(avl, 573); - avl = remove_int(avl, 617); - avl = gpr_avl_add(avl, box(812), box(754), nullptr); - avl = gpr_avl_add(avl, box(179), box(755), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(927), box(761), nullptr); - avl = gpr_avl_add(avl, box(454), box(762), nullptr); - avl = gpr_avl_add(avl, box(217), box(763), nullptr); - avl = remove_int(avl, 534); - avl = gpr_avl_add(avl, box(180), box(765), nullptr); - avl = gpr_avl_add(avl, box(319), box(766), nullptr); - avl = remove_int(avl, 92); - avl = gpr_avl_add(avl, box(483), box(768), nullptr); - 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), nullptr); - avl = remove_int(avl, 807); - avl = gpr_avl_add(avl, box(463), box(775), nullptr); - avl = gpr_avl_add(avl, box(271), box(776), nullptr); - avl = gpr_avl_add(avl, box(644), box(777), nullptr); - avl = remove_int(avl, 618); - avl = gpr_avl_add(avl, box(166), box(779), nullptr); - avl = gpr_avl_add(avl, box(538), box(780), nullptr); - avl = remove_int(avl, 606); - avl = gpr_avl_add(avl, box(425), box(782), nullptr); - avl = remove_int(avl, 725); - avl = remove_int(avl, 383); - avl = gpr_avl_add(avl, box(155), box(785), nullptr); - avl = remove_int(avl, 889); - avl = gpr_avl_add(avl, box(653), box(787), nullptr); - avl = remove_int(avl, 386); - avl = gpr_avl_add(avl, box(142), box(789), nullptr); - avl = remove_int(avl, 107); - avl = remove_int(avl, 603); - avl = remove_int(avl, 971); - avl = gpr_avl_add(avl, box(80), box(793), nullptr); - avl = gpr_avl_add(avl, box(61), box(794), nullptr); - avl = gpr_avl_add(avl, box(693), box(795), nullptr); - avl = gpr_avl_add(avl, box(592), box(796), nullptr); - avl = gpr_avl_add(avl, box(433), box(797), nullptr); - avl = gpr_avl_add(avl, box(973), box(798), nullptr); - avl = remove_int(avl, 901); - avl = remove_int(avl, 340); - avl = remove_int(avl, 709); - avl = gpr_avl_add(avl, box(224), box(802), nullptr); - avl = remove_int(avl, 120); - avl = remove_int(avl, 271); - avl = gpr_avl_add(avl, box(780), box(805), nullptr); - avl = gpr_avl_add(avl, box(867), box(806), nullptr); - avl = gpr_avl_add(avl, box(756), box(807), nullptr); - avl = gpr_avl_add(avl, box(583), box(808), nullptr); - avl = gpr_avl_add(avl, box(356), box(809), nullptr); - avl = gpr_avl_add(avl, box(58), box(810), nullptr); - avl = remove_int(avl, 219); - avl = gpr_avl_add(avl, box(301), box(812), nullptr); - avl = remove_int(avl, 643); - avl = remove_int(avl, 787); - avl = remove_int(avl, 583); - avl = remove_int(avl, 552); - avl = remove_int(avl, 308); - avl = remove_int(avl, 608); - avl = remove_int(avl, 363); - avl = remove_int(avl, 690); - avl = gpr_avl_add(avl, box(233), box(821), nullptr); - avl = gpr_avl_add(avl, box(479), box(822), nullptr); - avl = gpr_avl_add(avl, box(323), box(823), nullptr); - avl = gpr_avl_add(avl, box(802), box(824), nullptr); - avl = remove_int(avl, 682); - avl = remove_int(avl, 705); - avl = remove_int(avl, 487); - avl = gpr_avl_add(avl, box(530), box(828), nullptr); - avl = gpr_avl_add(avl, box(232), box(829), nullptr); - avl = remove_int(avl, 627); - avl = gpr_avl_add(avl, box(396), box(831), nullptr); - avl = gpr_avl_add(avl, box(61), box(832), nullptr); - avl = gpr_avl_add(avl, box(932), box(833), nullptr); - avl = gpr_avl_add(avl, box(108), box(834), nullptr); - avl = gpr_avl_add(avl, box(524), box(835), nullptr); - avl = remove_int(avl, 390); - avl = remove_int(avl, 307); - avl = gpr_avl_add(avl, box(722), box(838), nullptr); - avl = gpr_avl_add(avl, box(907), box(839), nullptr); - avl = remove_int(avl, 286); - avl = remove_int(avl, 337); - avl = remove_int(avl, 443); - avl = gpr_avl_add(avl, box(973), box(843), nullptr); - avl = remove_int(avl, 930); - avl = remove_int(avl, 242); - avl = gpr_avl_add(avl, box(997), box(846), nullptr); - avl = gpr_avl_add(avl, box(689), box(847), nullptr); - avl = remove_int(avl, 318); - avl = gpr_avl_add(avl, box(703), box(849), nullptr); - avl = gpr_avl_add(avl, box(868), box(850), nullptr); - avl = gpr_avl_add(avl, box(200), box(851), nullptr); - avl = gpr_avl_add(avl, box(960), box(852), nullptr); - avl = gpr_avl_add(avl, box(80), box(853), nullptr); - avl = remove_int(avl, 113); - avl = gpr_avl_add(avl, box(135), box(855), nullptr); - avl = remove_int(avl, 529); - avl = gpr_avl_add(avl, box(366), box(857), nullptr); - avl = remove_int(avl, 272); - avl = gpr_avl_add(avl, box(921), box(859), nullptr); - avl = remove_int(avl, 497); - avl = gpr_avl_add(avl, box(712), box(861), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(29), box(867), nullptr); - avl = gpr_avl_add(avl, box(180), box(868), nullptr); - avl = gpr_avl_add(avl, box(983), box(869), nullptr); - avl = gpr_avl_add(avl, box(72), box(870), nullptr); - avl = gpr_avl_add(avl, box(693), box(871), nullptr); - avl = gpr_avl_add(avl, box(567), box(872), nullptr); - avl = remove_int(avl, 549); - avl = remove_int(avl, 351); - avl = gpr_avl_add(avl, box(1019), box(875), nullptr); - avl = remove_int(avl, 585); - avl = remove_int(avl, 294); - avl = remove_int(avl, 61); - avl = gpr_avl_add(avl, box(409), box(879), nullptr); - avl = gpr_avl_add(avl, box(984), box(880), nullptr); - avl = gpr_avl_add(avl, box(830), box(881), nullptr); - avl = remove_int(avl, 579); - avl = gpr_avl_add(avl, box(672), box(883), nullptr); - avl = remove_int(avl, 968); - - gpr_avl_unref(avl, nullptr); -} - -static void test_badcase3(void) { - gpr_avl avl; - - gpr_log(GPR_DEBUG, "test_badcase3"); - - avl = gpr_avl_create(&int_int_vtable); - avl = remove_int(avl, 624); - avl = gpr_avl_add(avl, box(59), box(2), nullptr); - avl = gpr_avl_add(avl, box(494), box(3), nullptr); - avl = gpr_avl_add(avl, box(226), box(4), nullptr); - avl = remove_int(avl, 524); - avl = gpr_avl_add(avl, box(540), box(6), nullptr); - avl = remove_int(avl, 1008); - avl = gpr_avl_add(avl, box(502), box(8), nullptr); - avl = remove_int(avl, 267); - avl = remove_int(avl, 764); - avl = remove_int(avl, 443); - avl = gpr_avl_add(avl, box(8), box(12), nullptr); - avl = remove_int(avl, 291); - avl = remove_int(avl, 796); - avl = remove_int(avl, 1002); - avl = gpr_avl_add(avl, box(778), box(16), nullptr); - avl = remove_int(avl, 621); - avl = remove_int(avl, 891); - avl = remove_int(avl, 880); - avl = gpr_avl_add(avl, box(197), box(20), nullptr); - avl = gpr_avl_add(avl, box(441), box(21), nullptr); - avl = gpr_avl_add(avl, box(719), box(22), nullptr); - avl = remove_int(avl, 109); - avl = gpr_avl_add(avl, box(458), box(24), nullptr); - avl = remove_int(avl, 86); - avl = gpr_avl_add(avl, box(897), box(26), nullptr); - avl = gpr_avl_add(avl, box(997), box(27), nullptr); - avl = remove_int(avl, 235); - avl = remove_int(avl, 425); - avl = remove_int(avl, 186); - avl = gpr_avl_add(avl, box(887), box(31), nullptr); - avl = gpr_avl_add(avl, box(1005), box(32), nullptr); - avl = gpr_avl_add(avl, box(778), box(33), nullptr); - avl = gpr_avl_add(avl, box(575), box(34), nullptr); - avl = remove_int(avl, 966); - avl = remove_int(avl, 1015); - avl = gpr_avl_add(avl, box(486), box(37), nullptr); - avl = gpr_avl_add(avl, box(809), box(38), nullptr); - avl = gpr_avl_add(avl, box(907), box(39), nullptr); - avl = gpr_avl_add(avl, box(971), box(40), nullptr); - avl = remove_int(avl, 441); - avl = remove_int(avl, 498); - avl = gpr_avl_add(avl, box(727), box(43), nullptr); - avl = remove_int(avl, 679); - avl = remove_int(avl, 740); - avl = remove_int(avl, 532); - avl = gpr_avl_add(avl, box(805), box(47), nullptr); - avl = remove_int(avl, 64); - avl = gpr_avl_add(avl, box(362), box(49), nullptr); - avl = gpr_avl_add(avl, box(170), box(50), nullptr); - avl = gpr_avl_add(avl, box(389), box(51), nullptr); - avl = gpr_avl_add(avl, box(689), box(52), nullptr); - avl = remove_int(avl, 871); - avl = gpr_avl_add(avl, box(447), box(54), nullptr); - avl = remove_int(avl, 718); - avl = gpr_avl_add(avl, box(724), box(56), nullptr); - avl = remove_int(avl, 215); - avl = gpr_avl_add(avl, box(550), box(58), nullptr); - avl = remove_int(avl, 932); - avl = gpr_avl_add(avl, box(47), box(60), nullptr); - avl = remove_int(avl, 46); - avl = remove_int(avl, 229); - avl = gpr_avl_add(avl, box(68), box(63), nullptr); - avl = gpr_avl_add(avl, box(387), box(64), nullptr); - avl = remove_int(avl, 933); - avl = remove_int(avl, 736); - avl = remove_int(avl, 719); - avl = gpr_avl_add(avl, box(150), box(68), nullptr); - avl = remove_int(avl, 875); - avl = remove_int(avl, 298); - avl = gpr_avl_add(avl, box(991), box(71), nullptr); - avl = remove_int(avl, 705); - avl = gpr_avl_add(avl, box(197), box(73), nullptr); - avl = gpr_avl_add(avl, box(101), box(74), nullptr); - avl = remove_int(avl, 436); - avl = gpr_avl_add(avl, box(755), box(76), nullptr); - avl = gpr_avl_add(avl, box(727), box(77), nullptr); - avl = remove_int(avl, 309); - avl = remove_int(avl, 253); - avl = gpr_avl_add(avl, box(203), box(80), nullptr); - avl = remove_int(avl, 231); - avl = gpr_avl_add(avl, box(461), box(82), nullptr); - avl = remove_int(avl, 316); - avl = remove_int(avl, 493); - avl = gpr_avl_add(avl, box(184), box(85), nullptr); - avl = remove_int(avl, 737); - avl = gpr_avl_add(avl, box(790), box(87), nullptr); - avl = gpr_avl_add(avl, box(335), box(88), nullptr); - avl = remove_int(avl, 649); - avl = gpr_avl_add(avl, box(69), box(90), nullptr); - avl = remove_int(avl, 585); - avl = remove_int(avl, 543); - avl = gpr_avl_add(avl, box(784), box(93), nullptr); - avl = gpr_avl_add(avl, box(60), box(94), nullptr); - avl = gpr_avl_add(avl, box(525), box(95), nullptr); - avl = gpr_avl_add(avl, box(177), box(96), nullptr); - avl = gpr_avl_add(avl, box(178), box(97), nullptr); - avl = gpr_avl_add(avl, box(683), box(98), nullptr); - avl = gpr_avl_add(avl, box(226), box(99), nullptr); - avl = gpr_avl_add(avl, box(662), box(100), nullptr); - avl = remove_int(avl, 944); - avl = gpr_avl_add(avl, box(562), box(102), nullptr); - avl = gpr_avl_add(avl, box(793), box(103), nullptr); - avl = remove_int(avl, 673); - avl = gpr_avl_add(avl, box(310), box(105), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(483), box(111), nullptr); - avl = gpr_avl_add(avl, box(84), box(112), nullptr); - avl = remove_int(avl, 109); - avl = gpr_avl_add(avl, box(132), box(114), nullptr); - avl = gpr_avl_add(avl, box(920), box(115), nullptr); - avl = remove_int(avl, 746); - avl = gpr_avl_add(avl, box(145), box(117), nullptr); - avl = gpr_avl_add(avl, box(526), box(118), nullptr); - avl = remove_int(avl, 158); - avl = gpr_avl_add(avl, box(332), box(120), nullptr); - avl = gpr_avl_add(avl, box(918), box(121), nullptr); - avl = remove_int(avl, 339); - avl = gpr_avl_add(avl, box(809), box(123), nullptr); - avl = gpr_avl_add(avl, box(742), box(124), nullptr); - avl = gpr_avl_add(avl, box(718), box(125), nullptr); - avl = remove_int(avl, 988); - avl = remove_int(avl, 531); - avl = remove_int(avl, 840); - avl = gpr_avl_add(avl, box(816), box(129), nullptr); - avl = gpr_avl_add(avl, box(976), box(130), nullptr); - avl = remove_int(avl, 743); - avl = remove_int(avl, 528); - avl = remove_int(avl, 982); - avl = gpr_avl_add(avl, box(803), box(134), nullptr); - avl = gpr_avl_add(avl, box(205), box(135), nullptr); - avl = gpr_avl_add(avl, box(584), box(136), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(333), box(143), nullptr); - avl = remove_int(avl, 439); - avl = gpr_avl_add(avl, box(35), box(145), nullptr); - avl = gpr_avl_add(avl, box(837), box(146), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(116), box(154), nullptr); - avl = gpr_avl_add(avl, box(446), box(155), nullptr); - avl = remove_int(avl, 91); - avl = remove_int(avl, 721); - avl = remove_int(avl, 537); - avl = gpr_avl_add(avl, box(448), box(159), nullptr); - avl = remove_int(avl, 155); - avl = remove_int(avl, 344); - avl = remove_int(avl, 237); - avl = gpr_avl_add(avl, box(309), box(163), nullptr); - avl = gpr_avl_add(avl, box(434), box(164), nullptr); - avl = gpr_avl_add(avl, box(277), box(165), nullptr); - avl = remove_int(avl, 233); - avl = gpr_avl_add(avl, box(275), box(167), nullptr); - avl = gpr_avl_add(avl, box(218), box(168), nullptr); - avl = gpr_avl_add(avl, box(76), box(169), nullptr); - avl = gpr_avl_add(avl, box(898), box(170), nullptr); - avl = remove_int(avl, 771); - avl = gpr_avl_add(avl, box(237), box(172), nullptr); - avl = remove_int(avl, 327); - avl = gpr_avl_add(avl, box(499), box(174), nullptr); - 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), nullptr); - avl = remove_int(avl, 389); - avl = gpr_avl_add(avl, box(708), box(183), nullptr); - avl = gpr_avl_add(avl, box(594), box(184), nullptr); - avl = gpr_avl_add(avl, box(942), box(185), nullptr); - avl = gpr_avl_add(avl, box(282), box(186), nullptr); - avl = remove_int(avl, 434); - avl = remove_int(avl, 134); - avl = remove_int(avl, 270); - avl = remove_int(avl, 512); - avl = remove_int(avl, 265); - avl = remove_int(avl, 21); - avl = remove_int(avl, 193); - avl = remove_int(avl, 797); - avl = remove_int(avl, 347); - avl = gpr_avl_add(avl, box(99), box(196), nullptr); - avl = gpr_avl_add(avl, box(161), box(197), nullptr); - avl = remove_int(avl, 484); - avl = gpr_avl_add(avl, box(72), box(199), nullptr); - avl = remove_int(avl, 629); - avl = gpr_avl_add(avl, box(522), box(201), nullptr); - avl = remove_int(avl, 679); - avl = gpr_avl_add(avl, box(407), box(203), nullptr); - avl = remove_int(avl, 693); - avl = gpr_avl_add(avl, box(424), box(205), nullptr); - avl = gpr_avl_add(avl, box(651), box(206), nullptr); - avl = gpr_avl_add(avl, box(927), box(207), nullptr); - avl = remove_int(avl, 553); - avl = gpr_avl_add(avl, box(128), box(209), nullptr); - avl = gpr_avl_add(avl, box(616), box(210), nullptr); - avl = gpr_avl_add(avl, box(690), box(211), nullptr); - avl = remove_int(avl, 241); - avl = remove_int(avl, 179); - avl = gpr_avl_add(avl, box(697), box(214), nullptr); - avl = remove_int(avl, 779); - avl = gpr_avl_add(avl, box(241), box(216), nullptr); - avl = remove_int(avl, 190); - avl = remove_int(avl, 210); - avl = gpr_avl_add(avl, box(711), box(219), nullptr); - avl = remove_int(avl, 251); - avl = remove_int(avl, 61); - avl = gpr_avl_add(avl, box(800), box(222), nullptr); - avl = remove_int(avl, 551); - avl = gpr_avl_add(avl, box(61), box(224), nullptr); - avl = gpr_avl_add(avl, box(656), box(225), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(125), box(231), nullptr); - avl = remove_int(avl, 107); - avl = gpr_avl_add(avl, box(938), box(233), nullptr); - avl = gpr_avl_add(avl, box(914), box(234), nullptr); - avl = gpr_avl_add(avl, box(197), box(235), nullptr); - avl = remove_int(avl, 736); - avl = gpr_avl_add(avl, box(20), box(237), nullptr); - avl = remove_int(avl, 224); - avl = remove_int(avl, 841); - avl = gpr_avl_add(avl, box(226), box(240), nullptr); - avl = remove_int(avl, 963); - avl = remove_int(avl, 796); - avl = remove_int(avl, 728); - avl = gpr_avl_add(avl, box(855), box(244), nullptr); - avl = gpr_avl_add(avl, box(769), box(245), nullptr); - avl = gpr_avl_add(avl, box(631), box(246), nullptr); - avl = remove_int(avl, 648); - avl = gpr_avl_add(avl, box(187), box(248), nullptr); - avl = gpr_avl_add(avl, box(31), box(249), nullptr); - avl = remove_int(avl, 163); - avl = gpr_avl_add(avl, box(218), box(251), nullptr); - avl = gpr_avl_add(avl, box(488), box(252), nullptr); - avl = gpr_avl_add(avl, box(387), box(253), nullptr); - avl = gpr_avl_add(avl, box(809), box(254), nullptr); - avl = gpr_avl_add(avl, box(997), box(255), nullptr); - avl = remove_int(avl, 678); - avl = gpr_avl_add(avl, box(368), box(257), nullptr); - avl = gpr_avl_add(avl, box(220), box(258), nullptr); - avl = gpr_avl_add(avl, box(373), box(259), nullptr); - 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), nullptr); - avl = remove_int(avl, 254); - avl = remove_int(avl, 456); - avl = gpr_avl_add(avl, box(906), box(267), nullptr); - avl = remove_int(avl, 711); - avl = gpr_avl_add(avl, box(632), box(269), nullptr); - avl = remove_int(avl, 474); - avl = gpr_avl_add(avl, box(508), box(271), nullptr); - avl = gpr_avl_add(avl, box(518), box(272), nullptr); - avl = remove_int(avl, 579); - avl = remove_int(avl, 948); - avl = gpr_avl_add(avl, box(789), box(275), nullptr); - avl = gpr_avl_add(avl, box(48), box(276), nullptr); - avl = gpr_avl_add(avl, box(256), box(277), nullptr); - avl = gpr_avl_add(avl, box(754), box(278), nullptr); - avl = remove_int(avl, 215); - avl = gpr_avl_add(avl, box(679), box(280), nullptr); - avl = gpr_avl_add(avl, box(606), box(281), nullptr); - avl = remove_int(avl, 941); - avl = remove_int(avl, 31); - avl = gpr_avl_add(avl, box(758), box(284), nullptr); - avl = remove_int(avl, 101); - avl = gpr_avl_add(avl, box(244), box(286), nullptr); - avl = gpr_avl_add(avl, box(337), box(287), nullptr); - avl = gpr_avl_add(avl, box(461), box(288), nullptr); - avl = remove_int(avl, 476); - avl = gpr_avl_add(avl, box(845), box(290), nullptr); - avl = remove_int(avl, 160); - avl = gpr_avl_add(avl, box(690), box(292), nullptr); - avl = remove_int(avl, 931); - avl = gpr_avl_add(avl, box(869), box(294), nullptr); - avl = gpr_avl_add(avl, box(1019), box(295), nullptr); - avl = remove_int(avl, 591); - avl = remove_int(avl, 635); - avl = remove_int(avl, 67); - avl = gpr_avl_add(avl, box(113), box(299), nullptr); - avl = remove_int(avl, 305); - avl = gpr_avl_add(avl, box(10), box(301), nullptr); - avl = remove_int(avl, 823); - avl = remove_int(avl, 288); - avl = remove_int(avl, 239); - avl = gpr_avl_add(avl, box(646), box(305), nullptr); - avl = gpr_avl_add(avl, box(1006), box(306), nullptr); - avl = gpr_avl_add(avl, box(954), box(307), nullptr); - avl = gpr_avl_add(avl, box(199), box(308), nullptr); - avl = gpr_avl_add(avl, box(69), box(309), nullptr); - avl = gpr_avl_add(avl, box(984), box(310), nullptr); - avl = remove_int(avl, 568); - avl = remove_int(avl, 666); - avl = remove_int(avl, 37); - avl = gpr_avl_add(avl, box(845), box(314), nullptr); - avl = remove_int(avl, 535); - avl = remove_int(avl, 365); - avl = remove_int(avl, 676); - avl = remove_int(avl, 892); - avl = remove_int(avl, 425); - avl = remove_int(avl, 704); - avl = remove_int(avl, 168); - avl = gpr_avl_add(avl, box(853), box(322), nullptr); - avl = gpr_avl_add(avl, box(335), box(323), nullptr); - avl = gpr_avl_add(avl, box(961), box(324), nullptr); - avl = gpr_avl_add(avl, box(73), box(325), nullptr); - avl = remove_int(avl, 469); - avl = gpr_avl_add(avl, box(449), box(327), nullptr); - avl = remove_int(avl, 821); - avl = gpr_avl_add(avl, box(845), box(329), nullptr); - avl = remove_int(avl, 637); - avl = gpr_avl_add(avl, box(769), box(331), nullptr); - avl = gpr_avl_add(avl, box(901), box(332), nullptr); - avl = remove_int(avl, 142); - avl = remove_int(avl, 361); - avl = remove_int(avl, 876); - avl = gpr_avl_add(avl, box(614), box(336), nullptr); - avl = gpr_avl_add(avl, box(729), box(337), nullptr); - avl = remove_int(avl, 120); - avl = remove_int(avl, 473); - avl = remove_int(avl, 445); - avl = gpr_avl_add(avl, box(978), box(341), nullptr); - avl = gpr_avl_add(avl, box(164), box(342), nullptr); - avl = gpr_avl_add(avl, box(1), box(343), nullptr); - avl = remove_int(avl, 890); - avl = gpr_avl_add(avl, box(605), box(345), nullptr); - avl = gpr_avl_add(avl, box(178), box(346), nullptr); - avl = gpr_avl_add(avl, box(481), box(347), nullptr); - avl = gpr_avl_add(avl, box(772), box(348), nullptr); - avl = remove_int(avl, 824); - avl = remove_int(avl, 167); - avl = remove_int(avl, 151); - avl = gpr_avl_add(avl, box(698), box(352), nullptr); - avl = gpr_avl_add(avl, box(202), box(353), nullptr); - avl = gpr_avl_add(avl, box(921), box(354), nullptr); - avl = gpr_avl_add(avl, box(875), box(355), nullptr); - avl = remove_int(avl, 197); - avl = remove_int(avl, 232); - avl = gpr_avl_add(avl, box(209), box(358), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(113), box(365), nullptr); - avl = remove_int(avl, 767); - avl = gpr_avl_add(avl, box(586), box(367), nullptr); - avl = gpr_avl_add(avl, box(121), box(368), nullptr); - avl = remove_int(avl, 235); - avl = remove_int(avl, 439); - avl = remove_int(avl, 360); - avl = gpr_avl_add(avl, box(916), box(372), nullptr); - avl = remove_int(avl, 999); - avl = gpr_avl_add(avl, box(825), box(374), nullptr); - avl = gpr_avl_add(avl, box(177), box(375), nullptr); - avl = remove_int(avl, 204); - avl = remove_int(avl, 92); - avl = gpr_avl_add(avl, box(794), box(378), nullptr); - avl = gpr_avl_add(avl, box(463), box(379), nullptr); - avl = gpr_avl_add(avl, box(472), box(380), nullptr); - avl = remove_int(avl, 235); - avl = gpr_avl_add(avl, box(840), box(382), nullptr); - avl = remove_int(avl, 657); - avl = gpr_avl_add(avl, box(586), box(384), nullptr); - avl = gpr_avl_add(avl, box(979), box(385), nullptr); - avl = remove_int(avl, 979); - avl = gpr_avl_add(avl, box(639), box(387), nullptr); - avl = remove_int(avl, 907); - avl = remove_int(avl, 973); - avl = gpr_avl_add(avl, box(913), box(390), nullptr); - avl = gpr_avl_add(avl, box(566), box(391), nullptr); - avl = gpr_avl_add(avl, box(883), box(392), nullptr); - avl = gpr_avl_add(avl, box(552), box(393), nullptr); - avl = gpr_avl_add(avl, box(16), box(394), nullptr); - avl = remove_int(avl, 60); - avl = gpr_avl_add(avl, box(567), box(396), nullptr); - avl = gpr_avl_add(avl, box(705), box(397), nullptr); - avl = gpr_avl_add(avl, box(94), box(398), nullptr); - avl = remove_int(avl, 321); - avl = gpr_avl_add(avl, box(207), box(400), nullptr); - avl = gpr_avl_add(avl, box(682), box(401), nullptr); - avl = gpr_avl_add(avl, box(592), box(402), nullptr); - avl = gpr_avl_add(avl, box(10), box(403), nullptr); - avl = remove_int(avl, 911); - avl = remove_int(avl, 161); - avl = gpr_avl_add(avl, box(86), box(406), nullptr); - avl = remove_int(avl, 893); - avl = remove_int(avl, 362); - avl = gpr_avl_add(avl, box(599), box(409), nullptr); - avl = remove_int(avl, 413); - avl = gpr_avl_add(avl, box(867), box(411), nullptr); - avl = remove_int(avl, 955); - avl = gpr_avl_add(avl, box(341), box(413), nullptr); - avl = gpr_avl_add(avl, box(887), box(414), nullptr); - avl = remove_int(avl, 706); - avl = gpr_avl_add(avl, box(939), box(416), nullptr); - 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), nullptr); - avl = remove_int(avl, 848); - avl = gpr_avl_add(avl, box(235), box(423), nullptr); - avl = remove_int(avl, 617); - avl = gpr_avl_add(avl, box(565), box(425), nullptr); - avl = remove_int(avl, 469); - avl = gpr_avl_add(avl, box(988), box(427), nullptr); - avl = remove_int(avl, 957); - avl = gpr_avl_add(avl, box(426), box(429), nullptr); - avl = remove_int(avl, 967); - avl = gpr_avl_add(avl, box(890), box(431), nullptr); - avl = gpr_avl_add(avl, box(473), box(432), nullptr); - 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), nullptr); - avl = remove_int(avl, 882); - avl = remove_int(avl, 782); - avl = gpr_avl_add(avl, box(408), box(442), nullptr); - avl = gpr_avl_add(avl, box(728), box(443), nullptr); - avl = remove_int(avl, 27); - avl = gpr_avl_add(avl, box(137), box(445), nullptr); - avl = gpr_avl_add(avl, box(239), box(446), nullptr); - avl = remove_int(avl, 854); - avl = gpr_avl_add(avl, box(104), box(448), nullptr); - avl = gpr_avl_add(avl, box(823), box(449), nullptr); - avl = gpr_avl_add(avl, box(524), box(450), nullptr); - avl = gpr_avl_add(avl, box(995), box(451), nullptr); - avl = remove_int(avl, 422); - avl = remove_int(avl, 220); - avl = gpr_avl_add(avl, box(856), box(454), nullptr); - avl = remove_int(avl, 332); - avl = gpr_avl_add(avl, box(679), box(456), nullptr); - avl = remove_int(avl, 18); - avl = gpr_avl_add(avl, box(837), box(458), nullptr); - avl = remove_int(avl, 405); - avl = remove_int(avl, 877); - avl = remove_int(avl, 835); - avl = gpr_avl_add(avl, box(547), box(462), nullptr); - avl = remove_int(avl, 805); - avl = remove_int(avl, 862); - avl = gpr_avl_add(avl, box(75), box(465), nullptr); - avl = remove_int(avl, 41); - avl = gpr_avl_add(avl, box(310), box(467), nullptr); - avl = remove_int(avl, 855); - avl = gpr_avl_add(avl, box(20), box(469), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(96), box(475), nullptr); - avl = remove_int(avl, 854); - avl = gpr_avl_add(avl, box(65), box(477), nullptr); - avl = gpr_avl_add(avl, box(573), box(478), nullptr); - avl = gpr_avl_add(avl, box(4), box(479), nullptr); - avl = gpr_avl_add(avl, box(451), box(480), nullptr); - avl = gpr_avl_add(avl, box(774), box(481), nullptr); - avl = gpr_avl_add(avl, box(126), box(482), nullptr); - avl = remove_int(avl, 956); - avl = remove_int(avl, 591); - avl = remove_int(avl, 644); - avl = gpr_avl_add(avl, box(304), box(486), nullptr); - avl = remove_int(avl, 620); - avl = remove_int(avl, 394); - avl = gpr_avl_add(avl, box(1002), box(489), nullptr); - avl = gpr_avl_add(avl, box(837), box(490), nullptr); - avl = remove_int(avl, 485); - avl = gpr_avl_add(avl, box(1005), box(492), nullptr); - avl = remove_int(avl, 21); - avl = gpr_avl_add(avl, box(396), box(494), nullptr); - avl = remove_int(avl, 966); - avl = gpr_avl_add(avl, box(105), box(496), nullptr); - avl = gpr_avl_add(avl, box(316), box(497), nullptr); - avl = remove_int(avl, 776); - avl = gpr_avl_add(avl, box(188), box(499), nullptr); - avl = remove_int(avl, 200); - avl = gpr_avl_add(avl, box(98), box(501), nullptr); - avl = gpr_avl_add(avl, box(831), box(502), nullptr); - avl = gpr_avl_add(avl, box(227), box(503), nullptr); - avl = gpr_avl_add(avl, box(220), box(504), nullptr); - avl = remove_int(avl, 715); - avl = remove_int(avl, 279); - avl = gpr_avl_add(avl, box(701), box(507), nullptr); - avl = gpr_avl_add(avl, box(726), box(508), nullptr); - avl = gpr_avl_add(avl, box(815), box(509), nullptr); - avl = gpr_avl_add(avl, box(749), box(510), nullptr); - 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), nullptr); - avl = remove_int(avl, 59); - avl = gpr_avl_add(avl, box(168), box(517), nullptr); - avl = remove_int(avl, 337); - avl = gpr_avl_add(avl, box(69), box(519), nullptr); - avl = remove_int(avl, 600); - avl = gpr_avl_add(avl, box(591), box(521), nullptr); - avl = gpr_avl_add(avl, box(960), box(522), nullptr); - avl = gpr_avl_add(avl, box(116), box(523), nullptr); - avl = remove_int(avl, 991); - avl = gpr_avl_add(avl, box(760), box(525), nullptr); - avl = gpr_avl_add(avl, box(664), box(526), nullptr); - avl = gpr_avl_add(avl, box(547), box(527), nullptr); - avl = remove_int(avl, 922); - avl = gpr_avl_add(avl, box(290), box(529), nullptr); - avl = gpr_avl_add(avl, box(859), box(530), nullptr); - avl = gpr_avl_add(avl, box(49), box(531), nullptr); - avl = remove_int(avl, 455); - avl = remove_int(avl, 786); - avl = gpr_avl_add(avl, box(613), box(534), nullptr); - avl = gpr_avl_add(avl, box(326), box(535), nullptr); - avl = remove_int(avl, 615); - avl = gpr_avl_add(avl, box(45), box(537), nullptr); - avl = gpr_avl_add(avl, box(162), box(538), nullptr); - avl = gpr_avl_add(avl, box(189), box(539), nullptr); - avl = remove_int(avl, 68); - avl = remove_int(avl, 846); - avl = gpr_avl_add(avl, box(608), box(542), nullptr); - avl = remove_int(avl, 821); - avl = gpr_avl_add(avl, box(978), box(544), nullptr); - avl = gpr_avl_add(avl, box(892), box(545), nullptr); - avl = remove_int(avl, 924); - avl = gpr_avl_add(avl, box(708), box(547), nullptr); - avl = remove_int(avl, 135); - avl = remove_int(avl, 124); - avl = gpr_avl_add(avl, box(301), box(550), nullptr); - avl = gpr_avl_add(avl, box(939), box(551), nullptr); - avl = gpr_avl_add(avl, box(344), box(552), nullptr); - avl = remove_int(avl, 443); - avl = remove_int(avl, 122); - avl = gpr_avl_add(avl, box(636), box(555), nullptr); - avl = remove_int(avl, 558); - avl = gpr_avl_add(avl, box(923), box(557), nullptr); - avl = remove_int(avl, 827); - avl = gpr_avl_add(avl, box(649), box(559), nullptr); - avl = gpr_avl_add(avl, box(808), box(560), nullptr); - avl = remove_int(avl, 570); - avl = remove_int(avl, 434); - avl = gpr_avl_add(avl, box(40), box(563), nullptr); - avl = gpr_avl_add(avl, box(725), box(564), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(512), box(572), nullptr); - 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), nullptr); - avl = remove_int(avl, 770); - avl = remove_int(avl, 776); - avl = gpr_avl_add(avl, box(602), box(581), nullptr); - avl = remove_int(avl, 251); - avl = gpr_avl_add(avl, box(303), box(583), nullptr); - avl = remove_int(avl, 837); - avl = gpr_avl_add(avl, box(714), box(585), nullptr); - avl = remove_int(avl, 800); - avl = gpr_avl_add(avl, box(266), box(587), nullptr); - avl = gpr_avl_add(avl, box(555), box(588), nullptr); - avl = remove_int(avl, 604); - avl = remove_int(avl, 163); - avl = remove_int(avl, 497); - avl = gpr_avl_add(avl, box(296), box(592), nullptr); - avl = remove_int(avl, 129); - avl = gpr_avl_add(avl, box(656), box(594), nullptr); - avl = remove_int(avl, 769); - avl = remove_int(avl, 941); - avl = gpr_avl_add(avl, box(775), box(597), nullptr); - avl = gpr_avl_add(avl, box(846), box(598), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(575), box(604), nullptr); - avl = gpr_avl_add(avl, box(620), box(605), nullptr); - avl = remove_int(avl, 100); - avl = remove_int(avl, 667); - avl = gpr_avl_add(avl, box(138), box(608), nullptr); - avl = gpr_avl_add(avl, box(566), box(609), nullptr); - avl = gpr_avl_add(avl, box(673), box(610), nullptr); - avl = gpr_avl_add(avl, box(178), box(611), nullptr); - avl = remove_int(avl, 659); - avl = gpr_avl_add(avl, box(759), box(613), nullptr); - avl = gpr_avl_add(avl, box(1008), box(614), nullptr); - avl = remove_int(avl, 116); - avl = gpr_avl_add(avl, box(608), box(616), nullptr); - avl = gpr_avl_add(avl, box(339), box(617), nullptr); - avl = gpr_avl_add(avl, box(197), box(618), nullptr); - avl = remove_int(avl, 25); - avl = remove_int(avl, 628); - avl = gpr_avl_add(avl, box(487), box(621), nullptr); - avl = remove_int(avl, 739); - avl = remove_int(avl, 100); - avl = remove_int(avl, 928); - avl = gpr_avl_add(avl, box(647), box(625), nullptr); - avl = remove_int(avl, 978); - avl = remove_int(avl, 143); - avl = remove_int(avl, 755); - avl = gpr_avl_add(avl, box(71), box(629), nullptr); - avl = remove_int(avl, 205); - avl = gpr_avl_add(avl, box(501), box(631), nullptr); - 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), nullptr); - avl = remove_int(avl, 264); - avl = gpr_avl_add(avl, box(69), box(639), nullptr); - avl = remove_int(avl, 73); - avl = gpr_avl_add(avl, box(745), box(641), nullptr); - avl = remove_int(avl, 518); - avl = remove_int(avl, 641); - avl = remove_int(avl, 768); - avl = gpr_avl_add(avl, box(988), box(645), nullptr); - avl = gpr_avl_add(avl, box(899), box(646), nullptr); - avl = remove_int(avl, 763); - avl = remove_int(avl, 281); - avl = remove_int(avl, 496); - avl = gpr_avl_add(avl, box(445), box(650), nullptr); - avl = remove_int(avl, 905); - avl = gpr_avl_add(avl, box(275), box(652), nullptr); - avl = gpr_avl_add(avl, box(137), box(653), nullptr); - avl = remove_int(avl, 642); - avl = gpr_avl_add(avl, box(708), box(655), nullptr); - avl = remove_int(avl, 922); - avl = gpr_avl_add(avl, box(743), box(657), nullptr); - avl = remove_int(avl, 295); - avl = remove_int(avl, 665); - avl = remove_int(avl, 48); - avl = gpr_avl_add(avl, box(1012), box(661), nullptr); - avl = remove_int(avl, 71); - avl = remove_int(avl, 523); - avl = gpr_avl_add(avl, box(319), box(664), nullptr); - avl = remove_int(avl, 632); - avl = gpr_avl_add(avl, box(137), box(666), nullptr); - avl = gpr_avl_add(avl, box(686), box(667), nullptr); - avl = gpr_avl_add(avl, box(724), box(668), nullptr); - avl = gpr_avl_add(avl, box(952), box(669), nullptr); - avl = gpr_avl_add(avl, box(5), box(670), nullptr); - avl = remove_int(avl, 35); - avl = gpr_avl_add(avl, box(43), box(672), nullptr); - avl = gpr_avl_add(avl, box(320), box(673), nullptr); - avl = gpr_avl_add(avl, box(115), box(674), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(605), box(680), nullptr); - avl = gpr_avl_add(avl, box(152), box(681), nullptr); - avl = gpr_avl_add(avl, box(113), box(682), nullptr); - avl = remove_int(avl, 131); - avl = remove_int(avl, 637); - avl = gpr_avl_add(avl, box(156), box(685), nullptr); - avl = remove_int(avl, 696); - avl = gpr_avl_add(avl, box(546), box(687), nullptr); - avl = remove_int(avl, 970); - avl = remove_int(avl, 53); - avl = remove_int(avl, 827); - avl = remove_int(avl, 224); - avl = remove_int(avl, 796); - avl = remove_int(avl, 34); - avl = remove_int(avl, 922); - avl = remove_int(avl, 277); - avl = remove_int(avl, 650); - avl = remove_int(avl, 222); - avl = remove_int(avl, 244); - avl = remove_int(avl, 576); - avl = remove_int(avl, 413); - avl = gpr_avl_add(avl, box(500), box(701), nullptr); - avl = remove_int(avl, 924); - avl = gpr_avl_add(avl, box(825), box(703), nullptr); - avl = remove_int(avl, 888); - avl = remove_int(avl, 931); - avl = gpr_avl_add(avl, box(285), box(706), nullptr); - avl = remove_int(avl, 62); - avl = remove_int(avl, 444); - avl = remove_int(avl, 946); - avl = gpr_avl_add(avl, box(122), box(710), nullptr); - avl = gpr_avl_add(avl, box(846), box(711), nullptr); - avl = remove_int(avl, 628); - avl = gpr_avl_add(avl, box(511), box(713), nullptr); - avl = gpr_avl_add(avl, box(398), box(714), nullptr); - avl = remove_int(avl, 730); - avl = gpr_avl_add(avl, box(797), box(716), nullptr); - avl = remove_int(avl, 897); - avl = remove_int(avl, 228); - avl = remove_int(avl, 544); - avl = remove_int(avl, 552); - avl = remove_int(avl, 783); - avl = remove_int(avl, 583); - avl = remove_int(avl, 894); - avl = remove_int(avl, 942); - avl = gpr_avl_add(avl, box(346), box(725), nullptr); - avl = gpr_avl_add(avl, box(1015), box(726), nullptr); - avl = remove_int(avl, 813); - avl = gpr_avl_add(avl, box(213), box(728), nullptr); - avl = remove_int(avl, 468); - avl = remove_int(avl, 365); - avl = remove_int(avl, 399); - avl = gpr_avl_add(avl, box(380), box(732), nullptr); - avl = remove_int(avl, 835); - avl = remove_int(avl, 970); - avl = gpr_avl_add(avl, box(700), box(735), nullptr); - avl = gpr_avl_add(avl, box(807), box(736), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(332), box(744), nullptr); - avl = remove_int(avl, 686); - avl = remove_int(avl, 206); - avl = remove_int(avl, 835); - avl = gpr_avl_add(avl, box(334), box(748), nullptr); - avl = remove_int(avl, 171); - avl = gpr_avl_add(avl, box(1002), box(750), nullptr); - avl = gpr_avl_add(avl, box(779), box(751), nullptr); - avl = gpr_avl_add(avl, box(307), box(752), nullptr); - avl = gpr_avl_add(avl, box(127), box(753), nullptr); - avl = gpr_avl_add(avl, box(251), box(754), nullptr); - 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), nullptr); - avl = remove_int(avl, 43); - avl = gpr_avl_add(avl, box(871), box(762), nullptr); - avl = gpr_avl_add(avl, box(580), box(763), nullptr); - avl = remove_int(avl, 501); - avl = remove_int(avl, 462); - avl = remove_int(avl, 599); - avl = gpr_avl_add(avl, box(240), box(767), nullptr); - avl = gpr_avl_add(avl, box(285), box(768), nullptr); - avl = gpr_avl_add(avl, box(472), box(769), nullptr); - avl = remove_int(avl, 865); - avl = remove_int(avl, 763); - avl = remove_int(avl, 245); - avl = remove_int(avl, 80); - avl = remove_int(avl, 713); - avl = remove_int(avl, 654); - avl = remove_int(avl, 1014); - avl = gpr_avl_add(avl, box(495), box(777), nullptr); - avl = gpr_avl_add(avl, box(552), box(778), nullptr); - avl = remove_int(avl, 19); - avl = remove_int(avl, 803); - avl = gpr_avl_add(avl, box(508), box(781), nullptr); - 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), nullptr); - 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), nullptr); - 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), nullptr); - avl = remove_int(avl, 38); - avl = remove_int(avl, 595); - avl = gpr_avl_add(avl, box(213), box(799), nullptr); - avl = remove_int(avl, 7); - avl = remove_int(avl, 620); - avl = gpr_avl_add(avl, box(946), box(802), nullptr); - avl = remove_int(avl, 145); - avl = gpr_avl_add(avl, box(628), box(804), nullptr); - avl = remove_int(avl, 972); - avl = gpr_avl_add(avl, box(728), box(806), nullptr); - avl = remove_int(avl, 91); - avl = gpr_avl_add(avl, box(136), box(808), nullptr); - avl = gpr_avl_add(avl, box(841), box(809), nullptr); - avl = gpr_avl_add(avl, box(265), box(810), nullptr); - avl = gpr_avl_add(avl, box(701), box(811), nullptr); - avl = gpr_avl_add(avl, box(27), box(812), nullptr); - avl = remove_int(avl, 72); - avl = remove_int(avl, 14); - avl = gpr_avl_add(avl, box(286), box(815), nullptr); - avl = remove_int(avl, 996); - avl = remove_int(avl, 998); - avl = gpr_avl_add(avl, box(466), box(818), nullptr); - avl = remove_int(avl, 1009); - avl = remove_int(avl, 741); - avl = remove_int(avl, 947); - avl = remove_int(avl, 241); - avl = remove_int(avl, 954); - avl = remove_int(avl, 183); - avl = remove_int(avl, 395); - avl = remove_int(avl, 951); - avl = gpr_avl_add(avl, box(267), box(827), nullptr); - avl = remove_int(avl, 812); - avl = gpr_avl_add(avl, box(577), box(829), nullptr); - avl = remove_int(avl, 624); - avl = remove_int(avl, 847); - avl = remove_int(avl, 745); - avl = gpr_avl_add(avl, box(491), box(833), nullptr); - avl = gpr_avl_add(avl, box(941), box(834), nullptr); - avl = remove_int(avl, 258); - avl = gpr_avl_add(avl, box(410), box(836), nullptr); - avl = gpr_avl_add(avl, box(80), box(837), nullptr); - avl = gpr_avl_add(avl, box(196), box(838), nullptr); - avl = gpr_avl_add(avl, box(5), box(839), nullptr); - avl = remove_int(avl, 782); - avl = gpr_avl_add(avl, box(827), box(841), nullptr); - avl = remove_int(avl, 472); - avl = remove_int(avl, 664); - avl = gpr_avl_add(avl, box(409), box(844), nullptr); - avl = gpr_avl_add(avl, box(62), box(845), nullptr); - 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), nullptr); - avl = remove_int(avl, 587); - avl = remove_int(avl, 350); - avl = gpr_avl_add(avl, box(980), box(855), nullptr); - avl = gpr_avl_add(avl, box(992), box(856), nullptr); - avl = gpr_avl_add(avl, box(818), box(857), nullptr); - avl = remove_int(avl, 853); - avl = remove_int(avl, 701); - avl = gpr_avl_add(avl, box(675), box(860), nullptr); - avl = remove_int(avl, 248); - avl = remove_int(avl, 649); - avl = gpr_avl_add(avl, box(508), box(863), nullptr); - avl = remove_int(avl, 927); - avl = gpr_avl_add(avl, box(957), box(865), nullptr); - avl = gpr_avl_add(avl, box(698), box(866), nullptr); - avl = gpr_avl_add(avl, box(388), box(867), nullptr); - avl = gpr_avl_add(avl, box(532), box(868), nullptr); - avl = gpr_avl_add(avl, box(681), box(869), nullptr); - avl = remove_int(avl, 544); - avl = remove_int(avl, 991); - avl = remove_int(avl, 397); - avl = gpr_avl_add(avl, box(954), box(873), nullptr); - avl = gpr_avl_add(avl, box(219), box(874), nullptr); - avl = gpr_avl_add(avl, box(465), box(875), nullptr); - avl = remove_int(avl, 371); - avl = gpr_avl_add(avl, box(601), box(877), nullptr); - avl = gpr_avl_add(avl, box(543), box(878), nullptr); - avl = remove_int(avl, 329); - avl = gpr_avl_add(avl, box(560), box(880), nullptr); - avl = remove_int(avl, 898); - avl = gpr_avl_add(avl, box(455), box(882), nullptr); - avl = remove_int(avl, 313); - avl = gpr_avl_add(avl, box(215), box(884), nullptr); - avl = remove_int(avl, 846); - avl = gpr_avl_add(avl, box(608), box(886), nullptr); - avl = remove_int(avl, 248); - avl = gpr_avl_add(avl, box(575), box(888), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(329), box(894), nullptr); - avl = gpr_avl_add(avl, box(326), box(895), nullptr); - avl = remove_int(avl, 746); - avl = remove_int(avl, 99); - avl = gpr_avl_add(avl, box(464), box(898), nullptr); - avl = gpr_avl_add(avl, box(141), box(899), nullptr); - avl = remove_int(avl, 383); - avl = gpr_avl_add(avl, box(414), box(901), nullptr); - avl = gpr_avl_add(avl, box(777), box(902), nullptr); - avl = remove_int(avl, 972); - avl = remove_int(avl, 841); - avl = remove_int(avl, 100); - avl = gpr_avl_add(avl, box(828), box(906), nullptr); - avl = remove_int(avl, 785); - avl = gpr_avl_add(avl, box(1008), box(908), nullptr); - avl = gpr_avl_add(avl, box(46), box(909), nullptr); - avl = remove_int(avl, 399); - avl = gpr_avl_add(avl, box(178), box(911), nullptr); - avl = gpr_avl_add(avl, box(573), box(912), nullptr); - avl = remove_int(avl, 299); - avl = gpr_avl_add(avl, box(690), box(914), nullptr); - avl = gpr_avl_add(avl, box(692), box(915), nullptr); - 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), nullptr); - avl = remove_int(avl, 328); - avl = gpr_avl_add(avl, box(89), box(923), nullptr); - avl = remove_int(avl, 867); - avl = remove_int(avl, 626); - avl = remove_int(avl, 507); - avl = gpr_avl_add(avl, box(365), box(927), nullptr); - avl = gpr_avl_add(avl, box(58), box(928), nullptr); - avl = gpr_avl_add(avl, box(70), box(929), nullptr); - avl = remove_int(avl, 81); - avl = remove_int(avl, 797); - avl = gpr_avl_add(avl, box(846), box(932), nullptr); - avl = remove_int(avl, 642); - avl = gpr_avl_add(avl, box(777), box(934), nullptr); - avl = remove_int(avl, 107); - avl = gpr_avl_add(avl, box(691), box(936), nullptr); - avl = gpr_avl_add(avl, box(820), box(937), nullptr); - avl = gpr_avl_add(avl, box(202), box(938), nullptr); - avl = gpr_avl_add(avl, box(308), box(939), nullptr); - avl = gpr_avl_add(avl, box(20), box(940), nullptr); - avl = remove_int(avl, 289); - avl = gpr_avl_add(avl, box(714), box(942), nullptr); - avl = gpr_avl_add(avl, box(584), box(943), nullptr); - avl = remove_int(avl, 294); - avl = gpr_avl_add(avl, box(496), box(945), nullptr); - avl = gpr_avl_add(avl, box(394), box(946), nullptr); - avl = gpr_avl_add(avl, box(860), box(947), nullptr); - avl = gpr_avl_add(avl, box(58), box(948), nullptr); - avl = remove_int(avl, 784); - avl = remove_int(avl, 584); - avl = remove_int(avl, 708); - avl = gpr_avl_add(avl, box(142), box(952), nullptr); - avl = gpr_avl_add(avl, box(247), box(953), nullptr); - avl = gpr_avl_add(avl, box(389), box(954), nullptr); - avl = remove_int(avl, 390); - avl = gpr_avl_add(avl, box(465), box(956), nullptr); - avl = gpr_avl_add(avl, box(936), box(957), nullptr); - avl = gpr_avl_add(avl, box(309), box(958), nullptr); - avl = remove_int(avl, 928); - avl = remove_int(avl, 128); - avl = remove_int(avl, 979); - avl = remove_int(avl, 670); - avl = remove_int(avl, 738); - avl = remove_int(avl, 271); - avl = remove_int(avl, 540); - avl = gpr_avl_add(avl, box(365), box(966), nullptr); - avl = remove_int(avl, 82); - avl = gpr_avl_add(avl, box(728), box(968), nullptr); - avl = remove_int(avl, 852); - avl = gpr_avl_add(avl, box(884), box(970), nullptr); - avl = gpr_avl_add(avl, box(502), box(971), nullptr); - avl = remove_int(avl, 898); - avl = remove_int(avl, 481); - avl = gpr_avl_add(avl, box(911), box(974), nullptr); - avl = remove_int(avl, 787); - avl = remove_int(avl, 785); - avl = remove_int(avl, 537); - avl = remove_int(avl, 535); - avl = remove_int(avl, 136); - avl = remove_int(avl, 749); - avl = remove_int(avl, 637); - avl = remove_int(avl, 900); - avl = gpr_avl_add(avl, box(598), box(983), nullptr); - avl = remove_int(avl, 25); - avl = remove_int(avl, 697); - avl = gpr_avl_add(avl, box(645), box(986), nullptr); - avl = gpr_avl_add(avl, box(211), box(987), nullptr); - avl = gpr_avl_add(avl, box(589), box(988), nullptr); - avl = remove_int(avl, 702); - avl = gpr_avl_add(avl, box(53), box(990), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(834), box(998), nullptr); - avl = gpr_avl_add(avl, box(514), box(999), nullptr); - avl = gpr_avl_add(avl, box(75), box(1000), nullptr); - avl = remove_int(avl, 745); - avl = gpr_avl_add(avl, box(362), box(1002), nullptr); - avl = remove_int(avl, 215); - avl = gpr_avl_add(avl, box(624), box(1004), nullptr); - avl = remove_int(avl, 404); - avl = remove_int(avl, 359); - avl = remove_int(avl, 491); - avl = gpr_avl_add(avl, box(903), box(1008), nullptr); - avl = gpr_avl_add(avl, box(240), box(1009), nullptr); - avl = remove_int(avl, 95); - avl = gpr_avl_add(avl, box(119), box(1011), nullptr); - avl = gpr_avl_add(avl, box(857), box(1012), nullptr); - avl = remove_int(avl, 39); - avl = remove_int(avl, 866); - avl = gpr_avl_add(avl, box(503), box(1015), nullptr); - avl = gpr_avl_add(avl, box(740), box(1016), nullptr); - 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), nullptr); - avl = remove_int(avl, 638); - avl = gpr_avl_add(avl, box(299), box(1025), nullptr); - avl = gpr_avl_add(avl, box(584), box(1026), nullptr); - avl = remove_int(avl, 863); - avl = gpr_avl_add(avl, box(612), box(1028), nullptr); - avl = gpr_avl_add(avl, box(62), box(1029), nullptr); - avl = gpr_avl_add(avl, box(432), box(1030), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(644), box(1036), nullptr); - avl = remove_int(avl, 638); - avl = gpr_avl_add(avl, box(13), box(1038), nullptr); - avl = remove_int(avl, 66); - avl = remove_int(avl, 82); - avl = gpr_avl_add(avl, box(362), box(1041), nullptr); - avl = gpr_avl_add(avl, box(783), box(1042), nullptr); - avl = remove_int(avl, 60); - avl = gpr_avl_add(avl, box(80), box(1044), nullptr); - avl = gpr_avl_add(avl, box(825), box(1045), nullptr); - avl = gpr_avl_add(avl, box(688), box(1046), nullptr); - avl = gpr_avl_add(avl, box(662), box(1047), nullptr); - avl = remove_int(avl, 156); - avl = remove_int(avl, 376); - avl = remove_int(avl, 99); - avl = gpr_avl_add(avl, box(526), box(1051), nullptr); - avl = gpr_avl_add(avl, box(168), box(1052), nullptr); - avl = remove_int(avl, 646); - avl = remove_int(avl, 380); - avl = remove_int(avl, 833); - avl = gpr_avl_add(avl, box(53), box(1056), nullptr); - avl = remove_int(avl, 105); - avl = gpr_avl_add(avl, box(373), box(1058), nullptr); - avl = gpr_avl_add(avl, box(184), box(1059), nullptr); - avl = remove_int(avl, 288); - avl = gpr_avl_add(avl, box(966), box(1061), nullptr); - avl = remove_int(avl, 158); - avl = gpr_avl_add(avl, box(406), box(1063), nullptr); - avl = remove_int(avl, 470); - avl = gpr_avl_add(avl, box(283), box(1065), nullptr); - avl = gpr_avl_add(avl, box(838), box(1066), nullptr); - avl = gpr_avl_add(avl, box(288), box(1067), nullptr); - avl = gpr_avl_add(avl, box(950), box(1068), nullptr); - avl = gpr_avl_add(avl, box(163), box(1069), nullptr); - avl = remove_int(avl, 623); - avl = remove_int(avl, 769); - avl = gpr_avl_add(avl, box(144), box(1072), nullptr); - avl = gpr_avl_add(avl, box(489), box(1073), nullptr); - avl = remove_int(avl, 15); - avl = gpr_avl_add(avl, box(971), box(1075), nullptr); - avl = remove_int(avl, 660); - avl = gpr_avl_add(avl, box(255), box(1077), nullptr); - avl = remove_int(avl, 494); - avl = gpr_avl_add(avl, box(109), box(1079), nullptr); - avl = gpr_avl_add(avl, box(420), box(1080), nullptr); - avl = gpr_avl_add(avl, box(509), box(1081), nullptr); - avl = remove_int(avl, 178); - avl = gpr_avl_add(avl, box(216), box(1083), nullptr); - avl = gpr_avl_add(avl, box(707), box(1084), nullptr); - avl = gpr_avl_add(avl, box(411), box(1085), nullptr); - avl = gpr_avl_add(avl, box(352), box(1086), nullptr); - avl = remove_int(avl, 983); - avl = gpr_avl_add(avl, box(6), box(1088), nullptr); - avl = gpr_avl_add(avl, box(1014), box(1089), nullptr); - avl = remove_int(avl, 98); - avl = remove_int(avl, 325); - avl = gpr_avl_add(avl, box(851), box(1092), nullptr); - avl = remove_int(avl, 553); - avl = gpr_avl_add(avl, box(218), box(1094), nullptr); - avl = gpr_avl_add(avl, box(261), box(1095), nullptr); - avl = remove_int(avl, 31); - avl = gpr_avl_add(avl, box(872), box(1097), nullptr); - avl = remove_int(avl, 543); - avl = remove_int(avl, 314); - avl = remove_int(avl, 443); - avl = gpr_avl_add(avl, box(533), box(1101), nullptr); - avl = remove_int(avl, 881); - avl = remove_int(avl, 269); - avl = remove_int(avl, 940); - avl = remove_int(avl, 909); - avl = remove_int(avl, 197); - avl = remove_int(avl, 773); - avl = remove_int(avl, 790); - avl = remove_int(avl, 345); - avl = gpr_avl_add(avl, box(965), box(1110), nullptr); - avl = remove_int(avl, 622); - avl = gpr_avl_add(avl, box(352), box(1112), nullptr); - avl = remove_int(avl, 182); - avl = gpr_avl_add(avl, box(534), box(1114), nullptr); - avl = gpr_avl_add(avl, box(97), box(1115), nullptr); - avl = gpr_avl_add(avl, box(198), box(1116), nullptr); - avl = remove_int(avl, 750); - avl = gpr_avl_add(avl, box(98), box(1118), nullptr); - avl = remove_int(avl, 943); - avl = gpr_avl_add(avl, box(254), box(1120), nullptr); - avl = gpr_avl_add(avl, box(30), box(1121), nullptr); - avl = remove_int(avl, 14); - avl = remove_int(avl, 475); - avl = remove_int(avl, 82); - avl = gpr_avl_add(avl, box(789), box(1125), nullptr); - avl = gpr_avl_add(avl, box(402), box(1126), nullptr); - avl = remove_int(avl, 1019); - avl = gpr_avl_add(avl, box(858), box(1128), nullptr); - avl = gpr_avl_add(avl, box(625), box(1129), nullptr); - avl = remove_int(avl, 675); - avl = remove_int(avl, 323); - avl = gpr_avl_add(avl, box(329), box(1132), nullptr); - avl = remove_int(avl, 929); - avl = remove_int(avl, 44); - avl = gpr_avl_add(avl, box(443), box(1135), nullptr); - avl = gpr_avl_add(avl, box(653), box(1136), nullptr); - avl = gpr_avl_add(avl, box(750), box(1137), nullptr); - avl = gpr_avl_add(avl, box(252), box(1138), nullptr); - avl = gpr_avl_add(avl, box(449), box(1139), nullptr); - 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), nullptr); - avl = remove_int(avl, 806); - avl = gpr_avl_add(avl, box(455), box(1146), nullptr); - avl = remove_int(avl, 31); - avl = gpr_avl_add(avl, box(154), box(1148), nullptr); - avl = gpr_avl_add(avl, box(189), box(1149), nullptr); - avl = remove_int(avl, 786); - avl = gpr_avl_add(avl, box(496), box(1151), nullptr); - avl = gpr_avl_add(avl, box(81), box(1152), nullptr); - avl = gpr_avl_add(avl, box(59), box(1153), nullptr); - avl = remove_int(avl, 424); - avl = remove_int(avl, 668); - avl = gpr_avl_add(avl, box(723), box(1156), nullptr); - avl = gpr_avl_add(avl, box(822), box(1157), nullptr); - avl = gpr_avl_add(avl, box(354), box(1158), nullptr); - avl = remove_int(avl, 738); - avl = gpr_avl_add(avl, box(686), box(1160), nullptr); - avl = gpr_avl_add(avl, box(43), box(1161), nullptr); - avl = gpr_avl_add(avl, box(625), box(1162), nullptr); - avl = gpr_avl_add(avl, box(902), box(1163), nullptr); - avl = gpr_avl_add(avl, box(12), box(1164), nullptr); - avl = gpr_avl_add(avl, box(977), box(1165), nullptr); - avl = gpr_avl_add(avl, box(699), box(1166), nullptr); - avl = gpr_avl_add(avl, box(189), box(1167), nullptr); - 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), nullptr); - avl = remove_int(avl, 758); - avl = remove_int(avl, 222); - avl = gpr_avl_add(avl, box(975), box(1175), nullptr); - avl = remove_int(avl, 993); - avl = gpr_avl_add(avl, box(2), box(1177), nullptr); - avl = gpr_avl_add(avl, box(70), box(1178), nullptr); - avl = remove_int(avl, 350); - avl = remove_int(avl, 972); - avl = remove_int(avl, 880); - avl = gpr_avl_add(avl, box(753), box(1182), nullptr); - avl = remove_int(avl, 404); - avl = gpr_avl_add(avl, box(294), box(1184), nullptr); - avl = remove_int(avl, 474); - avl = gpr_avl_add(avl, box(228), box(1186), nullptr); - avl = gpr_avl_add(avl, box(484), box(1187), nullptr); - avl = remove_int(avl, 238); - avl = remove_int(avl, 53); - avl = remove_int(avl, 691); - avl = gpr_avl_add(avl, box(345), box(1191), nullptr); - avl = remove_int(avl, 0); - avl = gpr_avl_add(avl, box(230), box(1193), nullptr); - avl = remove_int(avl, 227); - avl = remove_int(avl, 152); - avl = gpr_avl_add(avl, box(884), box(1196), nullptr); - avl = remove_int(avl, 823); - avl = remove_int(avl, 53); - avl = gpr_avl_add(avl, box(1015), box(1199), nullptr); - avl = gpr_avl_add(avl, box(697), box(1200), nullptr); - avl = gpr_avl_add(avl, box(376), box(1201), nullptr); - avl = remove_int(avl, 411); - avl = gpr_avl_add(avl, box(888), box(1203), nullptr); - avl = remove_int(avl, 55); - avl = gpr_avl_add(avl, box(85), box(1205), nullptr); - avl = remove_int(avl, 947); - avl = remove_int(avl, 382); - avl = remove_int(avl, 777); - avl = gpr_avl_add(avl, box(1017), box(1209), nullptr); - avl = gpr_avl_add(avl, box(169), box(1210), nullptr); - avl = gpr_avl_add(avl, box(156), box(1211), nullptr); - avl = remove_int(avl, 153); - avl = remove_int(avl, 642); - avl = remove_int(avl, 158); - avl = gpr_avl_add(avl, box(554), box(1215), nullptr); - avl = gpr_avl_add(avl, box(76), box(1216), nullptr); - avl = gpr_avl_add(avl, box(756), box(1217), nullptr); - avl = remove_int(avl, 767); - avl = remove_int(avl, 112); - avl = remove_int(avl, 539); - avl = remove_int(avl, 544); - avl = remove_int(avl, 628); - avl = remove_int(avl, 385); - avl = remove_int(avl, 514); - avl = remove_int(avl, 362); - avl = gpr_avl_add(avl, box(523), box(1226), nullptr); - avl = gpr_avl_add(avl, box(712), box(1227), nullptr); - avl = gpr_avl_add(avl, box(474), box(1228), nullptr); - avl = gpr_avl_add(avl, box(882), box(1229), nullptr); - avl = gpr_avl_add(avl, box(965), box(1230), nullptr); - avl = remove_int(avl, 464); - avl = gpr_avl_add(avl, box(319), box(1232), nullptr); - avl = gpr_avl_add(avl, box(504), box(1233), nullptr); - avl = remove_int(avl, 818); - avl = gpr_avl_add(avl, box(884), box(1235), nullptr); - avl = gpr_avl_add(avl, box(813), box(1236), nullptr); - avl = gpr_avl_add(avl, box(795), box(1237), nullptr); - avl = remove_int(avl, 306); - avl = gpr_avl_add(avl, box(799), box(1239), nullptr); - avl = remove_int(avl, 534); - avl = gpr_avl_add(avl, box(480), box(1241), nullptr); - avl = gpr_avl_add(avl, box(656), box(1242), nullptr); - avl = gpr_avl_add(avl, box(709), box(1243), nullptr); - avl = gpr_avl_add(avl, box(500), box(1244), nullptr); - avl = remove_int(avl, 740); - avl = gpr_avl_add(avl, box(980), box(1246), nullptr); - avl = gpr_avl_add(avl, box(458), box(1247), nullptr); - avl = remove_int(avl, 377); - avl = remove_int(avl, 338); - avl = gpr_avl_add(avl, box(554), box(1250), nullptr); - avl = gpr_avl_add(avl, box(504), box(1251), nullptr); - avl = gpr_avl_add(avl, box(603), box(1252), nullptr); - avl = gpr_avl_add(avl, box(761), box(1253), nullptr); - avl = remove_int(avl, 431); - avl = gpr_avl_add(avl, box(707), box(1255), nullptr); - avl = gpr_avl_add(avl, box(673), box(1256), nullptr); - avl = remove_int(avl, 998); - avl = remove_int(avl, 332); - avl = remove_int(avl, 413); - avl = remove_int(avl, 227); - avl = remove_int(avl, 249); - avl = remove_int(avl, 309); - avl = remove_int(avl, 459); - avl = gpr_avl_add(avl, box(645), box(1264), nullptr); - avl = remove_int(avl, 858); - avl = remove_int(avl, 997); - avl = gpr_avl_add(avl, box(519), box(1267), nullptr); - avl = remove_int(avl, 614); - avl = remove_int(avl, 462); - avl = remove_int(avl, 792); - avl = gpr_avl_add(avl, box(987), box(1271), nullptr); - avl = gpr_avl_add(avl, box(309), box(1272), nullptr); - avl = remove_int(avl, 747); - avl = gpr_avl_add(avl, box(621), box(1274), nullptr); - avl = gpr_avl_add(avl, box(450), box(1275), nullptr); - avl = remove_int(avl, 265); - avl = remove_int(avl, 8); - avl = remove_int(avl, 383); - avl = gpr_avl_add(avl, box(238), box(1279), nullptr); - avl = remove_int(avl, 241); - avl = gpr_avl_add(avl, box(180), box(1281), nullptr); - avl = gpr_avl_add(avl, box(411), box(1282), nullptr); - avl = gpr_avl_add(avl, box(791), box(1283), nullptr); - avl = gpr_avl_add(avl, box(955), box(1284), nullptr); - avl = remove_int(avl, 24); - avl = remove_int(avl, 375); - avl = gpr_avl_add(avl, box(140), box(1287), nullptr); - avl = remove_int(avl, 949); - avl = gpr_avl_add(avl, box(301), box(1289), nullptr); - avl = gpr_avl_add(avl, box(0), box(1290), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(127), box(1296), nullptr); - avl = gpr_avl_add(avl, box(279), box(1297), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(304), box(1304), nullptr); - avl = gpr_avl_add(avl, box(1), box(1305), nullptr); - avl = gpr_avl_add(avl, box(339), box(1306), nullptr); - 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), nullptr); - avl = remove_int(avl, 85); - avl = gpr_avl_add(avl, box(964), box(1314), nullptr); - avl = gpr_avl_add(avl, box(559), box(1315), nullptr); - avl = remove_int(avl, 167); - avl = gpr_avl_add(avl, box(866), box(1317), nullptr); - avl = remove_int(avl, 275); - avl = gpr_avl_add(avl, box(173), box(1319), nullptr); - avl = gpr_avl_add(avl, box(765), box(1320), nullptr); - avl = remove_int(avl, 883); - avl = gpr_avl_add(avl, box(547), box(1322), nullptr); - avl = gpr_avl_add(avl, box(847), box(1323), nullptr); - avl = remove_int(avl, 817); - avl = remove_int(avl, 850); - avl = remove_int(avl, 718); - avl = gpr_avl_add(avl, box(806), box(1327), nullptr); - avl = gpr_avl_add(avl, box(360), box(1328), nullptr); - avl = remove_int(avl, 991); - avl = gpr_avl_add(avl, box(493), box(1330), nullptr); - avl = remove_int(avl, 516); - avl = gpr_avl_add(avl, box(361), box(1332), nullptr); - avl = remove_int(avl, 355); - avl = gpr_avl_add(avl, box(512), box(1334), nullptr); - avl = gpr_avl_add(avl, box(191), box(1335), nullptr); - avl = remove_int(avl, 703); - avl = gpr_avl_add(avl, box(333), box(1337), nullptr); - avl = remove_int(avl, 481); - avl = gpr_avl_add(avl, box(501), box(1339), nullptr); - avl = remove_int(avl, 532); - avl = remove_int(avl, 510); - avl = gpr_avl_add(avl, box(793), box(1342), nullptr); - avl = gpr_avl_add(avl, box(234), box(1343), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(702), box(1349), nullptr); - avl = gpr_avl_add(avl, box(149), box(1350), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(455), box(1358), nullptr); - avl = remove_int(avl, 782); - avl = remove_int(avl, 682); - avl = gpr_avl_add(avl, box(243), box(1361), nullptr); - avl = gpr_avl_add(avl, box(109), box(1362), nullptr); - avl = gpr_avl_add(avl, box(452), box(1363), nullptr); - avl = remove_int(avl, 151); - avl = gpr_avl_add(avl, box(159), box(1365), nullptr); - avl = remove_int(avl, 1023); - avl = gpr_avl_add(avl, box(129), box(1367), nullptr); - avl = gpr_avl_add(avl, box(537), box(1368), nullptr); - avl = remove_int(avl, 321); - avl = gpr_avl_add(avl, box(740), box(1370), nullptr); - avl = remove_int(avl, 45); - avl = remove_int(avl, 136); - avl = gpr_avl_add(avl, box(229), box(1373), nullptr); - avl = remove_int(avl, 772); - avl = gpr_avl_add(avl, box(181), box(1375), nullptr); - avl = remove_int(avl, 175); - avl = gpr_avl_add(avl, box(817), box(1377), nullptr); - avl = remove_int(avl, 956); - avl = gpr_avl_add(avl, box(675), box(1379), nullptr); - avl = gpr_avl_add(avl, box(375), box(1380), nullptr); - avl = remove_int(avl, 384); - avl = gpr_avl_add(avl, box(1016), box(1382), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(293), box(1389), nullptr); - avl = remove_int(avl, 207); - avl = remove_int(avl, 46); - avl = gpr_avl_add(avl, box(899), box(1392), nullptr); - avl = gpr_avl_add(avl, box(666), box(1393), nullptr); - avl = gpr_avl_add(avl, box(85), box(1394), nullptr); - avl = gpr_avl_add(avl, box(914), box(1395), nullptr); - avl = gpr_avl_add(avl, box(128), box(1396), nullptr); - avl = gpr_avl_add(avl, box(835), box(1397), nullptr); - avl = gpr_avl_add(avl, box(787), box(1398), nullptr); - avl = gpr_avl_add(avl, box(649), box(1399), nullptr); - avl = gpr_avl_add(avl, box(723), box(1400), nullptr); - avl = remove_int(avl, 874); - avl = gpr_avl_add(avl, box(778), box(1402), nullptr); - avl = gpr_avl_add(avl, box(1015), box(1403), nullptr); - avl = gpr_avl_add(avl, box(59), box(1404), nullptr); - avl = gpr_avl_add(avl, box(259), box(1405), nullptr); - avl = gpr_avl_add(avl, box(758), box(1406), nullptr); - avl = remove_int(avl, 648); - avl = gpr_avl_add(avl, box(145), box(1408), nullptr); - avl = gpr_avl_add(avl, box(440), box(1409), nullptr); - avl = remove_int(avl, 608); - avl = remove_int(avl, 690); - avl = gpr_avl_add(avl, box(605), box(1412), nullptr); - avl = remove_int(avl, 856); - avl = remove_int(avl, 608); - avl = gpr_avl_add(avl, box(829), box(1415), nullptr); - avl = gpr_avl_add(avl, box(660), box(1416), nullptr); - avl = remove_int(avl, 596); - avl = gpr_avl_add(avl, box(519), box(1418), nullptr); - avl = gpr_avl_add(avl, box(35), box(1419), nullptr); - avl = gpr_avl_add(avl, box(871), box(1420), nullptr); - avl = remove_int(avl, 845); - avl = gpr_avl_add(avl, box(600), box(1422), nullptr); - avl = gpr_avl_add(avl, box(215), box(1423), nullptr); - avl = remove_int(avl, 761); - avl = gpr_avl_add(avl, box(975), box(1425), nullptr); - avl = remove_int(avl, 987); - avl = gpr_avl_add(avl, box(58), box(1427), nullptr); - avl = remove_int(avl, 119); - avl = gpr_avl_add(avl, box(937), box(1429), nullptr); - avl = gpr_avl_add(avl, box(372), box(1430), nullptr); - avl = gpr_avl_add(avl, box(11), box(1431), nullptr); - avl = gpr_avl_add(avl, box(398), box(1432), nullptr); - avl = gpr_avl_add(avl, box(423), box(1433), nullptr); - avl = remove_int(avl, 171); - avl = gpr_avl_add(avl, box(473), box(1435), nullptr); - 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), nullptr); - 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), nullptr); - avl = remove_int(avl, 152); - avl = gpr_avl_add(avl, box(61), box(1448), nullptr); - avl = remove_int(avl, 929); - avl = remove_int(avl, 9); - avl = gpr_avl_add(avl, box(251), box(1451), nullptr); - avl = gpr_avl_add(avl, box(672), box(1452), nullptr); - avl = gpr_avl_add(avl, box(66), box(1453), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(495), box(1459), nullptr); - avl = remove_int(avl, 450); - avl = gpr_avl_add(avl, box(533), box(1461), nullptr); - avl = gpr_avl_add(avl, box(414), box(1462), nullptr); - avl = remove_int(avl, 74); - avl = remove_int(avl, 236); - avl = gpr_avl_add(avl, box(707), box(1465), nullptr); - avl = gpr_avl_add(avl, box(357), box(1466), nullptr); - avl = gpr_avl_add(avl, box(1007), box(1467), nullptr); - avl = gpr_avl_add(avl, box(811), box(1468), nullptr); - avl = gpr_avl_add(avl, box(418), box(1469), nullptr); - avl = gpr_avl_add(avl, box(164), box(1470), nullptr); - avl = gpr_avl_add(avl, box(622), box(1471), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(202), box(1478), nullptr); - avl = gpr_avl_add(avl, box(312), box(1479), nullptr); - avl = remove_int(avl, 274); - avl = gpr_avl_add(avl, box(684), box(1481), nullptr); - avl = gpr_avl_add(avl, box(954), box(1482), nullptr); - avl = gpr_avl_add(avl, box(637), box(1483), nullptr); - avl = remove_int(avl, 716); - avl = gpr_avl_add(avl, box(198), box(1485), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(862), box(1491), nullptr); - avl = remove_int(avl, 527); - avl = gpr_avl_add(avl, box(945), box(1493), nullptr); - avl = remove_int(avl, 355); - avl = remove_int(avl, 144); - avl = gpr_avl_add(avl, box(229), box(1496), nullptr); - avl = gpr_avl_add(avl, box(237), box(1497), nullptr); - avl = remove_int(avl, 471); - avl = remove_int(avl, 901); - avl = gpr_avl_add(avl, box(905), box(1500), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(552), box(1506), nullptr); - avl = gpr_avl_add(avl, box(30), box(1507), nullptr); - avl = gpr_avl_add(avl, box(445), box(1508), nullptr); - avl = remove_int(avl, 785); - avl = remove_int(avl, 185); - avl = gpr_avl_add(avl, box(405), box(1511), nullptr); - avl = gpr_avl_add(avl, box(733), box(1512), nullptr); - avl = gpr_avl_add(avl, box(573), box(1513), nullptr); - avl = gpr_avl_add(avl, box(492), box(1514), nullptr); - avl = gpr_avl_add(avl, box(343), box(1515), nullptr); - avl = gpr_avl_add(avl, box(527), box(1516), nullptr); - avl = gpr_avl_add(avl, box(596), box(1517), nullptr); - avl = gpr_avl_add(avl, box(519), box(1518), nullptr); - avl = remove_int(avl, 243); - avl = remove_int(avl, 722); - avl = gpr_avl_add(avl, box(772), box(1521), nullptr); - avl = remove_int(avl, 152); - avl = remove_int(avl, 305); - avl = gpr_avl_add(avl, box(754), box(1524), nullptr); - avl = gpr_avl_add(avl, box(373), box(1525), nullptr); - avl = remove_int(avl, 995); - avl = gpr_avl_add(avl, box(329), box(1527), nullptr); - avl = remove_int(avl, 397); - avl = gpr_avl_add(avl, box(884), box(1529), nullptr); - avl = remove_int(avl, 329); - avl = remove_int(avl, 240); - avl = gpr_avl_add(avl, box(566), box(1532), nullptr); - avl = gpr_avl_add(avl, box(232), box(1533), nullptr); - avl = remove_int(avl, 993); - avl = gpr_avl_add(avl, box(888), box(1535), nullptr); - avl = remove_int(avl, 242); - avl = gpr_avl_add(avl, box(941), box(1537), nullptr); - avl = remove_int(avl, 415); - avl = gpr_avl_add(avl, box(992), box(1539), nullptr); - avl = remove_int(avl, 289); - avl = gpr_avl_add(avl, box(60), box(1541), nullptr); - avl = gpr_avl_add(avl, box(97), box(1542), nullptr); - avl = remove_int(avl, 965); - avl = remove_int(avl, 267); - avl = remove_int(avl, 360); - avl = gpr_avl_add(avl, box(5), box(1546), nullptr); - avl = remove_int(avl, 429); - avl = gpr_avl_add(avl, box(412), box(1548), nullptr); - avl = remove_int(avl, 632); - avl = remove_int(avl, 113); - avl = gpr_avl_add(avl, box(48), box(1551), nullptr); - avl = gpr_avl_add(avl, box(108), box(1552), nullptr); - avl = gpr_avl_add(avl, box(750), box(1553), nullptr); - avl = remove_int(avl, 188); - avl = gpr_avl_add(avl, box(668), box(1555), nullptr); - avl = remove_int(avl, 37); - avl = remove_int(avl, 737); - avl = gpr_avl_add(avl, box(93), box(1558), nullptr); - avl = gpr_avl_add(avl, box(628), box(1559), nullptr); - avl = gpr_avl_add(avl, box(480), box(1560), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(469), box(1567), nullptr); - avl = remove_int(avl, 349); - avl = gpr_avl_add(avl, box(768), box(1569), nullptr); - avl = gpr_avl_add(avl, box(915), box(1570), nullptr); - avl = remove_int(avl, 1014); - avl = gpr_avl_add(avl, box(117), box(1572), nullptr); - avl = remove_int(avl, 62); - avl = gpr_avl_add(avl, box(382), box(1574), nullptr); - avl = remove_int(avl, 571); - avl = gpr_avl_add(avl, box(655), box(1576), nullptr); - avl = gpr_avl_add(avl, box(323), box(1577), nullptr); - avl = remove_int(avl, 869); - avl = remove_int(avl, 151); - avl = gpr_avl_add(avl, box(1019), box(1580), nullptr); - avl = gpr_avl_add(avl, box(984), box(1581), nullptr); - avl = gpr_avl_add(avl, box(870), box(1582), nullptr); - avl = gpr_avl_add(avl, box(376), box(1583), nullptr); - avl = remove_int(avl, 625); - avl = gpr_avl_add(avl, box(733), box(1585), nullptr); - avl = remove_int(avl, 532); - avl = remove_int(avl, 444); - avl = gpr_avl_add(avl, box(428), box(1588), nullptr); - avl = gpr_avl_add(avl, box(860), box(1589), nullptr); - avl = gpr_avl_add(avl, box(173), box(1590), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(639), box(1596), nullptr); - avl = remove_int(avl, 431); - avl = gpr_avl_add(avl, box(993), box(1598), nullptr); - avl = remove_int(avl, 681); - avl = remove_int(avl, 927); - avl = gpr_avl_add(avl, box(87), box(1601), nullptr); - avl = gpr_avl_add(avl, box(91), box(1602), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(951), box(1609), nullptr); - avl = gpr_avl_add(avl, box(146), box(1610), nullptr); - avl = gpr_avl_add(avl, box(482), box(1611), nullptr); - avl = gpr_avl_add(avl, box(71), box(1612), nullptr); - avl = remove_int(avl, 246); - avl = remove_int(avl, 696); - avl = gpr_avl_add(avl, box(636), box(1615), nullptr); - avl = gpr_avl_add(avl, box(295), box(1616), nullptr); - avl = remove_int(avl, 11); - avl = remove_int(avl, 231); - avl = gpr_avl_add(avl, box(905), box(1619), nullptr); - avl = gpr_avl_add(avl, box(993), box(1620), nullptr); - avl = gpr_avl_add(avl, box(433), box(1621), nullptr); - avl = gpr_avl_add(avl, box(117), box(1622), nullptr); - avl = gpr_avl_add(avl, box(467), box(1623), nullptr); - avl = remove_int(avl, 419); - avl = gpr_avl_add(avl, box(179), box(1625), nullptr); - avl = remove_int(avl, 926); - avl = remove_int(avl, 326); - avl = gpr_avl_add(avl, box(551), box(1628), nullptr); - avl = remove_int(avl, 14); - avl = remove_int(avl, 476); - avl = remove_int(avl, 823); - avl = gpr_avl_add(avl, box(350), box(1632), nullptr); - avl = gpr_avl_add(avl, box(133), box(1633), nullptr); - avl = remove_int(avl, 906); - avl = gpr_avl_add(avl, box(827), box(1635), nullptr); - avl = gpr_avl_add(avl, box(201), box(1636), nullptr); - avl = remove_int(avl, 124); - avl = remove_int(avl, 662); - avl = gpr_avl_add(avl, box(314), box(1639), nullptr); - avl = gpr_avl_add(avl, box(986), box(1640), nullptr); - avl = gpr_avl_add(avl, box(622), box(1641), nullptr); - avl = remove_int(avl, 130); - avl = gpr_avl_add(avl, box(861), box(1643), nullptr); - avl = remove_int(avl, 497); - avl = remove_int(avl, 905); - avl = gpr_avl_add(avl, box(502), box(1646), nullptr); - avl = remove_int(avl, 721); - avl = gpr_avl_add(avl, box(514), box(1648), nullptr); - avl = gpr_avl_add(avl, box(410), box(1649), nullptr); - avl = remove_int(avl, 869); - avl = remove_int(avl, 247); - avl = gpr_avl_add(avl, box(450), box(1652), nullptr); - avl = remove_int(avl, 364); - avl = gpr_avl_add(avl, box(963), box(1654), nullptr); - avl = gpr_avl_add(avl, box(146), box(1655), nullptr); - avl = remove_int(avl, 147); - avl = remove_int(avl, 789); - avl = gpr_avl_add(avl, box(693), box(1658), nullptr); - avl = gpr_avl_add(avl, box(959), box(1659), nullptr); - avl = remove_int(avl, 478); - avl = gpr_avl_add(avl, box(116), box(1661), nullptr); - avl = gpr_avl_add(avl, box(520), box(1662), nullptr); - avl = gpr_avl_add(avl, box(809), box(1663), nullptr); - avl = gpr_avl_add(avl, box(667), box(1664), nullptr); - avl = gpr_avl_add(avl, box(406), box(1665), nullptr); - avl = remove_int(avl, 409); - avl = gpr_avl_add(avl, box(558), box(1667), nullptr); - avl = gpr_avl_add(avl, box(0), box(1668), nullptr); - avl = gpr_avl_add(avl, box(948), box(1669), nullptr); - avl = gpr_avl_add(avl, box(576), box(1670), nullptr); - avl = remove_int(avl, 864); - avl = remove_int(avl, 840); - avl = remove_int(avl, 1001); - avl = gpr_avl_add(avl, box(232), box(1674), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(648), box(1680), nullptr); - avl = gpr_avl_add(avl, box(761), box(1681), nullptr); - avl = remove_int(avl, 293); - avl = remove_int(avl, 893); - avl = gpr_avl_add(avl, box(194), box(1684), nullptr); - avl = remove_int(avl, 233); - avl = gpr_avl_add(avl, box(888), box(1686), nullptr); - 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), nullptr); - avl = remove_int(avl, 634); - avl = remove_int(avl, 335); - avl = gpr_avl_add(avl, box(718), box(1694), nullptr); - avl = gpr_avl_add(avl, box(463), box(1695), nullptr); - avl = gpr_avl_add(avl, box(233), box(1696), nullptr); - 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), nullptr); - avl = remove_int(avl, 329); - avl = gpr_avl_add(avl, box(716), box(1705), nullptr); - avl = remove_int(avl, 639); - avl = remove_int(avl, 775); - avl = remove_int(avl, 578); - avl = remove_int(avl, 464); - avl = remove_int(avl, 679); - avl = remove_int(avl, 615); - avl = remove_int(avl, 104); - avl = gpr_avl_add(avl, box(414), box(1713), nullptr); - avl = gpr_avl_add(avl, box(212), box(1714), nullptr); - avl = gpr_avl_add(avl, box(266), box(1715), nullptr); - avl = gpr_avl_add(avl, box(238), box(1716), nullptr); - avl = remove_int(avl, 153); - avl = gpr_avl_add(avl, box(585), box(1718), nullptr); - avl = remove_int(avl, 121); - avl = gpr_avl_add(avl, box(534), box(1720), nullptr); - avl = remove_int(avl, 579); - avl = gpr_avl_add(avl, box(127), box(1722), nullptr); - avl = gpr_avl_add(avl, box(399), box(1723), nullptr); - avl = remove_int(avl, 417); - avl = gpr_avl_add(avl, box(978), box(1725), nullptr); - avl = gpr_avl_add(avl, box(768), box(1726), nullptr); - avl = remove_int(avl, 985); - avl = gpr_avl_add(avl, box(536), box(1728), nullptr); - avl = gpr_avl_add(avl, box(449), box(1729), nullptr); - avl = gpr_avl_add(avl, box(586), box(1730), nullptr); - avl = remove_int(avl, 998); - avl = remove_int(avl, 394); - avl = remove_int(avl, 141); - avl = gpr_avl_add(avl, box(889), box(1734), nullptr); - avl = gpr_avl_add(avl, box(871), box(1735), nullptr); - avl = gpr_avl_add(avl, box(76), box(1736), nullptr); - avl = gpr_avl_add(avl, box(549), box(1737), nullptr); - avl = gpr_avl_add(avl, box(757), box(1738), nullptr); - avl = remove_int(avl, 908); - avl = gpr_avl_add(avl, box(789), box(1740), nullptr); - avl = remove_int(avl, 224); - avl = gpr_avl_add(avl, box(407), box(1742), nullptr); - avl = gpr_avl_add(avl, box(381), box(1743), nullptr); - avl = gpr_avl_add(avl, box(561), box(1744), nullptr); - avl = gpr_avl_add(avl, box(667), box(1745), nullptr); - avl = gpr_avl_add(avl, box(522), box(1746), nullptr); - avl = gpr_avl_add(avl, box(948), box(1747), nullptr); - avl = remove_int(avl, 770); - avl = gpr_avl_add(avl, box(872), box(1749), nullptr); - avl = gpr_avl_add(avl, box(327), box(1750), nullptr); - avl = remove_int(avl, 10); - avl = gpr_avl_add(avl, box(122), box(1752), nullptr); - avl = remove_int(avl, 606); - avl = gpr_avl_add(avl, box(485), box(1754), nullptr); - avl = remove_int(avl, 6); - avl = gpr_avl_add(avl, box(329), box(1756), nullptr); - avl = gpr_avl_add(avl, box(783), box(1757), nullptr); - avl = remove_int(avl, 416); - avl = gpr_avl_add(avl, box(656), box(1759), nullptr); - avl = gpr_avl_add(avl, box(971), box(1760), nullptr); - avl = gpr_avl_add(avl, box(77), box(1761), nullptr); - avl = gpr_avl_add(avl, box(942), box(1762), nullptr); - avl = remove_int(avl, 361); - avl = gpr_avl_add(avl, box(66), box(1764), nullptr); - avl = gpr_avl_add(avl, box(299), box(1765), nullptr); - avl = gpr_avl_add(avl, box(929), box(1766), nullptr); - avl = gpr_avl_add(avl, box(797), box(1767), nullptr); - avl = remove_int(avl, 869); - avl = remove_int(avl, 907); - avl = gpr_avl_add(avl, box(870), box(1770), nullptr); - avl = remove_int(avl, 580); - avl = remove_int(avl, 120); - avl = gpr_avl_add(avl, box(913), box(1773), nullptr); - avl = remove_int(avl, 480); - avl = gpr_avl_add(avl, box(489), box(1775), nullptr); - avl = remove_int(avl, 845); - avl = gpr_avl_add(avl, box(896), box(1777), nullptr); - avl = remove_int(avl, 567); - avl = remove_int(avl, 427); - avl = gpr_avl_add(avl, box(443), box(1780), nullptr); - avl = gpr_avl_add(avl, box(3), box(1781), nullptr); - avl = remove_int(avl, 12); - avl = gpr_avl_add(avl, box(376), box(1783), nullptr); - avl = gpr_avl_add(avl, box(155), box(1784), nullptr); - avl = gpr_avl_add(avl, box(188), box(1785), nullptr); - avl = gpr_avl_add(avl, box(149), box(1786), nullptr); - avl = gpr_avl_add(avl, box(178), box(1787), nullptr); - avl = remove_int(avl, 84); - avl = gpr_avl_add(avl, box(805), box(1789), nullptr); - avl = gpr_avl_add(avl, box(612), box(1790), nullptr); - avl = remove_int(avl, 991); - avl = gpr_avl_add(avl, box(837), box(1792), nullptr); - avl = remove_int(avl, 173); - avl = remove_int(avl, 72); - avl = gpr_avl_add(avl, box(1014), box(1795), nullptr); - avl = remove_int(avl, 303); - avl = gpr_avl_add(avl, box(865), box(1797), nullptr); - avl = gpr_avl_add(avl, box(793), box(1798), nullptr); - avl = remove_int(avl, 173); - avl = remove_int(avl, 477); - avl = gpr_avl_add(avl, box(950), box(1801), nullptr); - avl = gpr_avl_add(avl, box(105), box(1802), nullptr); - avl = gpr_avl_add(avl, box(895), box(1803), nullptr); - avl = gpr_avl_add(avl, box(171), box(1804), nullptr); - avl = gpr_avl_add(avl, box(753), box(1805), nullptr); - avl = gpr_avl_add(avl, box(946), box(1806), nullptr); - avl = remove_int(avl, 194); - avl = remove_int(avl, 559); - avl = remove_int(avl, 116); - avl = gpr_avl_add(avl, box(968), box(1810), nullptr); - avl = remove_int(avl, 124); - avl = remove_int(avl, 99); - avl = gpr_avl_add(avl, box(563), box(1813), nullptr); - avl = remove_int(avl, 182); - avl = gpr_avl_add(avl, box(816), box(1815), nullptr); - avl = remove_int(avl, 73); - avl = remove_int(avl, 261); - avl = gpr_avl_add(avl, box(847), box(1818), nullptr); - avl = gpr_avl_add(avl, box(368), box(1819), nullptr); - avl = gpr_avl_add(avl, box(808), box(1820), nullptr); - avl = gpr_avl_add(avl, box(779), box(1821), nullptr); - avl = remove_int(avl, 818); - avl = gpr_avl_add(avl, box(466), box(1823), nullptr); - avl = remove_int(avl, 316); - avl = gpr_avl_add(avl, box(986), box(1825), nullptr); - avl = gpr_avl_add(avl, box(688), box(1826), nullptr); - avl = gpr_avl_add(avl, box(509), box(1827), nullptr); - avl = gpr_avl_add(avl, box(51), box(1828), nullptr); - avl = remove_int(avl, 655); - avl = remove_int(avl, 785); - avl = remove_int(avl, 893); - avl = gpr_avl_add(avl, box(167), box(1832), nullptr); - avl = remove_int(avl, 13); - avl = remove_int(avl, 263); - avl = gpr_avl_add(avl, box(1009), box(1835), nullptr); - 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), nullptr); - avl = remove_int(avl, 267); - avl = gpr_avl_add(avl, box(676), box(1842), nullptr); - avl = gpr_avl_add(avl, box(231), box(1843), nullptr); - avl = gpr_avl_add(avl, box(824), box(1844), nullptr); - avl = remove_int(avl, 961); - avl = gpr_avl_add(avl, box(311), box(1846), nullptr); - avl = gpr_avl_add(avl, box(420), box(1847), nullptr); - avl = gpr_avl_add(avl, box(960), box(1848), nullptr); - avl = gpr_avl_add(avl, box(468), box(1849), nullptr); - avl = gpr_avl_add(avl, box(815), box(1850), nullptr); - avl = remove_int(avl, 247); - avl = remove_int(avl, 194); - avl = gpr_avl_add(avl, box(546), box(1853), nullptr); - avl = remove_int(avl, 222); - avl = remove_int(avl, 914); - avl = remove_int(avl, 741); - avl = gpr_avl_add(avl, box(470), box(1857), nullptr); - avl = gpr_avl_add(avl, box(933), box(1858), nullptr); - avl = gpr_avl_add(avl, box(97), box(1859), nullptr); - avl = remove_int(avl, 564); - avl = remove_int(avl, 295); - avl = gpr_avl_add(avl, box(864), box(1862), nullptr); - avl = remove_int(avl, 329); - avl = gpr_avl_add(avl, box(124), box(1864), nullptr); - avl = gpr_avl_add(avl, box(1000), box(1865), nullptr); - avl = gpr_avl_add(avl, box(228), box(1866), nullptr); - avl = gpr_avl_add(avl, box(187), box(1867), nullptr); - avl = remove_int(avl, 224); - avl = remove_int(avl, 306); - avl = remove_int(avl, 884); - avl = gpr_avl_add(avl, box(449), box(1871), nullptr); - avl = gpr_avl_add(avl, box(353), box(1872), nullptr); - avl = gpr_avl_add(avl, box(994), box(1873), nullptr); - avl = gpr_avl_add(avl, box(596), box(1874), nullptr); - avl = gpr_avl_add(avl, box(996), box(1875), nullptr); - avl = gpr_avl_add(avl, box(101), box(1876), nullptr); - avl = gpr_avl_add(avl, box(1012), box(1877), nullptr); - avl = gpr_avl_add(avl, box(982), box(1878), nullptr); - avl = gpr_avl_add(avl, box(742), box(1879), nullptr); - avl = remove_int(avl, 92); - avl = remove_int(avl, 1022); - avl = gpr_avl_add(avl, box(941), box(1882), nullptr); - avl = remove_int(avl, 742); - avl = remove_int(avl, 919); - avl = gpr_avl_add(avl, box(588), box(1885), nullptr); - avl = remove_int(avl, 221); - avl = gpr_avl_add(avl, box(356), box(1887), nullptr); - avl = gpr_avl_add(avl, box(932), box(1888), nullptr); - avl = remove_int(avl, 837); - avl = gpr_avl_add(avl, box(394), box(1890), nullptr); - avl = gpr_avl_add(avl, box(642), box(1891), nullptr); - avl = gpr_avl_add(avl, box(52), box(1892), nullptr); - avl = gpr_avl_add(avl, box(437), box(1893), nullptr); - avl = gpr_avl_add(avl, box(948), box(1894), nullptr); - avl = gpr_avl_add(avl, box(93), box(1895), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(952), box(1901), nullptr); - avl = gpr_avl_add(avl, box(510), box(1902), nullptr); - avl = remove_int(avl, 876); - avl = remove_int(avl, 612); - avl = gpr_avl_add(avl, box(923), box(1905), nullptr); - avl = gpr_avl_add(avl, box(475), box(1906), nullptr); - avl = remove_int(avl, 478); - avl = remove_int(avl, 148); - avl = gpr_avl_add(avl, box(538), box(1909), nullptr); - avl = remove_int(avl, 47); - avl = gpr_avl_add(avl, box(89), box(1911), nullptr); - avl = remove_int(avl, 723); - avl = gpr_avl_add(avl, box(687), box(1913), nullptr); - avl = gpr_avl_add(avl, box(480), box(1914), nullptr); - avl = gpr_avl_add(avl, box(149), box(1915), nullptr); - avl = remove_int(avl, 68); - avl = remove_int(avl, 862); - avl = remove_int(avl, 363); - avl = gpr_avl_add(avl, box(996), box(1919), nullptr); - avl = remove_int(avl, 380); - avl = gpr_avl_add(avl, box(957), box(1921), nullptr); - avl = remove_int(avl, 413); - avl = gpr_avl_add(avl, box(360), box(1923), nullptr); - avl = gpr_avl_add(avl, box(304), box(1924), nullptr); - avl = gpr_avl_add(avl, box(634), box(1925), nullptr); - avl = gpr_avl_add(avl, box(506), box(1926), nullptr); - avl = remove_int(avl, 248); - avl = gpr_avl_add(avl, box(124), box(1928), nullptr); - avl = gpr_avl_add(avl, box(181), box(1929), nullptr); - avl = remove_int(avl, 507); - avl = gpr_avl_add(avl, box(141), box(1931), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(906), box(1937), nullptr); - avl = gpr_avl_add(avl, box(44), box(1938), nullptr); - avl = remove_int(avl, 949); - avl = remove_int(avl, 117); - avl = gpr_avl_add(avl, box(700), box(1941), nullptr); - avl = gpr_avl_add(avl, box(258), box(1942), nullptr); - avl = remove_int(avl, 828); - avl = gpr_avl_add(avl, box(860), box(1944), nullptr); - avl = gpr_avl_add(avl, box(987), box(1945), nullptr); - avl = gpr_avl_add(avl, box(316), box(1946), nullptr); - avl = gpr_avl_add(avl, box(919), box(1947), nullptr); - avl = remove_int(avl, 84); - avl = gpr_avl_add(avl, box(473), box(1949), nullptr); - avl = remove_int(avl, 127); - avl = remove_int(avl, 829); - avl = remove_int(avl, 829); - avl = gpr_avl_add(avl, box(488), box(1953), nullptr); - avl = gpr_avl_add(avl, box(954), box(1954), nullptr); - avl = remove_int(avl, 198); - avl = remove_int(avl, 972); - avl = remove_int(avl, 670); - avl = gpr_avl_add(avl, box(822), box(1958), nullptr); - avl = remove_int(avl, 589); - avl = remove_int(avl, 459); - avl = gpr_avl_add(avl, box(1003), box(1961), nullptr); - avl = gpr_avl_add(avl, box(657), box(1962), nullptr); - avl = gpr_avl_add(avl, box(477), box(1963), nullptr); - avl = gpr_avl_add(avl, box(923), box(1964), nullptr); - avl = remove_int(avl, 496); - avl = remove_int(avl, 99); - avl = gpr_avl_add(avl, box(127), box(1967), nullptr); - avl = gpr_avl_add(avl, box(1013), box(1968), nullptr); - avl = gpr_avl_add(avl, box(778), box(1969), nullptr); - 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), nullptr); - 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), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(412), box(1986), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(408), box(1992), nullptr); - avl = gpr_avl_add(avl, box(841), box(1993), nullptr); - avl = remove_int(avl, 593); - avl = gpr_avl_add(avl, box(582), box(1995), nullptr); - avl = gpr_avl_add(avl, box(597), box(1996), nullptr); - avl = remove_int(avl, 49); - avl = remove_int(avl, 835); - avl = gpr_avl_add(avl, box(417), box(1999), nullptr); - avl = gpr_avl_add(avl, box(191), box(2000), nullptr); - avl = remove_int(avl, 406); - avl = gpr_avl_add(avl, box(30), box(2002), nullptr); - avl = remove_int(avl, 841); - avl = remove_int(avl, 50); - avl = gpr_avl_add(avl, box(967), box(2005), nullptr); - avl = gpr_avl_add(avl, box(849), box(2006), nullptr); - avl = remove_int(avl, 608); - avl = gpr_avl_add(avl, box(306), box(2008), nullptr); - avl = remove_int(avl, 779); - avl = gpr_avl_add(avl, box(897), box(2010), nullptr); - avl = gpr_avl_add(avl, box(147), box(2011), nullptr); - avl = remove_int(avl, 982); - avl = gpr_avl_add(avl, box(470), box(2013), nullptr); - avl = remove_int(avl, 951); - avl = gpr_avl_add(avl, box(388), box(2015), nullptr); - 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), nullptr); - avl = remove_int(avl, 671); - avl = gpr_avl_add(avl, box(1020), box(2022), nullptr); - avl = remove_int(avl, 277); - avl = gpr_avl_add(avl, box(681), box(2024), nullptr); - avl = gpr_avl_add(avl, box(179), box(2025), nullptr); - avl = gpr_avl_add(avl, box(370), box(2026), nullptr); - avl = gpr_avl_add(avl, box(0), box(2027), nullptr); - avl = remove_int(avl, 523); - avl = gpr_avl_add(avl, box(99), box(2029), nullptr); - avl = gpr_avl_add(avl, box(334), box(2030), nullptr); - avl = gpr_avl_add(avl, box(569), box(2031), nullptr); - avl = gpr_avl_add(avl, box(257), box(2032), nullptr); - avl = remove_int(avl, 572); - avl = gpr_avl_add(avl, box(805), box(2034), nullptr); - avl = gpr_avl_add(avl, box(143), box(2035), nullptr); - avl = gpr_avl_add(avl, box(670), box(2036), nullptr); - avl = remove_int(avl, 42); - avl = gpr_avl_add(avl, box(46), box(2038), nullptr); - avl = remove_int(avl, 970); - avl = gpr_avl_add(avl, box(353), box(2040), nullptr); - avl = remove_int(avl, 258); - avl = gpr_avl_add(avl, box(451), box(2042), nullptr); - avl = gpr_avl_add(avl, box(28), box(2043), nullptr); - avl = gpr_avl_add(avl, box(729), box(2044), nullptr); - avl = gpr_avl_add(avl, box(401), box(2045), nullptr); - avl = gpr_avl_add(avl, box(614), box(2046), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(980), box(2052), nullptr); - avl = gpr_avl_add(avl, box(990), box(2053), nullptr); - avl = gpr_avl_add(avl, box(355), box(2054), nullptr); - avl = remove_int(avl, 730); - avl = remove_int(avl, 37); - avl = gpr_avl_add(avl, box(407), box(2057), nullptr); - avl = gpr_avl_add(avl, box(222), box(2058), nullptr); - avl = gpr_avl_add(avl, box(439), box(2059), nullptr); - avl = gpr_avl_add(avl, box(563), box(2060), nullptr); - avl = remove_int(avl, 992); - avl = remove_int(avl, 786); - avl = gpr_avl_add(avl, box(1), box(2063), nullptr); - avl = gpr_avl_add(avl, box(473), box(2064), nullptr); - avl = gpr_avl_add(avl, box(992), box(2065), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(35), box(2071), nullptr); - avl = remove_int(avl, 843); - avl = gpr_avl_add(avl, box(855), box(2073), nullptr); - avl = remove_int(avl, 878); - avl = gpr_avl_add(avl, box(993), box(2075), nullptr); - avl = gpr_avl_add(avl, box(87), box(2076), nullptr); - avl = gpr_avl_add(avl, box(572), box(2077), nullptr); - avl = remove_int(avl, 896); - avl = gpr_avl_add(avl, box(849), box(2079), nullptr); - avl = remove_int(avl, 597); - avl = gpr_avl_add(avl, box(472), box(2081), nullptr); - avl = remove_int(avl, 778); - avl = remove_int(avl, 934); - avl = remove_int(avl, 314); - avl = gpr_avl_add(avl, box(101), box(2085), nullptr); - avl = remove_int(avl, 938); - avl = remove_int(avl, 1010); - avl = gpr_avl_add(avl, box(579), box(2088), nullptr); - avl = remove_int(avl, 798); - avl = remove_int(avl, 88); - avl = gpr_avl_add(avl, box(851), box(2091), nullptr); - avl = remove_int(avl, 705); - avl = gpr_avl_add(avl, box(26), box(2093), nullptr); - avl = remove_int(avl, 973); - avl = gpr_avl_add(avl, box(923), box(2095), nullptr); - avl = remove_int(avl, 668); - avl = gpr_avl_add(avl, box(310), box(2097), nullptr); - avl = gpr_avl_add(avl, box(269), box(2098), nullptr); - avl = remove_int(avl, 173); - avl = gpr_avl_add(avl, box(279), box(2100), nullptr); - avl = remove_int(avl, 203); - avl = gpr_avl_add(avl, box(411), box(2102), nullptr); - avl = remove_int(avl, 950); - avl = gpr_avl_add(avl, box(6), box(2104), nullptr); - avl = remove_int(avl, 400); - avl = remove_int(avl, 468); - avl = remove_int(avl, 271); - avl = gpr_avl_add(avl, box(627), box(2108), nullptr); - avl = remove_int(avl, 727); - avl = remove_int(avl, 148); - avl = remove_int(avl, 98); - avl = remove_int(avl, 997); - avl = remove_int(avl, 215); - avl = remove_int(avl, 628); - avl = remove_int(avl, 826); - avl = remove_int(avl, 664); - avl = gpr_avl_add(avl, box(76), box(2117), nullptr); - avl = remove_int(avl, 194); - avl = remove_int(avl, 18); - avl = gpr_avl_add(avl, box(727), box(2120), nullptr); - avl = remove_int(avl, 295); - avl = gpr_avl_add(avl, box(645), box(2122), nullptr); - avl = remove_int(avl, 321); - avl = remove_int(avl, 863); - avl = gpr_avl_add(avl, box(824), box(2125), nullptr); - avl = gpr_avl_add(avl, box(651), box(2126), nullptr); - avl = gpr_avl_add(avl, box(804), box(2127), nullptr); - avl = remove_int(avl, 307); - avl = gpr_avl_add(avl, box(867), box(2129), nullptr); - avl = remove_int(avl, 384); - avl = gpr_avl_add(avl, box(819), box(2131), nullptr); - avl = remove_int(avl, 674); - avl = gpr_avl_add(avl, box(76), box(2133), nullptr); - avl = remove_int(avl, 898); - avl = gpr_avl_add(avl, box(45), box(2135), nullptr); - avl = gpr_avl_add(avl, box(512), box(2136), nullptr); - 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), nullptr); - avl = remove_int(avl, 509); - avl = remove_int(avl, 301); - avl = gpr_avl_add(avl, box(861), box(2146), nullptr); - avl = gpr_avl_add(avl, box(918), box(2147), nullptr); - avl = remove_int(avl, 992); - avl = gpr_avl_add(avl, box(356), box(2149), nullptr); - avl = remove_int(avl, 64); - avl = remove_int(avl, 444); - avl = remove_int(avl, 741); - avl = gpr_avl_add(avl, box(710), box(2153), nullptr); - avl = gpr_avl_add(avl, box(264), box(2154), nullptr); - avl = remove_int(avl, 347); - avl = remove_int(avl, 250); - avl = gpr_avl_add(avl, box(82), box(2157), nullptr); - avl = gpr_avl_add(avl, box(571), box(2158), nullptr); - avl = remove_int(avl, 721); - avl = remove_int(avl, 622); - avl = gpr_avl_add(avl, box(950), box(2161), nullptr); - avl = gpr_avl_add(avl, box(94), box(2162), nullptr); - avl = remove_int(avl, 970); - avl = gpr_avl_add(avl, box(815), box(2164), nullptr); - avl = remove_int(avl, 930); - avl = remove_int(avl, 703); - avl = gpr_avl_add(avl, box(432), box(2167), nullptr); - avl = remove_int(avl, 544); - avl = gpr_avl_add(avl, box(21), box(2169), nullptr); - avl = gpr_avl_add(avl, box(186), box(2170), nullptr); - avl = remove_int(avl, 143); - avl = gpr_avl_add(avl, box(425), box(2172), nullptr); - avl = remove_int(avl, 769); - avl = gpr_avl_add(avl, box(656), box(2174), nullptr); - avl = remove_int(avl, 29); - avl = gpr_avl_add(avl, box(464), box(2176), nullptr); - avl = remove_int(avl, 713); - avl = gpr_avl_add(avl, box(800), box(2178), nullptr); - avl = remove_int(avl, 621); - avl = gpr_avl_add(avl, box(962), box(2180), nullptr); - avl = remove_int(avl, 448); - avl = gpr_avl_add(avl, box(878), box(2182), nullptr); - avl = remove_int(avl, 39); - avl = remove_int(avl, 999); - avl = gpr_avl_add(avl, box(182), box(2185), nullptr); - avl = gpr_avl_add(avl, box(429), box(2186), nullptr); - avl = gpr_avl_add(avl, box(598), box(2187), nullptr); - avl = remove_int(avl, 551); - avl = gpr_avl_add(avl, box(827), box(2189), nullptr); - avl = gpr_avl_add(avl, box(809), box(2190), nullptr); - avl = remove_int(avl, 438); - avl = remove_int(avl, 811); - avl = gpr_avl_add(avl, box(808), box(2193), nullptr); - avl = gpr_avl_add(avl, box(788), box(2194), nullptr); - avl = remove_int(avl, 156); - avl = gpr_avl_add(avl, box(933), box(2196), nullptr); - avl = gpr_avl_add(avl, box(344), box(2197), nullptr); - avl = remove_int(avl, 460); - avl = gpr_avl_add(avl, box(161), box(2199), nullptr); - avl = gpr_avl_add(avl, box(444), box(2200), nullptr); - avl = remove_int(avl, 597); - avl = remove_int(avl, 668); - avl = gpr_avl_add(avl, box(703), box(2203), nullptr); - avl = remove_int(avl, 515); - avl = gpr_avl_add(avl, box(380), box(2205), nullptr); - avl = gpr_avl_add(avl, box(338), box(2206), nullptr); - 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), nullptr); - avl = remove_int(avl, 450); - avl = gpr_avl_add(avl, box(411), box(2213), nullptr); - avl = gpr_avl_add(avl, box(117), box(2214), nullptr); - avl = gpr_avl_add(avl, box(322), box(2215), nullptr); - avl = gpr_avl_add(avl, box(915), box(2216), nullptr); - avl = gpr_avl_add(avl, box(410), box(2217), nullptr); - avl = gpr_avl_add(avl, box(66), box(2218), nullptr); - avl = remove_int(avl, 756); - avl = remove_int(avl, 596); - avl = gpr_avl_add(avl, box(882), box(2221), nullptr); - avl = gpr_avl_add(avl, box(930), box(2222), nullptr); - avl = gpr_avl_add(avl, box(36), box(2223), nullptr); - avl = remove_int(avl, 742); - avl = gpr_avl_add(avl, box(539), box(2225), nullptr); - avl = gpr_avl_add(avl, box(596), box(2226), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(493), box(2233), nullptr); - avl = gpr_avl_add(avl, box(839), box(2234), nullptr); - avl = remove_int(avl, 774); - avl = gpr_avl_add(avl, box(337), box(2236), nullptr); - avl = remove_int(avl, 322); - avl = gpr_avl_add(avl, box(16), box(2238), nullptr); - 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), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(138), box(2249), nullptr); - avl = gpr_avl_add(avl, box(437), box(2250), nullptr); - avl = gpr_avl_add(avl, box(275), box(2251), nullptr); - avl = remove_int(avl, 520); - avl = gpr_avl_add(avl, box(1019), box(2253), nullptr); - avl = remove_int(avl, 955); - avl = gpr_avl_add(avl, box(270), box(2255), nullptr); - avl = remove_int(avl, 680); - avl = remove_int(avl, 698); - avl = gpr_avl_add(avl, box(735), box(2258), nullptr); - avl = gpr_avl_add(avl, box(400), box(2259), nullptr); - avl = remove_int(avl, 991); - avl = gpr_avl_add(avl, box(263), box(2261), nullptr); - avl = remove_int(avl, 704); - avl = gpr_avl_add(avl, box(757), box(2263), nullptr); - avl = remove_int(avl, 194); - avl = remove_int(avl, 616); - avl = remove_int(avl, 784); - avl = gpr_avl_add(avl, box(382), box(2267), nullptr); - avl = gpr_avl_add(avl, box(464), box(2268), nullptr); - avl = gpr_avl_add(avl, box(817), box(2269), nullptr); - avl = remove_int(avl, 445); - avl = gpr_avl_add(avl, box(412), box(2271), nullptr); - avl = remove_int(avl, 525); - avl = gpr_avl_add(avl, box(299), box(2273), nullptr); - avl = gpr_avl_add(avl, box(464), box(2274), nullptr); - avl = gpr_avl_add(avl, box(715), box(2275), nullptr); - avl = remove_int(avl, 58); - avl = remove_int(avl, 218); - avl = gpr_avl_add(avl, box(961), box(2278), nullptr); - avl = gpr_avl_add(avl, box(491), box(2279), nullptr); - avl = remove_int(avl, 846); - avl = gpr_avl_add(avl, box(762), box(2281), nullptr); - avl = remove_int(avl, 974); - avl = remove_int(avl, 887); - avl = gpr_avl_add(avl, box(498), box(2284), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(1021), box(2290), nullptr); - avl = remove_int(avl, 155); - avl = remove_int(avl, 128); - avl = gpr_avl_add(avl, box(819), box(2293), nullptr); - avl = gpr_avl_add(avl, box(324), box(2294), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(474), box(2301), nullptr); - avl = gpr_avl_add(avl, box(719), box(2302), nullptr); - avl = gpr_avl_add(avl, box(236), box(2303), nullptr); - avl = remove_int(avl, 818); - avl = gpr_avl_add(avl, box(727), box(2305), nullptr); - avl = remove_int(avl, 892); - avl = remove_int(avl, 871); - avl = remove_int(avl, 231); - avl = gpr_avl_add(avl, box(62), box(2309), nullptr); - avl = gpr_avl_add(avl, box(953), box(2310), nullptr); - avl = remove_int(avl, 701); - avl = gpr_avl_add(avl, box(193), box(2312), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(751), box(2318), nullptr); - avl = remove_int(avl, 525); - avl = gpr_avl_add(avl, box(217), box(2320), nullptr); - avl = remove_int(avl, 336); - avl = gpr_avl_add(avl, box(86), box(2322), nullptr); - avl = gpr_avl_add(avl, box(81), box(2323), nullptr); - avl = gpr_avl_add(avl, box(850), box(2324), nullptr); - avl = remove_int(avl, 872); - avl = gpr_avl_add(avl, box(402), box(2326), nullptr); - avl = gpr_avl_add(avl, box(54), box(2327), nullptr); - avl = gpr_avl_add(avl, box(980), box(2328), nullptr); - avl = gpr_avl_add(avl, box(845), box(2329), nullptr); - avl = remove_int(avl, 1004); - avl = remove_int(avl, 273); - avl = remove_int(avl, 879); - avl = gpr_avl_add(avl, box(354), box(2333), nullptr); - avl = gpr_avl_add(avl, box(58), box(2334), nullptr); - avl = gpr_avl_add(avl, box(127), box(2335), nullptr); - avl = remove_int(avl, 84); - avl = gpr_avl_add(avl, box(360), box(2337), nullptr); - 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), nullptr); - avl = remove_int(avl, 558); - avl = remove_int(avl, 958); - avl = gpr_avl_add(avl, box(822), box(2345), nullptr); - avl = remove_int(avl, 1004); - avl = remove_int(avl, 747); - avl = gpr_avl_add(avl, box(631), box(2348), nullptr); - avl = gpr_avl_add(avl, box(442), box(2349), nullptr); - avl = remove_int(avl, 957); - avl = remove_int(avl, 964); - avl = gpr_avl_add(avl, box(10), box(2352), nullptr); - avl = remove_int(avl, 189); - avl = gpr_avl_add(avl, box(742), box(2354), nullptr); - avl = remove_int(avl, 108); - avl = gpr_avl_add(avl, box(1014), box(2356), nullptr); - avl = remove_int(avl, 266); - avl = remove_int(avl, 623); - avl = remove_int(avl, 697); - avl = gpr_avl_add(avl, box(180), box(2360), nullptr); - avl = remove_int(avl, 472); - avl = gpr_avl_add(avl, box(567), box(2362), nullptr); - avl = remove_int(avl, 1020); - avl = remove_int(avl, 273); - avl = gpr_avl_add(avl, box(864), box(2365), nullptr); - avl = gpr_avl_add(avl, box(1009), box(2366), nullptr); - avl = remove_int(avl, 224); - avl = remove_int(avl, 81); - avl = gpr_avl_add(avl, box(653), box(2369), nullptr); - avl = remove_int(avl, 67); - avl = remove_int(avl, 102); - avl = remove_int(avl, 76); - avl = remove_int(avl, 935); - avl = remove_int(avl, 169); - avl = remove_int(avl, 232); - avl = remove_int(avl, 79); - avl = gpr_avl_add(avl, box(509), box(2377), nullptr); - 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), nullptr); - avl = gpr_avl_add(avl, box(925), box(2383), nullptr); - avl = remove_int(avl, 994); - avl = remove_int(avl, 324); - avl = gpr_avl_add(avl, box(291), box(2386), nullptr); - avl = remove_int(avl, 94); - avl = remove_int(avl, 795); - avl = remove_int(avl, 42); - avl = gpr_avl_add(avl, box(613), box(2390), nullptr); - avl = remove_int(avl, 289); - avl = gpr_avl_add(avl, box(980), box(2392), nullptr); - avl = remove_int(avl, 316); - avl = gpr_avl_add(avl, box(281), box(2394), nullptr); - avl = gpr_avl_add(avl, box(1006), box(2395), nullptr); - avl = remove_int(avl, 776); - avl = gpr_avl_add(avl, box(108), box(2397), nullptr); - avl = gpr_avl_add(avl, box(918), box(2398), nullptr); - avl = remove_int(avl, 721); - avl = remove_int(avl, 563); - avl = gpr_avl_add(avl, box(925), box(2401), nullptr); - avl = remove_int(avl, 448); - avl = remove_int(avl, 198); - avl = remove_int(avl, 1); - avl = gpr_avl_add(avl, box(160), box(2405), nullptr); - avl = remove_int(avl, 515); - avl = gpr_avl_add(avl, box(284), box(2407), nullptr); - avl = gpr_avl_add(avl, box(225), box(2408), nullptr); - avl = remove_int(avl, 304); - avl = gpr_avl_add(avl, box(714), box(2410), nullptr); - avl = gpr_avl_add(avl, box(708), box(2411), nullptr); - avl = gpr_avl_add(avl, box(624), box(2412), nullptr); - 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), nullptr); - avl = remove_int(avl, 280); - avl = remove_int(avl, 25); - avl = remove_int(avl, 633); - avl = gpr_avl_add(avl, box(897), box(2421), nullptr); - avl = remove_int(avl, 636); - avl = remove_int(avl, 596); - avl = remove_int(avl, 757); - avl = remove_int(avl, 343); - avl = remove_int(avl, 162); - avl = remove_int(avl, 913); - avl = remove_int(avl, 843); - avl = remove_int(avl, 280); - avl = remove_int(avl, 911); - avl = gpr_avl_add(avl, box(1008), box(2431), nullptr); - avl = remove_int(avl, 948); - avl = remove_int(avl, 74); - avl = remove_int(avl, 571); - avl = gpr_avl_add(avl, box(486), box(2435), nullptr); - avl = gpr_avl_add(avl, box(285), box(2436), nullptr); - avl = remove_int(avl, 304); - avl = remove_int(avl, 516); - avl = gpr_avl_add(avl, box(758), box(2439), nullptr); - avl = gpr_avl_add(avl, box(776), box(2440), nullptr); - avl = remove_int(avl, 696); - avl = gpr_avl_add(avl, box(104), box(2442), nullptr); - avl = gpr_avl_add(avl, box(700), box(2443), nullptr); - avl = gpr_avl_add(avl, box(114), box(2444), nullptr); - avl = gpr_avl_add(avl, box(567), box(2445), nullptr); - avl = remove_int(avl, 620); - avl = gpr_avl_add(avl, box(270), box(2447), nullptr); - avl = remove_int(avl, 730); - avl = gpr_avl_add(avl, box(749), box(2449), nullptr); - avl = gpr_avl_add(avl, box(443), box(2450), nullptr); - avl = remove_int(avl, 457); - avl = gpr_avl_add(avl, box(571), box(2452), nullptr); - avl = gpr_avl_add(avl, box(626), box(2453), nullptr); - avl = remove_int(avl, 638); - avl = remove_int(avl, 313); - - gpr_avl_unref(avl, nullptr); -} - -static void test_stress(int amount_of_stress) { - int added[1024]; - int i, j; - int deletions = 0; - gpr_avl avl; - - unsigned seed = (unsigned)time(nullptr); - - gpr_log(GPR_DEBUG, "test_stress amount=%d seed=%u", amount_of_stress, seed); - - srand((unsigned)time(nullptr)); - avl = gpr_avl_create(&int_int_vtable); - - memset(added, 0, sizeof(added)); - - for (i = 1; deletions < amount_of_stress; i++) { - int idx = rand() % (int)GPR_ARRAY_SIZE(added); - GPR_ASSERT(i); - if (rand() < RAND_MAX / 2) { - added[idx] = 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), nullptr); - } else { - deletions += (added[idx] != 0); - added[idx] = 0; - printf("avl = remove_int(avl, %d); /* d=%d */\n", idx, deletions); - avl = remove_int(avl, idx); - } - for (j = 0; j < (int)GPR_ARRAY_SIZE(added); j++) { - if (added[j] != 0) { - check_get(avl, j, added[j]); - } else { - check_negget(avl, j); - } - } - } - - gpr_avl_unref(avl, nullptr); -} - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - - test_get(); - test_ll(); - test_lr(); - test_rr(); - test_rl(); - test_unbalanced(); - test_replace(); - test_remove(); - test_badcase1(); - test_badcase2(); - test_badcase3(); - test_stress(10); - - return 0; -} diff --git a/test/core/support/cmdline_test.cc b/test/core/support/cmdline_test.cc deleted file mode 100644 index 172efda8a0..0000000000 --- a/test/core/support/cmdline_test.cc +++ /dev/null @@ -1,491 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include - -#include -#include -#include -#include "test/core/util/test_config.h" - -#define LOG_TEST() gpr_log(GPR_INFO, "test at %s:%d", __FILE__, __LINE__) - -static void test_simple_int(void) { - int x = 1; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("-foo"), - const_cast("3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_int(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 1); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 3); - gpr_cmdline_destroy(cl); -} - -static void test_eq_int(void) { - int x = 1; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("-foo=3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_int(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 1); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 3); - gpr_cmdline_destroy(cl); -} - -static void test_2dash_int(void) { - int x = 1; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo"), - const_cast("3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_int(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 1); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 3); - gpr_cmdline_destroy(cl); -} - -static void test_2dash_eq_int(void) { - int x = 1; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_int(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 1); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 3); - gpr_cmdline_destroy(cl); -} - -static void test_simple_string(void) { - const char* x = nullptr; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("-foo"), - const_cast("3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "foo", nullptr, &x); - GPR_ASSERT(x == nullptr); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(0 == strcmp(x, "3")); - gpr_cmdline_destroy(cl); -} - -static void test_eq_string(void) { - const char* x = nullptr; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("-foo=3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "foo", nullptr, &x); - GPR_ASSERT(x == nullptr); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(0 == strcmp(x, "3")); - gpr_cmdline_destroy(cl); -} - -static void test_2dash_string(void) { - const char* x = nullptr; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo"), - const_cast("3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "foo", nullptr, &x); - GPR_ASSERT(x == nullptr); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(0 == strcmp(x, "3")); - gpr_cmdline_destroy(cl); -} - -static void test_2dash_eq_string(void) { - const char* x = nullptr; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=3")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "foo", nullptr, &x); - GPR_ASSERT(x == nullptr); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(0 == strcmp(x, "3")); - gpr_cmdline_destroy(cl); -} - -static void test_flag_on(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 1); - gpr_cmdline_destroy(cl); -} - -static void test_flag_no(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--no-foo")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 0); - gpr_cmdline_destroy(cl); -} - -static void test_flag_val_1(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=1")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 1); - gpr_cmdline_destroy(cl); -} - -static void test_flag_val_0(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=0")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 0); - gpr_cmdline_destroy(cl); -} - -static void test_flag_val_true(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=true")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 1); - gpr_cmdline_destroy(cl); -} - -static void test_flag_val_false(void) { - int x = 2; - gpr_cmdline* cl; - char* args[] = {(char*)__FILE__, const_cast("--foo=false")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_flag(cl, "foo", nullptr, &x); - GPR_ASSERT(x == 2); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 0); - gpr_cmdline_destroy(cl); -} - -static void test_many(void) { - const char* str = nullptr; - int x = 0; - int flag = 2; - gpr_cmdline* cl; - - char* args[] = {(char*)__FILE__, const_cast("--str"), - const_cast("hello"), const_cast("-x=4"), - const_cast("-no-flag")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(x == 4); - GPR_ASSERT(0 == strcmp(str, "hello")); - GPR_ASSERT(flag == 0); - gpr_cmdline_destroy(cl); -} - -static void extra_arg_cb(void* user_data, const char* arg) { - int* count = static_cast(user_data); - GPR_ASSERT(arg != nullptr); - GPR_ASSERT(strlen(arg) == 1); - GPR_ASSERT(arg[0] == 'a' + *count); - ++*count; -} - -static void test_extra(void) { - gpr_cmdline* cl; - int count = 0; - char* args[] = {(char*)__FILE__, const_cast("a"), - const_cast("b"), const_cast("c")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - &count); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(count == 3); - gpr_cmdline_destroy(cl); -} - -static void test_extra_dashdash(void) { - gpr_cmdline* cl; - int count = 0; - char* args[] = {(char*)__FILE__, const_cast("--"), - const_cast("a"), const_cast("b"), - const_cast("c")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - &count); - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(args), args); - GPR_ASSERT(count == 3); - gpr_cmdline_destroy(cl); -} - -static void test_usage(void) { - gpr_cmdline* cl; - char* usage; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - usage = gpr_cmdline_usage_string(cl, "test"); - GPR_ASSERT(0 == strcmp(usage, - "Usage: test [--str=string] [--x=int] " - "[--flag|--no-flag] [file...]\n")); - gpr_free(usage); - - usage = gpr_cmdline_usage_string(cl, "/foo/test"); - GPR_ASSERT(0 == strcmp(usage, - "Usage: test [--str=string] [--x=int] " - "[--flag|--no-flag] [file...]\n")); - gpr_free(usage); - - gpr_cmdline_destroy(cl); -} - -static void test_help(void) { - gpr_cmdline* cl; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - char* help[] = {(char*)__FILE__, const_cast("-h")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_set_survive_failure(cl); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(help), help)); - - gpr_cmdline_destroy(cl); -} - -static void test_badargs1(void) { - gpr_cmdline* cl; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - char* bad_arg_name[] = {(char*)__FILE__, const_cast("--y")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_set_survive_failure(cl); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - GPR_ASSERT(0 == - gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_arg_name), bad_arg_name)); - - gpr_cmdline_destroy(cl); -} - -static void test_badargs2(void) { - gpr_cmdline* cl; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - char* bad_int_value[] = {(char*)__FILE__, const_cast("--x"), - const_cast("henry")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_set_survive_failure(cl); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - GPR_ASSERT( - 0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_int_value), bad_int_value)); - - gpr_cmdline_destroy(cl); -} - -static void test_badargs3(void) { - gpr_cmdline* cl; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - char* bad_bool_value[] = {(char*)__FILE__, const_cast("--flag=henry")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_set_survive_failure(cl); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_bool_value), - bad_bool_value)); - - gpr_cmdline_destroy(cl); -} - -static void test_badargs4(void) { - gpr_cmdline* cl; - - const char* str = nullptr; - int x = 0; - int flag = 2; - - char* bad_bool_value[] = {(char*)__FILE__, const_cast("--no-str")}; - - LOG_TEST(); - - cl = gpr_cmdline_create(nullptr); - gpr_cmdline_set_survive_failure(cl); - gpr_cmdline_add_string(cl, "str", nullptr, &str); - gpr_cmdline_add_int(cl, "x", nullptr, &x); - gpr_cmdline_add_flag(cl, "flag", nullptr, &flag); - gpr_cmdline_on_extra_arg(cl, "file", "filenames to process", extra_arg_cb, - nullptr); - - GPR_ASSERT(0 == gpr_cmdline_parse(cl, GPR_ARRAY_SIZE(bad_bool_value), - bad_bool_value)); - - gpr_cmdline_destroy(cl); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - test_simple_int(); - test_eq_int(); - test_2dash_int(); - test_2dash_eq_int(); - test_simple_string(); - test_eq_string(); - test_2dash_string(); - test_2dash_eq_string(); - test_flag_on(); - test_flag_no(); - test_flag_val_1(); - test_flag_val_0(); - test_flag_val_true(); - test_flag_val_false(); - test_many(); - test_extra(); - test_extra_dashdash(); - test_usage(); - test_help(); - test_badargs1(); - test_badargs2(); - test_badargs3(); - test_badargs4(); - return 0; -} diff --git a/test/core/support/cpu_test.cc b/test/core/support/cpu_test.cc deleted file mode 100644 index 87cdc0fb50..0000000000 --- a/test/core/support/cpu_test.cc +++ /dev/null @@ -1,139 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test gpr per-cpu support: - gpr_cpu_num_cores() - gpr_cpu_current_cpu() -*/ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -/* Test structure is essentially: - 1) Figure out how many cores are present on the test system - 2) Create 3 times that many threads - 3) Have each thread do some amount of work (basically want to - gaurantee that all threads are running at once, and enough of them - to run on all cores). - 4) Each thread checks what core it is running on, and marks that core - as "used" in the test. - 5) Count number of "used" cores. - - The test will fail if: - 1) gpr_cpu_num_cores() == 0 - 2) Any result from gpr_cpu_current_cpu() >= gpr_cpu_num_cores() - 3) Ideally, we would fail if not all cores were seen as used. Unfortunately, - this is only probabilistically true, and depends on the OS, it's - scheduler, etc. So we just print out an indication of how many were seen; - hopefully developers can use this to sanity check their system. -*/ - -/* Status shared across threads */ -struct cpu_test { - gpr_mu mu; - int nthreads; - uint32_t ncores; - int is_done; - gpr_cv done_cv; - int* used; /* is this core used? */ - unsigned r; /* random number */ -}; - -static void worker_thread(void* arg) { - struct cpu_test* ct = (struct cpu_test*)arg; - uint32_t cpu; - unsigned r = 12345678; - unsigned i, j; - /* Avoid repetitive division calculations */ - int64_t max_i = 1000 / grpc_test_slowdown_factor(); - int64_t max_j = 1000 / grpc_test_slowdown_factor(); - for (i = 0; i < max_i; i++) { - /* run for a bit - just calculate something random. */ - for (j = 0; j < max_j; j++) { - r = (r * 17) & ((r - i) | (r * i)); - } - cpu = gpr_cpu_current_cpu(); - GPR_ASSERT(cpu < ct->ncores); - gpr_mu_lock(&ct->mu); - ct->used[cpu] = 1; - for (j = 0; j < ct->ncores; j++) { - if (!ct->used[j]) break; - } - gpr_mu_unlock(&ct->mu); - if (j == ct->ncores) { - break; /* all cpus have been used - no further use in running this test */ - } - } - gpr_mu_lock(&ct->mu); - ct->r = r; /* make it look like we care about r's value... */ - ct->nthreads--; - if (ct->nthreads == 0) { - ct->is_done = 1; - gpr_cv_signal(&ct->done_cv); - } - gpr_mu_unlock(&ct->mu); -} - -static void cpu_test(void) { - uint32_t i; - int cores_seen = 0; - struct cpu_test ct; - gpr_thd_id thd; - ct.ncores = gpr_cpu_num_cores(); - GPR_ASSERT(ct.ncores > 0); - ct.nthreads = (int)ct.ncores * 3; - ct.used = static_cast(gpr_malloc(ct.ncores * sizeof(int))); - memset(ct.used, 0, ct.ncores * sizeof(int)); - gpr_mu_init(&ct.mu); - gpr_cv_init(&ct.done_cv); - ct.is_done = 0; - for (i = 0; i < ct.ncores * 3; i++) { - GPR_ASSERT( - gpr_thd_new(&thd, "grpc_cpu_test", &worker_thread, &ct, nullptr)); - } - gpr_mu_lock(&ct.mu); - while (!ct.is_done) { - gpr_cv_wait(&ct.done_cv, &ct.mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } - gpr_mu_unlock(&ct.mu); - fprintf(stderr, "Saw cores ["); - fflush(stderr); - for (i = 0; i < ct.ncores; i++) { - if (ct.used[i]) { - fprintf(stderr, "%d,", i); - fflush(stderr); - cores_seen++; - } - } - fprintf(stderr, "] (%d/%d)\n", cores_seen, ct.ncores); - fflush(stderr); - gpr_free(ct.used); -} - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - cpu_test(); - return 0; -} diff --git a/test/core/support/env_test.cc b/test/core/support/env_test.cc deleted file mode 100644 index b12c04d06f..0000000000 --- a/test/core/support/env_test.cc +++ /dev/null @@ -1,49 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include - -#include -#include - -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "test/core/util/test_config.h" - -#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) - -static void test_setenv_getenv(void) { - const char* name = "FOO"; - const char* value = "BAR"; - char* retrieved_value; - - LOG_TEST_NAME("test_setenv_getenv"); - - gpr_setenv(name, value); - retrieved_value = gpr_getenv(name); - GPR_ASSERT(retrieved_value != nullptr); - GPR_ASSERT(strcmp(value, retrieved_value) == 0); - gpr_free(retrieved_value); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - test_setenv_getenv(); - return 0; -} diff --git a/test/core/support/host_port_test.cc b/test/core/support/host_port_test.cc deleted file mode 100644 index 42dd56524f..0000000000 --- a/test/core/support/host_port_test.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include -#include -#include "test/core/util/test_config.h" - -static void join_host_port_expect(const char* host, int port, - const char* expected) { - char* buf; - int len; - len = gpr_join_host_port(&buf, host, port); - GPR_ASSERT(len >= 0); - GPR_ASSERT(strlen(expected) == (size_t)len); - GPR_ASSERT(strcmp(expected, buf) == 0); - gpr_free(buf); -} - -static void test_join_host_port(void) { - join_host_port_expect("foo", 101, "foo:101"); - join_host_port_expect("", 102, ":102"); - join_host_port_expect("1::2", 103, "[1::2]:103"); - join_host_port_expect("[::1]", 104, "[::1]:104"); -} - -/* Garbage in, garbage out. */ -static void test_join_host_port_garbage(void) { - join_host_port_expect("[foo]", 105, "[foo]:105"); - join_host_port_expect("[::", 106, "[:::106"); - join_host_port_expect("::]", 107, "[::]]:107"); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - - test_join_host_port(); - test_join_host_port_garbage(); - - return 0; -} diff --git a/test/core/support/log_test.cc b/test/core/support/log_test.cc deleted file mode 100644 index 7dba35c13e..0000000000 --- a/test/core/support/log_test.cc +++ /dev/null @@ -1,108 +0,0 @@ -/* - * - * 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. - * - */ - -#include - -#include -#include - -#include "src/core/lib/support/env.h" -#include "test/core/util/test_config.h" - -static bool log_func_reached = false; - -static void test_callback(gpr_log_func_args* args) { - GPR_ASSERT(0 == strcmp(__FILE__, args->file)); - GPR_ASSERT(args->severity == GPR_LOG_SEVERITY_INFO); - GPR_ASSERT(0 == strcmp(args->message, "hello 1 2 3")); -} - -static void test_should_log(gpr_log_func_args* args) { - log_func_reached = true; -} - -static void test_should_not_log(gpr_log_func_args* args) { GPR_ASSERT(false); } - -#define test_log_function_reached(SEVERITY) \ - gpr_set_log_function(test_should_log); \ - log_func_reached = false; \ - gpr_log_message(SEVERITY, "hello 1 2 3"); \ - GPR_ASSERT(log_func_reached); \ - log_func_reached = false; \ - gpr_log(SEVERITY, "hello %d %d %d", 1, 2, 3); \ - GPR_ASSERT(log_func_reached); - -#define test_log_function_unreached(SEVERITY) \ - gpr_set_log_function(test_should_not_log); \ - gpr_log_message(SEVERITY, "hello 1 2 3"); \ - gpr_log(SEVERITY, "hello %d %d %d", 1, 2, 3); - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - /* test logging at various verbosity levels */ - gpr_log(GPR_DEBUG, "%s", "hello world"); - gpr_log(GPR_INFO, "%s", "hello world"); - gpr_log(GPR_ERROR, "%s", "hello world"); - /* should succeed */ - GPR_ASSERT(1); - gpr_set_log_function(test_callback); - gpr_log_message(GPR_INFO, "hello 1 2 3"); - gpr_log(GPR_INFO, "hello %d %d %d", 1, 2, 3); - gpr_set_log_function(nullptr); - - /* gpr_log_verbosity_init() will be effective only once, and only before - * gpr_set_log_verbosity() is called */ - gpr_setenv("GRPC_VERBOSITY", "ERROR"); - gpr_log_verbosity_init(); - - test_log_function_reached(GPR_ERROR); - test_log_function_unreached(GPR_INFO); - test_log_function_unreached(GPR_DEBUG); - - /* gpr_log_verbosity_init() should not be effective */ - gpr_setenv("GRPC_VERBOSITY", "DEBUG"); - gpr_log_verbosity_init(); - test_log_function_reached(GPR_ERROR); - test_log_function_unreached(GPR_INFO); - test_log_function_unreached(GPR_DEBUG); - - gpr_set_log_verbosity(GPR_LOG_SEVERITY_DEBUG); - test_log_function_reached(GPR_ERROR); - test_log_function_reached(GPR_INFO); - test_log_function_reached(GPR_DEBUG); - - gpr_set_log_verbosity(GPR_LOG_SEVERITY_INFO); - test_log_function_reached(GPR_ERROR); - test_log_function_reached(GPR_INFO); - test_log_function_unreached(GPR_DEBUG); - - gpr_set_log_verbosity(GPR_LOG_SEVERITY_ERROR); - test_log_function_reached(GPR_ERROR); - test_log_function_unreached(GPR_INFO); - test_log_function_unreached(GPR_DEBUG); - - /* gpr_log_verbosity_init() should not be effective */ - gpr_setenv("GRPC_VERBOSITY", "DEBUG"); - gpr_log_verbosity_init(); - test_log_function_reached(GPR_ERROR); - test_log_function_unreached(GPR_INFO); - test_log_function_unreached(GPR_DEBUG); - - /* TODO(ctiller): should we add a GPR_ASSERT failure test here */ - return 0; -} diff --git a/test/core/support/manual_constructor_test.cc b/test/core/support/manual_constructor_test.cc deleted file mode 100644 index 714f8b21a0..0000000000 --- a/test/core/support/manual_constructor_test.cc +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr synchronization support. */ - -#include "src/core/lib/support/manual_constructor.h" -#include -#include -#include -#include -#include -#include -#include -#include "src/core/lib/support/abstract.h" -#include "test/core/util/test_config.h" - -class A { - public: - A() {} - virtual ~A() {} - virtual const char* foo() { return "A_foo"; } - virtual const char* bar() { return "A_bar"; } - GRPC_ABSTRACT_BASE_CLASS -}; - -class B : public A { - public: - B() {} - ~B() {} - const char* foo() override { return "B_foo"; } - char get_junk() { return junk[0]; } - - private: - char junk[1000]; -}; - -class C : public B { - public: - C() {} - ~C() {} - virtual const char* bar() { return "C_bar"; } - char get_more_junk() { return more_junk[0]; } - - private: - char more_junk[1000]; -}; - -class D : public A { - public: - virtual const char* bar() { return "D_bar"; } -}; - -static void basic_test() { - grpc_core::PolymorphicManualConstructor poly; - poly.Init(); - GPR_ASSERT(!strcmp(poly->foo(), "B_foo")); - GPR_ASSERT(!strcmp(poly->bar(), "A_bar")); -} - -static void complex_test() { - grpc_core::PolymorphicManualConstructor polyB; - polyB.Init(); - GPR_ASSERT(!strcmp(polyB->foo(), "B_foo")); - GPR_ASSERT(!strcmp(polyB->bar(), "A_bar")); - - grpc_core::PolymorphicManualConstructor polyC; - polyC.Init(); - GPR_ASSERT(!strcmp(polyC->foo(), "B_foo")); - GPR_ASSERT(!strcmp(polyC->bar(), "C_bar")); - - grpc_core::PolymorphicManualConstructor polyD; - polyD.Init(); - GPR_ASSERT(!strcmp(polyD->foo(), "A_foo")); - GPR_ASSERT(!strcmp(polyD->bar(), "D_bar")); -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - basic_test(); - complex_test(); - return 0; -} diff --git a/test/core/support/memory_test.cc b/test/core/support/memory_test.cc deleted file mode 100644 index 79ab631a78..0000000000 --- a/test/core/support/memory_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/support/memory.h" -#include -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -struct Foo { - Foo(int p, int q) : a(p), b(q) {} - int a; - int b; -}; - -TEST(MemoryTest, NewDeleteTest) { Delete(New()); } - -TEST(MemoryTest, NewDeleteWithArgTest) { - int* i = New(42); - EXPECT_EQ(42, *i); - Delete(i); -} - -TEST(MemoryTest, NewDeleteWithArgsTest) { - Foo* p = New(1, 2); - EXPECT_EQ(1, p->a); - EXPECT_EQ(2, p->b); - Delete(p); -} - -TEST(MemoryTest, MakeUniqueTest) { MakeUnique(); } - -TEST(MemoryTest, MakeUniqueWithArgTest) { - auto i = MakeUnique(42); - EXPECT_EQ(42, *i); -} - -TEST(MemoryTest, UniquePtrWithCustomDeleter) { - int n = 0; - class IncrementingDeleter { - public: - void operator()(int* p) { ++*p; } - }; - { - UniquePtr p(&n); - EXPECT_EQ(0, n); - } - EXPECT_EQ(1, n); -} - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/support/mpscq_test.cc b/test/core/support/mpscq_test.cc deleted file mode 100644 index 1b83f7d5be..0000000000 --- a/test/core/support/mpscq_test.cc +++ /dev/null @@ -1,194 +0,0 @@ -/* - * - * Copyright 2016 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/support/mpscq.h" - -#include - -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -typedef struct test_node { - gpr_mpscq_node node; - size_t i; - size_t* ctr; -} test_node; - -static test_node* new_node(size_t i, size_t* ctr) { - test_node* n = static_cast(gpr_malloc(sizeof(test_node))); - n->i = i; - n->ctr = ctr; - return n; -} - -static void test_serial(void) { - gpr_log(GPR_DEBUG, "test_serial"); - gpr_mpscq q; - gpr_mpscq_init(&q); - for (size_t i = 0; i < 10000000; i++) { - gpr_mpscq_push(&q, &new_node(i, nullptr)->node); - } - for (size_t i = 0; i < 10000000; i++) { - test_node* n = (test_node*)gpr_mpscq_pop(&q); - GPR_ASSERT(n); - GPR_ASSERT(n->i == i); - gpr_free(n); - } -} - -typedef struct { - size_t ctr; - gpr_mpscq* q; - gpr_event* start; -} thd_args; - -#define THREAD_ITERATIONS 10000 - -static void test_thread(void* args) { - thd_args* a = static_cast(args); - gpr_event_wait(a->start, gpr_inf_future(GPR_CLOCK_REALTIME)); - for (size_t i = 1; i <= THREAD_ITERATIONS; i++) { - gpr_mpscq_push(a->q, &new_node(i, &a->ctr)->node); - } -} - -static void test_mt(void) { - gpr_log(GPR_DEBUG, "test_mt"); - gpr_event start; - gpr_event_init(&start); - gpr_thd_id thds[100]; - thd_args ta[GPR_ARRAY_SIZE(thds)]; - gpr_mpscq q; - gpr_mpscq_init(&q); - for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { - gpr_thd_options options = gpr_thd_options_default(); - gpr_thd_options_set_joinable(&options); - ta[i].ctr = 0; - ta[i].q = &q; - ta[i].start = &start; - GPR_ASSERT( - gpr_thd_new(&thds[i], "grpc_mt_test", test_thread, &ta[i], &options)); - } - size_t num_done = 0; - size_t spins = 0; - gpr_event_set(&start, (void*)1); - while (num_done != GPR_ARRAY_SIZE(thds)) { - gpr_mpscq_node* n; - while ((n = gpr_mpscq_pop(&q)) == nullptr) { - spins++; - } - test_node* tn = (test_node*)n; - GPR_ASSERT(*tn->ctr == tn->i - 1); - *tn->ctr = tn->i; - if (tn->i == THREAD_ITERATIONS) num_done++; - gpr_free(tn); - } - gpr_log(GPR_DEBUG, "spins: %" PRIdPTR, spins); - for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { - gpr_thd_join(thds[i]); - } - gpr_mpscq_destroy(&q); -} - -typedef struct { - thd_args* ta; - size_t num_thds; - gpr_mu mu; - size_t num_done; - size_t spins; - gpr_mpscq* q; - gpr_event* start; -} pull_args; - -static void pull_thread(void* arg) { - pull_args* pa = static_cast(arg); - gpr_event_wait(pa->start, gpr_inf_future(GPR_CLOCK_REALTIME)); - - for (;;) { - gpr_mu_lock(&pa->mu); - if (pa->num_done == pa->num_thds) { - gpr_mu_unlock(&pa->mu); - return; - } - gpr_mpscq_node* n; - while ((n = gpr_mpscq_pop(pa->q)) == nullptr) { - pa->spins++; - } - test_node* tn = (test_node*)n; - GPR_ASSERT(*tn->ctr == tn->i - 1); - *tn->ctr = tn->i; - if (tn->i == THREAD_ITERATIONS) pa->num_done++; - gpr_free(tn); - gpr_mu_unlock(&pa->mu); - } -} - -static void test_mt_multipop(void) { - gpr_log(GPR_DEBUG, "test_mt_multipop"); - gpr_event start; - gpr_event_init(&start); - gpr_thd_id thds[100]; - gpr_thd_id pull_thds[100]; - thd_args ta[GPR_ARRAY_SIZE(thds)]; - gpr_mpscq q; - gpr_mpscq_init(&q); - for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { - gpr_thd_options options = gpr_thd_options_default(); - gpr_thd_options_set_joinable(&options); - ta[i].ctr = 0; - ta[i].q = &q; - ta[i].start = &start; - GPR_ASSERT(gpr_thd_new(&thds[i], "grpc_multipop_test", test_thread, &ta[i], - &options)); - } - pull_args pa; - pa.ta = ta; - pa.num_thds = GPR_ARRAY_SIZE(thds); - pa.spins = 0; - pa.num_done = 0; - pa.q = &q; - pa.start = &start; - gpr_mu_init(&pa.mu); - for (size_t i = 0; i < GPR_ARRAY_SIZE(pull_thds); i++) { - gpr_thd_options options = gpr_thd_options_default(); - gpr_thd_options_set_joinable(&options); - GPR_ASSERT(gpr_thd_new(&pull_thds[i], "grpc_multipop_pull", pull_thread, - &pa, &options)); - } - gpr_event_set(&start, (void*)1); - for (size_t i = 0; i < GPR_ARRAY_SIZE(pull_thds); i++) { - gpr_thd_join(pull_thds[i]); - } - gpr_log(GPR_DEBUG, "spins: %" PRIdPTR, pa.spins); - for (size_t i = 0; i < GPR_ARRAY_SIZE(thds); i++) { - gpr_thd_join(thds[i]); - } - gpr_mpscq_destroy(&q); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - test_serial(); - test_mt(); - test_mt_multipop(); - return 0; -} diff --git a/test/core/support/murmur_hash_test.cc b/test/core/support/murmur_hash_test.cc deleted file mode 100644 index 461c728951..0000000000 --- a/test/core/support/murmur_hash_test.cc +++ /dev/null @@ -1,73 +0,0 @@ -/* - * - * 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. - * - */ - -#include "src/core/lib/support/murmur_hash.h" -#include -#include -#include "test/core/util/test_config.h" - -#include - -typedef uint32_t (*hash_func)(const void* key, size_t len, uint32_t seed); - -/* From smhasher: - This should hopefully be a thorough and uambiguous test of whether a hash - is correctly implemented on a given platform */ - -static void verification_test(hash_func hash, uint32_t expected) { - uint8_t key[256]; - uint32_t hashes[256]; - uint32_t final = 0; - size_t i; - - memset(key, 0, sizeof(key)); - memset(hashes, 0, sizeof(hashes)); - - /* Hash keys of the form {0}, {0,1}, {0,1,2}... up to N=255,using 256-N as - the seed */ - - for (i = 0; i < 256; i++) { - key[i] = (uint8_t)i; - hashes[i] = hash(key, i, (uint32_t)(256u - i)); - } - - /* Then hash the result array */ - - final = hash(hashes, sizeof(hashes), 0); - - /* The first four bytes of that hash, interpreted as a little-endian integer, - is our - verification value */ - - if (expected != final) { - gpr_log(GPR_INFO, "Verification value 0x%08X : Failed! (Expected 0x%08x)", - final, expected); - abort(); - } else { - gpr_log(GPR_INFO, "Verification value 0x%08X : Passed!", final); - } -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - /* basic tests to verify that things don't crash */ - gpr_murmur_hash3("", 0, 0); - gpr_murmur_hash3("xyz", 3, 0); - verification_test(gpr_murmur_hash3, 0xB0F57EE3); - return 0; -} diff --git a/test/core/support/orphanable_test.cc b/test/core/support/orphanable_test.cc deleted file mode 100644 index e07017ab1e..0000000000 --- a/test/core/support/orphanable_test.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* - * - * 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/support/orphanable.h" - -#include - -#include "src/core/lib/support/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public Orphanable { - public: - Foo() : Foo(0) {} - explicit Foo(int value) : value_(value) {} - void Orphan() override { Delete(this); } - int value() const { return value_; } - - private: - int value_; -}; - -TEST(Orphanable, Basic) { - Foo* foo = New(); - foo->Orphan(); -} - -TEST(OrphanablePtr, Basic) { - OrphanablePtr foo(New()); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeOrphanable, DefaultConstructor) { - auto foo = MakeOrphanable(); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeOrphanable, WithParameters) { - auto foo = MakeOrphanable(5); - EXPECT_EQ(5, foo->value()); -} - -class Bar : public InternallyRefCounted { - public: - Bar() : Bar(0) {} - explicit Bar(int value) : value_(value) {} - void Orphan() override { Unref(); } - int value() const { return value_; } - - void StartWork() { Ref(); } - void FinishWork() { Unref(); } - - private: - int value_; -}; - -TEST(OrphanablePtr, InternallyRefCounted) { - auto bar = MakeOrphanable(); - bar->StartWork(); - bar->FinishWork(); -} - -// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that -// things build properly in both debug and non-debug cases. -DebugOnlyTraceFlag baz_tracer(true, "baz"); - -class Baz : public InternallyRefCountedWithTracing { - public: - Baz() : Baz(0) {} - explicit Baz(int value) - : InternallyRefCountedWithTracing(&baz_tracer), value_(value) {} - void Orphan() override { Unref(); } - int value() const { return value_; } - - void StartWork() { Ref(DEBUG_LOCATION, "work"); } - void FinishWork() { Unref(DEBUG_LOCATION, "work"); } - - private: - int value_; -}; - -TEST(OrphanablePtr, InternallyRefCountedWithTracing) { - auto baz = MakeOrphanable(); - baz->StartWork(); - baz->FinishWork(); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/support/ref_counted_ptr_test.cc b/test/core/support/ref_counted_ptr_test.cc deleted file mode 100644 index ce4975d347..0000000000 --- a/test/core/support/ref_counted_ptr_test.cc +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * 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/support/ref_counted_ptr.h" - -#include - -#include - -#include "src/core/lib/support/memory.h" -#include "src/core/lib/support/ref_counted.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public RefCounted { - public: - Foo() : value_(0) {} - - explicit Foo(int value) : value_(value) {} - - int value() const { return value_; } - - private: - int value_; -}; - -TEST(RefCountedPtr, DefaultConstructor) { RefCountedPtr foo; } - -TEST(RefCountedPtr, ExplicitConstructorEmpty) { - RefCountedPtr foo(nullptr); -} - -TEST(RefCountedPtr, ExplicitConstructor) { RefCountedPtr foo(New()); } - -TEST(RefCountedPtr, MoveConstructor) { - RefCountedPtr foo(New()); - RefCountedPtr foo2(std::move(foo)); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, MoveAssignment) { - RefCountedPtr foo(New()); - RefCountedPtr foo2 = std::move(foo); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, CopyConstructor) { - RefCountedPtr foo(New()); - RefCountedPtr foo2(foo); - EXPECT_NE(nullptr, foo.get()); - EXPECT_EQ(foo.get(), foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignment) { - RefCountedPtr foo(New()); - RefCountedPtr foo2 = foo; - EXPECT_NE(nullptr, foo.get()); - EXPECT_EQ(foo.get(), foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignmentWhenEmpty) { - RefCountedPtr foo; - RefCountedPtr foo2; - foo2 = foo; - EXPECT_EQ(nullptr, foo.get()); - EXPECT_EQ(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignmentToSelf) { - RefCountedPtr foo(New()); - foo = foo; -} - -TEST(RefCountedPtr, EnclosedScope) { - RefCountedPtr foo(New()); - { - RefCountedPtr foo2(std::move(foo)); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); - } - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNullToNonNull) { - RefCountedPtr foo; - EXPECT_EQ(nullptr, foo.get()); - foo.reset(New()); - EXPECT_NE(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNonNullToNonNull) { - RefCountedPtr foo(New()); - EXPECT_NE(nullptr, foo.get()); - Foo* original = foo.get(); - foo.reset(New()); - EXPECT_NE(nullptr, foo.get()); - EXPECT_NE(original, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNonNullToNull) { - RefCountedPtr foo(New()); - EXPECT_NE(nullptr, foo.get()); - foo.reset(); - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNullToNull) { - RefCountedPtr foo; - EXPECT_EQ(nullptr, foo.get()); - foo.reset(nullptr); - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, DerefernceOperators) { - RefCountedPtr foo(New()); - foo->value(); - Foo& foo_ref = *foo; - foo_ref.value(); -} - -TEST(RefCountedPtr, EqualityOperators) { - RefCountedPtr foo(New()); - RefCountedPtr bar = foo; - RefCountedPtr empty; - // Test equality between RefCountedPtrs. - EXPECT_EQ(foo, bar); - EXPECT_NE(foo, empty); - // Test equality with bare pointers. - EXPECT_EQ(foo, foo.get()); - EXPECT_EQ(empty, nullptr); - EXPECT_NE(foo, nullptr); -} - -TEST(MakeRefCounted, NoArgs) { - RefCountedPtr foo = MakeRefCounted(); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeRefCounted, Args) { - RefCountedPtr foo = MakeRefCounted(3); - EXPECT_EQ(3, foo->value()); -} - -TraceFlag foo_tracer(true, "foo"); - -class FooWithTracing : public RefCountedWithTracing { - public: - FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} -}; - -TEST(RefCountedPtr, RefCountedWithTracing) { - RefCountedPtr foo(New()); - foo->Ref(DEBUG_LOCATION, "foo"); - foo->Unref(DEBUG_LOCATION, "foo"); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/support/ref_counted_test.cc b/test/core/support/ref_counted_test.cc deleted file mode 100644 index 0629e3ff5f..0000000000 --- a/test/core/support/ref_counted_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/support/ref_counted.h" - -#include - -#include "src/core/lib/support/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public RefCounted { - public: - Foo() {} -}; - -TEST(RefCounted, Basic) { - Foo* foo = New(); - foo->Unref(); -} - -TEST(RefCounted, ExtraRef) { - Foo* foo = New(); - foo->Ref(); - foo->Unref(); - foo->Unref(); -} - -// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that -// things build properly in both debug and non-debug cases. -DebugOnlyTraceFlag foo_tracer(true, "foo"); - -class FooWithTracing : public RefCountedWithTracing { - public: - FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} -}; - -TEST(RefCountedWithTracing, Basic) { - FooWithTracing* foo = New(); - foo->Ref(DEBUG_LOCATION, "extra_ref"); - foo->Unref(DEBUG_LOCATION, "extra_ref"); - // Can use the no-argument methods, too. - foo->Ref(); - foo->Unref(); - foo->Unref(DEBUG_LOCATION, "original_ref"); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/support/spinlock_test.cc b/test/core/support/spinlock_test.cc deleted file mode 100644 index ea0dbbf7c6..0000000000 --- a/test/core/support/spinlock_test.cc +++ /dev/null @@ -1,152 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr synchronization support. */ - -#include "src/core/lib/support/spinlock.h" -#include -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -/* ------------------------------------------------- */ -/* Tests for gpr_spinlock. */ -struct test { - int thread_count; /* number of threads */ - gpr_thd_id* threads; - - int64_t iterations; /* number of iterations per thread */ - int64_t counter; - int incr_step; /* how much to increment/decrement refcount each time */ - - gpr_spinlock mu; /* protects iterations, counter */ -}; - -/* Return pointer to a new struct test. */ -static struct test* test_new(int threads, int64_t iterations, int incr_step) { - struct test* m = static_cast(gpr_malloc(sizeof(*m))); - m->thread_count = threads; - m->threads = static_cast( - gpr_malloc(sizeof(*m->threads) * (size_t)threads)); - m->iterations = iterations; - m->counter = 0; - m->thread_count = 0; - m->incr_step = incr_step; - m->mu = GPR_SPINLOCK_INITIALIZER; - return m; -} - -/* Return pointer to a new struct test. */ -static void test_destroy(struct test* m) { - gpr_free(m->threads); - gpr_free(m); -} - -/* Create m->threads threads, each running (*body)(m) */ -static void test_create_threads(struct test* m, void (*body)(void* arg)) { - int i; - for (i = 0; i != m->thread_count; i++) { - gpr_thd_options opt = gpr_thd_options_default(); - gpr_thd_options_set_joinable(&opt); - GPR_ASSERT( - gpr_thd_new(&m->threads[i], "grpc_create_threads", body, m, &opt)); - } -} - -/* Wait until all threads report done. */ -static void test_wait(struct test* m) { - int i; - for (i = 0; i != m->thread_count; i++) { - gpr_thd_join(m->threads[i]); - } -} - -/* Test several threads running (*body)(struct test *m) for increasing settings - of m->iterations, until about timeout_s to 2*timeout_s seconds have elapsed. - If extra!=NULL, run (*extra)(m) in an additional thread. - incr_step controls by how much m->refcount should be incremented/decremented - (if at all) each time in the tests. - */ -static void test(const char* name, void (*body)(void* m), int timeout_s, - int incr_step) { - int64_t iterations = 1024; - struct test* m; - gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME); - gpr_timespec time_taken; - gpr_timespec deadline = gpr_time_add( - start, gpr_time_from_micros((int64_t)timeout_s * 1000000, GPR_TIMESPAN)); - fprintf(stderr, "%s:", name); - fflush(stderr); - while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0) { - if (iterations < INT64_MAX / 2) iterations <<= 1; - fprintf(stderr, " %ld", (long)iterations); - fflush(stderr); - m = test_new(10, iterations, incr_step); - test_create_threads(m, body); - test_wait(m); - if (m->counter != m->thread_count * m->iterations * m->incr_step) { - fprintf(stderr, "counter %ld threads %d iterations %ld\n", - (long)m->counter, m->thread_count, (long)m->iterations); - fflush(stderr); - GPR_ASSERT(0); - } - test_destroy(m); - } - time_taken = gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), start); - fprintf(stderr, " done %lld.%09d s\n", (long long)time_taken.tv_sec, - (int)time_taken.tv_nsec); - fflush(stderr); -} - -/* Increment m->counter on each iteration; then mark thread as done. */ -static void inc(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - gpr_spinlock_lock(&m->mu); - m->counter++; - gpr_spinlock_unlock(&m->mu); - } -} - -/* Increment m->counter under lock acquired with trylock, m->iterations times; - then mark thread as done. */ -static void inctry(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations;) { - if (gpr_spinlock_trylock(&m->mu)) { - m->counter++; - gpr_spinlock_unlock(&m->mu); - i++; - } - } -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - test("spinlock", &inc, 1, 1); - test("spinlock try", &inctry, 1, 1); - return 0; -} diff --git a/test/core/support/string_test.cc b/test/core/support/string_test.cc deleted file mode 100644 index fd7f7cde59..0000000000 --- a/test/core/support/string_test.cc +++ /dev/null @@ -1,312 +0,0 @@ -/* - * - * 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. - * - */ - -#include "src/core/lib/support/string.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -#define LOG_TEST_NAME(x) gpr_log(GPR_INFO, "%s", x) - -static void test_strdup(void) { - static const char* src1 = "hello world"; - char* dst1; - - LOG_TEST_NAME("test_strdup"); - - dst1 = gpr_strdup(src1); - GPR_ASSERT(0 == strcmp(src1, dst1)); - gpr_free(dst1); - - GPR_ASSERT(nullptr == gpr_strdup(nullptr)); -} - -static void expect_dump(const char* buf, size_t len, uint32_t flags, - const char* result) { - char* got = gpr_dump(buf, len, flags); - GPR_ASSERT(0 == strcmp(got, result)); - gpr_free(got); -} - -static void test_dump(void) { - LOG_TEST_NAME("test_dump"); - expect_dump("\x01", 1, GPR_DUMP_HEX, "01"); - expect_dump("\x01", 1, GPR_DUMP_HEX | GPR_DUMP_ASCII, "01 '.'"); - expect_dump("\x01\x02", 2, GPR_DUMP_HEX, "01 02"); - expect_dump("\x01\x23\x45\x67\x89\xab\xcd\xef", 8, GPR_DUMP_HEX, - "01 23 45 67 89 ab cd ef"); - expect_dump("ab", 2, GPR_DUMP_HEX | GPR_DUMP_ASCII, "61 62 'ab'"); -} - -static void test_pu32_fail(const char* s) { - uint32_t out; - GPR_ASSERT(!gpr_parse_bytes_to_uint32(s, strlen(s), &out)); -} - -static void test_pu32_succeed(const char* s, uint32_t want) { - uint32_t out; - GPR_ASSERT(gpr_parse_bytes_to_uint32(s, strlen(s), &out)); - GPR_ASSERT(out == want); -} - -static void test_parse_uint32(void) { - LOG_TEST_NAME("test_parse_uint32"); - - test_pu32_fail("-1"); - test_pu32_fail("a"); - test_pu32_fail(""); - test_pu32_succeed("0", 0); - test_pu32_succeed("1", 1); - test_pu32_succeed("2", 2); - test_pu32_succeed("3", 3); - test_pu32_succeed("4", 4); - test_pu32_succeed("5", 5); - test_pu32_succeed("6", 6); - test_pu32_succeed("7", 7); - test_pu32_succeed("8", 8); - test_pu32_succeed("9", 9); - test_pu32_succeed("10", 10); - test_pu32_succeed("11", 11); - test_pu32_succeed("12", 12); - test_pu32_succeed("13", 13); - test_pu32_succeed("14", 14); - test_pu32_succeed("15", 15); - test_pu32_succeed("16", 16); - test_pu32_succeed("17", 17); - test_pu32_succeed("18", 18); - test_pu32_succeed("19", 19); - test_pu32_succeed("1234567890", 1234567890); - test_pu32_succeed("4294967295", 4294967295u); - test_pu32_fail("4294967296"); - test_pu32_fail("4294967297"); - test_pu32_fail("4294967298"); - test_pu32_fail("4294967299"); -} - -static void test_asprintf(void) { - char* buf; - int i, j; - - LOG_TEST_NAME("test_asprintf"); - - /* Print an empty string. */ - GPR_ASSERT(gpr_asprintf(&buf, "%s", "") == 0); - GPR_ASSERT(buf[0] == '\0'); - gpr_free(buf); - - /* Print strings of various lengths. */ - for (i = 1; i < 100; i++) { - GPR_ASSERT(gpr_asprintf(&buf, "%0*d", i, 1) == i); - - /* The buffer should resemble "000001\0". */ - for (j = 0; j < i - 2; j++) { - GPR_ASSERT(buf[j] == '0'); - } - GPR_ASSERT(buf[i - 1] == '1'); - GPR_ASSERT(buf[i] == '\0'); - gpr_free(buf); - } -} - -static void test_strjoin(void) { - const char* parts[4] = {"one", "two", "three", "four"}; - size_t joined_len; - char* joined; - - LOG_TEST_NAME("test_strjoin"); - - joined = gpr_strjoin(parts, 4, &joined_len); - GPR_ASSERT(0 == strcmp("onetwothreefour", joined)); - gpr_free(joined); - - joined = gpr_strjoin(parts, 0, &joined_len); - GPR_ASSERT(0 == strcmp("", joined)); - gpr_free(joined); - - joined = gpr_strjoin(parts, 1, &joined_len); - GPR_ASSERT(0 == strcmp("one", joined)); - gpr_free(joined); -} - -static void test_strjoin_sep(void) { - const char* parts[4] = {"one", "two", "three", "four"}; - size_t joined_len; - char* joined; - - LOG_TEST_NAME("test_strjoin_sep"); - - joined = gpr_strjoin_sep(parts, 4, ", ", &joined_len); - GPR_ASSERT(0 == strcmp("one, two, three, four", joined)); - gpr_free(joined); - - /* empty separator */ - joined = gpr_strjoin_sep(parts, 4, "", &joined_len); - GPR_ASSERT(0 == strcmp("onetwothreefour", joined)); - gpr_free(joined); - - /* degenerated case specifying zero input parts */ - joined = gpr_strjoin_sep(parts, 0, ", ", &joined_len); - GPR_ASSERT(0 == strcmp("", joined)); - gpr_free(joined); - - /* single part should have no separator */ - joined = gpr_strjoin_sep(parts, 1, ", ", &joined_len); - GPR_ASSERT(0 == strcmp("one", joined)); - gpr_free(joined); -} - -static void test_ltoa() { - char* str; - char buf[GPR_LTOA_MIN_BUFSIZE]; - - LOG_TEST_NAME("test_ltoa"); - - /* zero */ - GPR_ASSERT(1 == gpr_ltoa(0, buf)); - GPR_ASSERT(0 == strcmp("0", buf)); - - /* positive number */ - GPR_ASSERT(3 == gpr_ltoa(123, buf)); - GPR_ASSERT(0 == strcmp("123", buf)); - - /* negative number */ - GPR_ASSERT(6 == gpr_ltoa(-12345, buf)); - GPR_ASSERT(0 == strcmp("-12345", buf)); - - /* large negative - we don't know the size of long in advance */ - GPR_ASSERT(gpr_asprintf(&str, "%lld", (long long)LONG_MIN)); - GPR_ASSERT(strlen(str) == (size_t)gpr_ltoa(LONG_MIN, buf)); - GPR_ASSERT(0 == strcmp(str, buf)); - gpr_free(str); -} - -static void test_int64toa() { - char buf[GPR_INT64TOA_MIN_BUFSIZE]; - - LOG_TEST_NAME("test_int64toa"); - - /* zero */ - GPR_ASSERT(1 == int64_ttoa(0, buf)); - GPR_ASSERT(0 == strcmp("0", buf)); - - /* positive */ - GPR_ASSERT(3 == int64_ttoa(123, buf)); - GPR_ASSERT(0 == strcmp("123", buf)); - - /* large positive */ - GPR_ASSERT(19 == int64_ttoa(9223372036854775807LL, buf)); - GPR_ASSERT(0 == strcmp("9223372036854775807", buf)); - - /* large negative */ - GPR_ASSERT(20 == int64_ttoa(-9223372036854775807LL - 1, buf)); - GPR_ASSERT(0 == strcmp("-9223372036854775808", buf)); -} - -static void test_leftpad() { - char* padded; - - LOG_TEST_NAME("test_leftpad"); - - padded = gpr_leftpad("foo", ' ', 5); - GPR_ASSERT(0 == strcmp(" foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", ' ', 4); - GPR_ASSERT(0 == strcmp(" foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", ' ', 3); - GPR_ASSERT(0 == strcmp("foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", ' ', 2); - GPR_ASSERT(0 == strcmp("foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", ' ', 1); - GPR_ASSERT(0 == strcmp("foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", ' ', 0); - GPR_ASSERT(0 == strcmp("foo", padded)); - gpr_free(padded); - - padded = gpr_leftpad("foo", '0', 5); - GPR_ASSERT(0 == strcmp("00foo", padded)); - gpr_free(padded); -} - -static void test_stricmp(void) { - LOG_TEST_NAME("test_stricmp"); - - GPR_ASSERT(0 == gpr_stricmp("hello", "hello")); - GPR_ASSERT(0 == gpr_stricmp("HELLO", "hello")); - GPR_ASSERT(gpr_stricmp("a", "b") < 0); - GPR_ASSERT(gpr_stricmp("b", "a") > 0); -} - -static void test_memrchr(void) { - LOG_TEST_NAME("test_memrchr"); - - GPR_ASSERT(nullptr == gpr_memrchr(nullptr, 'a', 0)); - GPR_ASSERT(nullptr == gpr_memrchr("", 'a', 0)); - GPR_ASSERT(nullptr == gpr_memrchr("hello", 'b', 5)); - GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'h', 5), "hello")); - GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'o', 5), "o")); - GPR_ASSERT(0 == strcmp((const char*)gpr_memrchr("hello", 'l', 5), "lo")); -} - -static void test_is_true(void) { - LOG_TEST_NAME("test_is_true"); - - GPR_ASSERT(true == gpr_is_true("True")); - GPR_ASSERT(true == gpr_is_true("true")); - GPR_ASSERT(true == gpr_is_true("TRUE")); - GPR_ASSERT(true == gpr_is_true("Yes")); - GPR_ASSERT(true == gpr_is_true("yes")); - GPR_ASSERT(true == gpr_is_true("YES")); - GPR_ASSERT(true == gpr_is_true("1")); - GPR_ASSERT(false == gpr_is_true(nullptr)); - GPR_ASSERT(false == gpr_is_true("")); - GPR_ASSERT(false == gpr_is_true("0")); -} - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - test_strdup(); - test_dump(); - test_parse_uint32(); - test_asprintf(); - test_strjoin(); - test_strjoin_sep(); - test_ltoa(); - test_int64toa(); - test_leftpad(); - test_stricmp(); - test_memrchr(); - test_is_true(); - return 0; -} diff --git a/test/core/support/sync_test.cc b/test/core/support/sync_test.cc deleted file mode 100644 index 768f96d093..0000000000 --- a/test/core/support/sync_test.cc +++ /dev/null @@ -1,457 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr synchronization support. */ - -#include -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -/* ==================Example use of interface=================== - - A producer-consumer queue of up to N integers, - illustrating the use of the calls in this interface. */ - -#define N 4 - -typedef struct queue { - gpr_cv non_empty; /* Signalled when length becomes non-zero. */ - gpr_cv non_full; /* Signalled when length becomes non-N. */ - gpr_mu mu; /* Protects all fields below. - (That is, except during initialization or - destruction, the fields below should be accessed - only by a thread that holds mu.) */ - int head; /* Index of head of queue 0..N-1. */ - int length; /* Number of valid elements in queue 0..N. */ - int elem[N]; /* elem[head .. head+length-1] are queue elements. */ -} queue; - -/* Initialize *q. */ -void queue_init(queue* q) { - gpr_mu_init(&q->mu); - gpr_cv_init(&q->non_empty); - gpr_cv_init(&q->non_full); - q->head = 0; - q->length = 0; -} - -/* Free storage associated with *q. */ -void queue_destroy(queue* q) { - gpr_mu_destroy(&q->mu); - gpr_cv_destroy(&q->non_empty); - gpr_cv_destroy(&q->non_full); -} - -/* Wait until there is room in *q, then append x to *q. */ -void queue_append(queue* q, int x) { - gpr_mu_lock(&q->mu); - /* To wait for a predicate without a deadline, loop on the negation of the - predicate, and use gpr_cv_wait(..., gpr_inf_future(GPR_CLOCK_REALTIME)) - inside the loop - to release the lock, wait, and reacquire on each iteration. Code that - makes the condition true should use gpr_cv_broadcast() on the - corresponding condition variable. The predicate must be on state - protected by the lock. */ - while (q->length == N) { - gpr_cv_wait(&q->non_full, &q->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } - if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ - /* It's normal to use gpr_cv_broadcast() or gpr_signal() while - holding the lock. */ - gpr_cv_broadcast(&q->non_empty); - } - q->elem[(q->head + q->length) % N] = x; - q->length++; - gpr_mu_unlock(&q->mu); -} - -/* If it can be done without blocking, append x to *q and return non-zero. - Otherwise return 0. */ -int queue_try_append(queue* q, int x) { - int result = 0; - if (gpr_mu_trylock(&q->mu)) { - if (q->length != N) { - if (q->length == 0) { /* Wake threads blocked in queue_remove(). */ - gpr_cv_broadcast(&q->non_empty); - } - q->elem[(q->head + q->length) % N] = x; - q->length++; - result = 1; - } - gpr_mu_unlock(&q->mu); - } - return result; -} - -/* Wait until the *q is non-empty or deadline abs_deadline passes. If the - queue is non-empty, remove its head entry, place it in *head, and return - non-zero. Otherwise return 0. */ -int queue_remove(queue* q, int* head, gpr_timespec abs_deadline) { - int result = 0; - gpr_mu_lock(&q->mu); - /* To wait for a predicate with a deadline, loop on the negation of the - predicate or until gpr_cv_wait() returns true. Code that makes - the condition true should use gpr_cv_broadcast() on the corresponding - condition variable. The predicate must be on state protected by the - lock. */ - while (q->length == 0 && !gpr_cv_wait(&q->non_empty, &q->mu, abs_deadline)) { - } - if (q->length != 0) { /* Queue is non-empty. */ - result = 1; - if (q->length == N) { /* Wake threads blocked in queue_append(). */ - gpr_cv_broadcast(&q->non_full); - } - *head = q->elem[q->head]; - q->head = (q->head + 1) % N; - q->length--; - } /* else deadline exceeded */ - gpr_mu_unlock(&q->mu); - return result; -} - -/* ------------------------------------------------- */ -/* Tests for gpr_mu and gpr_cv, and the queue example. */ -struct test { - int threads; /* number of threads */ - - int64_t iterations; /* number of iterations per thread */ - int64_t counter; - int thread_count; /* used to allocate thread ids */ - int done; /* threads not yet completed */ - int incr_step; /* how much to increment/decrement refcount each time */ - - gpr_mu mu; /* protects iterations, counter, thread_count, done */ - - gpr_cv cv; /* signalling depends on test */ - - gpr_cv done_cv; /* signalled when done == 0 */ - - queue q; - - gpr_stats_counter stats_counter; - - gpr_refcount refcount; - gpr_refcount thread_refcount; - gpr_event event; -}; - -/* Return pointer to a new struct test. */ -static struct test* test_new(int threads, int64_t iterations, int incr_step) { - struct test* m = static_cast(gpr_malloc(sizeof(*m))); - m->threads = threads; - m->iterations = iterations; - m->counter = 0; - m->thread_count = 0; - m->done = threads; - m->incr_step = incr_step; - gpr_mu_init(&m->mu); - gpr_cv_init(&m->cv); - gpr_cv_init(&m->done_cv); - queue_init(&m->q); - gpr_stats_init(&m->stats_counter, 0); - gpr_ref_init(&m->refcount, 0); - gpr_ref_init(&m->thread_refcount, threads); - gpr_event_init(&m->event); - return m; -} - -/* Return pointer to a new struct test. */ -static void test_destroy(struct test* m) { - gpr_mu_destroy(&m->mu); - gpr_cv_destroy(&m->cv); - gpr_cv_destroy(&m->done_cv); - queue_destroy(&m->q); - gpr_free(m); -} - -/* Create m->threads threads, each running (*body)(m) */ -static void test_create_threads(struct test* m, void (*body)(void* arg)) { - gpr_thd_id id; - int i; - for (i = 0; i != m->threads; i++) { - GPR_ASSERT(gpr_thd_new(&id, "grpc_create_threads", body, m, nullptr)); - } -} - -/* Wait until all threads report done. */ -static void test_wait(struct test* m) { - gpr_mu_lock(&m->mu); - while (m->done != 0) { - gpr_cv_wait(&m->done_cv, &m->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } - gpr_mu_unlock(&m->mu); -} - -/* Get an integer thread id in the raneg 0..threads-1 */ -static int thread_id(struct test* m) { - int id; - gpr_mu_lock(&m->mu); - id = m->thread_count++; - gpr_mu_unlock(&m->mu); - return id; -} - -/* Indicate that a thread is done, by decrementing m->done - and signalling done_cv if m->done==0. */ -static void mark_thread_done(struct test* m) { - gpr_mu_lock(&m->mu); - GPR_ASSERT(m->done != 0); - m->done--; - if (m->done == 0) { - gpr_cv_signal(&m->done_cv); - } - gpr_mu_unlock(&m->mu); -} - -/* Test several threads running (*body)(struct test *m) for increasing settings - of m->iterations, until about timeout_s to 2*timeout_s seconds have elapsed. - If extra!=NULL, run (*extra)(m) in an additional thread. - incr_step controls by how much m->refcount should be incremented/decremented - (if at all) each time in the tests. - */ -static void test(const char* name, void (*body)(void* m), - void (*extra)(void* m), int timeout_s, int incr_step) { - int64_t iterations = 256; - struct test* m; - gpr_timespec start = gpr_now(GPR_CLOCK_REALTIME); - gpr_timespec time_taken; - gpr_timespec deadline = gpr_time_add( - start, gpr_time_from_micros((int64_t)timeout_s * 1000000, GPR_TIMESPAN)); - fprintf(stderr, "%s:", name); - fflush(stderr); - while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0) { - fprintf(stderr, " %ld", (long)iterations); - fflush(stderr); - m = test_new(10, iterations, incr_step); - if (extra != nullptr) { - gpr_thd_id id; - GPR_ASSERT(gpr_thd_new(&id, name, extra, m, nullptr)); - m->done++; /* one more thread to wait for */ - } - test_create_threads(m, body); - test_wait(m); - if (m->counter != m->threads * m->iterations * m->incr_step) { - fprintf(stderr, "counter %ld threads %d iterations %ld\n", - (long)m->counter, m->threads, (long)m->iterations); - fflush(stderr); - GPR_ASSERT(0); - } - test_destroy(m); - iterations <<= 1; - } - time_taken = gpr_time_sub(gpr_now(GPR_CLOCK_REALTIME), start); - fprintf(stderr, " done %lld.%09d s\n", (long long)time_taken.tv_sec, - (int)time_taken.tv_nsec); - fflush(stderr); -} - -/* Increment m->counter on each iteration; then mark thread as done. */ -static void inc(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - gpr_mu_lock(&m->mu); - m->counter++; - gpr_mu_unlock(&m->mu); - } - mark_thread_done(m); -} - -/* Increment m->counter under lock acquired with trylock, m->iterations times; - then mark thread as done. */ -static void inctry(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations;) { - if (gpr_mu_trylock(&m->mu)) { - m->counter++; - gpr_mu_unlock(&m->mu); - i++; - } - } - mark_thread_done(m); -} - -/* Increment counter only when (m->counter%m->threads)==m->thread_id; then mark - thread as done. */ -static void inc_by_turns(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - int id = thread_id(m); - for (i = 0; i != m->iterations; i++) { - gpr_mu_lock(&m->mu); - while ((m->counter % m->threads) != id) { - gpr_cv_wait(&m->cv, &m->mu, gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } - m->counter++; - gpr_cv_broadcast(&m->cv); - gpr_mu_unlock(&m->mu); - } - mark_thread_done(m); -} - -/* Wait a millisecond and increment counter on each iteration; - then mark thread as done. */ -static void inc_with_1ms_delay(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - gpr_timespec deadline; - gpr_mu_lock(&m->mu); - deadline = gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), - gpr_time_from_micros(1000, GPR_TIMESPAN)); - while (!gpr_cv_wait(&m->cv, &m->mu, deadline)) { - } - m->counter++; - gpr_mu_unlock(&m->mu); - } - mark_thread_done(m); -} - -/* Wait a millisecond and increment counter on each iteration, using an event - for timing; then mark thread as done. */ -static void inc_with_1ms_delay_event(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - gpr_timespec deadline; - deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), - gpr_time_from_micros(1000, GPR_TIMESPAN)); - GPR_ASSERT(gpr_event_wait(&m->event, deadline) == nullptr); - gpr_mu_lock(&m->mu); - m->counter++; - gpr_mu_unlock(&m->mu); - } - mark_thread_done(m); -} - -/* Produce m->iterations elements on queue m->q, then mark thread as done. - Even threads use queue_append(), and odd threads use queue_try_append() - until it succeeds. */ -static void many_producers(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - int x = thread_id(m); - if ((x & 1) == 0) { - for (i = 0; i != m->iterations; i++) { - queue_append(&m->q, 1); - } - } else { - for (i = 0; i != m->iterations; i++) { - while (!queue_try_append(&m->q, 1)) { - } - } - } - mark_thread_done(m); -} - -/* Consume elements from m->q until m->threads*m->iterations are seen, - wait an extra second to confirm that no more elements are arriving, - then mark thread as done. */ -static void consumer(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t n = m->iterations * m->threads; - int64_t i; - int value; - for (i = 0; i != n; i++) { - queue_remove(&m->q, &value, gpr_inf_future(GPR_CLOCK_MONOTONIC)); - } - gpr_mu_lock(&m->mu); - m->counter = n; - gpr_mu_unlock(&m->mu); - GPR_ASSERT( - !queue_remove(&m->q, &value, - gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC), - gpr_time_from_micros(1000000, GPR_TIMESPAN)))); - mark_thread_done(m); -} - -/* Increment m->stats_counter m->iterations times, transfer counter value to - m->counter, then mark thread as done. */ -static void statsinc(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - gpr_stats_inc(&m->stats_counter, 1); - } - gpr_mu_lock(&m->mu); - m->counter = gpr_stats_read(&m->stats_counter); - gpr_mu_unlock(&m->mu); - mark_thread_done(m); -} - -/* Increment m->refcount by m->incr_step for m->iterations times. Decrement - m->thread_refcount once, and if it reaches zero, set m->event to (void*)1; - then mark thread as done. */ -static void refinc(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t i; - for (i = 0; i != m->iterations; i++) { - if (m->incr_step == 1) { - gpr_ref(&m->refcount); - } else { - gpr_refn(&m->refcount, m->incr_step); - } - } - if (gpr_unref(&m->thread_refcount)) { - gpr_event_set(&m->event, (void*)1); - } - mark_thread_done(m); -} - -/* Wait until m->event is set to (void *)1, then decrement m->refcount by 1 - (m->threads * m->iterations * m->incr_step) times, and ensure that the last - decrement caused the counter to reach zero, then mark thread as done. */ -static void refcheck(void* v /*=m*/) { - struct test* m = static_cast(v); - int64_t n = m->iterations * m->threads * m->incr_step; - int64_t i; - GPR_ASSERT(gpr_event_wait(&m->event, gpr_inf_future(GPR_CLOCK_REALTIME)) == - (void*)1); - GPR_ASSERT(gpr_event_get(&m->event) == (void*)1); - for (i = 1; i != n; i++) { - GPR_ASSERT(!gpr_unref(&m->refcount)); - m->counter++; - } - GPR_ASSERT(gpr_unref(&m->refcount)); - m->counter++; - mark_thread_done(m); -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - test("mutex", &inc, nullptr, 1, 1); - test("mutex try", &inctry, nullptr, 1, 1); - test("cv", &inc_by_turns, nullptr, 1, 1); - test("timedcv", &inc_with_1ms_delay, nullptr, 1, 1); - test("queue", &many_producers, &consumer, 10, 1); - test("stats_counter", &statsinc, nullptr, 1, 1); - test("refcount by 1", &refinc, &refcheck, 1, 1); - test("refcount by 3", &refinc, &refcheck, 1, 3); /* incr_step of 3 is an - arbitrary choice. Any - number > 1 is okay here */ - test("timedevent", &inc_with_1ms_delay_event, nullptr, 1, 1); - return 0; -} diff --git a/test/core/support/thd_test.cc b/test/core/support/thd_test.cc deleted file mode 100644 index b755bf18f3..0000000000 --- a/test/core/support/thd_test.cc +++ /dev/null @@ -1,102 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr thread support. */ - -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -#define NUM_THREADS 300 - -struct test { - gpr_mu mu; - int n; - int is_done; - gpr_cv done_cv; -}; - -/* A Thread body. Decrement t->n, and if is becomes zero, set t->done. */ -static void thd_body(void* v) { - struct test* t = static_cast(v); - gpr_mu_lock(&t->mu); - t->n--; - if (t->n == 0) { - t->is_done = 1; - gpr_cv_signal(&t->done_cv); - } - gpr_mu_unlock(&t->mu); -} - -static void thd_body_joinable(void* v) {} - -/* Test thread options work as expected */ -static void test_options(void) { - gpr_thd_options options = gpr_thd_options_default(); - GPR_ASSERT(!gpr_thd_options_is_joinable(&options)); - GPR_ASSERT(gpr_thd_options_is_detached(&options)); - gpr_thd_options_set_joinable(&options); - GPR_ASSERT(gpr_thd_options_is_joinable(&options)); - GPR_ASSERT(!gpr_thd_options_is_detached(&options)); - gpr_thd_options_set_detached(&options); - GPR_ASSERT(!gpr_thd_options_is_joinable(&options)); - GPR_ASSERT(gpr_thd_options_is_detached(&options)); -} - -/* Test that we can create a number of threads and wait for them. */ -static void test(void) { - int i; - gpr_thd_id thd; - gpr_thd_id thds[NUM_THREADS]; - struct test t; - gpr_thd_options options = gpr_thd_options_default(); - gpr_mu_init(&t.mu); - gpr_cv_init(&t.done_cv); - t.n = NUM_THREADS; - t.is_done = 0; - for (i = 0; i < NUM_THREADS; i++) { - GPR_ASSERT(gpr_thd_new(&thd, "grpc_thread_test", &thd_body, &t, nullptr)); - } - gpr_mu_lock(&t.mu); - while (!t.is_done) { - gpr_cv_wait(&t.done_cv, &t.mu, gpr_inf_future(GPR_CLOCK_REALTIME)); - } - gpr_mu_unlock(&t.mu); - GPR_ASSERT(t.n == 0); - gpr_thd_options_set_joinable(&options); - for (i = 0; i < NUM_THREADS; i++) { - GPR_ASSERT(gpr_thd_new(&thds[i], "grpc_joinable_thread_test", - &thd_body_joinable, nullptr, &options)); - } - for (i = 0; i < NUM_THREADS; i++) { - gpr_thd_join(thds[i]); - } -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - test_options(); - test(); - return 0; -} diff --git a/test/core/support/time_test.cc b/test/core/support/time_test.cc deleted file mode 100644 index b2b4dce58e..0000000000 --- a/test/core/support/time_test.cc +++ /dev/null @@ -1,266 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr time support. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -static void to_fp(void* arg, const char* buf, size_t len) { - fwrite(buf, 1, len, (FILE*)arg); -} - -/* Convert gpr_intmax x to ascii base b (2..16), and write with - (*writer)(arg, ...), zero padding to "chars" digits). */ -static void i_to_s(intmax_t x, int base, int chars, - void (*writer)(void* arg, const char* buf, size_t len), - void* arg) { - char buf[64]; - char fmt[32]; - GPR_ASSERT(base == 16 || base == 10); - sprintf(fmt, "%%0%d%s", chars, base == 16 ? PRIxMAX : PRIdMAX); - sprintf(buf, fmt, x); - (*writer)(arg, buf, strlen(buf)); -} - -/* Convert ts to ascii, and write with (*writer)(arg, ...). */ -static void ts_to_s(gpr_timespec t, - void (*writer)(void* arg, const char* buf, size_t len), - void* arg) { - if (t.tv_sec < 0 && t.tv_nsec != 0) { - t.tv_sec++; - t.tv_nsec = GPR_NS_PER_SEC - t.tv_nsec; - } - i_to_s(t.tv_sec, 10, 0, writer, arg); - (*writer)(arg, ".", 1); - i_to_s(t.tv_nsec, 10, 9, writer, arg); -} - -static void test_values(void) { - int i; - - gpr_timespec x = gpr_time_0(GPR_CLOCK_REALTIME); - GPR_ASSERT(x.tv_sec == 0 && x.tv_nsec == 0); - - x = gpr_inf_future(GPR_CLOCK_REALTIME); - fprintf(stderr, "far future "); - fflush(stderr); - i_to_s(x.tv_sec, 16, 16, &to_fp, stderr); - fprintf(stderr, "\n"); - GPR_ASSERT(x.tv_sec == INT64_MAX); - fprintf(stderr, "far future "); - fflush(stderr); - ts_to_s(x, &to_fp, stderr); - fprintf(stderr, "\n"); - fflush(stderr); - - x = gpr_inf_past(GPR_CLOCK_REALTIME); - fprintf(stderr, "far past "); - fflush(stderr); - i_to_s(x.tv_sec, 16, 16, &to_fp, stderr); - fprintf(stderr, "\n"); - fflush(stderr); - GPR_ASSERT(x.tv_sec == INT64_MIN); - fprintf(stderr, "far past "); - fflush(stderr); - ts_to_s(x, &to_fp, stderr); - fprintf(stderr, "\n"); - fflush(stderr); - - for (i = 1; i != 1000 * 1000 * 1000; i *= 10) { - x = gpr_time_from_micros(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec == i / GPR_US_PER_SEC && - x.tv_nsec == (i % GPR_US_PER_SEC) * GPR_NS_PER_US); - x = gpr_time_from_nanos(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec == i / GPR_NS_PER_SEC && - x.tv_nsec == (i % GPR_NS_PER_SEC)); - x = gpr_time_from_millis(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec == i / GPR_MS_PER_SEC && - x.tv_nsec == (i % GPR_MS_PER_SEC) * GPR_NS_PER_MS); - } - - /* Test possible overflow in conversion of -ve values. */ - x = gpr_time_from_micros(-(INT64_MAX - 999997), GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); - - x = gpr_time_from_nanos(-(INT64_MAX - 999999997), GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); - - x = gpr_time_from_millis(-(INT64_MAX - 997), GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); - - /* Test general -ve values. */ - for (i = -1; i > -1000 * 1000 * 1000; i *= 7) { - x = gpr_time_from_micros(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec * GPR_US_PER_SEC + x.tv_nsec / GPR_NS_PER_US == i); - x = gpr_time_from_nanos(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec * GPR_NS_PER_SEC + x.tv_nsec == i); - x = gpr_time_from_millis(i, GPR_TIMESPAN); - GPR_ASSERT(x.tv_sec * GPR_MS_PER_SEC + x.tv_nsec / GPR_NS_PER_MS == i); - } -} - -static void test_add_sub(void) { - int i; - int j; - int k; - /* Basic addition and subtraction. */ - for (i = -100; i <= 100; i++) { - for (j = -100; j <= 100; j++) { - for (k = 1; k <= 10000000; k *= 10) { - int sum = i + j; - int diff = i - j; - gpr_timespec it = gpr_time_from_micros(i * k, GPR_TIMESPAN); - gpr_timespec jt = gpr_time_from_micros(j * k, GPR_TIMESPAN); - gpr_timespec sumt = gpr_time_add(it, jt); - gpr_timespec difft = gpr_time_sub(it, jt); - if (gpr_time_cmp(gpr_time_from_micros(sum * k, GPR_TIMESPAN), sumt) != - 0) { - fprintf(stderr, "i %d j %d sum %d sumt ", i, j, sum); - fflush(stderr); - ts_to_s(sumt, &to_fp, stderr); - fprintf(stderr, "\n"); - fflush(stderr); - GPR_ASSERT(0); - } - if (gpr_time_cmp(gpr_time_from_micros(diff * k, GPR_TIMESPAN), difft) != - 0) { - fprintf(stderr, "i %d j %d diff %d diff ", i, j, diff); - fflush(stderr); - ts_to_s(sumt, &to_fp, stderr); - fprintf(stderr, "\n"); - fflush(stderr); - GPR_ASSERT(0); - } - } - } - } -} - -static void test_overflow(void) { - /* overflow */ - gpr_timespec x = gpr_time_from_micros(1, GPR_TIMESPAN); - do { - x = gpr_time_add(x, x); - } while (gpr_time_cmp(x, gpr_inf_future(GPR_TIMESPAN)) < 0); - GPR_ASSERT(gpr_time_cmp(x, gpr_inf_future(GPR_TIMESPAN)) == 0); - x = gpr_time_from_micros(-1, GPR_TIMESPAN); - do { - x = gpr_time_add(x, x); - } while (gpr_time_cmp(x, gpr_inf_past(GPR_TIMESPAN)) > 0); - GPR_ASSERT(gpr_time_cmp(x, gpr_inf_past(GPR_TIMESPAN)) == 0); -} - -static void test_sticky_infinities(void) { - int i; - int j; - int k; - gpr_timespec infinity[2]; - gpr_timespec addend[3]; - infinity[0] = gpr_inf_future(GPR_TIMESPAN); - infinity[1] = gpr_inf_past(GPR_TIMESPAN); - addend[0] = gpr_inf_future(GPR_TIMESPAN); - addend[1] = gpr_inf_past(GPR_TIMESPAN); - addend[2] = gpr_time_0(GPR_TIMESPAN); - - /* Infinities are sticky */ - for (i = 0; i != sizeof(infinity) / sizeof(infinity[0]); i++) { - for (j = 0; j != sizeof(addend) / sizeof(addend[0]); j++) { - gpr_timespec x = gpr_time_add(infinity[i], addend[j]); - GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); - x = gpr_time_sub(infinity[i], addend[j]); - GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); - } - for (k = -200; k <= 200; k++) { - gpr_timespec y = gpr_time_from_micros(k * 100000, GPR_TIMESPAN); - gpr_timespec x = gpr_time_add(infinity[i], y); - GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); - x = gpr_time_sub(infinity[i], y); - GPR_ASSERT(gpr_time_cmp(x, infinity[i]) == 0); - } - } -} - -static void test_similar(void) { - GPR_ASSERT(1 == gpr_time_similar(gpr_inf_future(GPR_TIMESPAN), - gpr_inf_future(GPR_TIMESPAN), - gpr_time_0(GPR_TIMESPAN))); - GPR_ASSERT(1 == gpr_time_similar(gpr_inf_past(GPR_TIMESPAN), - gpr_inf_past(GPR_TIMESPAN), - gpr_time_0(GPR_TIMESPAN))); - GPR_ASSERT(0 == gpr_time_similar(gpr_inf_past(GPR_TIMESPAN), - gpr_inf_future(GPR_TIMESPAN), - gpr_time_0(GPR_TIMESPAN))); - GPR_ASSERT(0 == gpr_time_similar(gpr_inf_future(GPR_TIMESPAN), - gpr_inf_past(GPR_TIMESPAN), - gpr_time_0(GPR_TIMESPAN))); - GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_0(GPR_TIMESPAN))); - GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_from_micros(15, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN))); - GPR_ASSERT(1 == gpr_time_similar(gpr_time_from_micros(15, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN))); - GPR_ASSERT(0 == gpr_time_similar(gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_from_micros(25, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN))); - GPR_ASSERT(0 == gpr_time_similar(gpr_time_from_micros(25, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN), - gpr_time_from_micros(10, GPR_TIMESPAN))); -} - -static void test_convert_extreme(void) { - gpr_timespec realtime = {INT64_MAX, 1, GPR_CLOCK_REALTIME}; - gpr_timespec monotime = gpr_convert_clock_type(realtime, GPR_CLOCK_MONOTONIC); - GPR_ASSERT(monotime.tv_sec == realtime.tv_sec); - GPR_ASSERT(monotime.clock_type == GPR_CLOCK_MONOTONIC); -} - -static void test_cmp_extreme(void) { - gpr_timespec t1 = {INT64_MAX, 1, GPR_CLOCK_REALTIME}; - gpr_timespec t2 = {INT64_MAX, 2, GPR_CLOCK_REALTIME}; - GPR_ASSERT(gpr_time_cmp(t1, t2) == 0); - t1.tv_sec = INT64_MIN; - t2.tv_sec = INT64_MIN; - GPR_ASSERT(gpr_time_cmp(t1, t2) == 0); -} - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - - test_values(); - test_add_sub(); - test_overflow(); - test_sticky_infinities(); - test_similar(); - test_convert_extreme(); - test_cmp_extreme(); - return 0; -} diff --git a/test/core/support/tls_test.cc b/test/core/support/tls_test.cc deleted file mode 100644 index 743b10f090..0000000000 --- a/test/core/support/tls_test.cc +++ /dev/null @@ -1,68 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr thread local storage support. */ - -#include -#include -#include -#include -#include -#include -#include "test/core/util/test_config.h" - -#define NUM_THREADS 100 - -GPR_TLS_DECL(test_var); - -static void thd_body(void* arg) { - intptr_t i; - - GPR_ASSERT(gpr_tls_get(&test_var) == 0); - - for (i = 0; i < 100000; i++) { - gpr_tls_set(&test_var, i); - GPR_ASSERT(gpr_tls_get(&test_var) == i); - } - gpr_tls_set(&test_var, 0); -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - gpr_thd_options opt = gpr_thd_options_default(); - int i; - gpr_thd_id threads[NUM_THREADS]; - - grpc_test_init(argc, argv); - - gpr_tls_init(&test_var); - - gpr_thd_options_set_joinable(&opt); - - for (i = 0; i < NUM_THREADS; i++) { - gpr_thd_new(&threads[i], "grpc_tls_test", thd_body, nullptr, &opt); - } - for (i = 0; i < NUM_THREADS; i++) { - gpr_thd_join(threads[i]); - } - - gpr_tls_destroy(&test_var); - - return 0; -} diff --git a/test/core/support/useful_test.cc b/test/core/support/useful_test.cc deleted file mode 100644 index 2f86010d77..0000000000 --- a/test/core/support/useful_test.cc +++ /dev/null @@ -1,58 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include -#include -#include "test/core/util/test_config.h" - -int main(int argc, char** argv) { - int four[4]; - int five[5]; - uint32_t bitset = 0; - grpc_test_init(argc, argv); - - GPR_ASSERT(GPR_MIN(1, 2) == 1); - GPR_ASSERT(GPR_MAX(1, 2) == 2); - GPR_ASSERT(GPR_MIN(2, 1) == 1); - GPR_ASSERT(GPR_MAX(2, 1) == 2); - GPR_ASSERT(GPR_CLAMP(1, 0, 2) == 1); - GPR_ASSERT(GPR_CLAMP(0, 0, 2) == 0); - GPR_ASSERT(GPR_CLAMP(2, 0, 2) == 2); - GPR_ASSERT(GPR_CLAMP(-1, 0, 2) == 0); - GPR_ASSERT(GPR_CLAMP(3, 0, 2) == 2); - GPR_ASSERT(GPR_ROTL((uint32_t)0x80000001, 1) == 3); - GPR_ASSERT(GPR_ROTR((uint32_t)0x80000001, 1) == 0xc0000000); - GPR_ASSERT(GPR_ARRAY_SIZE(four) == 4); - GPR_ASSERT(GPR_ARRAY_SIZE(five) == 5); - - GPR_ASSERT(GPR_BITCOUNT((1u << 31) - 1) == 31); - GPR_ASSERT(GPR_BITCOUNT(1u << 3) == 1); - GPR_ASSERT(GPR_BITCOUNT(0) == 0); - - GPR_ASSERT(GPR_BITSET(&bitset, 3) == 8); - GPR_ASSERT(GPR_BITCOUNT(bitset) == 1); - GPR_ASSERT(GPR_BITGET(bitset, 3) == 1); - GPR_ASSERT(GPR_BITSET(&bitset, 1) == 10); - GPR_ASSERT(GPR_BITCOUNT(bitset) == 2); - GPR_ASSERT(GPR_BITCLEAR(&bitset, 3) == 2); - GPR_ASSERT(GPR_BITCOUNT(bitset) == 1); - GPR_ASSERT(GPR_BITGET(bitset, 3) == 0); - - return 0; -} diff --git a/test/core/support/vector_test.cc b/test/core/support/vector_test.cc deleted file mode 100644 index 82607a1b26..0000000000 --- a/test/core/support/vector_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/support/vector.h" -#include -#include "src/core/lib/support/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -TEST(InlinedVectorTest, CreateAndIterate) { - const int kNumElements = 9; - InlinedVector v; - for (int i = 0; i < kNumElements; ++i) { - v.push_back(i); - } - EXPECT_EQ(static_cast(kNumElements), v.size()); - for (int i = 0; i < kNumElements; ++i) { - EXPECT_EQ(i, v[i]); - } -} - -TEST(InlinedVectorTest, ValuesAreInlined) { - const int kNumElements = 5; - InlinedVector v; - for (int i = 0; i < kNumElements; ++i) { - v.push_back(i); - } - EXPECT_EQ(static_cast(kNumElements), v.size()); - for (int i = 0; i < kNumElements; ++i) { - EXPECT_EQ(i, v[i]); - } -} - -TEST(InlinedVectorTest, PushBackWithMove) { - InlinedVector, 1> v; - UniquePtr i = MakeUnique(3); - v.push_back(std::move(i)); - EXPECT_EQ(nullptr, i.get()); - EXPECT_EQ(1UL, v.size()); - EXPECT_EQ(3, *v[0]); -} - -TEST(InlinedVectorTest, EmplaceBack) { - InlinedVector, 1> v; - v.emplace_back(New(3)); - EXPECT_EQ(1UL, v.size()); - EXPECT_EQ(3, *v[0]); -} - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/transport/bdp_estimator_test.cc b/test/core/transport/bdp_estimator_test.cc index 445823b628..3afcad7f17 100644 --- a/test/core/transport/bdp_estimator_test.cc +++ b/test/core/transport/bdp_estimator_test.cc @@ -25,8 +25,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/timer_manager.h" -#include "src/core/lib/support/string.h" #include "test/core/util/test_config.h" extern gpr_timespec (*gpr_now_impl)(gpr_clock_type clock_type); diff --git a/test/core/transport/chttp2/bin_decoder_test.cc b/test/core/transport/chttp2/bin_decoder_test.cc index 6d70a4261b..283eebbacf 100644 --- a/test/core/transport/chttp2/bin_decoder_test.cc +++ b/test/core/transport/chttp2/bin_decoder_test.cc @@ -24,9 +24,9 @@ #include #include #include "src/core/ext/transport/chttp2/transport/bin_encoder.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" static int all_ok = 1; diff --git a/test/core/transport/chttp2/bin_encoder_test.cc b/test/core/transport/chttp2/bin_encoder_test.cc index 44f5de8a50..bd62b0e479 100644 --- a/test/core/transport/chttp2/bin_encoder_test.cc +++ b/test/core/transport/chttp2/bin_encoder_test.cc @@ -26,8 +26,8 @@ #include #include #include +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" static int all_ok = 1; diff --git a/test/core/transport/chttp2/hpack_encoder_test.cc b/test/core/transport/chttp2/hpack_encoder_test.cc index d2dbd4a798..a40bd643ec 100644 --- a/test/core/transport/chttp2/hpack_encoder_test.cc +++ b/test/core/transport/chttp2/hpack_encoder_test.cc @@ -26,9 +26,9 @@ #include #include "src/core/ext/transport/chttp2/transport/hpack_parser.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" #include "src/core/lib/slice/slice_string_helpers.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/metadata.h" #include "test/core/util/parse_hexstring.h" #include "test/core/util/slice_splitter.h" diff --git a/test/core/transport/chttp2/hpack_table_test.cc b/test/core/transport/chttp2/hpack_table_test.cc index 3f3cb2ee9d..e316cf63a0 100644 --- a/test/core/transport/chttp2/hpack_table_test.cc +++ b/test/core/transport/chttp2/hpack_table_test.cc @@ -26,7 +26,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/test_config.h" #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x) diff --git a/test/core/transport/metadata_test.cc b/test/core/transport/metadata_test.cc index 5c52ae8d5f..7d943fd5c7 100644 --- a/test/core/transport/metadata_test.cc +++ b/test/core/transport/metadata_test.cc @@ -27,8 +27,8 @@ #include #include "src/core/ext/transport/chttp2/transport/bin_encoder.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/slice/slice_internal.h" -#include "src/core/lib/support/string.h" #include "src/core/lib/transport/static_metadata.h" #include "test/core/util/test_config.h" diff --git a/test/core/transport/pid_controller_test.cc b/test/core/transport/pid_controller_test.cc index 081d03472a..1a499c2fb7 100644 --- a/test/core/transport/pid_controller_test.cc +++ b/test/core/transport/pid_controller_test.cc @@ -26,7 +26,7 @@ #include #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/test_config.h" namespace grpc_core { diff --git a/test/core/transport/timeout_encoding_test.cc b/test/core/transport/timeout_encoding_test.cc index 0930bc836d..e94be138dd 100644 --- a/test/core/transport/timeout_encoding_test.cc +++ b/test/core/transport/timeout_encoding_test.cc @@ -25,8 +25,8 @@ #include #include #include -#include "src/core/lib/support/murmur_hash.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/murmur_hash.h" +#include "src/core/lib/gpr/string.h" #include "test/core/util/test_config.h" #define LOG_TEST(x) gpr_log(GPR_INFO, "%s", x) diff --git a/test/core/tsi/transport_security_test.cc b/test/core/tsi/transport_security_test.cc index c788ad96ad..42e17df25d 100644 --- a/test/core/tsi/transport_security_test.cc +++ b/test/core/tsi/transport_security_test.cc @@ -27,7 +27,7 @@ #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/tsi/fake_transport_security.h" #include "src/core/tsi/ssl_transport_security.h" #include "test/core/util/test_config.h" diff --git a/test/core/util/test_config.cc b/test/core/util/test_config.cc index 9ebb52d83e..6b410440c2 100644 --- a/test/core/util/test_config.cc +++ b/test/core/util/test_config.cc @@ -27,8 +27,8 @@ #include #include -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" int64_t g_fixture_slowdown_factor = 1; int64_t g_poller_slowdown_factor = 1; diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc index 1ea087e706..44cd81a6a4 100644 --- a/test/cpp/end2end/async_end2end_test.cc +++ b/test/cpp/end2end/async_end2end_test.cc @@ -34,8 +34,8 @@ #include #include +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/port.h" -#include "src/core/lib/support/env.h" #include "src/proto/grpc/health/v1/health.grpc.pb.h" #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index 5a7e52e9e9..02f9f90417 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -37,7 +37,7 @@ #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" #include "src/core/ext/filters/client_channel/subchannel_index.h" #include "src/core/lib/backoff/backoff.h" -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/util/port.h" diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc index a6ea5aada9..e25de810f1 100644 --- a/test/cpp/end2end/end2end_test.cc +++ b/test/cpp/end2end/end2end_test.cc @@ -35,8 +35,8 @@ #include #include +#include "src/core/lib/gpr/env.h" #include "src/core/lib/security/credentials/credentials.h" -#include "src/core/lib/support/env.h" #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/util/port.h" diff --git a/test/cpp/end2end/grpclb_end2end_test.cc b/test/cpp/end2end/grpclb_end2end_test.cc index d4ee6b429f..815dfd0c4f 100644 --- a/test/cpp/end2end/grpclb_end2end_test.cc +++ b/test/cpp/end2end/grpclb_end2end_test.cc @@ -34,8 +34,8 @@ #include #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" +#include "src/core/lib/gpr/env.h" #include "src/core/lib/iomgr/sockaddr.h" -#include "src/core/lib/support/env.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/cpp/end2end/shutdown_test.cc b/test/cpp/end2end/shutdown_test.cc index 14ba7c96cc..9119102f7a 100644 --- a/test/cpp/end2end/shutdown_test.cc +++ b/test/cpp/end2end/shutdown_test.cc @@ -28,7 +28,7 @@ #include #include -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "src/proto/grpc/testing/echo.grpc.pb.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/cpp/grpclb/grpclb_test.cc b/test/cpp/grpclb/grpclb_test.cc index 38b65fbc78..d241594af1 100644 --- a/test/cpp/grpclb/grpclb_test.cc +++ b/test/cpp/grpclb/grpclb_test.cc @@ -40,11 +40,11 @@ #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" +#include "src/core/lib/gpr/tmpfile.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/security/credentials/fake/fake_credentials.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" -#include "src/core/lib/support/tmpfile.h" #include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/server.h" #include "test/core/end2end/cq_verifier.h" diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc index 716fb96382..8958b9884d 100644 --- a/test/cpp/interop/client.cc +++ b/test/cpp/interop/client.cc @@ -27,7 +27,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/cpp/interop/client_helper.h" #include "test/cpp/interop/interop_client.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/interop/http2_client.cc b/test/cpp/interop/http2_client.cc index 2de7abcf17..7a9e3ced6a 100644 --- a/test/cpp/interop/http2_client.cc +++ b/test/cpp/interop/http2_client.cc @@ -30,7 +30,7 @@ #include "src/proto/grpc/testing/test.grpc.pb.h" #include "test/cpp/interop/http2_client.h" -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "test/cpp/util/create_test_channel.h" #include "test/cpp/util/test_config.h" diff --git a/test/cpp/interop/interop_server.cc b/test/cpp/interop/interop_server.cc index 30bd8bfef8..7cfdb2f9e9 100644 --- a/test/cpp/interop/interop_server.cc +++ b/test/cpp/interop/interop_server.cc @@ -31,7 +31,7 @@ #include #include -#include "src/core/lib/support/string.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/transport/byte_stream.h" #include "src/proto/grpc/testing/empty.pb.h" #include "src/proto/grpc/testing/messages.pb.h" diff --git a/test/cpp/interop/interop_test.cc b/test/cpp/interop/interop_test.cc index 1bf0d8d10f..563b7abb5e 100644 --- a/test/cpp/interop/interop_test.cc +++ b/test/cpp/interop/interop_test.cc @@ -37,8 +37,8 @@ #include "test/core/util/port.h" #include "test/cpp/util/test_config.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/socket_utils_posix.h" -#include "src/core/lib/support/string.h" DEFINE_string(extra_server_flags, "", "Extra flags to pass to server."); diff --git a/test/cpp/microbenchmarks/bm_arena.cc b/test/cpp/microbenchmarks/bm_arena.cc index 5b7c611919..69c8c1c029 100644 --- a/test/cpp/microbenchmarks/bm_arena.cc +++ b/test/cpp/microbenchmarks/bm_arena.cc @@ -18,7 +18,7 @@ /* Benchmark arenas */ -#include "src/core/lib/support/arena.h" +#include "src/core/lib/gpr/arena.h" #include "test/cpp/microbenchmarks/helpers.h" #include "third_party/benchmark/include/benchmark/benchmark.h" diff --git a/test/cpp/microbenchmarks/bm_closure.cc b/test/cpp/microbenchmarks/bm_closure.cc index 4d5a82c3f6..6d88faecc0 100644 --- a/test/cpp/microbenchmarks/bm_closure.cc +++ b/test/cpp/microbenchmarks/bm_closure.cc @@ -22,10 +22,10 @@ #include #include +#include "src/core/lib/gpr/spinlock.h" #include "src/core/lib/iomgr/closure.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/support/spinlock.h" #include "test/cpp/microbenchmarks/helpers.h" diff --git a/test/cpp/naming/resolver_component_test.cc b/test/cpp/naming/resolver_component_test.cc index 3481d9d1aa..8b5523f01a 100644 --- a/test/cpp/naming/resolver_component_test.cc +++ b/test/cpp/naming/resolver_component_test.cc @@ -37,13 +37,13 @@ #include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h" #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/channel/channel_args.h" +#include "src/core/lib/gpr/env.h" +#include "src/core/lib/gpr/string.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/executor.h" #include "src/core/lib/iomgr/iomgr.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/sockaddr_utils.h" -#include "src/core/lib/support/env.h" -#include "src/core/lib/support/string.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/cpp/naming/resolver_component_tests_runner_invoker.cc b/test/cpp/naming/resolver_component_tests_runner_invoker.cc index 0beb27de1b..65f11243fe 100644 --- a/test/cpp/naming/resolver_component_tests_runner_invoker.cc +++ b/test/cpp/naming/resolver_component_tests_runner_invoker.cc @@ -32,7 +32,7 @@ #include "test/cpp/util/subprocess.h" #include "test/cpp/util/test_config.h" -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "test/core/util/port.h" DEFINE_bool( diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc index 22d039d4b7..2f765a6d1e 100644 --- a/test/cpp/qps/driver.cc +++ b/test/cpp/qps/driver.cc @@ -31,8 +31,8 @@ #include #include +#include "src/core/lib/gpr/env.h" #include "src/core/lib/profiling/timers.h" -#include "src/core/lib/support/env.h" #include "src/proto/grpc/testing/services.grpc.pb.h" #include "test/core/util/port.h" #include "test/core/util/test_config.h" diff --git a/test/cpp/qps/json_run_localhost.cc b/test/cpp/qps/json_run_localhost.cc index db8b2a3943..948c3088e6 100644 --- a/test/cpp/qps/json_run_localhost.cc +++ b/test/cpp/qps/json_run_localhost.cc @@ -26,7 +26,7 @@ #include -#include "src/core/lib/support/env.h" +#include "src/core/lib/gpr/env.h" #include "test/core/util/port.h" #include "test/cpp/util/subprocess.h" diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 85bbeed088..55b10268ba 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -950,6 +950,28 @@ src/core/lib/compression/stream_compression_identity.h \ src/core/lib/debug/stats.h \ src/core/lib/debug/stats_data.h \ src/core/lib/debug/trace.h \ +src/core/lib/gpr++/abstract.h \ +src/core/lib/gpr++/atomic.h \ +src/core/lib/gpr++/atomic_with_atm.h \ +src/core/lib/gpr++/atomic_with_std.h \ +src/core/lib/gpr++/debug_location.h \ +src/core/lib/gpr++/inlined_vector.h \ +src/core/lib/gpr++/manual_constructor.h \ +src/core/lib/gpr++/memory.h \ +src/core/lib/gpr++/orphanable.h \ +src/core/lib/gpr++/ref_counted.h \ +src/core/lib/gpr++/ref_counted_ptr.h \ +src/core/lib/gpr/arena.h \ +src/core/lib/gpr/env.h \ +src/core/lib/gpr/fork.h \ +src/core/lib/gpr/mpscq.h \ +src/core/lib/gpr/murmur_hash.h \ +src/core/lib/gpr/spinlock.h \ +src/core/lib/gpr/string.h \ +src/core/lib/gpr/string_windows.h \ +src/core/lib/gpr/thd_internal.h \ +src/core/lib/gpr/time_precise.h \ +src/core/lib/gpr/tmpfile.h \ src/core/lib/http/format_request.h \ src/core/lib/http/httpcli.h \ src/core/lib/http/parser.h \ @@ -1026,28 +1048,6 @@ src/core/lib/slice/percent_encoding.h \ src/core/lib/slice/slice_hash_table.h \ src/core/lib/slice/slice_internal.h \ src/core/lib/slice/slice_string_helpers.h \ -src/core/lib/support/abstract.h \ -src/core/lib/support/arena.h \ -src/core/lib/support/atomic.h \ -src/core/lib/support/atomic_with_atm.h \ -src/core/lib/support/atomic_with_std.h \ -src/core/lib/support/debug_location.h \ -src/core/lib/support/env.h \ -src/core/lib/support/fork.h \ -src/core/lib/support/manual_constructor.h \ -src/core/lib/support/memory.h \ -src/core/lib/support/mpscq.h \ -src/core/lib/support/murmur_hash.h \ -src/core/lib/support/orphanable.h \ -src/core/lib/support/ref_counted.h \ -src/core/lib/support/ref_counted_ptr.h \ -src/core/lib/support/spinlock.h \ -src/core/lib/support/string.h \ -src/core/lib/support/string_windows.h \ -src/core/lib/support/thd_internal.h \ -src/core/lib/support/time_precise.h \ -src/core/lib/support/tmpfile.h \ -src/core/lib/support/vector.h \ src/core/lib/surface/alarm_internal.h \ src/core/lib/surface/api_trace.h \ src/core/lib/surface/call.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 4bf0fc74d1..7857ec72fd 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1064,6 +1064,72 @@ src/core/lib/debug/stats_data.cc \ src/core/lib/debug/stats_data.h \ src/core/lib/debug/trace.cc \ src/core/lib/debug/trace.h \ +src/core/lib/gpr++/README.md \ +src/core/lib/gpr++/abstract.h \ +src/core/lib/gpr++/atomic.h \ +src/core/lib/gpr++/atomic_with_atm.h \ +src/core/lib/gpr++/atomic_with_std.h \ +src/core/lib/gpr++/debug_location.h \ +src/core/lib/gpr++/inlined_vector.h \ +src/core/lib/gpr++/manual_constructor.h \ +src/core/lib/gpr++/memory.h \ +src/core/lib/gpr++/orphanable.h \ +src/core/lib/gpr++/ref_counted.h \ +src/core/lib/gpr++/ref_counted_ptr.h \ +src/core/lib/gpr/README.md \ +src/core/lib/gpr/alloc.cc \ +src/core/lib/gpr/arena.cc \ +src/core/lib/gpr/arena.h \ +src/core/lib/gpr/atm.cc \ +src/core/lib/gpr/avl.cc \ +src/core/lib/gpr/cmdline.cc \ +src/core/lib/gpr/cpu_iphone.cc \ +src/core/lib/gpr/cpu_linux.cc \ +src/core/lib/gpr/cpu_posix.cc \ +src/core/lib/gpr/cpu_windows.cc \ +src/core/lib/gpr/env.h \ +src/core/lib/gpr/env_linux.cc \ +src/core/lib/gpr/env_posix.cc \ +src/core/lib/gpr/env_windows.cc \ +src/core/lib/gpr/fork.cc \ +src/core/lib/gpr/fork.h \ +src/core/lib/gpr/host_port.cc \ +src/core/lib/gpr/log.cc \ +src/core/lib/gpr/log_android.cc \ +src/core/lib/gpr/log_linux.cc \ +src/core/lib/gpr/log_posix.cc \ +src/core/lib/gpr/log_windows.cc \ +src/core/lib/gpr/mpscq.cc \ +src/core/lib/gpr/mpscq.h \ +src/core/lib/gpr/murmur_hash.cc \ +src/core/lib/gpr/murmur_hash.h \ +src/core/lib/gpr/spinlock.h \ +src/core/lib/gpr/string.cc \ +src/core/lib/gpr/string.h \ +src/core/lib/gpr/string_posix.cc \ +src/core/lib/gpr/string_util_windows.cc \ +src/core/lib/gpr/string_windows.cc \ +src/core/lib/gpr/string_windows.h \ +src/core/lib/gpr/subprocess_posix.cc \ +src/core/lib/gpr/subprocess_windows.cc \ +src/core/lib/gpr/sync.cc \ +src/core/lib/gpr/sync_posix.cc \ +src/core/lib/gpr/sync_windows.cc \ +src/core/lib/gpr/thd.cc \ +src/core/lib/gpr/thd_internal.h \ +src/core/lib/gpr/thd_posix.cc \ +src/core/lib/gpr/thd_windows.cc \ +src/core/lib/gpr/time.cc \ +src/core/lib/gpr/time_posix.cc \ +src/core/lib/gpr/time_precise.cc \ +src/core/lib/gpr/time_precise.h \ +src/core/lib/gpr/time_windows.cc \ +src/core/lib/gpr/tls_pthread.cc \ +src/core/lib/gpr/tmpfile.h \ +src/core/lib/gpr/tmpfile_msys.cc \ +src/core/lib/gpr/tmpfile_posix.cc \ +src/core/lib/gpr/tmpfile_windows.cc \ +src/core/lib/gpr/wrap_memcpy.cc \ src/core/lib/http/format_request.cc \ src/core/lib/http/format_request.h \ src/core/lib/http/httpcli.cc \ @@ -1271,70 +1337,6 @@ src/core/lib/slice/slice_intern.cc \ src/core/lib/slice/slice_internal.h \ src/core/lib/slice/slice_string_helpers.cc \ src/core/lib/slice/slice_string_helpers.h \ -src/core/lib/support/abstract.h \ -src/core/lib/support/alloc.cc \ -src/core/lib/support/arena.cc \ -src/core/lib/support/arena.h \ -src/core/lib/support/atm.cc \ -src/core/lib/support/atomic.h \ -src/core/lib/support/atomic_with_atm.h \ -src/core/lib/support/atomic_with_std.h \ -src/core/lib/support/avl.cc \ -src/core/lib/support/cmdline.cc \ -src/core/lib/support/cpu_iphone.cc \ -src/core/lib/support/cpu_linux.cc \ -src/core/lib/support/cpu_posix.cc \ -src/core/lib/support/cpu_windows.cc \ -src/core/lib/support/debug_location.h \ -src/core/lib/support/env.h \ -src/core/lib/support/env_linux.cc \ -src/core/lib/support/env_posix.cc \ -src/core/lib/support/env_windows.cc \ -src/core/lib/support/fork.cc \ -src/core/lib/support/fork.h \ -src/core/lib/support/host_port.cc \ -src/core/lib/support/log.cc \ -src/core/lib/support/log_android.cc \ -src/core/lib/support/log_linux.cc \ -src/core/lib/support/log_posix.cc \ -src/core/lib/support/log_windows.cc \ -src/core/lib/support/manual_constructor.h \ -src/core/lib/support/memory.h \ -src/core/lib/support/mpscq.cc \ -src/core/lib/support/mpscq.h \ -src/core/lib/support/murmur_hash.cc \ -src/core/lib/support/murmur_hash.h \ -src/core/lib/support/orphanable.h \ -src/core/lib/support/ref_counted.h \ -src/core/lib/support/ref_counted_ptr.h \ -src/core/lib/support/spinlock.h \ -src/core/lib/support/string.cc \ -src/core/lib/support/string.h \ -src/core/lib/support/string_posix.cc \ -src/core/lib/support/string_util_windows.cc \ -src/core/lib/support/string_windows.cc \ -src/core/lib/support/string_windows.h \ -src/core/lib/support/subprocess_posix.cc \ -src/core/lib/support/subprocess_windows.cc \ -src/core/lib/support/sync.cc \ -src/core/lib/support/sync_posix.cc \ -src/core/lib/support/sync_windows.cc \ -src/core/lib/support/thd.cc \ -src/core/lib/support/thd_internal.h \ -src/core/lib/support/thd_posix.cc \ -src/core/lib/support/thd_windows.cc \ -src/core/lib/support/time.cc \ -src/core/lib/support/time_posix.cc \ -src/core/lib/support/time_precise.cc \ -src/core/lib/support/time_precise.h \ -src/core/lib/support/time_windows.cc \ -src/core/lib/support/tls_pthread.cc \ -src/core/lib/support/tmpfile.h \ -src/core/lib/support/tmpfile_msys.cc \ -src/core/lib/support/tmpfile_posix.cc \ -src/core/lib/support/tmpfile_windows.cc \ -src/core/lib/support/vector.h \ -src/core/lib/support/wrap_memcpy.cc \ src/core/lib/surface/README.md \ src/core/lib/surface/alarm.cc \ src/core/lib/surface/alarm_internal.h \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index df45489d5e..982d9ef649 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -45,7 +45,7 @@ "language": "c", "name": "alloc_test", "src": [ - "test/core/support/alloc_test.cc" + "test/core/gpr/alloc_test.cc" ], "third_party": false, "type": "target" @@ -94,7 +94,7 @@ "language": "c", "name": "arena_test", "src": [ - "test/core/support/arena_test.cc" + "test/core/gpr/arena_test.cc" ], "third_party": false, "type": "target" @@ -597,7 +597,7 @@ "language": "c", "name": "gpr_avl_test", "src": [ - "test/core/support/avl_test.cc" + "test/core/gpr/avl_test.cc" ], "third_party": false, "type": "target" @@ -612,7 +612,7 @@ "language": "c", "name": "gpr_cmdline_test", "src": [ - "test/core/support/cmdline_test.cc" + "test/core/gpr/cmdline_test.cc" ], "third_party": false, "type": "target" @@ -627,7 +627,7 @@ "language": "c", "name": "gpr_cpu_test", "src": [ - "test/core/support/cpu_test.cc" + "test/core/gpr/cpu_test.cc" ], "third_party": false, "type": "target" @@ -642,7 +642,7 @@ "language": "c", "name": "gpr_env_test", "src": [ - "test/core/support/env_test.cc" + "test/core/gpr/env_test.cc" ], "third_party": false, "type": "target" @@ -657,7 +657,7 @@ "language": "c", "name": "gpr_host_port_test", "src": [ - "test/core/support/host_port_test.cc" + "test/core/gpr/host_port_test.cc" ], "third_party": false, "type": "target" @@ -672,7 +672,7 @@ "language": "c", "name": "gpr_log_test", "src": [ - "test/core/support/log_test.cc" + "test/core/gpr/log_test.cc" ], "third_party": false, "type": "target" @@ -687,7 +687,7 @@ "language": "c", "name": "gpr_manual_constructor_test", "src": [ - "test/core/support/manual_constructor_test.cc" + "test/core/gpr++/manual_constructor_test.cc" ], "third_party": false, "type": "target" @@ -702,7 +702,7 @@ "language": "c", "name": "gpr_mpscq_test", "src": [ - "test/core/support/mpscq_test.cc" + "test/core/gpr/mpscq_test.cc" ], "third_party": false, "type": "target" @@ -717,7 +717,7 @@ "language": "c", "name": "gpr_spinlock_test", "src": [ - "test/core/support/spinlock_test.cc" + "test/core/gpr/spinlock_test.cc" ], "third_party": false, "type": "target" @@ -732,7 +732,7 @@ "language": "c", "name": "gpr_string_test", "src": [ - "test/core/support/string_test.cc" + "test/core/gpr/string_test.cc" ], "third_party": false, "type": "target" @@ -747,7 +747,7 @@ "language": "c", "name": "gpr_sync_test", "src": [ - "test/core/support/sync_test.cc" + "test/core/gpr/sync_test.cc" ], "third_party": false, "type": "target" @@ -762,7 +762,7 @@ "language": "c", "name": "gpr_thd_test", "src": [ - "test/core/support/thd_test.cc" + "test/core/gpr/thd_test.cc" ], "third_party": false, "type": "target" @@ -777,7 +777,7 @@ "language": "c", "name": "gpr_time_test", "src": [ - "test/core/support/time_test.cc" + "test/core/gpr/time_test.cc" ], "third_party": false, "type": "target" @@ -792,7 +792,7 @@ "language": "c", "name": "gpr_tls_test", "src": [ - "test/core/support/tls_test.cc" + "test/core/gpr/tls_test.cc" ], "third_party": false, "type": "target" @@ -807,7 +807,7 @@ "language": "c", "name": "gpr_useful_test", "src": [ - "test/core/support/useful_test.cc" + "test/core/gpr/useful_test.cc" ], "third_party": false, "type": "target" @@ -1636,7 +1636,7 @@ "language": "c", "name": "murmur_hash_test", "src": [ - "test/core/support/murmur_hash_test.cc" + "test/core/gpr/murmur_hash_test.cc" ], "third_party": false, "type": "target" @@ -3528,6 +3528,25 @@ "third_party": false, "type": "target" }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc++", + "grpc++_test", + "grpc_test_util" + ], + "headers": [], + "is_filegroup": false, + "language": "c++", + "name": "inlined_vector_test", + "src": [ + "test/core/gpr++/inlined_vector_test.cc" + ], + "third_party": false, + "type": "target" + }, { "deps": [ "gpr", @@ -3643,7 +3662,7 @@ "language": "c++", "name": "memory_test", "src": [ - "test/core/support/memory_test.cc" + "test/core/gpr++/memory_test.cc" ], "third_party": false, "type": "target" @@ -3721,7 +3740,7 @@ "language": "c++", "name": "orphanable_test", "src": [ - "test/core/support/orphanable_test.cc" + "test/core/gpr++/orphanable_test.cc" ], "third_party": false, "type": "target" @@ -3932,7 +3951,7 @@ "language": "c++", "name": "ref_counted_ptr_test", "src": [ - "test/core/support/ref_counted_ptr_test.cc" + "test/core/gpr++/ref_counted_ptr_test.cc" ], "third_party": false, "type": "target" @@ -3951,7 +3970,7 @@ "language": "c++", "name": "ref_counted_test", "src": [ - "test/core/support/ref_counted_test.cc" + "test/core/gpr++/ref_counted_test.cc" ], "third_party": false, "type": "target" @@ -4300,25 +4319,6 @@ "third_party": false, "type": "target" }, - { - "deps": [ - "gpr", - "gpr_test_util", - "grpc", - "grpc++", - "grpc++_test", - "grpc_test_util" - ], - "headers": [], - "is_filegroup": false, - "language": "c++", - "name": "vector_test", - "src": [ - "test/core/support/vector_test.cc" - ], - "third_party": false, - "type": "target" - }, { "deps": [ "gpr", @@ -7827,50 +7827,50 @@ "language": "c", "name": "gpr_base", "src": [ + "src/core/lib/gpr/alloc.cc", + "src/core/lib/gpr/arena.cc", + "src/core/lib/gpr/atm.cc", + "src/core/lib/gpr/avl.cc", + "src/core/lib/gpr/cmdline.cc", + "src/core/lib/gpr/cpu_iphone.cc", + "src/core/lib/gpr/cpu_linux.cc", + "src/core/lib/gpr/cpu_posix.cc", + "src/core/lib/gpr/cpu_windows.cc", + "src/core/lib/gpr/env_linux.cc", + "src/core/lib/gpr/env_posix.cc", + "src/core/lib/gpr/env_windows.cc", + "src/core/lib/gpr/fork.cc", + "src/core/lib/gpr/host_port.cc", + "src/core/lib/gpr/log.cc", + "src/core/lib/gpr/log_android.cc", + "src/core/lib/gpr/log_linux.cc", + "src/core/lib/gpr/log_posix.cc", + "src/core/lib/gpr/log_windows.cc", + "src/core/lib/gpr/mpscq.cc", + "src/core/lib/gpr/murmur_hash.cc", + "src/core/lib/gpr/string.cc", + "src/core/lib/gpr/string_posix.cc", + "src/core/lib/gpr/string_util_windows.cc", + "src/core/lib/gpr/string_windows.cc", + "src/core/lib/gpr/subprocess_posix.cc", + "src/core/lib/gpr/subprocess_windows.cc", + "src/core/lib/gpr/sync.cc", + "src/core/lib/gpr/sync_posix.cc", + "src/core/lib/gpr/sync_windows.cc", + "src/core/lib/gpr/thd.cc", + "src/core/lib/gpr/thd_posix.cc", + "src/core/lib/gpr/thd_windows.cc", + "src/core/lib/gpr/time.cc", + "src/core/lib/gpr/time_posix.cc", + "src/core/lib/gpr/time_precise.cc", + "src/core/lib/gpr/time_windows.cc", + "src/core/lib/gpr/tls_pthread.cc", + "src/core/lib/gpr/tmpfile_msys.cc", + "src/core/lib/gpr/tmpfile_posix.cc", + "src/core/lib/gpr/tmpfile_windows.cc", + "src/core/lib/gpr/wrap_memcpy.cc", "src/core/lib/profiling/basic_timers.cc", - "src/core/lib/profiling/stap_timers.cc", - "src/core/lib/support/alloc.cc", - "src/core/lib/support/arena.cc", - "src/core/lib/support/atm.cc", - "src/core/lib/support/avl.cc", - "src/core/lib/support/cmdline.cc", - "src/core/lib/support/cpu_iphone.cc", - "src/core/lib/support/cpu_linux.cc", - "src/core/lib/support/cpu_posix.cc", - "src/core/lib/support/cpu_windows.cc", - "src/core/lib/support/env_linux.cc", - "src/core/lib/support/env_posix.cc", - "src/core/lib/support/env_windows.cc", - "src/core/lib/support/fork.cc", - "src/core/lib/support/host_port.cc", - "src/core/lib/support/log.cc", - "src/core/lib/support/log_android.cc", - "src/core/lib/support/log_linux.cc", - "src/core/lib/support/log_posix.cc", - "src/core/lib/support/log_windows.cc", - "src/core/lib/support/mpscq.cc", - "src/core/lib/support/murmur_hash.cc", - "src/core/lib/support/string.cc", - "src/core/lib/support/string_posix.cc", - "src/core/lib/support/string_util_windows.cc", - "src/core/lib/support/string_windows.cc", - "src/core/lib/support/subprocess_posix.cc", - "src/core/lib/support/subprocess_windows.cc", - "src/core/lib/support/sync.cc", - "src/core/lib/support/sync_posix.cc", - "src/core/lib/support/sync_windows.cc", - "src/core/lib/support/thd.cc", - "src/core/lib/support/thd_posix.cc", - "src/core/lib/support/thd_windows.cc", - "src/core/lib/support/time.cc", - "src/core/lib/support/time_posix.cc", - "src/core/lib/support/time_precise.cc", - "src/core/lib/support/time_windows.cc", - "src/core/lib/support/tls_pthread.cc", - "src/core/lib/support/tmpfile_msys.cc", - "src/core/lib/support/tmpfile_posix.cc", - "src/core/lib/support/tmpfile_windows.cc", - "src/core/lib/support/wrap_memcpy.cc" + "src/core/lib/profiling/stap_timers.cc" ], "third_party": false, "type": "filegroup" @@ -7906,24 +7906,24 @@ "include/grpc/support/tls_msvc.h", "include/grpc/support/tls_pthread.h", "include/grpc/support/useful.h", - "src/core/lib/profiling/timers.h", - "src/core/lib/support/abstract.h", - "src/core/lib/support/arena.h", - "src/core/lib/support/atomic.h", - "src/core/lib/support/atomic_with_atm.h", - "src/core/lib/support/atomic_with_std.h", - "src/core/lib/support/env.h", - "src/core/lib/support/fork.h", - "src/core/lib/support/manual_constructor.h", - "src/core/lib/support/memory.h", - "src/core/lib/support/mpscq.h", - "src/core/lib/support/murmur_hash.h", - "src/core/lib/support/spinlock.h", - "src/core/lib/support/string.h", - "src/core/lib/support/string_windows.h", - "src/core/lib/support/thd_internal.h", - "src/core/lib/support/time_precise.h", - "src/core/lib/support/tmpfile.h" + "src/core/lib/gpr++/abstract.h", + "src/core/lib/gpr++/atomic.h", + "src/core/lib/gpr++/atomic_with_atm.h", + "src/core/lib/gpr++/atomic_with_std.h", + "src/core/lib/gpr++/manual_constructor.h", + "src/core/lib/gpr++/memory.h", + "src/core/lib/gpr/arena.h", + "src/core/lib/gpr/env.h", + "src/core/lib/gpr/fork.h", + "src/core/lib/gpr/mpscq.h", + "src/core/lib/gpr/murmur_hash.h", + "src/core/lib/gpr/spinlock.h", + "src/core/lib/gpr/string.h", + "src/core/lib/gpr/string_windows.h", + "src/core/lib/gpr/thd_internal.h", + "src/core/lib/gpr/time_precise.h", + "src/core/lib/gpr/tmpfile.h", + "src/core/lib/profiling/timers.h" ], "is_filegroup": true, "language": "c", @@ -7955,24 +7955,24 @@ "include/grpc/support/tls_msvc.h", "include/grpc/support/tls_pthread.h", "include/grpc/support/useful.h", - "src/core/lib/profiling/timers.h", - "src/core/lib/support/abstract.h", - "src/core/lib/support/arena.h", - "src/core/lib/support/atomic.h", - "src/core/lib/support/atomic_with_atm.h", - "src/core/lib/support/atomic_with_std.h", - "src/core/lib/support/env.h", - "src/core/lib/support/fork.h", - "src/core/lib/support/manual_constructor.h", - "src/core/lib/support/memory.h", - "src/core/lib/support/mpscq.h", - "src/core/lib/support/murmur_hash.h", - "src/core/lib/support/spinlock.h", - "src/core/lib/support/string.h", - "src/core/lib/support/string_windows.h", - "src/core/lib/support/thd_internal.h", - "src/core/lib/support/time_precise.h", - "src/core/lib/support/tmpfile.h" + "src/core/lib/gpr++/abstract.h", + "src/core/lib/gpr++/atomic.h", + "src/core/lib/gpr++/atomic_with_atm.h", + "src/core/lib/gpr++/atomic_with_std.h", + "src/core/lib/gpr++/manual_constructor.h", + "src/core/lib/gpr++/memory.h", + "src/core/lib/gpr/arena.h", + "src/core/lib/gpr/env.h", + "src/core/lib/gpr/fork.h", + "src/core/lib/gpr/mpscq.h", + "src/core/lib/gpr/murmur_hash.h", + "src/core/lib/gpr/spinlock.h", + "src/core/lib/gpr/string.h", + "src/core/lib/gpr/string_windows.h", + "src/core/lib/gpr/thd_internal.h", + "src/core/lib/gpr/time_precise.h", + "src/core/lib/gpr/tmpfile.h", + "src/core/lib/profiling/timers.h" ], "third_party": false, "type": "filegroup" @@ -8229,6 +8229,11 @@ "src/core/lib/compression/stream_compression_identity.h", "src/core/lib/debug/stats.h", "src/core/lib/debug/stats_data.h", + "src/core/lib/gpr++/debug_location.h", + "src/core/lib/gpr++/inlined_vector.h", + "src/core/lib/gpr++/orphanable.h", + "src/core/lib/gpr++/ref_counted.h", + "src/core/lib/gpr++/ref_counted_ptr.h", "src/core/lib/http/format_request.h", "src/core/lib/http/httpcli.h", "src/core/lib/http/parser.h", @@ -8304,11 +8309,6 @@ "src/core/lib/slice/slice_hash_table.h", "src/core/lib/slice/slice_internal.h", "src/core/lib/slice/slice_string_helpers.h", - "src/core/lib/support/debug_location.h", - "src/core/lib/support/orphanable.h", - "src/core/lib/support/ref_counted.h", - "src/core/lib/support/ref_counted_ptr.h", - "src/core/lib/support/vector.h", "src/core/lib/surface/alarm_internal.h", "src/core/lib/surface/api_trace.h", "src/core/lib/surface/call.h", @@ -8370,6 +8370,11 @@ "src/core/lib/compression/stream_compression_identity.h", "src/core/lib/debug/stats.h", "src/core/lib/debug/stats_data.h", + "src/core/lib/gpr++/debug_location.h", + "src/core/lib/gpr++/inlined_vector.h", + "src/core/lib/gpr++/orphanable.h", + "src/core/lib/gpr++/ref_counted.h", + "src/core/lib/gpr++/ref_counted_ptr.h", "src/core/lib/http/format_request.h", "src/core/lib/http/httpcli.h", "src/core/lib/http/parser.h", @@ -8445,11 +8450,6 @@ "src/core/lib/slice/slice_hash_table.h", "src/core/lib/slice/slice_internal.h", "src/core/lib/slice/slice_string_helpers.h", - "src/core/lib/support/debug_location.h", - "src/core/lib/support/orphanable.h", - "src/core/lib/support/ref_counted.h", - "src/core/lib/support/ref_counted_ptr.h", - "src/core/lib/support/vector.h", "src/core/lib/surface/alarm_internal.h", "src/core/lib/surface/api_trace.h", "src/core/lib/surface/call.h", diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json index dc2b39eb21..7b23cab506 100644 --- a/tools/run_tests/generated/tests.json +++ b/tools/run_tests/generated/tests.json @@ -3961,6 +3961,30 @@ ], "uses_polling": true }, + { + "args": [], + "benchmark": false, + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "cpu_cost": 1.0, + "exclude_configs": [], + "exclude_iomgrs": [], + "flaky": false, + "gtest": true, + "language": "c++", + "name": "inlined_vector_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ], + "uses_polling": true + }, { "args": [], "benchmark": false, @@ -4552,30 +4576,6 @@ ], "uses_polling": true }, - { - "args": [], - "benchmark": false, - "ci_platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "cpu_cost": 1.0, - "exclude_configs": [], - "exclude_iomgrs": [], - "flaky": false, - "gtest": true, - "language": "c++", - "name": "vector_test", - "platforms": [ - "linux", - "mac", - "posix", - "windows" - ], - "uses_polling": true - }, { "args": [], "benchmark": false, diff --git a/tools/run_tests/sanity/core_banned_functions.py b/tools/run_tests/sanity/core_banned_functions.py index 9ee28964a5..989990542e 100755 --- a/tools/run_tests/sanity/core_banned_functions.py +++ b/tools/run_tests/sanity/core_banned_functions.py @@ -42,8 +42,8 @@ BANNED_EXCEPT = { 'grpc_closure_run(': ['src/core/lib/iomgr/closure.c'], 'grpc_closure_list_sched(': ['src/core/lib/iomgr/closure.c'], 'gpr_getenv_silent(': [ - 'src/core/lib/support/log.c', 'src/core/lib/support/env_linux.c', - 'src/core/lib/support/env_posix.c', 'src/core/lib/support/env_windows.c' + 'src/core/lib/gpr/log.c', 'src/core/lib/gpr/env_linux.c', + 'src/core/lib/gpr/env_posix.c', 'src/core/lib/gpr/env_windows.c' ], } -- cgit v1.2.3 From 4f2b0fdadfb1e1eb6c796c40ec5aabfbb348aa89 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 19 Jan 2018 12:12:23 -0800 Subject: Rename 'gpr++' directories to 'gprpp'. --- BUILD | 30 +-- CMakeLists.txt | 12 +- Makefile | 24 +-- build.yaml | 34 ++-- gRPC-Core.podspec | 48 ++--- grpc.gemspec | 22 +-- package.xml | 22 +-- src/core/ext/filters/client_channel/lb_policy.h | 2 +- .../client_channel/lb_policy/grpclb/grpclb.cc | 2 +- .../lb_policy/round_robin/round_robin.cc | 2 +- .../client_channel/lb_policy/subchannel_list.h | 2 +- .../resolver/dns/c_ares/dns_resolver_ares.cc | 2 +- .../resolver/dns/native/dns_resolver.cc | 2 +- src/core/ext/filters/client_channel/subchannel.cc | 4 +- src/core/ext/filters/client_channel/subchannel.h | 4 +- .../ext/transport/chttp2/transport/flow_control.h | 4 +- src/core/ext/transport/chttp2/transport/internal.h | 2 +- src/core/lib/gpr++/README.md | 16 -- src/core/lib/gpr++/abstract.h | 34 ---- src/core/lib/gpr++/atomic.h | 30 --- src/core/lib/gpr++/atomic_with_atm.h | 55 ------ src/core/lib/gpr++/atomic_with_std.h | 33 ---- src/core/lib/gpr++/debug_location.h | 52 ----- src/core/lib/gpr++/inlined_vector.h | 112 ----------- src/core/lib/gpr++/manual_constructor.h | 211 --------------------- src/core/lib/gpr++/memory.h | 100 ---------- src/core/lib/gpr++/orphanable.h | 171 ----------------- src/core/lib/gpr++/ref_counted.h | 133 ------------- src/core/lib/gpr++/ref_counted_ptr.h | 99 ---------- src/core/lib/gprpp/README.md | 16 ++ src/core/lib/gprpp/abstract.h | 34 ++++ src/core/lib/gprpp/atomic.h | 30 +++ src/core/lib/gprpp/atomic_with_atm.h | 55 ++++++ src/core/lib/gprpp/atomic_with_std.h | 33 ++++ src/core/lib/gprpp/debug_location.h | 52 +++++ src/core/lib/gprpp/inlined_vector.h | 112 +++++++++++ src/core/lib/gprpp/manual_constructor.h | 211 +++++++++++++++++++++ src/core/lib/gprpp/memory.h | 100 ++++++++++ src/core/lib/gprpp/orphanable.h | 171 +++++++++++++++++ src/core/lib/gprpp/ref_counted.h | 133 +++++++++++++ src/core/lib/gprpp/ref_counted_ptr.h | 99 ++++++++++ src/core/lib/iomgr/ev_epoll1_linux.cc | 2 +- src/core/lib/iomgr/ev_epollex_linux.cc | 2 +- src/core/lib/iomgr/ev_epollsig_linux.cc | 2 +- src/core/lib/surface/lame_client.cc | 2 +- test/core/gpr++/BUILD | 95 ---------- test/core/gpr++/inlined_vector_test.cc | 74 -------- test/core/gpr++/manual_constructor_test.cc | 99 ---------- test/core/gpr++/memory_test.cc | 74 -------- test/core/gpr++/orphanable_test.cc | 114 ----------- test/core/gpr++/ref_counted_ptr_test.cc | 185 ------------------ test/core/gpr++/ref_counted_test.cc | 74 -------- test/core/gprpp/BUILD | 96 ++++++++++ test/core/gprpp/inlined_vector_test.cc | 74 ++++++++ test/core/gprpp/manual_constructor_test.cc | 99 ++++++++++ test/core/gprpp/memory_test.cc | 74 ++++++++ test/core/gprpp/orphanable_test.cc | 114 +++++++++++ test/core/gprpp/ref_counted_ptr_test.cc | 185 ++++++++++++++++++ test/core/gprpp/ref_counted_test.cc | 74 ++++++++ tools/doxygen/Doxyfile.c++.internal | 22 +-- tools/doxygen/Doxyfile.core.internal | 24 +-- tools/run_tests/generated/sources_and_headers.json | 56 +++--- 62 files changed, 1930 insertions(+), 1921 deletions(-) delete mode 100644 src/core/lib/gpr++/README.md delete mode 100644 src/core/lib/gpr++/abstract.h delete mode 100644 src/core/lib/gpr++/atomic.h delete mode 100644 src/core/lib/gpr++/atomic_with_atm.h delete mode 100644 src/core/lib/gpr++/atomic_with_std.h delete mode 100644 src/core/lib/gpr++/debug_location.h delete mode 100644 src/core/lib/gpr++/inlined_vector.h delete mode 100644 src/core/lib/gpr++/manual_constructor.h delete mode 100644 src/core/lib/gpr++/memory.h delete mode 100644 src/core/lib/gpr++/orphanable.h delete mode 100644 src/core/lib/gpr++/ref_counted.h delete mode 100644 src/core/lib/gpr++/ref_counted_ptr.h create mode 100644 src/core/lib/gprpp/README.md create mode 100644 src/core/lib/gprpp/abstract.h create mode 100644 src/core/lib/gprpp/atomic.h create mode 100644 src/core/lib/gprpp/atomic_with_atm.h create mode 100644 src/core/lib/gprpp/atomic_with_std.h create mode 100644 src/core/lib/gprpp/debug_location.h create mode 100644 src/core/lib/gprpp/inlined_vector.h create mode 100644 src/core/lib/gprpp/manual_constructor.h create mode 100644 src/core/lib/gprpp/memory.h create mode 100644 src/core/lib/gprpp/orphanable.h create mode 100644 src/core/lib/gprpp/ref_counted.h create mode 100644 src/core/lib/gprpp/ref_counted_ptr.h delete mode 100644 test/core/gpr++/BUILD delete mode 100644 test/core/gpr++/inlined_vector_test.cc delete mode 100644 test/core/gpr++/manual_constructor_test.cc delete mode 100644 test/core/gpr++/memory_test.cc delete mode 100644 test/core/gpr++/orphanable_test.cc delete mode 100644 test/core/gpr++/ref_counted_ptr_test.cc delete mode 100644 test/core/gpr++/ref_counted_test.cc create mode 100644 test/core/gprpp/BUILD create mode 100644 test/core/gprpp/inlined_vector_test.cc create mode 100644 test/core/gprpp/manual_constructor_test.cc create mode 100644 test/core/gprpp/memory_test.cc create mode 100644 test/core/gprpp/orphanable_test.cc create mode 100644 test/core/gprpp/ref_counted_ptr_test.cc create mode 100644 test/core/gprpp/ref_counted_test.cc (limited to 'BUILD') diff --git a/BUILD b/BUILD index c52a95cf91..603e4cc2c5 100644 --- a/BUILD +++ b/BUILD @@ -548,9 +548,9 @@ grpc_cc_library( name = "gpr++_base", language = "c++", public_hdrs = [ - "src/core/lib/gpr++/abstract.h", - "src/core/lib/gpr++/manual_constructor.h", - "src/core/lib/gpr++/memory.h", + "src/core/lib/gprpp/abstract.h", + "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/memory.h", ], ) @@ -558,11 +558,11 @@ grpc_cc_library( name = "atomic", language = "c++", public_hdrs = [ - "src/core/lib/gpr++/atomic.h", + "src/core/lib/gprpp/atomic.h", ], hdrs = [ - "src/core/lib/gpr++/atomic_with_atm.h", - "src/core/lib/gpr++/atomic_with_std.h", + "src/core/lib/gprpp/atomic_with_atm.h", + "src/core/lib/gprpp/atomic_with_std.h", ], deps = [ "gpr", @@ -573,22 +573,26 @@ grpc_cc_library( name = "inlined_vector", language = "c++", public_hdrs = [ - "src/core/lib/gpr++/inlined_vector.h", + "src/core/lib/gprpp/inlined_vector.h", + ], + deps = [ + "gpr++_base", ], ) grpc_cc_library( name = "debug_location", language = "c++", - public_hdrs = ["src/core/lib/gpr++/debug_location.h"], + public_hdrs = ["src/core/lib/gprpp/debug_location.h"], ) grpc_cc_library( name = "orphanable", language = "c++", - public_hdrs = ["src/core/lib/gpr++/orphanable.h"], + public_hdrs = ["src/core/lib/gprpp/orphanable.h"], deps = [ "debug_location", + "gpr++_base", "grpc_trace", ], ) @@ -596,9 +600,10 @@ grpc_cc_library( grpc_cc_library( name = "ref_counted", language = "c++", - public_hdrs = ["src/core/lib/gpr++/ref_counted.h"], + public_hdrs = ["src/core/lib/gprpp/ref_counted.h"], deps = [ "debug_location", + "gpr++_base", "grpc_trace", ], ) @@ -606,7 +611,10 @@ grpc_cc_library( grpc_cc_library( name = "ref_counted_ptr", language = "c++", - public_hdrs = ["src/core/lib/gpr++/ref_counted_ptr.h"], + public_hdrs = ["src/core/lib/gprpp/ref_counted_ptr.h"], + deps = [ + "gpr++_base", + ], ) grpc_cc_library( diff --git a/CMakeLists.txt b/CMakeLists.txt index 4450a73e9d..c3fc489b42 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5785,7 +5785,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(gpr_manual_constructor_test - test/core/gpr++/manual_constructor_test.cc + test/core/gprpp/manual_constructor_test.cc ) @@ -10556,7 +10556,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(inlined_vector_test - test/core/gpr++/inlined_vector_test.cc + test/core/gprpp/inlined_vector_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -10801,7 +10801,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(memory_test - test/core/gpr++/memory_test.cc + test/core/gprpp/memory_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -10952,7 +10952,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(orphanable_test - test/core/gpr++/orphanable_test.cc + test/core/gprpp/orphanable_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -11352,7 +11352,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(ref_counted_ptr_test - test/core/gpr++/ref_counted_ptr_test.cc + test/core/gprpp/ref_counted_ptr_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) @@ -11389,7 +11389,7 @@ endif (gRPC_BUILD_TESTS) if (gRPC_BUILD_TESTS) add_executable(ref_counted_test - test/core/gpr++/ref_counted_test.cc + test/core/gprpp/ref_counted_test.cc third_party/googletest/googletest/src/gtest-all.cc third_party/googletest/googlemock/src/gmock-all.cc ) diff --git a/Makefile b/Makefile index 69a68a6d66..8f79ff78c0 100644 --- a/Makefile +++ b/Makefile @@ -10049,7 +10049,7 @@ endif GPR_MANUAL_CONSTRUCTOR_TEST_SRC = \ - test/core/gpr++/manual_constructor_test.cc \ + test/core/gprpp/manual_constructor_test.cc \ GPR_MANUAL_CONSTRUCTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GPR_MANUAL_CONSTRUCTOR_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -10069,7 +10069,7 @@ $(BINDIR)/$(CONFIG)/gpr_manual_constructor_test: $(GPR_MANUAL_CONSTRUCTOR_TEST_O endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/manual_constructor_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/manual_constructor_test.o: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_gpr_manual_constructor_test: $(GPR_MANUAL_CONSTRUCTOR_TEST_OBJS:.o=.dep) @@ -15779,7 +15779,7 @@ endif INLINED_VECTOR_TEST_SRC = \ - test/core/gpr++/inlined_vector_test.cc \ + test/core/gprpp/inlined_vector_test.cc \ INLINED_VECTOR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(INLINED_VECTOR_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -15810,7 +15810,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/inlined_vector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/inlined_vector_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_inlined_vector_test: $(INLINED_VECTOR_TEST_OBJS:.o=.dep) @@ -16013,7 +16013,7 @@ endif MEMORY_TEST_SRC = \ - test/core/gpr++/memory_test.cc \ + test/core/gprpp/memory_test.cc \ MEMORY_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(MEMORY_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16044,7 +16044,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/memory_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/memory_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_memory_test: $(MEMORY_TEST_OBJS:.o=.dep) @@ -16190,7 +16190,7 @@ endif ORPHANABLE_TEST_SRC = \ - test/core/gpr++/orphanable_test.cc \ + test/core/gprpp/orphanable_test.cc \ ORPHANABLE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ORPHANABLE_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16221,7 +16221,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/orphanable_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_orphanable_test: $(ORPHANABLE_TEST_OBJS:.o=.dep) @@ -16597,7 +16597,7 @@ $(OBJDIR)/$(CONFIG)/test/cpp/interop/reconnect_interop_server.o: $(GENDIR)/src/p REF_COUNTED_PTR_TEST_SRC = \ - test/core/gpr++/ref_counted_ptr_test.cc \ + test/core/gprpp/ref_counted_ptr_test.cc \ REF_COUNTED_PTR_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_PTR_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16628,7 +16628,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/ref_counted_ptr_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/ref_counted_ptr_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_ref_counted_ptr_test: $(REF_COUNTED_PTR_TEST_OBJS:.o=.dep) @@ -16640,7 +16640,7 @@ endif REF_COUNTED_TEST_SRC = \ - test/core/gpr++/ref_counted_test.cc \ + test/core/gprpp/ref_counted_test.cc \ REF_COUNTED_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(REF_COUNTED_TEST_SRC)))) ifeq ($(NO_SECURE),true) @@ -16671,7 +16671,7 @@ endif endif -$(OBJDIR)/$(CONFIG)/test/core/gpr++/ref_counted_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/gprpp/ref_counted_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a deps_ref_counted_test: $(REF_COUNTED_TEST_OBJS:.o=.dep) diff --git a/build.yaml b/build.yaml index a8639a8b0b..5a16d7d701 100644 --- a/build.yaml +++ b/build.yaml @@ -101,12 +101,6 @@ filegroups: - include/grpc/support/tls_pthread.h - include/grpc/support/useful.h headers: - - src/core/lib/gpr++/abstract.h - - src/core/lib/gpr++/atomic.h - - src/core/lib/gpr++/atomic_with_atm.h - - src/core/lib/gpr++/atomic_with_std.h - - src/core/lib/gpr++/manual_constructor.h - - src/core/lib/gpr++/memory.h - src/core/lib/gpr/arena.h - src/core/lib/gpr/env.h - src/core/lib/gpr/fork.h @@ -118,6 +112,12 @@ filegroups: - src/core/lib/gpr/thd_internal.h - src/core/lib/gpr/time_precise.h - src/core/lib/gpr/tmpfile.h + - src/core/lib/gprpp/abstract.h + - src/core/lib/gprpp/atomic.h + - src/core/lib/gprpp/atomic_with_atm.h + - src/core/lib/gprpp/atomic_with_std.h + - src/core/lib/gprpp/manual_constructor.h + - src/core/lib/gprpp/memory.h - src/core/lib/profiling/timers.h uses: - gpr_codegen @@ -321,11 +321,11 @@ filegroups: - src/core/lib/compression/stream_compression_identity.h - src/core/lib/debug/stats.h - src/core/lib/debug/stats_data.h - - src/core/lib/gpr++/debug_location.h - - src/core/lib/gpr++/inlined_vector.h - - src/core/lib/gpr++/orphanable.h - - src/core/lib/gpr++/ref_counted.h - - src/core/lib/gpr++/ref_counted_ptr.h + - src/core/lib/gprpp/debug_location.h + - src/core/lib/gprpp/inlined_vector.h + - src/core/lib/gprpp/orphanable.h + - src/core/lib/gprpp/ref_counted.h + - src/core/lib/gprpp/ref_counted_ptr.h - src/core/lib/http/format_request.h - src/core/lib/http/httpcli.h - src/core/lib/http/parser.h @@ -2188,7 +2188,7 @@ targets: build: test language: c src: - - test/core/gpr++/manual_constructor_test.cc + - test/core/gprpp/manual_constructor_test.cc deps: - gpr_test_util - gpr @@ -4265,7 +4265,7 @@ targets: build: test language: c++ src: - - test/core/gpr++/inlined_vector_test.cc + - test/core/gprpp/inlined_vector_test.cc deps: - grpc_test_util - grpc++ @@ -4371,7 +4371,7 @@ targets: build: test language: c++ src: - - test/core/gpr++/memory_test.cc + - test/core/gprpp/memory_test.cc deps: - grpc_test_util - grpc++ @@ -4423,7 +4423,7 @@ targets: build: test language: c++ src: - - test/core/gpr++/orphanable_test.cc + - test/core/gprpp/orphanable_test.cc deps: - grpc_test_util - grpc++ @@ -4576,7 +4576,7 @@ targets: build: test language: c++ src: - - test/core/gpr++/ref_counted_ptr_test.cc + - test/core/gprpp/ref_counted_ptr_test.cc deps: - grpc_test_util - grpc++ @@ -4590,7 +4590,7 @@ targets: build: test language: c++ src: - - test/core/gpr++/ref_counted_test.cc + - test/core/gprpp/ref_counted_test.cc deps: - grpc_test_util - grpc++ diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index ccaa21194b..3ebd121e4c 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -192,13 +192,7 @@ Pod::Spec.new do |s| ss.dependency 'nanopb', '~> 0.3' # To save you from scrolling, this is the last part of the podspec. - ss.source_files = 'src/core/lib/gpr++/abstract.h', - 'src/core/lib/gpr++/atomic.h', - 'src/core/lib/gpr++/atomic_with_atm.h', - 'src/core/lib/gpr++/atomic_with_std.h', - 'src/core/lib/gpr++/manual_constructor.h', - 'src/core/lib/gpr++/memory.h', - 'src/core/lib/gpr/arena.h', + ss.source_files = 'src/core/lib/gpr/arena.h', 'src/core/lib/gpr/env.h', 'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/mpscq.h', @@ -209,6 +203,12 @@ Pod::Spec.new do |s| 'src/core/lib/gpr/thd_internal.h', 'src/core/lib/gpr/time_precise.h', 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gprpp/abstract.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/atomic_with_atm.h', + 'src/core/lib/gprpp/atomic_with_std.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/memory.h', 'src/core/lib/profiling/timers.h', 'src/core/lib/gpr/alloc.cc', 'src/core/lib/gpr/arena.cc', @@ -344,11 +344,11 @@ Pod::Spec.new do |s| 'src/core/lib/compression/stream_compression_identity.h', 'src/core/lib/debug/stats.h', 'src/core/lib/debug/stats_data.h', - 'src/core/lib/gpr++/debug_location.h', - 'src/core/lib/gpr++/inlined_vector.h', - 'src/core/lib/gpr++/orphanable.h', - 'src/core/lib/gpr++/ref_counted.h', - 'src/core/lib/gpr++/ref_counted_ptr.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/inlined_vector.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', 'src/core/lib/http/format_request.h', 'src/core/lib/http/httpcli.h', 'src/core/lib/http/parser.h', @@ -718,13 +718,7 @@ Pod::Spec.new do |s| 'src/core/ext/filters/workarounds/workaround_utils.cc', 'src/core/plugin_registry/grpc_plugin_registry.cc' - ss.private_header_files = 'src/core/lib/gpr++/abstract.h', - 'src/core/lib/gpr++/atomic.h', - 'src/core/lib/gpr++/atomic_with_atm.h', - 'src/core/lib/gpr++/atomic_with_std.h', - 'src/core/lib/gpr++/manual_constructor.h', - 'src/core/lib/gpr++/memory.h', - 'src/core/lib/gpr/arena.h', + ss.private_header_files = 'src/core/lib/gpr/arena.h', 'src/core/lib/gpr/env.h', 'src/core/lib/gpr/fork.h', 'src/core/lib/gpr/mpscq.h', @@ -735,6 +729,12 @@ Pod::Spec.new do |s| 'src/core/lib/gpr/thd_internal.h', 'src/core/lib/gpr/time_precise.h', 'src/core/lib/gpr/tmpfile.h', + 'src/core/lib/gprpp/abstract.h', + 'src/core/lib/gprpp/atomic.h', + 'src/core/lib/gprpp/atomic_with_atm.h', + 'src/core/lib/gprpp/atomic_with_std.h', + 'src/core/lib/gprpp/manual_constructor.h', + 'src/core/lib/gprpp/memory.h', 'src/core/lib/profiling/timers.h', 'src/core/ext/transport/chttp2/transport/bin_decoder.h', 'src/core/ext/transport/chttp2/transport/bin_encoder.h', @@ -826,11 +826,11 @@ Pod::Spec.new do |s| 'src/core/lib/compression/stream_compression_identity.h', 'src/core/lib/debug/stats.h', 'src/core/lib/debug/stats_data.h', - 'src/core/lib/gpr++/debug_location.h', - 'src/core/lib/gpr++/inlined_vector.h', - 'src/core/lib/gpr++/orphanable.h', - 'src/core/lib/gpr++/ref_counted.h', - 'src/core/lib/gpr++/ref_counted_ptr.h', + 'src/core/lib/gprpp/debug_location.h', + 'src/core/lib/gprpp/inlined_vector.h', + 'src/core/lib/gprpp/orphanable.h', + 'src/core/lib/gprpp/ref_counted.h', + 'src/core/lib/gprpp/ref_counted_ptr.h', 'src/core/lib/http/format_request.h', 'src/core/lib/http/httpcli.h', 'src/core/lib/http/parser.h', diff --git a/grpc.gemspec b/grpc.gemspec index 5b1aebeaaa..35b2776eba 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -83,12 +83,6 @@ Gem::Specification.new do |s| s.files += %w( include/grpc/impl/codegen/sync_generic.h ) s.files += %w( include/grpc/impl/codegen/sync_posix.h ) s.files += %w( include/grpc/impl/codegen/sync_windows.h ) - s.files += %w( src/core/lib/gpr++/abstract.h ) - s.files += %w( src/core/lib/gpr++/atomic.h ) - s.files += %w( src/core/lib/gpr++/atomic_with_atm.h ) - s.files += %w( src/core/lib/gpr++/atomic_with_std.h ) - s.files += %w( src/core/lib/gpr++/manual_constructor.h ) - s.files += %w( src/core/lib/gpr++/memory.h ) s.files += %w( src/core/lib/gpr/arena.h ) s.files += %w( src/core/lib/gpr/env.h ) s.files += %w( src/core/lib/gpr/fork.h ) @@ -100,6 +94,12 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/gpr/thd_internal.h ) s.files += %w( src/core/lib/gpr/time_precise.h ) s.files += %w( src/core/lib/gpr/tmpfile.h ) + s.files += %w( src/core/lib/gprpp/abstract.h ) + s.files += %w( src/core/lib/gprpp/atomic.h ) + s.files += %w( src/core/lib/gprpp/atomic_with_atm.h ) + s.files += %w( src/core/lib/gprpp/atomic_with_std.h ) + s.files += %w( src/core/lib/gprpp/manual_constructor.h ) + s.files += %w( src/core/lib/gprpp/memory.h ) s.files += %w( src/core/lib/profiling/timers.h ) s.files += %w( src/core/lib/gpr/alloc.cc ) s.files += %w( src/core/lib/gpr/arena.cc ) @@ -270,11 +270,11 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/compression/stream_compression_identity.h ) s.files += %w( src/core/lib/debug/stats.h ) s.files += %w( src/core/lib/debug/stats_data.h ) - s.files += %w( src/core/lib/gpr++/debug_location.h ) - s.files += %w( src/core/lib/gpr++/inlined_vector.h ) - s.files += %w( src/core/lib/gpr++/orphanable.h ) - s.files += %w( src/core/lib/gpr++/ref_counted.h ) - s.files += %w( src/core/lib/gpr++/ref_counted_ptr.h ) + s.files += %w( src/core/lib/gprpp/debug_location.h ) + s.files += %w( src/core/lib/gprpp/inlined_vector.h ) + s.files += %w( src/core/lib/gprpp/orphanable.h ) + s.files += %w( src/core/lib/gprpp/ref_counted.h ) + s.files += %w( src/core/lib/gprpp/ref_counted_ptr.h ) s.files += %w( src/core/lib/http/format_request.h ) s.files += %w( src/core/lib/http/httpcli.h ) s.files += %w( src/core/lib/http/parser.h ) diff --git a/package.xml b/package.xml index f1282964c2..875120c6e4 100644 --- a/package.xml +++ b/package.xml @@ -95,12 +95,6 @@ - - - - - - @@ -112,6 +106,12 @@ + + + + + + @@ -282,11 +282,11 @@ - - - - - + + + + + diff --git a/src/core/ext/filters/client_channel/lb_policy.h b/src/core/ext/filters/client_channel/lb_policy.h index e19726efb3..30660cb83d 100644 --- a/src/core/ext/filters/client_channel/lb_policy.h +++ b/src/core/ext/filters/client_channel/lb_policy.h @@ -20,7 +20,7 @@ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_H #include "src/core/ext/filters/client_channel/subchannel.h" -#include "src/core/lib/gpr++/ref_counted_ptr.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/transport/connectivity_state.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc index eb5ced4c20..b89a28c077 100644 --- a/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +++ b/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc @@ -106,8 +106,8 @@ #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr.h" #include "src/core/lib/iomgr/sockaddr_utils.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index e217a0b0c0..24c381a46d 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -34,7 +34,7 @@ #include "src/core/ext/filters/client_channel/subchannel_index.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gpr++/ref_counted_ptr.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/transport/connectivity_state.h" diff --git a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h index f4e345def6..3377605263 100644 --- a/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +++ b/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h @@ -22,7 +22,7 @@ #include "src/core/ext/filters/client_channel/lb_policy_registry.h" #include "src/core/ext/filters/client_channel/subchannel.h" #include "src/core/lib/debug/trace.h" -#include "src/core/lib/gpr++/ref_counted_ptr.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/transport/connectivity_state.h" // TODO(roth): This code is intended to be shared between pick_first and diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc index 7ea3cdd6e1..9024ffb092 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc @@ -34,9 +34,9 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/gethostname.h" #include "src/core/lib/iomgr/resolve_address.h" diff --git a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc index 93a1fe87a2..5aa7e6cc7e 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc @@ -29,9 +29,9 @@ #include "src/core/ext/filters/client_channel/resolver_registry.h" #include "src/core/lib/backoff/backoff.h" #include "src/core/lib/channel/channel_args.h" -#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/gpr/env.h" #include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/timer.h" diff --git a/src/core/ext/filters/client_channel/subchannel.cc b/src/core/ext/filters/client_channel/subchannel.cc index fe4fcbbb7d..3edefaae64 100644 --- a/src/core/ext/filters/client_channel/subchannel.cc +++ b/src/core/ext/filters/client_channel/subchannel.cc @@ -37,8 +37,8 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/connected_channel.h" #include "src/core/lib/debug/stats.h" -#include "src/core/lib/gpr++/debug_location.h" -#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gprpp/debug_location.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/sockaddr_utils.h" #include "src/core/lib/iomgr/timer.h" #include "src/core/lib/profiling/timers.h" diff --git a/src/core/ext/filters/client_channel/subchannel.h b/src/core/ext/filters/client_channel/subchannel.h index f2a5c1e273..b7593ec911 100644 --- a/src/core/ext/filters/client_channel/subchannel.h +++ b/src/core/ext/filters/client_channel/subchannel.h @@ -21,9 +21,9 @@ #include "src/core/ext/filters/client_channel/connector.h" #include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/gpr++/ref_counted.h" -#include "src/core/lib/gpr++/ref_counted_ptr.h" #include "src/core/lib/gpr/arena.h" +#include "src/core/lib/gprpp/ref_counted.h" +#include "src/core/lib/gprpp/ref_counted_ptr.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/transport/connectivity_state.h" #include "src/core/lib/transport/metadata.h" diff --git a/src/core/ext/transport/chttp2/transport/flow_control.h b/src/core/ext/transport/chttp2/transport/flow_control.h index 7e83ea05cd..2ee1345260 100644 --- a/src/core/ext/transport/chttp2/transport/flow_control.h +++ b/src/core/ext/transport/chttp2/transport/flow_control.h @@ -24,8 +24,8 @@ #include #include "src/core/ext/transport/chttp2/transport/http2_settings.h" -#include "src/core/lib/gpr++/abstract.h" -#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gprpp/abstract.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/transport/bdp_estimator.h" #include "src/core/lib/transport/pid_controller.h" diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index de901f0ce8..6b6c0b28e2 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -35,7 +35,7 @@ #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" #include "src/core/ext/transport/chttp2/transport/stream_map.h" #include "src/core/lib/compression/stream_compression.h" -#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/combiner.h" #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/timer.h" diff --git a/src/core/lib/gpr++/README.md b/src/core/lib/gpr++/README.md deleted file mode 100644 index eab018bb31..0000000000 --- a/src/core/lib/gpr++/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# GPR++ - Google Portable Runtime for C++ - -The files in this directory contain various utility code for C++ code. -None of this code is gRPC-specific; anything here may also be useful -for other open source projects written in C++. - -Note that this is one of the few places in src/core where we allow -the use of portability macros. - -Note that this is the only place in src/core where we allow -use of the C++ standard library (i.e., anything in the `std::` -namespace). And for now, we require that any use of the -standard library is build-time-only -- i.e., we do not allow -run-time dependencies on libstdc++. For more details, see -[gRFC L6](/grpc/proposal/blob/master/L6-allow-c%2B%2B-in-grpc-core.md) and -[Moving gRPC core to C++](/grpc/grpc/blob/master/doc/core/moving-to-c%2B%2B.md). diff --git a/src/core/lib/gpr++/abstract.h b/src/core/lib/gpr++/abstract.h deleted file mode 100644 index 51d7572302..0000000000 --- a/src/core/lib/gpr++/abstract.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * - * 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_GPRXX_ABSTRACT_H -#define GRPC_CORE_LIB_GPRXX_ABSTRACT_H - -// This is needed to support abstract base classes in the c core. Since gRPC -// doesn't have a c++ runtime, it will hit a linker error on delete unless -// we define a virtual operator delete. See this blog for more info: -// https://eli.thegreenplace.net/2015/c-deleting-destructors-and-virtual-operator-delete/ -#define GRPC_ABSTRACT_BASE_CLASS \ - static void operator delete(void* p) { abort(); } - -// gRPC currently can't depend on libstdc++, so we can't use "= 0" for -// pure virtual methods. Instead, we use this macro. -#define GRPC_ABSTRACT \ - { GPR_ASSERT(false); } - -#endif /* GRPC_CORE_LIB_GPRXX_ABSTRACT_H */ diff --git a/src/core/lib/gpr++/atomic.h b/src/core/lib/gpr++/atomic.h deleted file mode 100644 index d68ccea864..0000000000 --- a/src/core/lib/gpr++/atomic.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * - * 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_GPRXX_ATOMIC_H -#define GRPC_CORE_LIB_GPRXX_ATOMIC_H - -#include - -#ifdef GPR_HAS_CXX11_ATOMIC -#include "src/core/lib/gpr++/atomic_with_std.h" -#else -#include "src/core/lib/gpr++/atomic_with_atm.h" -#endif - -#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_H */ diff --git a/src/core/lib/gpr++/atomic_with_atm.h b/src/core/lib/gpr++/atomic_with_atm.h deleted file mode 100644 index 09490e8148..0000000000 --- a/src/core/lib/gpr++/atomic_with_atm.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * - * 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_GPRXX_ATOMIC_WITH_ATM_H -#define GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_ATM_H - -#include - -namespace grpc_core { - -enum MemoryOrderRelaxed { memory_order_relaxed }; - -template -class atomic; - -template <> -class atomic { - public: - atomic() { gpr_atm_no_barrier_store(&x_, static_cast(false)); } - explicit atomic(bool x) { - gpr_atm_no_barrier_store(&x_, static_cast(x)); - } - - bool compare_exchange_strong(bool& expected, bool update, MemoryOrderRelaxed, - MemoryOrderRelaxed) { - if (!gpr_atm_no_barrier_cas(&x_, static_cast(expected), - static_cast(update))) { - expected = gpr_atm_no_barrier_load(&x_) != 0; - return false; - } - return true; - } - - private: - gpr_atm x_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_ATM_H */ diff --git a/src/core/lib/gpr++/atomic_with_std.h b/src/core/lib/gpr++/atomic_with_std.h deleted file mode 100644 index b6ff90655e..0000000000 --- a/src/core/lib/gpr++/atomic_with_std.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * - * 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_GPRXX_ATOMIC_WITH_STD_H -#define GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_STD_H - -#include - -namespace grpc_core { - -template -using atomic = std::atomic; - -typedef std::memory_order memory_order; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_ATOMIC_WITH_STD_H */ diff --git a/src/core/lib/gpr++/debug_location.h b/src/core/lib/gpr++/debug_location.h deleted file mode 100644 index 5a8665ce19..0000000000 --- a/src/core/lib/gpr++/debug_location.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * - * 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_GPRXX_DEBUG_LOCATION_H -#define GRPC_CORE_LIB_GPRXX_DEBUG_LOCATION_H - -namespace grpc_core { - -// Used for tracking file and line where a call is made for debug builds. -// No-op for non-debug builds. -// Callers can use the DEBUG_LOCATION macro in either case. -#ifndef NDEBUG -class DebugLocation { - public: - DebugLocation(const char* file, int line) : file_(file), line_(line) {} - bool Log() const { return true; } - const char* file() const { return file_; } - int line() const { return line_; } - - private: - const char* file_; - const int line_; -}; -#define DEBUG_LOCATION ::grpc_core::DebugLocation(__FILE__, __LINE__) -#else -class DebugLocation { - public: - bool Log() const { return false; } - const char* file() const { return nullptr; } - int line() const { return -1; } -}; -#define DEBUG_LOCATION ::grpc_core::DebugLocation() -#endif - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_DEBUG_LOCATION_H */ diff --git a/src/core/lib/gpr++/inlined_vector.h b/src/core/lib/gpr++/inlined_vector.h deleted file mode 100644 index 17ee9e16bb..0000000000 --- a/src/core/lib/gpr++/inlined_vector.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * - * 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_GPRXX_INLINED_VECTOR_H -#define GRPC_CORE_LIB_GPRXX_INLINED_VECTOR_H - -#include - -#include "src/core/lib/gpr++/memory.h" - -namespace grpc_core { - -// NOTE: We eventually want to use absl::InlinedVector here. However, -// there are currently build problems that prevent us from using absl. -// In the interim, we define a custom implementation as a place-holder, -// with the intent to eventually replace this with the absl -// implementation. -// -// This place-holder implementation does not implement the full set of -// functionality from the absl version; it has just the methods that we -// currently happen to need in gRPC. If additional functionality is -// needed before this gets replaced with the absl version, it can be -// added, with the following proviso: -// -// ANY METHOD ADDED HERE MUST COMPLY WITH THE INTERFACE IN THE absl -// IMPLEMENTATION! -// -// TODO(ctiller, nnoble, roth): Replace this with absl::InlinedVector -// once we integrate absl into the gRPC build system in a usable way. -template -class InlinedVector { - public: - InlinedVector() {} - ~InlinedVector() { - for (size_t i = 0; i < size_ && i < N; ++i) { - T& value = *reinterpret_cast(inline_ + i); - value.~T(); - } - if (size_ > N) { // Avoid subtracting two signed values. - for (size_t i = 0; i < size_ - N; ++i) { - dynamic_[i].~T(); - } - } - gpr_free(dynamic_); - } - - // For now, we do not support copying. - InlinedVector(const InlinedVector&) = delete; - InlinedVector& operator=(const InlinedVector&) = delete; - - T& operator[](size_t offset) { - assert(offset < size_); - if (offset < N) { - return *reinterpret_cast(inline_ + offset); - } else { - return dynamic_[offset - N]; - } - } - - template - void emplace_back(Args&&... args) { - if (size_ < N) { - new (&inline_[size_]) T(std::forward(args)...); - } else { - if (size_ - N == dynamic_capacity_) { - size_t new_capacity = - dynamic_capacity_ == 0 ? 2 : dynamic_capacity_ * 2; - T* new_dynamic = static_cast(gpr_malloc(sizeof(T) * new_capacity)); - for (size_t i = 0; i < dynamic_capacity_; ++i) { - new (&new_dynamic[i]) T(std::move(dynamic_[i])); - dynamic_[i].~T(); - } - gpr_free(dynamic_); - dynamic_ = new_dynamic; - dynamic_capacity_ = new_capacity; - } - new (&dynamic_[size_ - N]) T(std::forward(args)...); - } - ++size_; - } - - void push_back(const T& value) { emplace_back(value); } - - void push_back(T&& value) { emplace_back(std::move(value)); } - - size_t size() const { return size_; } - - private: - typename std::aligned_storage::type inline_[N]; - T* dynamic_ = nullptr; - size_t size_ = 0; - size_t dynamic_capacity_ = 0; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_INLINED_VECTOR_H */ diff --git a/src/core/lib/gpr++/manual_constructor.h b/src/core/lib/gpr++/manual_constructor.h deleted file mode 100644 index a3f006da34..0000000000 --- a/src/core/lib/gpr++/manual_constructor.h +++ /dev/null @@ -1,211 +0,0 @@ -/* - * - * Copyright 2016 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_GPRXX_MANUAL_CONSTRUCTOR_H -#define GRPC_CORE_LIB_GPRXX_MANUAL_CONSTRUCTOR_H - -// manually construct a region of memory with some type - -#include -#include -#include -#include -#include - -#include - -namespace grpc_core { - -// this contains templated helpers needed to implement the ManualConstructors -// in this file. -namespace manual_ctor_impl { - -// is_one_of returns true it a class, Member, is present in a variadic list of -// classes, List. -template -class is_one_of; - -template -class is_one_of { - public: - static constexpr const bool value = true; -}; - -template -class is_one_of { - public: - static constexpr const bool value = is_one_of::value; -}; - -template -class is_one_of { - public: - static constexpr const bool value = false; -}; - -// max_size_of returns sizeof(Type) for the largest type in the variadic list -// of classes, Types. -template -class max_size_of; - -template -class max_size_of { - public: - static constexpr const size_t value = sizeof(A); -}; - -template -class max_size_of { - public: - static constexpr const size_t value = sizeof(A) > max_size_of::value - ? sizeof(A) - : max_size_of::value; -}; - -// max_size_of returns alignof(Type) for the largest type in the variadic list -// of classes, Types. -template -class max_align_of; - -template -class max_align_of { - public: - static constexpr const size_t value = alignof(A); -}; - -template -class max_align_of { - public: - static constexpr const size_t value = alignof(A) > max_align_of::value - ? alignof(A) - : max_align_of::value; -}; - -} // namespace manual_ctor_impl - -template -class PolymorphicManualConstructor { - public: - // No constructor or destructor because one of the most useful uses of - // this class is as part of a union, and members of a union could not have - // constructors or destructors till C++11. And, anyway, the whole point of - // this class is to bypass constructor and destructor. - - BaseType* get() { return reinterpret_cast(&space_); } - const BaseType* get() const { - return reinterpret_cast(&space_); - } - - BaseType* operator->() { return get(); } - const BaseType* operator->() const { return get(); } - - BaseType& operator*() { return *get(); } - const BaseType& operator*() const { return *get(); } - - template - void Init() { - FinishInit(new (&space_) DerivedType); - } - - // Init() constructs the Type instance using the given arguments - // (which are forwarded to Type's constructor). - // - // Note that Init() with no arguments performs default-initialization, - // not zero-initialization (i.e it behaves the same as "new Type;", not - // "new Type();"), so it will leave non-class types uninitialized. - template - void Init(Ts&&... args) { - FinishInit(new (&space_) DerivedType(std::forward(args)...)); - } - - // Init() that is equivalent to copy and move construction. - // Enables usage like this: - // ManualConstructor> v; - // v.Init({1, 2, 3}); - template - void Init(const DerivedType& x) { - FinishInit(new (&space_) DerivedType(x)); - } - template - void Init(DerivedType&& x) { - FinishInit(new (&space_) DerivedType(std::move(x))); - } - - void Destroy() { get()->~BaseType(); } - - private: - template - void FinishInit(DerivedType* p) { - static_assert( - manual_ctor_impl::is_one_of::value, - "DerivedType must be one of the predeclared DerivedTypes"); - GPR_ASSERT(reinterpret_cast(static_cast(p)) == p); - } - - typename std::aligned_storage< - grpc_core::manual_ctor_impl::max_size_of::value, - grpc_core::manual_ctor_impl::max_align_of::value>::type - space_; -}; - -template -class ManualConstructor { - public: - // No constructor or destructor because one of the most useful uses of - // this class is as part of a union, and members of a union could not have - // constructors or destructors till C++11. And, anyway, the whole point of - // this class is to bypass constructor and destructor. - - Type* get() { return reinterpret_cast(&space_); } - const Type* get() const { return reinterpret_cast(&space_); } - - Type* operator->() { return get(); } - const Type* operator->() const { return get(); } - - Type& operator*() { return *get(); } - const Type& operator*() const { return *get(); } - - void Init() { new (&space_) Type; } - - // Init() constructs the Type instance using the given arguments - // (which are forwarded to Type's constructor). - // - // Note that Init() with no arguments performs default-initialization, - // not zero-initialization (i.e it behaves the same as "new Type;", not - // "new Type();"), so it will leave non-class types uninitialized. - template - void Init(Ts&&... args) { - new (&space_) Type(std::forward(args)...); - } - - // Init() that is equivalent to copy and move construction. - // Enables usage like this: - // ManualConstructor> v; - // v.Init({1, 2, 3}); - void Init(const Type& x) { new (&space_) Type(x); } - void Init(Type&& x) { new (&space_) Type(std::move(x)); } - - void Destroy() { get()->~Type(); } - - private: - typename std::aligned_storage::type space_; -}; - -} // namespace grpc_core - -#endif diff --git a/src/core/lib/gpr++/memory.h b/src/core/lib/gpr++/memory.h deleted file mode 100644 index 75ed3d6cea..0000000000 --- a/src/core/lib/gpr++/memory.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * - * 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_GPRXX_MEMORY_H -#define GRPC_CORE_LIB_GPRXX_MEMORY_H - -#include - -#include -#include -#include - -namespace grpc_core { - -// Alternative to new, since we cannot use it (for fear of libstdc++) -template -inline T* New(Args&&... args) { - void* p = gpr_malloc(sizeof(T)); - return new (p) T(std::forward(args)...); -} - -// Alternative to delete, since we cannot use it (for fear of libstdc++) -template -inline void Delete(T* p) { - p->~T(); - gpr_free(p); -} - -template -class DefaultDelete { - public: - void operator()(T* p) { Delete(p); } -}; - -template > -using UniquePtr = std::unique_ptr; - -template -inline UniquePtr MakeUnique(Args&&... args) { - return UniquePtr(New(std::forward(args)...)); -} - -// an allocator that uses gpr_malloc/gpr_free -template -class Allocator { - public: - typedef T value_type; - typedef T* pointer; - typedef const T* const_pointer; - typedef T& reference; - typedef const T& const_reference; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef std::false_type propagate_on_container_move_assignment; - template - struct rebind { - typedef Allocator other; - }; - typedef std::true_type is_always_equal; - - pointer address(reference x) const { return &x; } - const_pointer address(const_reference x) const { return &x; } - pointer allocate(std::size_t n, - std::allocator::const_pointer hint = nullptr) { - return static_cast(gpr_malloc(n * sizeof(T))); - } - void deallocate(T* p, std::size_t n) { gpr_free(p); } - size_t max_size() const { - return std::numeric_limits::max() / sizeof(value_type); - } - void construct(pointer p, const_reference val) { new ((void*)p) T(val); } - template - void construct(U* p, Args&&... args) { - ::new ((void*)p) U(std::forward(args)...); - } - void destroy(pointer p) { p->~T(); } - template - void destroy(U* p) { - p->~U(); - } -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_MEMORY_H */ diff --git a/src/core/lib/gpr++/orphanable.h b/src/core/lib/gpr++/orphanable.h deleted file mode 100644 index f106e74dde..0000000000 --- a/src/core/lib/gpr++/orphanable.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * - * 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_GPRXX_ORPHANABLE_H -#define GRPC_CORE_LIB_GPRXX_ORPHANABLE_H - -#include -#include - -#include - -#include "src/core/lib/debug/trace.h" -#include "src/core/lib/gpr++/abstract.h" -#include "src/core/lib/gpr++/debug_location.h" -#include "src/core/lib/gpr++/memory.h" - -namespace grpc_core { - -// A base class for orphanable objects, which have one external owner -// but are not necessarily destroyed immediately when the external owner -// gives up ownership. Instead, the owner calls the object's Orphan() -// method, and the object then takes responsibility for its own cleanup -// and destruction. -class Orphanable { - public: - // Gives up ownership of the object. The implementation must arrange - // to eventually destroy the object without further interaction from the - // caller. - virtual void Orphan() GRPC_ABSTRACT; - - // Not copyable or movable. - Orphanable(const Orphanable&) = delete; - Orphanable& operator=(const Orphanable&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - Orphanable() {} - virtual ~Orphanable() {} -}; - -template -class OrphanableDelete { - public: - void operator()(T* p) { p->Orphan(); } -}; - -template > -using OrphanablePtr = std::unique_ptr; - -template -inline OrphanablePtr MakeOrphanable(Args&&... args) { - return OrphanablePtr(New(std::forward(args)...)); -} - -// A type of Orphanable with internal ref-counting. -class InternallyRefCounted : public Orphanable { - public: - // Not copyable nor movable. - InternallyRefCounted(const InternallyRefCounted&) = delete; - InternallyRefCounted& operator=(const InternallyRefCounted&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - InternallyRefCounted() { gpr_ref_init(&refs_, 1); } - virtual ~InternallyRefCounted() {} - - void Ref() { gpr_ref(&refs_); } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - private: - gpr_refcount refs_; -}; - -// An alternative version of the InternallyRefCounted base class that -// supports tracing. This is intended to be used in cases where the -// object will be handled both by idiomatic C++ code using smart -// pointers and legacy code that is manually calling Ref() and Unref(). -// Once all of our code is converted to idiomatic C++, we may be able to -// eliminate this class. -class InternallyRefCountedWithTracing : public Orphanable { - public: - // Not copyable nor movable. - InternallyRefCountedWithTracing(const InternallyRefCountedWithTracing&) = - delete; - InternallyRefCountedWithTracing& operator=( - const InternallyRefCountedWithTracing&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - InternallyRefCountedWithTracing() - : InternallyRefCountedWithTracing(static_cast(nullptr)) {} - - explicit InternallyRefCountedWithTracing(TraceFlag* trace_flag) - : trace_flag_(trace_flag) { - gpr_ref_init(&refs_, 1); - } - -#ifdef NDEBUG - explicit InternallyRefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) - : InternallyRefCountedWithTracing() {} -#endif - - virtual ~InternallyRefCountedWithTracing() {} - - void Ref() { gpr_ref(&refs_); } - - void Ref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs + 1, reason); - } - Ref(); - } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - void Unref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs - 1, reason); - } - Unref(); - } - - private: - TraceFlag* trace_flag_ = nullptr; - gpr_refcount refs_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_ORPHANABLE_H */ diff --git a/src/core/lib/gpr++/ref_counted.h b/src/core/lib/gpr++/ref_counted.h deleted file mode 100644 index c2ae76c0ae..0000000000 --- a/src/core/lib/gpr++/ref_counted.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - * - * 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_GPRXX_REF_COUNTED_H -#define GRPC_CORE_LIB_GPRXX_REF_COUNTED_H - -#include -#include - -#include "src/core/lib/debug/trace.h" -#include "src/core/lib/gpr++/abstract.h" -#include "src/core/lib/gpr++/debug_location.h" -#include "src/core/lib/gpr++/memory.h" - -namespace grpc_core { - -// A base class for reference-counted objects. -// New objects should be created via New() and start with a refcount of 1. -// When the refcount reaches 0, the object will be deleted via Delete(). -class RefCounted { - public: - void Ref() { gpr_ref(&refs_); } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - // Not copyable nor movable. - RefCounted(const RefCounted&) = delete; - RefCounted& operator=(const RefCounted&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - RefCounted() { gpr_ref_init(&refs_, 1); } - - virtual ~RefCounted() {} - - private: - gpr_refcount refs_; -}; - -// An alternative version of the RefCounted base class that -// supports tracing. This is intended to be used in cases where the -// object will be handled both by idiomatic C++ code using smart -// pointers and legacy code that is manually calling Ref() and Unref(). -// Once all of our code is converted to idiomatic C++, we may be able to -// eliminate this class. -class RefCountedWithTracing { - public: - void Ref() { gpr_ref(&refs_); } - - void Ref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs + 1, reason); - } - Ref(); - } - - void Unref() { - if (gpr_unref(&refs_)) { - Delete(this); - } - } - - void Unref(const DebugLocation& location, const char* reason) { - if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { - gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); - gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", - trace_flag_->name(), this, location.file(), location.line(), - old_refs, old_refs - 1, reason); - } - Unref(); - } - - // Not copyable nor movable. - RefCountedWithTracing(const RefCountedWithTracing&) = delete; - RefCountedWithTracing& operator=(const RefCountedWithTracing&) = delete; - - GRPC_ABSTRACT_BASE_CLASS - - protected: - // Allow Delete() to access destructor. - template - friend void Delete(T*); - - RefCountedWithTracing() - : RefCountedWithTracing(static_cast(nullptr)) {} - - explicit RefCountedWithTracing(TraceFlag* trace_flag) - : trace_flag_(trace_flag) { - gpr_ref_init(&refs_, 1); - } - -#ifdef NDEBUG - explicit RefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) - : RefCountedWithTracing() {} -#endif - - virtual ~RefCountedWithTracing() {} - - private: - TraceFlag* trace_flag_ = nullptr; - gpr_refcount refs_; -}; - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_REF_COUNTED_H */ diff --git a/src/core/lib/gpr++/ref_counted_ptr.h b/src/core/lib/gpr++/ref_counted_ptr.h deleted file mode 100644 index 862294d1aa..0000000000 --- a/src/core/lib/gpr++/ref_counted_ptr.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * 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_GPRXX_REF_COUNTED_PTR_H -#define GRPC_CORE_LIB_GPRXX_REF_COUNTED_PTR_H - -#include - -#include "src/core/lib/gpr++/memory.h" - -namespace grpc_core { - -// A smart pointer class for objects that provide Ref() and Unref() methods, -// such as those provided by the RefCounted base class. -template -class RefCountedPtr { - public: - RefCountedPtr() {} - - // If value is non-null, we take ownership of a ref to it. - explicit RefCountedPtr(T* value) { value_ = value; } - - // Move support. - RefCountedPtr(RefCountedPtr&& other) { - value_ = other.value_; - other.value_ = nullptr; - } - RefCountedPtr& operator=(RefCountedPtr&& other) { - if (value_ != nullptr) value_->Unref(); - value_ = other.value_; - other.value_ = nullptr; - return *this; - } - - // Copy support. - RefCountedPtr(const RefCountedPtr& other) { - if (other.value_ != nullptr) other.value_->Ref(); - value_ = other.value_; - } - RefCountedPtr& operator=(const RefCountedPtr& other) { - // Note: Order of reffing and unreffing is important here in case value_ - // and other.value_ are the same object. - if (other.value_ != nullptr) other.value_->Ref(); - if (value_ != nullptr) value_->Unref(); - value_ = other.value_; - return *this; - } - - ~RefCountedPtr() { - if (value_ != nullptr) value_->Unref(); - } - - // If value is non-null, we take ownership of a ref to it. - void reset(T* value = nullptr) { - if (value_ != nullptr) value_->Unref(); - value_ = value; - } - - T* get() const { return value_; } - - T& operator*() const { return *value_; } - T* operator->() const { return value_; } - - bool operator==(const RefCountedPtr& other) const { - return value_ == other.value_; - } - bool operator==(const T* other) const { return value_ == other; } - bool operator!=(const RefCountedPtr& other) const { - return value_ != other.value_; - } - bool operator!=(const T* other) const { return value_ != other; } - - private: - T* value_ = nullptr; -}; - -template -inline RefCountedPtr MakeRefCounted(Args&&... args) { - return RefCountedPtr(New(std::forward(args)...)); -} - -} // namespace grpc_core - -#endif /* GRPC_CORE_LIB_GPRXX_REF_COUNTED_PTR_H */ diff --git a/src/core/lib/gprpp/README.md b/src/core/lib/gprpp/README.md new file mode 100644 index 0000000000..eab018bb31 --- /dev/null +++ b/src/core/lib/gprpp/README.md @@ -0,0 +1,16 @@ +# GPR++ - Google Portable Runtime for C++ + +The files in this directory contain various utility code for C++ code. +None of this code is gRPC-specific; anything here may also be useful +for other open source projects written in C++. + +Note that this is one of the few places in src/core where we allow +the use of portability macros. + +Note that this is the only place in src/core where we allow +use of the C++ standard library (i.e., anything in the `std::` +namespace). And for now, we require that any use of the +standard library is build-time-only -- i.e., we do not allow +run-time dependencies on libstdc++. For more details, see +[gRFC L6](/grpc/proposal/blob/master/L6-allow-c%2B%2B-in-grpc-core.md) and +[Moving gRPC core to C++](/grpc/grpc/blob/master/doc/core/moving-to-c%2B%2B.md). diff --git a/src/core/lib/gprpp/abstract.h b/src/core/lib/gprpp/abstract.h new file mode 100644 index 0000000000..cc96edc49b --- /dev/null +++ b/src/core/lib/gprpp/abstract.h @@ -0,0 +1,34 @@ +/* + * + * 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_GPRPP_ABSTRACT_H +#define GRPC_CORE_LIB_GPRPP_ABSTRACT_H + +// This is needed to support abstract base classes in the c core. Since gRPC +// doesn't have a c++ runtime, it will hit a linker error on delete unless +// we define a virtual operator delete. See this blog for more info: +// https://eli.thegreenplace.net/2015/c-deleting-destructors-and-virtual-operator-delete/ +#define GRPC_ABSTRACT_BASE_CLASS \ + static void operator delete(void* p) { abort(); } + +// gRPC currently can't depend on libstdc++, so we can't use "= 0" for +// pure virtual methods. Instead, we use this macro. +#define GRPC_ABSTRACT \ + { GPR_ASSERT(false); } + +#endif /* GRPC_CORE_LIB_GPRPP_ABSTRACT_H */ diff --git a/src/core/lib/gprpp/atomic.h b/src/core/lib/gprpp/atomic.h new file mode 100644 index 0000000000..8b08fc4e9c --- /dev/null +++ b/src/core/lib/gprpp/atomic.h @@ -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. + * + */ + +#ifndef GRPC_CORE_LIB_GPRPP_ATOMIC_H +#define GRPC_CORE_LIB_GPRPP_ATOMIC_H + +#include + +#ifdef GPR_HAS_CXX11_ATOMIC +#include "src/core/lib/gprpp/atomic_with_std.h" +#else +#include "src/core/lib/gprpp/atomic_with_atm.h" +#endif + +#endif /* GRPC_CORE_LIB_GPRPP_ATOMIC_H */ diff --git a/src/core/lib/gprpp/atomic_with_atm.h b/src/core/lib/gprpp/atomic_with_atm.h new file mode 100644 index 0000000000..6abf0bc38d --- /dev/null +++ b/src/core/lib/gprpp/atomic_with_atm.h @@ -0,0 +1,55 @@ +/* + * + * 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_GPRPP_ATOMIC_WITH_ATM_H +#define GRPC_CORE_LIB_GPRPP_ATOMIC_WITH_ATM_H + +#include + +namespace grpc_core { + +enum MemoryOrderRelaxed { memory_order_relaxed }; + +template +class atomic; + +template <> +class atomic { + public: + atomic() { gpr_atm_no_barrier_store(&x_, static_cast(false)); } + explicit atomic(bool x) { + gpr_atm_no_barrier_store(&x_, static_cast(x)); + } + + bool compare_exchange_strong(bool& expected, bool update, MemoryOrderRelaxed, + MemoryOrderRelaxed) { + if (!gpr_atm_no_barrier_cas(&x_, static_cast(expected), + static_cast(update))) { + expected = gpr_atm_no_barrier_load(&x_) != 0; + return false; + } + return true; + } + + private: + gpr_atm x_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_ATOMIC_WITH_ATM_H */ diff --git a/src/core/lib/gprpp/atomic_with_std.h b/src/core/lib/gprpp/atomic_with_std.h new file mode 100644 index 0000000000..83322b81c1 --- /dev/null +++ b/src/core/lib/gprpp/atomic_with_std.h @@ -0,0 +1,33 @@ +/* + * + * 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_GPRPP_ATOMIC_WITH_STD_H +#define GRPC_CORE_LIB_GPRPP_ATOMIC_WITH_STD_H + +#include + +namespace grpc_core { + +template +using atomic = std::atomic; + +typedef std::memory_order memory_order; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_ATOMIC_WITH_STD_H */ diff --git a/src/core/lib/gprpp/debug_location.h b/src/core/lib/gprpp/debug_location.h new file mode 100644 index 0000000000..287761beaf --- /dev/null +++ b/src/core/lib/gprpp/debug_location.h @@ -0,0 +1,52 @@ +/* + * + * 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_GPRPP_DEBUG_LOCATION_H +#define GRPC_CORE_LIB_GPRPP_DEBUG_LOCATION_H + +namespace grpc_core { + +// Used for tracking file and line where a call is made for debug builds. +// No-op for non-debug builds. +// Callers can use the DEBUG_LOCATION macro in either case. +#ifndef NDEBUG +class DebugLocation { + public: + DebugLocation(const char* file, int line) : file_(file), line_(line) {} + bool Log() const { return true; } + const char* file() const { return file_; } + int line() const { return line_; } + + private: + const char* file_; + const int line_; +}; +#define DEBUG_LOCATION ::grpc_core::DebugLocation(__FILE__, __LINE__) +#else +class DebugLocation { + public: + bool Log() const { return false; } + const char* file() const { return nullptr; } + int line() const { return -1; } +}; +#define DEBUG_LOCATION ::grpc_core::DebugLocation() +#endif + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_DEBUG_LOCATION_H */ diff --git a/src/core/lib/gprpp/inlined_vector.h b/src/core/lib/gprpp/inlined_vector.h new file mode 100644 index 0000000000..b78f85b893 --- /dev/null +++ b/src/core/lib/gprpp/inlined_vector.h @@ -0,0 +1,112 @@ +/* + * + * 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_GPRPP_INLINED_VECTOR_H +#define GRPC_CORE_LIB_GPRPP_INLINED_VECTOR_H + +#include + +#include "src/core/lib/gprpp/memory.h" + +namespace grpc_core { + +// NOTE: We eventually want to use absl::InlinedVector here. However, +// there are currently build problems that prevent us from using absl. +// In the interim, we define a custom implementation as a place-holder, +// with the intent to eventually replace this with the absl +// implementation. +// +// This place-holder implementation does not implement the full set of +// functionality from the absl version; it has just the methods that we +// currently happen to need in gRPC. If additional functionality is +// needed before this gets replaced with the absl version, it can be +// added, with the following proviso: +// +// ANY METHOD ADDED HERE MUST COMPLY WITH THE INTERFACE IN THE absl +// IMPLEMENTATION! +// +// TODO(ctiller, nnoble, roth): Replace this with absl::InlinedVector +// once we integrate absl into the gRPC build system in a usable way. +template +class InlinedVector { + public: + InlinedVector() {} + ~InlinedVector() { + for (size_t i = 0; i < size_ && i < N; ++i) { + T& value = *reinterpret_cast(inline_ + i); + value.~T(); + } + if (size_ > N) { // Avoid subtracting two signed values. + for (size_t i = 0; i < size_ - N; ++i) { + dynamic_[i].~T(); + } + } + gpr_free(dynamic_); + } + + // For now, we do not support copying. + InlinedVector(const InlinedVector&) = delete; + InlinedVector& operator=(const InlinedVector&) = delete; + + T& operator[](size_t offset) { + assert(offset < size_); + if (offset < N) { + return *reinterpret_cast(inline_ + offset); + } else { + return dynamic_[offset - N]; + } + } + + template + void emplace_back(Args&&... args) { + if (size_ < N) { + new (&inline_[size_]) T(std::forward(args)...); + } else { + if (size_ - N == dynamic_capacity_) { + size_t new_capacity = + dynamic_capacity_ == 0 ? 2 : dynamic_capacity_ * 2; + T* new_dynamic = static_cast(gpr_malloc(sizeof(T) * new_capacity)); + for (size_t i = 0; i < dynamic_capacity_; ++i) { + new (&new_dynamic[i]) T(std::move(dynamic_[i])); + dynamic_[i].~T(); + } + gpr_free(dynamic_); + dynamic_ = new_dynamic; + dynamic_capacity_ = new_capacity; + } + new (&dynamic_[size_ - N]) T(std::forward(args)...); + } + ++size_; + } + + void push_back(const T& value) { emplace_back(value); } + + void push_back(T&& value) { emplace_back(std::move(value)); } + + size_t size() const { return size_; } + + private: + typename std::aligned_storage::type inline_[N]; + T* dynamic_ = nullptr; + size_t size_ = 0; + size_t dynamic_capacity_ = 0; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_INLINED_VECTOR_H */ diff --git a/src/core/lib/gprpp/manual_constructor.h b/src/core/lib/gprpp/manual_constructor.h new file mode 100644 index 0000000000..cee38abc1b --- /dev/null +++ b/src/core/lib/gprpp/manual_constructor.h @@ -0,0 +1,211 @@ +/* + * + * Copyright 2016 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_GPRPP_MANUAL_CONSTRUCTOR_H +#define GRPC_CORE_LIB_GPRPP_MANUAL_CONSTRUCTOR_H + +// manually construct a region of memory with some type + +#include +#include +#include +#include +#include + +#include + +namespace grpc_core { + +// this contains templated helpers needed to implement the ManualConstructors +// in this file. +namespace manual_ctor_impl { + +// is_one_of returns true it a class, Member, is present in a variadic list of +// classes, List. +template +class is_one_of; + +template +class is_one_of { + public: + static constexpr const bool value = true; +}; + +template +class is_one_of { + public: + static constexpr const bool value = is_one_of::value; +}; + +template +class is_one_of { + public: + static constexpr const bool value = false; +}; + +// max_size_of returns sizeof(Type) for the largest type in the variadic list +// of classes, Types. +template +class max_size_of; + +template +class max_size_of { + public: + static constexpr const size_t value = sizeof(A); +}; + +template +class max_size_of { + public: + static constexpr const size_t value = sizeof(A) > max_size_of::value + ? sizeof(A) + : max_size_of::value; +}; + +// max_size_of returns alignof(Type) for the largest type in the variadic list +// of classes, Types. +template +class max_align_of; + +template +class max_align_of { + public: + static constexpr const size_t value = alignof(A); +}; + +template +class max_align_of { + public: + static constexpr const size_t value = alignof(A) > max_align_of::value + ? alignof(A) + : max_align_of::value; +}; + +} // namespace manual_ctor_impl + +template +class PolymorphicManualConstructor { + public: + // No constructor or destructor because one of the most useful uses of + // this class is as part of a union, and members of a union could not have + // constructors or destructors till C++11. And, anyway, the whole point of + // this class is to bypass constructor and destructor. + + BaseType* get() { return reinterpret_cast(&space_); } + const BaseType* get() const { + return reinterpret_cast(&space_); + } + + BaseType* operator->() { return get(); } + const BaseType* operator->() const { return get(); } + + BaseType& operator*() { return *get(); } + const BaseType& operator*() const { return *get(); } + + template + void Init() { + FinishInit(new (&space_) DerivedType); + } + + // Init() constructs the Type instance using the given arguments + // (which are forwarded to Type's constructor). + // + // Note that Init() with no arguments performs default-initialization, + // not zero-initialization (i.e it behaves the same as "new Type;", not + // "new Type();"), so it will leave non-class types uninitialized. + template + void Init(Ts&&... args) { + FinishInit(new (&space_) DerivedType(std::forward(args)...)); + } + + // Init() that is equivalent to copy and move construction. + // Enables usage like this: + // ManualConstructor> v; + // v.Init({1, 2, 3}); + template + void Init(const DerivedType& x) { + FinishInit(new (&space_) DerivedType(x)); + } + template + void Init(DerivedType&& x) { + FinishInit(new (&space_) DerivedType(std::move(x))); + } + + void Destroy() { get()->~BaseType(); } + + private: + template + void FinishInit(DerivedType* p) { + static_assert( + manual_ctor_impl::is_one_of::value, + "DerivedType must be one of the predeclared DerivedTypes"); + GPR_ASSERT(reinterpret_cast(static_cast(p)) == p); + } + + typename std::aligned_storage< + grpc_core::manual_ctor_impl::max_size_of::value, + grpc_core::manual_ctor_impl::max_align_of::value>::type + space_; +}; + +template +class ManualConstructor { + public: + // No constructor or destructor because one of the most useful uses of + // this class is as part of a union, and members of a union could not have + // constructors or destructors till C++11. And, anyway, the whole point of + // this class is to bypass constructor and destructor. + + Type* get() { return reinterpret_cast(&space_); } + const Type* get() const { return reinterpret_cast(&space_); } + + Type* operator->() { return get(); } + const Type* operator->() const { return get(); } + + Type& operator*() { return *get(); } + const Type& operator*() const { return *get(); } + + void Init() { new (&space_) Type; } + + // Init() constructs the Type instance using the given arguments + // (which are forwarded to Type's constructor). + // + // Note that Init() with no arguments performs default-initialization, + // not zero-initialization (i.e it behaves the same as "new Type;", not + // "new Type();"), so it will leave non-class types uninitialized. + template + void Init(Ts&&... args) { + new (&space_) Type(std::forward(args)...); + } + + // Init() that is equivalent to copy and move construction. + // Enables usage like this: + // ManualConstructor> v; + // v.Init({1, 2, 3}); + void Init(const Type& x) { new (&space_) Type(x); } + void Init(Type&& x) { new (&space_) Type(std::move(x)); } + + void Destroy() { get()->~Type(); } + + private: + typename std::aligned_storage::type space_; +}; + +} // namespace grpc_core + +#endif diff --git a/src/core/lib/gprpp/memory.h b/src/core/lib/gprpp/memory.h new file mode 100644 index 0000000000..17f42f5983 --- /dev/null +++ b/src/core/lib/gprpp/memory.h @@ -0,0 +1,100 @@ +/* + * + * 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_GPRPP_MEMORY_H +#define GRPC_CORE_LIB_GPRPP_MEMORY_H + +#include + +#include +#include +#include + +namespace grpc_core { + +// Alternative to new, since we cannot use it (for fear of libstdc++) +template +inline T* New(Args&&... args) { + void* p = gpr_malloc(sizeof(T)); + return new (p) T(std::forward(args)...); +} + +// Alternative to delete, since we cannot use it (for fear of libstdc++) +template +inline void Delete(T* p) { + p->~T(); + gpr_free(p); +} + +template +class DefaultDelete { + public: + void operator()(T* p) { Delete(p); } +}; + +template > +using UniquePtr = std::unique_ptr; + +template +inline UniquePtr MakeUnique(Args&&... args) { + return UniquePtr(New(std::forward(args)...)); +} + +// an allocator that uses gpr_malloc/gpr_free +template +class Allocator { + public: + typedef T value_type; + typedef T* pointer; + typedef const T* const_pointer; + typedef T& reference; + typedef const T& const_reference; + typedef std::size_t size_type; + typedef std::ptrdiff_t difference_type; + typedef std::false_type propagate_on_container_move_assignment; + template + struct rebind { + typedef Allocator other; + }; + typedef std::true_type is_always_equal; + + pointer address(reference x) const { return &x; } + const_pointer address(const_reference x) const { return &x; } + pointer allocate(std::size_t n, + std::allocator::const_pointer hint = nullptr) { + return static_cast(gpr_malloc(n * sizeof(T))); + } + void deallocate(T* p, std::size_t n) { gpr_free(p); } + size_t max_size() const { + return std::numeric_limits::max() / sizeof(value_type); + } + void construct(pointer p, const_reference val) { new ((void*)p) T(val); } + template + void construct(U* p, Args&&... args) { + ::new ((void*)p) U(std::forward(args)...); + } + void destroy(pointer p) { p->~T(); } + template + void destroy(U* p) { + p->~U(); + } +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_MEMORY_H */ diff --git a/src/core/lib/gprpp/orphanable.h b/src/core/lib/gprpp/orphanable.h new file mode 100644 index 0000000000..50199730c9 --- /dev/null +++ b/src/core/lib/gprpp/orphanable.h @@ -0,0 +1,171 @@ +/* + * + * 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_GPRPP_ORPHANABLE_H +#define GRPC_CORE_LIB_GPRPP_ORPHANABLE_H + +#include +#include + +#include + +#include "src/core/lib/debug/trace.h" +#include "src/core/lib/gprpp/abstract.h" +#include "src/core/lib/gprpp/debug_location.h" +#include "src/core/lib/gprpp/memory.h" + +namespace grpc_core { + +// A base class for orphanable objects, which have one external owner +// but are not necessarily destroyed immediately when the external owner +// gives up ownership. Instead, the owner calls the object's Orphan() +// method, and the object then takes responsibility for its own cleanup +// and destruction. +class Orphanable { + public: + // Gives up ownership of the object. The implementation must arrange + // to eventually destroy the object without further interaction from the + // caller. + virtual void Orphan() GRPC_ABSTRACT; + + // Not copyable or movable. + Orphanable(const Orphanable&) = delete; + Orphanable& operator=(const Orphanable&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + Orphanable() {} + virtual ~Orphanable() {} +}; + +template +class OrphanableDelete { + public: + void operator()(T* p) { p->Orphan(); } +}; + +template > +using OrphanablePtr = std::unique_ptr; + +template +inline OrphanablePtr MakeOrphanable(Args&&... args) { + return OrphanablePtr(New(std::forward(args)...)); +} + +// A type of Orphanable with internal ref-counting. +class InternallyRefCounted : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCounted(const InternallyRefCounted&) = delete; + InternallyRefCounted& operator=(const InternallyRefCounted&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + InternallyRefCounted() { gpr_ref_init(&refs_, 1); } + virtual ~InternallyRefCounted() {} + + void Ref() { gpr_ref(&refs_); } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + private: + gpr_refcount refs_; +}; + +// An alternative version of the InternallyRefCounted base class that +// supports tracing. This is intended to be used in cases where the +// object will be handled both by idiomatic C++ code using smart +// pointers and legacy code that is manually calling Ref() and Unref(). +// Once all of our code is converted to idiomatic C++, we may be able to +// eliminate this class. +class InternallyRefCountedWithTracing : public Orphanable { + public: + // Not copyable nor movable. + InternallyRefCountedWithTracing(const InternallyRefCountedWithTracing&) = + delete; + InternallyRefCountedWithTracing& operator=( + const InternallyRefCountedWithTracing&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + InternallyRefCountedWithTracing() + : InternallyRefCountedWithTracing(static_cast(nullptr)) {} + + explicit InternallyRefCountedWithTracing(TraceFlag* trace_flag) + : trace_flag_(trace_flag) { + gpr_ref_init(&refs_, 1); + } + +#ifdef NDEBUG + explicit InternallyRefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : InternallyRefCountedWithTracing() {} +#endif + + virtual ~InternallyRefCountedWithTracing() {} + + void Ref() { gpr_ref(&refs_); } + + void Ref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs + 1, reason); + } + Ref(); + } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + void Unref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs - 1, reason); + } + Unref(); + } + + private: + TraceFlag* trace_flag_ = nullptr; + gpr_refcount refs_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_ORPHANABLE_H */ diff --git a/src/core/lib/gprpp/ref_counted.h b/src/core/lib/gprpp/ref_counted.h new file mode 100644 index 0000000000..c68118a71a --- /dev/null +++ b/src/core/lib/gprpp/ref_counted.h @@ -0,0 +1,133 @@ +/* + * + * 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_GPRPP_REF_COUNTED_H +#define GRPC_CORE_LIB_GPRPP_REF_COUNTED_H + +#include +#include + +#include "src/core/lib/debug/trace.h" +#include "src/core/lib/gprpp/abstract.h" +#include "src/core/lib/gprpp/debug_location.h" +#include "src/core/lib/gprpp/memory.h" + +namespace grpc_core { + +// A base class for reference-counted objects. +// New objects should be created via New() and start with a refcount of 1. +// When the refcount reaches 0, the object will be deleted via Delete(). +class RefCounted { + public: + void Ref() { gpr_ref(&refs_); } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + // Not copyable nor movable. + RefCounted(const RefCounted&) = delete; + RefCounted& operator=(const RefCounted&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + RefCounted() { gpr_ref_init(&refs_, 1); } + + virtual ~RefCounted() {} + + private: + gpr_refcount refs_; +}; + +// An alternative version of the RefCounted base class that +// supports tracing. This is intended to be used in cases where the +// object will be handled both by idiomatic C++ code using smart +// pointers and legacy code that is manually calling Ref() and Unref(). +// Once all of our code is converted to idiomatic C++, we may be able to +// eliminate this class. +class RefCountedWithTracing { + public: + void Ref() { gpr_ref(&refs_); } + + void Ref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d ref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs + 1, reason); + } + Ref(); + } + + void Unref() { + if (gpr_unref(&refs_)) { + Delete(this); + } + } + + void Unref(const DebugLocation& location, const char* reason) { + if (location.Log() && trace_flag_ != nullptr && trace_flag_->enabled()) { + gpr_atm old_refs = gpr_atm_no_barrier_load(&refs_.count); + gpr_log(GPR_DEBUG, "%s:%p %s:%d unref %" PRIdPTR " -> %" PRIdPTR " %s", + trace_flag_->name(), this, location.file(), location.line(), + old_refs, old_refs - 1, reason); + } + Unref(); + } + + // Not copyable nor movable. + RefCountedWithTracing(const RefCountedWithTracing&) = delete; + RefCountedWithTracing& operator=(const RefCountedWithTracing&) = delete; + + GRPC_ABSTRACT_BASE_CLASS + + protected: + // Allow Delete() to access destructor. + template + friend void Delete(T*); + + RefCountedWithTracing() + : RefCountedWithTracing(static_cast(nullptr)) {} + + explicit RefCountedWithTracing(TraceFlag* trace_flag) + : trace_flag_(trace_flag) { + gpr_ref_init(&refs_, 1); + } + +#ifdef NDEBUG + explicit RefCountedWithTracing(DebugOnlyTraceFlag* trace_flag) + : RefCountedWithTracing() {} +#endif + + virtual ~RefCountedWithTracing() {} + + private: + TraceFlag* trace_flag_ = nullptr; + gpr_refcount refs_; +}; + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_REF_COUNTED_H */ diff --git a/src/core/lib/gprpp/ref_counted_ptr.h b/src/core/lib/gprpp/ref_counted_ptr.h new file mode 100644 index 0000000000..dda0f00d79 --- /dev/null +++ b/src/core/lib/gprpp/ref_counted_ptr.h @@ -0,0 +1,99 @@ +/* + * + * 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_GPRPP_REF_COUNTED_PTR_H +#define GRPC_CORE_LIB_GPRPP_REF_COUNTED_PTR_H + +#include + +#include "src/core/lib/gprpp/memory.h" + +namespace grpc_core { + +// A smart pointer class for objects that provide Ref() and Unref() methods, +// such as those provided by the RefCounted base class. +template +class RefCountedPtr { + public: + RefCountedPtr() {} + + // If value is non-null, we take ownership of a ref to it. + explicit RefCountedPtr(T* value) { value_ = value; } + + // Move support. + RefCountedPtr(RefCountedPtr&& other) { + value_ = other.value_; + other.value_ = nullptr; + } + RefCountedPtr& operator=(RefCountedPtr&& other) { + if (value_ != nullptr) value_->Unref(); + value_ = other.value_; + other.value_ = nullptr; + return *this; + } + + // Copy support. + RefCountedPtr(const RefCountedPtr& other) { + if (other.value_ != nullptr) other.value_->Ref(); + value_ = other.value_; + } + RefCountedPtr& operator=(const RefCountedPtr& other) { + // Note: Order of reffing and unreffing is important here in case value_ + // and other.value_ are the same object. + if (other.value_ != nullptr) other.value_->Ref(); + if (value_ != nullptr) value_->Unref(); + value_ = other.value_; + return *this; + } + + ~RefCountedPtr() { + if (value_ != nullptr) value_->Unref(); + } + + // If value is non-null, we take ownership of a ref to it. + void reset(T* value = nullptr) { + if (value_ != nullptr) value_->Unref(); + value_ = value; + } + + T* get() const { return value_; } + + T& operator*() const { return *value_; } + T* operator->() const { return value_; } + + bool operator==(const RefCountedPtr& other) const { + return value_ == other.value_; + } + bool operator==(const T* other) const { return value_ == other; } + bool operator!=(const RefCountedPtr& other) const { + return value_ != other.value_; + } + bool operator!=(const T* other) const { return value_ != other; } + + private: + T* value_ = nullptr; +}; + +template +inline RefCountedPtr MakeRefCounted(Args&&... args) { + return RefCountedPtr(New(std::forward(args)...)); +} + +} // namespace grpc_core + +#endif /* GRPC_CORE_LIB_GPRPP_REF_COUNTED_PTR_H */ diff --git a/src/core/lib/iomgr/ev_epoll1_linux.cc b/src/core/lib/iomgr/ev_epoll1_linux.cc index 1cb0150f45..42d7cdd348 100644 --- a/src/core/lib/iomgr/ev_epoll1_linux.cc +++ b/src/core/lib/iomgr/ev_epoll1_linux.cc @@ -43,8 +43,8 @@ #include #include "src/core/lib/debug/stats.h" -#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/gpr/string.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index b81c00ca7a..416e8384b4 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -41,8 +41,8 @@ #include #include "src/core/lib/debug/stats.h" -#include "src/core/lib/gpr++/manual_constructor.h" #include "src/core/lib/gpr/spinlock.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/is_epollexclusive_available.h" diff --git a/src/core/lib/iomgr/ev_epollsig_linux.cc b/src/core/lib/iomgr/ev_epollsig_linux.cc index 11c64d080c..1518348992 100644 --- a/src/core/lib/iomgr/ev_epollsig_linux.cc +++ b/src/core/lib/iomgr/ev_epollsig_linux.cc @@ -43,7 +43,7 @@ #include #include "src/core/lib/debug/stats.h" -#include "src/core/lib/gpr++/manual_constructor.h" +#include "src/core/lib/gprpp/manual_constructor.h" #include "src/core/lib/iomgr/block_annotate.h" #include "src/core/lib/iomgr/ev_posix.h" #include "src/core/lib/iomgr/iomgr_internal.h" diff --git a/src/core/lib/surface/lame_client.cc b/src/core/lib/surface/lame_client.cc index 27a2a4eeb6..a1f1cf1107 100644 --- a/src/core/lib/surface/lame_client.cc +++ b/src/core/lib/surface/lame_client.cc @@ -23,7 +23,7 @@ #include #include -#include "src/core/lib/gpr++/atomic.h" +#include "src/core/lib/gprpp/atomic.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/gpr/string.h" diff --git a/test/core/gpr++/BUILD b/test/core/gpr++/BUILD deleted file mode 100644 index 93324a378b..0000000000 --- a/test/core/gpr++/BUILD +++ /dev/null @@ -1,95 +0,0 @@ -# Copyright 2016 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. - -load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_cc_binary", "grpc_package") - -licenses(["notice"]) # Apache v2 - -grpc_package(name = "test/core/gpr++") - -grpc_cc_test( - name = "manual_constructor_test", - srcs = ["manual_constructor_test.cc"], - language = "C++", - deps = [ - "//:gpr", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "memory_test", - srcs = ["memory_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:grpc", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "inlined_vector_test", - srcs = ["inlined_vector_test.cc"], - external_deps = [ - "gtest", - ], - language = "C++", - deps = [ - "//:grpc", - "//test/core/util:gpr_test_util", - ], -) - -grpc_cc_test( - name = "orphanable_test", - srcs = ["orphanable_test.cc"], - language = "C++", - deps = [ - "//:orphanable", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) - -grpc_cc_test( - name = "ref_counted_test", - srcs = ["ref_counted_test.cc"], - language = "C++", - deps = [ - "//:ref_counted", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) - -grpc_cc_test( - name = "ref_counted_ptr_test", - srcs = ["ref_counted_ptr_test.cc"], - language = "C++", - deps = [ - "//:ref_counted", - "//:ref_counted_ptr", - "//test/core/util:gpr_test_util", - ], - external_deps = [ - "gtest", - ], -) diff --git a/test/core/gpr++/inlined_vector_test.cc b/test/core/gpr++/inlined_vector_test.cc deleted file mode 100644 index 09d5453a56..0000000000 --- a/test/core/gpr++/inlined_vector_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/gpr++/inlined_vector.h" -#include -#include "src/core/lib/gpr++/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -TEST(InlinedVectorTest, CreateAndIterate) { - const int kNumElements = 9; - InlinedVector v; - for (int i = 0; i < kNumElements; ++i) { - v.push_back(i); - } - EXPECT_EQ(static_cast(kNumElements), v.size()); - for (int i = 0; i < kNumElements; ++i) { - EXPECT_EQ(i, v[i]); - } -} - -TEST(InlinedVectorTest, ValuesAreInlined) { - const int kNumElements = 5; - InlinedVector v; - for (int i = 0; i < kNumElements; ++i) { - v.push_back(i); - } - EXPECT_EQ(static_cast(kNumElements), v.size()); - for (int i = 0; i < kNumElements; ++i) { - EXPECT_EQ(i, v[i]); - } -} - -TEST(InlinedVectorTest, PushBackWithMove) { - InlinedVector, 1> v; - UniquePtr i = MakeUnique(3); - v.push_back(std::move(i)); - EXPECT_EQ(nullptr, i.get()); - EXPECT_EQ(1UL, v.size()); - EXPECT_EQ(3, *v[0]); -} - -TEST(InlinedVectorTest, EmplaceBack) { - InlinedVector, 1> v; - v.emplace_back(New(3)); - EXPECT_EQ(1UL, v.size()); - EXPECT_EQ(3, *v[0]); -} - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/gpr++/manual_constructor_test.cc b/test/core/gpr++/manual_constructor_test.cc deleted file mode 100644 index e049b793f6..0000000000 --- a/test/core/gpr++/manual_constructor_test.cc +++ /dev/null @@ -1,99 +0,0 @@ -/* - * - * 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. - * - */ - -/* Test of gpr synchronization support. */ - -#include "src/core/lib/gpr++/manual_constructor.h" -#include -#include -#include -#include -#include -#include -#include -#include "src/core/lib/gpr++/abstract.h" -#include "test/core/util/test_config.h" - -class A { - public: - A() {} - virtual ~A() {} - virtual const char* foo() { return "A_foo"; } - virtual const char* bar() { return "A_bar"; } - GRPC_ABSTRACT_BASE_CLASS -}; - -class B : public A { - public: - B() {} - ~B() {} - const char* foo() override { return "B_foo"; } - char get_junk() { return junk[0]; } - - private: - char junk[1000]; -}; - -class C : public B { - public: - C() {} - ~C() {} - virtual const char* bar() { return "C_bar"; } - char get_more_junk() { return more_junk[0]; } - - private: - char more_junk[1000]; -}; - -class D : public A { - public: - virtual const char* bar() { return "D_bar"; } -}; - -static void basic_test() { - grpc_core::PolymorphicManualConstructor poly; - poly.Init(); - GPR_ASSERT(!strcmp(poly->foo(), "B_foo")); - GPR_ASSERT(!strcmp(poly->bar(), "A_bar")); -} - -static void complex_test() { - grpc_core::PolymorphicManualConstructor polyB; - polyB.Init(); - GPR_ASSERT(!strcmp(polyB->foo(), "B_foo")); - GPR_ASSERT(!strcmp(polyB->bar(), "A_bar")); - - grpc_core::PolymorphicManualConstructor polyC; - polyC.Init(); - GPR_ASSERT(!strcmp(polyC->foo(), "B_foo")); - GPR_ASSERT(!strcmp(polyC->bar(), "C_bar")); - - grpc_core::PolymorphicManualConstructor polyD; - polyD.Init(); - GPR_ASSERT(!strcmp(polyD->foo(), "A_foo")); - GPR_ASSERT(!strcmp(polyD->bar(), "D_bar")); -} - -/* ------------------------------------------------- */ - -int main(int argc, char* argv[]) { - grpc_test_init(argc, argv); - basic_test(); - complex_test(); - return 0; -} diff --git a/test/core/gpr++/memory_test.cc b/test/core/gpr++/memory_test.cc deleted file mode 100644 index 3553e119e3..0000000000 --- a/test/core/gpr++/memory_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/gpr++/memory.h" -#include -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { - -struct Foo { - Foo(int p, int q) : a(p), b(q) {} - int a; - int b; -}; - -TEST(MemoryTest, NewDeleteTest) { Delete(New()); } - -TEST(MemoryTest, NewDeleteWithArgTest) { - int* i = New(42); - EXPECT_EQ(42, *i); - Delete(i); -} - -TEST(MemoryTest, NewDeleteWithArgsTest) { - Foo* p = New(1, 2); - EXPECT_EQ(1, p->a); - EXPECT_EQ(2, p->b); - Delete(p); -} - -TEST(MemoryTest, MakeUniqueTest) { MakeUnique(); } - -TEST(MemoryTest, MakeUniqueWithArgTest) { - auto i = MakeUnique(42); - EXPECT_EQ(42, *i); -} - -TEST(MemoryTest, UniquePtrWithCustomDeleter) { - int n = 0; - class IncrementingDeleter { - public: - void operator()(int* p) { ++*p; } - }; - { - UniquePtr p(&n); - EXPECT_EQ(0, n); - } - EXPECT_EQ(1, n); -} - -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/gpr++/orphanable_test.cc b/test/core/gpr++/orphanable_test.cc deleted file mode 100644 index 4513d25da1..0000000000 --- a/test/core/gpr++/orphanable_test.cc +++ /dev/null @@ -1,114 +0,0 @@ -/* - * - * 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/gpr++/orphanable.h" - -#include - -#include "src/core/lib/gpr++/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public Orphanable { - public: - Foo() : Foo(0) {} - explicit Foo(int value) : value_(value) {} - void Orphan() override { Delete(this); } - int value() const { return value_; } - - private: - int value_; -}; - -TEST(Orphanable, Basic) { - Foo* foo = New(); - foo->Orphan(); -} - -TEST(OrphanablePtr, Basic) { - OrphanablePtr foo(New()); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeOrphanable, DefaultConstructor) { - auto foo = MakeOrphanable(); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeOrphanable, WithParameters) { - auto foo = MakeOrphanable(5); - EXPECT_EQ(5, foo->value()); -} - -class Bar : public InternallyRefCounted { - public: - Bar() : Bar(0) {} - explicit Bar(int value) : value_(value) {} - void Orphan() override { Unref(); } - int value() const { return value_; } - - void StartWork() { Ref(); } - void FinishWork() { Unref(); } - - private: - int value_; -}; - -TEST(OrphanablePtr, InternallyRefCounted) { - auto bar = MakeOrphanable(); - bar->StartWork(); - bar->FinishWork(); -} - -// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that -// things build properly in both debug and non-debug cases. -DebugOnlyTraceFlag baz_tracer(true, "baz"); - -class Baz : public InternallyRefCountedWithTracing { - public: - Baz() : Baz(0) {} - explicit Baz(int value) - : InternallyRefCountedWithTracing(&baz_tracer), value_(value) {} - void Orphan() override { Unref(); } - int value() const { return value_; } - - void StartWork() { Ref(DEBUG_LOCATION, "work"); } - void FinishWork() { Unref(DEBUG_LOCATION, "work"); } - - private: - int value_; -}; - -TEST(OrphanablePtr, InternallyRefCountedWithTracing) { - auto baz = MakeOrphanable(); - baz->StartWork(); - baz->FinishWork(); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/gpr++/ref_counted_ptr_test.cc b/test/core/gpr++/ref_counted_ptr_test.cc deleted file mode 100644 index e897b2859c..0000000000 --- a/test/core/gpr++/ref_counted_ptr_test.cc +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * 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/gpr++/ref_counted_ptr.h" - -#include - -#include - -#include "src/core/lib/gpr++/memory.h" -#include "src/core/lib/gpr++/ref_counted.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public RefCounted { - public: - Foo() : value_(0) {} - - explicit Foo(int value) : value_(value) {} - - int value() const { return value_; } - - private: - int value_; -}; - -TEST(RefCountedPtr, DefaultConstructor) { RefCountedPtr foo; } - -TEST(RefCountedPtr, ExplicitConstructorEmpty) { - RefCountedPtr foo(nullptr); -} - -TEST(RefCountedPtr, ExplicitConstructor) { RefCountedPtr foo(New()); } - -TEST(RefCountedPtr, MoveConstructor) { - RefCountedPtr foo(New()); - RefCountedPtr foo2(std::move(foo)); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, MoveAssignment) { - RefCountedPtr foo(New()); - RefCountedPtr foo2 = std::move(foo); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, CopyConstructor) { - RefCountedPtr foo(New()); - RefCountedPtr foo2(foo); - EXPECT_NE(nullptr, foo.get()); - EXPECT_EQ(foo.get(), foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignment) { - RefCountedPtr foo(New()); - RefCountedPtr foo2 = foo; - EXPECT_NE(nullptr, foo.get()); - EXPECT_EQ(foo.get(), foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignmentWhenEmpty) { - RefCountedPtr foo; - RefCountedPtr foo2; - foo2 = foo; - EXPECT_EQ(nullptr, foo.get()); - EXPECT_EQ(nullptr, foo2.get()); -} - -TEST(RefCountedPtr, CopyAssignmentToSelf) { - RefCountedPtr foo(New()); - foo = foo; -} - -TEST(RefCountedPtr, EnclosedScope) { - RefCountedPtr foo(New()); - { - RefCountedPtr foo2(std::move(foo)); - EXPECT_EQ(nullptr, foo.get()); - EXPECT_NE(nullptr, foo2.get()); - } - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNullToNonNull) { - RefCountedPtr foo; - EXPECT_EQ(nullptr, foo.get()); - foo.reset(New()); - EXPECT_NE(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNonNullToNonNull) { - RefCountedPtr foo(New()); - EXPECT_NE(nullptr, foo.get()); - Foo* original = foo.get(); - foo.reset(New()); - EXPECT_NE(nullptr, foo.get()); - EXPECT_NE(original, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNonNullToNull) { - RefCountedPtr foo(New()); - EXPECT_NE(nullptr, foo.get()); - foo.reset(); - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, ResetFromNullToNull) { - RefCountedPtr foo; - EXPECT_EQ(nullptr, foo.get()); - foo.reset(nullptr); - EXPECT_EQ(nullptr, foo.get()); -} - -TEST(RefCountedPtr, DerefernceOperators) { - RefCountedPtr foo(New()); - foo->value(); - Foo& foo_ref = *foo; - foo_ref.value(); -} - -TEST(RefCountedPtr, EqualityOperators) { - RefCountedPtr foo(New()); - RefCountedPtr bar = foo; - RefCountedPtr empty; - // Test equality between RefCountedPtrs. - EXPECT_EQ(foo, bar); - EXPECT_NE(foo, empty); - // Test equality with bare pointers. - EXPECT_EQ(foo, foo.get()); - EXPECT_EQ(empty, nullptr); - EXPECT_NE(foo, nullptr); -} - -TEST(MakeRefCounted, NoArgs) { - RefCountedPtr foo = MakeRefCounted(); - EXPECT_EQ(0, foo->value()); -} - -TEST(MakeRefCounted, Args) { - RefCountedPtr foo = MakeRefCounted(3); - EXPECT_EQ(3, foo->value()); -} - -TraceFlag foo_tracer(true, "foo"); - -class FooWithTracing : public RefCountedWithTracing { - public: - FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} -}; - -TEST(RefCountedPtr, RefCountedWithTracing) { - RefCountedPtr foo(New()); - foo->Ref(DEBUG_LOCATION, "foo"); - foo->Unref(DEBUG_LOCATION, "foo"); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/gpr++/ref_counted_test.cc b/test/core/gpr++/ref_counted_test.cc deleted file mode 100644 index 568ec51c64..0000000000 --- a/test/core/gpr++/ref_counted_test.cc +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * 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/gpr++/ref_counted.h" - -#include - -#include "src/core/lib/gpr++/memory.h" -#include "test/core/util/test_config.h" - -namespace grpc_core { -namespace testing { -namespace { - -class Foo : public RefCounted { - public: - Foo() {} -}; - -TEST(RefCounted, Basic) { - Foo* foo = New(); - foo->Unref(); -} - -TEST(RefCounted, ExtraRef) { - Foo* foo = New(); - foo->Ref(); - foo->Unref(); - foo->Unref(); -} - -// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that -// things build properly in both debug and non-debug cases. -DebugOnlyTraceFlag foo_tracer(true, "foo"); - -class FooWithTracing : public RefCountedWithTracing { - public: - FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} -}; - -TEST(RefCountedWithTracing, Basic) { - FooWithTracing* foo = New(); - foo->Ref(DEBUG_LOCATION, "extra_ref"); - foo->Unref(DEBUG_LOCATION, "extra_ref"); - // Can use the no-argument methods, too. - foo->Ref(); - foo->Unref(); - foo->Unref(DEBUG_LOCATION, "original_ref"); -} - -} // namespace -} // namespace testing -} // namespace grpc_core - -int main(int argc, char** argv) { - grpc_test_init(argc, argv); - ::testing::InitGoogleTest(&argc, argv); - return RUN_ALL_TESTS(); -} diff --git a/test/core/gprpp/BUILD b/test/core/gprpp/BUILD new file mode 100644 index 0000000000..1c11e0bdb5 --- /dev/null +++ b/test/core/gprpp/BUILD @@ -0,0 +1,96 @@ +# Copyright 2016 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. + +load("//bazel:grpc_build_system.bzl", "grpc_cc_library", "grpc_cc_test", "grpc_cc_binary", "grpc_package") + +licenses(["notice"]) # Apache v2 + +grpc_package(name = "test/core/gprpp") + +grpc_cc_test( + name = "manual_constructor_test", + srcs = ["manual_constructor_test.cc"], + language = "C++", + deps = [ + "//:gpr", + "//:gpr++_base", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "memory_test", + srcs = ["memory_test.cc"], + external_deps = [ + "gtest", + ], + language = "C++", + deps = [ + "//:gpr++_base", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "inlined_vector_test", + srcs = ["inlined_vector_test.cc"], + external_deps = [ + "gtest", + ], + language = "C++", + deps = [ + "//:inlined_vector", + "//test/core/util:gpr_test_util", + ], +) + +grpc_cc_test( + name = "orphanable_test", + srcs = ["orphanable_test.cc"], + language = "C++", + deps = [ + "//:orphanable", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) + +grpc_cc_test( + name = "ref_counted_test", + srcs = ["ref_counted_test.cc"], + language = "C++", + deps = [ + "//:ref_counted", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) + +grpc_cc_test( + name = "ref_counted_ptr_test", + srcs = ["ref_counted_ptr_test.cc"], + language = "C++", + deps = [ + "//:ref_counted", + "//:ref_counted_ptr", + "//test/core/util:gpr_test_util", + ], + external_deps = [ + "gtest", + ], +) diff --git a/test/core/gprpp/inlined_vector_test.cc b/test/core/gprpp/inlined_vector_test.cc new file mode 100644 index 0000000000..0e712dafe4 --- /dev/null +++ b/test/core/gprpp/inlined_vector_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gprpp/inlined_vector.h" +#include +#include "src/core/lib/gprpp/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { + +TEST(InlinedVectorTest, CreateAndIterate) { + const int kNumElements = 9; + InlinedVector v; + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + } + EXPECT_EQ(static_cast(kNumElements), v.size()); + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } +} + +TEST(InlinedVectorTest, ValuesAreInlined) { + const int kNumElements = 5; + InlinedVector v; + for (int i = 0; i < kNumElements; ++i) { + v.push_back(i); + } + EXPECT_EQ(static_cast(kNumElements), v.size()); + for (int i = 0; i < kNumElements; ++i) { + EXPECT_EQ(i, v[i]); + } +} + +TEST(InlinedVectorTest, PushBackWithMove) { + InlinedVector, 1> v; + UniquePtr i = MakeUnique(3); + v.push_back(std::move(i)); + EXPECT_EQ(nullptr, i.get()); + EXPECT_EQ(1UL, v.size()); + EXPECT_EQ(3, *v[0]); +} + +TEST(InlinedVectorTest, EmplaceBack) { + InlinedVector, 1> v; + v.emplace_back(New(3)); + EXPECT_EQ(1UL, v.size()); + EXPECT_EQ(3, *v[0]); +} + +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gprpp/manual_constructor_test.cc b/test/core/gprpp/manual_constructor_test.cc new file mode 100644 index 0000000000..f06c3cab06 --- /dev/null +++ b/test/core/gprpp/manual_constructor_test.cc @@ -0,0 +1,99 @@ +/* + * + * 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. + * + */ + +/* Test of gpr synchronization support. */ + +#include "src/core/lib/gprpp/manual_constructor.h" +#include +#include +#include +#include +#include +#include +#include +#include "src/core/lib/gprpp/abstract.h" +#include "test/core/util/test_config.h" + +class A { + public: + A() {} + virtual ~A() {} + virtual const char* foo() { return "A_foo"; } + virtual const char* bar() { return "A_bar"; } + GRPC_ABSTRACT_BASE_CLASS +}; + +class B : public A { + public: + B() {} + ~B() {} + const char* foo() override { return "B_foo"; } + char get_junk() { return junk[0]; } + + private: + char junk[1000]; +}; + +class C : public B { + public: + C() {} + ~C() {} + virtual const char* bar() { return "C_bar"; } + char get_more_junk() { return more_junk[0]; } + + private: + char more_junk[1000]; +}; + +class D : public A { + public: + virtual const char* bar() { return "D_bar"; } +}; + +static void basic_test() { + grpc_core::PolymorphicManualConstructor poly; + poly.Init(); + GPR_ASSERT(!strcmp(poly->foo(), "B_foo")); + GPR_ASSERT(!strcmp(poly->bar(), "A_bar")); +} + +static void complex_test() { + grpc_core::PolymorphicManualConstructor polyB; + polyB.Init(); + GPR_ASSERT(!strcmp(polyB->foo(), "B_foo")); + GPR_ASSERT(!strcmp(polyB->bar(), "A_bar")); + + grpc_core::PolymorphicManualConstructor polyC; + polyC.Init(); + GPR_ASSERT(!strcmp(polyC->foo(), "B_foo")); + GPR_ASSERT(!strcmp(polyC->bar(), "C_bar")); + + grpc_core::PolymorphicManualConstructor polyD; + polyD.Init(); + GPR_ASSERT(!strcmp(polyD->foo(), "A_foo")); + GPR_ASSERT(!strcmp(polyD->bar(), "D_bar")); +} + +/* ------------------------------------------------- */ + +int main(int argc, char* argv[]) { + grpc_test_init(argc, argv); + basic_test(); + complex_test(); + return 0; +} diff --git a/test/core/gprpp/memory_test.cc b/test/core/gprpp/memory_test.cc new file mode 100644 index 0000000000..180c36fad7 --- /dev/null +++ b/test/core/gprpp/memory_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gprpp/memory.h" +#include +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { + +struct Foo { + Foo(int p, int q) : a(p), b(q) {} + int a; + int b; +}; + +TEST(MemoryTest, NewDeleteTest) { Delete(New()); } + +TEST(MemoryTest, NewDeleteWithArgTest) { + int* i = New(42); + EXPECT_EQ(42, *i); + Delete(i); +} + +TEST(MemoryTest, NewDeleteWithArgsTest) { + Foo* p = New(1, 2); + EXPECT_EQ(1, p->a); + EXPECT_EQ(2, p->b); + Delete(p); +} + +TEST(MemoryTest, MakeUniqueTest) { MakeUnique(); } + +TEST(MemoryTest, MakeUniqueWithArgTest) { + auto i = MakeUnique(42); + EXPECT_EQ(42, *i); +} + +TEST(MemoryTest, UniquePtrWithCustomDeleter) { + int n = 0; + class IncrementingDeleter { + public: + void operator()(int* p) { ++*p; } + }; + { + UniquePtr p(&n); + EXPECT_EQ(0, n); + } + EXPECT_EQ(1, n); +} + +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gprpp/orphanable_test.cc b/test/core/gprpp/orphanable_test.cc new file mode 100644 index 0000000000..ff2f6d8bc2 --- /dev/null +++ b/test/core/gprpp/orphanable_test.cc @@ -0,0 +1,114 @@ +/* + * + * 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/gprpp/orphanable.h" + +#include + +#include "src/core/lib/gprpp/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public Orphanable { + public: + Foo() : Foo(0) {} + explicit Foo(int value) : value_(value) {} + void Orphan() override { Delete(this); } + int value() const { return value_; } + + private: + int value_; +}; + +TEST(Orphanable, Basic) { + Foo* foo = New(); + foo->Orphan(); +} + +TEST(OrphanablePtr, Basic) { + OrphanablePtr foo(New()); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, DefaultConstructor) { + auto foo = MakeOrphanable(); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeOrphanable, WithParameters) { + auto foo = MakeOrphanable(5); + EXPECT_EQ(5, foo->value()); +} + +class Bar : public InternallyRefCounted { + public: + Bar() : Bar(0) {} + explicit Bar(int value) : value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(); } + void FinishWork() { Unref(); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCounted) { + auto bar = MakeOrphanable(); + bar->StartWork(); + bar->FinishWork(); +} + +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag baz_tracer(true, "baz"); + +class Baz : public InternallyRefCountedWithTracing { + public: + Baz() : Baz(0) {} + explicit Baz(int value) + : InternallyRefCountedWithTracing(&baz_tracer), value_(value) {} + void Orphan() override { Unref(); } + int value() const { return value_; } + + void StartWork() { Ref(DEBUG_LOCATION, "work"); } + void FinishWork() { Unref(DEBUG_LOCATION, "work"); } + + private: + int value_; +}; + +TEST(OrphanablePtr, InternallyRefCountedWithTracing) { + auto baz = MakeOrphanable(); + baz->StartWork(); + baz->FinishWork(); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gprpp/ref_counted_ptr_test.cc b/test/core/gprpp/ref_counted_ptr_test.cc new file mode 100644 index 0000000000..f1f13f3183 --- /dev/null +++ b/test/core/gprpp/ref_counted_ptr_test.cc @@ -0,0 +1,185 @@ +/* + * + * 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/gprpp/ref_counted_ptr.h" + +#include + +#include + +#include "src/core/lib/gprpp/memory.h" +#include "src/core/lib/gprpp/ref_counted.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public RefCounted { + public: + Foo() : value_(0) {} + + explicit Foo(int value) : value_(value) {} + + int value() const { return value_; } + + private: + int value_; +}; + +TEST(RefCountedPtr, DefaultConstructor) { RefCountedPtr foo; } + +TEST(RefCountedPtr, ExplicitConstructorEmpty) { + RefCountedPtr foo(nullptr); +} + +TEST(RefCountedPtr, ExplicitConstructor) { RefCountedPtr foo(New()); } + +TEST(RefCountedPtr, MoveConstructor) { + RefCountedPtr foo(New()); + RefCountedPtr foo2(std::move(foo)); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, MoveAssignment) { + RefCountedPtr foo(New()); + RefCountedPtr foo2 = std::move(foo); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, CopyConstructor) { + RefCountedPtr foo(New()); + RefCountedPtr foo2(foo); + EXPECT_NE(nullptr, foo.get()); + EXPECT_EQ(foo.get(), foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignment) { + RefCountedPtr foo(New()); + RefCountedPtr foo2 = foo; + EXPECT_NE(nullptr, foo.get()); + EXPECT_EQ(foo.get(), foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignmentWhenEmpty) { + RefCountedPtr foo; + RefCountedPtr foo2; + foo2 = foo; + EXPECT_EQ(nullptr, foo.get()); + EXPECT_EQ(nullptr, foo2.get()); +} + +TEST(RefCountedPtr, CopyAssignmentToSelf) { + RefCountedPtr foo(New()); + foo = foo; +} + +TEST(RefCountedPtr, EnclosedScope) { + RefCountedPtr foo(New()); + { + RefCountedPtr foo2(std::move(foo)); + EXPECT_EQ(nullptr, foo.get()); + EXPECT_NE(nullptr, foo2.get()); + } + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNullToNonNull) { + RefCountedPtr foo; + EXPECT_EQ(nullptr, foo.get()); + foo.reset(New()); + EXPECT_NE(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNonNullToNonNull) { + RefCountedPtr foo(New()); + EXPECT_NE(nullptr, foo.get()); + Foo* original = foo.get(); + foo.reset(New()); + EXPECT_NE(nullptr, foo.get()); + EXPECT_NE(original, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNonNullToNull) { + RefCountedPtr foo(New()); + EXPECT_NE(nullptr, foo.get()); + foo.reset(); + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, ResetFromNullToNull) { + RefCountedPtr foo; + EXPECT_EQ(nullptr, foo.get()); + foo.reset(nullptr); + EXPECT_EQ(nullptr, foo.get()); +} + +TEST(RefCountedPtr, DerefernceOperators) { + RefCountedPtr foo(New()); + foo->value(); + Foo& foo_ref = *foo; + foo_ref.value(); +} + +TEST(RefCountedPtr, EqualityOperators) { + RefCountedPtr foo(New()); + RefCountedPtr bar = foo; + RefCountedPtr empty; + // Test equality between RefCountedPtrs. + EXPECT_EQ(foo, bar); + EXPECT_NE(foo, empty); + // Test equality with bare pointers. + EXPECT_EQ(foo, foo.get()); + EXPECT_EQ(empty, nullptr); + EXPECT_NE(foo, nullptr); +} + +TEST(MakeRefCounted, NoArgs) { + RefCountedPtr foo = MakeRefCounted(); + EXPECT_EQ(0, foo->value()); +} + +TEST(MakeRefCounted, Args) { + RefCountedPtr foo = MakeRefCounted(3); + EXPECT_EQ(3, foo->value()); +} + +TraceFlag foo_tracer(true, "foo"); + +class FooWithTracing : public RefCountedWithTracing { + public: + FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} +}; + +TEST(RefCountedPtr, RefCountedWithTracing) { + RefCountedPtr foo(New()); + foo->Ref(DEBUG_LOCATION, "foo"); + foo->Unref(DEBUG_LOCATION, "foo"); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/test/core/gprpp/ref_counted_test.cc b/test/core/gprpp/ref_counted_test.cc new file mode 100644 index 0000000000..b1b0fee5c0 --- /dev/null +++ b/test/core/gprpp/ref_counted_test.cc @@ -0,0 +1,74 @@ +/* + * + * 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/gprpp/ref_counted.h" + +#include + +#include "src/core/lib/gprpp/memory.h" +#include "test/core/util/test_config.h" + +namespace grpc_core { +namespace testing { +namespace { + +class Foo : public RefCounted { + public: + Foo() {} +}; + +TEST(RefCounted, Basic) { + Foo* foo = New(); + foo->Unref(); +} + +TEST(RefCounted, ExtraRef) { + Foo* foo = New(); + foo->Ref(); + foo->Unref(); + foo->Unref(); +} + +// Note: We use DebugOnlyTraceFlag instead of TraceFlag to ensure that +// things build properly in both debug and non-debug cases. +DebugOnlyTraceFlag foo_tracer(true, "foo"); + +class FooWithTracing : public RefCountedWithTracing { + public: + FooWithTracing() : RefCountedWithTracing(&foo_tracer) {} +}; + +TEST(RefCountedWithTracing, Basic) { + FooWithTracing* foo = New(); + foo->Ref(DEBUG_LOCATION, "extra_ref"); + foo->Unref(DEBUG_LOCATION, "extra_ref"); + // Can use the no-argument methods, too. + foo->Ref(); + foo->Unref(); + foo->Unref(DEBUG_LOCATION, "original_ref"); +} + +} // namespace +} // namespace testing +} // namespace grpc_core + +int main(int argc, char** argv) { + grpc_test_init(argc, argv); + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index 55b10268ba..a6c5fb2c8e 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -950,17 +950,6 @@ src/core/lib/compression/stream_compression_identity.h \ src/core/lib/debug/stats.h \ src/core/lib/debug/stats_data.h \ src/core/lib/debug/trace.h \ -src/core/lib/gpr++/abstract.h \ -src/core/lib/gpr++/atomic.h \ -src/core/lib/gpr++/atomic_with_atm.h \ -src/core/lib/gpr++/atomic_with_std.h \ -src/core/lib/gpr++/debug_location.h \ -src/core/lib/gpr++/inlined_vector.h \ -src/core/lib/gpr++/manual_constructor.h \ -src/core/lib/gpr++/memory.h \ -src/core/lib/gpr++/orphanable.h \ -src/core/lib/gpr++/ref_counted.h \ -src/core/lib/gpr++/ref_counted_ptr.h \ src/core/lib/gpr/arena.h \ src/core/lib/gpr/env.h \ src/core/lib/gpr/fork.h \ @@ -972,6 +961,17 @@ src/core/lib/gpr/string_windows.h \ src/core/lib/gpr/thd_internal.h \ src/core/lib/gpr/time_precise.h \ src/core/lib/gpr/tmpfile.h \ +src/core/lib/gprpp/abstract.h \ +src/core/lib/gprpp/atomic.h \ +src/core/lib/gprpp/atomic_with_atm.h \ +src/core/lib/gprpp/atomic_with_std.h \ +src/core/lib/gprpp/debug_location.h \ +src/core/lib/gprpp/inlined_vector.h \ +src/core/lib/gprpp/manual_constructor.h \ +src/core/lib/gprpp/memory.h \ +src/core/lib/gprpp/orphanable.h \ +src/core/lib/gprpp/ref_counted.h \ +src/core/lib/gprpp/ref_counted_ptr.h \ src/core/lib/http/format_request.h \ src/core/lib/http/httpcli.h \ src/core/lib/http/parser.h \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 7857ec72fd..f3e624ba72 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -1064,18 +1064,6 @@ src/core/lib/debug/stats_data.cc \ src/core/lib/debug/stats_data.h \ src/core/lib/debug/trace.cc \ src/core/lib/debug/trace.h \ -src/core/lib/gpr++/README.md \ -src/core/lib/gpr++/abstract.h \ -src/core/lib/gpr++/atomic.h \ -src/core/lib/gpr++/atomic_with_atm.h \ -src/core/lib/gpr++/atomic_with_std.h \ -src/core/lib/gpr++/debug_location.h \ -src/core/lib/gpr++/inlined_vector.h \ -src/core/lib/gpr++/manual_constructor.h \ -src/core/lib/gpr++/memory.h \ -src/core/lib/gpr++/orphanable.h \ -src/core/lib/gpr++/ref_counted.h \ -src/core/lib/gpr++/ref_counted_ptr.h \ src/core/lib/gpr/README.md \ src/core/lib/gpr/alloc.cc \ src/core/lib/gpr/arena.cc \ @@ -1130,6 +1118,18 @@ src/core/lib/gpr/tmpfile_msys.cc \ src/core/lib/gpr/tmpfile_posix.cc \ src/core/lib/gpr/tmpfile_windows.cc \ src/core/lib/gpr/wrap_memcpy.cc \ +src/core/lib/gprpp/README.md \ +src/core/lib/gprpp/abstract.h \ +src/core/lib/gprpp/atomic.h \ +src/core/lib/gprpp/atomic_with_atm.h \ +src/core/lib/gprpp/atomic_with_std.h \ +src/core/lib/gprpp/debug_location.h \ +src/core/lib/gprpp/inlined_vector.h \ +src/core/lib/gprpp/manual_constructor.h \ +src/core/lib/gprpp/memory.h \ +src/core/lib/gprpp/orphanable.h \ +src/core/lib/gprpp/ref_counted.h \ +src/core/lib/gprpp/ref_counted_ptr.h \ src/core/lib/http/format_request.cc \ src/core/lib/http/format_request.h \ src/core/lib/http/httpcli.cc \ diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json index 982d9ef649..362effd7d2 100644 --- a/tools/run_tests/generated/sources_and_headers.json +++ b/tools/run_tests/generated/sources_and_headers.json @@ -687,7 +687,7 @@ "language": "c", "name": "gpr_manual_constructor_test", "src": [ - "test/core/gpr++/manual_constructor_test.cc" + "test/core/gprpp/manual_constructor_test.cc" ], "third_party": false, "type": "target" @@ -3542,7 +3542,7 @@ "language": "c++", "name": "inlined_vector_test", "src": [ - "test/core/gpr++/inlined_vector_test.cc" + "test/core/gprpp/inlined_vector_test.cc" ], "third_party": false, "type": "target" @@ -3662,7 +3662,7 @@ "language": "c++", "name": "memory_test", "src": [ - "test/core/gpr++/memory_test.cc" + "test/core/gprpp/memory_test.cc" ], "third_party": false, "type": "target" @@ -3740,7 +3740,7 @@ "language": "c++", "name": "orphanable_test", "src": [ - "test/core/gpr++/orphanable_test.cc" + "test/core/gprpp/orphanable_test.cc" ], "third_party": false, "type": "target" @@ -3951,7 +3951,7 @@ "language": "c++", "name": "ref_counted_ptr_test", "src": [ - "test/core/gpr++/ref_counted_ptr_test.cc" + "test/core/gprpp/ref_counted_ptr_test.cc" ], "third_party": false, "type": "target" @@ -3970,7 +3970,7 @@ "language": "c++", "name": "ref_counted_test", "src": [ - "test/core/gpr++/ref_counted_test.cc" + "test/core/gprpp/ref_counted_test.cc" ], "third_party": false, "type": "target" @@ -7906,12 +7906,6 @@ "include/grpc/support/tls_msvc.h", "include/grpc/support/tls_pthread.h", "include/grpc/support/useful.h", - "src/core/lib/gpr++/abstract.h", - "src/core/lib/gpr++/atomic.h", - "src/core/lib/gpr++/atomic_with_atm.h", - "src/core/lib/gpr++/atomic_with_std.h", - "src/core/lib/gpr++/manual_constructor.h", - "src/core/lib/gpr++/memory.h", "src/core/lib/gpr/arena.h", "src/core/lib/gpr/env.h", "src/core/lib/gpr/fork.h", @@ -7923,6 +7917,12 @@ "src/core/lib/gpr/thd_internal.h", "src/core/lib/gpr/time_precise.h", "src/core/lib/gpr/tmpfile.h", + "src/core/lib/gprpp/abstract.h", + "src/core/lib/gprpp/atomic.h", + "src/core/lib/gprpp/atomic_with_atm.h", + "src/core/lib/gprpp/atomic_with_std.h", + "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/memory.h", "src/core/lib/profiling/timers.h" ], "is_filegroup": true, @@ -7955,12 +7955,6 @@ "include/grpc/support/tls_msvc.h", "include/grpc/support/tls_pthread.h", "include/grpc/support/useful.h", - "src/core/lib/gpr++/abstract.h", - "src/core/lib/gpr++/atomic.h", - "src/core/lib/gpr++/atomic_with_atm.h", - "src/core/lib/gpr++/atomic_with_std.h", - "src/core/lib/gpr++/manual_constructor.h", - "src/core/lib/gpr++/memory.h", "src/core/lib/gpr/arena.h", "src/core/lib/gpr/env.h", "src/core/lib/gpr/fork.h", @@ -7972,6 +7966,12 @@ "src/core/lib/gpr/thd_internal.h", "src/core/lib/gpr/time_precise.h", "src/core/lib/gpr/tmpfile.h", + "src/core/lib/gprpp/abstract.h", + "src/core/lib/gprpp/atomic.h", + "src/core/lib/gprpp/atomic_with_atm.h", + "src/core/lib/gprpp/atomic_with_std.h", + "src/core/lib/gprpp/manual_constructor.h", + "src/core/lib/gprpp/memory.h", "src/core/lib/profiling/timers.h" ], "third_party": false, @@ -8229,11 +8229,11 @@ "src/core/lib/compression/stream_compression_identity.h", "src/core/lib/debug/stats.h", "src/core/lib/debug/stats_data.h", - "src/core/lib/gpr++/debug_location.h", - "src/core/lib/gpr++/inlined_vector.h", - "src/core/lib/gpr++/orphanable.h", - "src/core/lib/gpr++/ref_counted.h", - "src/core/lib/gpr++/ref_counted_ptr.h", + "src/core/lib/gprpp/debug_location.h", + "src/core/lib/gprpp/inlined_vector.h", + "src/core/lib/gprpp/orphanable.h", + "src/core/lib/gprpp/ref_counted.h", + "src/core/lib/gprpp/ref_counted_ptr.h", "src/core/lib/http/format_request.h", "src/core/lib/http/httpcli.h", "src/core/lib/http/parser.h", @@ -8370,11 +8370,11 @@ "src/core/lib/compression/stream_compression_identity.h", "src/core/lib/debug/stats.h", "src/core/lib/debug/stats_data.h", - "src/core/lib/gpr++/debug_location.h", - "src/core/lib/gpr++/inlined_vector.h", - "src/core/lib/gpr++/orphanable.h", - "src/core/lib/gpr++/ref_counted.h", - "src/core/lib/gpr++/ref_counted_ptr.h", + "src/core/lib/gprpp/debug_location.h", + "src/core/lib/gprpp/inlined_vector.h", + "src/core/lib/gprpp/orphanable.h", + "src/core/lib/gprpp/ref_counted.h", + "src/core/lib/gprpp/ref_counted_ptr.h", "src/core/lib/http/format_request.h", "src/core/lib/http/httpcli.h", "src/core/lib/http/parser.h", -- cgit v1.2.3 From d1915a988ed05559ab3cfca57d7207fa5df5a1f4 Mon Sep 17 00:00:00 2001 From: Mehrdad Afshari Date: Fri, 19 Jan 2018 14:23:17 -0800 Subject: Bump version to 1.10 --- BUILD | 4 ++-- build.yaml | 4 ++-- doc/g_stands_for.md | 1 + 3 files changed, 5 insertions(+), 4 deletions(-) (limited to 'BUILD') diff --git a/BUILD b/BUILD index c52a95cf91..f2c03745ec 100644 --- a/BUILD +++ b/BUILD @@ -54,11 +54,11 @@ config_setting( ) # This should be updated along with build.yaml -g_stands_for = "glossy" +g_stands_for = "glamorous" core_version = "5.0.0-dev" -version = "1.9.0-dev" +version = "1.10.0-dev" GPR_PUBLIC_HDRS = [ "include/grpc/support/alloc.h", diff --git a/build.yaml b/build.yaml index a8639a8b0b..7508cdf9e8 100644 --- a/build.yaml +++ b/build.yaml @@ -13,8 +13,8 @@ settings: '#09': Per-language overrides are possible with (eg) ruby_version tag here '#10': See the expand_version.py for all the quirks here core_version: 5.0.0-dev - g_stands_for: glossy - version: 1.9.0-dev + g_stands_for: glamorous + version: 1.10.0-dev filegroups: - name: census public_headers: diff --git a/doc/g_stands_for.md b/doc/g_stands_for.md index edc6dc1e79..19875c36a0 100644 --- a/doc/g_stands_for.md +++ b/doc/g_stands_for.md @@ -13,3 +13,4 @@ future), and the corresponding version numbers that used them: - 1.7 'g' stands for 'gambit' - 1.8 'g' stands for 'generous' - 1.9 'g' stands for 'glossy' +- 1.10 'g' stands for 'glamorous' -- cgit v1.2.3