diff --git a/BUILD b/BUILD index 5fadb6645bf..420251227fb 100644 --- a/BUILD +++ b/BUILD @@ -851,7 +851,6 @@ grpc_cc_library( # standard plugins "census", "//src/core:grpc_backend_metric_filter", - "//src/core:grpc_deadline_filter", "//src/core:grpc_client_authority_filter", "//src/core:grpc_lb_policy_grpclb", "//src/core:grpc_lb_policy_outlier_detection", @@ -1713,6 +1712,7 @@ grpc_cc_library( "//src/core:lib/channel/call_tracer.h", ], external_deps = [ + "absl/log:check", "absl/status", "absl/strings", "absl/types:optional", @@ -1990,6 +1990,7 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/functional:any_invocable", "absl/functional:function_ref", + "absl/log:check", "absl/meta:type_traits", "absl/status", "absl/status:statusor", @@ -2974,6 +2975,7 @@ grpc_cc_library( external_deps = [ "absl/flags:flag", "absl/flags:marshalling", + "absl/log:check", "absl/strings", "absl/types:optional", ], @@ -3009,7 +3011,10 @@ grpc_cc_library( srcs = [ "//src/core:lib/config/core_configuration.cc", ], - external_deps = ["absl/functional:any_invocable"], + external_deps = [ + "absl/functional:any_invocable", + "absl/log:check", + ], language = "c++", public_hdrs = [ "//src/core:lib/config/core_configuration.h", @@ -3206,6 +3211,7 @@ grpc_cc_library( "//src/core:lib/address_utils/sockaddr_utils.h", ], external_deps = [ + "absl/log:check", "absl/status", "absl/status:statusor", "absl/strings", @@ -3331,6 +3337,7 @@ grpc_cc_library( "//src/core:lib/iomgr/grpc_if_nametoindex.h", ], external_deps = [ + "absl/log:check", "absl/status", "absl/status:statusor", "absl/strings", @@ -3697,7 +3704,6 @@ grpc_cc_library( "//src/core:gpr_atm", "//src/core:gpr_manual_constructor", "//src/core:grpc_backend_metric_data", - "//src/core:grpc_deadline_filter", "//src/core:grpc_message_size_filter", "//src/core:grpc_service_config", "//src/core:init_internally", @@ -3821,6 +3827,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/functional:bind_front", + "absl/log:check", "absl/status", "absl/status:statusor", "absl/strings", diff --git a/BoringSSL-Package.swift b/BoringSSL-Package.swift index 363c62433ef..8a4f6a6d639 100644 --- a/BoringSSL-Package.swift +++ b/BoringSSL-Package.swift @@ -26,7 +26,6 @@ let package = Package( ], sources: [ - "err_data.c", "src/crypto/asn1/a_bitstr.c", "src/crypto/asn1/a_bool.c", "src/crypto/asn1/a_d2i_fp.c", @@ -117,6 +116,8 @@ let package = Package( "src/crypto/evp/evp.c", "src/crypto/evp/evp_asn1.c", "src/crypto/evp/evp_ctx.c", + "src/crypto/evp/p_dh.c", + "src/crypto/evp/p_dh_asn1.c", "src/crypto/evp/p_dsa_asn1.c", "src/crypto/evp/p_ec.c", "src/crypto/evp/p_ec_asn1.c", @@ -258,6 +259,7 @@ let package = Package( "src/crypto/x509/x_val.c", "src/crypto/x509/x_x509.c", "src/crypto/x509/x_x509a.c", + "src/gen/crypto/err_data.c", "src/ssl/bio_ssl.cc", "src/ssl/d1_both.cc", "src/ssl/d1_lib.cc", @@ -279,6 +281,7 @@ let package = Package( "src/ssl/ssl_buffer.cc", "src/ssl/ssl_cert.cc", "src/ssl/ssl_cipher.cc", + "src/ssl/ssl_credential.cc", "src/ssl/ssl_file.cc", "src/ssl/ssl_key_share.cc", "src/ssl/ssl_lib.cc", diff --git a/CMakeLists.txt b/CMakeLists.txt index 184b09324a7..83a0769f131 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1749,6 +1749,7 @@ target_link_libraries(gpr absl::flags absl::flags_marshalling absl::any_invocable + absl::check absl::log absl::memory absl::random_random @@ -1847,7 +1848,6 @@ add_library(grpc src/core/ext/filters/census/grpc_context.cc src/core/ext/filters/channel_idle/idle_filter_state.cc src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc - src/core/ext/filters/deadline/deadline_filter.cc src/core/ext/filters/fault_injection/fault_injection_filter.cc src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc src/core/ext/filters/http/client/http_client_filter.cc @@ -2678,7 +2678,6 @@ target_link_libraries(grpc absl::bind_front absl::function_ref absl::hash - absl::check absl::type_traits absl::random_bit_gen_ref absl::random_distributions @@ -2944,7 +2943,6 @@ add_library(grpc_unsecure src/core/ext/filters/census/grpc_context.cc src/core/ext/filters/channel_idle/idle_filter_state.cc src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc - src/core/ext/filters/deadline/deadline_filter.cc src/core/ext/filters/fault_injection/fault_injection_filter.cc src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc src/core/ext/filters/http/client/http_client_filter.cc @@ -3381,7 +3379,6 @@ target_link_libraries(grpc_unsecure absl::bind_front absl::function_ref absl::hash - absl::check absl::type_traits absl::random_bit_gen_ref absl::random_distributions @@ -5446,7 +5443,6 @@ target_link_libraries(grpc_authorization_provider absl::inlined_vector absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor absl::span @@ -5933,7 +5929,6 @@ if(_gRPC_PLATFORM_LINUX OR _gRPC_PLATFORM_POSIX) target_link_libraries(static_stride_scheduler_benchmark ${_gRPC_ALLTARGETS_LIBRARIES} absl::algorithm_container - absl::check absl::span ${_gRPC_BENCHMARK_LIBRARIES} gpr @@ -8583,7 +8578,6 @@ target_link_libraries(call_filters_test absl::inlined_vector absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor absl::utility @@ -10244,7 +10238,6 @@ target_link_libraries(chunked_vector_test absl::config absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor gpr @@ -13388,7 +13381,6 @@ target_link_libraries(exec_ctx_wakeup_scheduler_test upb_message_lib absl::config absl::hash - absl::check absl::type_traits absl::statusor gpr @@ -14258,7 +14250,6 @@ target_link_libraries(flow_control_test absl::config absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor absl::span @@ -14344,7 +14335,6 @@ target_link_libraries(for_each_test absl::config absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor gpr @@ -14434,7 +14424,6 @@ target_include_directories(forkable_test target_link_libraries(forkable_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::check absl::statusor gpr ) @@ -18009,7 +17998,6 @@ target_link_libraries(interception_chain_test absl::inlined_vector absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor absl::span @@ -18098,7 +18086,6 @@ target_link_libraries(interceptor_list_test absl::config absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor gpr @@ -19292,7 +19279,6 @@ target_link_libraries(map_pipe_test absl::config absl::function_ref absl::hash - absl::check absl::type_traits absl::statusor gpr @@ -21556,7 +21542,6 @@ target_link_libraries(periodic_update_test upb_message_lib absl::function_ref absl::hash - absl::check absl::statusor gpr ) @@ -29863,7 +29848,6 @@ target_include_directories(test_core_event_engine_posix_timer_heap_test target_link_libraries(test_core_event_engine_posix_timer_heap_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest - absl::check absl::statusor gpr ) @@ -29962,7 +29946,6 @@ target_link_libraries(test_core_event_engine_slice_buffer_test ${_gRPC_ALLTARGETS_LIBRARIES} gtest absl::hash - absl::check absl::statusor absl::utility gpr @@ -37036,7 +37019,7 @@ generate_pkgconfig( "gpr" "gRPC platform support library" "${gRPC_CORE_VERSION}" - "absl_any_invocable absl_base absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_log absl_log_severity absl_memory absl_optional absl_random_random absl_status absl_str_format absl_strings absl_synchronization absl_time absl_variant" + "absl_any_invocable absl_base absl_check absl_cord absl_core_headers absl_flags absl_flags_marshalling absl_log absl_log_severity absl_memory absl_optional absl_random_random absl_status absl_str_format absl_strings absl_synchronization absl_time absl_variant" "" "-lgpr" "" diff --git a/Makefile b/Makefile index 9e06baa5487..26446a07d48 100644 --- a/Makefile +++ b/Makefile @@ -689,7 +689,6 @@ LIBGRPC_SRC = \ src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/idle_filter_state.cc \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \ - src/core/ext/filters/deadline/deadline_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc \ src/core/ext/filters/http/client/http_client_filter.cc \ @@ -1856,7 +1855,6 @@ endif # deps: [] # transitive_deps: [] LIBBORINGSSL_SRC = \ - third_party/boringssl-with-bazel/err_data.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ @@ -1947,6 +1945,8 @@ LIBBORINGSSL_SRC = \ third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ @@ -2088,6 +2088,7 @@ LIBBORINGSSL_SRC = \ third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/gen/crypto/err_data.c \ third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ @@ -2109,6 +2110,7 @@ LIBBORINGSSL_SRC = \ third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ diff --git a/Package.swift b/Package.swift index 1b31c93a8ed..c4eacbae00d 100644 --- a/Package.swift +++ b/Package.swift @@ -165,8 +165,6 @@ let package = Package( "src/core/ext/filters/channel_idle/idle_filter_state.h", "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc", "src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h", - "src/core/ext/filters/deadline/deadline_filter.cc", - "src/core/ext/filters/deadline/deadline_filter.h", "src/core/ext/filters/fault_injection/fault_injection_filter.cc", "src/core/ext/filters/fault_injection/fault_injection_filter.h", "src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc", diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index e366840a1e6..679b754b05d 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -62,9 +62,6 @@ EXPERIMENTS = { "core_end2end_test": [ "promise_based_server_call", ], - "cpp_end2end_test": [ - "promise_based_server_call", - ], "endpoint_test": [ "tcp_frame_size_tuning", "tcp_rcv_lowat", @@ -83,9 +80,6 @@ EXPERIMENTS = { "free_large_allocator", "unconstrained_max_quota_buffer_size", ], - "xds_end2end_test": [ - "promise_based_server_call", - ], }, "on": { "core_end2end_test": [ @@ -112,9 +106,6 @@ EXPERIMENTS = { "core_end2end_test": [ "promise_based_server_call", ], - "cpp_end2end_test": [ - "promise_based_server_call", - ], "endpoint_test": [ "tcp_frame_size_tuning", "tcp_rcv_lowat", @@ -133,9 +124,6 @@ EXPERIMENTS = { "free_large_allocator", "unconstrained_max_quota_buffer_size", ], - "xds_end2end_test": [ - "promise_based_server_call", - ], }, "on": { "cpp_lb_end2end_test": [ @@ -159,9 +147,6 @@ EXPERIMENTS = { "promise_based_client_call", "promise_based_server_call", ], - "cpp_end2end_test": [ - "promise_based_server_call", - ], "endpoint_test": [ "tcp_frame_size_tuning", "tcp_rcv_lowat", @@ -186,9 +171,6 @@ EXPERIMENTS = { "free_large_allocator", "unconstrained_max_quota_buffer_size", ], - "xds_end2end_test": [ - "promise_based_server_call", - ], }, "on": { "cancel_ares_query_test": [ diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 328c2a45c72..d0099ab6163 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -190,11 +190,11 @@ def grpc_deps(): name = "boringssl", # Use github mirror instead of https://boringssl.googlesource.com/boringssl # to obtain a boringssl archive with consistent sha256 - sha256 = "06ba43ff1825c8a9a45dae7f85e532153a531707f6a3e56be1e892fd2d3b75f6", - strip_prefix = "boringssl-e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df", + sha256 = "c4cccc0ea8b149d2853da77254655c0d5a5739dd4bbdff9a5b586c06a627de6c", + strip_prefix = "boringssl-5a2bca2124800f2861263959b72bc35cdf18949b", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df.tar.gz", - "https://github.com/google/boringssl/archive/e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/5a2bca2124800f2861263959b72bc35cdf18949b.tar.gz", + "https://github.com/google/boringssl/archive/5a2bca2124800f2861263959b72bc35cdf18949b.tar.gz", ], ) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 64f7c85594b..636d5ea958c 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -130,6 +130,7 @@ libs: - absl/flags:flag - absl/flags:marshalling - absl/functional:any_invocable + - absl/log:check - absl/log:log - absl/memory:memory - absl/random:random @@ -246,7 +247,6 @@ libs: - src/core/ext/filters/backend_metrics/backend_metric_provider.h - src/core/ext/filters/channel_idle/idle_filter_state.h - src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h - - src/core/ext/filters/deadline/deadline_filter.h - src/core/ext/filters/fault_injection/fault_injection_filter.h - src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h - src/core/ext/filters/http/client/http_client_filter.h @@ -1267,7 +1267,6 @@ libs: - src/core/ext/filters/census/grpc_context.cc - src/core/ext/filters/channel_idle/idle_filter_state.cc - src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc - - src/core/ext/filters/deadline/deadline_filter.cc - src/core/ext/filters/fault_injection/fault_injection_filter.cc - src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc - src/core/ext/filters/http/client/http_client_filter.cc @@ -2057,7 +2056,6 @@ libs: - absl/functional:bind_front - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/random:bit_gen_ref - absl/random:distributions @@ -2233,7 +2231,6 @@ libs: - src/core/ext/filters/backend_metrics/backend_metric_provider.h - src/core/ext/filters/channel_idle/idle_filter_state.h - src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h - - src/core/ext/filters/deadline/deadline_filter.h - src/core/ext/filters/fault_injection/fault_injection_filter.h - src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h - src/core/ext/filters/http/client/http_client_filter.h @@ -2723,7 +2720,6 @@ libs: - src/core/ext/filters/census/grpc_context.cc - src/core/ext/filters/channel_idle/idle_filter_state.cc - src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc - - src/core/ext/filters/deadline/deadline_filter.cc - src/core/ext/filters/fault_injection/fault_injection_filter.cc - src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc - src/core/ext/filters/http/client/http_client_filter.cc @@ -3118,7 +3114,6 @@ libs: - absl/functional:bind_front - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/random:bit_gen_ref - absl/random:distributions @@ -5032,7 +5027,6 @@ libs: - absl/container:inlined_vector - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - absl/types:span @@ -5176,7 +5170,6 @@ targets: - test/core/load_balancing/static_stride_scheduler_benchmark.cc deps: - absl/algorithm:container - - absl/log:check - absl/types:span - benchmark - gpr @@ -6524,7 +6517,6 @@ targets: - absl/container:inlined_vector - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - absl/utility:utility @@ -7779,7 +7771,6 @@ targets: - absl/base:config - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - gpr @@ -9261,7 +9252,6 @@ targets: - upb_message_lib - absl/base:config - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - gpr @@ -9904,7 +9894,6 @@ targets: - absl/base:config - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - absl/types:span @@ -10040,7 +10029,6 @@ targets: - absl/base:config - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - gpr @@ -10073,7 +10061,6 @@ targets: - test/core/event_engine/forkable_test.cc deps: - gtest - - absl/log:check - absl/status:statusor - gpr - name: format_request_test @@ -12164,7 +12151,6 @@ targets: - absl/container:inlined_vector - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - absl/types:span @@ -12295,7 +12281,6 @@ targets: - absl/base:config - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - gpr @@ -12979,7 +12964,6 @@ targets: - absl/base:config - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/meta:type_traits - absl/status:statusor - gpr @@ -14180,7 +14164,6 @@ targets: - upb_message_lib - absl/functional:function_ref - absl/hash:hash - - absl/log:check - absl/status:statusor - gpr uses_polling: false @@ -19339,7 +19322,6 @@ targets: - test/core/event_engine/posix/timer_heap_test.cc deps: - gtest - - absl/log:check - absl/status:statusor - gpr uses_polling: false @@ -19393,7 +19375,6 @@ targets: deps: - gtest - absl/hash:hash - - absl/log:check - absl/status:statusor - absl/utility:utility - gpr diff --git a/config.m4 b/config.m4 index 7f13369ad48..125cc7f8c1e 100644 --- a/config.m4 +++ b/config.m4 @@ -64,7 +64,6 @@ if test "$PHP_GRPC" != "no"; then src/core/ext/filters/census/grpc_context.cc \ src/core/ext/filters/channel_idle/idle_filter_state.cc \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \ - src/core/ext/filters/deadline/deadline_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc \ src/core/ext/filters/http/client/http_client_filter.cc \ @@ -1034,7 +1033,6 @@ if test "$PHP_GRPC" != "no"; then third_party/address_sorting/address_sorting.c \ third_party/address_sorting/address_sorting_posix.c \ third_party/address_sorting/address_sorting_windows.c \ - third_party/boringssl-with-bazel/err_data.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c \ third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c \ @@ -1125,6 +1123,8 @@ if test "$PHP_GRPC" != "no"; then third_party/boringssl-with-bazel/src/crypto/evp/evp.c \ third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh.c \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c \ third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c \ @@ -1266,6 +1266,7 @@ if test "$PHP_GRPC" != "no"; then third_party/boringssl-with-bazel/src/crypto/x509/x_val.c \ third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c \ third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c \ + third_party/boringssl-with-bazel/src/gen/crypto/err_data.c \ third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc \ third_party/boringssl-with-bazel/src/ssl/d1_both.cc \ third_party/boringssl-with-bazel/src/ssl/d1_lib.cc \ @@ -1287,6 +1288,7 @@ if test "$PHP_GRPC" != "no"; then third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc \ + third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_file.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc \ third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc \ @@ -1388,7 +1390,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/backend_metrics) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/census) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/channel_idle) - PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/deadline) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/fault_injection) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http) PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/filters/http/client) @@ -1633,7 +1634,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/time/internal/cctz/src) PHP_ADD_BUILD_DIR($ext_builddir/third_party/abseil-cpp/absl/types) PHP_ADD_BUILD_DIR($ext_builddir/third_party/address_sorting) - PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/asn1) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/base64) @@ -1676,6 +1676,7 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/stack) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/trust_token) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/gen/crypto) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/ssl) PHP_ADD_BUILD_DIR($ext_builddir/third_party/re2/re2) PHP_ADD_BUILD_DIR($ext_builddir/third_party/re2/util) diff --git a/config.w32 b/config.w32 index 01d8a1c6d0c..a0cc2a6ee58 100644 --- a/config.w32 +++ b/config.w32 @@ -29,7 +29,6 @@ if (PHP_GRPC != "no") { "src\\core\\ext\\filters\\census\\grpc_context.cc " + "src\\core\\ext\\filters\\channel_idle\\idle_filter_state.cc " + "src\\core\\ext\\filters\\channel_idle\\legacy_channel_idle_filter.cc " + - "src\\core\\ext\\filters\\deadline\\deadline_filter.cc " + "src\\core\\ext\\filters\\fault_injection\\fault_injection_filter.cc " + "src\\core\\ext\\filters\\fault_injection\\fault_injection_service_config_parser.cc " + "src\\core\\ext\\filters\\http\\client\\http_client_filter.cc " + @@ -999,7 +998,6 @@ if (PHP_GRPC != "no") { "third_party\\address_sorting\\address_sorting.c " + "third_party\\address_sorting\\address_sorting_posix.c " + "third_party\\address_sorting\\address_sorting_windows.c " + - "third_party\\boringssl-with-bazel\\err_data.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bitstr.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bool.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_d2i_fp.c " + @@ -1090,6 +1088,8 @@ if (PHP_GRPC != "no") { "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_asn1.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_ctx.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dh.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dh_asn1.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dsa_asn1.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec_asn1.c " + @@ -1231,6 +1231,7 @@ if (PHP_GRPC != "no") { "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_val.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509.c " + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509a.c " + + "third_party\\boringssl-with-bazel\\src\\gen\\crypto\\err_data.c " + "third_party\\boringssl-with-bazel\\src\\ssl\\bio_ssl.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_both.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\d1_lib.cc " + @@ -1252,6 +1253,7 @@ if (PHP_GRPC != "no") { "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_buffer.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cert.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_cipher.cc " + + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_credential.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_file.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_key_share.cc " + "third_party\\boringssl-with-bazel\\src\\ssl\\ssl_lib.cc " + @@ -1382,7 +1384,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\backend_metrics"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\census"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\channel_idle"); - FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\deadline"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\fault_injection"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\filters\\http\\client"); @@ -1827,6 +1828,8 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\stack"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\trust_token"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\gen"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\gen\\crypto"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\ssl"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\re2"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\re2\\re2"); diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 2f7adcd0c00..fca100b28d2 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -286,7 +286,6 @@ Pod::Spec.new do |s| 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h', - 'src/core/ext/filters/deadline/deadline_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h', 'src/core/ext/filters/http/client/http_client_filter.h', @@ -1575,7 +1574,6 @@ Pod::Spec.new do |s| 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h', - 'src/core/ext/filters/deadline/deadline_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h', 'src/core/ext/filters/http/client/http_client_filter.h', diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 54bf79c740c..c1ad3a41850 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -197,7 +197,7 @@ Pod::Spec.new do |s| ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.33' + ss.dependency 'BoringSSL-GRPC', '0.0.34' ss.dependency 'abseil/algorithm/container', abseil_version ss.dependency 'abseil/base/base', abseil_version ss.dependency 'abseil/base/config', abseil_version @@ -282,8 +282,6 @@ Pod::Spec.new do |s| 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h', - 'src/core/ext/filters/deadline/deadline_filter.cc', - 'src/core/ext/filters/deadline/deadline_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_filter.cc', 'src/core/ext/filters/fault_injection/fault_injection_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc', @@ -2375,7 +2373,6 @@ Pod::Spec.new do |s| 'src/core/ext/filters/backend_metrics/backend_metric_provider.h', 'src/core/ext/filters/channel_idle/idle_filter_state.h', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h', - 'src/core/ext/filters/deadline/deadline_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_filter.h', 'src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h', 'src/core/ext/filters/http/client/http_client_filter.h', diff --git a/grpc.gemspec b/grpc.gemspec index c2e4e752706..05b8d202eca 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -171,8 +171,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/ext/filters/channel_idle/idle_filter_state.h ) s.files += %w( src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc ) s.files += %w( src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h ) - s.files += %w( src/core/ext/filters/deadline/deadline_filter.cc ) - s.files += %w( src/core/ext/filters/deadline/deadline_filter.h ) s.files += %w( src/core/ext/filters/fault_injection/fault_injection_filter.cc ) s.files += %w( src/core/ext/filters/fault_injection/fault_injection_filter.h ) s.files += %w( src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc ) @@ -2450,7 +2448,6 @@ Gem::Specification.new do |s| s.files += %w( third_party/address_sorting/address_sorting_posix.c ) s.files += %w( third_party/address_sorting/address_sorting_windows.c ) s.files += %w( third_party/address_sorting/include/address_sorting/address_sorting.h ) - s.files += %w( third_party/boringssl-with-bazel/err_data.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c ) @@ -2556,6 +2553,8 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dh.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c ) @@ -2726,7 +2725,6 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/address.h ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/fors.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/fors.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/internal.h ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/merkle.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/merkle.h ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/params.h ) @@ -2818,6 +2816,7 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_val.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c ) + s.files += %w( third_party/boringssl-with-bazel/src/gen/crypto/err_data.c ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aead.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/aes.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h ) @@ -2858,13 +2857,14 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp_errors.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/ex_data.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h ) + s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/experimental/spx.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hkdf.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hmac.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hpke.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/hrss.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/is_boringssl.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/kdf.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/kyber.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/lhash.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md4.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/md5.h ) @@ -2880,8 +2880,6 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs12.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pki/certificate.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pki/signature_verify_cache.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/poly1305.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/pool.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/posix_time.h ) @@ -2930,6 +2928,7 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc ) s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc ) s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc ) s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_file.cc ) s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc ) s.files += %w( third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc ) diff --git a/include/grpc/impl/channel_arg_names.h b/include/grpc/impl/channel_arg_names.h index 7ba19bebb17..663e9620a34 100644 --- a/include/grpc/impl/channel_arg_names.h +++ b/include/grpc/impl/channel_arg_names.h @@ -67,9 +67,6 @@ application will see the compressed message in the byte buffer. */ #define GRPC_ARG_ENABLE_PER_MESSAGE_DECOMPRESSION \ "grpc.per_message_decompression" -/** Enable/disable support for deadline checking. Defaults to 1, unless - GRPC_ARG_MINIMAL_STACK is enabled, in which case it defaults to 0 */ -#define GRPC_ARG_ENABLE_DEADLINE_CHECKS "grpc.enable_deadline_checking" /** Initial stream ID for http2 transports. Int valued. */ #define GRPC_ARG_HTTP2_INITIAL_SEQUENCE_NUMBER \ "grpc.http2.initial_sequence_number" diff --git a/package.xml b/package.xml index 8d9759fc0f6..62f4ba023b7 100644 --- a/package.xml +++ b/package.xml @@ -153,8 +153,6 @@ - - @@ -2454,7 +2452,6 @@ - @@ -2560,6 +2557,8 @@ + + @@ -2730,7 +2729,6 @@ - @@ -2822,6 +2820,7 @@ + @@ -2862,13 +2861,14 @@ + + - @@ -2884,8 +2884,6 @@ - - @@ -2934,6 +2932,7 @@ + diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h index 827f1b0ed1c..3255f889966 100644 --- a/src/boringssl/boringssl_prefix_symbols.h +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -1,4 +1,4 @@ -// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df +// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: 5a2bca2124800f2861263959b72bc35cdf18949b // Copyright (c) 2018, Google Inc. // @@ -21,6 +21,9 @@ #define BIO_f_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_f_ssl) #define BIO_set_ssl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BIO_set_ssl) +#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) +#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) +#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) #define DTLS_client_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_client_method) #define DTLS_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_method) #define DTLS_server_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DTLS_server_method) @@ -66,8 +69,23 @@ #define SSL_COMP_get_compression_methods BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_compression_methods) #define SSL_COMP_get_id BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_id) #define SSL_COMP_get_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_COMP_get_name) +#define SSL_CREDENTIAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_free) +#define SSL_CREDENTIAL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_get_ex_data) +#define SSL_CREDENTIAL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_get_ex_new_index) +#define SSL_CREDENTIAL_new_delegated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_new_delegated) +#define SSL_CREDENTIAL_new_x509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_new_x509) +#define SSL_CREDENTIAL_set1_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_cert_chain) +#define SSL_CREDENTIAL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_delegated_credential) +#define SSL_CREDENTIAL_set1_ocsp_response BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_ocsp_response) +#define SSL_CREDENTIAL_set1_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_private_key) +#define SSL_CREDENTIAL_set1_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_signed_cert_timestamp_list) +#define SSL_CREDENTIAL_set1_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_signing_algorithm_prefs) +#define SSL_CREDENTIAL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set_ex_data) +#define SSL_CREDENTIAL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set_private_key_method) +#define SSL_CREDENTIAL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_up_ref) #define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) #define SSL_CTX_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_chain_cert) +#define SSL_CTX_add1_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add1_credential) #define SSL_CTX_add_cert_compression_alg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_cert_compression_alg) #define SSL_CTX_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_client_CA) #define SSL_CTX_add_extra_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add_extra_chain_cert) @@ -282,6 +300,7 @@ #define SSL_accept BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_accept) #define SSL_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add0_chain_cert) #define SSL_add1_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_chain_cert) +#define SSL_add1_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add1_credential) #define SSL_add_application_settings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_application_settings) #define SSL_add_bio_cert_subjects_to_stack BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_bio_cert_subjects_to_stack) #define SSL_add_client_CA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_add_client_CA) @@ -301,7 +320,6 @@ #define SSL_clear_options BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_clear_options) #define SSL_connect BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_connect) #define SSL_cutthrough_complete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_cutthrough_complete) -#define SSL_delegated_credential_used BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_delegated_credential_used) #define SSL_do_handshake BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_do_handshake) #define SSL_dup_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_dup_CA_list) #define SSL_early_callback_ctx_extension_get BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_early_callback_ctx_extension_get) @@ -328,6 +346,7 @@ #define SSL_get0_peer_certificates BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_certificates) #define SSL_get0_peer_delegation_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_delegation_algorithms) #define SSL_get0_peer_verify_algorithms BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_peer_verify_algorithms) +#define SSL_get0_selected_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_selected_credential) #define SSL_get0_server_requested_CAs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_server_requested_CAs) #define SSL_get0_session_id_context BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_session_id_context) #define SSL_get0_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_get0_signed_cert_timestamp_list) @@ -457,7 +476,6 @@ #define SSL_set1_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_chain) #define SSL_set1_curves BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves) #define SSL_set1_curves_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_curves_list) -#define SSL_set1_delegated_credential BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_delegated_credential) #define SSL_set1_ech_config_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_ech_config_list) #define SSL_set1_group_ids BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_group_ids) #define SSL_set1_groups BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set1_groups) @@ -475,6 +493,8 @@ #define SSL_set_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_bio) #define SSL_set_cert_cb BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cert_cb) #define SSL_set_chain_and_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_chain_and_key) +#define SSL_set_check_client_certificate_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_check_client_certificate_type) +#define SSL_set_check_ecdsa_curve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_check_ecdsa_curve) #define SSL_set_cipher_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_cipher_list) #define SSL_set_client_CA_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_client_CA_list) #define SSL_set_compliance_policy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set_compliance_policy) @@ -582,6 +602,7 @@ #define sk_CRYPTO_BUFFER_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_deep_copy) #define sk_CRYPTO_BUFFER_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_new_null) #define sk_CRYPTO_BUFFER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_num) +#define sk_CRYPTO_BUFFER_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_pop) #define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) #define sk_CRYPTO_BUFFER_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_set) #define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) @@ -1118,7 +1139,6 @@ #define CBS_asn1_oid_to_text BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_asn1_oid_to_text) #define CBS_contains_zero_byte BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_contains_zero_byte) #define CBS_copy_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_copy_bytes) -#define CBS_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_data) #define CBS_get_any_asn1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1) #define CBS_get_any_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_asn1_element) #define CBS_get_any_ber_asn1_element BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_any_ber_asn1_element) @@ -1151,12 +1171,10 @@ #define CBS_get_until_first BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_until_first) #define CBS_get_utf32_be BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_utf32_be) #define CBS_get_utf8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_utf8) -#define CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) #define CBS_is_unsigned_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_unsigned_asn1_integer) #define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) #define CBS_is_valid_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_integer) #define CBS_is_valid_asn1_oid BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_oid) -#define CBS_len BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_len) #define CBS_mem_equal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_mem_equal) #define CBS_parse_generalized_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_parse_generalized_time) #define CBS_parse_utc_time BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_parse_utc_time) @@ -1231,7 +1249,7 @@ #define CRYPTO_get_dynlock_destroy_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_destroy_callback) #define CRYPTO_get_dynlock_lock_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_dynlock_lock_callback) #define CRYPTO_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_data) -#define CRYPTO_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index) +#define CRYPTO_get_ex_new_index_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_ex_new_index_ex) #define CRYPTO_get_fork_generation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_fork_generation) #define CRYPTO_get_lock_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_lock_name) #define CRYPTO_get_locking_callback BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_locking_callback) @@ -1517,6 +1535,7 @@ #define ERR_get_error_line_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_error_line_data) #define ERR_get_next_error_library BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_get_next_error_library) #define ERR_lib_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_error_string) +#define ERR_lib_symbol_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_lib_symbol_name) #define ERR_load_BIO_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_BIO_strings) #define ERR_load_ERR_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_ERR_strings) #define ERR_load_RAND_strings BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_load_RAND_strings) @@ -1533,6 +1552,7 @@ #define ERR_print_errors_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_print_errors_fp) #define ERR_put_error BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_put_error) #define ERR_reason_error_string BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_error_string) +#define ERR_reason_symbol_name BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_reason_symbol_name) #define ERR_remove_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_state) #define ERR_remove_thread_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_remove_thread_state) #define ERR_restore_state BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_restore_state) @@ -1705,6 +1725,7 @@ #define EVP_PKEY_CTX_set0_rsa_oaep_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set0_rsa_oaep_label) #define EVP_PKEY_CTX_set1_hkdf_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set1_hkdf_key) #define EVP_PKEY_CTX_set1_hkdf_salt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set1_hkdf_salt) +#define EVP_PKEY_CTX_set_dh_pad BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_dh_pad) #define EVP_PKEY_CTX_set_dsa_paramgen_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_dsa_paramgen_bits) #define EVP_PKEY_CTX_set_dsa_paramgen_q_bits BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_dsa_paramgen_q_bits) #define EVP_PKEY_CTX_set_ec_param_enc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_ec_param_enc) @@ -1721,6 +1742,7 @@ #define EVP_PKEY_CTX_set_rsa_pss_saltlen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_rsa_pss_saltlen) #define EVP_PKEY_CTX_set_signature_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_CTX_set_signature_md) #define EVP_PKEY_assign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign) +#define EVP_PKEY_assign_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DH) #define EVP_PKEY_assign_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_DSA) #define EVP_PKEY_assign_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_EC_KEY) #define EVP_PKEY_assign_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_assign_RSA) @@ -1762,6 +1784,7 @@ #define EVP_PKEY_print_params BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_params) #define EVP_PKEY_print_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_private) #define EVP_PKEY_print_public BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_print_public) +#define EVP_PKEY_set1_DH BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DH) #define EVP_PKEY_set1_DSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_DSA) #define EVP_PKEY_set1_EC_KEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_EC_KEY) #define EVP_PKEY_set1_RSA BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_PKEY_set1_RSA) @@ -2342,6 +2365,10 @@ #define SPAKE2_CTX_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_CTX_new) #define SPAKE2_generate_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_generate_msg) #define SPAKE2_process_msg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPAKE2_process_msg) +#define SPX_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_generate_key) +#define SPX_generate_key_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_generate_key_from_seed) +#define SPX_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_sign) +#define SPX_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_verify) #define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) #define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) #define TRUST_TOKEN_CLIENT_add_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_CLIENT_add_key) @@ -2832,45 +2859,6 @@ #define X509v3_get_ext_count BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509v3_get_ext_count) #define a2i_IPADDRESS BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS) #define a2i_IPADDRESS_NC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, a2i_IPADDRESS_NC) -#define abi_test_bad_unwind_temporary BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_temporary) -#define abi_test_bad_unwind_wrong_register BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_bad_unwind_wrong_register) -#define abi_test_clobber_r10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r10) -#define abi_test_clobber_r11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r11) -#define abi_test_clobber_r12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r12) -#define abi_test_clobber_r13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r13) -#define abi_test_clobber_r14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r14) -#define abi_test_clobber_r15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r15) -#define abi_test_clobber_r8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r8) -#define abi_test_clobber_r9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_r9) -#define abi_test_clobber_rax BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rax) -#define abi_test_clobber_rbp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbp) -#define abi_test_clobber_rbx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rbx) -#define abi_test_clobber_rcx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rcx) -#define abi_test_clobber_rdi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdi) -#define abi_test_clobber_rdx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rdx) -#define abi_test_clobber_rsi BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_rsi) -#define abi_test_clobber_xmm0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm0) -#define abi_test_clobber_xmm1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm1) -#define abi_test_clobber_xmm10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm10) -#define abi_test_clobber_xmm11 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm11) -#define abi_test_clobber_xmm12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm12) -#define abi_test_clobber_xmm13 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm13) -#define abi_test_clobber_xmm14 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm14) -#define abi_test_clobber_xmm15 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm15) -#define abi_test_clobber_xmm2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm2) -#define abi_test_clobber_xmm3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm3) -#define abi_test_clobber_xmm4 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm4) -#define abi_test_clobber_xmm5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm5) -#define abi_test_clobber_xmm6 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm6) -#define abi_test_clobber_xmm7 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm7) -#define abi_test_clobber_xmm8 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm8) -#define abi_test_clobber_xmm9 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_clobber_xmm9) -#define abi_test_get_and_clear_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_get_and_clear_direction_flag) -#define abi_test_set_direction_flag BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_set_direction_flag) -#define abi_test_trampoline BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_trampoline) -#define abi_test_unwind_return BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_return) -#define abi_test_unwind_start BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_start) -#define abi_test_unwind_stop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, abi_test_unwind_stop) #define aes128gcmsiv_aes_ks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks) #define aes128gcmsiv_aes_ks_enc_x1 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_aes_ks_enc_x1) #define aes128gcmsiv_dec BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes128gcmsiv_dec) @@ -3018,7 +3006,6 @@ #define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) #define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) #define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) -#define d2i_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ACCESS_DESCRIPTION) #define d2i_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BIT_STRING) #define d2i_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BMPSTRING) #define d2i_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ASN1_BOOLEAN) @@ -3051,8 +3038,6 @@ #define d2i_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DHparams_bio) #define d2i_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIRECTORYSTRING) #define d2i_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DISPLAYTEXT) -#define d2i_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT) -#define d2i_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DIST_POINT_NAME) #define d2i_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey) #define d2i_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_bio) #define d2i_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_DSAPrivateKey_fp) @@ -3076,7 +3061,6 @@ #define d2i_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ISSUING_DIST_POINT) #define d2i_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKAC) #define d2i_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NETSCAPE_SPKI) -#define d2i_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_NOTICEREF) #define d2i_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12) #define d2i_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_bio) #define d2i_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS12_fp) @@ -3089,8 +3073,6 @@ #define d2i_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_PRIV_KEY_INFO_fp) #define d2i_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_bio) #define d2i_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PKCS8_fp) -#define d2i_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYINFO) -#define d2i_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_POLICYQUALINFO) #define d2i_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY) #define d2i_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_bio) #define d2i_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_PUBKEY_fp) @@ -3108,7 +3090,6 @@ #define d2i_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY) #define d2i_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_bio) #define d2i_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_RSA_PUBKEY_fp) -#define d2i_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_USERNOTICE) #define d2i_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509) #define d2i_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ALGOR) #define d2i_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_ATTRIBUTE) @@ -3132,8 +3113,10 @@ #define d2i_X509_VAL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_VAL) #define d2i_X509_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_bio) #define d2i_X509_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_X509_fp) +#define dh_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dh_asn1_meth) #define dh_check_params_fast BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dh_check_params_fast) #define dh_compute_key_padded_no_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dh_compute_key_padded_no_self_test) +#define dh_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dh_pkey_meth) #define dsa_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_asn1_meth) #define dsa_check_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, dsa_check_key) #define ec_GFp_mont_add BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ec_GFp_mont_add) @@ -3238,6 +3221,7 @@ #define ecp_nistz256_sqr_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ecp_nistz256_sqr_mont) #define ed25519_asn1_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_asn1_meth) #define ed25519_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ed25519_pkey_meth) +#define evp_pkey_set_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, evp_pkey_set_method) #define fiat_curve25519_adx_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, fiat_curve25519_adx_mul) #define fiat_curve25519_adx_square BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, fiat_curve25519_adx_square) #define fiat_p256_adx_mul BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, fiat_p256_adx_mul) @@ -3261,7 +3245,6 @@ #define i2a_ASN1_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2a_ASN1_STRING) #define i2c_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_BIT_STRING) #define i2c_ASN1_INTEGER BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2c_ASN1_INTEGER) -#define i2d_ACCESS_DESCRIPTION BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ACCESS_DESCRIPTION) #define i2d_ASN1_BIT_STRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BIT_STRING) #define i2d_ASN1_BMPSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BMPSTRING) #define i2d_ASN1_BOOLEAN BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ASN1_BOOLEAN) @@ -3293,8 +3276,6 @@ #define i2d_DHparams_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DHparams_bio) #define i2d_DIRECTORYSTRING BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIRECTORYSTRING) #define i2d_DISPLAYTEXT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DISPLAYTEXT) -#define i2d_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT) -#define i2d_DIST_POINT_NAME BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DIST_POINT_NAME) #define i2d_DSAPrivateKey BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey) #define i2d_DSAPrivateKey_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_bio) #define i2d_DSAPrivateKey_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_DSAPrivateKey_fp) @@ -3318,7 +3299,6 @@ #define i2d_ISSUING_DIST_POINT BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ISSUING_DIST_POINT) #define i2d_NETSCAPE_SPKAC BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKAC) #define i2d_NETSCAPE_SPKI BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NETSCAPE_SPKI) -#define i2d_NOTICEREF BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_NOTICEREF) #define i2d_PKCS12 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12) #define i2d_PKCS12_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_bio) #define i2d_PKCS12_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS12_fp) @@ -3335,8 +3315,6 @@ #define i2d_PKCS8_PRIV_KEY_INFO_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_PRIV_KEY_INFO_fp) #define i2d_PKCS8_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_bio) #define i2d_PKCS8_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PKCS8_fp) -#define i2d_POLICYINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYINFO) -#define i2d_POLICYQUALINFO BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_POLICYQUALINFO) #define i2d_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY) #define i2d_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_bio) #define i2d_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_PUBKEY_fp) @@ -3354,7 +3332,6 @@ #define i2d_RSA_PUBKEY BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY) #define i2d_RSA_PUBKEY_bio BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_bio) #define i2d_RSA_PUBKEY_fp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_RSA_PUBKEY_fp) -#define i2d_USERNOTICE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_USERNOTICE) #define i2d_X509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509) #define i2d_X509_ALGOR BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ALGOR) #define i2d_X509_ATTRIBUTE BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_X509_ATTRIBUTE) @@ -3479,8 +3456,6 @@ #define spx_fors_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_sign) #define spx_fors_sk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_sk_gen) #define spx_fors_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_treehash) -#define spx_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_generate_key) -#define spx_generate_key_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_generate_key_from_seed) #define spx_get_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_get_tree_index) #define spx_ht_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_ht_sign) #define spx_ht_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_ht_verify) @@ -3492,7 +3467,6 @@ #define spx_set_tree_height BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_tree_height) #define spx_set_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_tree_index) #define spx_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_type) -#define spx_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_sign) #define spx_thash_f BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_f) #define spx_thash_h BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_h) #define spx_thash_hmsg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_hmsg) @@ -3503,7 +3477,6 @@ #define spx_to_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_to_uint64) #define spx_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_treehash) #define spx_uint64_to_len_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_uint64_to_len_bytes) -#define spx_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_verify) #define spx_wots_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_pk_from_sig) #define spx_wots_pk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_pk_gen) #define spx_wots_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_sign) diff --git a/src/core/BUILD b/src/core/BUILD index a34a301d111..1b765e7fddf 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -196,6 +196,7 @@ grpc_cc_library( ), external_deps = [ "absl/functional:any_invocable", + "absl/log:check", "absl/strings", ], language = "c++", @@ -1154,6 +1155,9 @@ grpc_cc_library( grpc_cc_library( name = "ref_counted", + external_deps = [ + "absl/log:check", + ], language = "c++", public_hdrs = ["lib/gprpp/ref_counted.h"], deps = [ @@ -1167,6 +1171,9 @@ grpc_cc_library( grpc_cc_library( name = "dual_ref_counted", + external_deps = [ + "absl/log:check", + ], language = "c++", public_hdrs = ["lib/gprpp/dual_ref_counted.h"], deps = [ @@ -1359,6 +1366,7 @@ grpc_cc_library( external_deps = [ "absl/base:core_headers", "absl/container:flat_hash_set", + "absl/log:check", "absl/status", "absl/strings", "absl/types:optional", @@ -1429,7 +1437,10 @@ grpc_cc_library( hdrs = [ "lib/resource_quota/thread_quota.h", ], - external_deps = ["absl/base:core_headers"], + external_deps = [ + "absl/base:core_headers", + "absl/log:check", + ], deps = [ "ref_counted", "//:gpr", @@ -1445,7 +1456,10 @@ grpc_cc_library( hdrs = [ "lib/resource_quota/connection_quota.h", ], - external_deps = ["absl/base:core_headers"], + external_deps = [ + "absl/base:core_headers", + "absl/log:check", + ], deps = [ "memory_quota", "ref_counted", @@ -2930,6 +2944,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:check", "absl/strings", "absl/types:span", ], @@ -3050,7 +3065,10 @@ grpc_cc_library( "service_config/service_config.h", "service_config/service_config_call_data.h", ], - external_deps = ["absl/strings"], + external_deps = [ + "absl/log:check", + "absl/strings", + ], language = "c++", deps = [ "arena", @@ -3102,6 +3120,7 @@ grpc_cc_library( "lib/channel/channel_args.h", ], external_deps = [ + "absl/log:check", "absl/meta:type_traits", "absl/strings", "absl/strings:str_format", @@ -4371,6 +4390,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:check", "absl/status", "absl/status:statusor", "absl/strings", @@ -4482,6 +4502,7 @@ grpc_cc_library( ], external_deps = [ "absl/base:core_headers", + "absl/log:check", "absl/meta:type_traits", "absl/random", "absl/status", @@ -4524,42 +4545,6 @@ grpc_cc_library( ], ) -grpc_cc_library( - name = "grpc_deadline_filter", - srcs = [ - "ext/filters/deadline/deadline_filter.cc", - ], - hdrs = [ - "ext/filters/deadline/deadline_filter.h", - ], - external_deps = [ - "absl/status", - "absl/types:optional", - ], - language = "c++", - deps = [ - "arena", - "arena_promise", - "channel_fwd", - "channel_stack_type", - "closure", - "context", - "error", - "metadata_batch", - "status_helper", - "time", - "//:call_combiner", - "//:channel_arg_names", - "//:config", - "//:debug_location", - "//:exec_ctx", - "//:gpr", - "//:grpc_base", - "//:grpc_public_hdrs", - "//:iomgr_timer", - ], -) - grpc_cc_library( name = "grpc_client_authority_filter", srcs = [ @@ -4613,7 +4598,6 @@ grpc_cc_library( "channel_fwd", "channel_stack_type", "context", - "grpc_deadline_filter", "grpc_service_config", "json", "json_args", @@ -5639,7 +5623,10 @@ grpc_cc_library( grpc_cc_library( name = "down_cast", hdrs = ["lib/gprpp/down_cast.h"], - external_deps = ["absl/base:config"], + external_deps = [ + "absl/base:config", + "absl/log:check", + ], deps = ["//:gpr"], ) @@ -7490,6 +7477,7 @@ grpc_cc_library( ], external_deps = [ "absl/container:inlined_vector", + "absl/log:check", "absl/strings", "absl/strings:str_format", "absl/types:optional", @@ -7651,6 +7639,7 @@ grpc_cc_library( "absl/container:flat_hash_map", "absl/functional:any_invocable", "absl/functional:function_ref", + "absl/log:check", "absl/strings", "absl/types:span", ], diff --git a/src/core/client_channel/client_channel_filter.cc b/src/core/client_channel/client_channel_filter.cc index c11f5293bfa..1ffcfb5e4ca 100644 --- a/src/core/client_channel/client_channel_filter.cc +++ b/src/core/client_channel/client_channel_filter.cc @@ -61,7 +61,6 @@ #include "src/core/client_channel/retry_filter.h" #include "src/core/client_channel/subchannel.h" #include "src/core/client_channel/subchannel_interface_internal.h" -#include "src/core/ext/filters/deadline/deadline_filter.h" #include "src/core/handshaker/proxy_mapper_registry.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" @@ -210,14 +209,14 @@ class ClientChannelFilter::FilterBasedCallData final const grpc_call_element_args& args); ~FilterBasedCallData() override; - grpc_call_element* elem() const { return deadline_state_.elem; } - grpc_call_stack* owning_call() const { return deadline_state_.call_stack; } - CallCombiner* call_combiner() const { return deadline_state_.call_combiner; } + grpc_call_element* elem() const { return elem_; } + grpc_call_stack* owning_call() const { return owning_call_; } + CallCombiner* call_combiner() const { return call_combiner_; } ClientChannelFilter* chand() const override { return static_cast(elem()->channel_data); } - Arena* arena() const override { return deadline_state_.arena; } + Arena* arena() const override { return arena_; } grpc_polling_entity* pollent() override { return pollent_; } grpc_metadata_batch* send_initial_metadata() override { return pending_batches_[0] @@ -270,10 +269,8 @@ class ClientChannelFilter::FilterBasedCallData final void ResetDeadline(Duration timeout) override { const Timestamp per_method_deadline = Timestamp::FromCycleCounterRoundUp(call_start_time_) + timeout; - if (per_method_deadline < deadline_) { - deadline_ = per_method_deadline; - grpc_deadline_state_reset(&deadline_state_, deadline_); - } + static_cast(call_context_[GRPC_CONTEXT_CALL].value) + ->UpdateDeadline(per_method_deadline); } void CreateDynamicCall(); @@ -286,8 +283,10 @@ class ClientChannelFilter::FilterBasedCallData final gpr_cycle_counter call_start_time_; Timestamp deadline_; - // State for handling deadlines. - grpc_deadline_state deadline_state_; + Arena* const arena_; + grpc_call_element* const elem_; + grpc_call_stack* const owning_call_; + CallCombiner* const call_combiner_; grpc_polling_entity* pollent_ = nullptr; @@ -387,11 +386,12 @@ class ClientChannelFilter::PromiseBasedCallData final } void ResetDeadline(Duration timeout) override { + Call* call = GetContext(); CallContext* call_context = GetContext(); const Timestamp per_method_deadline = Timestamp::FromCycleCounterRoundUp(call_context->call_start_time()) + timeout; - call_context->UpdateDeadline(per_method_deadline); + call->UpdateDeadline(per_method_deadline); } ClientChannelFilter* chand_; @@ -1230,9 +1230,6 @@ RefCountedPtr GetSubchannelPool( ClientChannelFilter::ClientChannelFilter(grpc_channel_element_args* args, grpc_error_handle* error) : channel_args_(args->channel_args), - deadline_checking_enabled_( - channel_args_.GetBool(GRPC_ARG_ENABLE_DEADLINE_CHECKS) - .value_or(!channel_args_.WantMinimalStack())), owning_stack_(args->channel_stack), client_channel_factory_(channel_args_.GetObject()), channelz_node_(channel_args_.GetObject()), @@ -2112,8 +2109,7 @@ grpc_error_handle ClientChannelFilter::CallData::ApplyServiceConfigToCallLocked( if (method_params != nullptr) { // If the deadline from the service config is shorter than the one // from the client API, reset the deadline timer. - if (chand()->deadline_checking_enabled_ && - method_params->timeout() != Duration::Zero()) { + if (method_params->timeout() != Duration::Zero()) { ResetDeadline(method_params->timeout()); } // If the service config set wait_for_ready and the application @@ -2213,12 +2209,10 @@ ClientChannelFilter::FilterBasedCallData::FilterBasedCallData( call_context_(args.context), call_start_time_(args.start_time), deadline_(args.deadline), - deadline_state_( - elem, args, - GPR_LIKELY(static_cast(elem->channel_data) - ->deadline_checking_enabled_) - ? args.deadline - : Timestamp::InfFuture()) { + arena_(args.arena), + elem_(elem), + owning_call_(args.call_stack), + call_combiner_(args.call_combiner) { if (GRPC_TRACE_FLAG_ENABLED(grpc_client_channel_call_trace)) { gpr_log(GPR_INFO, "chand=%p calld=%p: created call", chand(), this); } @@ -2262,10 +2256,6 @@ void ClientChannelFilter::FilterBasedCallData::StartTransportStreamOpBatch( gpr_log(GPR_INFO, "chand=%p calld=%p: batch started from above: %s", chand, calld, grpc_transport_stream_op_batch_string(batch, false).c_str()); } - if (GPR_LIKELY(chand->deadline_checking_enabled_)) { - grpc_deadline_state_client_start_transport_stream_op_batch( - &calld->deadline_state_, batch); - } // Intercept recv_trailing_metadata to commit the call, in case we wind up // failing the call before we get down to the retry or LB call layer. if (batch->recv_trailing_metadata) { @@ -3056,7 +3046,6 @@ ClientChannelFilter::FilterBasedLoadBalancedCall::FilterBasedLoadBalancedCall( absl::AnyInvocable on_commit, bool is_transparent_retry) : LoadBalancedCall(chand, args.context, std::move(on_commit), is_transparent_retry), - deadline_(args.deadline), arena_(args.arena), owning_call_(args.call_stack), call_combiner_(args.call_combiner), @@ -3356,8 +3345,12 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall:: // Get status from error. grpc_status_code code; std::string message; - grpc_error_get_status(error, self->deadline_, &code, &message, - /*http_error=*/nullptr, /*error_string=*/nullptr); + grpc_error_get_status( + error, + static_cast(self->call_context()[GRPC_CONTEXT_CALL].value) + ->deadline(), + &code, &message, + /*http_error=*/nullptr, /*error_string=*/nullptr); status = absl::Status(static_cast(code), message); } else { // Get status from headers. @@ -3495,7 +3488,8 @@ void ClientChannelFilter::FilterBasedLoadBalancedCall::CreateSubchannelCall() { CHECK_NE(path, nullptr); SubchannelCall::Args call_args = { connected_subchannel()->Ref(), pollent_, path->Ref(), /*start_time=*/0, - deadline_, arena_, + static_cast(call_context()[GRPC_CONTEXT_CALL].value)->deadline(), + arena_, // TODO(roth): When we implement hedging support, we will probably // need to use a separate call context for each subchannel call. call_context(), call_combiner_}; diff --git a/src/core/client_channel/client_channel_filter.h b/src/core/client_channel/client_channel_filter.h index f9ae44b0d26..28c21d3280c 100644 --- a/src/core/client_channel/client_channel_filter.h +++ b/src/core/client_channel/client_channel_filter.h @@ -287,7 +287,6 @@ class ClientChannelFilter final { // Fields set at construction and never modified. // ChannelArgs channel_args_; - const bool deadline_checking_enabled_; grpc_channel_stack* owning_stack_; ClientChannelFactory* client_channel_factory_; RefCountedPtr default_service_config_; @@ -558,7 +557,6 @@ class ClientChannelFilter::FilterBasedLoadBalancedCall final // TODO(roth): Instead of duplicating these fields in every filter // that uses any one of them, we should store them in the call // context. This will save per-call memory overhead. - Timestamp deadline_; Arena* arena_; grpc_call_stack* owning_call_; CallCombiner* call_combiner_; diff --git a/src/core/ext/filters/deadline/deadline_filter.cc b/src/core/ext/filters/deadline/deadline_filter.cc deleted file mode 100644 index a2dc24594e2..00000000000 --- a/src/core/ext/filters/deadline/deadline_filter.cc +++ /dev/null @@ -1,408 +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 "src/core/ext/filters/deadline/deadline_filter.h" - -#include -#include -#include -#include - -#include "absl/status/status.h" -#include "absl/types/optional.h" - -#include -#include -#include - -#include "src/core/lib/config/core_configuration.h" -#include "src/core/lib/gprpp/debug_location.h" -#include "src/core/lib/gprpp/status_helper.h" -#include "src/core/lib/iomgr/error.h" -#include "src/core/lib/iomgr/exec_ctx.h" -#include "src/core/lib/iomgr/timer.h" -#include "src/core/lib/promise/arena_promise.h" -#include "src/core/lib/promise/context.h" -#include "src/core/lib/surface/call.h" -#include "src/core/lib/surface/channel_stack_type.h" -#include "src/core/lib/transport/metadata_batch.h" - -namespace grpc_core { - -// A fire-and-forget class representing a pending deadline timer. -// Allocated on the call arena. -class TimerState { - public: - TimerState(grpc_deadline_state* deadline_state, Timestamp deadline) - : deadline_state_(deadline_state) { - GRPC_CALL_STACK_REF(deadline_state->call_stack, "DeadlineTimerState"); - GRPC_CLOSURE_INIT(&closure_, TimerCallback, this, nullptr); - grpc_timer_init(&timer_, deadline, &closure_); - } - - void Cancel() { grpc_timer_cancel(&timer_); } - - private: - // The on_complete callback used when sending a cancel_error batch down the - // filter stack. Yields the call combiner when the batch returns. - static void YieldCallCombiner(void* arg, grpc_error_handle /*ignored*/) { - TimerState* self = static_cast(arg); - GRPC_CALL_COMBINER_STOP(self->deadline_state_->call_combiner, - "got on_complete from cancel_stream batch"); - GRPC_CALL_STACK_UNREF(self->deadline_state_->call_stack, - "DeadlineTimerState"); - } - - // This is called via the call combiner, so access to deadline_state is - // synchronized. - static void SendCancelOpInCallCombiner(void* arg, grpc_error_handle error) { - TimerState* self = static_cast(arg); - grpc_transport_stream_op_batch* batch = grpc_make_transport_stream_op( - GRPC_CLOSURE_INIT(&self->closure_, YieldCallCombiner, self, nullptr)); - batch->cancel_stream = true; - batch->payload->cancel_stream.cancel_error = error; - grpc_call_element* elem = self->deadline_state_->elem; - elem->filter->start_transport_stream_op_batch(elem, batch); - } - - // Timer callback. - static void TimerCallback(void* arg, grpc_error_handle error) { - TimerState* self = static_cast(arg); - if (error != absl::CancelledError()) { - error = grpc_error_set_int(GRPC_ERROR_CREATE("Deadline Exceeded"), - StatusIntProperty::kRpcStatus, - GRPC_STATUS_DEADLINE_EXCEEDED); - self->deadline_state_->call_combiner->Cancel(error); - GRPC_CLOSURE_INIT(&self->closure_, SendCancelOpInCallCombiner, self, - nullptr); - GRPC_CALL_COMBINER_START(self->deadline_state_->call_combiner, - &self->closure_, error, - "deadline exceeded -- sending cancel_stream op"); - } else { - GRPC_CALL_STACK_UNREF(self->deadline_state_->call_stack, - "DeadlineTimerState"); - } - } - - // NOTE: This object's dtor is never called, so do not add any data - // members that require destruction! - // TODO(roth): We should ideally call this object's dtor somewhere, - // but that would require adding more synchronization, because we'd - // need to call the dtor only after both (a) the timer callback - // finishes and (b) the filter sees the call completion and attempts - // to cancel the timer. - grpc_deadline_state* deadline_state_; - grpc_timer timer_; - grpc_closure closure_; -}; - -} // namespace grpc_core - -// -// grpc_deadline_state -// - -// Starts the deadline timer. -// This is called via the call combiner, so access to deadline_state is -// synchronized. -static void start_timer_if_needed(grpc_deadline_state* deadline_state, - grpc_core::Timestamp deadline) { - if (deadline == grpc_core::Timestamp::InfFuture()) return; - GPR_ASSERT(deadline_state->timer_state == nullptr); - deadline_state->timer_state = - deadline_state->arena->New(deadline_state, - deadline); -} - -// Cancels the deadline timer. -// This is called via the call combiner, so access to deadline_state is -// synchronized. -static void cancel_timer_if_needed(grpc_deadline_state* deadline_state) { - if (deadline_state->timer_state != nullptr) { - deadline_state->timer_state->Cancel(); - deadline_state->timer_state = nullptr; - } -} - -// Callback run when we receive trailing metadata. -static void recv_trailing_metadata_ready(void* arg, grpc_error_handle error) { - grpc_deadline_state* deadline_state = static_cast(arg); - cancel_timer_if_needed(deadline_state); - // Invoke the original callback. - grpc_core::Closure::Run(DEBUG_LOCATION, - deadline_state->original_recv_trailing_metadata_ready, - error); -} - -// Inject our own recv_trailing_metadata_ready callback into op. -static void inject_recv_trailing_metadata_ready( - grpc_deadline_state* deadline_state, grpc_transport_stream_op_batch* op) { - deadline_state->original_recv_trailing_metadata_ready = - op->payload->recv_trailing_metadata.recv_trailing_metadata_ready; - GRPC_CLOSURE_INIT(&deadline_state->recv_trailing_metadata_ready, - recv_trailing_metadata_ready, deadline_state, - grpc_schedule_on_exec_ctx); - op->payload->recv_trailing_metadata.recv_trailing_metadata_ready = - &deadline_state->recv_trailing_metadata_ready; -} - -// Callback and associated state for starting the timer after call stack -// initialization has been completed. -struct start_timer_after_init_state { - start_timer_after_init_state(grpc_deadline_state* deadline_state, - grpc_core::Timestamp deadline) - : deadline_state(deadline_state), deadline(deadline) {} - ~start_timer_after_init_state() { - start_timer_if_needed(deadline_state, deadline); - } - - bool in_call_combiner = false; - grpc_deadline_state* deadline_state; - grpc_core::Timestamp deadline; - grpc_closure closure; -}; -static void start_timer_after_init(void* arg, grpc_error_handle error) { - struct start_timer_after_init_state* state = - static_cast(arg); - grpc_deadline_state* deadline_state = state->deadline_state; - if (!state->in_call_combiner) { - // We are initially called without holding the call combiner, so we - // need to bounce ourselves into it. - state->in_call_combiner = true; - GRPC_CALL_COMBINER_START(deadline_state->call_combiner, &state->closure, - error, "scheduling deadline timer"); - return; - } - delete state; - GRPC_CALL_COMBINER_STOP(deadline_state->call_combiner, - "done scheduling deadline timer"); -} - -grpc_deadline_state::grpc_deadline_state(grpc_call_element* elem, - const grpc_call_element_args& args, - grpc_core::Timestamp deadline) - : elem(elem), - call_stack(args.call_stack), - call_combiner(args.call_combiner), - arena(args.arena) { - // Deadline will always be infinite on servers, so the timer will only be - // set on clients with a finite deadline. - if (deadline != grpc_core::Timestamp::InfFuture()) { - // When the deadline passes, we indicate the failure by sending down - // an op with cancel_error set. However, we can't send down any ops - // until after the call stack is fully initialized. If we start the - // timer here, we have no guarantee that the timer won't pop before - // call stack initialization is finished. To avoid that problem, we - // create a closure to start the timer, and we schedule that closure - // to be run after call stack initialization is done. - struct start_timer_after_init_state* state = - new start_timer_after_init_state(this, deadline); - GRPC_CLOSURE_INIT(&state->closure, start_timer_after_init, state, - grpc_schedule_on_exec_ctx); - grpc_core::ExecCtx::Run(DEBUG_LOCATION, &state->closure, absl::OkStatus()); - } -} - -grpc_deadline_state::~grpc_deadline_state() { cancel_timer_if_needed(this); } - -void grpc_deadline_state_reset(grpc_deadline_state* deadline_state, - grpc_core::Timestamp new_deadline) { - cancel_timer_if_needed(deadline_state); - start_timer_if_needed(deadline_state, new_deadline); -} - -void grpc_deadline_state_client_start_transport_stream_op_batch( - grpc_deadline_state* deadline_state, grpc_transport_stream_op_batch* op) { - if (op->cancel_stream) { - cancel_timer_if_needed(deadline_state); - } else { - // Make sure we know when the call is complete, so that we can cancel - // the timer. - if (op->recv_trailing_metadata) { - inject_recv_trailing_metadata_ready(deadline_state, op); - } - } -} - -// -// filter code -// - -// Constructor for channel_data. Used for both client and server filters. -static grpc_error_handle deadline_init_channel_elem( - grpc_channel_element* /*elem*/, grpc_channel_element_args* args) { - GPR_ASSERT(!args->is_last); - return absl::OkStatus(); -} - -// Destructor for channel_data. Used for both client and server filters. -static void deadline_destroy_channel_elem(grpc_channel_element* /*elem*/) {} - -// Additional call data used only for the server filter. -struct server_call_data { - grpc_deadline_state deadline_state; // Must be first. - // The closure for receiving initial metadata. - grpc_closure recv_initial_metadata_ready; - // Received initial metadata batch. - grpc_metadata_batch* recv_initial_metadata; - // The original recv_initial_metadata_ready closure, which we chain to - // after our own closure is invoked. - grpc_closure* next_recv_initial_metadata_ready; -}; - -// Constructor for call_data. Used for both client and server filters. -static grpc_error_handle deadline_init_call_elem( - grpc_call_element* elem, const grpc_call_element_args* args) { - new (elem->call_data) grpc_deadline_state(elem, *args, args->deadline); - return absl::OkStatus(); -} - -// Destructor for call_data. Used for both client and server filters. -static void deadline_destroy_call_elem( - grpc_call_element* elem, const grpc_call_final_info* /*final_info*/, - grpc_closure* /*ignored*/) { - grpc_deadline_state* deadline_state = - static_cast(elem->call_data); - deadline_state->~grpc_deadline_state(); -} - -// Method for starting a call op for client filter. -static void deadline_client_start_transport_stream_op_batch( - grpc_call_element* elem, grpc_transport_stream_op_batch* op) { - grpc_deadline_state_client_start_transport_stream_op_batch( - static_cast(elem->call_data), op); - // Chain to next filter. - grpc_call_next_op(elem, op); -} - -// Callback for receiving initial metadata on the server. -static void recv_initial_metadata_ready(void* arg, grpc_error_handle error) { - grpc_call_element* elem = static_cast(arg); - server_call_data* calld = static_cast(elem->call_data); - start_timer_if_needed( - &calld->deadline_state, - calld->recv_initial_metadata->get(grpc_core::GrpcTimeoutMetadata()) - .value_or(grpc_core::Timestamp::InfFuture())); - // Invoke the next callback. - grpc_core::Closure::Run(DEBUG_LOCATION, - calld->next_recv_initial_metadata_ready, error); -} - -// Method for starting a call op for server filter. -static void deadline_server_start_transport_stream_op_batch( - grpc_call_element* elem, grpc_transport_stream_op_batch* op) { - server_call_data* calld = static_cast(elem->call_data); - if (op->cancel_stream) { - cancel_timer_if_needed(&calld->deadline_state); - } else { - // If we're receiving initial metadata, we need to get the deadline - // from the recv_initial_metadata_ready callback. So we inject our - // own callback into that hook. - if (op->recv_initial_metadata) { - calld->next_recv_initial_metadata_ready = - op->payload->recv_initial_metadata.recv_initial_metadata_ready; - calld->recv_initial_metadata = - op->payload->recv_initial_metadata.recv_initial_metadata; - GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready, - recv_initial_metadata_ready, elem, - grpc_schedule_on_exec_ctx); - op->payload->recv_initial_metadata.recv_initial_metadata_ready = - &calld->recv_initial_metadata_ready; - } - // Make sure we know when the call is complete, so that we can cancel - // the timer. - // Note that we trigger this on recv_trailing_metadata, even though - // the client never sends trailing metadata, because this is the - // hook that tells us when the call is complete on the server side. - if (op->recv_trailing_metadata) { - inject_recv_trailing_metadata_ready(&calld->deadline_state, op); - } - } - // Chain to next filter. - grpc_call_next_op(elem, op); -} - -const grpc_channel_filter grpc_client_deadline_filter = { - deadline_client_start_transport_stream_op_batch, - [](grpc_channel_element*, grpc_core::CallArgs call_args, - grpc_core::NextPromiseFactory next_promise_factory) { - return next_promise_factory(std::move(call_args)); - }, - /* init_call: */ nullptr, - grpc_channel_next_op, - sizeof(grpc_deadline_state), - deadline_init_call_elem, - grpc_call_stack_ignore_set_pollset_or_pollset_set, - deadline_destroy_call_elem, - 0, // sizeof(channel_data) - deadline_init_channel_elem, - grpc_channel_stack_no_post_init, - deadline_destroy_channel_elem, - grpc_channel_next_get_info, - "deadline", -}; - -const grpc_channel_filter grpc_server_deadline_filter = { - deadline_server_start_transport_stream_op_batch, - [](grpc_channel_element*, grpc_core::CallArgs call_args, - grpc_core::NextPromiseFactory next_promise_factory) { - auto deadline = call_args.client_initial_metadata->get( - grpc_core::GrpcTimeoutMetadata()); - if (deadline.has_value()) { - grpc_core::GetContext()->UpdateDeadline( - *deadline); - } - return next_promise_factory(std::move(call_args)); - }, - [](grpc_channel_element*, grpc_core::CallSpineInterface* spine) { - grpc_core::DownCast(spine) - ->client_initial_metadata() - .receiver.InterceptAndMap([](grpc_core::ClientMetadataHandle md) { - auto deadline = md->get(grpc_core::GrpcTimeoutMetadata()); - if (deadline.has_value()) { - grpc_core::GetContext()->UpdateDeadline( - *deadline); - } - return md; - }); - }, - grpc_channel_next_op, - sizeof(server_call_data), - deadline_init_call_elem, - grpc_call_stack_ignore_set_pollset_or_pollset_set, - deadline_destroy_call_elem, - 0, // sizeof(channel_data) - deadline_init_channel_elem, - grpc_channel_stack_no_post_init, - deadline_destroy_channel_elem, - grpc_channel_next_get_info, - "deadline", -}; - -namespace grpc_core { -void RegisterDeadlineFilter(CoreConfiguration::Builder* builder) { - builder->channel_init() - ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL, &grpc_client_deadline_filter) - .ExcludeFromMinimalStack() - .IfChannelArg(GRPC_ARG_ENABLE_DEADLINE_CHECKS, true); - builder->channel_init() - ->RegisterFilter(GRPC_SERVER_CHANNEL, &grpc_server_deadline_filter) - .ExcludeFromMinimalStack() - .IfChannelArg(GRPC_ARG_ENABLE_DEADLINE_CHECKS, true); -} -} // namespace grpc_core diff --git a/src/core/ext/filters/deadline/deadline_filter.h b/src/core/ext/filters/deadline/deadline_filter.h deleted file mode 100644 index 131f49d2473..00000000000 --- a/src/core/ext/filters/deadline/deadline_filter.h +++ /dev/null @@ -1,85 +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_SRC_CORE_EXT_FILTERS_DEADLINE_DEADLINE_FILTER_H -#define GRPC_SRC_CORE_EXT_FILTERS_DEADLINE_DEADLINE_FILTER_H - -#include - -#include "src/core/lib/channel/channel_fwd.h" -#include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/gprpp/time.h" -#include "src/core/lib/iomgr/call_combiner.h" -#include "src/core/lib/iomgr/closure.h" -#include "src/core/lib/resource_quota/arena.h" -#include "src/core/lib/transport/transport.h" - -namespace grpc_core { -class TimerState; -} // namespace grpc_core - -// State used for filters that enforce call deadlines. -// Must be the first field in the filter's call_data. -struct grpc_deadline_state { - grpc_deadline_state(grpc_call_element* elem, - const grpc_call_element_args& args, - grpc_core::Timestamp deadline); - ~grpc_deadline_state(); - - // We take a reference to the call stack for the timer callback. - grpc_call_element* elem; - grpc_call_stack* call_stack; - grpc_core::CallCombiner* call_combiner; - grpc_core::Arena* arena; - grpc_core::TimerState* timer_state = nullptr; - // Closure to invoke when we receive trailing metadata. - // We use this to cancel the timer. - grpc_closure recv_trailing_metadata_ready; - // The original recv_trailing_metadata_ready closure, which we chain to - // after our own closure is invoked. - grpc_closure* original_recv_trailing_metadata_ready; -}; - -// Cancels the existing timer and starts a new one with new_deadline. -// -// Note: It is generally safe to call this with an earlier deadline -// value than the current one, but not the reverse. No checks are done -// to ensure that the timer callback is not invoked while it is in the -// process of being reset, which means that attempting to increase the -// deadline may result in the timer being called twice. -// -// Note: Must be called while holding the call combiner. -void grpc_deadline_state_reset(grpc_deadline_state* deadline_state, - grpc_core::Timestamp new_deadline); - -// To be called from the client-side filter's start_transport_stream_op_batch() -// method. Ensures that the deadline timer is cancelled when the call -// is completed. -// -// Note: It is the caller's responsibility to chain to the next filter if -// necessary after this function returns. -// -// Note: Must be called while holding the call combiner. -void grpc_deadline_state_client_start_transport_stream_op_batch( - grpc_deadline_state* deadline_state, grpc_transport_stream_op_batch* op); - -// Deadline filters for direct client channels and server channels. -// Note: Deadlines for non-direct client channels are handled by the -// client_channel filter. -extern const grpc_channel_filter grpc_client_deadline_filter; -extern const grpc_channel_filter grpc_server_deadline_filter; - -#endif // GRPC_SRC_CORE_EXT_FILTERS_DEADLINE_DEADLINE_FILTER_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 379d4944788..0933d633272 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -29,7 +29,6 @@ #include #include -#include "src/core/ext/filters/deadline/deadline_filter.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_stack.h" #include "src/core/lib/config/core_configuration.h" @@ -250,18 +249,10 @@ void RegisterMessageSizeFilter(CoreConfiguration::Builder* builder) { builder->channel_init() ->RegisterFilter(GRPC_CLIENT_DIRECT_CHANNEL) .ExcludeFromMinimalStack() - .If(HasMessageSizeLimits) - // TODO(ctiller): ordering constraint is here to match the ordering that - // existed prior to ordering constraints did. Re-examine the ordering of - // filters from first principles. - .Before({&grpc_client_deadline_filter}); + .If(HasMessageSizeLimits); builder->channel_init() ->RegisterFilter(GRPC_SERVER_CHANNEL) .ExcludeFromMinimalStack() - .If(HasMessageSizeLimits) - // TODO(ctiller): ordering constraint is here to match the ordering that - // existed prior to ordering constraints did. Re-examine the ordering of - // filters from first principles. - .Before({&grpc_server_deadline_filter}); + .If(HasMessageSizeLimits); } } // namespace grpc_core diff --git a/src/core/ext/transport/chaotic_good/client_transport.h b/src/core/ext/transport/chaotic_good/client_transport.h index d08929b0f73..f07099e296f 100644 --- a/src/core/ext/transport/chaotic_good/client_transport.h +++ b/src/core/ext/transport/chaotic_good/client_transport.h @@ -85,7 +85,7 @@ class ChaoticGoodClientTransport final : public ClientTransport { grpc_endpoint* GetEndpoint() override { return nullptr; } void Orphan() override { AbortWithError(); - delete this; + Unref(); } void StartCall(CallHandler call_handler) override; diff --git a/src/core/ext/transport/chaotic_good/server_transport.h b/src/core/ext/transport/chaotic_good/server_transport.h index acdc88ef9fd..a34ac92b73e 100644 --- a/src/core/ext/transport/chaotic_good/server_transport.h +++ b/src/core/ext/transport/chaotic_good/server_transport.h @@ -96,7 +96,7 @@ class ChaoticGoodServerTransport final : public ServerTransport { void SetPollsetSet(grpc_stream*, grpc_pollset_set*) override {} void PerformOp(grpc_transport_op*) override; grpc_endpoint* GetEndpoint() override { return nullptr; } - void Orphan() override { delete this; } + void Orphan() override { Unref(); } void SetAcceptor(Acceptor* acceptor) override; void AbortWithError(); diff --git a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc index dff513f47da..1af3a893c6a 100644 --- a/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +++ b/src/core/ext/transport/chttp2/transport/chttp2_transport.cc @@ -142,8 +142,6 @@ static bool g_default_server_keepalive_permit_without_calls = false; #define MAX_CLIENT_STREAM_ID 0x7fffffffu grpc_core::TraceFlag grpc_keepalive_trace(false, "http_keepalive"); -grpc_core::DebugOnlyTraceFlag grpc_trace_chttp2_refcount(false, - "chttp2_refcount"); // forward declarations of various callbacks that we'll build closures around static void write_action_begin_locked( @@ -594,12 +592,7 @@ static void init_keepalive_pings_if_enabled_locked( grpc_chttp2_transport::grpc_chttp2_transport( const grpc_core::ChannelArgs& channel_args, grpc_endpoint* ep, bool is_client) - : grpc_core::RefCounted( - GRPC_TRACE_FLAG_ENABLED(grpc_trace_chttp2_refcount) - ? "chttp2_refcount" - : nullptr), - ep(ep), + : ep(ep), peer_string( grpc_core::Slice::FromCopiedString(grpc_endpoint_get_peer(ep))), memory_owner(channel_args.GetObject() diff --git a/src/core/ext/transport/chttp2/transport/internal.h b/src/core/ext/transport/chttp2/transport/internal.h index 4714d4c7370..058928a596d 100644 --- a/src/core/ext/transport/chttp2/transport/internal.h +++ b/src/core/ext/transport/chttp2/transport/internal.h @@ -223,17 +223,19 @@ typedef enum { GRPC_CHTTP2_KEEPALIVE_STATE_DISABLED, } grpc_chttp2_keepalive_state; -struct grpc_chttp2_transport final - : public grpc_core::FilterStackTransport, - public grpc_core::RefCounted, - public grpc_core::KeepsGrpcInitialized { +struct grpc_chttp2_transport final : public grpc_core::FilterStackTransport, + public grpc_core::KeepsGrpcInitialized { grpc_chttp2_transport(const grpc_core::ChannelArgs& channel_args, grpc_endpoint* ep, bool is_client); ~grpc_chttp2_transport() override; void Orphan() override; + grpc_core::RefCountedPtr Ref() { + return grpc_core::FilterStackTransport::RefAsSubclass< + grpc_chttp2_transport>(); + } + size_t SizeOfStream() const override; bool HackyDisableStreamOpBatchCoalescingInConnectedChannel() const override; void PerformStreamOp(grpc_stream* gs, diff --git a/src/core/ext/transport/inproc/inproc_transport.cc b/src/core/ext/transport/inproc/inproc_transport.cc index ae32bca6c07..ffcc7469c6a 100644 --- a/src/core/ext/transport/inproc/inproc_transport.cc +++ b/src/core/ext/transport/inproc/inproc_transport.cc @@ -33,8 +33,9 @@ namespace grpc_core { namespace { -class InprocServerTransport final : public RefCounted, - public ServerTransport { +class InprocClientTransport; + +class InprocServerTransport final : public ServerTransport { public: void SetAcceptor(Acceptor* acceptor) override { acceptor_ = acceptor; @@ -95,6 +96,8 @@ class InprocServerTransport final : public RefCounted, return acceptor_->CreateCall(std::move(md), acceptor_->CreateArena()); } + OrphanablePtr MakeClientTransport(); + private: enum class ConnectionState : uint8_t { kInitial, kReady, kDisconnected }; @@ -109,6 +112,10 @@ class InprocServerTransport final : public RefCounted, class InprocClientTransport final : public ClientTransport { public: + explicit InprocClientTransport( + RefCountedPtr server_transport) + : server_transport_(std::move(server_transport)) {} + void StartCall(CallHandler call_handler) override { call_handler.SpawnGuarded( "pull_initial_metadata", @@ -125,10 +132,6 @@ class InprocClientTransport final : public ClientTransport { void Orphan() override { delete this; } - OrphanablePtr GetServerTransport() { - return OrphanablePtr(server_transport_->Ref().release()); - } - FilterStackTransport* filter_stack_transport() override { return nullptr; } ClientTransport* client_transport() override { return this; } ServerTransport* server_transport() override { return nullptr; } @@ -144,8 +147,7 @@ class InprocClientTransport final : public ClientTransport { absl::UnavailableError("Client transport closed")); } - RefCountedPtr server_transport_ = - MakeRefCounted(); + const RefCountedPtr server_transport_; }; bool UsePromiseBasedTransport() { @@ -155,6 +157,12 @@ bool UsePromiseBasedTransport() { return true; } +OrphanablePtr +InprocServerTransport::MakeClientTransport() { + return MakeOrphanable( + RefAsSubclass()); +} + OrphanablePtr MakeLameChannel(absl::string_view why, absl::Status error) { gpr_log(GPR_ERROR, "%s: %s", std::string(why).c_str(), @@ -196,8 +204,8 @@ OrphanablePtr MakeInprocChannel(Server* server, std::pair, OrphanablePtr> MakeInProcessTransportPair() { - auto client_transport = MakeOrphanable(); - auto server_transport = client_transport->GetServerTransport(); + auto server_transport = MakeOrphanable(); + auto client_transport = server_transport->MakeClientTransport(); return std::make_pair(std::move(client_transport), std::move(server_transport)); } diff --git a/src/core/lib/address_utils/parse_address.cc b/src/core/lib/address_utils/parse_address.cc index 8899aaf725f..62d4839b6e3 100644 --- a/src/core/lib/address_utils/parse_address.cc +++ b/src/core/lib/address_utils/parse_address.cc @@ -18,6 +18,8 @@ #include "src/core/lib/address_utils/parse_address.h" +#include "absl/log/check.h" + #include #include "src/core/lib/iomgr/port.h" // IWYU pragma: keep @@ -284,7 +286,7 @@ bool grpc_parse_ipv6_hostport(absl::string_view hostport, char* host_end = static_cast(gpr_memrchr(host.c_str(), '%', host.size())); if (host_end != nullptr) { - GPR_ASSERT(host_end >= host.c_str()); + CHECK(host_end >= host.c_str()); char host_without_scope[GRPC_INET6_ADDRSTRLEN + 1]; size_t host_without_scope_len = static_cast(host_end - host.c_str()); diff --git a/src/core/lib/address_utils/sockaddr_utils.cc b/src/core/lib/address_utils/sockaddr_utils.cc index a48bad46c26..c33d2691ab5 100644 --- a/src/core/lib/address_utils/sockaddr_utils.cc +++ b/src/core/lib/address_utils/sockaddr_utils.cc @@ -21,6 +21,8 @@ #include #include +#include "absl/log/check.h" + #include #ifdef GRPC_HAVE_VSOCK #include @@ -110,7 +112,7 @@ static const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0, int grpc_sockaddr_is_v4mapped(const grpc_resolved_address* resolved_addr, grpc_resolved_address* resolved_addr4_out) { - GPR_ASSERT(resolved_addr != resolved_addr4_out); + CHECK(resolved_addr != resolved_addr4_out); const grpc_sockaddr* addr = reinterpret_cast(resolved_addr->addr); grpc_sockaddr_in* addr4_out = @@ -140,7 +142,7 @@ int grpc_sockaddr_is_v4mapped(const grpc_resolved_address* resolved_addr, int grpc_sockaddr_to_v4mapped(const grpc_resolved_address* resolved_addr, grpc_resolved_address* resolved_addr6_out) { - GPR_ASSERT(resolved_addr != resolved_addr6_out); + CHECK(resolved_addr != resolved_addr6_out); const grpc_sockaddr* addr = reinterpret_cast(resolved_addr->addr); grpc_sockaddr_in6* addr6_out = @@ -203,7 +205,8 @@ void grpc_sockaddr_make_wildcard4(int port, grpc_resolved_address* resolved_wild_out) { grpc_sockaddr_in* wild_out = reinterpret_cast(resolved_wild_out->addr); - GPR_ASSERT(port >= 0 && port < 65536); + CHECK(port >= 0); + CHECK(port < 65536); memset(resolved_wild_out, 0, sizeof(*resolved_wild_out)); wild_out->sin_family = GRPC_AF_INET; wild_out->sin_port = grpc_htons(static_cast(port)); @@ -214,7 +217,8 @@ void grpc_sockaddr_make_wildcard6(int port, grpc_resolved_address* resolved_wild_out) { grpc_sockaddr_in6* wild_out = reinterpret_cast(resolved_wild_out->addr); - GPR_ASSERT(port >= 0 && port < 65536); + CHECK(port >= 0); + CHECK(port < 65536); memset(resolved_wild_out, 0, sizeof(*resolved_wild_out)); wild_out->sin6_family = GRPC_AF_INET6; wild_out->sin6_port = grpc_htons(static_cast(port)); @@ -378,12 +382,14 @@ int grpc_sockaddr_set_port(grpc_resolved_address* resolved_addr, int port) { grpc_sockaddr* addr = reinterpret_cast(resolved_addr->addr); switch (addr->sa_family) { case GRPC_AF_INET: - GPR_ASSERT(port >= 0 && port < 65536); + CHECK(port >= 0); + CHECK(port < 65536); (reinterpret_cast(addr))->sin_port = grpc_htons(static_cast(port)); return 1; case GRPC_AF_INET6: - GPR_ASSERT(port >= 0 && port < 65536); + CHECK(port >= 0); + CHECK(port < 65536); (reinterpret_cast(addr))->sin6_port = grpc_htons(static_cast(port)); return 1; @@ -437,7 +443,7 @@ void grpc_sockaddr_mask_bits(grpc_resolved_address* address, // We cannot use s6_addr32 since it is not defined on all platforms that we // need it on. uint32_t address_parts[4]; - GPR_ASSERT(sizeof(addr6->sin6_addr) == sizeof(address_parts)); + CHECK(sizeof(addr6->sin6_addr) == sizeof(address_parts)); memcpy(address_parts, &addr6->sin6_addr, sizeof(grpc_in6_addr)); if (mask_bits <= 32) { uint32_t mask_ip_addr = (~(uint32_t{0})) << (32 - mask_bits); diff --git a/src/core/lib/channel/call_tracer.cc b/src/core/lib/channel/call_tracer.cc index 898cb5ab6b3..154bbdfbf06 100644 --- a/src/core/lib/channel/call_tracer.cc +++ b/src/core/lib/channel/call_tracer.cc @@ -22,6 +22,8 @@ #include #include +#include "absl/log/check.h" + #include #include @@ -76,7 +78,7 @@ class DelegatingClientCallTracer : public ClientCallTracer { explicit DelegatingClientCallAttemptTracer( std::vector tracers) : tracers_(std::move(tracers)) { - GPR_DEBUG_ASSERT(!tracers_.empty()); + DCHECK(!tracers_.empty()); } ~DelegatingClientCallAttemptTracer() override {} void RecordSendInitialMetadata( @@ -176,7 +178,7 @@ class DelegatingClientCallTracer : public ClientCallTracer { attempt_tracers.reserve(tracers_.size()); for (auto* tracer : tracers_) { auto* attempt_tracer = tracer->StartNewAttempt(is_transparent_retry); - GPR_DEBUG_ASSERT(attempt_tracer != nullptr); + DCHECK_NE(attempt_tracer, nullptr); attempt_tracers.push_back(attempt_tracer); } return GetContext()->ManagedNew( @@ -328,9 +330,8 @@ void AddClientCallTracerToContext(grpc_call_context_element* call_context, void AddServerCallTracerToContext(grpc_call_context_element* call_context, ServerCallTracer* tracer) { - GPR_DEBUG_ASSERT( - call_context[GRPC_CONTEXT_CALL_TRACER].value == - call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value); + DCHECK(call_context[GRPC_CONTEXT_CALL_TRACER].value == + call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value); if (call_context[GRPC_CONTEXT_CALL_TRACER_ANNOTATION_INTERFACE].value == nullptr) { // This is the first call tracer. Set it directly. diff --git a/src/core/lib/channel/channel_args.cc b/src/core/lib/channel/channel_args.cc index d02d5b369b3..f34408512c9 100644 --- a/src/core/lib/channel/channel_args.cc +++ b/src/core/lib/channel/channel_args.cc @@ -28,6 +28,7 @@ #include #include +#include "absl/log/check.h" #include "absl/strings/match.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" @@ -427,7 +428,7 @@ grpc_channel_args* grpc_channel_args_copy_and_add_and_remove( for (size_t i = 0; i < num_to_add; ++i) { dst->args[dst_idx++] = copy_arg(&to_add[i]); } - GPR_ASSERT(dst_idx == dst->num_args); + CHECK(dst_idx == dst->num_args); return dst; } @@ -699,7 +700,7 @@ grpc_channel_args_client_channel_creation_mutator g_mutator = nullptr; void grpc_channel_args_set_client_channel_creation_mutator( grpc_channel_args_client_channel_creation_mutator cb) { - GPR_DEBUG_ASSERT(g_mutator == nullptr); + DCHECK_EQ(g_mutator, nullptr); g_mutator = cb; } grpc_channel_args_client_channel_creation_mutator diff --git a/src/core/lib/channel/channel_stack.cc b/src/core/lib/channel/channel_stack.cc index 4c4eaa2326d..9b28a321db1 100644 --- a/src/core/lib/channel/channel_stack.cc +++ b/src/core/lib/channel/channel_stack.cc @@ -23,6 +23,8 @@ #include #include +#include "absl/log/check.h" + #include #include @@ -67,8 +69,8 @@ size_t grpc_channel_stack_size(const grpc_channel_filter** filters, sizeof(grpc_channel_element)); size_t i; - GPR_ASSERT((GPR_MAX_ALIGNMENT & (GPR_MAX_ALIGNMENT - 1)) == 0 && - "GPR_MAX_ALIGNMENT must be a power of two"); + CHECK((GPR_MAX_ALIGNMENT & (GPR_MAX_ALIGNMENT - 1)) == 0) + << "GPR_MAX_ALIGNMENT must be a power of two"; // add the size for each filter for (i = 0; i < filter_count; i++) { @@ -167,9 +169,9 @@ grpc_error_handle grpc_channel_stack_init( call_size += GPR_ROUND_UP_TO_ALIGNMENT_SIZE(filters[i]->sizeof_call_data); } - GPR_ASSERT(user_data > (char*)stack); - GPR_ASSERT((uintptr_t)(user_data - (char*)stack) == - grpc_channel_stack_size(filters, filter_count)); + CHECK(user_data > (char*)stack); + CHECK((uintptr_t)(user_data - (char*)stack) == + grpc_channel_stack_size(filters, filter_count)); stack->call_stack_size = call_size; return first_error; diff --git a/src/core/lib/channel/connected_channel.cc b/src/core/lib/channel/connected_channel.cc index 6cbf9df086e..48d8b7f25a7 100644 --- a/src/core/lib/channel/connected_channel.cc +++ b/src/core/lib/channel/connected_channel.cc @@ -26,6 +26,7 @@ #include #include +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/types/optional.h" @@ -224,7 +225,7 @@ static void connected_channel_destroy_call_elem( static grpc_error_handle connected_channel_init_channel_elem( grpc_channel_element* elem, grpc_channel_element_args* args) { channel_data* cd = static_cast(elem->channel_data); - GPR_ASSERT(args->is_last); + CHECK(args->is_last); cd->transport = args->channel_args.GetObject(); return absl::OkStatus(); } diff --git a/src/core/lib/channel/context.h b/src/core/lib/channel/context.h index ac2e1aeda49..ddcd01395a9 100644 --- a/src/core/lib/channel/context.h +++ b/src/core/lib/channel/context.h @@ -29,9 +29,12 @@ /// This enum represents the indexes into the array, where each index /// contains a different type of value. typedef enum { + /// grpc_call* associated with this context. + GRPC_CONTEXT_CALL = 0, + /// Value is either a \a grpc_client_security_context or a /// \a grpc_server_security_context. - GRPC_CONTEXT_SECURITY = 0, + GRPC_CONTEXT_SECURITY, /// Value is a \a census_context. GRPC_CONTEXT_TRACING, @@ -68,10 +71,35 @@ struct grpc_call_context_element { }; namespace grpc_core { +class Call; + // Bind the legacy context array into the new style structure // TODO(ctiller): remove as we migrate these contexts to the new system. template <> struct ContextType {}; + +// Also as a transition step allow exposing a GetContext that can peek into +// the legacy context array. +namespace promise_detail { +template +struct OldStyleContext; + +template <> +struct OldStyleContext { + static constexpr grpc_context_index kIndex = GRPC_CONTEXT_CALL; +}; + +template +class Context::kIndex)>> { + public: + static T* get() { + return static_cast( + GetContext()[OldStyleContext::kIndex] + .value); + } +}; + +} // namespace promise_detail } // namespace grpc_core #endif // GRPC_SRC_CORE_LIB_CHANNEL_CONTEXT_H diff --git a/src/core/lib/channel/metrics.cc b/src/core/lib/channel/metrics.cc index a28102f039b..d662f3275ad 100644 --- a/src/core/lib/channel/metrics.cc +++ b/src/core/lib/channel/metrics.cc @@ -16,6 +16,8 @@ #include +#include "absl/log/check.h" + #include #include "src/core/lib/gprpp/crash.h" @@ -46,7 +48,7 @@ GlobalInstrumentsRegistry::RegisterUInt64Counter( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kUInt64; descriptor.instrument_type = InstrumentType::kCounter; @@ -78,7 +80,7 @@ GlobalInstrumentsRegistry::RegisterDoubleCounter( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kDouble; descriptor.instrument_type = InstrumentType::kCounter; @@ -110,7 +112,7 @@ GlobalInstrumentsRegistry::RegisterUInt64Histogram( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kUInt64; descriptor.instrument_type = InstrumentType::kHistogram; @@ -142,7 +144,7 @@ GlobalInstrumentsRegistry::RegisterDoubleHistogram( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kDouble; descriptor.instrument_type = InstrumentType::kHistogram; @@ -174,7 +176,7 @@ GlobalInstrumentsRegistry::RegisterCallbackInt64Gauge( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kInt64; descriptor.instrument_type = InstrumentType::kCallbackGauge; @@ -206,7 +208,7 @@ GlobalInstrumentsRegistry::RegisterCallbackDoubleGauge( } } uint32_t index = instruments.size(); - GPR_ASSERT(index < std::numeric_limits::max()); + CHECK_LT(index, std::numeric_limits::max()); GlobalInstrumentDescriptor descriptor; descriptor.value_type = ValueType::kDouble; descriptor.instrument_type = InstrumentType::kCallbackGauge; diff --git a/src/core/lib/channel/promise_based_filter.cc b/src/core/lib/channel/promise_based_filter.cc index 9e47aacae55..da858ee8d4f 100644 --- a/src/core/lib/channel/promise_based_filter.cc +++ b/src/core/lib/channel/promise_based_filter.cc @@ -22,6 +22,7 @@ #include "absl/base/attributes.h" #include "absl/functional/function_ref.h" +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" @@ -180,7 +181,7 @@ BaseCallData::CapturedBatch::~CapturedBatch() { uintptr_t& refcnt = *RefCountField(batch_); if (refcnt == 0) return; // refcnt==0 ==> cancelled --refcnt; - GPR_ASSERT(refcnt != 0); + CHECK_NE(refcnt, 0u); } BaseCallData::CapturedBatch::CapturedBatch(const CapturedBatch& rhs) @@ -211,7 +212,7 @@ BaseCallData::CapturedBatch& BaseCallData::CapturedBatch::operator=( void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) { auto* batch = std::exchange(batch_, nullptr); - GPR_ASSERT(batch != nullptr); + CHECK_NE(batch, nullptr); uintptr_t& refcnt = *RefCountField(batch); if (refcnt == 0) { // refcnt==0 ==> cancelled @@ -228,7 +229,7 @@ void BaseCallData::CapturedBatch::ResumeWith(Flusher* releaser) { void BaseCallData::CapturedBatch::CompleteWith(Flusher* releaser) { auto* batch = std::exchange(batch_, nullptr); - GPR_ASSERT(batch != nullptr); + CHECK_NE(batch, nullptr); uintptr_t& refcnt = *RefCountField(batch); if (refcnt == 0) return; // refcnt==0 ==> cancelled if (--refcnt == 0) { @@ -239,7 +240,7 @@ void BaseCallData::CapturedBatch::CompleteWith(Flusher* releaser) { void BaseCallData::CapturedBatch::CancelWith(grpc_error_handle error, Flusher* releaser) { auto* batch = std::exchange(batch_, nullptr); - GPR_ASSERT(batch != nullptr); + CHECK_NE(batch, nullptr); uintptr_t& refcnt = *RefCountField(batch); if (refcnt == 0) { // refcnt==0 ==> cancelled @@ -369,7 +370,7 @@ void BaseCallData::SendMessage::GotPipe(T* pipe_end) { gpr_log(GPR_INFO, "%s SendMessage.GotPipe st=%s", base_->LogTag().c_str(), StateString(state_)); } - GPR_ASSERT(pipe_end != nullptr); + CHECK_NE(pipe_end, nullptr); switch (state_) { case State::kInitial: state_ = State::kIdle; @@ -518,7 +519,7 @@ void BaseCallData::SendMessage::WakeInsideCombiner(Flusher* flusher, } ABSL_FALLTHROUGH_INTENDED; case State::kPushedToPipe: { - GPR_ASSERT(push_.has_value()); + CHECK(push_.has_value()); auto r_push = (*push_)(); if (auto* p = r_push.value_if_ready()) { if (grpc_trace_channel.enabled()) { @@ -527,12 +528,12 @@ void BaseCallData::SendMessage::WakeInsideCombiner(Flusher* flusher, base_->LogTag().c_str(), *p ? "true" : "false"); } // We haven't pulled through yet, so this certainly shouldn't succeed. - GPR_ASSERT(!*p); + CHECK(!*p); state_ = State::kCancelled; batch_.CancelWith(absl::CancelledError(), flusher); break; } - GPR_ASSERT(next_.has_value()); + CHECK(next_.has_value()); auto r_next = (*next_)(); if (auto* p = r_next.value_if_ready()) { if (grpc_trace_channel.enabled()) { @@ -851,12 +852,12 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher, completed_status_, "recv_message"); break; } - GPR_ASSERT(state_ == State::kPushedToPipe || - state_ == State::kCompletedWhilePushedToPipe); + CHECK(state_ == State::kPushedToPipe || + state_ == State::kCompletedWhilePushedToPipe); ABSL_FALLTHROUGH_INTENDED; case State::kCompletedWhilePushedToPipe: case State::kPushedToPipe: { - GPR_ASSERT(push_.has_value()); + CHECK(push_.has_value()); auto r_push = (*push_)(); if (auto* p = r_push.value_if_ready()) { if (grpc_trace_channel.enabled()) { @@ -865,11 +866,11 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher, base_->LogTag().c_str(), *p ? "true" : "false"); } // We haven't pulled through yet, so this certainly shouldn't succeed. - GPR_ASSERT(!*p); + CHECK(!*p); state_ = State::kCancelled; break; } - GPR_ASSERT(next_.has_value()); + CHECK(next_.has_value()); auto r_next = (*next_)(); if (auto* p = r_next.value_if_ready()) { next_.reset(); @@ -907,7 +908,7 @@ void BaseCallData::ReceiveMessage::WakeInsideCombiner(Flusher* flusher, ABSL_FALLTHROUGH_INTENDED; case State::kCompletedWhilePulledFromPipe: case State::kPulledFromPipe: { - GPR_ASSERT(push_.has_value()); + CHECK(push_.has_value()); if ((*push_)().ready()) { if (grpc_trace_channel.enabled()) { gpr_log(GPR_INFO, @@ -1013,7 +1014,7 @@ class ClientCallData::PollContext { public: explicit PollContext(ClientCallData* self, Flusher* flusher) : self_(self), flusher_(flusher) { - GPR_ASSERT(self_->poll_ctx_ == nullptr); + CHECK_EQ(self_->poll_ctx_, nullptr); self_->poll_ctx_ = this; scoped_activity_.Init(self_); @@ -1024,12 +1025,12 @@ class ClientCallData::PollContext { PollContext& operator=(const PollContext&) = delete; void Run() { - GPR_DEBUG_ASSERT(HasContext()); + DCHECK(HasContext()); if (grpc_trace_channel.enabled()) { gpr_log(GPR_INFO, "%s ClientCallData.PollContext.Run %s", self_->LogTag().c_str(), self_->DebugString().c_str()); } - GPR_ASSERT(have_scoped_activity_); + CHECK(have_scoped_activity_); repoll_ = false; if (self_->send_message() != nullptr) { self_->send_message()->WakeInsideCombiner(flusher_, true); @@ -1064,10 +1065,8 @@ class ClientCallData::PollContext { case RecvInitialMetadata::kCompleteAndGotPipe: self_->recv_initial_metadata_->state = RecvInitialMetadata::kCompleteAndPushedToPipe; - GPR_ASSERT( - !self_->recv_initial_metadata_->metadata_push_.has_value()); - GPR_ASSERT( - !self_->recv_initial_metadata_->metadata_next_.has_value()); + CHECK(!self_->recv_initial_metadata_->metadata_push_.has_value()); + CHECK(!self_->recv_initial_metadata_->metadata_next_.has_value()); self_->recv_initial_metadata_->metadata_push_.emplace( self_->recv_initial_metadata_->server_initial_metadata_publisher ->Push(ServerMetadataHandle( @@ -1078,7 +1077,7 @@ class ClientCallData::PollContext { self_->server_initial_metadata_pipe()->receiver.Next()); ABSL_FALLTHROUGH_INTENDED; case RecvInitialMetadata::kCompleteAndPushedToPipe: { - GPR_ASSERT(self_->recv_initial_metadata_->metadata_next_.has_value()); + CHECK(self_->recv_initial_metadata_->metadata_next_.has_value()); Poll> p = (*self_->recv_initial_metadata_->metadata_next_)(); if (NextResult* nr = p.value_if_ready()) { @@ -1172,7 +1171,7 @@ class ClientCallData::PollContext { } } else { self_->cancelled_error_ = StatusFromMetadata(*md); - GPR_ASSERT(!self_->cancelled_error_.ok()); + CHECK(!self_->cancelled_error_.ok()); if (self_->recv_initial_metadata_ != nullptr) { switch (self_->recv_initial_metadata_->state) { case RecvInitialMetadata::kInitial: @@ -1210,7 +1209,7 @@ class ClientCallData::PollContext { self_->send_initial_metadata_batch_.CancelWith( self_->cancelled_error_, flusher_); } else { - GPR_ASSERT( + CHECK( self_->recv_trailing_state_ == RecvTrailingState::kInitial || self_->recv_trailing_state_ == RecvTrailingState::kForwarded); self_->call_combiner()->Cancel(self_->cancelled_error_); @@ -1314,7 +1313,7 @@ ClientCallData::ClientCallData(grpc_call_element* elem, ClientCallData::~ClientCallData() { ScopedActivity scoped_activity(this); - GPR_ASSERT(poll_ctx_ == nullptr); + CHECK_EQ(poll_ctx_, nullptr); if (recv_initial_metadata_ != nullptr) { recv_initial_metadata_->~RecvInitialMetadata(); } @@ -1328,7 +1327,7 @@ std::string ClientCallData::DebugTag() const { // Activity implementation. void ClientCallData::ForceImmediateRepoll(WakeupMask) { - GPR_ASSERT(poll_ctx_ != nullptr); + CHECK_NE(poll_ctx_, nullptr); poll_ctx_->Repoll(); } @@ -1399,10 +1398,9 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) { // If this is a cancel stream, cancel anything we have pending and propagate // the cancellation. if (batch->cancel_stream) { - GPR_ASSERT(!batch->send_initial_metadata && - !batch->send_trailing_metadata && !batch->send_message && - !batch->recv_initial_metadata && !batch->recv_message && - !batch->recv_trailing_metadata); + CHECK(!batch->send_initial_metadata && !batch->send_trailing_metadata && + !batch->send_message && !batch->recv_initial_metadata && + !batch->recv_message && !batch->recv_trailing_metadata); PollContext poll_ctx(this, &flusher); Cancel(batch->payload->cancel_stream.cancel_error, &flusher); poll_ctx.Run(); @@ -1473,12 +1471,12 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) { batch.CancelWith(cancelled_error_, &flusher); } else { // Otherwise, we should not have seen a send_initial_metadata op yet. - GPR_ASSERT(send_initial_state_ == SendInitialState::kInitial); + CHECK(send_initial_state_ == SendInitialState::kInitial); // Mark ourselves as queued. send_initial_state_ = SendInitialState::kQueued; if (batch->recv_trailing_metadata) { // If there's a recv_trailing_metadata op, we queue that too. - GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial); + CHECK(recv_trailing_state_ == RecvTrailingState::kInitial); recv_trailing_state_ = RecvTrailingState::kQueued; } // This is the queuing! @@ -1493,7 +1491,7 @@ void ClientCallData::StartBatch(grpc_transport_stream_op_batch* b) { if (recv_trailing_state_ == RecvTrailingState::kCancelled) { batch.CancelWith(cancelled_error_, &flusher); } else { - GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kInitial); + CHECK(recv_trailing_state_ == RecvTrailingState::kInitial); recv_trailing_state_ = RecvTrailingState::kForwarded; HookRecvTrailingMetadata(batch); } @@ -1571,7 +1569,7 @@ void ClientCallData::Cancel(grpc_error_handle error, Flusher* flusher) { // Begin running the promise - which will ultimately take some initial // metadata and return some trailing metadata. void ClientCallData::StartPromise(Flusher* flusher) { - GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued); + CHECK(send_initial_state_ == SendInitialState::kQueued); ChannelFilter* filter = promise_filter_detail::ChannelFilterFromElem(elem()); // Construct the promise. @@ -1684,8 +1682,8 @@ ArenaPromise ClientCallData::MakeNextPromise( gpr_log(GPR_INFO, "%s ClientCallData.MakeNextPromise %s", LogTag().c_str(), DebugString().c_str()); } - GPR_ASSERT(poll_ctx_ != nullptr); - GPR_ASSERT(send_initial_state_ == SendInitialState::kQueued); + CHECK_NE(poll_ctx_, nullptr); + CHECK(send_initial_state_ == SendInitialState::kQueued); send_initial_metadata_batch_->payload->send_initial_metadata .send_initial_metadata = call_args.client_initial_metadata.get(); if (recv_initial_metadata_ != nullptr) { @@ -1693,7 +1691,7 @@ ArenaPromise ClientCallData::MakeNextPromise( // It might be the one we passed in - in which case we know this filter // only wants to examine the metadata, or it might be a new instance, in // which case we know the filter wants to mutate. - GPR_ASSERT(call_args.server_initial_metadata != nullptr); + CHECK_NE(call_args.server_initial_metadata, nullptr); recv_initial_metadata_->server_initial_metadata_publisher = call_args.server_initial_metadata; switch (recv_initial_metadata_->state) { @@ -1722,17 +1720,17 @@ ArenaPromise ClientCallData::MakeNextPromise( recv_initial_metadata_->state))); // unreachable } } else { - GPR_ASSERT(call_args.server_initial_metadata == nullptr); + CHECK_EQ(call_args.server_initial_metadata, nullptr); } if (send_message() != nullptr) { send_message()->GotPipe(call_args.client_to_server_messages); } else { - GPR_ASSERT(call_args.client_to_server_messages == nullptr); + CHECK_EQ(call_args.client_to_server_messages, nullptr); } if (receive_message() != nullptr) { receive_message()->GotPipe(call_args.server_to_client_messages); } else { - GPR_ASSERT(call_args.server_to_client_messages == nullptr); + CHECK_EQ(call_args.server_to_client_messages, nullptr); } return ArenaPromise( [this]() { return PollTrailingMetadata(); }); @@ -1747,10 +1745,10 @@ Poll ClientCallData::PollTrailingMetadata() { gpr_log(GPR_INFO, "%s ClientCallData.PollTrailingMetadata %s", LogTag().c_str(), DebugString().c_str()); } - GPR_ASSERT(poll_ctx_ != nullptr); + CHECK_NE(poll_ctx_, nullptr); if (send_initial_state_ == SendInitialState::kQueued) { // First poll: pass the send_initial_metadata op down the stack. - GPR_ASSERT(send_initial_metadata_batch_.is_captured()); + CHECK(send_initial_metadata_batch_.is_captured()); send_initial_state_ = SendInitialState::kForwarded; if (recv_trailing_state_ == RecvTrailingState::kQueued) { // (and the recv_trailing_metadata op if it's part of the queuing) @@ -1820,7 +1818,7 @@ void ClientCallData::RecvTrailingMetadataReady(grpc_error_handle error) { SetStatusFromError(recv_trailing_metadata_, error); } // Record that we've got the callback. - GPR_ASSERT(recv_trailing_state_ == RecvTrailingState::kForwarded); + CHECK(recv_trailing_state_ == RecvTrailingState::kForwarded); recv_trailing_state_ = RecvTrailingState::kComplete; if (receive_message() != nullptr) { receive_message()->Done(*recv_trailing_metadata_, &flusher); @@ -1908,7 +1906,7 @@ class ServerCallData::PollContext { created_.line(), "; Old: ", self_->poll_ctx_->created_.file(), ":", self_->poll_ctx_->created_.line())); } - GPR_ASSERT(self_->poll_ctx_ == nullptr); + CHECK_EQ(self_->poll_ctx_, nullptr); self_->poll_ctx_ = this; scoped_activity_.Init(self_); have_scoped_activity_ = true; @@ -2016,7 +2014,7 @@ ServerCallData::~ServerCallData() { if (send_initial_metadata_ != nullptr) { send_initial_metadata_->~SendInitialMetadata(); } - GPR_ASSERT(poll_ctx_ == nullptr); + CHECK_EQ(poll_ctx_, nullptr); } std::string ServerCallData::DebugTag() const { @@ -2025,7 +2023,7 @@ std::string ServerCallData::DebugTag() const { // Activity implementation. void ServerCallData::ForceImmediateRepoll(WakeupMask) { - GPR_ASSERT(poll_ctx_ != nullptr); + CHECK_NE(poll_ctx_, nullptr); poll_ctx_->Repoll(); } @@ -2045,10 +2043,9 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) { // If this is a cancel stream, cancel anything we have pending and // propagate the cancellation. if (batch->cancel_stream) { - GPR_ASSERT(!batch->send_initial_metadata && - !batch->send_trailing_metadata && !batch->send_message && - !batch->recv_initial_metadata && !batch->recv_message && - !batch->recv_trailing_metadata); + CHECK(!batch->send_initial_metadata && !batch->send_trailing_metadata && + !batch->send_message && !batch->recv_initial_metadata && + !batch->recv_message && !batch->recv_trailing_metadata); PollContext poll_ctx(this, &flusher); Completed(batch->payload->cancel_stream.cancel_error, batch->payload->cancel_stream.tarpit, &flusher); @@ -2063,11 +2060,11 @@ void ServerCallData::StartBatch(grpc_transport_stream_op_batch* b) { // recv_initial_metadata: we hook the response of this so we can start the // promise at an appropriate time. if (batch->recv_initial_metadata) { - GPR_ASSERT(!batch->send_initial_metadata && - !batch->send_trailing_metadata && !batch->send_message && - !batch->recv_message && !batch->recv_trailing_metadata); + CHECK(!batch->send_initial_metadata && !batch->send_trailing_metadata && + !batch->send_message && !batch->recv_message && + !batch->recv_trailing_metadata); // Otherwise, we should not have seen a send_initial_metadata op yet. - GPR_ASSERT(recv_initial_state_ == RecvInitialState::kInitial); + CHECK(recv_initial_state_ == RecvInitialState::kInitial); // Hook the callback so we know when to start the promise. recv_initial_metadata_ = batch->payload->recv_initial_metadata.recv_initial_metadata; @@ -2249,14 +2246,13 @@ void ServerCallData::Completed(grpc_error_handle error, // - return a wrapper around PollTrailingMetadata as the promise. ArenaPromise ServerCallData::MakeNextPromise( CallArgs call_args) { - GPR_ASSERT(recv_initial_state_ == RecvInitialState::kComplete); - GPR_ASSERT(std::move(call_args.client_initial_metadata).get() == - recv_initial_metadata_); + CHECK(recv_initial_state_ == RecvInitialState::kComplete); + CHECK(std::move(call_args.client_initial_metadata).get() == + recv_initial_metadata_); forward_recv_initial_metadata_callback_ = true; if (send_initial_metadata_ != nullptr) { - GPR_ASSERT(send_initial_metadata_->server_initial_metadata_publisher == - nullptr); - GPR_ASSERT(call_args.server_initial_metadata != nullptr); + CHECK(send_initial_metadata_->server_initial_metadata_publisher == nullptr); + CHECK_NE(call_args.server_initial_metadata, nullptr); send_initial_metadata_->server_initial_metadata_publisher = call_args.server_initial_metadata; switch (send_initial_metadata_->state) { @@ -2279,17 +2275,17 @@ ArenaPromise ServerCallData::MakeNextPromise( break; } } else { - GPR_ASSERT(call_args.server_initial_metadata == nullptr); + CHECK_EQ(call_args.server_initial_metadata, nullptr); } if (send_message() != nullptr) { send_message()->GotPipe(call_args.server_to_client_messages); } else { - GPR_ASSERT(call_args.server_to_client_messages == nullptr); + CHECK_EQ(call_args.server_to_client_messages, nullptr); } if (receive_message() != nullptr) { receive_message()->GotPipe(call_args.client_to_server_messages); } else { - GPR_ASSERT(call_args.client_to_server_messages == nullptr); + CHECK_EQ(call_args.client_to_server_messages, nullptr); } return ArenaPromise( [this]() { return PollTrailingMetadata(); }); @@ -2354,7 +2350,7 @@ void ServerCallData::RecvInitialMetadataReady(grpc_error_handle error) { gpr_log(GPR_INFO, "%s: RecvInitialMetadataReady %s", LogTag().c_str(), error.ToString().c_str()); } - GPR_ASSERT(recv_initial_state_ == RecvInitialState::kForwarded); + CHECK(recv_initial_state_ == RecvInitialState::kForwarded); // If there was an error we just propagate that through if (!error.ok()) { recv_initial_state_ = RecvInitialState::kResponded; @@ -2425,8 +2421,8 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) { SendInitialMetadata::kQueuedAndGotPipe) { send_initial_metadata_->state = SendInitialMetadata::kQueuedAndPushedToPipe; - GPR_ASSERT(!send_initial_metadata_->metadata_push_.has_value()); - GPR_ASSERT(!send_initial_metadata_->metadata_next_.has_value()); + CHECK(!send_initial_metadata_->metadata_push_.has_value()); + CHECK(!send_initial_metadata_->metadata_next_.has_value()); send_initial_metadata_->metadata_push_.emplace( send_initial_metadata_->server_initial_metadata_publisher->Push( ServerMetadataHandle( @@ -2508,7 +2504,7 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) { if (send_initial_metadata_ != nullptr && send_initial_metadata_->state == SendInitialMetadata::kQueuedAndPushedToPipe) { - GPR_ASSERT(send_initial_metadata_->metadata_next_.has_value()); + CHECK(send_initial_metadata_->metadata_next_.has_value()); auto p = (*send_initial_metadata_->metadata_next_)(); if (grpc_trace_channel.enabled()) { gpr_log(GPR_INFO, @@ -2557,7 +2553,7 @@ void ServerCallData::WakeInsideCombiner(Flusher* flusher) { StateString(send_trailing_state_))); // unreachable break; case SendTrailingState::kInitial: { - GPR_ASSERT(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK); + CHECK(*md->get_pointer(GrpcStatusMetadata()) != GRPC_STATUS_OK); Completed(StatusFromMetadata(*md), md->get(GrpcTarPit()).has_value(), flusher); } break; diff --git a/src/core/lib/channel/promise_based_filter.h b/src/core/lib/channel/promise_based_filter.h index 32af82253f0..c0735c45e61 100644 --- a/src/core/lib/channel/promise_based_filter.h +++ b/src/core/lib/channel/promise_based_filter.h @@ -31,6 +31,7 @@ #include "absl/container/inlined_vector.h" #include "absl/functional/function_ref.h" +#include "absl/log/check.h" #include "absl/meta/type_traits.h" #include "absl/status/status.h" #include "absl/strings/string_view.h" @@ -352,7 +353,7 @@ auto MapResult(const NoInterceptor*, Promise x, void*) { template auto MapResult(absl::Status (Derived::Call::*fn)(ServerMetadata&), Promise x, FilterCallData* call_data) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerTrailingMetadata); + DCHECK(fn == &Derived::Call::OnServerTrailingMetadata); return Map(std::move(x), [call_data](ServerMetadataHandle md) { auto status = call_data->call.OnServerTrailingMetadata(*md); if (!status.ok()) return ServerMetadataFromStatus(status); @@ -363,7 +364,7 @@ auto MapResult(absl::Status (Derived::Call::*fn)(ServerMetadata&), Promise x, template auto MapResult(void (Derived::Call::*fn)(ServerMetadata&), Promise x, FilterCallData* call_data) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerTrailingMetadata); + DCHECK(fn == &Derived::Call::OnServerTrailingMetadata); return Map(std::move(x), [call_data](ServerMetadataHandle md) { call_data->call.OnServerTrailingMetadata(*md); return md; @@ -373,7 +374,7 @@ auto MapResult(void (Derived::Call::*fn)(ServerMetadata&), Promise x, template auto MapResult(void (Derived::Call::*fn)(ServerMetadata&, Derived*), Promise x, FilterCallData* call_data) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerTrailingMetadata); + DCHECK(fn == &Derived::Call::OnServerTrailingMetadata); return Map(std::move(x), [call_data](ServerMetadataHandle md) { call_data->call.OnServerTrailingMetadata(*md, call_data->channel); return md; @@ -486,7 +487,7 @@ template auto RunCall(Interceptor interceptor, CallArgs call_args, NextPromiseFactory next_promise_factory, FilterCallData* call_data) { - GPR_DEBUG_ASSERT(interceptor == &Derived::Call::OnClientInitialMetadata); + DCHECK(interceptor == &Derived::Call::OnClientInitialMetadata); return RunCallImpl::Run( std::move(call_args), std::move(next_promise_factory), call_data); } @@ -498,7 +499,7 @@ template inline void InterceptClientToServerMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_args.client_to_server_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto return_md = call_data->call.OnClientToServerMessage(*msg); @@ -513,7 +514,7 @@ template inline void InterceptClientToServerMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_args.client_to_server_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto return_md = @@ -529,7 +530,7 @@ template inline void InterceptClientToServerMessage( MessageHandle (Derived::Call::*fn)(MessageHandle, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_args.client_to_server_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { return call_data->call.OnClientToServerMessage(std::move(msg), @@ -541,7 +542,7 @@ template inline void InterceptClientToServerMessage( absl::StatusOr (Derived::Call::*fn)(MessageHandle, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_args.client_to_server_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto r = call_data->call.OnClientToServerMessage(std::move(msg), @@ -560,7 +561,7 @@ template inline void InterceptClientToServerMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_spine->client_to_server_messages().receiver.InterceptAndMap( [call, call_spine](MessageHandle msg) -> absl::optional { auto return_md = call->OnClientToServerMessage(*msg); @@ -575,7 +576,7 @@ inline void InterceptClientToServerMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_spine->client_to_server_messages().receiver.InterceptAndMap( [call, call_spine, channel](MessageHandle msg) -> absl::optional { @@ -591,7 +592,7 @@ inline void InterceptClientToServerMessage( MessageHandle (Derived::Call::*fn)(MessageHandle, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_spine->client_to_server_messages().receiver.InterceptAndMap( [call, channel](MessageHandle msg) { return call->OnClientToServerMessage(std::move(msg), channel); @@ -603,7 +604,7 @@ inline void InterceptClientToServerMessage( absl::StatusOr (Derived::Call::*fn)(MessageHandle, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientToServerMessage); + DCHECK(fn == &Derived::Call::OnClientToServerMessage); call_spine->client_to_server_messages().receiver.InterceptAndMap( [call, call_spine, channel](MessageHandle msg) -> absl::optional { @@ -622,7 +623,7 @@ template inline void InterceptClientInitialMetadata( void (Derived::Call::*fn)(ClientMetadata& md), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call](ClientMetadataHandle md) { call->OnClientInitialMetadata(*md); @@ -635,7 +636,7 @@ inline void InterceptClientInitialMetadata( void (Derived::Call::*fn)(ClientMetadata& md, Derived* channel), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call, channel](ClientMetadataHandle md) { call->OnClientInitialMetadata(*md, channel); @@ -647,7 +648,7 @@ template inline void InterceptClientInitialMetadata( ServerMetadataHandle (Derived::Call::*fn)(ClientMetadata& md), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call_spine, call](ClientMetadataHandle md) -> absl::optional { @@ -664,7 +665,7 @@ inline void InterceptClientInitialMetadata( Derived* channel), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call_spine, call, channel]( ClientMetadataHandle md) -> absl::optional { @@ -679,7 +680,7 @@ template inline void InterceptClientInitialMetadata( absl::Status (Derived::Call::*fn)(ClientMetadata& md), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call_spine, call](ClientMetadataHandle md) -> absl::optional { @@ -696,7 +697,7 @@ inline void InterceptClientInitialMetadata( absl::Status (Derived::Call::*fn)(ClientMetadata& md, Derived* channel), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnClientInitialMetadata); + DCHECK(fn == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call_spine, call, channel]( ClientMetadataHandle md) -> absl::optional { @@ -717,7 +718,7 @@ InterceptClientInitialMetadata(Promise (Derived::Call::*promise_factory)( ClientMetadata& md, Derived* channel), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(promise_factory == &Derived::Call::OnClientInitialMetadata); + DCHECK(promise_factory == &Derived::Call::OnClientInitialMetadata); call_spine->client_initial_metadata().receiver.InterceptAndMap( [call, call_spine, channel](ClientMetadataHandle md) { ClientMetadata& md_ref = *md; @@ -741,7 +742,7 @@ template inline void InterceptServerInitialMetadata( void (Derived::Call::*fn)(ServerMetadata&), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_args.server_initial_metadata->InterceptAndMap( [call_data](ServerMetadataHandle md) { call_data->call.OnServerInitialMetadata(*md); @@ -753,7 +754,7 @@ template inline void InterceptServerInitialMetadata( absl::Status (Derived::Call::*fn)(ServerMetadata&), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_args.server_initial_metadata->InterceptAndMap( [call_data]( ServerMetadataHandle md) -> absl::optional { @@ -770,7 +771,7 @@ template inline void InterceptServerInitialMetadata( void (Derived::Call::*fn)(ServerMetadata&, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_args.server_initial_metadata->InterceptAndMap( [call_data](ServerMetadataHandle md) { call_data->call.OnServerInitialMetadata(*md, call_data->channel); @@ -782,7 +783,7 @@ template inline void InterceptServerInitialMetadata( absl::Status (Derived::Call::*fn)(ServerMetadata&, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_args.server_initial_metadata->InterceptAndMap( [call_data]( ServerMetadataHandle md) -> absl::optional { @@ -803,7 +804,7 @@ template inline void InterceptServerInitialMetadata( void (Derived::Call::*fn)(ServerMetadata&), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_spine->server_initial_metadata().sender.InterceptAndMap( [call](ServerMetadataHandle md) { call->OnServerInitialMetadata(*md); @@ -815,7 +816,7 @@ template inline void InterceptServerInitialMetadata( absl::Status (Derived::Call::*fn)(ServerMetadata&), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_spine->server_initial_metadata().sender.InterceptAndMap( [call, call_spine]( ServerMetadataHandle md) -> absl::optional { @@ -832,7 +833,7 @@ inline void InterceptServerInitialMetadata( void (Derived::Call::*fn)(ServerMetadata&, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_spine->server_initial_metadata().sender.InterceptAndMap( [call, channel](ServerMetadataHandle md) { call->OnServerInitialMetadata(*md, channel); @@ -845,7 +846,7 @@ inline void InterceptServerInitialMetadata( absl::Status (Derived::Call::*fn)(ServerMetadata&, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerInitialMetadata); + DCHECK(fn == &Derived::Call::OnServerInitialMetadata); call_spine->server_initial_metadata().sender.InterceptAndMap( [call, call_spine, channel]( ServerMetadataHandle md) -> absl::optional { @@ -864,7 +865,7 @@ template inline void InterceptServerToClientMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_args.server_to_client_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto return_md = call_data->call.OnServerToClientMessage(*msg); @@ -879,7 +880,7 @@ template inline void InterceptServerToClientMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_args.server_to_client_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto return_md = @@ -895,7 +896,7 @@ template inline void InterceptServerToClientMessage( MessageHandle (Derived::Call::*fn)(MessageHandle, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_args.server_to_client_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { return call_data->call.OnServerToClientMessage(std::move(msg), @@ -907,7 +908,7 @@ template inline void InterceptServerToClientMessage( absl::StatusOr (Derived::Call::*fn)(MessageHandle, Derived*), FilterCallData* call_data, const CallArgs& call_args) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_args.server_to_client_messages->InterceptAndMap( [call_data](MessageHandle msg) -> absl::optional { auto r = call_data->call.OnServerToClientMessage(std::move(msg), @@ -926,7 +927,7 @@ template inline void InterceptServerToClientMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&), typename Derived::Call* call, Derived*, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_spine->server_to_client_messages().sender.InterceptAndMap( [call, call_spine](MessageHandle msg) -> absl::optional { auto return_md = call->OnServerToClientMessage(*msg); @@ -941,7 +942,7 @@ inline void InterceptServerToClientMessage( ServerMetadataHandle (Derived::Call::*fn)(const Message&, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_spine->server_to_client_messages().sender.InterceptAndMap( [call, call_spine, channel](MessageHandle msg) -> absl::optional { @@ -957,7 +958,7 @@ inline void InterceptServerToClientMessage( MessageHandle (Derived::Call::*fn)(MessageHandle, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_spine->server_to_client_messages().sender.InterceptAndMap( [call, channel](MessageHandle msg) { return call->OnServerToClientMessage(std::move(msg), channel); @@ -969,7 +970,7 @@ inline void InterceptServerToClientMessage( absl::StatusOr (Derived::Call::*fn)(MessageHandle, Derived*), typename Derived::Call* call, Derived* channel, PipeBasedCallSpine* call_spine) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnServerToClientMessage); + DCHECK(fn == &Derived::Call::OnServerToClientMessage); call_spine->server_to_client_messages().sender.InterceptAndMap( [call, call_spine, channel](MessageHandle msg) -> absl::optional { @@ -1012,7 +1013,7 @@ inline void InterceptFinalize(const NoInterceptor*, void*, void*) {} template inline void InterceptFinalize(void (Call::*fn)(const grpc_call_final_info*), void*, Call* call) { - GPR_DEBUG_ASSERT(fn == &Call::OnFinalize); + DCHECK(fn == &Call::OnFinalize); GetContext()->Add( [call](const grpc_call_final_info* final_info) { call->OnFinalize(final_info); @@ -1023,7 +1024,7 @@ template inline void InterceptFinalize( void (Derived::Call::*fn)(const grpc_call_final_info*, Derived*), Derived* channel, typename Derived::Call* call) { - GPR_DEBUG_ASSERT(fn == &Derived::Call::OnFinalize); + DCHECK(fn == &Derived::Call::OnFinalize); GetContext()->Add( [call, channel](const grpc_call_final_info* final_info) { call->OnFinalize(final_info, channel); @@ -1212,8 +1213,7 @@ class BaseCallData : public Activity, private Wakeable { ~BaseCallData() override; void set_pollent(grpc_polling_entity* pollent) { - GPR_ASSERT(nullptr == - pollent_.exchange(pollent, std::memory_order_release)); + CHECK(nullptr == pollent_.exchange(pollent, std::memory_order_release)); } // Activity implementation (partial). @@ -1259,7 +1259,7 @@ class BaseCallData : public Activity, private Wakeable { ~Flusher(); void Resume(grpc_transport_stream_op_batch* batch) { - GPR_ASSERT(!call_->is_last()); + CHECK(!call_->is_last()); if (batch->HasOp()) { release_.push_back(batch); } else if (batch->on_complete != nullptr) { @@ -1338,7 +1338,7 @@ class BaseCallData : public Activity, private Wakeable { PipeSender* original_sender() override { abort(); } void GotPipe(PipeReceiver* receiver) override { - GPR_ASSERT(receiver_ == nullptr); + CHECK_EQ(receiver_, nullptr); receiver_ = receiver; } @@ -1346,7 +1346,7 @@ class BaseCallData : public Activity, private Wakeable { PipeSender* Push() override { return &pipe_.sender; } PipeReceiver* Pull() override { - GPR_ASSERT(receiver_ != nullptr); + CHECK_NE(receiver_, nullptr); return receiver_; } @@ -1367,12 +1367,12 @@ class BaseCallData : public Activity, private Wakeable { void GotPipe(PipeReceiver*) override { abort(); } void GotPipe(PipeSender* sender) override { - GPR_ASSERT(sender_ == nullptr); + CHECK_EQ(sender_, nullptr); sender_ = sender; } PipeSender* Push() override { - GPR_ASSERT(sender_ != nullptr); + CHECK_NE(sender_, nullptr); return sender_; } PipeReceiver* Pull() override { return &pipe_.receiver; } @@ -1890,7 +1890,7 @@ struct CallDataFilterWithFlagsMethods { if ((kFlags & kFilterIsLast) != 0) { ExecCtx::Run(DEBUG_LOCATION, then_schedule_closure, absl::OkStatus()); } else { - GPR_ASSERT(then_schedule_closure == nullptr); + CHECK_EQ(then_schedule_closure, nullptr); } } }; @@ -1927,7 +1927,7 @@ template struct ChannelFilterWithFlagsMethods { static absl::Status InitChannelElem(grpc_channel_element* elem, grpc_channel_element_args* args) { - GPR_ASSERT(args->is_last == ((kFlags & kFilterIsLast) != 0)); + CHECK(args->is_last == ((kFlags & kFilterIsLast) != 0)); auto status = F::Create(args->channel_args, ChannelFilter::Args(args->channel_stack, elem)); if (!status.ok()) { diff --git a/src/core/lib/compression/compression_internal.cc b/src/core/lib/compression/compression_internal.cc index e1b13a2f1ff..6a2883f4883 100644 --- a/src/core/lib/compression/compression_internal.cc +++ b/src/core/lib/compression/compression_internal.cc @@ -23,6 +23,7 @@ #include #include "absl/container/inlined_vector.h" +#include "absl/log/check.h" #include "absl/strings/ascii.h" #include "absl/strings/str_format.h" #include "absl/strings/str_split.h" @@ -120,7 +121,7 @@ CompressionAlgorithmSet::CompressionAlgorithmForLevel( return GRPC_COMPRESS_NONE; } - GPR_ASSERT(level > 0); + CHECK_GT(level, 0); // Establish a "ranking" or compression algorithms in increasing order of // compression. diff --git a/src/core/lib/compression/message_compress.cc b/src/core/lib/compression/message_compress.cc index 59b5d9eee6d..131f89eb64f 100644 --- a/src/core/lib/compression/message_compress.cc +++ b/src/core/lib/compression/message_compress.cc @@ -23,6 +23,8 @@ #include #include +#include "absl/log/check.h" + #include #include #include @@ -41,20 +43,20 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, grpc_slice outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE); const uInt uint_max = ~uInt{0}; - GPR_ASSERT(GRPC_SLICE_LENGTH(outbuf) <= uint_max); + CHECK(GRPC_SLICE_LENGTH(outbuf) <= uint_max); zs->avail_out = static_cast GRPC_SLICE_LENGTH(outbuf); zs->next_out = GRPC_SLICE_START_PTR(outbuf); flush = Z_NO_FLUSH; for (i = 0; i < input->count; i++) { if (i == input->count - 1) flush = Z_FINISH; - GPR_ASSERT(GRPC_SLICE_LENGTH(input->slices[i]) <= uint_max); + CHECK(GRPC_SLICE_LENGTH(input->slices[i]) <= uint_max); zs->avail_in = static_cast GRPC_SLICE_LENGTH(input->slices[i]); zs->next_in = GRPC_SLICE_START_PTR(input->slices[i]); do { if (zs->avail_out == 0) { grpc_slice_buffer_add_indexed(output, outbuf); outbuf = GRPC_SLICE_MALLOC(OUTPUT_BLOCK_SIZE); - GPR_ASSERT(GRPC_SLICE_LENGTH(outbuf) <= uint_max); + CHECK(GRPC_SLICE_LENGTH(outbuf) <= uint_max); zs->avail_out = static_cast GRPC_SLICE_LENGTH(outbuf); zs->next_out = GRPC_SLICE_START_PTR(outbuf); } @@ -74,7 +76,7 @@ static int zlib_body(z_stream* zs, grpc_slice_buffer* input, goto error; } - GPR_ASSERT(outbuf.refcount); + CHECK(outbuf.refcount); outbuf.data.refcounted.length -= zs->avail_out; grpc_slice_buffer_add_indexed(output, outbuf); @@ -104,7 +106,7 @@ static int zlib_compress(grpc_slice_buffer* input, grpc_slice_buffer* output, zs.zfree = zfree_gpr; r = deflateInit2(&zs, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 15 | (gzip ? 16 : 0), 8, Z_DEFAULT_STRATEGY); - GPR_ASSERT(r == Z_OK); + CHECK(r == Z_OK); r = zlib_body(&zs, input, output, deflate) && output->length < input->length; if (!r) { for (i = count_before; i < output->count; i++) { @@ -128,7 +130,7 @@ static int zlib_decompress(grpc_slice_buffer* input, grpc_slice_buffer* output, zs.zalloc = zalloc_gpr; zs.zfree = zfree_gpr; r = inflateInit2(&zs, 15 | (gzip ? 16 : 0)); - GPR_ASSERT(r == Z_OK); + CHECK(r == Z_OK); r = zlib_body(&zs, input, output, inflate); if (!r) { for (i = count_before; i < output->count; i++) { diff --git a/src/core/lib/config/core_configuration.cc b/src/core/lib/config/core_configuration.cc index 84ca3d0da25..7baa803bb47 100644 --- a/src/core/lib/config/core_configuration.cc +++ b/src/core/lib/config/core_configuration.cc @@ -18,6 +18,8 @@ #include #include +#include "absl/log/check.h" + #include #include @@ -49,18 +51,18 @@ CoreConfiguration::CoreConfiguration(Builder* builder) void CoreConfiguration::RegisterBuilder( absl::AnyInvocable builder) { - GPR_ASSERT(config_.load(std::memory_order_relaxed) == nullptr && - "CoreConfiguration was already instantiated before builder " - "registration was completed"); + CHECK(config_.load(std::memory_order_relaxed) == nullptr) + << "CoreConfiguration was already instantiated before builder " + "registration was completed"; RegisteredBuilder* n = new RegisteredBuilder(); n->builder = std::move(builder); n->next = builders_.load(std::memory_order_relaxed); while (!builders_.compare_exchange_weak(n->next, n, std::memory_order_acq_rel, std::memory_order_relaxed)) { } - GPR_ASSERT(config_.load(std::memory_order_relaxed) == nullptr && - "CoreConfiguration was already instantiated before builder " - "registration was completed"); + CHECK(config_.load(std::memory_order_relaxed) == nullptr) + << "CoreConfiguration was already instantiated before builder " + "registration was completed"; } const CoreConfiguration& CoreConfiguration::BuildNewAndMaybeSet() { diff --git a/src/core/lib/config/core_configuration.h b/src/core/lib/config/core_configuration.h index 4549c87c01c..0d8b268cdda 100644 --- a/src/core/lib/config/core_configuration.h +++ b/src/core/lib/config/core_configuration.h @@ -18,6 +18,7 @@ #include #include "absl/functional/any_invocable.h" +#include "absl/log/check.h" #include #include @@ -129,10 +130,10 @@ class GRPC_DLL CoreConfiguration { ~WithSubstituteBuilder() { // Reset and restore. Reset(); - GPR_ASSERT(CoreConfiguration::config_.exchange( - config_restore_, std::memory_order_acquire) == nullptr); - GPR_ASSERT(CoreConfiguration::builders_.exchange( - builders_restore_, std::memory_order_acquire) == nullptr); + CHECK(CoreConfiguration::config_.exchange( + config_restore_, std::memory_order_acquire) == nullptr); + CHECK(CoreConfiguration::builders_.exchange( + builders_restore_, std::memory_order_acquire) == nullptr); } private: diff --git a/src/core/lib/config/load_config.cc b/src/core/lib/config/load_config.cc index b865beda8f4..a961a24a81d 100644 --- a/src/core/lib/config/load_config.cc +++ b/src/core/lib/config/load_config.cc @@ -17,6 +17,7 @@ #include #include "absl/flags/marshalling.h" +#include "absl/log/check.h" #include "absl/strings/numbers.h" #include "absl/strings/str_join.h" #include "absl/types/optional.h" @@ -36,7 +37,7 @@ absl::optional LoadEnv(absl::string_view environment_variable) { std::string LoadConfigFromEnv(absl::string_view environment_variable, const char* default_value) { - GPR_ASSERT_INTERNAL(!environment_variable.empty()); + CHECK(!environment_variable.empty()); return LoadEnv(environment_variable).value_or(default_value); } diff --git a/src/core/lib/debug/event_log.cc b/src/core/lib/debug/event_log.cc index 1c95bafb2d4..76edac8584b 100644 --- a/src/core/lib/debug/event_log.cc +++ b/src/core/lib/debug/event_log.cc @@ -17,6 +17,7 @@ #include #include +#include "absl/log/check.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" @@ -28,7 +29,7 @@ namespace grpc_core { std::atomic EventLog::g_instance_{nullptr}; EventLog::~EventLog() { - GPR_ASSERT(g_instance_.load(std::memory_order_acquire) != this); + CHECK(g_instance_.load(std::memory_order_acquire) != this); } void EventLog::BeginCollection() { diff --git a/src/core/lib/experiments/config.cc b/src/core/lib/experiments/config.cc index 15537dbb198..ca0ab151429 100644 --- a/src/core/lib/experiments/config.cc +++ b/src/core/lib/experiments/config.cc @@ -23,6 +23,7 @@ #include #include "absl/functional/any_invocable.h" +#include "absl/log/check.h" #include "absl/strings/str_join.h" #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" @@ -146,7 +147,7 @@ GPR_ATTRIBUTE_NOINLINE Experiments LoadExperimentsFromConfigVariableInner() { j++) { // Require that we can check dependent requirements with a linear sweep // (implies the experiments generator must DAG sort the experiments) - GPR_ASSERT(g_experiment_metadata[i].required_experiments[j] < i); + CHECK(g_experiment_metadata[i].required_experiments[j] < i); if (!experiments .enabled[g_experiment_metadata[i].required_experiments[j]]) { experiments.enabled[i] = false; @@ -244,11 +245,11 @@ void PrintExperimentsList() { } void ForceEnableExperiment(absl::string_view experiment, bool enable) { - GPR_ASSERT(Loaded()->load(std::memory_order_relaxed) == false); + CHECK(Loaded()->load(std::memory_order_relaxed) == false); for (size_t i = 0; i < kNumExperiments; i++) { if (g_experiment_metadata[i].name != experiment) continue; if (ForcedExperiments()[i].forced) { - GPR_ASSERT(ForcedExperiments()[i].value == enable); + CHECK(ForcedExperiments()[i].value == enable); } else { ForcedExperiments()[i].forced = true; ForcedExperiments()[i].value = enable; diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 9be9619ff3c..0712c8afd85 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -177,7 +177,7 @@ (ie when all filters in a stack are promise based) expiry: 2024/06/14 owner: ctiller@google.com - test_tags: ["core_end2end_test", "cpp_end2end_test", "xds_end2end_test", "logging_test"] + test_tags: ["core_end2end_test", "logging_test"] - name: rstpit description: On RST_STREAM on a server, reduce MAX_CONCURRENT_STREAMS for a short duration diff --git a/src/core/lib/http/httpcli.cc b/src/core/lib/http/httpcli.cc index 68722e78f78..ee2a5ad528d 100644 --- a/src/core/lib/http/httpcli.cc +++ b/src/core/lib/http/httpcli.cc @@ -24,6 +24,7 @@ #include #include "absl/functional/bind_front.h" +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/strings/str_format.h" @@ -183,7 +184,7 @@ HttpRequest::HttpRequest( GRPC_CLOSURE_INIT(&continue_done_write_after_schedule_on_exec_ctx_, ContinueDoneWriteAfterScheduleOnExecCtx, this, grpc_schedule_on_exec_ctx); - GPR_ASSERT(pollent); + CHECK(pollent); grpc_polling_entity_add_to_pollset_set(pollent, pollset_set_); } @@ -216,7 +217,7 @@ void HttpRequest::Start() { void HttpRequest::Orphan() { { MutexLock lock(&mu_); - GPR_ASSERT(!cancelled_); + CHECK(!cancelled_); cancelled_ = true; // cancel potentially pending DNS resolution. if (dns_request_handle_.has_value() && diff --git a/src/core/lib/http/parser.cc b/src/core/lib/http/parser.cc index 4702fa72917..aad7963f1d7 100644 --- a/src/core/lib/http/parser.cc +++ b/src/core/lib/http/parser.cc @@ -22,6 +22,7 @@ #include +#include "absl/log/check.h" #include "absl/status/status.h" #include @@ -177,7 +178,7 @@ static grpc_error_handle add_header(grpc_http_parser* parser) { grpc_http_header hdr = {nullptr, nullptr}; grpc_error_handle error; - GPR_ASSERT(cur != end); + CHECK(cur != end); if (*cur == ' ' || *cur == '\t') { error = GRPC_ERROR_CREATE("Continued header lines not supported yet"); @@ -191,14 +192,14 @@ static grpc_error_handle add_header(grpc_http_parser* parser) { error = GRPC_ERROR_CREATE("Didn't find ':' in header string"); goto done; } - GPR_ASSERT(cur >= beg); + CHECK(cur >= beg); hdr.key = buf2str(beg, static_cast(cur - beg)); cur++; // skip : while (cur != end && (*cur == ' ' || *cur == '\t')) { cur++; } - GPR_ASSERT((size_t)(end - cur) >= parser->cur_line_end_length); + CHECK((size_t)(end - cur) >= parser->cur_line_end_length); size = static_cast(end - cur) - parser->cur_line_end_length; if ((size != 0) && (cur[size - 1] == '\r')) { size--; diff --git a/src/core/lib/json/json_reader.cc b/src/core/lib/json/json_reader.cc index 8944c4219cb..ae249b3824c 100644 --- a/src/core/lib/json/json_reader.cc +++ b/src/core/lib/json/json_reader.cc @@ -24,6 +24,7 @@ #include #include "absl/base/attributes.h" +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -279,14 +280,14 @@ bool JsonReader::StartContainer(Json::Type type) { if (type == Json::Type::kObject) { scope.data = Json::Object(); } else { - GPR_ASSERT(type == Json::Type::kArray); + CHECK(type == Json::Type::kArray); scope.data = Json::Array(); } return true; } void JsonReader::EndContainer() { - GPR_ASSERT(!stack_.empty()); + CHECK(!stack_.empty()); Scope scope = std::move(stack_.back()); stack_.pop_back(); key_ = std::move(scope.parent_object_key); diff --git a/src/core/lib/resource_quota/connection_quota.cc b/src/core/lib/resource_quota/connection_quota.cc index 74c8514d159..ab07f5e21b3 100644 --- a/src/core/lib/resource_quota/connection_quota.cc +++ b/src/core/lib/resource_quota/connection_quota.cc @@ -17,6 +17,8 @@ #include #include +#include "absl/log/check.h" + #include #include @@ -26,10 +28,9 @@ ConnectionQuota::ConnectionQuota() = default; void ConnectionQuota::SetMaxIncomingConnections(int max_incoming_connections) { // The maximum can only be configured once. - GPR_ASSERT(max_incoming_connections < INT_MAX); - GPR_ASSERT(max_incoming_connections_.exchange(max_incoming_connections, - std::memory_order_release) == - INT_MAX); + CHECK_LT(max_incoming_connections, INT_MAX); + CHECK(max_incoming_connections_.exchange( + max_incoming_connections, std::memory_order_release) == INT_MAX); } // Returns true if the incoming connection is allowed to be accepted on the @@ -62,9 +63,8 @@ void ConnectionQuota::ReleaseConnections(int num_connections) { if (max_incoming_connections_.load(std::memory_order_relaxed) == INT_MAX) { return; } - GPR_ASSERT(active_incoming_connections_.fetch_sub( - num_connections, std::memory_order_acq_rel) >= - num_connections); + CHECK(active_incoming_connections_.fetch_sub( + num_connections, std::memory_order_acq_rel) >= num_connections); } } // namespace grpc_core diff --git a/src/core/lib/resource_quota/memory_quota.cc b/src/core/lib/resource_quota/memory_quota.cc index 929df9068a5..d6240f4e1d9 100644 --- a/src/core/lib/resource_quota/memory_quota.cc +++ b/src/core/lib/resource_quota/memory_quota.cc @@ -25,6 +25,7 @@ #include #include +#include "absl/log/check.h" #include "absl/status/status.h" #include "absl/strings/str_cat.h" @@ -252,9 +253,9 @@ GrpcMemoryAllocatorImpl::GrpcMemoryAllocatorImpl( } GrpcMemoryAllocatorImpl::~GrpcMemoryAllocatorImpl() { - GPR_ASSERT(free_bytes_.load(std::memory_order_acquire) + - sizeof(GrpcMemoryAllocatorImpl) == - taken_bytes_.load(std::memory_order_relaxed)); + CHECK(free_bytes_.load(std::memory_order_acquire) + + sizeof(GrpcMemoryAllocatorImpl) == + taken_bytes_.load(std::memory_order_relaxed)); memory_quota_->Return(taken_bytes_.load(std::memory_order_relaxed)); } @@ -265,7 +266,7 @@ void GrpcMemoryAllocatorImpl::Shutdown() { reclamation_handles[kNumReclamationPasses]; { MutexLock lock(&reclaimer_mu_); - GPR_ASSERT(!shutdown_); + CHECK(!shutdown_); shutdown_ = true; memory_quota = memory_quota_; for (size_t i = 0; i < kNumReclamationPasses; i++) { @@ -277,8 +278,8 @@ void GrpcMemoryAllocatorImpl::Shutdown() { size_t GrpcMemoryAllocatorImpl::Reserve(MemoryRequest request) { // Validate request - performed here so we don't bloat the generated code with // inlined asserts. - GPR_ASSERT(request.min() <= request.max()); - GPR_ASSERT(request.max() <= MemoryRequest::max_allowed_size()); + CHECK(request.min() <= request.max()); + CHECK(request.max() <= MemoryRequest::max_allowed_size()); size_t old_free = free_bytes_.load(std::memory_order_relaxed); while (true) { @@ -357,7 +358,7 @@ void GrpcMemoryAllocatorImpl::MaybeDonateBack() { if (GRPC_TRACE_FLAG_ENABLED(grpc_resource_quota_trace)) { gpr_log(GPR_INFO, "[%p] Early return %" PRIdPTR " bytes", this, ret); } - GPR_ASSERT(taken_bytes_.fetch_sub(ret, std::memory_order_relaxed) >= ret); + CHECK(taken_bytes_.fetch_sub(ret, std::memory_order_relaxed) >= ret); memory_quota_->Return(ret); return; } @@ -478,7 +479,7 @@ void BasicMemoryQuota::Start() { reclaimer_activity_ = MakeActivity(std::move(reclamation_loop), ExecCtxWakeupScheduler(), [](absl::Status status) { - GPR_ASSERT(status.code() == absl::StatusCode::kCancelled); + CHECK(status.code() == absl::StatusCode::kCancelled); }); } @@ -498,7 +499,7 @@ void BasicMemoryQuota::SetSize(size_t new_size) { void BasicMemoryQuota::Take(GrpcMemoryAllocatorImpl* allocator, size_t amount) { // If there's a request for nothing, then do nothing! if (amount == 0) return; - GPR_DEBUG_ASSERT(amount <= std::numeric_limits::max()); + DCHECK(amount <= std::numeric_limits::max()); // Grab memory from the quota. auto prior = free_bytes_.fetch_sub(amount, std::memory_order_acq_rel); // If we push into overcommit, awake the reclaimer. diff --git a/src/core/lib/resource_quota/memory_quota.h b/src/core/lib/resource_quota/memory_quota.h index fc8d966382c..1ccc6b246de 100644 --- a/src/core/lib/resource_quota/memory_quota.h +++ b/src/core/lib/resource_quota/memory_quota.h @@ -28,6 +28,7 @@ #include "absl/base/thread_annotations.h" #include "absl/container/flat_hash_set.h" +#include "absl/log/check.h" #include "absl/strings/string_view.h" #include "absl/types/optional.h" @@ -137,7 +138,7 @@ class ReclaimerQueue { explicit Handle(F reclaimer, std::shared_ptr state) : sweep_(new SweepFn(std::move(reclaimer), std::move(state))) {} ~Handle() override { - GPR_DEBUG_ASSERT(sweep_.load(std::memory_order_relaxed) == nullptr); + DCHECK_EQ(sweep_.load(std::memory_order_relaxed), nullptr); } Handle(const Handle&) = delete; @@ -438,7 +439,7 @@ class GrpcMemoryAllocatorImpl final : public EventEngineMemoryAllocatorImpl { template void PostReclaimer(ReclamationPass pass, F fn) { MutexLock lock(&reclaimer_mu_); - GPR_ASSERT(!shutdown_); + CHECK(!shutdown_); InsertReclaimer(static_cast(pass), std::move(fn)); } diff --git a/src/core/lib/resource_quota/thread_quota.cc b/src/core/lib/resource_quota/thread_quota.cc index eb30d336341..b2aba40210f 100644 --- a/src/core/lib/resource_quota/thread_quota.cc +++ b/src/core/lib/resource_quota/thread_quota.cc @@ -14,6 +14,8 @@ #include "src/core/lib/resource_quota/thread_quota.h" +#include "absl/log/check.h" + #include #include @@ -37,7 +39,7 @@ bool ThreadQuota::Reserve(size_t num_threads) { void ThreadQuota::Release(size_t num_threads) { MutexLock lock(&mu_); - GPR_ASSERT(num_threads <= allocated_); + CHECK(num_threads <= allocated_); allocated_ -= num_threads; } diff --git a/src/core/lib/surface/call.cc b/src/core/lib/surface/call.cc index 2287d0eac38..a8eabbd9496 100644 --- a/src/core/lib/surface/call.cc +++ b/src/core/lib/surface/call.cc @@ -113,164 +113,13 @@ grpc_core::DebugOnlyTraceFlag grpc_call_refcount_trace(false, "call_refcount"); namespace grpc_core { +// Alias to make this type available in Call implementation without a grpc_core +// prefix. +using GrpcClosure = Closure; + /////////////////////////////////////////////////////////////////////////////// // Call -class Call : public CppImplOf { - public: - Arena* arena() { return arena_; } - bool is_client() const { return is_client_; } - - virtual void ContextSet(grpc_context_index elem, void* value, - void (*destroy)(void* value)) = 0; - virtual void* ContextGet(grpc_context_index elem) const = 0; - virtual bool Completed() = 0; - void CancelWithStatus(grpc_status_code status, const char* description); - virtual void CancelWithError(grpc_error_handle error) = 0; - virtual void SetCompletionQueue(grpc_completion_queue* cq) = 0; - char* GetPeer(); - virtual grpc_call_error StartBatch(const grpc_op* ops, size_t nops, - void* notify_tag, - bool is_notify_tag_closure) = 0; - virtual bool failed_before_recv_message() const = 0; - virtual bool is_trailers_only() const = 0; - virtual absl::string_view GetServerAuthority() const = 0; - virtual void ExternalRef() = 0; - virtual void ExternalUnref() = 0; - virtual void InternalRef(const char* reason) = 0; - virtual void InternalUnref(const char* reason) = 0; - - grpc_compression_algorithm test_only_compression_algorithm() { - return incoming_compression_algorithm_; - } - uint32_t test_only_message_flags() { return test_only_last_message_flags_; } - CompressionAlgorithmSet encodings_accepted_by_peer() { - return encodings_accepted_by_peer_; - } - - // This should return nullptr for the promise stack (and alternative means - // for that functionality be invented) - virtual grpc_call_stack* call_stack() = 0; - - // Return the EventEngine used for this call's async execution. - virtual grpc_event_engine::experimental::EventEngine* event_engine() - const = 0; - - protected: - // The maximum number of concurrent batches possible. - // Based upon the maximum number of individually queueable ops in the batch - // api: - // - initial metadata send - // - message send - // - status/close send (depending on client/server) - // - initial metadata recv - // - message recv - // - status/close recv (depending on client/server) - static constexpr size_t kMaxConcurrentBatches = 6; - - struct ParentCall { - Mutex child_list_mu; - Call* first_child ABSL_GUARDED_BY(child_list_mu) = nullptr; - }; - - struct ChildCall { - explicit ChildCall(Call* parent) : parent(parent) {} - Call* parent; - /// siblings: children of the same parent form a list, and this list is - /// protected under - /// parent->mu - Call* sibling_next = nullptr; - Call* sibling_prev = nullptr; - }; - - Call(Arena* arena, bool is_client, Timestamp send_deadline, - RefCountedPtr channel) - : channel_(std::move(channel)), - arena_(arena), - send_deadline_(send_deadline), - is_client_(is_client) { - GPR_DEBUG_ASSERT(arena_ != nullptr); - GPR_DEBUG_ASSERT(channel_ != nullptr); - } - virtual ~Call() = default; - - void DeleteThis(); - - ParentCall* GetOrCreateParentCall(); - ParentCall* parent_call(); - Channel* channel() const { - GPR_DEBUG_ASSERT(channel_ != nullptr); - return channel_.get(); - } - - absl::Status InitParent(Call* parent, uint32_t propagation_mask); - void PublishToParent(Call* parent); - void MaybeUnpublishFromParent(); - void PropagateCancellationToChildren(); - - Timestamp send_deadline() const { return send_deadline_; } - void set_send_deadline(Timestamp send_deadline) { - send_deadline_ = send_deadline; - } - - Slice GetPeerString() const { - MutexLock lock(&peer_mu_); - return peer_string_.Ref(); - } - - void SetPeerString(Slice peer_string) { - MutexLock lock(&peer_mu_); - peer_string_ = std::move(peer_string); - } - - void ClearPeerString() { SetPeerString(Slice(grpc_empty_slice())); } - - // TODO(ctiller): cancel_func is for cancellation of the call - filter stack - // holds no mutexes here, promise stack does, and so locking is different. - // Remove this and cancel directly once promise conversion is done. - void ProcessIncomingInitialMetadata(grpc_metadata_batch& md); - // Fixup outgoing metadata before sending - adds compression, protects - // internal headers against external modification. - void PrepareOutgoingInitialMetadata(const grpc_op& op, - grpc_metadata_batch& md); - void NoteLastMessageFlags(uint32_t flags) { - test_only_last_message_flags_ = flags; - } - grpc_compression_algorithm incoming_compression_algorithm() const { - return incoming_compression_algorithm_; - } - - void HandleCompressionAlgorithmDisabled( - grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE; - void HandleCompressionAlgorithmNotAccepted( - grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE; - - gpr_cycle_counter start_time() const { return start_time_; } - - private: - RefCountedPtr channel_; - Arena* const arena_; - std::atomic parent_call_{nullptr}; - ChildCall* child_ = nullptr; - Timestamp send_deadline_; - const bool is_client_; - // flag indicating that cancellation is inherited - bool cancellation_is_inherited_ = false; - // Compression algorithm for *incoming* data - grpc_compression_algorithm incoming_compression_algorithm_ = - GRPC_COMPRESS_NONE; - // Supported encodings (compression algorithms), a bitset. - // Always support no compression. - CompressionAlgorithmSet encodings_accepted_by_peer_{GRPC_COMPRESS_NONE}; - uint32_t test_only_last_message_flags_ = 0; - // Peer name is protected by a mutex because it can be accessed by the - // application at the same moment as it is being set by the completion - // of the recv_initial_metadata op. The mutex should be mostly uncontended. - mutable Mutex peer_mu_; - Slice peer_string_; - gpr_cycle_counter start_time_ = gpr_get_cycle_counter(); -}; - Call::ParentCall* Call::GetOrCreateParentCall() { ParentCall* p = parent_call_.load(std::memory_order_acquire); if (p == nullptr) { @@ -503,6 +352,50 @@ void Call::HandleCompressionAlgorithmDisabled( GRPC_STATUS_UNIMPLEMENTED)); } +void Call::UpdateDeadline(Timestamp deadline) { + ReleasableMutexLock lock(&deadline_mu_); + if (grpc_call_trace.enabled()) { + gpr_log(GPR_DEBUG, "[call %p] UpdateDeadline from=%s to=%s", this, + deadline_.ToString().c_str(), deadline.ToString().c_str()); + } + if (deadline >= deadline_) return; + if (deadline < Timestamp::Now()) { + lock.Release(); + CancelWithError(grpc_error_set_int( + absl::DeadlineExceededError("Deadline Exceeded"), + StatusIntProperty::kRpcStatus, GRPC_STATUS_DEADLINE_EXCEEDED)); + return; + } + auto* const event_engine = channel()->event_engine(); + if (deadline_ != Timestamp::InfFuture()) { + if (!event_engine->Cancel(deadline_task_)) return; + } else { + InternalRef("deadline"); + } + deadline_ = deadline; + deadline_task_ = event_engine->RunAfter(deadline - Timestamp::Now(), this); +} + +void Call::ResetDeadline() { + { + MutexLock lock(&deadline_mu_); + if (deadline_ == Timestamp::InfFuture()) return; + auto* const event_engine = channel()->event_engine(); + if (!event_engine->Cancel(deadline_task_)) return; + deadline_ = Timestamp::InfFuture(); + } + InternalUnref("deadline[reset]"); +} + +void Call::Run() { + ApplicationCallbackExecCtx callback_exec_ctx; + ExecCtx exec_ctx; + CancelWithError(grpc_error_set_int( + absl::DeadlineExceededError("Deadline Exceeded"), + StatusIntProperty::kRpcStatus, GRPC_STATUS_DEADLINE_EXCEEDED)); + InternalUnref("deadline[run]"); +} + /////////////////////////////////////////////////////////////////////////////// // FilterStackCall // To be removed once promise conversion is complete @@ -678,7 +571,9 @@ class FilterStackCall final : public Call { : Call(arena, args.server_transport_data == nullptr, args.send_deadline, args.channel->Ref()), cq_(args.cq), - stream_op_payload_(context_) {} + stream_op_payload_(context_) { + context_[GRPC_CONTEXT_CALL].value = this; + } static void ReleaseCall(void* call, grpc_error_handle); static void DestroyCall(void* call, grpc_error_handle); @@ -912,6 +807,10 @@ grpc_error_handle FilterStackCall::Create(grpc_call_create_args* args, } } + if (args->send_deadline != Timestamp::InfFuture()) { + call->UpdateDeadline(args->send_deadline); + } + CSliceUnref(path); return error; @@ -1027,8 +926,13 @@ void FilterStackCall::CancelWithError(grpc_error_handle error) { if (!gpr_atm_rel_cas(&cancelled_with_error_, 0, 1)) { return; } + if (GRPC_TRACE_FLAG_ENABLED(grpc_call_error_trace)) { + gpr_log(GPR_INFO, "CancelWithError %s %s", is_client() ? "CLI" : "SVR", + StatusToString(error).c_str()); + } ClearPeerString(); InternalRef("termination"); + ResetDeadline(); // Inform the call combiner of the cancellation, so that it can cancel // any in-flight asynchronous actions that may be holding the call // combiner. This ensures that the cancel_stream batch can be sent @@ -1047,9 +951,10 @@ void FilterStackCall::CancelWithError(grpc_error_handle error) { void FilterStackCall::SetFinalStatus(grpc_error_handle error) { if (GRPC_TRACE_FLAG_ENABLED(grpc_call_error_trace)) { - gpr_log(GPR_DEBUG, "set_final_status %s %s", is_client() ? "CLI" : "SVR", + gpr_log(GPR_INFO, "set_final_status %s %s", is_client() ? "CLI" : "SVR", StatusToString(error).c_str()); } + ResetDeadline(); if (is_client()) { std::string status_details; grpc_error_get_status(error, send_deadline(), final_op_.client.status, @@ -1353,9 +1258,9 @@ void FilterStackCall::BatchControl::PostCompletion() { if (completion_data_.notify_tag.is_closure) { call_ = nullptr; - Closure::Run(DEBUG_LOCATION, - static_cast(completion_data_.notify_tag.tag), - error); + GrpcClosure::Run( + DEBUG_LOCATION, + static_cast(completion_data_.notify_tag.tag), error); call->InternalUnref("completion"); } else { grpc_cq_end_op( @@ -1477,7 +1382,7 @@ void FilterStackCall::BatchControl::ReceivingInitialMetadataReady( } } if (saved_rsr_closure != nullptr) { - Closure::Run(DEBUG_LOCATION, saved_rsr_closure, error); + GrpcClosure::Run(DEBUG_LOCATION, saved_rsr_closure, error); } FinishStep(PendingOp::kRecvInitialMetadata); @@ -1968,10 +1873,7 @@ bool ValidateMetadata(size_t count, grpc_metadata* metadata) { // PromiseBasedCall // Will be folded into Call once the promise conversion is done -class BasicPromiseBasedCall : public Call, - public Party, - public grpc_event_engine::experimental:: - EventEngine::Closure /* for deadlines */ { +class BasicPromiseBasedCall : public Call, public Party { public: using Call::arena; @@ -1986,6 +1888,7 @@ class BasicPromiseBasedCall : public Call, if (args.cq != nullptr) { GRPC_CQ_INTERNAL_REF(args.cq, "bind"); } + context_[GRPC_CONTEXT_CALL].value = this; } ~BasicPromiseBasedCall() override { @@ -1997,9 +1900,6 @@ class BasicPromiseBasedCall : public Call, } } - // Implementation of EventEngine::Closure, called when deadline expires - void Run() final; - virtual void OrphanCall() = 0; virtual ServerCallContext* server_call_context() { return nullptr; } @@ -2057,13 +1957,6 @@ class BasicPromiseBasedCall : public Call, return context_[elem].value; } - void UpdateDeadline(Timestamp deadline) ABSL_LOCKS_EXCLUDED(deadline_mu_); - void ResetDeadline() ABSL_LOCKS_EXCLUDED(deadline_mu_); - Timestamp deadline() { - MutexLock lock(&deadline_mu_); - return deadline_; - } - // Accept the stats from the context (call once we have proof the transport is // done with them). void AcceptTransportStatsFromContext() { @@ -2139,52 +2032,11 @@ class BasicPromiseBasedCall : public Call, // Contexts for various subsystems (security, tracing, ...). grpc_call_context_element context_[GRPC_CONTEXT_COUNT] = {}; grpc_call_stats final_stats_{}; - // Current deadline. - Mutex deadline_mu_; - Timestamp deadline_ ABSL_GUARDED_BY(deadline_mu_) = Timestamp::InfFuture(); - grpc_event_engine::experimental::EventEngine::TaskHandle ABSL_GUARDED_BY( - deadline_mu_) deadline_task_; Slice final_message_; grpc_status_code final_status_ = GRPC_STATUS_UNKNOWN; grpc_completion_queue* cq_; }; -void BasicPromiseBasedCall::UpdateDeadline(Timestamp deadline) { - MutexLock lock(&deadline_mu_); - if (grpc_call_trace.enabled()) { - gpr_log(GPR_DEBUG, "%s[call] UpdateDeadline from=%s to=%s", - DebugTag().c_str(), deadline_.ToString().c_str(), - deadline.ToString().c_str()); - } - if (deadline >= deadline_) return; - auto* const event_engine = channel()->event_engine(); - if (deadline_ != Timestamp::InfFuture()) { - if (!event_engine->Cancel(deadline_task_)) return; - } else { - InternalRef("deadline"); - } - deadline_ = deadline; - deadline_task_ = event_engine->RunAfter(deadline - Timestamp::Now(), this); -} - -void BasicPromiseBasedCall::ResetDeadline() { - { - MutexLock lock(&deadline_mu_); - if (deadline_ == Timestamp::InfFuture()) return; - auto* const event_engine = channel()->event_engine(); - if (!event_engine->Cancel(deadline_task_)) return; - deadline_ = Timestamp::InfFuture(); - } - InternalUnref("deadline[reset]"); -} - -void BasicPromiseBasedCall::Run() { - ApplicationCallbackExecCtx callback_exec_ctx; - ExecCtx exec_ctx; - CancelWithError(absl::DeadlineExceededError("Deadline exceeded")); - InternalUnref("deadline[run]"); -} - class PromiseBasedCall : public BasicPromiseBasedCall { public: PromiseBasedCall(Arena* arena, uint32_t initial_external_refs, @@ -2680,12 +2532,6 @@ void CallContext::IncrementRefCount(const char* reason) { void CallContext::Unref(const char* reason) { call_->InternalUnref(reason); } -void CallContext::UpdateDeadline(Timestamp deadline) { - call_->UpdateDeadline(deadline); -} - -Timestamp CallContext::deadline() const { return call_->deadline(); } - ServerCallContext* CallContext::server_call_context() { return call_->server_call_context(); } @@ -3697,7 +3543,12 @@ ServerPromiseBasedCall::MakeTopOfServerCallPromise( server_to_client_messages_ = call_args.server_to_client_messages; client_to_server_messages_ = call_args.client_to_server_messages; server_initial_metadata_ = call_args.server_initial_metadata; - set_send_deadline(deadline()); + absl::optional deadline = + client_initial_metadata_->get(GrpcTimeoutMetadata()); + if (deadline.has_value()) { + set_send_deadline(*deadline); + UpdateDeadline(*deadline); + } ProcessIncomingInitialMetadata(*client_initial_metadata_); ExternalRef(); publish(c_ptr()); diff --git a/src/core/lib/surface/call.h b/src/core/lib/surface/call.h index c58363e94e4..2f0dce7ad62 100644 --- a/src/core/lib/surface/call.h +++ b/src/core/lib/surface/call.h @@ -76,6 +76,179 @@ typedef struct grpc_call_create_args { } grpc_call_create_args; namespace grpc_core { + +class Call : public CppImplOf, + public grpc_event_engine::experimental::EventEngine:: + Closure /* for deadlines */ { + public: + Arena* arena() { return arena_; } + bool is_client() const { return is_client_; } + + virtual void ContextSet(grpc_context_index elem, void* value, + void (*destroy)(void* value)) = 0; + virtual void* ContextGet(grpc_context_index elem) const = 0; + virtual bool Completed() = 0; + void CancelWithStatus(grpc_status_code status, const char* description); + virtual void CancelWithError(grpc_error_handle error) = 0; + virtual void SetCompletionQueue(grpc_completion_queue* cq) = 0; + char* GetPeer(); + virtual grpc_call_error StartBatch(const grpc_op* ops, size_t nops, + void* notify_tag, + bool is_notify_tag_closure) = 0; + virtual bool failed_before_recv_message() const = 0; + virtual bool is_trailers_only() const = 0; + virtual absl::string_view GetServerAuthority() const = 0; + virtual void ExternalRef() = 0; + virtual void ExternalUnref() = 0; + virtual void InternalRef(const char* reason) = 0; + virtual void InternalUnref(const char* reason) = 0; + + void UpdateDeadline(Timestamp deadline) ABSL_LOCKS_EXCLUDED(deadline_mu_); + void ResetDeadline() ABSL_LOCKS_EXCLUDED(deadline_mu_); + Timestamp deadline() { + MutexLock lock(&deadline_mu_); + return deadline_; + } + + grpc_compression_algorithm test_only_compression_algorithm() { + return incoming_compression_algorithm_; + } + uint32_t test_only_message_flags() { return test_only_last_message_flags_; } + CompressionAlgorithmSet encodings_accepted_by_peer() { + return encodings_accepted_by_peer_; + } + + // This should return nullptr for the promise stack (and alternative means + // for that functionality be invented) + virtual grpc_call_stack* call_stack() = 0; + + // Return the EventEngine used for this call's async execution. + virtual grpc_event_engine::experimental::EventEngine* event_engine() + const = 0; + + // Implementation of EventEngine::Closure, called when deadline expires + void Run() final; + + protected: + // The maximum number of concurrent batches possible. + // Based upon the maximum number of individually queueable ops in the batch + // api: + // - initial metadata send + // - message send + // - status/close send (depending on client/server) + // - initial metadata recv + // - message recv + // - status/close recv (depending on client/server) + static constexpr size_t kMaxConcurrentBatches = 6; + + struct ParentCall { + Mutex child_list_mu; + Call* first_child ABSL_GUARDED_BY(child_list_mu) = nullptr; + }; + + struct ChildCall { + explicit ChildCall(Call* parent) : parent(parent) {} + Call* parent; + /// siblings: children of the same parent form a list, and this list is + /// protected under + /// parent->mu + Call* sibling_next = nullptr; + Call* sibling_prev = nullptr; + }; + + Call(Arena* arena, bool is_client, Timestamp send_deadline, + RefCountedPtr channel) + : channel_(std::move(channel)), + arena_(arena), + send_deadline_(send_deadline), + is_client_(is_client) { + GPR_DEBUG_ASSERT(arena_ != nullptr); + GPR_DEBUG_ASSERT(channel_ != nullptr); + } + ~Call() override = default; + + void DeleteThis(); + + ParentCall* GetOrCreateParentCall(); + ParentCall* parent_call(); + Channel* channel() const { + GPR_DEBUG_ASSERT(channel_ != nullptr); + return channel_.get(); + } + + absl::Status InitParent(Call* parent, uint32_t propagation_mask); + void PublishToParent(Call* parent); + void MaybeUnpublishFromParent(); + void PropagateCancellationToChildren(); + + Timestamp send_deadline() const { return send_deadline_; } + void set_send_deadline(Timestamp send_deadline) { + send_deadline_ = send_deadline; + } + + Slice GetPeerString() const { + MutexLock lock(&peer_mu_); + return peer_string_.Ref(); + } + + void SetPeerString(Slice peer_string) { + MutexLock lock(&peer_mu_); + peer_string_ = std::move(peer_string); + } + + void ClearPeerString() { SetPeerString(Slice(grpc_empty_slice())); } + + // TODO(ctiller): cancel_func is for cancellation of the call - filter stack + // holds no mutexes here, promise stack does, and so locking is different. + // Remove this and cancel directly once promise conversion is done. + void ProcessIncomingInitialMetadata(grpc_metadata_batch& md); + // Fixup outgoing metadata before sending - adds compression, protects + // internal headers against external modification. + void PrepareOutgoingInitialMetadata(const grpc_op& op, + grpc_metadata_batch& md); + void NoteLastMessageFlags(uint32_t flags) { + test_only_last_message_flags_ = flags; + } + grpc_compression_algorithm incoming_compression_algorithm() const { + return incoming_compression_algorithm_; + } + + void HandleCompressionAlgorithmDisabled( + grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE; + void HandleCompressionAlgorithmNotAccepted( + grpc_compression_algorithm compression_algorithm) GPR_ATTRIBUTE_NOINLINE; + + gpr_cycle_counter start_time() const { return start_time_; } + + private: + RefCountedPtr channel_; + Arena* const arena_; + std::atomic parent_call_{nullptr}; + ChildCall* child_ = nullptr; + Timestamp send_deadline_; + const bool is_client_; + // flag indicating that cancellation is inherited + bool cancellation_is_inherited_ = false; + // Compression algorithm for *incoming* data + grpc_compression_algorithm incoming_compression_algorithm_ = + GRPC_COMPRESS_NONE; + // Supported encodings (compression algorithms), a bitset. + // Always support no compression. + CompressionAlgorithmSet encodings_accepted_by_peer_{GRPC_COMPRESS_NONE}; + uint32_t test_only_last_message_flags_ = 0; + // Peer name is protected by a mutex because it can be accessed by the + // application at the same moment as it is being set by the completion + // of the recv_initial_metadata op. The mutex should be mostly uncontended. + mutable Mutex peer_mu_; + Slice peer_string_; + // Current deadline. + Mutex deadline_mu_; + Timestamp deadline_ ABSL_GUARDED_BY(deadline_mu_) = Timestamp::InfFuture(); + grpc_event_engine::experimental::EventEngine::TaskHandle ABSL_GUARDED_BY( + deadline_mu_) deadline_task_; + gpr_cycle_counter start_time_ = gpr_get_cycle_counter(); +}; + class BasicPromiseBasedCall; class ServerPromiseBasedCall; @@ -106,10 +279,6 @@ class CallContext { public: explicit CallContext(BasicPromiseBasedCall* call) : call_(call) {} - // Update the deadline (if deadline < the current deadline). - void UpdateDeadline(Timestamp deadline); - Timestamp deadline() const; - // Run some action in the call activity context. This is needed to adapt some // legacy systems to promises, and will likely disappear once that conversion // is complete. diff --git a/src/core/lib/transport/call_filters.h b/src/core/lib/transport/call_filters.h index b69b44a8df3..043bf6434da 100644 --- a/src/core/lib/transport/call_filters.h +++ b/src/core/lib/transport/call_filters.h @@ -926,7 +926,7 @@ struct StackData { filter_destructor.push_back(FilterDestructor{ call_offset, [](void* call_data) { - static_cast(call_data)->~Call(); + Destruct(static_cast(call_data)); }, }); } diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index fe7f72ef1ed..65f57fdd475 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -502,7 +502,7 @@ class FilterStackTransport; class ClientTransport; class ServerTransport; -class Transport : public Orphanable { +class Transport : public InternallyRefCounted { public: struct RawPointerChannelArgTag {}; static absl::string_view ChannelArgName() { return GRPC_ARG_TRANSPORT; } diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index d3a0abfcaec..c0205fa8497 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -44,7 +44,6 @@ extern void SecurityRegisterHandshakerFactories( extern void RegisterClientAuthorityFilter(CoreConfiguration::Builder* builder); extern void RegisterLegacyChannelIdleFilters( CoreConfiguration::Builder* builder); -extern void RegisterDeadlineFilter(CoreConfiguration::Builder* builder); extern void RegisterGrpcLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterHttpFilters(CoreConfiguration::Builder* builder); extern void RegisterMessageSizeFilter(CoreConfiguration::Builder* builder); @@ -111,7 +110,6 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) { RegisterConnectedChannel(builder); RegisterGrpcLbPolicy(builder); RegisterHttpFilters(builder); - RegisterDeadlineFilter(builder); RegisterMessageSizeFilter(builder); RegisterServiceConfigChannelArgFilter(builder); RegisterResourceQuota(builder); diff --git a/src/core/server/server.cc b/src/core/server/server.cc index 3ba7c7e7b0c..c43792935af 100644 --- a/src/core/server/server.cc +++ b/src/core/server/server.cc @@ -234,7 +234,7 @@ struct Server::RequestedCall { template void Complete(OptionalPayload payload, ClientMetadata& md) { - Timestamp deadline = GetContext()->deadline(); + Timestamp deadline = GetContext()->deadline(); switch (type) { case RequestedCall::Type::BATCH_CALL: GPR_ASSERT(!payload.has_value()); @@ -1479,6 +1479,10 @@ void Server::ChannelData::InitCall(RefCountedPtr call) { auto* rc = mr.TakeCall(); rc->Complete(std::move(std::get<0>(r)), *md); auto* call_context = GetContext(); + const auto* deadline = md->get_pointer(GrpcTimeoutMetadata()); + if (deadline != nullptr) { + GetContext()->UpdateDeadline(*deadline); + } *rc->call = call_context->c_call(); grpc_call_ref(*rc->call); grpc_call_set_completion_queue(call_context->c_call(), @@ -1828,6 +1832,7 @@ void Server::CallData::RecvInitialMetadataReady(void* arg, auto op_deadline = calld->recv_initial_metadata_->get(GrpcTimeoutMetadata()); if (op_deadline.has_value()) { calld->deadline_ = *op_deadline; + Call::FromC(calld->call_)->UpdateDeadline(*op_deadline); } if (calld->host_.has_value() && calld->path_.has_value()) { // do nothing diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index db662806f33..c237973e009 100644 --- a/src/objective-c/BoringSSL-GRPC.podspec +++ b/src/objective-c/BoringSSL-GRPC.podspec @@ -39,7 +39,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.33' + version = '0.0.34' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df", + :commit => "5a2bca2124800f2861263959b72bc35cdf18949b", } s.ios.deployment_target = '10.0' @@ -118,7 +118,8 @@ Pod::Spec.new do |s| s.subspec 'Interface' do |ss| ss.header_mappings_dir = 'src/include/openssl' ss.private_header_files = 'src/include/openssl/time.h' - ss.source_files = 'src/include/openssl/*.h' + ss.source_files = 'src/include/openssl/*.h', + 'src/include/openssl/**/*.h' end s.subspec 'Implementation' do |ss| ss.header_mappings_dir = 'src' @@ -134,7 +135,7 @@ Pod::Spec.new do |s| # We have to include fiat because spake25519 depends on it 'src/third_party/fiat/*.{h,c,cc}', # Include the err_data.c pre-generated in boringssl's master-with-bazel branch - 'err_data.c' + 'src/gen/crypto/err_data.c' ss.private_header_files = 'src/ssl/*.h', 'src/ssl/**/*.h', @@ -175,523 +176,520 @@ Pod::Spec.new do |s| *) opts="--ignore-garbage" ;; esac base64 --decode $opts < src/include/openssl/boringssl_prefix_symbols.h - H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oALS9XXPbuLagfX9+hWvmZqZq1zmx08l2 - v3eKrXR04tjektLTmRsWJUE2dyhSISh/9K8fgKREfKwFci34rdp1TsfS8ywKAPFFEPiv/zp7EIWo0lps - zlavp38kq7LKigcp82RfiW32kjyKdCOq/5SPZ2Vx9qn5dLG4OVuXu11W/39n4vy3zcXv24+X64vN+erd - hXj3cXv+bn35fvX76lKkv23efTzfXm62//Ef//VfZ1fl/rXKHh7rs/+1/t9nF+/OL/9x9kdZPuTibFas - /1N9RX/rXlS7TMpMxavLs4MU/1DR9q//ONuVm2yr/n9abP6rrM42mayrbHWoxVn9mMkzWW7r57QSZ1v1 - YVq8atf+UO1LKc6es1r9gKr5/+WhPtsKcaaQR1EJ/eurtFAJ8Y+zfVU+ZRuVJPVjWqv/I87SVfkktGl9 - uvairLO10FfRxt3313v8aL8XaXWWFWdpnmsyE/L465ZfpmeLu8/L/zOZT89mi7P7+d2fs+vp9dn/mCzU - v//H2eT2uvnS5Pvyy9387Hq2uLqZzL4tziY3N2eKmk9ul7PpQrv+z2z55Ww+/WMyV8idopSvd99e3Xy/ - nt3+0YCzb/c3MxWlF5zdfdaOb9P51Rf1l8mn2c1s+aMJ/3m2vJ0uFv+pHGe3d2fTP6e3y7PFF+0xruzT - 9OxmNvl0Mz37rP41uf2hdYv76dVscvMPdd3z6dXyH0px/C/1pau728X0X9+VTn3n7HrybfKHvpCGPv6z - +WFfJsvFnYo7Vz9v8f1mqX/G5/ndt7Obu4W+8rPvi6mKMVlONK3SUF3y4h+Km6oLnOvrnqj/XS1nd7fa - pwAVejmf6Ou4nf5xM/tjens11exdAyzv5uq73xcd84+zyXy20EHvvi81faedTRG+u72dNt9pU1+nh7qW - 5iqmc5UQ3yaN+LOdG//ZlP9Pd3PlVLdPMrm+Tu7n08+zv872qayFPKufyzNV9Io622aikqrwqMJfFkJl - Qq2LmCrUO6n/oEVZre9WXeLK7dkuXVflmXjZp0VTCNX/slqepdXDYad88mwlFCyaQOru/c//+J8bdWcX - Aryc/5X+42z1v8GPkpn66fP2C0GH+cWz9Ox//s+zRP+f1X/01Owu2SaqloGvof9j+4d/9MD/thxS1FRL - h/Se6+XNIlnnmUqqZCdU9bAZq/NJx8rQgR4pqidRcXQW6Vh1XZisDtutKm4cN8DbEZ7Okwt+yvo0YGdq - UR87pX3as8ekRDgdHlSZrrOd0C0bzWuQnvVRtXC5YIpt2HOzEgH59TF5Fs4xXVdkRVZnaX78Jcnm0NW8 - 1EC4qo87nc+TP6bL5Gb2aazfQHzPfDpZqJaKqGop25aX6SbRX9Z9LtVBpDhdtjff3U9v9Qc6ZSgVucv1 - xvvpt6QSXbyF6sTMxv9+iAXMq6yMsju8HeG5Um07V+/BkDvi8kFBH0P/8Wp2r/pTyUbIdZXtKTcKTIN2 - XWulB9X6FNmGoTdx1L/SfSieW6Ood53t1agj4sp7ARpjkz0IWUfE6AVoDF3By8f0p+i+zIzkatB47N8S - +A0/X5Ii3QmmuKODdvZVtzDq3qUviWq4JO/+cgx4lKyIjdIb0CgRWRBM/321jciAjg7Yy7pcl3kSEeFk - QKPEpX4o5TOZpKo1Ypg7ErOu8nL9s6uleHbTAEaRtao10mrDLToW70S4+3afpJtNsi53+0o00zrEruWA - Boi3rYQAvinJETEREFOVj3f09LNI2PomPwTxIBGzDStAtkF83GSBUmX5ly4H75L1Y6rqwrWoaC2lj4P+ - 8zj/+ZC/+cTKkTR/YAQCPUjEdsh7NWGFOcKwW7zUVRqXZJ4DjiTbn8kJ0KG+d/0oVP24r7InPWP/U7xS - 7Z4AiNH2MtVve6jKw54cwcYBfy7Sykg9SY7gCrAYbj4xI3kaLN6u3AheCE1i1rIZDTGvvYN9tyjSVS6S - ci33ulHc52p4Tg0BOdBIMnsoRFcL6GkQBez2khkSlqGx61zq/CsKQe60YRI/1jY/yMfjrUv+YTYN2FX7 - TnYqxjc1jbhOuWybrVUtQLW6PBZB3y88tyZDVt7N7PJIhH1apTuWuyExa1vjMmpsBwf97Y0ga/2sh643 - aMTeVOmSpW5RxHtsqpM8kzVLbxngKOpP6SFXg65UymdVZ6w4gTzJyFjJQYpqk9bpmwQ92eDo4iXhhupQ - 1FuIZ9Wkb8QLU37isQiRLTUogWNlxbZM1mmer9L1T04cSwDHUDdqXj5ERXEUcBw9ldPcvdwbyBLgMZoJ - C9aUBCZBYqmsi4/lSpBYjN7akYONxWGneiPrn4JXfg0c9jN7ggYKe38dMv1o/PFQb8pnVpLbBjhK8wQk - faTOPHk0bO96Tup+UUMcdt76Fjga8ckogCLeXKparCsFugpgZbZvgaOp2yPbvkbVUo4iGGcj9vVjRJCG - D0bgZruB+/7mGWb3jbxcp6x7EJT4sQqhRjX1bp/MF+TJD5OFzM904bPvqcSufBLcyQ2b9u36gyRdr1VO - U9UGGvQmD2W5iZA3fDhCJQrxUNYZY3CFaJB4bTW1PeQ5K06PY/5V8pjRGzOTxcylGkeveZncsWEzP5tN - wUCM2IwGPEjEZrDTZJfM/uYFsxWBOM0XV+wYLR7w67FAhL/FA/6ukokIcTIgUdg3ReCO0AuJBc/aoohX - 9SpXxMdxNop4ZXyJlGNKpIwrkXKoRMq4EimHSqSMLpFyRInsepW88nOEIXf9rlvomezLktHM2DwSgTVX - KANzhe1nx8khyVOfcMR/7Puy595gCxjtnJ1G54E0Up8dqidOrXNCg17WtITLIxHE+pE1QLJgxN08uUqy - DU9+okP2CHXYy09zg0cisObGexKxyuwhzR94CdKxYTM/SUwBEiPu2RKgQOK8RW1zPrK2SdRwvnxODsXP - onzWD+r33YwaJ5NwGRY7MtoYvxS57nhzWmTXAEdpVzuw9B0a8HLzfzDfm88jp4UwDxKxma5Piw1nNYMn - QGK0SxKYtYCJI/6o51hyxHMs4zsxBcsyIFHK3T7P0mItVIctz9a8PHElSKxDVekL0v1P7k+yFVgcVeR3 - XXnkRTEEcIzop4xy3FNG+aZPGSXxKaP5/e723qf1o4yJa3qQiKVsanRV3zaT87y0dSVwLJFW+WvzLLRb - 98Fp0gELEo33xFaGntjqD7dpLoVek1N1za/YJN0L0E3rxQk45ISv5KESqcIi0tI2wFGinunK4We6Mv6Z - rhzzTFfGPtOVw8905Vs805XjnukevyaFap+3VfqgX0vmxrIkSKzY58dy3PNjyXx+LNHnx80nMq54mfxw - hCStHmKjaAccqdBPINtUjOprQ56hiDJJN096gZoUm+iwjgyJzX/yL4ee/OsvNEssKyH3ZSFZhc4SIDF4 - qwtkaHWB/lBvknGohV6eIwrJDeFbkGj90mbOyxuoBYkmf5561RE3LqDB43UvLsfGczRIvG4TFU6MFoW9 - vw7ZOiJ7DBz1R6xokSNWtMioFS1yYEVL+/m6rDb9u2IRLRqiwuLWekRdFqoHKx/Tiw8fk3Jrjh0l7xKG - rNjVdOMD1WdX9ddhJ3jRXQsc7djE9Kubme0HKMJixq5ckiNXLpnfy/QLakWtqtOYaL0lHE1XOJtHwV03 - FVAhcaH3A9gdatyGR8+KB/2CU1mpEdKu2VFLckMDKiRuVe/1Tb7NcsGLZgqQGHWVraOn1HwLHK1bwqZf - Oo1oLnwLFo1dOoOl0Z7fjxkLwyY0qu7Etu28fj2R2+EHRWNjxnRTcFs4ep3WBxn7a0+SMbF4jYTrCEbq - V3PGRbM8IyPKN4kng9EOenJJ1T8RoY4KJI6qszePLH1DhqxxxdxW4HHEmn/9msXNlUy5YoUGvdFJYzqQ - SNWB1ww1IOzkPywIPSXoeqFv0DGATcGorPXXcnD99UFPLGyp3pYCbOoevm9H31/pDwRtesieTBa353Eh - GsVgHN2fioyjFXCc+WISl2CWYEQMdrL5ljHRuInnW+BoEa/COvign51yrmM4UvtYnJt2sGk46lvEwyPp - oV+7UWr9mjxm9CcJoMSONb36knyd/ljofRgoepNDjNRXuC0QcT6mMtkc9nmXVWWxzR6Iy5CGXEjkXVrJ - xzTXEzvVa/dtyYoLmpCoxNdYTA4x0psvB7W93dZ4id40+vR4tH8cTIkzoILjGk+e1+leDw85IX0LHI1a - pE0OM5a7ZPVa0yYwfBq2t3sAkDeoAvCAnze1higCcdgPhXBLINpeRKSZhgfcZhsgowJZpqGo7Vx0XLzW - EYj0NtORI5WB62jH4uyYLY76OatZADzoZ+1DgDnwSLQW1CZx607v915RFzrCBjxKzAOjkAeP2E3x5NlW - NOvwqF2zIVco8k7wI+1E2EycCwZw3B+ZOcE80R25yMrNUeBx+FVKT8P2TLaP6rh9GJOHIxA7kwYG+5oV - 9ryqo0OD3phehaNA48TU4XKoDpdvVDvJ0bVT//SHGydUQmVEDSSDNZCMq4HkUA0k1Vgi3yQr/eZl8ZAL - PTJmBQI8cMS65Pfqj2zYnGzLKiKzAQ0cjz5gtEnbSt/sANrjIGKf0eAeoxH7iwb3FtWbXKb7dqpBP9RX - BbamnC0QcviR9Lb17Zsvh9W/xbqWOrNVh5n2TCJs8qOydjEN7GCqP9JzY2/0UwIqJ26uv6Q35u9OcSBF - cuEBd5KXkQEaAxSlmRvoHmXojkFe0+P4DihS/boX7LQy4AE3M61cgx2lXT/0mJES5wS5Lr3aKm+W7zP3 - rEUUThy9fKzd8JTk7jHHF7PL7sAOu/SrBK4vZgfdgd1zeTvZYrvYsnewDexey9g6BtwxZn2o68eqPDw8 - tu+rCdrzHwC3/RtVbB/0KYvJuhLNA4c01/0j0vgAlTixyv44DZLe4Byj6qwwXmg0MNvXziif3htY1y/9 - Um49oqUEGXJBkZu57LbrRMsBAEf9+k0l3RMhV/2Yw4m0fuT9BINzjJG7QA/vAP1muz8Tdn6O3vV5xI7P - oqrUOIF52JEHO+6XfVk1S6Z0G71Tt3+lbntSANBgR6E+u/Gf2ZyOjtWLyZqjOyg+n3bt9TvzVXtamfdp - wG4+dtbdIkmO4BmgKNSdW7BdsGN2wA7vft18qquJZpVlqXq4VUbrAcAGJAr7mTFsAKIYr42dtlajlx/Q - AkRjP4kbegLH25Ec2428f2IVO/YOm7Co3Cd8Y57s9d/pukzdCSPt6jhmOFCFxXVX5DFjehogXvfuViV+ - HVQDqJpD4h5XqASMFfPCCKKA4rzJM1LSs9GHZosf+k6mJucZk26xEVF4xHyf6uaeTv5TdSs1oz0eiaA3 - 3IoI0OOwv90Ui+03cNiv8zytD5UwlsSyo6EyJPbxULHYbAJFcMzusQc/liXwYzBXRToo4G1/2eo1eUrz - A91t46ifUW/gbyMxz8BAz7+IO/ti6NwL4/NKFadyx5S3MODuttyhL6Py6YC9PyiMHaJX4HHUSCktYqKc - BGAMVSlmG4a64TAj9ZA6m/Stx514GE8cAdz3e7Mb1AieAIihh9Rkr4YAF/0ZOLp+yfgg+evDu9+TxfJu - Pm1WI2ebF2YIwARGZa2WCq+S6g5a2clEHvZ6koGuNmDfvSXfLVvgPlH/yOSjoLs6zjceN/WkGo8cZuTc - yz3pW9k7IQ2cbNN8/ERu/xTie04TPkkuyHWBBftu9u5JA6fhRJ+EM+IUnOgTcEacfsM5+QY+9abdi/04 - K0I/LBLi/QiMZ0foeTfNqsbjNAJrWs7FA35m59nlkQjcCs6CMfdBD+jikshxIJGafVxq1dGUzXR1M2Ul - WfFAExIVGN2xYgIeKGKx0XPwvN6yTQN21rGCNglYjVekyF6DDZvJy4RBgR+Dv/fP0ElWzdEQq6ykOjUD - mFi7B4XOwjp9JvWcXrEWLPERBtz0zlkF9c6kWOu7pj/1pJk85nUnQy4ocvssyNrphB4SkECx2vlV1hjc - glG3fj2ece/bNGbn9Ex7MmRtnpTx1Q0O+VmzBeg8rnxMK7HhTvzYNGpn7H3v05CdV/vh9R40JbrJHgS9 - k42bxkXVAwBWAQq4xkVm3RGIB4jI3b3pIbxzk/FWTfogEvmT9tYDgAN+9lILn4bthyL7RZ8u7knQauy+ - c3oIywgBaYbicUqwb/CjRGzeP3ieY8xZjuFzHCPOcAye32h8SF/y68Ggm9PmoCPzZ0bv8hnsXT7T+2rP - UF/tWVVZgt2htGnbrt//il2HgDn8SN1IiirvMNuXFcw3+i3QcxobrBOlBulZ1VifqtOI45HJRtU+JE+L - eB4tZ01fuKxnbnuIRGUL+S6g2dYbUe0lNRECJjuq7osc9hvinFFP2bY8W1Vp9UrOfpNzjPoI2/7BI3Xk - BOCAv10Z2S5+lWS9Rdv2XfqQrU/zKafNRGtSeUElbqx2QxO9UK1dokYL4tKuXW+Fr76gF9lRpw882HZz - zx/Gzx4mvmPrvVurt0a3BvekUuHTtn0vBKmLpL/vGsjtCtimqL77Wp/F2Exk7ktZ8xb0BzRwPFVFn79v - HvYdizP9Fcohlxf5KduI9hKpLagH2+52Y3BVxk+/Otnm2cNjTX3SFBQBMZuZs1w8iZwcpUcBb9uB4okN - 1jZXxEqj8uoJ5sHH6DnHxgecOwrAXX+zyNHITT13LGkxQIUbR7rLFf5NfFcJUdhxuu3F+/XJlAge7Lr1 - MSsqct6+MEhT26xr1m8hZH+LdlOpLM/qjDbVARuwKBG5jUrcWG09Vwnqi1026Vo5bw1g5+FGnIUbPAe3 - +ZD6OOQEAa6oEy7HnKXbfOeZc8XP0BWfs/LoHMkjzlm86Dm8MWfwhs/fbT6F3kokh4AkQKy+G8z7JQ4P - RGCd9hs66Zd5yi96wm/M6b7hk32bTx9LhlJDgIv8rgp2OjD3ZGD8VOCoE4EHTgOOPAl48BTg+BOAx5z+ - K3lvL0js7YXmrNzmvdNmzpp6vRYLmHnnBAfPCO4+lM1OsXogsy43Yl8SFyrgFj8avTVKoLaIcywsetZw - 1Lm8A2fyRpzHGzyLN+4c3qEzeKNPxh1xKm77lWajAt7tYsGAm3sK7sAJuPGnpo45MbX5Tvtatm7R20NB - yUFcARRjW1Yqh/QUbTO3KtMHRhxAAsSirzNH91iT5LXTElg7rf8WNWqqh8ZLddNz2ObpA918BH0ne9Xz - wNmv+uN/b36enyfPZfUzVd2ogpzGLu9HYK9ZHjjtNfqk1xGnvEaf8DridNfok11HnOrKOdEVPs015iTX - 8CmusSe4Dp/e2nyjPpCl9cH3sF+KHzivlHlWKXpOafwZpWPOJ40/m3TMuaRvcCbpqPNI3+As0lHnkDLP - IEXPHz0dHmpucE9/qz2gQeLxshs95/T0YczieVSCxNKjGT1ls37lD4tQERiTuZJx6PxW/tmtoXNb28/6 - BxGc1sTloQhveTor52RWSV8JLqGV4JK3Zldia3bjTzcdc7Jp851HsTH6ufRH/KgEisUr/3jJf5uNNijn - or7Rmaijz0ONOgt14BzU9vRSxugcGZXHnac65izVtzmBdOzpo8ZxjHq8Rl4zDfFohJi1u3Ls2l0ZvXZX - jli7G3kS5uApmLwTMLHTLyNPvhw89ZJ74iV+2iXzpEv0lMvYEy6HT7dknWyJnGrJO9ESO83ybU6yHHuK - ZcwJluHTKyV9nbSE1kmz2mi4fSa3LECrov/E2IPU5HAjedNpD7bddVk3R79xV/hBvB2Bf6Jo6DTRyJNE - B08RjTxBdPD00KiTQwdODY0/MXTMaaHxJ4WOOSU04oTQ4OmgsSeDDp8KGns25/C5nNFnco44j1Ovjkoe - RZ6X3Z6f3To8YhjQYUdizCuDM8nPKS0R9Pddg+wfGyVZ8ZTmtPUEoMCJoReHkpwasBxPF++P0wTk6S2P - 9cwsJeLq5hhZSovtzcubBe/He6DtpMsgC+sHe6Dt1CeQJqvDdqsKPcMM4Jb/6Tw5Z6eoD/tunhSzcVPY - h133RUwqXIRT4YIpxWwRqXARToWINAimAEcImyJ+O/LLNxdZYpwXNdbpYKiPstYIQHtvdrHhXKeDoT7K - dQJo71U9i6v5j/vlXfLp++fP03kz0G6PU94eivXYGAOaoXh63/w3iHfSBOJthNg3F8YOdTIEougVbcUh - z9lBjoJQjMOOrz/sAub9QT6y1RoOuOX496YgNmAmbZYL05Z9MV/eq+/fLadXS33fqP/8PLuZcvJ2SDUu - Lim/A5ZR0YhlIKSx4+lVsLP7L6c6Yren3vmYAoujV9HXghegZVHz+O38PBBzqj9teFJNYlZOofVp1E4r - mhaIOakF0CYxK7WScFHL22wxezv5NmUXZcQQjMJomzFFKA6nTcYUSBxOWwzQiJ14I9kg4iS8qu1yuJF6 - Y/ow5ibdlhaHGPflnnQoEggjblrPwOJwY9xNaQqwGIQN+TwQcVIrKYf0rXE39NC9zC3CeOllFFywzHKL - K15S5WO2Jed3A/kuVjY7OTy5ulLDuuR6uriaz+6brhflByN40D9+sxQQDroJ9StMG/bpIrn6Nrka7eu+ - bxvWq3UiinX1Ov4AagdzfNvV+cUlS2mRjrWuuFaLtK0bQdZ1iO0R6xXn0gzM8TFckKdk50UZyAvZHPfQ - fEB5LwxAfW8XkOM1UNt7KJ6rdE9V9hRmS/bpZjN+ARUI227OdcJXGXGN+BUubs+Tye0PSv3YI47n02yZ - LJb6++1hySSjC+NuUlMBsLj5oXkJs+bKOxz389UhK6X58dGA97BLVq+EI/1QAR6D0H0G0KA3JiclnJPf - 7tlF0EJRL/WKDRB1kouHSbrWu7ub6eSWfJ0nzPFNb79/m84ny+k1PUkdFjc/EMuYjQa9SVbUH3+LsLeC - cIxDdJDDQJSMnUChHKUWPBvFvZKfnzKUnzI2P+Vwfsro/JQj8rMuk0+33AAN7Lg/M2/8z+id/8f0VsW7 - mf3f6fVy9m2apJt/k8wAPxCB3iUBDQNRyNUYJBiIQcwEHx/wU29cgB+IsK8IC8pww0AUakUB8MMRiAty - BzRwPG6vw8eDfl65wnog9sfMMoX2RGaTD9xUsVHUS0wNE0Sd1FSwSNd6u5z+oZ8m7vY0Z88hRsIDQpdD - jPQ8MkDESe3WGRxuZHQAPDpgP8TpDyF/xkuODEsNclntOcQomTkm0RyTUTkmB3JMxuWYHMoxejfNIh3r - 7febG/qNdqIgG7FIdQxkohamI+S47j799/RqqfcVJCzZ90nYSk47g4ONxPQ7UbCNmoY95vqultN+so3Y - fLhwyE1tSFw45KbnlkuH7NScs9mQmZyLDhxyUytYF3bc9+rvy8mnmyk3ySHBQAxiwvv4gJ+a/ACPRYhI - n2DKsNMkkBr8dABSYDH91/fp7dWU8yDBYTEz1woYl7zLXCJX2BaLNmnSzYZmdeCQe52LtCDWp5AAjkFt - BdD6//gBYX2Uy8FGyoZ6LocYeam5wdKQfPvjtWL/QOkd+4efYNSdqD+nh1xv0yZ/MkNYDjhSLoqH8W93 - +yRspVZgaP3dfUCfkjLBgDMRL2ytYsPmZLuPkSsc9lN7Emgfov/gHVP4DjUmq9fkdnbN9HY0bo+9O+So - u8P9VpLK9VtE0x44oho8fl9+vuQE6VDES9g9xeVwI/dGP7KOefnxnFtd2yjqJfYsTBB1UtPAIl0r81nO - En2Ww3qAgzy1YT6qQZ/PNB9ssu2WrtMUZKMXHOS5DudhDvwEh/XYBnlWw3xAgz6VYT2KQZ6/nJ6W7EuZ - vbCMLYp5GQ9zwk9wnE+b5bAx+kYAxVBV84MoRNUcbrPRu7bRw/gOJBIz+Y8kYtUBk5qlbVHX++N+Sh7Z - HCHIRb/zjxRkoz7AOEKQi3zvdxDkkpzrkvB16dMpWLJzx/b9dvbndL7gPwuFBAMxiFWzjw/4qZkG8G6E - 5RWrMTY4xEhvki0Ss+72nLvexxE/vZQYIOLMeNeaYddILgU9hxjpjbdFIlZqtWBwuJHT4Pq45/98ya4m - bBY3k4uBQeJWemEwUcf752wxi5i99/Ggn5ggLhx0U5PFox37JnsgbDVlII6n7S3VInl6T5IZnGesk3JF - OVvSwRxfVotdsrnISLYjhLgo+3h4IOYkTmQZHGikZ7DBgcYD5wIP4NXpg144WdJyiJF8f5sg4swuNiyl - 4hAj9U42OMjI+9HYL2b9XOS36g1sWPdJB2JOzn3ScpCRlR1IXuxTYg/xREE2vSE43aYpzJas6xeeUZOQ - 9VDwfnPLQUbaXr4u5xh3q27OgPw0ziIxa8HXFoC3bb5Uev9Nu6MNzjGq3uwuq7MnQa8mbNT1HupElLRZ - +o4BTIzWvsccX50+XFBfe+oYwKQyi2xSjGsSu33e7DNKzQSLNKzfl18UsPyRzG4/3yXdK9UkO2oYikJI - W4QfikCpkTEBFOPr9MfsmplKPYubOSlzJHErKzVOaO/9NFnMrpKru1s1JJjMbpe08gLTIfv41IDYkJmQ - IiBsuGd3SbrfN8ezZbmgHOgAoLb3dBLZuq5yitUCHWcu0iohnTDoYJCv3TiYaTVgx603Kyr0qQ3NV0hm - G3W81OT0U1H9pRkuNscdETddRgVIjGZv4eThkFZpUQvBCuM4gEi6HBImkVzONm7K43mrFF9P2TZRbika - 9XWb17s6kR6sW5Djygmbk50Ax1HRctGpJ7u/JGmeUy2asU3N6iPC4iiT8U3EM1sdDPTprYJUVoxf/wOx - vnn8wRY9AVj2ZMvet2RFVlM9mvFNOz1dwsiAIwcb9+O7sA7m+9jZGchLZuvjoJhXH4U8fuN7iPXN1DNR - XM4zUn+482sfxcvmsCMV5g6xPTqDClJZbgnXUpPb6CNjm3QxbA6qK2gpZHKusX4kV+AnCHBRuqIGA5ia - LetIL/UAKOYlZocFIs6N6vJU5StL27GImXpDWCDi3B+YTg0izopwwKYHIk7S0RU+6VtLet/JwGwfsbB7 - 5Vw3AqusTPZpVhFFJ843MrqqBub7aH2LlgAshBNpTAYw7cmevW/RdeLqsKWqOsz3yXL9U5ATvaVc2wvR - 8+IaDruVqMj3o4GBPn1HqTaEoexI28oYooGjs31JKhDq6w6vFziQCkJLOJa6IjcrR8YxEYdke29ERq3c - /TqdWnT8MtOenCyLc6qmgQAXZz7KAl2npN2uDeA4nnlX9Yxck+TU3RKuuSWx3pZerS3JdbYEamx9/s+O - JlGA66DXrhKsW6UQP0kW9X3XoHqBOeGMegsCXCrzmtNvqaXIgxG3HkrsCXs7gzDiZnthJ3WsL8GZG8mb - uZHYzI0kz69IYH6l+Rt1TH+CANeeLNr7FupcjQTnamQ3RULsTxkY7BPlVs88HKqCo+1p314QlmGYjG86 - zYyQS0hPBqzEuRoZnKvpP5V7sc7SnKfuYMxNHrI5qO/lzC9JdH7pNDjsTqgjLS9ABU6Mx/KQbxI1RuOk - tAuDbnKR6zHER3woZXKgkV4QDM41tjmpPqMJT5jjK+i9/iNjm2pBe26hv+8aJKNp6CnbdtDH2pN+V0vY - lifqnOCTPx/4xEnkJziVnxmDxWdwtEgulEBpbG9+4gOrEwS5OMMImzSsN5Ov04tPFx8+jradCMiSfM4K - QgXmcKBxRul22Bjo+77fUOaJXdBw3iafbma31+2+E8WTIPRvfRT2km4th4ON3aG/lCQAadTOTIYskAqU - uVMbs3xXy78SMf54pJ7wLMRsOSKeh/AKX094FlrydIRnkXVaUa+mYSzTH9Pbq0/NKhyCqocAFzGtewhw - 6QeJafVA1nUcYKSl/YkBTJJUFk6MZfp2d7tsMoaytNblYCMxGywONtKSzsRQn65MZU15eRkV4DG2ZZXs - ys0hP0huFEMBx6EVBhNDfUmu57g2TG1HW/Z0JZNMJs9lRbEalG3bkCwbjyZfSIfYHrm+WBUUSwNYjlVW - 0BwtYDvUXzKSowEAB/G4F5cDjPuUbtunnmm9WrGuredc40asaSoFuI5HwvqcI+A6csH6YSfM93FS/Ui5 - tt0+o4kUYDmatasERfN930A5YMVkABOxceoh20VYBnRr7/HQ/ptaAx0R20Nrur0We10eCl1dPyd/i6rU - CSZJOo+27OqOodVtLWA7sieKIHtyaWo6HxHbc6DktvUmpvq3KB7TYi02yS7Lc/0gPG2qzCrbqfFR/dpM - uRD0Y3R2/F+HNGd1dxzStr5Q0kR926KJd6F3/22rcqe6RUX9UO5E9UpSWaRlfVhTior6tk0f37TWeSES - UuPgsY65Tqrt+v2Hi4/dF84/vP9I0kOCgRgX7367jIqhBQMx3r/750VUDC0YiPHbu9/j0koLBmJ8PP/t - t6gYWjAQ4/L897i00gIvxuEj9cIPH/0rJdayR8TyqN4Rrb1oActBevB46z5zvNWjDdWOEcdUPeS6CvGQ - 6lc7abIj5dpK0rCnBTxHQbwYBbiOffl8QZNowrPQa0mDgm3bVLVU+gkGT2vgrp9YwKFRq/qb7ijRLJqw - LLmg3STN9x0DedR5RGwP6aznEwA4zsmSc8uySyv5qHoqpHVhNub45E9qb/jE2KZyQ5yt6AjIkvw6ZOP3 - AHA5z0jrwXUEZLlo+lN0V8tBRqYw7GN1gWEBHoNYT3isZ24edkjqJXcUZktWuX6lZMOzHmnUXm645hIo - +eR6pocQ1zlLdo7ZWPelxSLmCDHi3R1yok4RkIU3+PJhz03sXBwRzyN/VUSNIiBLTdf45U4eVlTNYQVZ - WEXixHlGRnXl11L7jNabaAHbQSuXbplURYr6SzrE8tAeM7lPl4pCJQ+F19/3DdQ7oIdslz4Rm9aFOSKg - h5rAFucbKYd9m4xlog1m3JHMPtUtju78JYdC771Eag8B2rZz5/cCM3mk3TaP3/cNlEW+PWJ7pDhsyqRK - SWskDAqz6f/zIHjOlrXMxAv0rox1SYFraf9MG55anG2k9owqv1dUkXtEFdAbkmJ9qASxAu0hx1UTn/d0 - hGdhTL+YmOejzZVJYK5M0ufKJDRXRuvduD0bYq/G69HQejNuT0b3Rqhp0CGWpy4T50BxgtGHQXd3CiZD - 3JGuldVttjjLeKBNLhzcmYUD7UHmwX2SeaAVhYNbFp7S/CCI7fiJsUzEqTVnXu30le2hWNdZWSSPhBoI - pCH7T7Fepz/p3pbDjXqlTFmtuOIOD/hJ8+oQHHDLXwchCK9KIDwUQYp8S+t/+ajh/f45+Tb91m1HNlpp - Ub6N9CjUYHzTQ1U+U02agU3tKX4cX0v6VkrvoEd8j35ltnoiJ1qH2b6d2FGe7p8I2yLrimhpCc+Sr9Oa - qNEI4CGsDOkRz1PQf1YB/a4iFwXVk5tv9l99+tRMZVOm+E0GNiWrssw5ugZEnKRjvH0yZE2es/pRb37K - 158USJxyXZPPSkAFWIxs067DqAl7UuAGJMqBnxGHUE4c3iArDkN5QZogsSDflavRDP2uaSnfJvfpWlBl - DeS7DucfqSaFgJ7uBM9kX6mPXsZP5QQUYJxcMMw59NsvyGVTIaAn+rf7CiDO+wuy9/0F6GGkoYYAF/3+ - PkD3tfoj45o0BLguyaJLyBKdqZcj8nQtL5IV/Ze3GOCrt+9Zwo4DjZcMG5CiesRHrlEbyHYRT8c2ENtD - 2Uji+H3HkBFfhrYg1yXXabVJ1o9ZvqH5DNB2qv/Ixu851BOQhXJghk05NsrOtCcAcLTtuJ6cG7/vLgjb - 7maBnSq/CaHD7HK2kTJ0P37fNyTkOqinbBvxh3m/hzj6MxDbQ5kwOn7fNCy6gYCo9PzcRlTjZR4KebO6 - O8HiMZWU+XDcAETR/Wh9piWpH+6ztlnvCZpmhezeC3ilVFAQ7dr3r9TusUnZNlotvPBq4UX7wmfxShyZ - 2hxuTEQudoTdYjEejqBLYGwU1wFE4qQMnCr0MbsDIk7u7x/83Um22+fZOqMPqXEHFok23HVJxHrgaw+I - l3zzniDflaeyJnW5LQzy0cbKJuXbyr1+GkBcmQrCA27WTeEbhqLwJoeGTENReUUQcviRSDMQJwT08Ads - qAKMkwuGOReA64KcqM4MxOmP0b89PAPRfYkyA3FCQA8jDd0ZiAX19RkDAT36/Ue99IfhO6Kgl/Fb3ZmN - 7s/kahaqYWNmNjADEIU6s2FhgK+os1wNZypJ7iQYKOAlz5jYHGi8ZNicnKKNGhfeqHGhX145Low79TLE - A22YhDm8SM1WQ86whxgIUoTi8H6OLwjFUEMsvl/Btps08l64I+9Fu/ulfiWYYjlBtqtdPtm+9ppnf6v8 - pbyYgRugKId6zbQfSccqxM82iUmPfxzQdsqf2Z6i0t93DPX4p//H77sGylPsnjAs0/ly9nl2NVlO7+9u - ZlezKe30O4wPRyDUVCAdthNWLSC44f82uSJvumRBgIuUwCYEuCg/1mAcE2lnv55wLJTd/E6A45hTtmPv - CcdC2wfQQAzP3e3n5M/JzfcpKY0tyrE1u0IJSct/F0ScedntcM8Sn2jH3laqeUboQ9mY4ZvfJNezxTK5 - vyOfsQmxuJlQCD0St1IKgY+a3h/3y7vk0/fPn6dz9Y27G2JSgHjQT7p0iMbsaZ6PP+oYQDEvaY7XIzEr - P5lDKdw8NVFNK898pDE7pQfogpiTXRwCJaHZ+E4v72GnhGkYjCLrtM7WTW7r8Ua6FZFBfSF2DbR9lSHW - M3/7vpz+RX5MDbCImTQ0dEHEqbcMJG09DtMhO+1JOYwj/kMRd/0GH47A/w2mwIuhOqs/VC+D+sAeglE3 - o9SYKOo9NB2tZKV/nmQGsBxepOWX+XRyPbtO1oeqojwkgnHc3xxj0h1KzQ1iOsKRisNOVNk6JlCnCMfZ - l3qio4qJ0ym8OOvV+vziUk9+Vq97ar7YMOYWRYS7g333dqU/PufaHRzzX8b5B68/yo66H1P1v+TiHVV7 - 5Hxj25rpPiL1AB/c4Eepq4g0seABt/4n4UkIrvDibLO9TM4vPyYXyb6idkps2HeX1U91s9ViXev/Xotk - l26ekudsL8qi+VDvdKxfuKFM3TLc/pXRO/JgD745OpxXwEzU8z6sdzrrUnLnogcxJ6/mtOEBN6u0Qgos - Du+Os+EBd8xvCN9x3ZdYHS+LxczNiPCneOW5jzRmV43z+A1aARTzUubVXdB36uPcXtv+b3t8M7eXFTAF - o3bnML9FWFcVjNteaHxQywNG5FV7D9DZePZnpwPteeoTDvqbpqHbejUrC0YIxwBGaVKPcgoPxKJmvb4z - IotdBRinfmxOPFXfJUzrw7jvf0z1Om366LAHPade75rKHVHYUb6t7VqSe6QnzjM21ap8lZTdSQDU9zaH - tm6zjRpmZmmerA6UxfwBhxcpz1ZVWr1y8s1EPe+OMwe8g2d/2z9zLtEgfavYEfZMsCDPpWsnXs1pkL71 - sEs4syEnzjOWMeO9MjzeK4s1tWLUiOfZl/nr+ft3H3h9KYfG7YzSZLG4+UB7yAjSvr0SiVRVxap8YV26 - g3v+asOow1oIcemd2epsn4tLyrmvAYUfR3AqmY4CbNv2IAQ1WEl08GYDYdLLJUMiPGZWrLlRFOp5uw2Z - +BWnLxgRI2uX70SH6jxYxIPkxtAkYK3b16Qj+tigA4z0NuMXSRi/yLcbv0jK+EW+0fhFjh6/SPb4RQbG - L82R1puYqzdo0B7Z+5djev8yrvcvh3r/vE4w1v/t/t7M9kkhmNoTjvqzbZI+pVmernLBjGEqvDh1Ls/f - J48/N1u9ObT+uvqeoCY+YgGjMeZ7j5jhW86T6/mnP2inPtkUYCPNz5oQ4Dqes0L2HUHASWonTQhwURZT - GAxg0u+8Eu4AGzN8j+mVHsO285eqzL6Mnwf1UdRblI/PTK9GUa+UUrxnihs2bE5+e4mRK7z3X08Xxwnv - 0VdsMrZJrFfvqQM2l8ONhA1MAdTzMi8UvU7+ZeJXuREX+rEu61Id1jO/jzC/H2+mJoePO/6CXlqPjG0q - mL+/QH97wf/dReg36x4N4XGKgYAe4qX1FGw7FOtHQTm6FYR9d6kGKfu0ymryD+9Jw/qFtDN593WLb66U - IGi+7xuS/WFFyk6Hs43lbn9QQyqir6cwm56ZfiTkKQSjbtrpoyBsuSm9te7rFn86CY+WjCYG+1QpTHei - FpWk3HSYwIlRv0seSE4N+A7qb24R37OnWvaA4xf5FykE8FTZE+eHHTnASL5pTcz3/aKafrkOfdDeP38/ - /510ZiKAWt7j8VR9uSOYfdhyE8YZ7bdtmni2hIFYnvbFDtbvc1HLK+n3koTuJUm/DyR0HzRTLc0byzRT - B9mu7G9K/aq/bvG0BecnwHQ0qS4pp+KajGGazadXy7v5j8VSA7SmA2Bx8/gBuk/iVspN5KOmd3F/M/mx - nP61JKaBzcFGym83KdhG+s0WZvm6l5mS28m3KfU3eyxuJv12h8SttDRwUdDLTAL017N+OPKbeT8X+6XN - vPyeshwGhA33YpIsZsTaw2B8k27jqSbN+KauFabKOsz3UbKiR3xP03pSTQ3kuyQjtaSXWqTuRPd929AO - zPRmEWl9qEi/zkFt76aMUfu0Z9efEJUa8TxPosq2r0RTCzku1eRffyGJGsK2UO9H/15kDQUdDjHyBoOo - wY1CGg6eCMBC/uVeL/b41z3Zs4csv+i/y+4Nn/5KHRa6IOQkDgwdDjD+Irt+eRbqw2UHA33kZbEQa5sj - hpsgjdhV7jFuaQBH/IdVnq3Z+hNt24ntrtfmsge6AAuaeanqwaCblaIua5slo26TYN0mGbWSBGslybtT - JXanUpt1v00nDfW779sG4mD/RNgWescC6FUwJg1MqHdNr3hz7S6HG5tX2bjaBrbcjPGJTcG2kniKKsRC - Zsrox6YwW1LxfEmFGiXTCP5i4ijNA2HnC2W3DQ+EnIRWyIIgF2kE6GCQT7JKjURKTV1yy/aRdK3EcZYF - AS5alehgro9+YdBV6b+1BwoVeoF8s4Q4F+lPs33nvGPLs/tX97egRvzbK2mcZPfTPPnj8745UDNRParH - 8Wd2+6RnLTJZ7y8ufuOZHRqxf/gYYz/RoP3vKPvfmH1+9/0+Ibw2YzKAidCJMBnARGuUDQhwtYP4dn6g - rMhWG8f8ZUU4aQJAYW+7KeU2Tx846p5G7Otym66ZaXKCMfehehK6BPLkRzpop8xWIzji34gHTgnsUcTL - LiZoKWlva8JhNz4JWPVcxOo1Jpk9AxKFX04sGrA3KUaawAZQwCuj7ks5cF/qz/mVlUUj9mbXHv0yqWqB - pT4UWXUPdqxIoMmK+nX6o5tnp43dHBBxkkaZNucZVYZnqii128SJdTV+e1JU4McgtY8d4VmIbeMR8Tyc - aXwADXo52e7xQATdJFclOTl7EHYy5usQHPGT5+xgGrI39yH1XvZY0CyKdVNdSYb5xMJm2sSeT2JW8kQ8 - gnv+TCblPv11oN6CJ84zqvy8ILxSa1Oe7Thlzmq6YQEag3+7BJ8bdN8hTascCcjC7smAPBiBPDSzQc9Z - rusLeqp2FGjTKc3QaczztQ8R2Enq4oif/lgGwTE/u/QGns8cv6E+Y9zURwz2qfzg+BTm+bh9WI8FzdyW - SAZbIhnREslgSyTZLZEMtERNX5zRSTlxoJFfah0atnM7KDY84E7Srf5Q5bUaaGVFSppRHufzroD2yM2C - LNe36fLL3XW7yVQm8k1Sv+4pFSDIWxHaJXXphtKcnBjA1Ly/Sx01uCjkJc0bnhjIRDh1w4IA12aVk1WK - gUwH+u9zx2v0VaQWBLiaeb2Y2yekGR2POGEzpALiZnpSoSbHaDHIJ5NU766iNxKq6aXNxmF/WbSdGo78 - yALm3YFeohUDmGg9amC98OmvTddQz/6QfScSsDZ/J3abHBK1rlcrplWRqJXWJXNIwCrf5u6WY+9u+XZ3 - t6Tc3W1Pb7evhJRi8yaxcR0Svy751YHDWxG6gU22uSgIJ+p4IOiUtfpsw3C2oOVsTu89ZHmddXUPpZz5 - sO3W/ddEPzOlOE8Q6PrwkeH68BFyvb9kXJeCINeHi3O6S0GWq9kzUxWoNruap8Evu00iH1P9n1I+Hwgx - hmWh2OpnHr+u/zMuNiAzYl9ffPhw/rvuwe/TbPzDDhtDfcep+PFvUaMCPwZpbYjB+Cbi2gmLMm2z+8l8 - +YP84pYHIs7xby45GOKj9EUczjDe/jG7Jf7eHvE8ulJrF6cQ5/NgHPTPY+xz3N2c7XaskUXxoD6SxAiQ - wotDybcT4Vkq8aCaJFE1RzfoljsXNTULQYcXScblqRzKUxmTpxLL0/k8WUz+nCaL5WRJLN8+anv1xoai - qsqKNt/lkSHrlq/d2t52BqL5mOI0MMgnX1XB2XG1Jm3b259BO+bY5XBjUnCdSWFbm3Mt2o8kxWlyjvFQ - rNk/34Ntd/NMjppVJwhxJbn+E0fYkCEr+cYCcN9fiJf+W81W3dQQvsGOov7IzkKXdcy6Zfk0u+OUOZcF - zPo/uGaDBczzye01W23CgLvZyKpk223c9jcHWpNvmZ7CbOSbxkGDXvJtA/FAhDyVNTMxejTo5SWLww9H - 4CUQJHFilXs9ZNul1U+SvcccX6WXhTUhScXa5HBjsl5xpQoNeLd7tne7d7wHTok7gGWtEqksC3bFDOCu - f1c+ieZoVEET9xxo7DYY5opN3PXLuqxYl2yAtlOmnDToKcd2atCpt6xN+lbqTXpkDNOf98lkOrluzohP - CUejeiDiJJ5wC7GImTQOckHEqTtGhJUxPop4KbsPe2DA2b7ss8kqsaacjTTkQSJSRvsOhxjLveBdtAYD - zuQhrR8Ja+sRHokgBeE9RBcMOBO5TuuaedmmAIlRpw+k1x0BFjFTTtLwQMCpl3HQ9mIDUMCr39tUzUn1 - yKnpTBhxc1PYYAFz+zIfMz1M2HZ/0q9gLsuvhOU9FmXbrmb3X6bzJlObI5ppLxNiAjTGOtsTb3APxt30 - NsuncTtlfYuP4t66yrlehaLebpNlSk8TE6AxaKv4ABY3E3sJDop6m+Ur+z2tS4cr0DjUnoOD4t4nRoUC - 8WgEXh0OCtAYu3LDzV2Nol5iT8cmcWu24VqzDWrVh0Fwi0jDomYZX8blmDKuvxRTA5z4YITo8mhLgrH0 - ltv8CtMwgFGi2teBtpWbD3j6x9Q04VomKkcHcpJZs6C1Cu/e9+97ercH6us0f/ucFbRxjIGhPsJOfT4J - WWfUBvBEYTbWJXYg5PxOOhPS5WzjtVirEvQpleLjbxSjyYFGfdczhBqDfOSyY2CQj5rLPQXZ6DlicpBx - c0OuZyzQc+oeMScRTxxuJJZvBwW9jOw5YqiPd5ngfdh9xsr2HnSc2YOQtB/dEJCFntE9hvr+uvvMVCoS - tVJzxSIhK7nonCjMxrpEuNw0Hy0oq/csCrMx8/uEYl5eWh5JzMq4bRwWMnOtuPFP2tpIh8ONzNwyYNzN - y7Gexc3c9DVp2z69vbq7nrJmTRwU9RLH1TbpWAtWv8bAIB+5LBgY5KPmf09BNnqemxxkZPRrLNBzsvo1 - JocbifW+g4JeRvbA/RrjA95lgu1T9xkr27F+zZf7r9P2yQD1ca9NYtaM6cwgI+eptAUiTsYMv8siZvGy - L6uaJW5RxEutkS0Qcf7cbFlKxWFGseMZxQ4xcp/YgQIkBrFVMjnESH2ubYGIk/rU2QJRZ33YJ+mhfkwq - sc72mShqZgxfNBxTimJDm83CLWOjtUsd9Hs8rH1WGe7glb1Fso9L8ejEHpHO/z8lMSN1qSsSLBBwfr3+ - 3J7SvqNXQwaLmDOeFGwzv06/Nbub5IwqyGARM+dKGwzxmTsTc6/YcWCR+h1C2IEsBRjnB7tvYbCYmbhy - wAIRJ6tfAewiaH503LOP5T3CiJv6PNwCESen19JxiFGvWWUpNYg4Ob0Ufx808xPO7kEIj0Wg7yAE44if - VcsfQdv57Tpi7ZIHg+7m7pYccUfiVlp98y2wvvb4GbGuMTDURxwZ2yRsrQSxnrFA0LlR/Yqq5Pz4jgSt - 1Hr2G7ZW+RtvRfE3bD1x9wGtW3OCYBex9jMw0Ees+b4hq467v5PXy5gcaGStX3FZ2Myrh9AaiLQ9mY15 - PnZNGaglOakIp55+ibrdV42htGHPTVzL0RKehZFyYJox8tTPz/tP00Q2c4YUVU85tq9Xi8sL1db+INlO - lGub/rhoPqTZjpRva6cHN5vzdliWFduSqgYUSBzqulwLRJwbWntvcoiR2j5ZIOJs96kmdv58OmSvZJqU - qdgneboSOT+O7cEjNl/cPWzPiQ0m5hiI1FxSZKTOMRCJsWIRcwxFkjKRaV4TB+EhTyDi6UTfmGQ0JUis - dn6HuGjQpxE7sQdkcriROJfjoIhXvtFdKUffleqbXSXMrWksw2AUXeYiw2gFHifZNPdSle4eREE7smTQ - NDbqrzeM+2sosli3X9ZTj+yQpmRELH1hpy32ooNatkB0xgwyxAci6FtGleLokuN4xkXcH1biZf8WMVvT - QNSYdliOaoflG7TDclQ7LN+gHZaj2mFptJ9dakf+MstEiPoG2efrxseP6YTguhHx3yrwcMTo3o8c7v2k - UhIXUBoY6kuuFxOmU6O4t93Mnatuadw+51/1HLzqVSoFp6PWcZCR0ywgbQBl13eDgU2cMz5gHPLrWeSY - ADYPRNgI+vyJweFG8lyvB4NufUAZw6ox1Me91BOLm5uX4gRtAQPEAxG6F5TJ5o7DjbzkMGHAzZqpQWZp - SMeImxDiSq6/sHSKQ42MGvUIYk5mG2CwmHnOvdo5drXnzDQ9R9P0nJum53iankek6XkwTc+5aXoeStM6 - l/o+0wuZaScXBC1wtKRKn7nP2jFHKBLrmTuiAOIwOiNgP4R+dp5HAta2M05Wthjq41XkBguYd5nq9xUP - MZ0SXwHE4cwdwvOGeuIvtiwDjlAkfln2FUCc4+QN2X4EA05embFoyN7sNNh8i15eTBh3tznDlbc0bm+y - gytvYMAtua2axFs1GdGqyWCrJrmtmsRbNfkmrZoc2ao1J54QnztbIOTkzCIgcwjNgJp1/51I0Po34xd7 - z+ybP7NSD0k54ml2Ngb4nsgvWhoY6uPlh8Hi5kqs9SseXHmHD/qjfoHpsCOx3hhG3hXmvCUMvx98/Ctx - 0Z6B+T76i2zYO8bMN3fRd3Z5b+ti7+n2fyemngVCTnoK4u/76qMW2p3wkjTPUlJ3wmV984a8f0JPOTa9 - 828qZHJ+cZmsV2t9flDTSpHkmGRkrCTb7VXfI6PuDztKOHwN+qymN/jFnSYUb71LVvlB1GVJey0Yt4yN - lly+TbzkciDijrzLKqIIxamr5HGXHlOdH8z2BCI+rHfsKIoNm9VQqtg0W4nGxOgtA9FkxE3W8QMR1F1w - fhEVozGMiPI+Osp7LMrvF/xcb1nErOuJ6JrWlYyMFV3ThoSha3iDOxbwBCJy865jw+bIO9azDESTEZkV - vmOP3+DfsZZhRJT30VGgO3b9mKr/XbxL9mX+ev7+3QdyFM8ARNmoKxEb8T7u9gUtY6NF3cCDRuAqXuKT - 9mUwbU/9KJr7hCG+umL56gr2CcJ5KDYG+8hVFNqfaD8ot6zrUxjgU00YJz9aDPEx8qPFYB8nP1oM9nHy - A27p2w84+dFivq9rd6m+DkN89PzoMNjHyI8Og32M/EBa7/YDRn50mO1b5elPcbEi9mN6yrYxXjEF3y3V - lTuxhHSI7yHmZIcAHtqS/Q4BPe8ZovewiZNMRw4xchKs40Aj8xL9K9QbThSHnDSRd2Rsk35+3c5KrV6L - dEfKWJcNmGlPwB3U97ZzXrwrNtmAmX7FBop7y9W/uV6F2t7HVDbV2WNabZ7TipQSLuuY9z8Ft0PjsoiZ - 0RS4LGCO6tbCBiBK+0YKeczrsoD5pT2dPCaAr7Dj7NJK/TnvilWS5g9lldWPpJzAHHAk5uIHAEf8rCUP - Pu3YN6TtxNXXXf4Djf/g8c1ojihpGNu0V79UROU3bICiMPPag0E3K59d1jZX64vkt3fUhrmnfBtDBXh+ - ozmcskctN36ZaeYRts1GoN0eYutKv9hw2G6zF6oaFXkxLy5+I8oV4Vto1SZUS3ZPft4oBUIqL+77S2oa - KMKzfKDN/LUEZEnoqdlRtk1PSukZqua1gF1KuklcFjZ39ZNeNlBtOHpLAMdoPzt+Ux72egNSwYqGqLC4 - zaGujHfdYIMR5a/l9PZ6et1s8vR9MfljSlsvD+NBP2HJAAQH3ZS1myDd2z/P7hekF9RPAOBICFvoWJDv - OuQioYx8XM4x/jqI6rVv1ZvzeA+SJIcVTpzmOOJ1eSgIT5I90HFKUT1la/0izCZbp3VZJelWfStZp+MH - x4OiwZgrsdXHIr9BUMPkRH0SlSScV2syvemP6e10PrlJbiffpgvSbe6TmHX8ze1ymJFwS3sg7KS8hedy - iJGwv4zLIUZu9gRyp31xptQH9d4SKpCAIhTnKc0PETEaHPHzChlaxrhFLFDCmuXXLGdDIlZ5SvyCm3+2 - IhSHn38ykH+L75+W8ymveJssbqYXjp7ErYwiYqC998vX69GnEOnv2qTe8j4tNhRBh3ieukrXNVHUMIbp - 2+RqtEF91yY5O3y6HGYcXxu7HGQk7OxpQYiLsMTV5QAj5UayIMCl55vH73vgYICPsvzbggAX4QY0GcBE - 2s/SphwbaTl1TziWGTWVZn4KEZdOm4xjoi2YNhDHQ3n34wQYjvlioV/JT8ffySfCsYiCamkIx3LcZpsy - AemBjpM/hY3gjp87cQrCrrvMX9+rm1WNMmqa1wBB5+6QM4SK6m2zxeK7+mpyPVssk/u72e2SVE8ieNA/ - /h4G4aCbUPfBdG//+uPTdE67sQzE9ZBuLQMBPbqDobulufpnXREa3ZDDjcS5jX0yZI38GUGVGzfiGRsq - QGOQqxGMdyOwnx0hOOJnXj9eD3aft59sq3JHfRUYFfQxvl2PfhygvmpxtO7JCbAdlM7J8fu2YVmpnvq2 - rHYUzQmyXbTOSU+Ylg/j8Q8WR03PD356fiCm5wcvPT9w0vMDnJ4fyOn5wU/P6fLL3TXlddqe8CyHgu5p - mN7UTEBc3d0ulvOJavwWyfpRjD/wEqYDdkqvAoQD7vEFBUADXkJvAmINs/rkMy0JToRraXYNFuuaMMnt - gaCzrghPzFzONebl+EP1egKyJKuspJs05doo2XkEDMd0ubia3E+Txf1XNQgjZaaPol5CWXZB1En54R4J - W2fJ6uNvuqtLeOyH8aEI7W4R/Agtj0XgZuIskIez5q5QXRVC/wnjsQi8QjJDy8iMW0RmoRIiI9NBDqYD - ZWMPn8SstE0qINYw3y1nV1P1VVpZsyjIRigBBgOZKDlvQr3r7tN/J+uVvCCsBTYQx0OblDYQx7OjOXYu - Tzr+qSdsy4b2Szbur1D/sdFFNdvoRQOS4nJQ1Lt6jVF3tG1vnkqqzm9KkZ4gz6U6rpvxnV0Lsl056UDy - nnAsBbWgt4RtUX+4WK9WFE2H+J68oGrywrcQVtwbiO+R5KuRztUoLTWJO8T31C811aMQ2yPJOS6BHFda - qqZDfA8xrzrE8NxPb/WX9L4oaZ73K5Jksi6L8fdaWAPEk81De3qAjvONegVQuab6Wgqw0R6yOhjiI7QB - Ngb7KlJPwicBq8qr7IFsbCjAtj+ohqE5XZms7FHfy/nV8O/V84cvG9V+1XTfkfStutHJ0vcXhHl+AAW8 - uzrbkX95S2E2dcf+m2fUJGrdZNstU6tR3/uYysf3F1RlS/m2LomTe6rwBAJO/Wi42VS7JFt7FPDKNC8O - O7KzxWDf/jHl+BQG+Vg3UIdBPrlP14LuazDI98K8QOz+zh+TjchFTb7GEwg7y6blrB442iMLmjkVZoeB - vkw1cVXNMLYg6CQMPm0Kth12apArxm9fC7GguRJ1lYknTnoe0aCX8rANwQF/Mw96yPI6K7p17fSUARx+ - pB2rF7ZDemHt30lrogAU8Irdht4paSnfVpTMjtMJ9J37UmYvSV0mNbnmN1DfWwlWBnWY75NirQ/t4XdH - PQEag1e0LBhw/1RVstiTFixCLGLmtBInMOBMsi1bq9iQeT9+NxQQht30u62lQJuedmLoNAb7OOX2J1Za - fzLbxxMIO2UiSS/OQSxoZrS8LYXZSBttACjspXeBWwq07UtOeVQUZmsKA2E1KUzD9oN85GgVBvoIK3lt - CrM1B2NtD8Wapz3hsP8x27KuV3OwsWTdmxoDfaSXPlwONP4tqpIh1Bjgq6t1qlrBHb3En0jQyqnTGwq0 - 6aE6Q6cx0Jev05rh0xjiY3QQWgz0FfxMKUK5UvCypcDypSAcIulgvk9P8DyQ6/GWAmw73ctturtkZY8C - 3jIvnwW5F9Rhvu+JO9n9hM92nz5SfYZ2vStbfjL4Uf5mdbn/dvvayy/TOfkFTZuCbIRBocFAJkoXyIQM - 114U8AOQ0WLUgEdpt/xih+hw3N/utMD2d7jvJ76a7WCoj9RJ9NHeez/9lkwWt+fNi/RjjRaEuChL2DwQ - cD6rEiLIwobCbKxLPJG29a8P735PZref78gJaZMhK/V6fdq2r15rIVlmm7St6j+bZ42rdPzKWpdzjGXy - qEKNb6csyHbpx05655Or2b2q3ZrUoVgB3PZTc9/P8yZVr7/QziTzQMi5mNy3LxB8HT/xCtOwPbn//olw - vBeAwl5uUhxJwDq9ikgKEwbd3IQ4kYD1/uvV4p9kY0MhtkuW7RKzqa/P/my2y6HeVJgDisRLWDxV+aUg - WAbmUffafOBe0583rwVx5UcYdnNTeR66j3VjRDZqCHElk+9/sXwaxJxX8xueU4GYcz79F8+pQMBJbKnh - Nvr4V347Y8KYO+oe8Ax4FG55tXHcH5NEgTZIfx7VDrkCNEZMAoXaJP05r106kQHrJdt6GbJGtlOIB4vI - T/hwqseVmsEyM4++d+cj7t2odswV4DFicmE+VD+w2rUjGHCy2jcTDrk57ZwJh9yc9s6EbTd52A+M+Nsh - O6eps0nQyr1RABzxM4qvyyJmdoLArVr7IbdJ82nYzk4OpCVrPyQ3YwaG+S55vkvUF5OwjmBEjISwcj8o - QWPxm2JUAsZiFphAaYnJiGAezOPqk/lQfcJtcn0asbNTex6srajNbE9hNmoDa5Ooldi02iRqJTaqNhmy - JrfT/8M3axqyEwepyJz66c8RbTc+TjU+j7vnBkaq1pfYd0dorGp9IyqhQu16zHAVNuBRopIp2M6zhqwO - GvJe8r2XQW9swo9o/4Gv8foAiCgYM7YvMGpcbnw1ooANlK7YjBrMo3l8fTUfU1/F9RXC43PrO1G5MR+s - FXl9B3iMbn/G60Pgo3Tnc1ZfAh+nO5+z+hQDI3Xrc17fwjUYUdTtfX6R3H+a6nUXo80W5dlomx5YkOei - LPoxEM+jnzLrDf7SYpOsRTV+WQrGexGabeuI1obxTO3mH5RDWzzQcSbf/vh8TpI1hG35oDL86/Xni4Sy - DbUHBpzJ4svknC1uaNe+X4kLvT2Qfj2S9CYQgoN+UUT5Tdz2/zNZHYpNLnS9QyqwFog4dSnOtvogDMFz - mwIkRpU+x8dxJW4sahXxT6CG+Gdzg9OT+UhBNl3/8oxHErPykxQyQFHiIgzZ44oFZHCjUHZ06gnXUr/u - hX7/hbIJjU+i1maBI9PbsJi5q1HEhic/4bj/SeTlnu/vcMyv84Irb9mweVJspnE/wffYEZ0hE7mOgvhw - BFrT49NhO2GNM4K7/q5VpVk7yHV1BZbm6iDXddw9+XQTcPZJHqFy47a7Hr9B1IDIiHl3M7v6QS+aNgb6 - CAXRhEAXpdhZlGv71/fJDfPXWijqpf5qA0Sd5F9vkq6VvYsuggf91NRA99IFPianCr6fbvf5t8n9vSbp - l22QmJWT1iaKerkXG7pWetoaZG+dT26vk+4dibE+k3FM6i8ifSWJWsTxEGY4jt93DM0ifZKjISBLezSt - Ph1U76SsD/cmdDIHNE484vZhJuOYNplMV2pIti2rn8mhkOlWqFHadisoez4Pm5yo4oGWb+r7rqF4o8sO - iZyY24x4bqhNObZ20FNskp2oH0taejgsYJavsha746EX+ucl64Osm/MRiCk0rHPiN1vD6J9NCnOiHNu+ - HL97wAlwHVIcNiXjZjdBxymFoGWaBjwHvwzIYBmgnUFrIIbnavS5GeqrFtdcHKGfayCGx3z8QtkyxANt - 5/FZC1Vpcpbx/ybn7y5+05sg6ZMCk/Tp5YLgBWjLntwvFsn9ZD75RuvlASjqHd/z8EDUSeh5+KRt1S+Q - 7n+u5bmqbQTh8HiItc2rbPxzg+P3HUOuDx8uHpLx7686mO1rjstQ9eCedF09Bdkod6IJ2S7i+N5AXM82 - PeQ1tc7zSNtKnDEwENuzzdMHUtI3gOMg3qb+vekcYUWROWjASy1kHuy663fJuqoT2uoaAAW8G7JuA1l2 - +3O6SEGg6xfH9QtyCbJIAJZtuq7Lip7wHQcYs1+7PVmnIcBFrISODGAqyJ4CsNB/GPSr9lJyy3uPAt5f - ZN0vz6LuftoY1MZAn96US7Vc1CrJZm1zJpNyn/46kG6CE2S7Ik7zQ3DETz4JD6ZtO7HL5PWTdALTW9We - wmx6Z0rBUzao72Xmj4MGvUmeVg+Cft2AIhxHb9tZ1TFhWsNgFBEZA/odrHJskyErOxM8gx1lr+fHVO9Z - 9+7b1S13k+l9snvYktrkgGYonh6vxIc7WoaiNU8pI2O1DjxSURaCG0GzsLkdTLxBHoGi4Zj8lPMtbjTm - masgDLpZdyd+2mrzqd7ki6TTgOdoLpsxInRQ2MsYyzko7G3GLfqMWNpEIGrAo9RlXIy6BCO0ecpJdosE - rZxEt0jQGpHkkACNwUpwH7f9kj+ilaERrWSO1iQ6WpOMEZYER1iSN26Q2LiBsm7r+H3f0AyWqC2HBQLO - Kn0m6xTjmv4WNMvfTkupil1Nn3bqKdt22FNOEu4J20I76bAnIEtEhwkUgDE45cNBQS+xjPRUb6OsgbZX - POt/0Y7M7gnHQjk0+wQ4DvKx2Tbl2GgHZxuI5bm4+I2gUN92aXL6nhjPREzjI+J5yCnTQ7brw0eK5MNH - l6anzZHxTNS06RDPwymDFocbP+Xl+qfkelvas9Pz8gRZrveXlHKuvu3S5Lw8MZ6JmJdHxPOQ06aHLNeH - 8wuCRH3bpRPandIRkIWcyhYHGompbWKgj5zqNug5Ob8Y/rWMXwr+Sk4dYXGekZVmXnrN7r9MFl8SQot1 - IgzL/eTr9CK5Wv5FeszoYKCPMP1sU57t9KRwJx+IShP1vPuqXAvdXSNrDdKwkpYhuisQ239TN6+2qd62 - nH9fLJPl3dfpbXJ1M5veLpuJNcKYDjcEo6zEQ1bo8/IOaTH+nL1BESFmUqrUSHYqe9KHt7sAyzriaiqx - Ebt9TcjKEapgXPX3TD6+RdI7pjFR3+Tneq5wZEJ9heBBP6H+gumgXc9wyKqKvCMNCxxttlh8n85j7n3b - EIzCzREDD/p1gYwJ0PDBCMw87+mgXRdssYsI0ApGxIiuA3FbMLoujztRp3riLrLAuarBuBF3k2+Boym2 - /Q9uSbcEcIyNWJeb/lnOMQk40RAVFld9zXgkIcW6Gn+W17AJjipe9urbO1HUydM5J5glGI6hum67VWyc - RjIm1lO5r7bx0RoNHI9bEPHyZy7L45hNHo7ArGTR2nUvdd5zM7ang3Z2Vpp8H+H7Yjq/vVvOrmjHFjkY - 6Bs/6rUg0EXIKpvqbX9dfPhwPnovoPbbLq3L0j7NKprlSHm27kldUzl1lSPRDBiMKB/e/f7n+2T611Jv - 0tAuaNAn8Y6OgfBgBL1jT0wEiwcjEN6KsynMlqR5lkqes2VRMzcVBlOg/TSRP2PkCgf9m4uMoVUUaKPU - Jw4G+h7G9wJsCrNRNrjzSdCaXXCMigJt3FKEl6A2+3m/+8SCZtICHJfDjcl2z5Uq1PN2J+21nUHKLAHG - exHUTXbOKAZHDPLpV9iKTVrpN6lqUegJNknXQxYwGumkV5fDjcmqLHOutoEDbnrZs1jPrMN1+VxT3r1F - cM/f3EqMCvLEecY+U1m3oot7fl3r0duHjgJtvDvQIEEru6zZcMBNT1yL9cztwsY8k1RtD3rO5sDp+oUo - 7CjQxmmLTpxtTCY3f9zNE8KxwDYF2ghvvdoUaKPemgYG+vSrLAyfxkBfVjNsWQ26CGMrmwJtkvdLJfZL - m+m3Dc+oQNe5XM5nn74vp6omPRTERLRZ3EzaVRSEB9zJ6jW5nV1HhegcIyLdffrv6EjKMSJS/VJHR1IO - NBK5jjBJ1EqvKywU9bZvVhKmXDE+HKFc/Vs1pzExWkM4in7TICaG5tEIGffyM/yqybWiSaJWVSmdx+Tp - iQ9HiMpTw+BEuZrOl3rjanqRt0jMSsxGg8OM1Ew0QcxJ7l07qOud3X5mpOeRgmzUdGwZyEROvw5yXfMb - +u6SPolZqb+35zAj+XcbIOBUY813SSWeyp9iQ/aaMOw+16M36pyDB8Nu/SlHqznASO3zdwxg2ohc6Bej - GJfXo5CXtNmtg0G+A/0X+70N/VfWzYPcN02bqnpLemtistOEA24pqizN2fYWx/y8mTCIxyLkqaxpCyQx - HotQqIuIidDzWAT9bk9aHypmgBMO+5P59M+7r9NrjvzIImbObd1xuJEzbPLxsJ86WPLxsH9dZXW25t1W - riMQiT469uiAnTiP6LKIuVlVVbHELYp44yqCwXogshoYrAX6u5j63Ac2IFGI64UhFjAzunZgr26X1utH - sqqhABunewj3DBmDiSOF2YhPzCwQcDajwYhbwOGxCBE3gcNjEfpCnOYPJS+K7RiORH6UhkrgWF3FRdq9 - FeORCNz7Wgbva8rr0xaEuKgPOywQcpaMfrGGABft1WUHA3y0l5gdzPFN/1pObxezu9sFtaq1SMwaMV+N - OEZEonbBEAcaiTqis0jUSh7d2SjqbY654XQaYUUwDnli08eDfsa0JiRAY3BvgdAdQO0rWCRqlfG5Ksfk - qozLVTmUqzI2VyWWq7z5Rmyu8ebu7uv3+2Zia5PRxhg2CnvXdZVzpJqDjZR9yl0OMVLT0uBg42MqH7nJ - eWRhM3mrdhB23M3ar+ntcj6bkltLh8XMPyIaTEwyJha1ycQkY2JRH/JiEjwWtYG2UdxLvgMcFjezGk+A - D0dgVLSgAY+Sse2he4LahNoo7pWCfblS1EFvVG7KwdyU0bkpg7k5u11O57eTG1aGGjDkbh4OFXX1Sjef - 0KCXXXm6hsEorGrTNQxGYVWYrgGKQn0Yd4Qg1/GZGi9jTRq00x/KGRxo5LQRSOvQpjN9ytyFITevzcFa - m3ZJEHGS3CIRKzfjTyjmbTbWZt/RrmEwCuuOdg1YlJr5DAoSDMVg/5AafRLVfEX3u+liTWG2pMw3PKMm - ISun0YLbKlbPA+lzlIXIs4JxM3cg5KQ/Pugx1Ec4mMMnQ1bqkwkXhtysPpzfe1OlfXpFf2XN5HCjfmuj - VrWc5KpPAjhGUzfrP3D8Jxh109duOixspt5bPeb47r9/0uf3kvPO4GAj8YVDA0N975jCd7ix3YqX623p - kJ28WXdAAcfJWMmcIalMLVc9BvskrxRIrBTIqDyTeJ7N7+8WU04h60Hc2azIIj9mhASBGMTlCTYa8NbV - QdZsdUM7dv22Om+G2SIxK/GOMDjMSL0rTBBwNgtH07quyNITGbJyesmQYCgGtZcMCYZiUIfvkACOwV0E - 6eODfvLSIVgBxGmPo2AcN4EbgCjdBAOrxBosZKZPTfQY5CNOTHQMYDolPSvzLBqwsyo+pM479hI4uW+w - mJm3CtbHYf95InZplnPcHQp7eYX1CAac3MrV4QcicKpWhw9FoM+2+Tjij6hVbRzx8wt6sJxHrPMEDViU - Q/PUgL7kDBIgMThrzhwWMDM6VWB/itOVgntR9OmbE4XZqJM3Jog6t3umcwu1S7GrMRHHcCT6akxMAsfi - 3tkydGfL2HtODt9zMuKek8F7jrzO8wghLvI6TxMEnIy1lD3m+Zo3Wvhv5EECPAb5HRmHRczM9+p8HPOT - +7cnDjEyeqI9iDhj3jFDHKFI+vXOdar3tLmmroAPeEIR27frbg+7laj48UwLHo1dmOA3upxPed1ZSDEc - h96phRTDcVhLOwOegYiczjRgGIhCfesL4JEIGe/iM+yK6T28E4cYdSv5Bje5rwnEi77FXYkTazH7g173 - HiHARZ65PkKwa8dx7QAXsXS1COChlqqOcU3Lu/m0OaFknYu0ILamHo3a6Tlroai3aTfIr50D/ECExzQr - okJowUCMQ1XpnbHXxMXbuCYcj/7QCBIMxmiuhdjNRi3haLIuKxETqBGEY6iGST/AIe68gUlCsc6bcin5 - cTrBQIy4kn0+XLLPdVGM+xmKD0dgvKwNGkJRmkeOB/oyWUwSjBWZLcO50tcTUZWnpQnGE1VVRuRQyw9H - UEPGff0YG6e1hKO90Fdlg4ahKKrRbtcDxoU6adB4WZFxS0JWZHjuk3sqJolau7Oj2TXLiQ9HiGkl5XAr - 2Xylawz0lsrrnzGxLFEoZlT9Igfrl+aVA7FND3kdEaMzDETh3+0nPhghpt6Sg/WWjK5J5IiaRH+HdHY2 - xgcj7A/VvpQiIkZnCEaps11MCI0P+hN1FdlLZJRWEo5FXkkE8MEI3VHb61VElJMDjfQWFdhw3aVnmpm9 - lSOKe1mDro5ErXlZ/mQNqXsYdDNH0+hI2th3lVNFmDju57akA2PNh35/Uea1nwevvXl/N+/myDgRbAEY - g9dDwnpHzSNGbmr3MObuVkjx7hiLRyN0Lb+6jvpRMqNYjkAkXv8h3HeIaW/Dba3+tN1Ag5v6HY3a+a34 - UAse0+KFW7vYlm64lWPsumOCjvPPCWP/zSMEuIjjtj+ht2n1H6n1UMe4pul89vlHcj+ZT761+83uyzxb - 056LY5KBWOfJY0ksYLAiFEdPdleMGxyThGLRi4lLh+wPrCoQVgzFiUyvB6RetL6UFY/qNo7I/04QisHo - 1AF8KAL5NnTgkFu373y5pofsjAWsiGMwUty9flIMxsn2kVGy/YgYSSrX0XG0ZDBWU5VmQkZGO2oG4sXW - MHJMDSPjaxg5pobRX9Jl5g1inTRD8ThdMkwyFIs8vQIaxkRhTLIEPIMRyR1PWOHEYa/OC6zKaz6qRLPE - krEti49D/ubHsPUm7dvJK7TgNYTNmaj0dRw9BvrIDWCPOb5mDpwzMjBBz6nHxulP4pL7HgN965RhW6eg - i966GxxoJLfiPQb6iK31EUJc5FbZBGGnftTMyd8WBJ3cN96G3nbrPmc0QBYJWulVssG5RuLmQ/6+Q+ov - p4fZ5EbQhQE3yxlwMZpPG3W8zJXa6AptxpuM4FuM1BXe/srupuahD6R7zPGp/9rodRzdbtep+hfjcBLU - gkTjLD1xWNdMTREgLZrJ+fRQP5Zq1PzKWYcDGsJRVDVFfbkfNISjMPIUNEBRmO8ChN8BaE9xKevJtubk - wZFErJ/Elrq6zkYhL+MVJ/wNXeOTZJXVsq644g6H/Oxl0ENvOES8Wxx8r7j9sHtji3vn2DwUoV5JfQlp - /kC39yxkPmQbxl2iKd/GmZxC36xuHx2u5Z6u05RvS4ytWahOkwXMx6dh+iF4klYiJfs9w1AU6lbMkGBE - jEQUT9FxtGQoFnkDaNAwJkr8TzpaAtGOff6YbDIcQCTOuiZ8XWTUasiBNZCct8rgt8ki3iILvj0W8dZY - 8G2x2LfEht8O478VFnobjPsWGP7212mzhY3YNO3cQaYPgiN3FFicZjcU+jQywAMRuCf5PARP8dGf8pMm - lCLcbmug18rvtIb6rM16klwUZGfHQUZWJxjtA0d1UQd6qBG7ggztCBK1G8jATiDcXUDwHUD0y33sQrsL - lNodv9ju8HK7a6Z90s2/ac4T5vgyqTeuyDbdcwBiSfBoz36qf8jzeg4bMJO3HnbhATd5I2JI4MagNaDe - OgZVX6hkJz9R6THQR36i0mOOr1kq2XRg11VO73D7OOqPcKNe/iXDV0tdBuKv/NinlRTJtip3yeqw3RJr - Ko927c2CrHZSniY2QNdJ3sMI2r+ItXcRsm8Rd7tpfKdp1i5IyA5I3XwVY7LdIh1r9/S4WaJGkpqg42zP - 1eS0mBaJWBktpo1C3ohdpYZ3lIreTWrETlLct4vwd4piTgkNnxAquaMAiY8CJHsUIAOjAObeXOi+XFG7 - awzsqhG139fAXl/cfb7wPb7I+3sBe3ux9vVC9vTq767NgdgRtVHUS2/vHNY1G9lF7jy7cMhN7j579JCd - 3IEGDV6U/b6s9HtmpzkUYgyPdyKwRlrIOOv4Z2pXxuBcYzPkojfsBucYGeufwJVPjL3zwH3zju9xUF8U - NDjc2O0OIGt16z1w9ZbEjvX0nrN+rqc8G29VhwV6TsZseU9hNsaMuQeH3MRZcw8OuTkz57ABjUKePXfZ - 3pxeZMnsXgnm08VirNKCEFdye8XSKc4wrrKkViOSZKUGxofiWa9gqcVOVbrp+BPBgpJwrOeqLB5U9fSQ - SUJHdNgERF3n5Ur12JLq/B05jsEGzecR5vOg+SLCfBE0v48wvw+af4sw/xY0f4gwfwiZL/niy5D3d773 - 95A3feGL05eQebXnm1f7oDnimlfBa15HmNdB8ybjmzdZ0BxxzZvgNcuIa5aha37Z7fhVqIbD7vMY9/mA - O+rCz4euPO7Sh679Isp+MWB/H2V/P2D/Lcr+24D9Q5T9Q9gelewDqR6V6ANpHpXkAykeleAD6f0xxv0x - 7P5njPufYfdljPsy7P49xg31IJrDVFS3uX0vfpNVYl0fV7iQY4VkQOzmDdO4iL4CiFNX6U4//Bp/biuA - At5uxFGJ+lAVZLVF43ZZp+OnVEA45C73fHVp9u6EPL+4fFjvZPaUqH8kP0cvrwLQoDcRxTp5OY/QdwYk - ykasWW7FIUaxXjUhV3k5/pEtbsCiqM938iF5+Y0X4oQP+S/j/JeI/+dmyxIrzjJefPjILYcuGvTSyyFi - QKLQyqHFIUZuOUQMWBROOYTwIf9lnP8S8dPKocVZxmRdV037RHhi6WC27/E5Wa/W+gdUr/uaorRJ31pX - 7y+On7Z5K6l6QOHFUSWTceUd5dm6ssgwGqRv5RkRW7uHRpsoxGLg06D9mOQ8u0Hb9qLklzaXhcyRJQ6V - ALEYpc7kACM3TfD0iCgnEI9EYJYViLcidBXgY52ucvGRtKE1TOP2KPmQW3X0X5/GP0/CeChC91HyWFYF - 4fkGwlsRiixRX2IUcxuEnPSCboOGUxbn+vXO7vFrkoviYfzmRDDt2Ddlkm5WJGWLOB7dQaC8o21BgItU - Yk0IcFWCdNiGywFGmT7RdRryXeVG5w1pkQOAOt4Hocp7mmd/i02zvKIuk/GHAuEGL4reH7XM1kJVdLlY - 12VFjOHxQIRtJvJNsq/p7hMJWLt7oq2CtmXVjNIJ6yQGRU7MTLZLoPTXSDFM0HFWYts8LteVUTOD1Mw0 - /C2qkhQB12DxdLNWFoIXpYMdt4wsS3KwLNWve0E9OMoDIadsT+OpqKXHhSF3s1A2SVUZKFUZEBU9gGtw - ohzqNbOGsMjeuhLikOzKjaqM9bpJfQEVZTsZjDciZGU3VypV55V66gFM23b1p6JM5GN5yJupxvGLOWDa - tuvdltRdppfm6cTrLkP/Kd1sSL8jbLKj6g/pKdVTvk2vOlb/TdV1GOjjJjmAG/4iSfWmDYdVsi4LWZNK - I8Da5s0meS6r8bs+mIxtkrJ9Y6eWquwnq9dakKQAbvlX2YPqNGyytNBlhXrNAG3Z1+X+lSztIcu1UV13 - Tk5ZnGUUL3t1VxBULWA5jilL/ZEWZxv120q7sqgfyp2oXhO5S/OcYoZ4K8JDWj+K6gPB2RGWRV18lRYP - gvzTbdB2ynZoou5astVBXW8l8rTOnkT+qntOpBIE0Jb93+m6XGUEYQtYjlyN9Dil2+Jso5AyqR/VrWkU - hjlFDQqQGNTsckjLusvyvFlMtcoK0pAPYgNm1e9pTrRg648CJ0aRqVsuec4240flLmcby017TgujfHgs - aKbmnsV5RlVNNkWGXHX5sOfu+n/v2tuQHwb1YBHZqe/xaARqveSxqFmKdSXqqACmwouTy8dsq4+5ZKaR - xyMRIgME/LtDHtPoYgovDre/6bGgmXMfnzjPeDj/yL5Wi3XM7UG41FE3gMJeaothcrBRdyrmc2ZaIA4/ - UvGO6i3e2ZZD/ttL8wlFdIJcF69lMDnPuC53q/Q3oq6FYNclx3UJuBg5a3KekZ4LcB40+UzvsLso7NVP - ozhSzXlGcpV5ZDwTp8yB5e2FdTu8QPdDqcp00byerIcD5eopKw9SjQZUgdJbEdeUkjPosiMXzWxa37JQ - IrmsZd6Xz7RS1QKWo9LzSrxxoIv63q7P0XyHKjZZ2yw2h7VQSbMmOXsKs+mB7T5PudoT7vhl9jcjbQ3M - 9nU9LbLQ5ADjMb2bf5C9Fg3ZeZcLXK1cp3VNK/VHxPY0jxPI12Vijq9mjxw91jPLWo1T14yrtVHPyxEC - pl/Vpe5+qUQuUkoTYoOAk1j595Drovdcegh2XXJcl4CL3nOxOM9IbcdPjGcil44j45pe2MXjBS0fjNES - PFKy2ldy6gG0ZT9wJ34O+KzPgTsIPeAj0GfyZPozMJvepK5Ok/7BAsXo04a91E9Tpcx1Hbxtn2Y/7tK1 - anPSiw+j348Z0ITjxYcaGeXD+PfacEMfZX2RJZPF7XnyabZMFkutGKsHUMA7u11O/5jOydKOA4x3n/57 - erUkC1vM8D2m6n8XzdGdr+fv331Iyv34nVNhOmSXYnwNB9OGXS8bK5s1ZOtcj5FEoZeLjL5HMb6PsNHJ - dnWlN0C4ni6u5rP75ezudqwfph07r9RtQqWu//DbPVd7JCHr3d3NdHJLd7YcYJzefv82nU+W02uytEcB - 7x/TW/XZzez/Tq+Xs29Tstzh8QjMVLZowD6bfGCaTyRkpdVFG7QuOn1y+/3mhqzTEOCi1WsbrF7rP7ha - Ttl3lwkD7nv19+Xk0w29ZJ3IkJV50Q4PRFhM//V9ens1TSa3P8h6EwbdS6Z2iRiXH8+ZKXEiISunQkBq - geWPe4ZLQYDr++3sz+l8wa5THB6KsLxi/fiOA42fL7mXe0IB75+zxYx/H1i0Y/++/KLA5Q9VqX2+6xpp - UgBIgMX4Ov0xu+bZG9TxHuryvj3U4+v4dzN80rZ+mixmV8nV3a1KromqP0ip4cG2+2o6X84+z65UK31/ - dzO7mk1JdgB3/POb5Hq2WCb3d9Qrd1Dbe/1ln1bpTlKERwY2JYSFgy7nGGdz1d7dzX/Qbw4Hdb2L+5vJ - j+X0ryXNecI8X5e4RF1HYbbkdkKrwhzU8S4mvFvKAgNOcsa7cMg9fptqiPXNh1WerRkJceQ8I/G8LJvC - bIwkNUjUSk7MHvSdi9kfVJtCPA+jGjpCtmt6xbiqE+S67nUEUYtK0nQ95xlZN6HJ4UZqeXHZgJlWZhzU - 9TJulhOEuOg/Hb1T+o+oPxq7T1STMb29nl7rvk7yfTH5g1St+7Rt74bY5ObC5HDjgqt0ehqzxeK7Ipit - pU/b9tvpcnE1uZ8mi/uvkyuK2SZx64wrnTnOu+VMdfemn0m+I2S77r9eLcbPEvcEZKHeQD0F2mi3zgny - Xf+kev4JODg/7p/wb7vkV7cAHvbTE/EyUO82n+upkz+bmkSP6sh6Gx/0s1LIVwzHYaSUZ4CisK4fuWLO - NXpXpUeHP8hZd6Ig27++T254xiPpWMmNO9Sy85p1rE1nNehIa87rwWH9t4jqJFSTsCuRQP3BGTQhI6Y5 - dzQ6x0ej85jR6Dw8Gp1HjEbnwdHonDkanaOjUfMTTjKYbMBMTwQD9bzJ/WKR3E/mk28LotYgASu5Lpoj - o/I5e1Q+D4zK59xR+RwflX9fTOdth5Ei7Cnbpnfxp3j0931DMrn5425O9bQUZFsu57NP35dTuvFIQtbv - f9F93/8CTHo+l6U7gpBTtbR0n4Ig1/yGrprfwCZyT9ICESfxHjM5xEi7vwwM8DVD8gVxnYRNhqwLvnYB - eKkTAycIcNErVAMDfPPpv/5fa+fX5KiNRfH3/Sb7Nk1PZ5LHbG0lldrUZsuTmlcKG2xTxsAg3H/m068k - bIOkewXn4reuhvM7IJAQsjiCYVpDk2R34k3IMCV34lXHEAV34iAjed/++g82qWSqI4jg0OlNQ5C+/Yq3 - MlpDkCTXgC5/Qdk75X4c1gtNrz9a7bPl611SWpfcnNtLX9gVytssN8u3m7iR25Q+xCdOmriqLLWZL+di - +XR1R+SyhhMEAvUc0cgqdunvv10/ItbHv5TmyWhevq0kPC2jefuiKs7mm2cJ9S6OsYfFb5HYkBgj5nS+ - VHILLY6xh+9k5PhBH3NQ3zs5XotjbDMled0VuBFoF/Platp2ham6Eo+pnnYQXlv2qprppNtMFUKo1cbI - /e4oR2sxz15RzBN5hG/fdNedwpQRONWl6s3qhbsmL8y3TVXWmeQU9ObkMIGfKs9tZRfjTN/1w6Xp8rLO - evTKMxTObWXbx1DibsJaTjI4p0PXXNohIvHSvQoL0YPEvdQjvNScl02Z6GUWg5YlqzQzLdzeNHIfQgeH - EXFq6jVlNQFwHjauzyZkySxGfdwByVDg9HEHc0vou33dhSFRUV+VFt8vWbXC7kpwXLK9+eua65TVsAep - pxyG70dx8qCjiLrgbrY4diJ22ehrwVTjkLblob7YdtE2kADPUzLU4cklwg5Sh7viIRd9st3eyd7+++tv - CHMic3jDwwZ7ObprCBJ6v09UBE302I4+q4eNdXGAgVpDkXQ7baJw03OmTjhzqiboQIjuVEOQ4OZiKqN4 - ly0Ou2wJ0vCVpq5JMO+uZKii+4bsd5ke0rRKmrxcFM8yZp3glomHOF52WXl9vrafkbbJy0/p+zm/flma - KvV2ATznYTHv558/33Y3f67zJmALvV+eErt7mnfZvv/05SHH4EPJY7m+N3nHLvCnQUs9zbHKzz0OdI5B - OFDBjk/cO0z6MIYuCUANxTNs+KWcQzg+rRloBftKd41Lsr1h07qYVR0QnCMkmPaxeqlN+XeFUkUOwwMC - 4WKGLiSD1iyA8YBbVl8a5aLjWqR+zgG7D2lA3AOvpRxixseOVa2ysYQlLusLjh1Zu72Jgv2tqYzk9beG - Y3yuKwGfwhB+gv6TK3SZw/UXlIojdJgm26uxXWjbg4arMql3HK5XGns5GkUUy77ooEseMHKKL3phCrQs - GY+eYwGUR1m/flrl4QFIDwWtgBIIKaab94qjXT3lgL2wjiKKBf+C5ugoIlytHR1JhF4vRxHFEjRlnpKh - rrnkTBYjs4O5seWtBotyfYexU5Xtr8ObiJGvdcnDmOn6Sh7jRBwfUpTLiNOjMJMS8iZ9Lbpy/yHszvIM - 30mVhzp9K/ujeaLthqWmTnXzVqdZrd6KTmC8CDk9juG3wB/mhT97fU/uGYfAuySLYHzQhF1SzLChRtfV - MUTd41p3xFNAxMPk563yuAEYj6GrB3WMKPUcHX6Tj0CiXnlzAdZdYwGMx+0efhEZ3NUz9C+r6Fz9WnUn - EXdRnry8PP0i+FnIF4ZMfPjEF47MfZldf6e+2ubvyMwXRh7nK925X74KJU/wXOxQrOT4p0KOCcyVCoQj - 0wTLHewgom7zl/IcEcWyUXU4zcooHpKR7qoomlKqeMZxVubx9PH2cMndRBQLL7lRRvHgkrurKBpecqPM - 5dnRZLDgbhqCBBfbqCJoaKHdRQQLLrJRNdKOp3yPN7KuaqSVSSbNNCSkBBdM7/N1BBFL3PNkBA9LJPJk - U95Omo5JSAkuXJI7tiTzFSmhtNqjS8shj5VDLkwJDZUUFUsJ9XUEUVKj8liNylelhHJ63kFYykxK6H07 - nBIaKikqWjvyWO1AU0IdEcFC26yca7NyeUooKSbYcEpoqIxRhQfNpoTe95CkhJJikv23EPs3Q4RTQkMl - RZU0CEwrgKSEOiKCJUwJ5fSUA5YS6utIIpoSSkgJrigllFZ79DUpoSyA84BSQgmpyxXneZJil70iz5OR - e3xZnichdblonudUQ5OQby99nUeU5XkSUp8L53l6soAHJpS5Ko4GfYdNSD2uJEElEEaY8IXnE1TCzcs/ - w6W0IRlNUPF1ARH80N1VcTRBkZLJId42uDCp5JDbJuDz74kk4AiaoTDP0/wbzvN0RD4Lz/P0dQFRVAnp - PE9/C3q/8HmewVbsnmHzPIeNgspC5Hk6/8ZPna0pkjxPX+cRxXmetNqlS/I8fR1P/CpFej0NeZ4nrXbp - sjzPUMlT/5BC//CYaJ6nI3JZWJ7nqKAoaAWi8jwn/8eqDpHnefv3F5TzhWBITu4LfW6TxMw/6n0jIROI - eR+8QENC1GXlmcyexbozmD36uszXnsEVMe+z7kwGAuEiy1pl5LN8UWnFsla5nQSlFclaHfcRHT9zxJJj - DI4Kzlp1VRQNzVoNlR4V7nhRvS5Zl4vrb4k6W0xPS9a75vrWKxrHWLsobhIjraHkhZZ5m91IRwo2/EjB - Zs1IwSY+UrBZMVKwiY4UbIQjBRt2pECatUppI2S8EMis1etGQdZqqCSocFu0YUZMNuIRk01kxGQjHTHZ - 8CMmeNaqq3JpSNbqbf+QgGWtuiqKhmathkqKujwcdaohSGjWaiCkmEDWqiOiWJs/cdTmT5oE9ySZrFVn - E1jH6KxVZwtWv8isVWdDv1UioNYRRDi9NVTGqF/l2K8EFx0GItJb7//Gm2gyvfW+AUhvnWpokuzeDtNb - nU2SeztIb3W2CO5tP711sgFKb/V1BBEcKA/TW+//BdJbpxqCJLkGdPkLyp4sd0l7ErQlXSFuoDwpzTV3 - jZB7ldJcIdPjNeZHAbwz7cimPCWfAadiM+CUcK6XYud6qTXzqVR8PlUvm/vVc3O/XoW/Jryyvya8Sn9N - eOV+TTjZzyD+h2UVOKIJ619NV9YHvafutH/93vV/vy1ueyhtnPzn8oQORj7h/9UWtdlcZKqpv/Zm739n - fbbYgNFzDt+y6rL8y1pKGycjZUPLR/45/5xuq2Z3SnN9RuYzt2LxxyuUdkp+uW7N1FlEp/WjQzMsh4i2 - lJ5s5LWnnXpK0rIvuqwvm1ql2W5XtH0GfAYXYwRO5gOAw/KL6aoCWrst0qLedR8tFlDJyF3+F/vVoPn4 - tcjtxUDogdhnt1mnivRYZMD9ESpd6s/2jPLCnhECdYQT5nnbN6eiNoniT/rOLOvFH3oSUo67q8qi7u01 - xmMrFqA4X1185Wsx7qz06Re9zJhmcc76VjZ1pUCi7XkC79KnR/uxtvk+WzfgUisPw/mVSl2K7iHXkURx - vp2uCTIbo+SopurKqEbJUS/1ilp0FdPsRF4/kzTKfVj9TJD6mTywfiZQ/UxW189kQf1MHlM/k6X1M3lc - /UyQ+pmI62cSqZ+JuH4mkfqZrKmfSaR+tqqXPj9HKcd9TP3kUZzvg+pnhMU5r6qfAYF3WVs/aQzn95j6 - yaM4X1H9vCs5qqh+3pUcVVo/p+IJu6k+0s13JBFhIhk5JkLOXOGTtrDZR9vLfl+Yd2b9emFegxYf8Dxp - 4ipZbamjV1vq7gsnXfMMgZpFaV2y/jMzn963w4/paa9PU+mzPCMWLIT2sqFFXfYmsbhpOfKPQkb9UbjE - sn7NqjIHW7JQ6VLhT/Mdkcdac8VmrlSwWZSNNU9yXe21lRoFYpe9IuKLkZN8fWeu9fARjs+P9OlT8jk9 - ZP2x6F5s/hZgQagpukmvkpFvSopa64ufdEUuRDtyiq+3JWYnId+RU3y1y/peXuiOnOR/76Toq3KkqqQU - /Rri6wii5NcQUjxhH7OnYOgWCX1hAQs8ktUmyZzL8pAYTj/ngATR8IQ5FyiiJoJwfEza1MprzyHmfaBS - YwjzLuDVYRnzTugV4iGOl1khYOU14hDzPmDpsYyJ00m/ehWLO4rX3R19XeiH9KWqAMZN4nKWr6ky7O2o - 26YF1HpvX42Ww01CctLiXYDSKpd2UUcEo3d39K/mV0UAYPefENp3m+mfLg43HhUuxazbZt4A2qy0WeMd - AgzELlt3pJV+L7gOyJQHBO1rCTIyQOCIKNYJ+VHRkxG8Xt8zJmYPJt6ELlMyXuXreOJtxGz5KANP8F16 - e0b6dTMH6l2gdKnHHr72V0nAGd5mQNIgcll2OcpjVtZwJXKVIXVIphRA78KQKa3wvjYkV9lHIeOOypBq - 7wQJ9C5kmMeiPBx7EXWQMlz4fleR+91u+2gLmKc1HgmsNmGd6e1dtUcgVwnFOeKcI8k5q4MApVUUre0E - 56dFDEt0bIOOIvYnnNafSFIlIFUeqUkvZd3/9BlC3UQeS/DQpJ+XA934VEWN/Q7CyF0+/tignhlvTS/u - H/lamgz2aSYygoc2HneRy3o/K/FZ+1qCjB7lXTSyXpNSNE/V1/HEr1LkV54JvNgQ0gn3Oc1Ml65c3Bsc - FS6l6hFC1Tvq7a6pFaC3+zuEXdtUCMHu7xK6yvxQkgPL7rqqgAa8SY+KgNLZmakgaBD5rByjuFc4L6o+ - M/8GIHeNQyredcfyAmAGgcPQ7+nqWKgePKCpzOGVeQtg9N6uut43iFzv7umP5dYkhNcf0GFMZA7PVNCL - yg7InXzXOKQ6O5tF32rVd5lZvBwA+lKXq9Iye0mrUiHtxkTl0XZFh4GMwGE0O9Waucj6DkGuwVQW8urG - /taN8q4yh6cbrHL3IbwWoZhin7O2LeuDAHxTOlQFVgsV1AsFP5tU8GxqdO9aMOXR15HEVZOp5jik47pp - VLMg0lMyIMXISf6qqUxzHNIRmcTkyUge0g/1ZCQPnLgUKn0qPqXQ15HEB9z/S2YSTvZ8xP2/aA7hZFf5 - /R+ZPTjZ4QH3/5J5fJM98fufmME32YDf/8TcPW/DsIZc2zXN/r4YKD67EoKSxyKqi/QMwtc2K1S62+5u - 3xEthvrCgNl3z8n96yT7Y6MC4QTBdwG/FXJEPktUAszZm/HPqw1URykxxb6Viog9EY/sd+GCZu/sembX - LYcCWWDPEVEs047YZgRd/DKCoHzap/bJDMG1CW4waqPk5xXkZ5L8bLbtMt1VFxT4VE3Rh9bJrEGFs0dt - nAwtNc8CFniYxdtW+xjIjJc6Z1WFLj0/TyJdl6817IgoVt9Aj/xAGDDhSb3v7JqG1y1qB64A7esI4m0V - 615we3jqCf3l0y/fnu33tHYexdBWKvtN+mKPCMN1uk5ltz2vfOhc6AOrttnyd/4ZjOeXlwczfGX7Mll1 - aDq97xmyIgm0y3X6L/KtNCP3+G1nlj+1k7HNGD+U184CPA/7oUFvf3/S+0B0V0pwjalpvft3mDtKXa4Z - FU/KtGyRx7enC4jDc1fbHYt3EDqVBlz72DLDskWtSmDonpGH/KbeD+OH56zX+8IGvj5w0GcFL/FOSANu - 1TQnlVblqUjzWtljAPEE4Z//+D8AMksHMdUEAA== + H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oALS9XXPbuJaofT+/wnXm5kzVrpnY6WSn + 3zvFVjqaOLZHUvp0zg2LkiCLOxSpEJRj968/AEmJ+FgL5FrwW7VrpmPpeRYFgPgiCPzXf108ikJUaS02 + F6uX8z+SVVllxaOUeXKoxDZ7TnYi3YjqP+XuoiwuPjafLha3F+tyv8/q/+/iXXq1WqdXl1e/fXjzZnv1 + 4f3l1fu3v7/7ffVP9fe379ab7eWH33/7ffVv//Zf/3VxXR5equxxV1/87/V/XFy9ufzwj4s/yvIxFxez + Yv2f6iv6Ww+i2mdSZipeXV4cpfiHinZ4+cfFvtxkW/X/02LzX2V1sclkXWWrYy0u6l0mL2S5rX+llbjY + qg/T4kW7DsfqUEpx8Sur1Q+omv9fHuuLrRAXCtmJSuhfX6WFSoh/XByq8inbqCSpd2mt/o+4SFflk9Cm + 9fnai7LO1kJfRRv30F/v6aPDQaTVRVZcpHmuyUzI069bfp5eLO4/Lf/PZD69mC0uHub3f85upjcX/2uy + UP/+XxeTu5vmS5Nvy8/384ub2eL6djL7uriY3N5eKGo+uVvOpgvt+j+z5eeL+fSPyVwh94pSvt59d337 + 7WZ290cDzr4+3M5UlF5wcf9JO75O59ef1V8mH2e3s+X3Jvyn2fJuulj8p3Jc3N1fTP+c3i0vFp+1x7iy + j9OL29nk4+304pP61+Tuu9YtHqbXs8ntP9R1z6fXy38oxem/1Jeu7+8W0//5pnTqOxc3k6+TP/SFNPTp + n80P+zxZLu5V3Ln6eYtvt0v9Mz7N779e3N4v9JVffFtMVYzJcqJplYbqkhf/UNxUXeBcX/dE/e96Obu/ + 0z4FqNDL+URfx930j9vZH9O766lm7xtgeT9X3/226Jh/XEzms4UOev9tqel77WyK8P3d3bT5Tpv6Oj3U + tTRXMZ2rhPg6acSf7Nz4z6b8f7yfK6e6fZLJzU3yMJ9+mv11cUhlLeRF/au8UEWvqLNtJiqpCo8q/GUh + VCbUuoipQr2X+g9alNX6btUlrtxe7NN1VV6I50NaNIVQ/S+r5UVaPR73yicvVkLBogmk7t7//Ld/36g7 + uxDg5fzv9B8Xq/8AP0pm6qfP2y8EHeYXL9KLf//3i0T/H1UHnKnZfbJNVC0DX0P/x/YP/+iB/7AcUtRU + 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 + CcLf//Z/2aoCAcHMBAA= EOF # PrivacyInfo.xcprivacy is not part of BoringSSL repo, inject it during pod installation diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index c1704c68f5d..ba757f7cd54 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -38,7 +38,6 @@ CORE_SOURCE_FILES = [ 'src/core/ext/filters/census/grpc_context.cc', 'src/core/ext/filters/channel_idle/idle_filter_state.cc', 'src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc', - 'src/core/ext/filters/deadline/deadline_filter.cc', 'src/core/ext/filters/fault_injection/fault_injection_filter.cc', 'src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc', 'src/core/ext/filters/http/client/http_client_filter.cc', @@ -998,7 +997,6 @@ CORE_SOURCE_FILES = [ 'third_party/address_sorting/address_sorting.c', 'third_party/address_sorting/address_sorting_posix.c', 'third_party/address_sorting/address_sorting_windows.c', - 'third_party/boringssl-with-bazel/err_data.c', 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c', 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c', 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c', @@ -1089,6 +1087,8 @@ CORE_SOURCE_FILES = [ 'third_party/boringssl-with-bazel/src/crypto/evp/evp.c', 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c', 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dh.c', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.c', 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c', 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c', 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.c', @@ -1230,6 +1230,7 @@ CORE_SOURCE_FILES = [ 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.c', 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c', 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c', + 'third_party/boringssl-with-bazel/src/gen/crypto/err_data.c', 'third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc', 'third_party/boringssl-with-bazel/src/ssl/d1_both.cc', 'third_party/boringssl-with-bazel/src/ssl/d1_lib.cc', @@ -1251,6 +1252,7 @@ CORE_SOURCE_FILES = [ 'third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc', 'third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc', 'third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc', + 'third_party/boringssl-with-bazel/src/ssl/ssl_credential.cc', 'third_party/boringssl-with-bazel/src/ssl/ssl_file.cc', 'third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc', 'third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc', @@ -1415,166 +1417,166 @@ CORE_SOURCE_FILES = [ ASM_SOURCE_FILES = { 'crypto_asm': [ - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/chacha/chacha-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/aesv8-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/armv8-mont-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/bn-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/ghash-neon-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/ghashv8-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/p256-armv8-asm-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/sha1-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/sha256-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/sha512-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/fipsmodule/vpaes-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-aarch64/crypto/test/trampoline-armv8-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/chacha/chacha-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/aesni-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/bn-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/co-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/ghash-ssse3-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/ghash-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/md5-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/sha1-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/sha256-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/sha512-586-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/vpaes-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/fipsmodule/x86-mont-apple.S', - 'third_party/boringssl-with-bazel/apple-x86/crypto/test/trampoline-x86-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/chacha/chacha-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/aesni-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/ghash-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/md5-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/p256-x86_64-asm-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/rdrand-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/rsaz-avx2-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/sha1-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/sha256-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/sha512-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/vpaes-x86_64-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/x86_64-mont-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/fipsmodule/x86_64-mont5-apple.S', - 'third_party/boringssl-with-bazel/apple-x86_64/crypto/test/trampoline-x86_64-apple.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/chacha/chacha-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/aesv8-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/armv8-mont-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/bn-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghash-neon-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/ghashv8-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/p256-armv8-asm-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha1-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha256-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/sha512-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/fipsmodule/vpaes-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-aarch64/crypto/test/trampoline-armv8-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/chacha/chacha-armv4-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/aesv8-armv7-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/armv4-mont-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/bsaes-armv7-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghash-armv4-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/ghashv8-armv7-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha1-armv4-large-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha256-armv4-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/sha512-armv4-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/fipsmodule/vpaes-armv7-linux.S', - 'third_party/boringssl-with-bazel/linux-arm/crypto/test/trampoline-armv4-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/chacha/chacha-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/aesni-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/bn-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/co-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/ghash-ssse3-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/ghash-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/md5-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/sha1-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/sha256-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/sha512-586-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/vpaes-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/fipsmodule/x86-mont-linux.S', - 'third_party/boringssl-with-bazel/linux-x86/crypto/test/trampoline-x86-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/chacha/chacha-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/aesni-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/ghash-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/md5-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/p256-x86_64-asm-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/rdrand-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/rsaz-avx2-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/sha1-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/sha256-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/sha512-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/vpaes-x86_64-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/x86_64-mont-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/fipsmodule/x86_64-mont5-linux.S', - 'third_party/boringssl-with-bazel/linux-x86_64/crypto/test/trampoline-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/crypto/curve25519/asm/x25519-asm-arm.S', 'third_party/boringssl-with-bazel/src/crypto/hrss/asm/poly_rq_mul.S', 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm_asm.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-armv7-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-gcm-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-gcm-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesv8-gcm-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/armv4-mont-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/armv8-mont-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/armv8-mont-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/armv8-mont-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/bsaes-armv7-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/co-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/co-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-armv4-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-neon-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-neon-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-neon-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv7-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-x86_64-asm-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-x86_64-asm-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-armv8-asm-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-armv8-asm-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-armv8-asm-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-x86_64-asm-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-x86_64-asm-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/rdrand-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/rdrand-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/rsaz-avx2-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/rsaz-avx2-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-armv4-large-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-armv4-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-armv4-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-armv7-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86-mont-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86-mont-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont-linux.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont5-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont5-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/aes128gcmsiv-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/aes128gcmsiv-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-armv4-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv4-linux.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv8-apple.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv8-linux.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv8-win.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86-apple.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86-linux.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/third_party/fiat/asm/fiat_curve25519_adx_mul.S', 'third_party/boringssl-with-bazel/src/third_party/fiat/asm/fiat_curve25519_adx_square.S', 'third_party/boringssl-with-bazel/src/third_party/fiat/asm/fiat_p256_adx_mul.S', 'third_party/boringssl-with-bazel/src/third_party/fiat/asm/fiat_p256_adx_sqr.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/chacha/chacha-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/cipher_extra/chacha20_poly1305_armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/aesv8-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/aesv8-gcm-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/armv8-mont-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/bn-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/ghash-neon-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/ghashv8-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/p256-armv8-asm-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/p256_beeu-armv8-asm-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha1-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha256-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/sha512-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/fipsmodule/vpaes-armv8-win.S', - 'third_party/boringssl-with-bazel/win-aarch64/crypto/test/trampoline-armv8-win.S', ], 'crypto_nasm': [ - 'third_party/boringssl-with-bazel/win-x86/crypto/chacha/chacha-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/aesni-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/bn-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/co-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-ssse3-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/ghash-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/md5-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha1-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha256-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/sha512-586-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/vpaes-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/fipsmodule/x86-mont-win.asm', - 'third_party/boringssl-with-bazel/win-x86/crypto/test/trampoline-x86-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/chacha/chacha-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/cipher_extra/aes128gcmsiv-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/cipher_extra/chacha20_poly1305_x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/aesni-gcm-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/aesni-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/ghash-ssse3-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/ghash-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/md5-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/p256-x86_64-asm-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/p256_beeu-x86_64-asm-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/rdrand-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/rsaz-avx2-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/sha1-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/sha256-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/sha512-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/vpaes-x86_64-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/x86_64-mont-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/fipsmodule/x86_64-mont5-win.asm', - 'third_party/boringssl-with-bazel/win-x86_64/crypto/test/trampoline-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/bn-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/co-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256-x86_64-asm-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-x86_64-asm-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/rdrand-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/rsaz-avx2-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha1-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha256-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/sha512-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/vpaes-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86-mont-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont-win.asm', + 'third_party/boringssl-with-bazel/src/gen/bcm/x86_64-mont5-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/aes128gcmsiv-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86-win.asm', + 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86_64-win.asm', ], } diff --git a/src/python/grpcio_observability/observability_lib_deps.py b/src/python/grpcio_observability/observability_lib_deps.py index fe161656970..15bd64b12bc 100644 --- a/src/python/grpcio_observability/observability_lib_deps.py +++ b/src/python/grpcio_observability/observability_lib_deps.py @@ -105,6 +105,7 @@ CC_FILES=[ 'third_party/abseil-cpp/absl/hash/internal/hash.cc', 'third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc', 'third_party/abseil-cpp/absl/log/globals.cc', + 'third_party/abseil-cpp/absl/log/internal/check_op.cc', 'third_party/abseil-cpp/absl/log/internal/conditions.cc', 'third_party/abseil-cpp/absl/log/internal/fnmatch.cc', 'third_party/abseil-cpp/absl/log/internal/globals.cc', diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 6fe258801c9..20a4c934855 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -198,7 +198,7 @@ ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.33' + ss.dependency 'BoringSSL-GRPC', '0.0.34' % for abseil_spec in grpc_abseil_specs: ss.dependency '${abseil_spec}', abseil_version % endfor diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index 0d99cd189a8..7fc56ac912a 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -70,7 +70,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.33' + version = '0.0.34' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -149,7 +149,8 @@ s.subspec 'Interface' do |ss| ss.header_mappings_dir = 'src/include/openssl' ss.private_header_files = 'src/include/openssl/time.h' - ss.source_files = 'src/include/openssl/*.h' + ss.source_files = 'src/include/openssl/*.h', + 'src/include/openssl/**/*.h' end s.subspec 'Implementation' do |ss| ss.header_mappings_dir = 'src' @@ -165,7 +166,7 @@ # We have to include fiat because spake25519 depends on it 'src/third_party/fiat/*.{h,c,cc}', # Include the err_data.c pre-generated in boringssl's master-with-bazel branch - 'err_data.c' + 'src/gen/crypto/err_data.c' ss.private_header_files = 'src/ssl/*.h', 'src/ssl/**/*.h', diff --git a/test/core/channel/minimal_stack_is_minimal_test.cc b/test/core/channel/minimal_stack_is_minimal_test.cc index 898048186c0..44193d7f1ca 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.cc +++ b/test/core/channel/minimal_stack_is_minimal_test.cc @@ -138,29 +138,29 @@ TEST(ChannelStackFilters, LooksAsExpected) { // tests with a default stack - EXPECT_EQ(MakeStack("unknown", no_args, GRPC_CLIENT_DIRECT_CHANNEL), - std::vector( - {"authority", "message_size", "deadline", "connected"})); + EXPECT_EQ( + MakeStack("unknown", no_args, GRPC_CLIENT_DIRECT_CHANNEL), + std::vector({"authority", "message_size", "connected"})); EXPECT_EQ( MakeStack("unknown", no_args, GRPC_CLIENT_SUBCHANNEL), std::vector({"authority", "message_size", "connected"})); EXPECT_EQ(MakeStack("unknown", no_args, GRPC_SERVER_CHANNEL), - std::vector({"server", "message_size", "deadline", - "server_call_tracer", "connected"})); + std::vector( + {"server", "message_size", "server_call_tracer", "connected"})); EXPECT_EQ( MakeStack("chttp2", no_args, GRPC_CLIENT_DIRECT_CHANNEL), - std::vector({"authority", "message_size", "deadline", - "http-client", "compression", "connected"})); + std::vector({"authority", "message_size", "http-client", + "compression", "connected"})); EXPECT_EQ( MakeStack("chttp2", no_args, GRPC_CLIENT_SUBCHANNEL), std::vector({"authority", "message_size", "http-client", "compression", "connected"})); EXPECT_EQ(MakeStack("chttp2", no_args, GRPC_SERVER_CHANNEL), - std::vector({"server", "message_size", "deadline", - "http-server", "compression", - "server_call_tracer", "connected"})); + std::vector({"server", "message_size", "http-server", + "compression", "server_call_tracer", + "connected"})); EXPECT_EQ(MakeStack(nullptr, no_args, GRPC_CLIENT_CHANNEL), std::vector({"client_idle", "client-channel"})); } diff --git a/test/core/end2end/end2end_tests.h b/test/core/end2end/end2end_tests.h index 737badb909b..4575d432594 100644 --- a/test/core/end2end/end2end_tests.h +++ b/test/core/end2end/end2end_tests.h @@ -181,6 +181,36 @@ class CoreEnd2endTest : public ::testing::Test { void* p; }; + // Safe notification to use for core e2e tests. + // Since when we're fuzzing we don't run background threads, the normal + // Notification type isn't safe to wait on (for some background timer to fire + // for instance...), consequently we need to use this. + class TestNotification { + public: + explicit TestNotification(CoreEnd2endTest* test) : test_(test) {} + + void WaitForNotificationWithTimeout(absl::Duration wait_time) { + if (g_is_fuzzing_core_e2e_tests) { + Timestamp end = Timestamp::Now() + Duration::NanosecondsRoundUp( + ToInt64Nanoseconds(wait_time)); + while (true) { + if (base_.HasBeenNotified()) return; + auto now = Timestamp::Now(); + if (now >= end) return; + test_->step_fn_(now - end); + } + } else { + base_.WaitForNotificationWithTimeout(wait_time); + } + } + + void Notify() { base_.Notify(); } + + private: + Notification base_; + CoreEnd2endTest* const test_; + }; + // CallBuilder - results in a call to either grpc_channel_create_call or // grpc_channel_create_registered_call. // Affords a fluent interface to specify optional arguments. @@ -753,7 +783,14 @@ class CoreEnd2endTest : public ::testing::Test { cq_, g_is_fuzzing_core_e2e_tests ? CqVerifier::FailUsingGprCrashWithStdio : CqVerifier::FailUsingGprCrash, - std::move(step_fn_)); + step_fn_ == nullptr + ? nullptr + : absl::AnyInvocable( + [this]( + grpc_event_engine::experimental::EventEngine::Duration + d) { step_fn_(d); })); } return *cq_verifier_; } diff --git a/test/core/end2end/tests/http2_stats.cc b/test/core/end2end/tests/http2_stats.cc index 482024f46e8..f0421d67dd0 100644 --- a/test/core/end2end/tests/http2_stats.cc +++ b/test/core/end2end/tests/http2_stats.cc @@ -57,8 +57,8 @@ namespace grpc_core { namespace { Mutex* g_mu; -Notification* g_client_call_ended_notify; -Notification* g_server_call_ended_notify; +CoreEnd2endTest::TestNotification* g_client_call_ended_notify; +CoreEnd2endTest::TestNotification* g_server_call_ended_notify; class FakeCallTracer : public ClientCallTracer { public: @@ -197,8 +197,8 @@ CORE_END2END_TEST(Http2FullstackSingleHopTest, StreamStats) { GTEST_SKIP() << "Test needs http2_stats_fix experiment to be enabled"; } g_mu = new Mutex(); - g_client_call_ended_notify = new Notification(); - g_server_call_ended_notify = new Notification(); + g_client_call_ended_notify = new CoreEnd2endTest::TestNotification(this); + g_server_call_ended_notify = new CoreEnd2endTest::TestNotification(this); GlobalStatsPluginRegistry::RegisterStatsPlugin( std::make_shared()); auto send_from_client = RandomSlice(10); diff --git a/test/core/xds/xds_client_test.cc b/test/core/xds/xds_client_test.cc index 0b2ea9e864b..bc4959cc5c4 100644 --- a/test/core/xds/xds_client_test.cc +++ b/test/core/xds/xds_client_test.cc @@ -627,10 +627,12 @@ class XdsClientTest : public ::testing::Test { uint64_t>; using ServerFailureMap = std::map; - const ResourceUpdateMap& resource_updates_valid() const { + ResourceUpdateMap resource_updates_valid() const { + MutexLock lock(&mu_); return resource_updates_valid_; } - const ResourceUpdateMap& resource_updates_invalid() const { + ResourceUpdateMap resource_updates_invalid() const { + MutexLock lock(&mu_); return resource_updates_invalid_; } const ServerFailureMap& server_failures() const { return server_failures_; } @@ -640,6 +642,7 @@ class XdsClientTest : public ::testing::Test { absl::string_view resource_type, uint64_t num_resources_valid, uint64_t num_resources_invalid) override { + MutexLock lock(&mu_); auto key = std::make_pair(std::string(xds_server), std::string(resource_type)); if (num_resources_valid > 0) { @@ -651,12 +654,14 @@ class XdsClientTest : public ::testing::Test { } void ReportServerFailure(absl::string_view xds_server) override { + MutexLock lock(&mu_); ++server_failures_[std::string(xds_server)]; } - ResourceUpdateMap resource_updates_valid_; - ResourceUpdateMap resource_updates_invalid_; - ServerFailureMap server_failures_; + mutable Mutex mu_; + ResourceUpdateMap resource_updates_valid_ ABSL_GUARDED_BY(mu_); + ResourceUpdateMap resource_updates_invalid_ ABSL_GUARDED_BY(mu_); + ServerFailureMap server_failures_ ABSL_GUARDED_BY(mu_); }; using ResourceCounts = diff --git a/third_party/boringssl-with-bazel b/third_party/boringssl-with-bazel index e14d29f68c2..5a2bca21248 160000 --- a/third_party/boringssl-with-bazel +++ b/third_party/boringssl-with-bazel @@ -1 +1 @@ -Subproject commit e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df +Subproject commit 5a2bca2124800f2861263959b72bc35cdf18949b diff --git a/tools/doxygen/Doxyfile.c++.internal b/tools/doxygen/Doxyfile.c++.internal index fed5efe10ac..87f43bfb161 100644 --- a/tools/doxygen/Doxyfile.c++.internal +++ b/tools/doxygen/Doxyfile.c++.internal @@ -1131,8 +1131,6 @@ src/core/ext/filters/channel_idle/idle_filter_state.cc \ src/core/ext/filters/channel_idle/idle_filter_state.h \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h \ -src/core/ext/filters/deadline/deadline_filter.cc \ -src/core/ext/filters/deadline/deadline_filter.h \ src/core/ext/filters/fault_injection/fault_injection_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_filter.h \ src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc \ diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 2d4d6c2f084..06fbb0305b5 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -936,8 +936,6 @@ src/core/ext/filters/channel_idle/idle_filter_state.cc \ src/core/ext/filters/channel_idle/idle_filter_state.h \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.cc \ src/core/ext/filters/channel_idle/legacy_channel_idle_filter.h \ -src/core/ext/filters/deadline/deadline_filter.cc \ -src/core/ext/filters/deadline/deadline_filter.h \ src/core/ext/filters/fault_injection/fault_injection_filter.cc \ src/core/ext/filters/fault_injection/fault_injection_filter.h \ src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc \ diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index 872a988c37f..23ca962847a 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -28,7 +28,7 @@ cat <"$want_submodules" third_party/abseil-cpp 4a2c63365eff8823a5221db86ef490e828306f9d third_party/benchmark 344117638c8ff7e239044fd0fa7085839fc03021 third_party/bloaty 60209eb1ccc34d5deefb002d1b7f37545204f7f2 -third_party/boringssl-with-bazel e14d29f68c2d1b02e06f10c83b9b8ea4d061f8df +third_party/boringssl-with-bazel 5a2bca2124800f2861263959b72bc35cdf18949b third_party/cares/cares 6360e96b5cf8e5980c887ce58ef727e53d77243a third_party/envoy-api 78f198cf96ecdc7120ef640406770aa01af775c4 third_party/googleapis 2f9af297c84c55c8b871ba4495e01ade42476c92