grpc 1.41.1 → 1.42.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +55 -43
- data/include/grpc/event_engine/event_engine.h +82 -42
- data/include/grpc/event_engine/internal/memory_allocator_impl.h +98 -0
- data/include/grpc/event_engine/memory_allocator.h +210 -0
- data/include/grpc/grpc.h +4 -0
- data/include/grpc/grpc_security.h +18 -0
- data/include/grpc/grpc_security_constants.h +1 -0
- data/include/grpc/impl/codegen/port_platform.h +7 -0
- data/src/core/ext/filters/client_channel/backend_metric.cc +18 -19
- data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
- data/src/core/ext/filters/client_channel/client_channel.cc +187 -252
- data/src/core/ext/filters/client_channel/client_channel.h +74 -27
- data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -14
- data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -5
- data/src/core/ext/filters/client_channel/connector.h +18 -18
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +1 -1
- data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +12 -11
- data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -15
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +166 -82
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +4 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +23 -7
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -10
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2502 -0
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -1
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +7 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +8 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +7 -16
- data/src/core/ext/filters/client_channel/lb_policy.h +11 -1
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +11 -5
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +12 -39
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +21 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +6 -2
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +3 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +77 -68
- data/src/core/ext/filters/client_channel/resolver.h +1 -1
- data/src/core/ext/filters/client_channel/resolver_factory.h +2 -0
- data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -8
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +1 -1
- data/src/core/ext/filters/client_channel/retry_filter.cc +48 -86
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
- data/src/core/ext/filters/client_channel/server_address.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
- data/src/core/ext/filters/client_channel/subchannel.cc +85 -143
- data/src/core/ext/filters/client_channel/subchannel.h +29 -49
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
- data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
- data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
- data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
- data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
- data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -19
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -1
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +41 -44
- data/src/core/ext/filters/http/client_authority_filter.cc +14 -15
- data/src/core/ext/filters/http/http_filters_plugin.cc +53 -71
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +17 -12
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +1 -1
- data/src/core/ext/filters/http/server/http_server_filter.cc +72 -69
- data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
- data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/{filters/client_channel → service_config}/service_config.cc +2 -2
- data/src/core/ext/{filters/client_channel → service_config}/service_config.h +4 -4
- data/src/core/ext/service_config/service_config_call_data.h +72 -0
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.cc +3 -3
- data/src/core/ext/{filters/client_channel → service_config}/service_config_parser.h +8 -6
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +2 -5
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +19 -24
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +27 -50
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +14 -16
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +59 -58
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +19 -16
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -4
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +41 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +8 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +136 -98
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -8
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +12 -25
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +37 -30
- data/src/core/ext/transport/chttp2/transport/internal.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -173
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +1 -1
- data/src/core/ext/transport/chttp2/transport/writing.cc +29 -22
- data/src/core/ext/transport/inproc/inproc_transport.cc +105 -109
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +68 -34
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +139 -1
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +16 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +53 -4
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +3 -2
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +15 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +13 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +23 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +0 -1
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +14 -11
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +17 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +15 -12
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +49 -19
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +55 -0
- data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +154 -0
- data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +0 -2
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +182 -0
- data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +58 -0
- data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +130 -0
- data/src/core/ext/upb-generated/{udpa/type/v1 → xds/type/v3}/typed_struct.upb.c +7 -7
- data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +83 -0
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +310 -286
- data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +101 -88
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +59 -56
- data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +59 -46
- data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +78 -82
- data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +323 -316
- data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +19 -23
- data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +4 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +5 -3
- data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +5 -4
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
- data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +13 -12
- data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +25 -24
- data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +16 -15
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +17 -16
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +33 -32
- data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +19 -18
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +45 -0
- data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
- data/src/core/ext/xds/xds_api.cc +325 -362
- data/src/core/ext/xds/xds_api.h +134 -82
- data/src/core/ext/xds/xds_bootstrap.h +10 -0
- data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +113 -0
- data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
- data/src/core/ext/xds/xds_client.cc +527 -314
- data/src/core/ext/xds/xds_client.h +42 -37
- data/src/core/ext/xds/xds_client_stats.h +1 -1
- data/src/core/ext/xds/xds_server_config_fetcher.cc +5 -7
- data/src/core/lib/address_utils/parse_address.cc +2 -0
- data/src/core/lib/avl/avl.cc +5 -5
- data/src/core/lib/backoff/backoff.cc +1 -1
- data/src/core/lib/channel/channel_args.cc +24 -6
- data/src/core/lib/channel/channel_args.h +9 -0
- data/src/core/lib/channel/channel_stack_builder.cc +3 -3
- data/src/core/lib/channel/channel_trace.cc +1 -1
- data/src/core/lib/channel/channel_trace.h +1 -1
- data/src/core/lib/channel/channelz.cc +3 -3
- data/src/core/lib/channel/channelz.h +2 -2
- data/src/core/lib/channel/channelz_registry.cc +1 -1
- data/src/core/lib/channel/channelz_registry.h +1 -1
- data/src/core/lib/channel/connected_channel.cc +1 -3
- data/src/core/lib/channel/connected_channel.h +1 -2
- data/src/core/lib/compression/compression.cc +2 -2
- data/src/core/lib/compression/compression_args.cc +6 -4
- data/src/core/lib/compression/compression_internal.cc +2 -2
- data/src/core/lib/compression/compression_internal.h +1 -1
- data/src/core/lib/config/core_configuration.cc +44 -2
- data/src/core/lib/config/core_configuration.h +39 -1
- data/src/core/lib/debug/stats.cc +1 -1
- data/src/core/lib/debug/stats_data.cc +13 -13
- data/src/core/lib/gpr/atm.cc +1 -1
- data/src/core/lib/gpr/cpu_posix.cc +1 -1
- data/src/core/lib/gpr/string.cc +2 -2
- data/src/core/lib/gpr/tls.h +1 -1
- data/src/core/lib/gpr/useful.h +79 -32
- data/src/core/lib/gprpp/arena.h +10 -0
- data/src/core/lib/gprpp/bitset.h +38 -16
- data/src/core/lib/gprpp/chunked_vector.h +211 -0
- data/src/core/lib/gprpp/construct_destruct.h +1 -1
- data/src/core/lib/gprpp/match.h +1 -1
- data/src/core/lib/gprpp/memory.h +6 -0
- data/src/core/lib/gprpp/overload.h +1 -1
- data/src/core/lib/gprpp/status_helper.cc +23 -3
- data/src/core/lib/gprpp/status_helper.h +12 -1
- data/src/core/lib/gprpp/table.h +411 -0
- data/src/core/lib/http/httpcli.cc +200 -182
- data/src/core/lib/http/parser.cc +2 -2
- data/src/core/lib/iomgr/call_combiner.cc +28 -10
- data/src/core/lib/iomgr/combiner.cc +6 -21
- data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -6
- data/src/core/lib/iomgr/error.cc +113 -52
- data/src/core/lib/iomgr/error.h +50 -9
- data/src/core/lib/iomgr/error_cfstream.cc +5 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
- data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
- data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
- data/src/core/lib/iomgr/event_engine/closure.h +10 -1
- data/src/core/lib/iomgr/event_engine/endpoint.cc +3 -3
- data/src/core/lib/iomgr/event_engine/iomgr.cc +1 -1
- data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
- data/src/core/lib/iomgr/event_engine/resolver.cc +10 -7
- data/src/core/lib/iomgr/event_engine/tcp.cc +9 -8
- data/src/core/lib/iomgr/event_engine/timer.cc +7 -2
- data/src/core/lib/iomgr/exec_ctx.cc +1 -9
- data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
- data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
- data/src/core/lib/iomgr/executor.cc +6 -20
- data/src/core/lib/iomgr/iomgr.cc +3 -1
- data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
- data/src/core/lib/iomgr/iomgr_internal.h +3 -2
- data/src/core/lib/iomgr/load_file.cc +2 -2
- data/src/core/lib/iomgr/lockfree_event.cc +18 -0
- data/src/core/lib/iomgr/pollset_custom.cc +1 -1
- data/src/core/lib/iomgr/pollset_custom.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +5 -7
- data/src/core/lib/iomgr/resource_quota.cc +13 -11
- data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
- data/src/core/lib/iomgr/socket_mutator.cc +2 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -3
- data/src/core/lib/iomgr/tcp_client_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +9 -18
- data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
- data/src/core/lib/iomgr/tcp_posix.cc +4 -5
- data/src/core/lib/iomgr/tcp_server_custom.cc +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.cc +3 -4
- data/src/core/lib/iomgr/tcp_server_windows.cc +4 -5
- data/src/core/lib/iomgr/tcp_windows.cc +2 -2
- data/src/core/lib/iomgr/timer_generic.cc +13 -13
- data/src/core/lib/iomgr/timer_heap.cc +1 -1
- data/src/core/lib/json/json_util.cc +68 -0
- data/src/core/lib/json/json_util.h +57 -99
- data/src/core/lib/json/json_writer.cc +0 -3
- data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
- data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
- data/src/core/lib/security/authorization/evaluate_args.cc +14 -12
- data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +13 -1
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/credentials.cc +4 -2
- data/src/core/lib/security/credentials/credentials.h +6 -1
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +47 -11
- data/src/core/lib/security/credentials/external/external_account_credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -9
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +2 -2
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/security_connector.cc +9 -4
- data/src/core/lib/security/security_connector/security_connector.h +1 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +1 -1
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +1 -0
- data/src/core/lib/security/security_connector/tls/tls_security_connector.h +0 -2
- data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
- data/src/core/lib/security/transport/security_handshaker.cc +73 -43
- data/src/core/lib/security/transport/server_auth_filter.cc +3 -5
- data/src/core/lib/security/transport/tsi_error.cc +3 -5
- data/src/core/lib/slice/slice.cc +0 -16
- data/src/core/lib/slice/slice_api.cc +39 -0
- data/src/core/lib/slice/slice_buffer.cc +5 -5
- data/src/core/lib/slice/slice_intern.cc +8 -13
- data/src/core/lib/slice/slice_internal.h +1 -244
- data/src/core/lib/slice/slice_refcount.cc +17 -0
- data/src/core/lib/slice/slice_refcount.h +121 -0
- data/src/core/lib/slice/slice_refcount_base.h +173 -0
- data/src/core/lib/slice/slice_split.cc +100 -0
- data/src/core/lib/slice/slice_split.h +40 -0
- data/src/core/lib/slice/slice_string_helpers.cc +0 -83
- data/src/core/lib/slice/slice_string_helpers.h +0 -11
- data/src/core/lib/slice/static_slice.cc +529 -0
- data/src/core/lib/slice/static_slice.h +331 -0
- data/src/core/lib/surface/builtins.cc +49 -0
- data/src/core/{ext/filters/workarounds/workaround_cronet_compression_filter.h → lib/surface/builtins.h} +8 -9
- data/src/core/lib/surface/call.cc +103 -120
- data/src/core/lib/surface/call.h +0 -6
- data/src/core/lib/surface/channel.cc +19 -32
- data/src/core/lib/surface/channel.h +0 -9
- data/src/core/lib/surface/channel_init.cc +23 -76
- data/src/core/lib/surface/channel_init.h +52 -44
- data/src/core/lib/surface/completion_queue.cc +6 -5
- data/src/core/lib/surface/init.cc +0 -39
- data/src/core/lib/surface/init_secure.cc +17 -14
- data/src/core/lib/surface/lame_client.cc +18 -11
- data/src/core/lib/surface/lame_client.h +1 -1
- data/src/core/lib/surface/server.cc +25 -17
- data/src/core/lib/surface/server.h +17 -10
- data/src/core/lib/surface/validate_metadata.cc +5 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -1
- data/src/core/lib/transport/error_utils.cc +42 -17
- data/src/core/lib/transport/error_utils.h +1 -1
- data/src/core/lib/transport/metadata.cc +31 -10
- data/src/core/lib/transport/metadata.h +2 -1
- data/src/core/lib/transport/metadata_batch.cc +35 -371
- data/src/core/lib/transport/metadata_batch.h +905 -71
- data/src/core/lib/transport/parsed_metadata.h +263 -0
- data/src/core/lib/transport/pid_controller.cc +4 -4
- data/src/core/lib/transport/static_metadata.cc +714 -846
- data/src/core/lib/transport/static_metadata.h +115 -379
- data/src/core/lib/transport/status_metadata.cc +1 -0
- data/src/core/lib/transport/transport.cc +4 -5
- data/src/core/lib/transport/transport_op_string.cc +40 -20
- data/src/core/plugin_registry/grpc_plugin_registry.cc +64 -43
- data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
- data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
- data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
- data/src/core/tsi/fake_transport_security.cc +15 -7
- data/src/core/tsi/local_transport_security.cc +36 -73
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -3
- data/src/core/tsi/ssl_transport_security.cc +10 -2
- data/src/core/tsi/transport_security.cc +12 -0
- data/src/core/tsi/transport_security.h +16 -1
- data/src/core/tsi/transport_security_interface.h +26 -0
- data/src/ruby/ext/grpc/extconf.rb +12 -9
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +4 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +6 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -2
- data/src/ruby/spec/client_server_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
- data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +11 -6
- data/third_party/address_sorting/address_sorting_posix.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
- data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
- data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
- data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
- data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
- data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
- data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
- data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +72 -45
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +2 -2
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +479 -15
- data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
- data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
- data/third_party/re2/re2/compile.cc +91 -109
- data/third_party/re2/re2/dfa.cc +27 -39
- data/third_party/re2/re2/filtered_re2.cc +18 -2
- data/third_party/re2/re2/filtered_re2.h +10 -5
- data/third_party/re2/re2/nfa.cc +1 -1
- data/third_party/re2/re2/parse.cc +42 -23
- data/third_party/re2/re2/perl_groups.cc +34 -34
- data/third_party/re2/re2/prefilter.cc +3 -2
- data/third_party/re2/re2/prog.cc +182 -4
- data/third_party/re2/re2/prog.h +28 -9
- data/third_party/re2/re2/re2.cc +87 -118
- data/third_party/re2/re2/re2.h +156 -141
- data/third_party/re2/re2/regexp.cc +12 -5
- data/third_party/re2/re2/regexp.h +8 -2
- data/third_party/re2/re2/set.cc +31 -9
- data/third_party/re2/re2/set.h +9 -4
- data/third_party/re2/re2/simplify.cc +11 -3
- data/third_party/re2/re2/tostring.cc +1 -1
- data/third_party/re2/re2/walker-inl.h +1 -1
- data/third_party/re2/util/mutex.h +2 -2
- data/third_party/re2/util/pcre.h +3 -3
- metadata +78 -66
- data/include/grpc/event_engine/slice_allocator.h +0 -71
- data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
- data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
- data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
- data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
- data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
- data/src/core/ext/transport/chttp2/client/authority.h +0 -36
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
- data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
- data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
- data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
- data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
- data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
- data/src/core/lib/iomgr/udp_server.cc +0 -747
- data/src/core/lib/iomgr/udp_server.h +0 -103
- data/src/core/lib/transport/authority_override.cc +0 -40
- data/src/core/lib/transport/authority_override.h +0 -37
@@ -44,12 +44,12 @@
|
|
44
44
|
|
45
45
|
namespace re2 {
|
46
46
|
|
47
|
-
//
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
47
|
+
// Controls the maximum repeat count permitted by the parser.
|
48
|
+
static int maximum_repeat_count = 1000;
|
49
|
+
|
50
|
+
void Regexp::FUZZING_ONLY_set_maximum_repeat_count(int i) {
|
51
|
+
maximum_repeat_count = i;
|
52
|
+
}
|
53
53
|
|
54
54
|
// Regular expression parse state.
|
55
55
|
// The list of parsed regexps so far is maintained as a vector of
|
@@ -568,7 +568,9 @@ int RepetitionWalker::ShortVisit(Regexp* re, int parent_arg) {
|
|
568
568
|
bool Regexp::ParseState::PushRepetition(int min, int max,
|
569
569
|
const StringPiece& s,
|
570
570
|
bool nongreedy) {
|
571
|
-
if ((max != -1 && max < min) ||
|
571
|
+
if ((max != -1 && max < min) ||
|
572
|
+
min > maximum_repeat_count ||
|
573
|
+
max > maximum_repeat_count) {
|
572
574
|
status_->set_code(kRegexpRepeatSize);
|
573
575
|
status_->set_error_arg(s);
|
574
576
|
return false;
|
@@ -591,7 +593,7 @@ bool Regexp::ParseState::PushRepetition(int min, int max,
|
|
591
593
|
stacktop_ = re;
|
592
594
|
if (min >= 2 || max >= 2) {
|
593
595
|
RepetitionWalker w;
|
594
|
-
if (w.Walk(stacktop_,
|
596
|
+
if (w.Walk(stacktop_, maximum_repeat_count) == 0) {
|
595
597
|
status_->set_code(kRegexpRepeatSize);
|
596
598
|
status_->set_error_arg(s);
|
597
599
|
return false;
|
@@ -685,7 +687,7 @@ bool Regexp::ParseState::DoRightParen() {
|
|
685
687
|
if ((r1 = stacktop_) == NULL ||
|
686
688
|
(r2 = r1->down_) == NULL ||
|
687
689
|
r2->op() != kLeftParen) {
|
688
|
-
status_->set_code(
|
690
|
+
status_->set_code(kRegexpUnexpectedParen);
|
689
691
|
status_->set_error_arg(whole_regexp_);
|
690
692
|
return false;
|
691
693
|
}
|
@@ -1407,13 +1409,15 @@ static int StringPieceToRune(Rune *r, StringPiece *sp, RegexpStatus* status) {
|
|
1407
1409
|
}
|
1408
1410
|
}
|
1409
1411
|
|
1410
|
-
status
|
1411
|
-
|
1412
|
+
if (status != NULL) {
|
1413
|
+
status->set_code(kRegexpBadUTF8);
|
1414
|
+
status->set_error_arg(StringPiece());
|
1415
|
+
}
|
1412
1416
|
return -1;
|
1413
1417
|
}
|
1414
1418
|
|
1415
|
-
//
|
1416
|
-
// If not,
|
1419
|
+
// Returns whether name is valid UTF-8.
|
1420
|
+
// If not, sets status to kRegexpBadUTF8.
|
1417
1421
|
static bool IsValidUTF8(const StringPiece& s, RegexpStatus* status) {
|
1418
1422
|
StringPiece t = s;
|
1419
1423
|
Rune r;
|
@@ -2011,19 +2015,34 @@ bool Regexp::ParseState::ParseCharClass(StringPiece* s,
|
|
2011
2015
|
return true;
|
2012
2016
|
}
|
2013
2017
|
|
2014
|
-
//
|
2015
|
-
// PCRE limits names to 32 bytes.
|
2016
|
-
// Python rejects names starting with digits.
|
2017
|
-
// We don't enforce either of those.
|
2018
|
+
// Returns whether name is a valid capture name.
|
2018
2019
|
static bool IsValidCaptureName(const StringPiece& name) {
|
2019
2020
|
if (name.empty())
|
2020
2021
|
return false;
|
2021
|
-
|
2022
|
-
|
2023
|
-
|
2024
|
-
|
2025
|
-
|
2026
|
-
|
2022
|
+
|
2023
|
+
// Historically, we effectively used [0-9A-Za-z_]+ to validate; that
|
2024
|
+
// followed Python 2 except for not restricting the first character.
|
2025
|
+
// As of Python 3, Unicode characters beyond ASCII are also allowed;
|
2026
|
+
// accordingly, we permit the Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd and
|
2027
|
+
// Pc categories, but again without restricting the first character.
|
2028
|
+
// Also, Unicode normalization (e.g. NFKC) isn't performed: Python 3
|
2029
|
+
// performs it for identifiers, but seemingly not for capture names;
|
2030
|
+
// if they start doing that for capture names, we won't follow suit.
|
2031
|
+
static const CharClass* const cc = []() {
|
2032
|
+
CharClassBuilder ccb;
|
2033
|
+
for (StringPiece group :
|
2034
|
+
{"Lu", "Ll", "Lt", "Lm", "Lo", "Nl", "Mn", "Mc", "Nd", "Pc"})
|
2035
|
+
AddUGroup(&ccb, LookupGroup(group, unicode_groups, num_unicode_groups),
|
2036
|
+
+1, Regexp::NoParseFlags);
|
2037
|
+
return ccb.GetCharClass();
|
2038
|
+
}();
|
2039
|
+
|
2040
|
+
StringPiece t = name;
|
2041
|
+
Rune r;
|
2042
|
+
while (!t.empty()) {
|
2043
|
+
if (StringPieceToRune(&r, &t, NULL) < 0)
|
2044
|
+
return false;
|
2045
|
+
if (cc->Contains(r))
|
2027
2046
|
continue;
|
2028
2047
|
return false;
|
2029
2048
|
}
|
@@ -20,12 +20,12 @@ static const URange16 code3[] = { /* \w */
|
|
20
20
|
{ 0x61, 0x7a },
|
21
21
|
};
|
22
22
|
const UGroup perl_groups[] = {
|
23
|
-
{ "\\d", +1, code1, 1 },
|
24
|
-
{ "\\D", -1, code1, 1 },
|
25
|
-
{ "\\s", +1, code2, 3 },
|
26
|
-
{ "\\S", -1, code2, 3 },
|
27
|
-
{ "\\w", +1, code3, 4 },
|
28
|
-
{ "\\W", -1, code3, 4 },
|
23
|
+
{ "\\d", +1, code1, 1, 0, 0 },
|
24
|
+
{ "\\D", -1, code1, 1, 0, 0 },
|
25
|
+
{ "\\s", +1, code2, 3, 0, 0 },
|
26
|
+
{ "\\S", -1, code2, 3, 0, 0 },
|
27
|
+
{ "\\w", +1, code3, 4, 0, 0 },
|
28
|
+
{ "\\W", -1, code3, 4, 0, 0 },
|
29
29
|
};
|
30
30
|
const int num_perl_groups = 6;
|
31
31
|
static const URange16 code4[] = { /* [:alnum:] */
|
@@ -85,34 +85,34 @@ static const URange16 code17[] = { /* [:xdigit:] */
|
|
85
85
|
{ 0x61, 0x66 },
|
86
86
|
};
|
87
87
|
const UGroup posix_groups[] = {
|
88
|
-
{ "[:alnum:]", +1, code4, 3 },
|
89
|
-
{ "[:^alnum:]", -1, code4, 3 },
|
90
|
-
{ "[:alpha:]", +1, code5, 2 },
|
91
|
-
{ "[:^alpha:]", -1, code5, 2 },
|
92
|
-
{ "[:ascii:]", +1, code6, 1 },
|
93
|
-
{ "[:^ascii:]", -1, code6, 1 },
|
94
|
-
{ "[:blank:]", +1, code7, 2 },
|
95
|
-
{ "[:^blank:]", -1, code7, 2 },
|
96
|
-
{ "[:cntrl:]", +1, code8, 2 },
|
97
|
-
{ "[:^cntrl:]", -1, code8, 2 },
|
98
|
-
{ "[:digit:]", +1, code9, 1 },
|
99
|
-
{ "[:^digit:]", -1, code9, 1 },
|
100
|
-
{ "[:graph:]", +1, code10, 1 },
|
101
|
-
{ "[:^graph:]", -1, code10, 1 },
|
102
|
-
{ "[:lower:]", +1, code11, 1 },
|
103
|
-
{ "[:^lower:]", -1, code11, 1 },
|
104
|
-
{ "[:print:]", +1, code12, 1 },
|
105
|
-
{ "[:^print:]", -1, code12, 1 },
|
106
|
-
{ "[:punct:]", +1, code13, 4 },
|
107
|
-
{ "[:^punct:]", -1, code13, 4 },
|
108
|
-
{ "[:space:]", +1, code14, 2 },
|
109
|
-
{ "[:^space:]", -1, code14, 2 },
|
110
|
-
{ "[:upper:]", +1, code15, 1 },
|
111
|
-
{ "[:^upper:]", -1, code15, 1 },
|
112
|
-
{ "[:word:]", +1, code16, 4 },
|
113
|
-
{ "[:^word:]", -1, code16, 4 },
|
114
|
-
{ "[:xdigit:]", +1, code17, 3 },
|
115
|
-
{ "[:^xdigit:]", -1, code17, 3 },
|
88
|
+
{ "[:alnum:]", +1, code4, 3, 0, 0 },
|
89
|
+
{ "[:^alnum:]", -1, code4, 3, 0, 0 },
|
90
|
+
{ "[:alpha:]", +1, code5, 2, 0, 0 },
|
91
|
+
{ "[:^alpha:]", -1, code5, 2, 0, 0 },
|
92
|
+
{ "[:ascii:]", +1, code6, 1, 0, 0 },
|
93
|
+
{ "[:^ascii:]", -1, code6, 1, 0, 0 },
|
94
|
+
{ "[:blank:]", +1, code7, 2, 0, 0 },
|
95
|
+
{ "[:^blank:]", -1, code7, 2, 0, 0 },
|
96
|
+
{ "[:cntrl:]", +1, code8, 2, 0, 0 },
|
97
|
+
{ "[:^cntrl:]", -1, code8, 2, 0, 0 },
|
98
|
+
{ "[:digit:]", +1, code9, 1, 0, 0 },
|
99
|
+
{ "[:^digit:]", -1, code9, 1, 0, 0 },
|
100
|
+
{ "[:graph:]", +1, code10, 1, 0, 0 },
|
101
|
+
{ "[:^graph:]", -1, code10, 1, 0, 0 },
|
102
|
+
{ "[:lower:]", +1, code11, 1, 0, 0 },
|
103
|
+
{ "[:^lower:]", -1, code11, 1, 0, 0 },
|
104
|
+
{ "[:print:]", +1, code12, 1, 0, 0 },
|
105
|
+
{ "[:^print:]", -1, code12, 1, 0, 0 },
|
106
|
+
{ "[:punct:]", +1, code13, 4, 0, 0 },
|
107
|
+
{ "[:^punct:]", -1, code13, 4, 0, 0 },
|
108
|
+
{ "[:space:]", +1, code14, 2, 0, 0 },
|
109
|
+
{ "[:^space:]", -1, code14, 2, 0, 0 },
|
110
|
+
{ "[:upper:]", +1, code15, 1, 0, 0 },
|
111
|
+
{ "[:^upper:]", -1, code15, 1, 0, 0 },
|
112
|
+
{ "[:word:]", +1, code16, 4, 0, 0 },
|
113
|
+
{ "[:^word:]", -1, code16, 4, 0, 0 },
|
114
|
+
{ "[:xdigit:]", +1, code17, 3, 0, 0 },
|
115
|
+
{ "[:^xdigit:]", -1, code17, 3, 0, 0 },
|
116
116
|
};
|
117
117
|
const int num_posix_groups = 28;
|
118
118
|
|
@@ -648,14 +648,15 @@ Prefilter* Prefilter::FromRegexp(Regexp* re) {
|
|
648
648
|
return NULL;
|
649
649
|
|
650
650
|
Regexp* simple = re->Simplify();
|
651
|
-
|
651
|
+
if (simple == NULL)
|
652
|
+
return NULL;
|
652
653
|
|
654
|
+
Prefilter::Info* info = BuildInfo(simple);
|
653
655
|
simple->Decref();
|
654
656
|
if (info == NULL)
|
655
657
|
return NULL;
|
656
658
|
|
657
659
|
Prefilter* m = info->TakeMatch();
|
658
|
-
|
659
660
|
delete info;
|
660
661
|
return m;
|
661
662
|
}
|
data/third_party/re2/re2/prog.cc
CHANGED
@@ -115,9 +115,8 @@ Prog::Prog()
|
|
115
115
|
start_unanchored_(0),
|
116
116
|
size_(0),
|
117
117
|
bytemap_range_(0),
|
118
|
+
prefix_foldcase_(false),
|
118
119
|
prefix_size_(0),
|
119
|
-
prefix_front_(-1),
|
120
|
-
prefix_back_(-1),
|
121
120
|
list_count_(0),
|
122
121
|
dfa_mem_(0),
|
123
122
|
dfa_first_(NULL),
|
@@ -127,6 +126,8 @@ Prog::Prog()
|
|
127
126
|
Prog::~Prog() {
|
128
127
|
DeleteDFA(dfa_longest_);
|
129
128
|
DeleteDFA(dfa_first_);
|
129
|
+
if (prefix_foldcase_)
|
130
|
+
delete[] prefix_dfa_;
|
130
131
|
}
|
131
132
|
|
132
133
|
typedef SparseSet Workq;
|
@@ -916,6 +917,183 @@ void Prog::ComputeHints(std::vector<Inst>* flat, int begin, int end) {
|
|
916
917
|
}
|
917
918
|
}
|
918
919
|
|
920
|
+
// The final state will always be this, which frees up a register for the hot
|
921
|
+
// loop and thus avoids the spilling that can occur when building with Clang.
|
922
|
+
static const size_t kShiftDFAFinal = 9;
|
923
|
+
|
924
|
+
// This function takes the prefix as std::string (i.e. not const std::string&
|
925
|
+
// as normal) because it's going to clobber it, so a temporary is convenient.
|
926
|
+
static uint64_t* BuildShiftDFA(std::string prefix) {
|
927
|
+
// This constant is for convenience now and also for correctness later when
|
928
|
+
// we clobber the prefix, but still need to know how long it was initially.
|
929
|
+
const size_t size = prefix.size();
|
930
|
+
|
931
|
+
// Construct the NFA.
|
932
|
+
// The table is indexed by input byte; each element is a bitfield of states
|
933
|
+
// reachable by the input byte. Given a bitfield of the current states, the
|
934
|
+
// bitfield of states reachable from those is - for this specific purpose -
|
935
|
+
// always ((ncurr << 1) | 1). Intersecting the reachability bitfields gives
|
936
|
+
// the bitfield of the next states reached by stepping over the input byte.
|
937
|
+
// Credits for this technique: the Hyperscan paper by Geoff Langdale et al.
|
938
|
+
uint16_t nfa[256]{};
|
939
|
+
for (size_t i = 0; i < size; ++i) {
|
940
|
+
uint8_t b = prefix[i];
|
941
|
+
nfa[b] |= 1 << (i+1);
|
942
|
+
}
|
943
|
+
// This is the `\C*?` for unanchored search.
|
944
|
+
for (int b = 0; b < 256; ++b)
|
945
|
+
nfa[b] |= 1;
|
946
|
+
|
947
|
+
// This maps from DFA state to NFA states; the reverse mapping is used when
|
948
|
+
// recording transitions and gets implemented with plain old linear search.
|
949
|
+
// The "Shift DFA" technique limits this to ten states when using uint64_t;
|
950
|
+
// to allow for the initial state, we use at most nine bytes of the prefix.
|
951
|
+
// That same limit is also why uint16_t is sufficient for the NFA bitfield.
|
952
|
+
uint16_t states[kShiftDFAFinal+1]{};
|
953
|
+
states[0] = 1;
|
954
|
+
for (size_t dcurr = 0; dcurr < size; ++dcurr) {
|
955
|
+
uint8_t b = prefix[dcurr];
|
956
|
+
uint16_t ncurr = states[dcurr];
|
957
|
+
uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
|
958
|
+
size_t dnext = dcurr+1;
|
959
|
+
if (dnext == size)
|
960
|
+
dnext = kShiftDFAFinal;
|
961
|
+
states[dnext] = nnext;
|
962
|
+
}
|
963
|
+
|
964
|
+
// Sort and unique the bytes of the prefix to avoid repeating work while we
|
965
|
+
// record transitions. This clobbers the prefix, but it's no longer needed.
|
966
|
+
std::sort(prefix.begin(), prefix.end());
|
967
|
+
prefix.erase(std::unique(prefix.begin(), prefix.end()), prefix.end());
|
968
|
+
|
969
|
+
// Construct the DFA.
|
970
|
+
// The table is indexed by input byte; each element is effectively a packed
|
971
|
+
// array of uint6_t; each array value will be multiplied by six in order to
|
972
|
+
// avoid having to do so later in the hot loop as well as masking/shifting.
|
973
|
+
// Credits for this technique: "Shift-based DFAs" on GitHub by Per Vognsen.
|
974
|
+
uint64_t* dfa = new uint64_t[256]{};
|
975
|
+
// Record a transition from each state for each of the bytes of the prefix.
|
976
|
+
// Note that all other input bytes go back to the initial state by default.
|
977
|
+
for (size_t dcurr = 0; dcurr < size; ++dcurr) {
|
978
|
+
for (uint8_t b : prefix) {
|
979
|
+
uint16_t ncurr = states[dcurr];
|
980
|
+
uint16_t nnext = nfa[b] & ((ncurr << 1) | 1);
|
981
|
+
size_t dnext = 0;
|
982
|
+
while (states[dnext] != nnext)
|
983
|
+
++dnext;
|
984
|
+
dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
|
985
|
+
// Convert ASCII letters to uppercase and record the extra transitions.
|
986
|
+
// Note that ASCII letters are guaranteed to be lowercase at this point
|
987
|
+
// because that's how the parser normalises them. #FunFact: 'k' and 's'
|
988
|
+
// match U+212A and U+017F, respectively, so they won't occur here when
|
989
|
+
// using UTF-8 encoding because the parser will emit character classes.
|
990
|
+
if ('a' <= b && b <= 'z') {
|
991
|
+
b -= 'a' - 'A';
|
992
|
+
dfa[b] |= static_cast<uint64_t>(dnext * 6) << (dcurr * 6);
|
993
|
+
}
|
994
|
+
}
|
995
|
+
}
|
996
|
+
// This lets the final state "saturate", which will matter for performance:
|
997
|
+
// in the hot loop, we check for a match only at the end of each iteration,
|
998
|
+
// so we must keep signalling the match until we get around to checking it.
|
999
|
+
for (int b = 0; b < 256; ++b)
|
1000
|
+
dfa[b] |= static_cast<uint64_t>(kShiftDFAFinal * 6) << (kShiftDFAFinal * 6);
|
1001
|
+
|
1002
|
+
return dfa;
|
1003
|
+
}
|
1004
|
+
|
1005
|
+
void Prog::ConfigurePrefixAccel(const std::string& prefix,
|
1006
|
+
bool prefix_foldcase) {
|
1007
|
+
prefix_foldcase_ = prefix_foldcase;
|
1008
|
+
prefix_size_ = prefix.size();
|
1009
|
+
if (prefix_foldcase_) {
|
1010
|
+
// Use PrefixAccel_ShiftDFA().
|
1011
|
+
// ... and no more than nine bytes of the prefix. (See above for details.)
|
1012
|
+
prefix_size_ = std::min(prefix_size_, kShiftDFAFinal);
|
1013
|
+
prefix_dfa_ = BuildShiftDFA(prefix.substr(0, prefix_size_));
|
1014
|
+
} else if (prefix_size_ != 1) {
|
1015
|
+
// Use PrefixAccel_FrontAndBack().
|
1016
|
+
prefix_front_ = prefix.front();
|
1017
|
+
prefix_back_ = prefix.back();
|
1018
|
+
} else {
|
1019
|
+
// Use memchr(3).
|
1020
|
+
prefix_front_ = prefix.front();
|
1021
|
+
}
|
1022
|
+
}
|
1023
|
+
|
1024
|
+
const void* Prog::PrefixAccel_ShiftDFA(const void* data, size_t size) {
|
1025
|
+
if (size < prefix_size_)
|
1026
|
+
return NULL;
|
1027
|
+
|
1028
|
+
uint64_t curr = 0;
|
1029
|
+
|
1030
|
+
// At the time of writing, rough benchmarks on a Broadwell machine showed
|
1031
|
+
// that this unroll factor (i.e. eight) achieves a speedup factor of two.
|
1032
|
+
if (size >= 8) {
|
1033
|
+
const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
|
1034
|
+
const uint8_t* endp = p + (size&~7);
|
1035
|
+
do {
|
1036
|
+
uint8_t b0 = p[0];
|
1037
|
+
uint8_t b1 = p[1];
|
1038
|
+
uint8_t b2 = p[2];
|
1039
|
+
uint8_t b3 = p[3];
|
1040
|
+
uint8_t b4 = p[4];
|
1041
|
+
uint8_t b5 = p[5];
|
1042
|
+
uint8_t b6 = p[6];
|
1043
|
+
uint8_t b7 = p[7];
|
1044
|
+
|
1045
|
+
uint64_t next0 = prefix_dfa_[b0];
|
1046
|
+
uint64_t next1 = prefix_dfa_[b1];
|
1047
|
+
uint64_t next2 = prefix_dfa_[b2];
|
1048
|
+
uint64_t next3 = prefix_dfa_[b3];
|
1049
|
+
uint64_t next4 = prefix_dfa_[b4];
|
1050
|
+
uint64_t next5 = prefix_dfa_[b5];
|
1051
|
+
uint64_t next6 = prefix_dfa_[b6];
|
1052
|
+
uint64_t next7 = prefix_dfa_[b7];
|
1053
|
+
|
1054
|
+
uint64_t curr0 = next0 >> (curr & 63);
|
1055
|
+
uint64_t curr1 = next1 >> (curr0 & 63);
|
1056
|
+
uint64_t curr2 = next2 >> (curr1 & 63);
|
1057
|
+
uint64_t curr3 = next3 >> (curr2 & 63);
|
1058
|
+
uint64_t curr4 = next4 >> (curr3 & 63);
|
1059
|
+
uint64_t curr5 = next5 >> (curr4 & 63);
|
1060
|
+
uint64_t curr6 = next6 >> (curr5 & 63);
|
1061
|
+
uint64_t curr7 = next7 >> (curr6 & 63);
|
1062
|
+
|
1063
|
+
if ((curr7 & 63) == kShiftDFAFinal * 6) {
|
1064
|
+
// At the time of writing, using the same masking subexpressions from
|
1065
|
+
// the preceding lines caused Clang to clutter the hot loop computing
|
1066
|
+
// them - even though they aren't actually needed for shifting! Hence
|
1067
|
+
// these rewritten conditions, which achieve a speedup factor of two.
|
1068
|
+
if (((curr7-curr0) & 63) == 0) return p+1-prefix_size_;
|
1069
|
+
if (((curr7-curr1) & 63) == 0) return p+2-prefix_size_;
|
1070
|
+
if (((curr7-curr2) & 63) == 0) return p+3-prefix_size_;
|
1071
|
+
if (((curr7-curr3) & 63) == 0) return p+4-prefix_size_;
|
1072
|
+
if (((curr7-curr4) & 63) == 0) return p+5-prefix_size_;
|
1073
|
+
if (((curr7-curr5) & 63) == 0) return p+6-prefix_size_;
|
1074
|
+
if (((curr7-curr6) & 63) == 0) return p+7-prefix_size_;
|
1075
|
+
if (((curr7-curr7) & 63) == 0) return p+8-prefix_size_;
|
1076
|
+
}
|
1077
|
+
|
1078
|
+
curr = curr7;
|
1079
|
+
p += 8;
|
1080
|
+
} while (p != endp);
|
1081
|
+
data = p;
|
1082
|
+
size = size&7;
|
1083
|
+
}
|
1084
|
+
|
1085
|
+
const uint8_t* p = reinterpret_cast<const uint8_t*>(data);
|
1086
|
+
const uint8_t* endp = p + size;
|
1087
|
+
while (p != endp) {
|
1088
|
+
uint8_t b = *p++;
|
1089
|
+
uint64_t next = prefix_dfa_[b];
|
1090
|
+
curr = next >> (curr & 63);
|
1091
|
+
if ((curr & 63) == kShiftDFAFinal * 6)
|
1092
|
+
return p-prefix_size_;
|
1093
|
+
}
|
1094
|
+
return NULL;
|
1095
|
+
}
|
1096
|
+
|
919
1097
|
#if defined(__AVX2__)
|
920
1098
|
// Finds the least significant non-zero bit in n.
|
921
1099
|
static int FindLSBSet(uint32_t n) {
|
@@ -958,7 +1136,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
|
|
958
1136
|
const __m256i* endfp = fp + size/sizeof(__m256i);
|
959
1137
|
const __m256i f_set1 = _mm256_set1_epi8(prefix_front_);
|
960
1138
|
const __m256i b_set1 = _mm256_set1_epi8(prefix_back_);
|
961
|
-
|
1139
|
+
do {
|
962
1140
|
const __m256i f_loadu = _mm256_loadu_si256(fp++);
|
963
1141
|
const __m256i b_loadu = _mm256_loadu_si256(bp++);
|
964
1142
|
const __m256i f_cmpeq = _mm256_cmpeq_epi8(f_set1, f_loadu);
|
@@ -970,7 +1148,7 @@ const void* Prog::PrefixAccel_FrontAndBack(const void* data, size_t size) {
|
|
970
1148
|
const int fb_ctz = FindLSBSet(fb_movemask);
|
971
1149
|
return reinterpret_cast<const char*>(fp-1) + fb_ctz;
|
972
1150
|
}
|
973
|
-
}
|
1151
|
+
} while (fp != endfp);
|
974
1152
|
data = fp;
|
975
1153
|
size = size%sizeof(__m256i);
|
976
1154
|
}
|
data/third_party/re2/re2/prog.h
CHANGED
@@ -220,11 +220,23 @@ class Prog {
|
|
220
220
|
// Accelerates to the first likely occurrence of the prefix.
|
221
221
|
// Returns a pointer to the first byte or NULL if not found.
|
222
222
|
const void* PrefixAccel(const void* data, size_t size) {
|
223
|
-
|
224
|
-
|
225
|
-
|
223
|
+
DCHECK(can_prefix_accel());
|
224
|
+
if (prefix_foldcase_) {
|
225
|
+
return PrefixAccel_ShiftDFA(data, size);
|
226
|
+
} else if (prefix_size_ != 1) {
|
227
|
+
return PrefixAccel_FrontAndBack(data, size);
|
228
|
+
} else {
|
229
|
+
return memchr(data, prefix_front_, size);
|
230
|
+
}
|
226
231
|
}
|
227
232
|
|
233
|
+
// Configures prefix accel using the analysis performed during compilation.
|
234
|
+
void ConfigurePrefixAccel(const std::string& prefix, bool prefix_foldcase);
|
235
|
+
|
236
|
+
// An implementation of prefix accel that uses prefix_dfa_ to perform
|
237
|
+
// case-insensitive search.
|
238
|
+
const void* PrefixAccel_ShiftDFA(const void* data, size_t size);
|
239
|
+
|
228
240
|
// An implementation of prefix accel that looks for prefix_front_ and
|
229
241
|
// prefix_back_ to return fewer false positives than memchr(3) alone.
|
230
242
|
const void* PrefixAccel_FrontAndBack(const void* data, size_t size);
|
@@ -298,10 +310,6 @@ class Prog {
|
|
298
310
|
// FOR TESTING OR EXPERIMENTAL PURPOSES ONLY.
|
299
311
|
int BuildEntireDFA(MatchKind kind, const DFAStateCallback& cb);
|
300
312
|
|
301
|
-
// Controls whether the DFA should bail out early if the NFA would be faster.
|
302
|
-
// FOR TESTING ONLY.
|
303
|
-
static void TEST_dfa_should_bail_when_slow(bool b);
|
304
|
-
|
305
313
|
// Compute bytemap.
|
306
314
|
void ComputeByteMap();
|
307
315
|
|
@@ -390,6 +398,10 @@ class Prog {
|
|
390
398
|
// Computes hints for ByteRange instructions in [begin, end).
|
391
399
|
void ComputeHints(std::vector<Inst>* flat, int begin, int end);
|
392
400
|
|
401
|
+
// Controls whether the DFA should bail out early if the NFA would be faster.
|
402
|
+
// FOR TESTING ONLY.
|
403
|
+
static void TESTING_ONLY_set_dfa_should_bail_when_slow(bool b);
|
404
|
+
|
393
405
|
private:
|
394
406
|
friend class Compiler;
|
395
407
|
|
@@ -406,9 +418,16 @@ class Prog {
|
|
406
418
|
int start_unanchored_; // unanchored entry point for program
|
407
419
|
int size_; // number of instructions
|
408
420
|
int bytemap_range_; // bytemap_[x] < bytemap_range_
|
421
|
+
|
422
|
+
bool prefix_foldcase_; // whether prefix is case-insensitive
|
409
423
|
size_t prefix_size_; // size of prefix (0 if no prefix)
|
410
|
-
|
411
|
-
|
424
|
+
union {
|
425
|
+
uint64_t* prefix_dfa_; // "Shift DFA" for prefix
|
426
|
+
struct {
|
427
|
+
int prefix_front_; // first byte of prefix
|
428
|
+
int prefix_back_; // last byte of prefix
|
429
|
+
};
|
430
|
+
};
|
412
431
|
|
413
432
|
int list_count_; // count of lists (see above)
|
414
433
|
int inst_count_[kNumInst]; // count of instructions by opcode
|