grpc 1.43.1 → 1.44.0.pre2
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 +84 -64
- data/include/grpc/grpc_security.h +10 -0
- data/include/grpc/impl/codegen/compression_types.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +6 -0
- data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
- data/src/core/ext/filters/client_channel/client_channel.h +8 -8
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
- data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
- data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
- data/src/core/ext/filters/client_channel/subchannel.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
- data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
- data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
- data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
- data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
- data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
- data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
- data/src/core/ext/xds/upb_utils.h +65 -0
- data/src/core/ext/xds/xds_api.cc +81 -3458
- data/src/core/ext/xds/xds_api.h +56 -611
- data/src/core/ext/xds/xds_bootstrap.cc +189 -125
- data/src/core/ext/xds/xds_bootstrap.h +20 -15
- data/src/core/ext/xds/xds_certificate_provider.h +1 -0
- data/src/core/ext/xds/xds_channel_creds.cc +108 -0
- data/src/core/ext/xds/xds_channel_creds.h +50 -0
- data/src/core/ext/xds/xds_client.cc +584 -994
- data/src/core/ext/xds/xds_client.h +78 -135
- data/src/core/ext/xds/xds_cluster.cc +451 -0
- data/src/core/ext/xds/xds_cluster.h +111 -0
- data/src/core/ext/xds/xds_common_types.cc +388 -0
- data/src/core/ext/xds/xds_common_types.h +110 -0
- data/src/core/ext/xds/xds_endpoint.cc +364 -0
- data/src/core/ext/xds/xds_endpoint.h +135 -0
- data/src/core/ext/xds/xds_http_filters.cc +5 -0
- data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
- data/src/core/ext/xds/xds_listener.cc +1036 -0
- data/src/core/ext/xds/xds_listener.h +220 -0
- data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
- data/src/core/ext/xds/xds_resource_type.h +98 -0
- data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
- data/src/core/ext/xds/xds_route_config.cc +993 -0
- data/src/core/ext/xds/xds_route_config.h +215 -0
- data/src/core/ext/xds/xds_routing.cc +11 -8
- data/src/core/ext/xds/xds_routing.h +8 -5
- data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
- data/src/core/lib/address_utils/parse_address.cc +20 -0
- data/src/core/lib/address_utils/parse_address.h +5 -0
- data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
- data/src/core/lib/backoff/backoff.cc +4 -30
- data/src/core/lib/backoff/backoff.h +3 -3
- data/src/core/lib/channel/channel_args.cc +0 -1
- data/src/core/lib/channel/channel_stack.cc +8 -0
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_stack_builder.cc +5 -9
- data/src/core/lib/channel/channel_stack_builder.h +4 -7
- data/src/core/lib/channel/channelz.cc +1 -0
- data/src/core/lib/compression/compression.cc +19 -111
- data/src/core/lib/compression/compression_internal.cc +142 -202
- data/src/core/lib/compression/compression_internal.h +64 -69
- data/src/core/lib/compression/message_compress.cc +11 -11
- data/src/core/lib/compression/message_compress.h +2 -2
- data/src/core/lib/gpr/useful.h +4 -0
- data/src/core/lib/gprpp/bitset.h +7 -0
- data/src/core/lib/gprpp/chunked_vector.h +45 -3
- data/src/core/lib/gprpp/status_helper.cc +20 -28
- data/src/core/lib/gprpp/status_helper.h +6 -19
- data/src/core/lib/gprpp/table.h +11 -0
- data/src/core/lib/http/httpcli.cc +37 -46
- data/src/core/lib/http/httpcli.h +3 -15
- data/src/core/lib/iomgr/call_combiner.cc +15 -4
- data/src/core/lib/iomgr/closure.h +29 -9
- data/src/core/lib/iomgr/combiner.cc +25 -3
- data/src/core/lib/iomgr/error.cc +2 -0
- data/src/core/lib/iomgr/error.h +3 -0
- data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
- data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
- data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
- data/src/core/lib/iomgr/exec_ctx.cc +22 -9
- data/src/core/lib/iomgr/executor.cc +10 -1
- data/src/core/lib/iomgr/fork_posix.cc +3 -2
- data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
- data/src/core/lib/iomgr/port.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +5 -24
- data/src/core/lib/iomgr/resolve_address.h +47 -44
- data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
- data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
- data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
- data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
- data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
- data/src/core/lib/iomgr/resolved_address.h +39 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
- data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
- data/src/core/lib/matchers/matchers.cc +1 -1
- data/src/core/lib/promise/activity.h +49 -20
- data/src/core/lib/promise/detail/status.h +5 -0
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.h +0 -1
- data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
- data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
- data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
- data/src/core/lib/security/authorization/evaluate_args.h +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
- data/src/core/lib/security/authorization/matchers.cc +227 -0
- data/src/core/lib/security/authorization/matchers.h +211 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
- data/src/core/lib/security/authorization/rbac_policy.h +170 -0
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/context/security_context.h +1 -1
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
- data/src/core/lib/security/credentials/credentials.h +10 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
- data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
- data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +0 -4
- data/src/core/lib/security/security_connector/security_connector.h +5 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
- data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
- data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
- data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
- data/src/core/{ext → lib}/service_config/service_config.h +4 -4
- data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
- data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
- data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
- data/src/core/lib/slice/slice.cc +3 -1
- data/src/core/lib/slice/slice.h +43 -13
- data/src/core/lib/slice/slice_intern.cc +3 -101
- data/src/core/lib/slice/slice_internal.h +1 -2
- data/src/core/lib/slice/slice_refcount.h +4 -13
- data/src/core/lib/slice/slice_refcount_base.h +0 -16
- data/src/core/lib/surface/call.cc +140 -382
- data/src/core/lib/surface/call.h +4 -4
- data/src/core/lib/surface/channel.cc +42 -44
- data/src/core/lib/surface/channel.h +4 -4
- data/src/core/lib/surface/init.cc +0 -2
- data/src/core/lib/surface/lame_client.cc +0 -1
- data/src/core/lib/surface/server.cc +12 -29
- data/src/core/lib/surface/server.h +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.h +14 -0
- data/src/core/lib/transport/metadata_batch.h +799 -717
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +95 -92
- data/src/core/lib/transport/timeout_encoding.cc +200 -66
- data/src/core/lib/transport/timeout_encoding.h +40 -10
- data/src/core/lib/transport/transport.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +6 -39
- data/src/core/lib/uri/uri_parser.cc +223 -53
- data/src/core/lib/uri/uri_parser.h +36 -23
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
- data/src/core/tsi/ssl_transport_security.cc +53 -13
- data/src/core/tsi/ssl_transport_security.h +18 -6
- data/src/ruby/ext/grpc/extconf.rb +10 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
- data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
- data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
- data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
- data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
- data/third_party/abseil-cpp/absl/random/random.h +189 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
- data/third_party/xxhash/xxhash.h +607 -352
- metadata +149 -77
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
- data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
- data/src/core/lib/compression/algorithm_metadata.h +0 -62
- data/src/core/lib/compression/compression_args.cc +0 -140
- data/src/core/lib/compression/compression_args.h +0 -58
- data/src/core/lib/compression/stream_compression.cc +0 -81
- data/src/core/lib/compression/stream_compression.h +0 -117
- data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
- data/src/core/lib/compression/stream_compression_gzip.h +0 -28
- data/src/core/lib/compression/stream_compression_identity.cc +0 -91
- data/src/core/lib/compression/stream_compression_identity.h +0 -29
- data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
- data/src/core/lib/slice/static_slice.cc +0 -377
- data/src/core/lib/slice/static_slice.h +0 -300
- data/src/core/lib/transport/metadata.cc +0 -714
- data/src/core/lib/transport/metadata.h +0 -449
- data/src/core/lib/transport/metadata_batch.cc +0 -99
- data/src/core/lib/transport/static_metadata.cc +0 -1032
- data/src/core/lib/transport/static_metadata.h +0 -322
- data/src/core/lib/transport/status_metadata.cc +0 -63
- data/src/core/lib/transport/status_metadata.h +0 -48
@@ -35,6 +35,15 @@
|
|
35
35
|
|
36
36
|
#include <string>
|
37
37
|
|
38
|
+
#include <openssl/bio.h>
|
39
|
+
#include <openssl/crypto.h> /* For OPENSSL_free */
|
40
|
+
#include <openssl/engine.h>
|
41
|
+
#include <openssl/err.h>
|
42
|
+
#include <openssl/ssl.h>
|
43
|
+
#include <openssl/tls1.h>
|
44
|
+
#include <openssl/x509.h>
|
45
|
+
#include <openssl/x509v3.h>
|
46
|
+
|
38
47
|
#include "absl/strings/match.h"
|
39
48
|
#include "absl/strings/string_view.h"
|
40
49
|
|
@@ -45,17 +54,6 @@
|
|
45
54
|
#include <grpc/support/sync.h>
|
46
55
|
#include <grpc/support/thd_id.h>
|
47
56
|
|
48
|
-
extern "C" {
|
49
|
-
#include <openssl/bio.h>
|
50
|
-
#include <openssl/crypto.h> /* For OPENSSL_free */
|
51
|
-
#include <openssl/engine.h>
|
52
|
-
#include <openssl/err.h>
|
53
|
-
#include <openssl/ssl.h>
|
54
|
-
#include <openssl/tls1.h>
|
55
|
-
#include <openssl/x509.h>
|
56
|
-
#include <openssl/x509v3.h>
|
57
|
-
}
|
58
|
-
|
59
57
|
#include "src/core/lib/gpr/useful.h"
|
60
58
|
#include "src/core/tsi/ssl/session_cache/ssl_session_cache.h"
|
61
59
|
#include "src/core/tsi/ssl_types.h"
|
@@ -1923,6 +1921,14 @@ static int server_handshaker_factory_new_session_callback(
|
|
1923
1921
|
return 1;
|
1924
1922
|
}
|
1925
1923
|
|
1924
|
+
static int verify_cb(int ok, X509_STORE_CTX* ctx) {
|
1925
|
+
int cert_error = X509_STORE_CTX_get_error(ctx);
|
1926
|
+
if (cert_error != 0) {
|
1927
|
+
gpr_log(GPR_ERROR, "Certificate verify failed with code %d", cert_error);
|
1928
|
+
}
|
1929
|
+
return ok;
|
1930
|
+
}
|
1931
|
+
|
1926
1932
|
/* --- tsi_ssl_handshaker_factory constructors. --- */
|
1927
1933
|
|
1928
1934
|
static tsi_ssl_handshaker_factory_vtable client_handshaker_factory_vtable = {
|
@@ -2043,7 +2049,24 @@ tsi_result tsi_create_ssl_client_handshaker_factory_with_options(
|
|
2043
2049
|
} else {
|
2044
2050
|
SSL_CTX_set_verify(ssl_context, SSL_VERIFY_PEER, nullptr);
|
2045
2051
|
}
|
2046
|
-
|
2052
|
+
|
2053
|
+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
2054
|
+
if (options->crl_directory != nullptr &&
|
2055
|
+
strcmp(options->crl_directory, "") != 0) {
|
2056
|
+
gpr_log(GPR_INFO, "enabling client CRL checking with path: %s",
|
2057
|
+
options->crl_directory);
|
2058
|
+
X509_STORE* cert_store = SSL_CTX_get_cert_store(ssl_context);
|
2059
|
+
X509_STORE_set_verify_cb(cert_store, verify_cb);
|
2060
|
+
if (!X509_STORE_load_locations(cert_store, nullptr,
|
2061
|
+
options->crl_directory)) {
|
2062
|
+
gpr_log(GPR_ERROR, "Failed to load CRL File from directory.");
|
2063
|
+
} else {
|
2064
|
+
X509_VERIFY_PARAM* param = X509_STORE_get0_param(cert_store);
|
2065
|
+
X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
|
2066
|
+
gpr_log(GPR_INFO, "enabled client side CRL checking.");
|
2067
|
+
}
|
2068
|
+
}
|
2069
|
+
#endif
|
2047
2070
|
|
2048
2071
|
*factory = impl;
|
2049
2072
|
return TSI_OK;
|
@@ -2205,7 +2228,24 @@ tsi_result tsi_create_ssl_server_handshaker_factory_with_options(
|
|
2205
2228
|
nullptr);
|
2206
2229
|
break;
|
2207
2230
|
}
|
2208
|
-
|
2231
|
+
|
2232
|
+
#if OPENSSL_VERSION_NUMBER >= 0x10100000
|
2233
|
+
if (options->crl_directory != nullptr &&
|
2234
|
+
strcmp(options->crl_directory, "") != 0) {
|
2235
|
+
gpr_log(GPR_INFO, "enabling server CRL checking with path %s",
|
2236
|
+
options->crl_directory);
|
2237
|
+
X509_STORE* cert_store = SSL_CTX_get_cert_store(impl->ssl_contexts[i]);
|
2238
|
+
X509_STORE_set_verify_cb(cert_store, verify_cb);
|
2239
|
+
if (!X509_STORE_load_locations(cert_store, nullptr,
|
2240
|
+
options->crl_directory)) {
|
2241
|
+
gpr_log(GPR_ERROR, "Failed to load CRL File from directory.");
|
2242
|
+
} else {
|
2243
|
+
X509_VERIFY_PARAM* param = X509_STORE_get0_param(cert_store);
|
2244
|
+
X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
|
2245
|
+
gpr_log(GPR_INFO, "enabled server CRL checking.");
|
2246
|
+
}
|
2247
|
+
}
|
2248
|
+
#endif
|
2209
2249
|
|
2210
2250
|
result = tsi_ssl_extract_x509_subject_names_from_pem_cert(
|
2211
2251
|
options->pem_key_cert_pairs[i].cert_chain,
|
@@ -21,16 +21,14 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
+
#include <openssl/x509.h>
|
25
|
+
|
24
26
|
#include "absl/strings/string_view.h"
|
25
27
|
|
26
28
|
#include <grpc/grpc_security_constants.h>
|
27
29
|
|
28
30
|
#include "src/core/tsi/transport_security_interface.h"
|
29
31
|
|
30
|
-
extern "C" {
|
31
|
-
#include <openssl/x509.h>
|
32
|
-
}
|
33
|
-
|
34
32
|
/* Value for the TSI_CERTIFICATE_TYPE_PEER_PROPERTY property for X509 certs. */
|
35
33
|
#define TSI_X509_CERTIFICATE_TYPE "X509"
|
36
34
|
|
@@ -159,6 +157,12 @@ struct tsi_ssl_client_handshaker_options {
|
|
159
157
|
tsi_tls_version min_tls_version;
|
160
158
|
tsi_tls_version max_tls_version;
|
161
159
|
|
160
|
+
/* The directory where all hashed CRL files enforced by the handshaker are
|
161
|
+
located. If the directory is invalid, CRL checking will fail open and just
|
162
|
+
log. An empty directory will not enable crl checking. Only OpenSSL version
|
163
|
+
> 1.1 is supported for CRL checking*/
|
164
|
+
const char* crl_directory;
|
165
|
+
|
162
166
|
tsi_ssl_client_handshaker_options()
|
163
167
|
: pem_key_cert_pair(nullptr),
|
164
168
|
pem_root_certs(nullptr),
|
@@ -169,7 +173,8 @@ struct tsi_ssl_client_handshaker_options {
|
|
169
173
|
session_cache(nullptr),
|
170
174
|
skip_server_certificate_verification(false),
|
171
175
|
min_tls_version(tsi_tls_version::TSI_TLS1_2),
|
172
|
-
max_tls_version(tsi_tls_version::TSI_TLS1_3)
|
176
|
+
max_tls_version(tsi_tls_version::TSI_TLS1_3),
|
177
|
+
crl_directory(nullptr) {}
|
173
178
|
};
|
174
179
|
|
175
180
|
/* Creates a client handshaker factory.
|
@@ -289,6 +294,12 @@ struct tsi_ssl_server_handshaker_options {
|
|
289
294
|
tsi_tls_version min_tls_version;
|
290
295
|
tsi_tls_version max_tls_version;
|
291
296
|
|
297
|
+
/* The directory where all hashed CRL files are cached in the x.509 store and
|
298
|
+
* enforced by the handshaker are located. If the directory is invalid, CRL
|
299
|
+
* checking will fail open and just log. An empty directory will not enable
|
300
|
+
* crl checking. Only OpenSSL version > 1.1 is supported for CRL checking */
|
301
|
+
const char* crl_directory;
|
302
|
+
|
292
303
|
tsi_ssl_server_handshaker_options()
|
293
304
|
: pem_key_cert_pairs(nullptr),
|
294
305
|
num_key_cert_pairs(0),
|
@@ -300,7 +311,8 @@ struct tsi_ssl_server_handshaker_options {
|
|
300
311
|
session_ticket_key(nullptr),
|
301
312
|
session_ticket_key_size(0),
|
302
313
|
min_tls_version(tsi_tls_version::TSI_TLS1_2),
|
303
|
-
max_tls_version(tsi_tls_version::TSI_TLS1_3)
|
314
|
+
max_tls_version(tsi_tls_version::TSI_TLS1_3),
|
315
|
+
crl_directory(nullptr) {}
|
304
316
|
};
|
305
317
|
|
306
318
|
/* Creates a server handshaker factory.
|
@@ -60,7 +60,7 @@ end
|
|
60
60
|
|
61
61
|
ENV['CPPFLAGS'] = '-DGPR_BACKWARDS_COMPATIBILITY_MODE'
|
62
62
|
ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="\"RUBY\"" '
|
63
|
-
ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.
|
63
|
+
ENV['CPPFLAGS'] += ' -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="\"1.44.0.pre2\"" '
|
64
64
|
|
65
65
|
output_dir = File.expand_path(RbConfig::CONFIG['topdir'])
|
66
66
|
grpc_lib_dir = File.join(output_dir, 'libs', grpc_config)
|
@@ -69,9 +69,16 @@ ENV['BUILDDIR'] = output_dir
|
|
69
69
|
unless windows
|
70
70
|
puts 'Building internal gRPC into ' + grpc_lib_dir
|
71
71
|
nproc = 4
|
72
|
-
nproc = Etc.nprocessors
|
72
|
+
nproc = Etc.nprocessors if Etc.respond_to? :nprocessors
|
73
|
+
nproc_override = ENV['GRPC_RUBY_BUILD_PROCS']
|
74
|
+
unless nproc_override.nil? or nproc_override.size == 0
|
75
|
+
nproc = nproc_override
|
76
|
+
puts "Overriding make parallelism to #{nproc}"
|
77
|
+
end
|
73
78
|
make = bsd ? 'gmake' : 'make'
|
74
|
-
|
79
|
+
cmd = "#{make} -j#{nproc} -C #{grpc_root} #{grpc_lib_dir}/libgrpc.a CONFIG=#{grpc_config} Q="
|
80
|
+
puts "Building grpc native library: #{cmd}"
|
81
|
+
system(cmd)
|
75
82
|
exit 1 unless $? == 0
|
76
83
|
end
|
77
84
|
|
@@ -178,6 +178,7 @@ grpc_tls_credentials_options_set_root_cert_name_type grpc_tls_credentials_option
|
|
178
178
|
grpc_tls_credentials_options_watch_identity_key_cert_pairs_type grpc_tls_credentials_options_watch_identity_key_cert_pairs_import;
|
179
179
|
grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credentials_options_set_identity_cert_name_import;
|
180
180
|
grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
|
181
|
+
grpc_tls_credentials_options_set_crl_directory_type grpc_tls_credentials_options_set_crl_directory_import;
|
181
182
|
grpc_tls_credentials_options_set_verify_server_cert_type grpc_tls_credentials_options_set_verify_server_cert_import;
|
182
183
|
grpc_tls_credentials_options_set_check_call_host_type grpc_tls_credentials_options_set_check_call_host_import;
|
183
184
|
grpc_xds_credentials_create_type grpc_xds_credentials_create_import;
|
@@ -466,6 +467,7 @@ void grpc_rb_load_imports(HMODULE library) {
|
|
466
467
|
grpc_tls_credentials_options_watch_identity_key_cert_pairs_import = (grpc_tls_credentials_options_watch_identity_key_cert_pairs_type) GetProcAddress(library, "grpc_tls_credentials_options_watch_identity_key_cert_pairs");
|
467
468
|
grpc_tls_credentials_options_set_identity_cert_name_import = (grpc_tls_credentials_options_set_identity_cert_name_type) GetProcAddress(library, "grpc_tls_credentials_options_set_identity_cert_name");
|
468
469
|
grpc_tls_credentials_options_set_cert_request_type_import = (grpc_tls_credentials_options_set_cert_request_type_type) GetProcAddress(library, "grpc_tls_credentials_options_set_cert_request_type");
|
470
|
+
grpc_tls_credentials_options_set_crl_directory_import = (grpc_tls_credentials_options_set_crl_directory_type) GetProcAddress(library, "grpc_tls_credentials_options_set_crl_directory");
|
469
471
|
grpc_tls_credentials_options_set_verify_server_cert_import = (grpc_tls_credentials_options_set_verify_server_cert_type) GetProcAddress(library, "grpc_tls_credentials_options_set_verify_server_cert");
|
470
472
|
grpc_tls_credentials_options_set_check_call_host_import = (grpc_tls_credentials_options_set_check_call_host_type) GetProcAddress(library, "grpc_tls_credentials_options_set_check_call_host");
|
471
473
|
grpc_xds_credentials_create_import = (grpc_xds_credentials_create_type) GetProcAddress(library, "grpc_xds_credentials_create");
|
@@ -509,6 +509,9 @@ extern grpc_tls_credentials_options_set_identity_cert_name_type grpc_tls_credent
|
|
509
509
|
typedef void(*grpc_tls_credentials_options_set_cert_request_type_type)(grpc_tls_credentials_options* options, grpc_ssl_client_certificate_request_type type);
|
510
510
|
extern grpc_tls_credentials_options_set_cert_request_type_type grpc_tls_credentials_options_set_cert_request_type_import;
|
511
511
|
#define grpc_tls_credentials_options_set_cert_request_type grpc_tls_credentials_options_set_cert_request_type_import
|
512
|
+
typedef void(*grpc_tls_credentials_options_set_crl_directory_type)(grpc_tls_credentials_options* options, const char* crl_directory);
|
513
|
+
extern grpc_tls_credentials_options_set_crl_directory_type grpc_tls_credentials_options_set_crl_directory_import;
|
514
|
+
#define grpc_tls_credentials_options_set_crl_directory grpc_tls_credentials_options_set_crl_directory_import
|
512
515
|
typedef void(*grpc_tls_credentials_options_set_verify_server_cert_type)(grpc_tls_credentials_options* options, int verify_server_cert);
|
513
516
|
extern grpc_tls_credentials_options_set_verify_server_cert_type grpc_tls_credentials_options_set_verify_server_cert_import;
|
514
517
|
#define grpc_tls_credentials_options_set_verify_server_cert grpc_tls_credentials_options_set_verify_server_cert_import
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
2
|
# source: src/proto/grpc/testing/test.proto
|
3
3
|
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
4
6
|
require 'src/proto/grpc/testing/empty_pb'
|
5
7
|
require 'src/proto/grpc/testing/messages_pb'
|
6
|
-
require 'google/protobuf'
|
7
8
|
|
8
9
|
Google::Protobuf::DescriptorPool.generated_pool.build do
|
9
10
|
add_file("src/proto/grpc/testing/test.proto", :syntax => :proto3) do
|
@@ -0,0 +1,48 @@
|
|
1
|
+
//
|
2
|
+
// Copyright 2020 The Abseil Authors.
|
3
|
+
//
|
4
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
// you may not use this file except in compliance with the License.
|
6
|
+
// You may obtain a copy of the License at
|
7
|
+
//
|
8
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
//
|
10
|
+
// Unless required by applicable law or agreed to in writing, software
|
11
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
// See the License for the specific language governing permissions and
|
14
|
+
// limitations under the License.
|
15
|
+
//
|
16
|
+
|
17
|
+
#ifndef ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
|
18
|
+
#define ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
|
19
|
+
|
20
|
+
#include "absl/base/config.h"
|
21
|
+
|
22
|
+
namespace absl {
|
23
|
+
ABSL_NAMESPACE_BEGIN
|
24
|
+
namespace base_internal {
|
25
|
+
|
26
|
+
template <typename Type>
|
27
|
+
struct FastTypeTag {
|
28
|
+
constexpr static char dummy_var = 0;
|
29
|
+
};
|
30
|
+
|
31
|
+
template <typename Type>
|
32
|
+
constexpr char FastTypeTag<Type>::dummy_var;
|
33
|
+
|
34
|
+
// FastTypeId<Type>() evaluates at compile/link-time to a unique pointer for the
|
35
|
+
// passed-in type. These are meant to be good match for keys into maps or
|
36
|
+
// straight up comparisons.
|
37
|
+
using FastTypeIdType = const void*;
|
38
|
+
|
39
|
+
template <typename Type>
|
40
|
+
constexpr inline FastTypeIdType FastTypeId() {
|
41
|
+
return &FastTypeTag<Type>::dummy_var;
|
42
|
+
}
|
43
|
+
|
44
|
+
} // namespace base_internal
|
45
|
+
ABSL_NAMESPACE_END
|
46
|
+
} // namespace absl
|
47
|
+
|
48
|
+
#endif // ABSL_BASE_INTERNAL_FAST_TYPE_ID_H_
|
@@ -0,0 +1,200 @@
|
|
1
|
+
// Copyright 2017 The Abseil Authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
|
16
|
+
#define ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
|
17
|
+
|
18
|
+
#include <cstdint>
|
19
|
+
#include <istream>
|
20
|
+
#include <limits>
|
21
|
+
|
22
|
+
#include "absl/base/optimization.h"
|
23
|
+
#include "absl/random/internal/fast_uniform_bits.h"
|
24
|
+
#include "absl/random/internal/iostream_state_saver.h"
|
25
|
+
|
26
|
+
namespace absl {
|
27
|
+
ABSL_NAMESPACE_BEGIN
|
28
|
+
|
29
|
+
// absl::bernoulli_distribution is a drop in replacement for
|
30
|
+
// std::bernoulli_distribution. It guarantees that (given a perfect
|
31
|
+
// UniformRandomBitGenerator) the acceptance probability is *exactly* equal to
|
32
|
+
// the given double.
|
33
|
+
//
|
34
|
+
// The implementation assumes that double is IEEE754
|
35
|
+
class bernoulli_distribution {
|
36
|
+
public:
|
37
|
+
using result_type = bool;
|
38
|
+
|
39
|
+
class param_type {
|
40
|
+
public:
|
41
|
+
using distribution_type = bernoulli_distribution;
|
42
|
+
|
43
|
+
explicit param_type(double p = 0.5) : prob_(p) {
|
44
|
+
assert(p >= 0.0 && p <= 1.0);
|
45
|
+
}
|
46
|
+
|
47
|
+
double p() const { return prob_; }
|
48
|
+
|
49
|
+
friend bool operator==(const param_type& p1, const param_type& p2) {
|
50
|
+
return p1.p() == p2.p();
|
51
|
+
}
|
52
|
+
friend bool operator!=(const param_type& p1, const param_type& p2) {
|
53
|
+
return p1.p() != p2.p();
|
54
|
+
}
|
55
|
+
|
56
|
+
private:
|
57
|
+
double prob_;
|
58
|
+
};
|
59
|
+
|
60
|
+
bernoulli_distribution() : bernoulli_distribution(0.5) {}
|
61
|
+
|
62
|
+
explicit bernoulli_distribution(double p) : param_(p) {}
|
63
|
+
|
64
|
+
explicit bernoulli_distribution(param_type p) : param_(p) {}
|
65
|
+
|
66
|
+
// no-op
|
67
|
+
void reset() {}
|
68
|
+
|
69
|
+
template <typename URBG>
|
70
|
+
bool operator()(URBG& g) { // NOLINT(runtime/references)
|
71
|
+
return Generate(param_.p(), g);
|
72
|
+
}
|
73
|
+
|
74
|
+
template <typename URBG>
|
75
|
+
bool operator()(URBG& g, // NOLINT(runtime/references)
|
76
|
+
const param_type& param) {
|
77
|
+
return Generate(param.p(), g);
|
78
|
+
}
|
79
|
+
|
80
|
+
param_type param() const { return param_; }
|
81
|
+
void param(const param_type& param) { param_ = param; }
|
82
|
+
|
83
|
+
double p() const { return param_.p(); }
|
84
|
+
|
85
|
+
result_type(min)() const { return false; }
|
86
|
+
result_type(max)() const { return true; }
|
87
|
+
|
88
|
+
friend bool operator==(const bernoulli_distribution& d1,
|
89
|
+
const bernoulli_distribution& d2) {
|
90
|
+
return d1.param_ == d2.param_;
|
91
|
+
}
|
92
|
+
|
93
|
+
friend bool operator!=(const bernoulli_distribution& d1,
|
94
|
+
const bernoulli_distribution& d2) {
|
95
|
+
return d1.param_ != d2.param_;
|
96
|
+
}
|
97
|
+
|
98
|
+
private:
|
99
|
+
static constexpr uint64_t kP32 = static_cast<uint64_t>(1) << 32;
|
100
|
+
|
101
|
+
template <typename URBG>
|
102
|
+
static bool Generate(double p, URBG& g); // NOLINT(runtime/references)
|
103
|
+
|
104
|
+
param_type param_;
|
105
|
+
};
|
106
|
+
|
107
|
+
template <typename CharT, typename Traits>
|
108
|
+
std::basic_ostream<CharT, Traits>& operator<<(
|
109
|
+
std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
|
110
|
+
const bernoulli_distribution& x) {
|
111
|
+
auto saver = random_internal::make_ostream_state_saver(os);
|
112
|
+
os.precision(random_internal::stream_precision_helper<double>::kPrecision);
|
113
|
+
os << x.p();
|
114
|
+
return os;
|
115
|
+
}
|
116
|
+
|
117
|
+
template <typename CharT, typename Traits>
|
118
|
+
std::basic_istream<CharT, Traits>& operator>>(
|
119
|
+
std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
|
120
|
+
bernoulli_distribution& x) { // NOLINT(runtime/references)
|
121
|
+
auto saver = random_internal::make_istream_state_saver(is);
|
122
|
+
auto p = random_internal::read_floating_point<double>(is);
|
123
|
+
if (!is.fail()) {
|
124
|
+
x.param(bernoulli_distribution::param_type(p));
|
125
|
+
}
|
126
|
+
return is;
|
127
|
+
}
|
128
|
+
|
129
|
+
template <typename URBG>
|
130
|
+
bool bernoulli_distribution::Generate(double p,
|
131
|
+
URBG& g) { // NOLINT(runtime/references)
|
132
|
+
random_internal::FastUniformBits<uint32_t> fast_u32;
|
133
|
+
|
134
|
+
while (true) {
|
135
|
+
// There are two aspects of the definition of `c` below that are worth
|
136
|
+
// commenting on. First, because `p` is in the range [0, 1], `c` is in the
|
137
|
+
// range [0, 2^32] which does not fit in a uint32_t and therefore requires
|
138
|
+
// 64 bits.
|
139
|
+
//
|
140
|
+
// Second, `c` is constructed by first casting explicitly to a signed
|
141
|
+
// integer and then converting implicitly to an unsigned integer of the same
|
142
|
+
// size. This is done because the hardware conversion instructions produce
|
143
|
+
// signed integers from double; if taken as a uint64_t the conversion would
|
144
|
+
// be wrong for doubles greater than 2^63 (not relevant in this use-case).
|
145
|
+
// If converted directly to an unsigned integer, the compiler would end up
|
146
|
+
// emitting code to handle such large values that are not relevant due to
|
147
|
+
// the known bounds on `c`. To avoid these extra instructions this
|
148
|
+
// implementation converts first to the signed type and then use the
|
149
|
+
// implicit conversion to unsigned (which is a no-op).
|
150
|
+
const uint64_t c = static_cast<int64_t>(p * kP32);
|
151
|
+
const uint32_t v = fast_u32(g);
|
152
|
+
// FAST PATH: this path fails with probability 1/2^32. Note that simply
|
153
|
+
// returning v <= c would approximate P very well (up to an absolute error
|
154
|
+
// of 1/2^32); the slow path (taken in that range of possible error, in the
|
155
|
+
// case of equality) eliminates the remaining error.
|
156
|
+
if (ABSL_PREDICT_TRUE(v != c)) return v < c;
|
157
|
+
|
158
|
+
// It is guaranteed that `q` is strictly less than 1, because if `q` were
|
159
|
+
// greater than or equal to 1, the same would be true for `p`. Certainly `p`
|
160
|
+
// cannot be greater than 1, and if `p == 1`, then the fast path would
|
161
|
+
// necessary have been taken already.
|
162
|
+
const double q = static_cast<double>(c) / kP32;
|
163
|
+
|
164
|
+
// The probability of acceptance on the fast path is `q` and so the
|
165
|
+
// probability of acceptance here should be `p - q`.
|
166
|
+
//
|
167
|
+
// Note that `q` is obtained from `p` via some shifts and conversions, the
|
168
|
+
// upshot of which is that `q` is simply `p` with some of the
|
169
|
+
// least-significant bits of its mantissa set to zero. This means that the
|
170
|
+
// difference `p - q` will not have any rounding errors. To see why, pretend
|
171
|
+
// that double has 10 bits of resolution and q is obtained from `p` in such
|
172
|
+
// a way that the 4 least-significant bits of its mantissa are set to zero.
|
173
|
+
// For example:
|
174
|
+
// p = 1.1100111011 * 2^-1
|
175
|
+
// q = 1.1100110000 * 2^-1
|
176
|
+
// p - q = 1.011 * 2^-8
|
177
|
+
// The difference `p - q` has exactly the nonzero mantissa bits that were
|
178
|
+
// "lost" in `q` producing a number which is certainly representable in a
|
179
|
+
// double.
|
180
|
+
const double left = p - q;
|
181
|
+
|
182
|
+
// By construction, the probability of being on this slow path is 1/2^32, so
|
183
|
+
// P(accept in slow path) = P(accept| in slow path) * P(slow path),
|
184
|
+
// which means the probability of acceptance here is `1 / (left * kP32)`:
|
185
|
+
const double here = left * kP32;
|
186
|
+
|
187
|
+
// The simplest way to compute the result of this trial is to repeat the
|
188
|
+
// whole algorithm with the new probability. This terminates because even
|
189
|
+
// given arbitrarily unfriendly "random" bits, each iteration either
|
190
|
+
// multiplies a tiny probability by 2^32 (if c == 0) or strips off some
|
191
|
+
// number of nonzero mantissa bits. That process is bounded.
|
192
|
+
if (here == 0) return false;
|
193
|
+
p = here;
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
ABSL_NAMESPACE_END
|
198
|
+
} // namespace absl
|
199
|
+
|
200
|
+
#endif // ABSL_RANDOM_BERNOULLI_DISTRIBUTION_H_
|