grpc 1.31.1 → 1.32.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 +595 -15723
- data/include/grpc/grpc_security.h +31 -14
- data/include/grpc/impl/codegen/README.md +22 -0
- data/include/grpc/impl/codegen/port_platform.h +6 -1
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
- data/src/core/ext/filters/client_channel/client_channel.cc +64 -20
- data/src/core/ext/filters/client_channel/client_channel.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
- data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +20 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +20 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
- data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +54 -56
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
- 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/fake/fake_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +363 -14
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
- data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +5 -4
- data/src/core/ext/filters/client_channel/server_address.cc +40 -7
- data/src/core/ext/filters/client_channel/server_address.h +42 -4
- data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
- data/src/core/ext/filters/client_channel/subchannel.h +16 -4
- data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
- data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
- data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
- data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
- data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +239 -277
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
- data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
- data/src/core/ext/transport/chttp2/transport/parsing.cc +1 -28
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
- data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
- data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
- data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
- data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
- data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
- data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
- data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
- data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
- data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
- data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
- data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
- data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
- data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
- data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
- data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
- data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
- data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
- data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
- data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
- data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
- data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
- data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
- data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
- data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
- data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
- data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
- data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
- data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
- data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
- data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
- data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
- data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
- data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.cc +1045 -767
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +114 -99
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +85 -417
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
- data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +3 -3
- data/src/core/lib/channel/channelz.cc +14 -15
- data/src/core/lib/channel/channelz.h +1 -1
- data/src/core/lib/channel/channelz_registry.cc +3 -1
- data/src/core/lib/gpr/sync_posix.cc +2 -8
- data/src/core/lib/iomgr/endpoint.cc +5 -1
- data/src/core/lib/iomgr/endpoint.h +7 -3
- data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
- data/src/core/lib/iomgr/ev_posix.cc +0 -2
- data/src/core/lib/iomgr/iomgr.cc +0 -10
- data/src/core/lib/iomgr/iomgr.h +0 -10
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
- data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
- data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
- data/src/core/lib/iomgr/tcp_custom.cc +32 -16
- data/src/core/lib/iomgr/tcp_posix.cc +31 -13
- data/src/core/lib/iomgr/tcp_windows.cc +26 -10
- data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
- data/src/core/lib/security/authorization/authorization_engine.h +84 -0
- data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
- data/src/core/lib/security/authorization/evaluate_args.h +59 -0
- data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
- data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
- data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
- data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
- data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
- data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -2
- data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
- data/src/core/lib/surface/call.cc +12 -12
- data/src/core/lib/surface/call.h +2 -1
- data/src/core/lib/surface/channel.cc +28 -20
- data/src/core/lib/surface/channel.h +12 -2
- data/src/core/lib/surface/completion_queue.cc +10 -272
- data/src/core/lib/surface/completion_queue.h +0 -8
- data/src/core/lib/surface/init.cc +1 -3
- data/src/core/lib/surface/server.cc +1066 -1244
- data/src/core/lib/surface/server.h +363 -87
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/authority_override.cc +38 -0
- data/src/core/lib/transport/authority_override.h +32 -0
- data/src/core/lib/transport/connectivity_state.cc +18 -13
- data/src/core/lib/transport/connectivity_state.h +18 -6
- data/src/core/lib/transport/error_utils.cc +13 -0
- data/src/core/lib/transport/error_utils.h +6 -0
- data/src/core/lib/transport/static_metadata.cc +295 -276
- data/src/core/lib/transport/static_metadata.h +80 -73
- data/src/core/lib/transport/transport.h +7 -0
- data/src/core/lib/uri/uri_parser.cc +23 -21
- data/src/core/lib/uri/uri_parser.h +3 -1
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
- data/src/core/tsi/ssl_transport_security.cc +3 -9
- data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_credentials_spec.rb +10 -0
- data/src/ruby/spec/generic/active_call_spec.rb +19 -8
- data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
- data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
- data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
- data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
- data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
- data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
- data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
- data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
- data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
- data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
- data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
- data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
- data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
- data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
- data/third_party/abseil-cpp/absl/status/status.cc +447 -0
- data/third_party/abseil-cpp/absl/status/status.h +428 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
- data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
- data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
- data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
- data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
- data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
- data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
- data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
- data/third_party/abseil-cpp/absl/types/variant.h +861 -0
- data/third_party/boringssl-with-bazel/err_data.c +263 -257
- data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
- data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
- data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +39 -7
- data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
- data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +11 -0
- data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
- data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
- data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
- data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -0
- data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
- data/third_party/upb/upb/decode.c +64 -15
- data/third_party/upb/upb/encode.c +2 -2
- data/third_party/upb/upb/msg.h +2 -2
- data/third_party/upb/upb/port_def.inc +1 -1
- data/third_party/upb/upb/table.c +0 -11
- data/third_party/upb/upb/table.int.h +0 -9
- data/third_party/upb/upb/upb.c +16 -14
- data/third_party/upb/upb/upb.h +26 -0
- data/third_party/upb/upb/upb.hpp +2 -0
- metadata +257 -155
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
- data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
- data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
- data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
- data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
- data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
- data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
- data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
- data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
- data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
- data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
- data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
- data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
- data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
- data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
- data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
- data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
- data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
- data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
- data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
- data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
- data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
- data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
- data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
- data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
- data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
- data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
- data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
- data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
- data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
- data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
- data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
- data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
- data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
- data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
- data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
- data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
- data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
- data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
- data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
- data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
- data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
- data/src/core/lib/security/transport/target_authority_table.cc +0 -75
- data/src/core/lib/security/transport/target_authority_table.h +0 -40
- data/src/core/lib/slice/slice_hash_table.h +0 -199
- data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
@@ -0,0 +1,161 @@
|
|
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
|
+
// Functions for directly invoking mmap() via syscall, avoiding the case where
|
16
|
+
// mmap() has been locally overridden.
|
17
|
+
|
18
|
+
#ifndef ABSL_BASE_INTERNAL_DIRECT_MMAP_H_
|
19
|
+
#define ABSL_BASE_INTERNAL_DIRECT_MMAP_H_
|
20
|
+
|
21
|
+
#include "absl/base/config.h"
|
22
|
+
|
23
|
+
#if ABSL_HAVE_MMAP
|
24
|
+
|
25
|
+
#include <sys/mman.h>
|
26
|
+
|
27
|
+
#ifdef __linux__
|
28
|
+
|
29
|
+
#include <sys/types.h>
|
30
|
+
#ifdef __BIONIC__
|
31
|
+
#include <sys/syscall.h>
|
32
|
+
#else
|
33
|
+
#include <syscall.h>
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#include <linux/unistd.h>
|
37
|
+
#include <unistd.h>
|
38
|
+
#include <cerrno>
|
39
|
+
#include <cstdarg>
|
40
|
+
#include <cstdint>
|
41
|
+
|
42
|
+
#ifdef __mips__
|
43
|
+
// Include definitions of the ABI currently in use.
|
44
|
+
#ifdef __BIONIC__
|
45
|
+
// Android doesn't have sgidefs.h, but does have asm/sgidefs.h, which has the
|
46
|
+
// definitions we need.
|
47
|
+
#include <asm/sgidefs.h>
|
48
|
+
#else
|
49
|
+
#include <sgidefs.h>
|
50
|
+
#endif // __BIONIC__
|
51
|
+
#endif // __mips__
|
52
|
+
|
53
|
+
// SYS_mmap and SYS_munmap are not defined in Android.
|
54
|
+
#ifdef __BIONIC__
|
55
|
+
extern "C" void* __mmap2(void*, size_t, int, int, int, size_t);
|
56
|
+
#if defined(__NR_mmap) && !defined(SYS_mmap)
|
57
|
+
#define SYS_mmap __NR_mmap
|
58
|
+
#endif
|
59
|
+
#ifndef SYS_munmap
|
60
|
+
#define SYS_munmap __NR_munmap
|
61
|
+
#endif
|
62
|
+
#endif // __BIONIC__
|
63
|
+
|
64
|
+
namespace absl {
|
65
|
+
ABSL_NAMESPACE_BEGIN
|
66
|
+
namespace base_internal {
|
67
|
+
|
68
|
+
// Platform specific logic extracted from
|
69
|
+
// https://chromium.googlesource.com/linux-syscall-support/+/master/linux_syscall_support.h
|
70
|
+
inline void* DirectMmap(void* start, size_t length, int prot, int flags, int fd,
|
71
|
+
off64_t offset) noexcept {
|
72
|
+
#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__ARM_EABI__) || \
|
73
|
+
(defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || \
|
74
|
+
(defined(__PPC__) && !defined(__PPC64__)) || \
|
75
|
+
(defined(__s390__) && !defined(__s390x__))
|
76
|
+
// On these architectures, implement mmap with mmap2.
|
77
|
+
static int pagesize = 0;
|
78
|
+
if (pagesize == 0) {
|
79
|
+
#if defined(__wasm__) || defined(__asmjs__)
|
80
|
+
pagesize = getpagesize();
|
81
|
+
#else
|
82
|
+
pagesize = sysconf(_SC_PAGESIZE);
|
83
|
+
#endif
|
84
|
+
}
|
85
|
+
if (offset < 0 || offset % pagesize != 0) {
|
86
|
+
errno = EINVAL;
|
87
|
+
return MAP_FAILED;
|
88
|
+
}
|
89
|
+
#ifdef __BIONIC__
|
90
|
+
// SYS_mmap2 has problems on Android API level <= 16.
|
91
|
+
// Workaround by invoking __mmap2() instead.
|
92
|
+
return __mmap2(start, length, prot, flags, fd, offset / pagesize);
|
93
|
+
#else
|
94
|
+
return reinterpret_cast<void*>(
|
95
|
+
syscall(SYS_mmap2, start, length, prot, flags, fd,
|
96
|
+
static_cast<off_t>(offset / pagesize)));
|
97
|
+
#endif
|
98
|
+
#elif defined(__s390x__)
|
99
|
+
// On s390x, mmap() arguments are passed in memory.
|
100
|
+
unsigned long buf[6] = {reinterpret_cast<unsigned long>(start), // NOLINT
|
101
|
+
static_cast<unsigned long>(length), // NOLINT
|
102
|
+
static_cast<unsigned long>(prot), // NOLINT
|
103
|
+
static_cast<unsigned long>(flags), // NOLINT
|
104
|
+
static_cast<unsigned long>(fd), // NOLINT
|
105
|
+
static_cast<unsigned long>(offset)}; // NOLINT
|
106
|
+
return reinterpret_cast<void*>(syscall(SYS_mmap, buf));
|
107
|
+
#elif defined(__x86_64__)
|
108
|
+
// The x32 ABI has 32 bit longs, but the syscall interface is 64 bit.
|
109
|
+
// We need to explicitly cast to an unsigned 64 bit type to avoid implicit
|
110
|
+
// sign extension. We can't cast pointers directly because those are
|
111
|
+
// 32 bits, and gcc will dump ugly warnings about casting from a pointer
|
112
|
+
// to an integer of a different size. We also need to make sure __off64_t
|
113
|
+
// isn't truncated to 32-bits under x32.
|
114
|
+
#define MMAP_SYSCALL_ARG(x) ((uint64_t)(uintptr_t)(x))
|
115
|
+
return reinterpret_cast<void*>(
|
116
|
+
syscall(SYS_mmap, MMAP_SYSCALL_ARG(start), MMAP_SYSCALL_ARG(length),
|
117
|
+
MMAP_SYSCALL_ARG(prot), MMAP_SYSCALL_ARG(flags),
|
118
|
+
MMAP_SYSCALL_ARG(fd), static_cast<uint64_t>(offset)));
|
119
|
+
#undef MMAP_SYSCALL_ARG
|
120
|
+
#else // Remaining 64-bit aritectures.
|
121
|
+
static_assert(sizeof(unsigned long) == 8, "Platform is not 64-bit");
|
122
|
+
return reinterpret_cast<void*>(
|
123
|
+
syscall(SYS_mmap, start, length, prot, flags, fd, offset));
|
124
|
+
#endif
|
125
|
+
}
|
126
|
+
|
127
|
+
inline int DirectMunmap(void* start, size_t length) {
|
128
|
+
return static_cast<int>(syscall(SYS_munmap, start, length));
|
129
|
+
}
|
130
|
+
|
131
|
+
} // namespace base_internal
|
132
|
+
ABSL_NAMESPACE_END
|
133
|
+
} // namespace absl
|
134
|
+
|
135
|
+
#else // !__linux__
|
136
|
+
|
137
|
+
// For non-linux platforms where we have mmap, just dispatch directly to the
|
138
|
+
// actual mmap()/munmap() methods.
|
139
|
+
|
140
|
+
namespace absl {
|
141
|
+
ABSL_NAMESPACE_BEGIN
|
142
|
+
namespace base_internal {
|
143
|
+
|
144
|
+
inline void* DirectMmap(void* start, size_t length, int prot, int flags, int fd,
|
145
|
+
off_t offset) {
|
146
|
+
return mmap(start, length, prot, flags, fd, offset);
|
147
|
+
}
|
148
|
+
|
149
|
+
inline int DirectMunmap(void* start, size_t length) {
|
150
|
+
return munmap(start, length);
|
151
|
+
}
|
152
|
+
|
153
|
+
} // namespace base_internal
|
154
|
+
ABSL_NAMESPACE_END
|
155
|
+
} // namespace absl
|
156
|
+
|
157
|
+
#endif // __linux__
|
158
|
+
|
159
|
+
#endif // ABSL_HAVE_MMAP
|
160
|
+
|
161
|
+
#endif // ABSL_BASE_INTERNAL_DIRECT_MMAP_H_
|
@@ -0,0 +1,93 @@
|
|
1
|
+
// Copyright 2019 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
|
+
#include "absl/base/internal/exponential_biased.h"
|
16
|
+
|
17
|
+
#include <stdint.h>
|
18
|
+
|
19
|
+
#include <algorithm>
|
20
|
+
#include <atomic>
|
21
|
+
#include <cmath>
|
22
|
+
#include <limits>
|
23
|
+
|
24
|
+
#include "absl/base/attributes.h"
|
25
|
+
#include "absl/base/optimization.h"
|
26
|
+
|
27
|
+
namespace absl {
|
28
|
+
ABSL_NAMESPACE_BEGIN
|
29
|
+
namespace base_internal {
|
30
|
+
|
31
|
+
// The algorithm generates a random number between 0 and 1 and applies the
|
32
|
+
// inverse cumulative distribution function for an exponential. Specifically:
|
33
|
+
// Let m be the inverse of the sample period, then the probability
|
34
|
+
// distribution function is m*exp(-mx) so the CDF is
|
35
|
+
// p = 1 - exp(-mx), so
|
36
|
+
// q = 1 - p = exp(-mx)
|
37
|
+
// log_e(q) = -mx
|
38
|
+
// -log_e(q)/m = x
|
39
|
+
// log_2(q) * (-log_e(2) * 1/m) = x
|
40
|
+
// In the code, q is actually in the range 1 to 2**26, hence the -26 below
|
41
|
+
int64_t ExponentialBiased::GetSkipCount(int64_t mean) {
|
42
|
+
if (ABSL_PREDICT_FALSE(!initialized_)) {
|
43
|
+
Initialize();
|
44
|
+
}
|
45
|
+
|
46
|
+
uint64_t rng = NextRandom(rng_);
|
47
|
+
rng_ = rng;
|
48
|
+
|
49
|
+
// Take the top 26 bits as the random number
|
50
|
+
// (This plus the 1<<58 sampling bound give a max possible step of
|
51
|
+
// 5194297183973780480 bytes.)
|
52
|
+
// The uint32_t cast is to prevent a (hard-to-reproduce) NAN
|
53
|
+
// under piii debug for some binaries.
|
54
|
+
double q = static_cast<uint32_t>(rng >> (kPrngNumBits - 26)) + 1.0;
|
55
|
+
// Put the computed p-value through the CDF of a geometric.
|
56
|
+
double interval = bias_ + (std::log2(q) - 26) * (-std::log(2.0) * mean);
|
57
|
+
// Very large values of interval overflow int64_t. To avoid that, we will
|
58
|
+
// cheat and clamp any huge values to (int64_t max)/2. This is a potential
|
59
|
+
// source of bias, but the mean would need to be such a large value that it's
|
60
|
+
// not likely to come up. For example, with a mean of 1e18, the probability of
|
61
|
+
// hitting this condition is about 1/1000. For a mean of 1e17, standard
|
62
|
+
// calculators claim that this event won't happen.
|
63
|
+
if (interval > static_cast<double>(std::numeric_limits<int64_t>::max() / 2)) {
|
64
|
+
// Assume huge values are bias neutral, retain bias for next call.
|
65
|
+
return std::numeric_limits<int64_t>::max() / 2;
|
66
|
+
}
|
67
|
+
double value = std::round(interval);
|
68
|
+
bias_ = interval - value;
|
69
|
+
return value;
|
70
|
+
}
|
71
|
+
|
72
|
+
int64_t ExponentialBiased::GetStride(int64_t mean) {
|
73
|
+
return GetSkipCount(mean - 1) + 1;
|
74
|
+
}
|
75
|
+
|
76
|
+
void ExponentialBiased::Initialize() {
|
77
|
+
// We don't get well distributed numbers from `this` so we call NextRandom() a
|
78
|
+
// bunch to mush the bits around. We use a global_rand to handle the case
|
79
|
+
// where the same thread (by memory address) gets created and destroyed
|
80
|
+
// repeatedly.
|
81
|
+
ABSL_CONST_INIT static std::atomic<uint32_t> global_rand(0);
|
82
|
+
uint64_t r = reinterpret_cast<uint64_t>(this) +
|
83
|
+
global_rand.fetch_add(1, std::memory_order_relaxed);
|
84
|
+
for (int i = 0; i < 20; ++i) {
|
85
|
+
r = NextRandom(r);
|
86
|
+
}
|
87
|
+
rng_ = r;
|
88
|
+
initialized_ = true;
|
89
|
+
}
|
90
|
+
|
91
|
+
} // namespace base_internal
|
92
|
+
ABSL_NAMESPACE_END
|
93
|
+
} // namespace absl
|
@@ -0,0 +1,130 @@
|
|
1
|
+
// Copyright 2019 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_BASE_INTERNAL_EXPONENTIAL_BIASED_H_
|
16
|
+
#define ABSL_BASE_INTERNAL_EXPONENTIAL_BIASED_H_
|
17
|
+
|
18
|
+
#include <stdint.h>
|
19
|
+
|
20
|
+
#include "absl/base/config.h"
|
21
|
+
#include "absl/base/macros.h"
|
22
|
+
|
23
|
+
namespace absl {
|
24
|
+
ABSL_NAMESPACE_BEGIN
|
25
|
+
namespace base_internal {
|
26
|
+
|
27
|
+
// ExponentialBiased provides a small and fast random number generator for a
|
28
|
+
// rounded exponential distribution. This generator manages very little state,
|
29
|
+
// and imposes no synchronization overhead. This makes it useful in specialized
|
30
|
+
// scenarios requiring minimum overhead, such as stride based periodic sampling.
|
31
|
+
//
|
32
|
+
// ExponentialBiased provides two closely related functions, GetSkipCount() and
|
33
|
+
// GetStride(), both returning a rounded integer defining a number of events
|
34
|
+
// required before some event with a given mean probability occurs.
|
35
|
+
//
|
36
|
+
// The distribution is useful to generate a random wait time or some periodic
|
37
|
+
// event with a given mean probability. For example, if an action is supposed to
|
38
|
+
// happen on average once every 'N' events, then we can get a random 'stride'
|
39
|
+
// counting down how long before the event to happen. For example, if we'd want
|
40
|
+
// to sample one in every 1000 'Frobber' calls, our code could look like this:
|
41
|
+
//
|
42
|
+
// Frobber::Frobber() {
|
43
|
+
// stride_ = exponential_biased_.GetStride(1000);
|
44
|
+
// }
|
45
|
+
//
|
46
|
+
// void Frobber::Frob(int arg) {
|
47
|
+
// if (--stride == 0) {
|
48
|
+
// SampleFrob(arg);
|
49
|
+
// stride_ = exponential_biased_.GetStride(1000);
|
50
|
+
// }
|
51
|
+
// ...
|
52
|
+
// }
|
53
|
+
//
|
54
|
+
// The rounding of the return value creates a bias, especially for smaller means
|
55
|
+
// where the distribution of the fraction is not evenly distributed. We correct
|
56
|
+
// this bias by tracking the fraction we rounded up or down on each iteration,
|
57
|
+
// effectively tracking the distance between the cumulative value, and the
|
58
|
+
// rounded cumulative value. For example, given a mean of 2:
|
59
|
+
//
|
60
|
+
// raw = 1.63076, cumulative = 1.63076, rounded = 2, bias = -0.36923
|
61
|
+
// raw = 0.14624, cumulative = 1.77701, rounded = 2, bias = 0.14624
|
62
|
+
// raw = 4.93194, cumulative = 6.70895, rounded = 7, bias = -0.06805
|
63
|
+
// raw = 0.24206, cumulative = 6.95101, rounded = 7, bias = 0.24206
|
64
|
+
// etc...
|
65
|
+
//
|
66
|
+
// Adjusting with rounding bias is relatively trivial:
|
67
|
+
//
|
68
|
+
// double value = bias_ + exponential_distribution(mean)();
|
69
|
+
// double rounded_value = std::round(value);
|
70
|
+
// bias_ = value - rounded_value;
|
71
|
+
// return rounded_value;
|
72
|
+
//
|
73
|
+
// This class is thread-compatible.
|
74
|
+
class ExponentialBiased {
|
75
|
+
public:
|
76
|
+
// The number of bits set by NextRandom.
|
77
|
+
static constexpr int kPrngNumBits = 48;
|
78
|
+
|
79
|
+
// `GetSkipCount()` returns the number of events to skip before some chosen
|
80
|
+
// event happens. For example, randomly tossing a coin, we will on average
|
81
|
+
// throw heads once before we get tails. We can simulate random coin tosses
|
82
|
+
// using GetSkipCount() as:
|
83
|
+
//
|
84
|
+
// ExponentialBiased eb;
|
85
|
+
// for (...) {
|
86
|
+
// int number_of_heads_before_tail = eb.GetSkipCount(1);
|
87
|
+
// for (int flips = 0; flips < number_of_heads_before_tail; ++flips) {
|
88
|
+
// printf("head...");
|
89
|
+
// }
|
90
|
+
// printf("tail\n");
|
91
|
+
// }
|
92
|
+
//
|
93
|
+
int64_t GetSkipCount(int64_t mean);
|
94
|
+
|
95
|
+
// GetStride() returns the number of events required for a specific event to
|
96
|
+
// happen. See the class comments for a usage example. `GetStride()` is
|
97
|
+
// equivalent to `GetSkipCount(mean - 1) + 1`. When to use `GetStride()` or
|
98
|
+
// `GetSkipCount()` depends mostly on what best fits the use case.
|
99
|
+
int64_t GetStride(int64_t mean);
|
100
|
+
|
101
|
+
// Computes a random number in the range [0, 1<<(kPrngNumBits+1) - 1]
|
102
|
+
//
|
103
|
+
// This is public to enable testing.
|
104
|
+
static uint64_t NextRandom(uint64_t rnd);
|
105
|
+
|
106
|
+
private:
|
107
|
+
void Initialize();
|
108
|
+
|
109
|
+
uint64_t rng_{0};
|
110
|
+
double bias_{0};
|
111
|
+
bool initialized_{false};
|
112
|
+
};
|
113
|
+
|
114
|
+
// Returns the next prng value.
|
115
|
+
// pRNG is: aX+b mod c with a = 0x5DEECE66D, b = 0xB, c = 1<<48
|
116
|
+
// This is the lrand64 generator.
|
117
|
+
inline uint64_t ExponentialBiased::NextRandom(uint64_t rnd) {
|
118
|
+
const uint64_t prng_mult = uint64_t{0x5DEECE66D};
|
119
|
+
const uint64_t prng_add = 0xB;
|
120
|
+
const uint64_t prng_mod_power = 48;
|
121
|
+
const uint64_t prng_mod_mask =
|
122
|
+
~((~static_cast<uint64_t>(0)) << prng_mod_power);
|
123
|
+
return (prng_mult * rnd + prng_add) & prng_mod_mask;
|
124
|
+
}
|
125
|
+
|
126
|
+
} // namespace base_internal
|
127
|
+
ABSL_NAMESPACE_END
|
128
|
+
} // namespace absl
|
129
|
+
|
130
|
+
#endif // ABSL_BASE_INTERNAL_EXPONENTIAL_BIASED_H_
|
@@ -0,0 +1,620 @@
|
|
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
|
+
// A low-level allocator that can be used by other low-level
|
16
|
+
// modules without introducing dependency cycles.
|
17
|
+
// This allocator is slow and wasteful of memory;
|
18
|
+
// it should not be used when performance is key.
|
19
|
+
|
20
|
+
#include "absl/base/internal/low_level_alloc.h"
|
21
|
+
|
22
|
+
#include <type_traits>
|
23
|
+
|
24
|
+
#include "absl/base/call_once.h"
|
25
|
+
#include "absl/base/config.h"
|
26
|
+
#include "absl/base/internal/direct_mmap.h"
|
27
|
+
#include "absl/base/internal/scheduling_mode.h"
|
28
|
+
#include "absl/base/macros.h"
|
29
|
+
#include "absl/base/thread_annotations.h"
|
30
|
+
|
31
|
+
// LowLevelAlloc requires that the platform support low-level
|
32
|
+
// allocation of virtual memory. Platforms lacking this cannot use
|
33
|
+
// LowLevelAlloc.
|
34
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_MISSING
|
35
|
+
|
36
|
+
#ifndef _WIN32
|
37
|
+
#include <pthread.h>
|
38
|
+
#include <signal.h>
|
39
|
+
#include <sys/mman.h>
|
40
|
+
#include <unistd.h>
|
41
|
+
#else
|
42
|
+
#include <windows.h>
|
43
|
+
#endif
|
44
|
+
|
45
|
+
#include <string.h>
|
46
|
+
#include <algorithm>
|
47
|
+
#include <atomic>
|
48
|
+
#include <cerrno>
|
49
|
+
#include <cstddef>
|
50
|
+
#include <new> // for placement-new
|
51
|
+
|
52
|
+
#include "absl/base/dynamic_annotations.h"
|
53
|
+
#include "absl/base/internal/raw_logging.h"
|
54
|
+
#include "absl/base/internal/spinlock.h"
|
55
|
+
|
56
|
+
// MAP_ANONYMOUS
|
57
|
+
#if defined(__APPLE__)
|
58
|
+
// For mmap, Linux defines both MAP_ANONYMOUS and MAP_ANON and says MAP_ANON is
|
59
|
+
// deprecated. In Darwin, MAP_ANON is all there is.
|
60
|
+
#if !defined MAP_ANONYMOUS
|
61
|
+
#define MAP_ANONYMOUS MAP_ANON
|
62
|
+
#endif // !MAP_ANONYMOUS
|
63
|
+
#endif // __APPLE__
|
64
|
+
|
65
|
+
namespace absl {
|
66
|
+
ABSL_NAMESPACE_BEGIN
|
67
|
+
namespace base_internal {
|
68
|
+
|
69
|
+
// A first-fit allocator with amortized logarithmic free() time.
|
70
|
+
|
71
|
+
// ---------------------------------------------------------------------------
|
72
|
+
static const int kMaxLevel = 30;
|
73
|
+
|
74
|
+
namespace {
|
75
|
+
// This struct describes one allocated block, or one free block.
|
76
|
+
struct AllocList {
|
77
|
+
struct Header {
|
78
|
+
// Size of entire region, including this field. Must be
|
79
|
+
// first. Valid in both allocated and unallocated blocks.
|
80
|
+
uintptr_t size;
|
81
|
+
|
82
|
+
// kMagicAllocated or kMagicUnallocated xor this.
|
83
|
+
uintptr_t magic;
|
84
|
+
|
85
|
+
// Pointer to parent arena.
|
86
|
+
LowLevelAlloc::Arena *arena;
|
87
|
+
|
88
|
+
// Aligns regions to 0 mod 2*sizeof(void*).
|
89
|
+
void *dummy_for_alignment;
|
90
|
+
} header;
|
91
|
+
|
92
|
+
// Next two fields: in unallocated blocks: freelist skiplist data
|
93
|
+
// in allocated blocks: overlaps with client data
|
94
|
+
|
95
|
+
// Levels in skiplist used.
|
96
|
+
int levels;
|
97
|
+
|
98
|
+
// Actually has levels elements. The AllocList node may not have room
|
99
|
+
// for all kMaxLevel entries. See max_fit in LLA_SkiplistLevels().
|
100
|
+
AllocList *next[kMaxLevel];
|
101
|
+
};
|
102
|
+
} // namespace
|
103
|
+
|
104
|
+
// ---------------------------------------------------------------------------
|
105
|
+
// A trivial skiplist implementation. This is used to keep the freelist
|
106
|
+
// in address order while taking only logarithmic time per insert and delete.
|
107
|
+
|
108
|
+
// An integer approximation of log2(size/base)
|
109
|
+
// Requires size >= base.
|
110
|
+
static int IntLog2(size_t size, size_t base) {
|
111
|
+
int result = 0;
|
112
|
+
for (size_t i = size; i > base; i >>= 1) { // i == floor(size/2**result)
|
113
|
+
result++;
|
114
|
+
}
|
115
|
+
// floor(size / 2**result) <= base < floor(size / 2**(result-1))
|
116
|
+
// => log2(size/(base+1)) <= result < 1+log2(size/base)
|
117
|
+
// => result ~= log2(size/base)
|
118
|
+
return result;
|
119
|
+
}
|
120
|
+
|
121
|
+
// Return a random integer n: p(n)=1/(2**n) if 1 <= n; p(n)=0 if n < 1.
|
122
|
+
static int Random(uint32_t *state) {
|
123
|
+
uint32_t r = *state;
|
124
|
+
int result = 1;
|
125
|
+
while ((((r = r*1103515245 + 12345) >> 30) & 1) == 0) {
|
126
|
+
result++;
|
127
|
+
}
|
128
|
+
*state = r;
|
129
|
+
return result;
|
130
|
+
}
|
131
|
+
|
132
|
+
// Return a number of skiplist levels for a node of size bytes, where
|
133
|
+
// base is the minimum node size. Compute level=log2(size / base)+n
|
134
|
+
// where n is 1 if random is false and otherwise a random number generated with
|
135
|
+
// the standard distribution for a skiplist: See Random() above.
|
136
|
+
// Bigger nodes tend to have more skiplist levels due to the log2(size / base)
|
137
|
+
// term, so first-fit searches touch fewer nodes. "level" is clipped so
|
138
|
+
// level<kMaxLevel and next[level-1] will fit in the node.
|
139
|
+
// 0 < LLA_SkiplistLevels(x,y,false) <= LLA_SkiplistLevels(x,y,true) < kMaxLevel
|
140
|
+
static int LLA_SkiplistLevels(size_t size, size_t base, uint32_t *random) {
|
141
|
+
// max_fit is the maximum number of levels that will fit in a node for the
|
142
|
+
// given size. We can't return more than max_fit, no matter what the
|
143
|
+
// random number generator says.
|
144
|
+
size_t max_fit = (size - offsetof(AllocList, next)) / sizeof(AllocList *);
|
145
|
+
int level = IntLog2(size, base) + (random != nullptr ? Random(random) : 1);
|
146
|
+
if (static_cast<size_t>(level) > max_fit) level = static_cast<int>(max_fit);
|
147
|
+
if (level > kMaxLevel-1) level = kMaxLevel - 1;
|
148
|
+
ABSL_RAW_CHECK(level >= 1, "block not big enough for even one level");
|
149
|
+
return level;
|
150
|
+
}
|
151
|
+
|
152
|
+
// Return "atleast", the first element of AllocList *head s.t. *atleast >= *e.
|
153
|
+
// For 0 <= i < head->levels, set prev[i] to "no_greater", where no_greater
|
154
|
+
// points to the last element at level i in the AllocList less than *e, or is
|
155
|
+
// head if no such element exists.
|
156
|
+
static AllocList *LLA_SkiplistSearch(AllocList *head,
|
157
|
+
AllocList *e, AllocList **prev) {
|
158
|
+
AllocList *p = head;
|
159
|
+
for (int level = head->levels - 1; level >= 0; level--) {
|
160
|
+
for (AllocList *n; (n = p->next[level]) != nullptr && n < e; p = n) {
|
161
|
+
}
|
162
|
+
prev[level] = p;
|
163
|
+
}
|
164
|
+
return (head->levels == 0) ? nullptr : prev[0]->next[0];
|
165
|
+
}
|
166
|
+
|
167
|
+
// Insert element *e into AllocList *head. Set prev[] as LLA_SkiplistSearch.
|
168
|
+
// Requires that e->levels be previously set by the caller (using
|
169
|
+
// LLA_SkiplistLevels())
|
170
|
+
static void LLA_SkiplistInsert(AllocList *head, AllocList *e,
|
171
|
+
AllocList **prev) {
|
172
|
+
LLA_SkiplistSearch(head, e, prev);
|
173
|
+
for (; head->levels < e->levels; head->levels++) { // extend prev pointers
|
174
|
+
prev[head->levels] = head; // to all *e's levels
|
175
|
+
}
|
176
|
+
for (int i = 0; i != e->levels; i++) { // add element to list
|
177
|
+
e->next[i] = prev[i]->next[i];
|
178
|
+
prev[i]->next[i] = e;
|
179
|
+
}
|
180
|
+
}
|
181
|
+
|
182
|
+
// Remove element *e from AllocList *head. Set prev[] as LLA_SkiplistSearch().
|
183
|
+
// Requires that e->levels be previous set by the caller (using
|
184
|
+
// LLA_SkiplistLevels())
|
185
|
+
static void LLA_SkiplistDelete(AllocList *head, AllocList *e,
|
186
|
+
AllocList **prev) {
|
187
|
+
AllocList *found = LLA_SkiplistSearch(head, e, prev);
|
188
|
+
ABSL_RAW_CHECK(e == found, "element not in freelist");
|
189
|
+
for (int i = 0; i != e->levels && prev[i]->next[i] == e; i++) {
|
190
|
+
prev[i]->next[i] = e->next[i];
|
191
|
+
}
|
192
|
+
while (head->levels > 0 && head->next[head->levels - 1] == nullptr) {
|
193
|
+
head->levels--; // reduce head->levels if level unused
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
// ---------------------------------------------------------------------------
|
198
|
+
// Arena implementation
|
199
|
+
|
200
|
+
// Metadata for an LowLevelAlloc arena instance.
|
201
|
+
struct LowLevelAlloc::Arena {
|
202
|
+
// Constructs an arena with the given LowLevelAlloc flags.
|
203
|
+
explicit Arena(uint32_t flags_value);
|
204
|
+
|
205
|
+
base_internal::SpinLock mu;
|
206
|
+
// Head of free list, sorted by address
|
207
|
+
AllocList freelist ABSL_GUARDED_BY(mu);
|
208
|
+
// Count of allocated blocks
|
209
|
+
int32_t allocation_count ABSL_GUARDED_BY(mu);
|
210
|
+
// flags passed to NewArena
|
211
|
+
const uint32_t flags;
|
212
|
+
// Result of sysconf(_SC_PAGESIZE)
|
213
|
+
const size_t pagesize;
|
214
|
+
// Lowest power of two >= max(16, sizeof(AllocList))
|
215
|
+
const size_t round_up;
|
216
|
+
// Smallest allocation block size
|
217
|
+
const size_t min_size;
|
218
|
+
// PRNG state
|
219
|
+
uint32_t random ABSL_GUARDED_BY(mu);
|
220
|
+
};
|
221
|
+
|
222
|
+
namespace {
|
223
|
+
// Static storage space for the lazily-constructed, default global arena
|
224
|
+
// instances. We require this space because the whole point of LowLevelAlloc
|
225
|
+
// is to avoid relying on malloc/new.
|
226
|
+
alignas(LowLevelAlloc::Arena) unsigned char default_arena_storage[sizeof(
|
227
|
+
LowLevelAlloc::Arena)];
|
228
|
+
alignas(LowLevelAlloc::Arena) unsigned char unhooked_arena_storage[sizeof(
|
229
|
+
LowLevelAlloc::Arena)];
|
230
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
231
|
+
alignas(
|
232
|
+
LowLevelAlloc::Arena) unsigned char unhooked_async_sig_safe_arena_storage
|
233
|
+
[sizeof(LowLevelAlloc::Arena)];
|
234
|
+
#endif
|
235
|
+
|
236
|
+
// We must use LowLevelCallOnce here to construct the global arenas, rather than
|
237
|
+
// using function-level statics, to avoid recursively invoking the scheduler.
|
238
|
+
absl::once_flag create_globals_once;
|
239
|
+
|
240
|
+
void CreateGlobalArenas() {
|
241
|
+
new (&default_arena_storage)
|
242
|
+
LowLevelAlloc::Arena(LowLevelAlloc::kCallMallocHook);
|
243
|
+
new (&unhooked_arena_storage) LowLevelAlloc::Arena(0);
|
244
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
245
|
+
new (&unhooked_async_sig_safe_arena_storage)
|
246
|
+
LowLevelAlloc::Arena(LowLevelAlloc::kAsyncSignalSafe);
|
247
|
+
#endif
|
248
|
+
}
|
249
|
+
|
250
|
+
// Returns a global arena that does not call into hooks. Used by NewArena()
|
251
|
+
// when kCallMallocHook is not set.
|
252
|
+
LowLevelAlloc::Arena* UnhookedArena() {
|
253
|
+
base_internal::LowLevelCallOnce(&create_globals_once, CreateGlobalArenas);
|
254
|
+
return reinterpret_cast<LowLevelAlloc::Arena*>(&unhooked_arena_storage);
|
255
|
+
}
|
256
|
+
|
257
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
258
|
+
// Returns a global arena that is async-signal safe. Used by NewArena() when
|
259
|
+
// kAsyncSignalSafe is set.
|
260
|
+
LowLevelAlloc::Arena *UnhookedAsyncSigSafeArena() {
|
261
|
+
base_internal::LowLevelCallOnce(&create_globals_once, CreateGlobalArenas);
|
262
|
+
return reinterpret_cast<LowLevelAlloc::Arena *>(
|
263
|
+
&unhooked_async_sig_safe_arena_storage);
|
264
|
+
}
|
265
|
+
#endif
|
266
|
+
|
267
|
+
} // namespace
|
268
|
+
|
269
|
+
// Returns the default arena, as used by LowLevelAlloc::Alloc() and friends.
|
270
|
+
LowLevelAlloc::Arena *LowLevelAlloc::DefaultArena() {
|
271
|
+
base_internal::LowLevelCallOnce(&create_globals_once, CreateGlobalArenas);
|
272
|
+
return reinterpret_cast<LowLevelAlloc::Arena*>(&default_arena_storage);
|
273
|
+
}
|
274
|
+
|
275
|
+
// magic numbers to identify allocated and unallocated blocks
|
276
|
+
static const uintptr_t kMagicAllocated = 0x4c833e95U;
|
277
|
+
static const uintptr_t kMagicUnallocated = ~kMagicAllocated;
|
278
|
+
|
279
|
+
namespace {
|
280
|
+
class ABSL_SCOPED_LOCKABLE ArenaLock {
|
281
|
+
public:
|
282
|
+
explicit ArenaLock(LowLevelAlloc::Arena *arena)
|
283
|
+
ABSL_EXCLUSIVE_LOCK_FUNCTION(arena->mu)
|
284
|
+
: arena_(arena) {
|
285
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
286
|
+
if ((arena->flags & LowLevelAlloc::kAsyncSignalSafe) != 0) {
|
287
|
+
sigset_t all;
|
288
|
+
sigfillset(&all);
|
289
|
+
mask_valid_ = pthread_sigmask(SIG_BLOCK, &all, &mask_) == 0;
|
290
|
+
}
|
291
|
+
#endif
|
292
|
+
arena_->mu.Lock();
|
293
|
+
}
|
294
|
+
~ArenaLock() { ABSL_RAW_CHECK(left_, "haven't left Arena region"); }
|
295
|
+
void Leave() ABSL_UNLOCK_FUNCTION() {
|
296
|
+
arena_->mu.Unlock();
|
297
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
298
|
+
if (mask_valid_) {
|
299
|
+
const int err = pthread_sigmask(SIG_SETMASK, &mask_, nullptr);
|
300
|
+
if (err != 0) {
|
301
|
+
ABSL_RAW_LOG(FATAL, "pthread_sigmask failed: %d", err);
|
302
|
+
}
|
303
|
+
}
|
304
|
+
#endif
|
305
|
+
left_ = true;
|
306
|
+
}
|
307
|
+
|
308
|
+
private:
|
309
|
+
bool left_ = false; // whether left region
|
310
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
311
|
+
bool mask_valid_ = false;
|
312
|
+
sigset_t mask_; // old mask of blocked signals
|
313
|
+
#endif
|
314
|
+
LowLevelAlloc::Arena *arena_;
|
315
|
+
ArenaLock(const ArenaLock &) = delete;
|
316
|
+
ArenaLock &operator=(const ArenaLock &) = delete;
|
317
|
+
};
|
318
|
+
} // namespace
|
319
|
+
|
320
|
+
// create an appropriate magic number for an object at "ptr"
|
321
|
+
// "magic" should be kMagicAllocated or kMagicUnallocated
|
322
|
+
inline static uintptr_t Magic(uintptr_t magic, AllocList::Header *ptr) {
|
323
|
+
return magic ^ reinterpret_cast<uintptr_t>(ptr);
|
324
|
+
}
|
325
|
+
|
326
|
+
namespace {
|
327
|
+
size_t GetPageSize() {
|
328
|
+
#ifdef _WIN32
|
329
|
+
SYSTEM_INFO system_info;
|
330
|
+
GetSystemInfo(&system_info);
|
331
|
+
return std::max(system_info.dwPageSize, system_info.dwAllocationGranularity);
|
332
|
+
#elif defined(__wasm__) || defined(__asmjs__)
|
333
|
+
return getpagesize();
|
334
|
+
#else
|
335
|
+
return sysconf(_SC_PAGESIZE);
|
336
|
+
#endif
|
337
|
+
}
|
338
|
+
|
339
|
+
size_t RoundedUpBlockSize() {
|
340
|
+
// Round up block sizes to a power of two close to the header size.
|
341
|
+
size_t round_up = 16;
|
342
|
+
while (round_up < sizeof(AllocList::Header)) {
|
343
|
+
round_up += round_up;
|
344
|
+
}
|
345
|
+
return round_up;
|
346
|
+
}
|
347
|
+
|
348
|
+
} // namespace
|
349
|
+
|
350
|
+
LowLevelAlloc::Arena::Arena(uint32_t flags_value)
|
351
|
+
: mu(base_internal::SCHEDULE_KERNEL_ONLY),
|
352
|
+
allocation_count(0),
|
353
|
+
flags(flags_value),
|
354
|
+
pagesize(GetPageSize()),
|
355
|
+
round_up(RoundedUpBlockSize()),
|
356
|
+
min_size(2 * round_up),
|
357
|
+
random(0) {
|
358
|
+
freelist.header.size = 0;
|
359
|
+
freelist.header.magic =
|
360
|
+
Magic(kMagicUnallocated, &freelist.header);
|
361
|
+
freelist.header.arena = this;
|
362
|
+
freelist.levels = 0;
|
363
|
+
memset(freelist.next, 0, sizeof(freelist.next));
|
364
|
+
}
|
365
|
+
|
366
|
+
// L < meta_data_arena->mu
|
367
|
+
LowLevelAlloc::Arena *LowLevelAlloc::NewArena(int32_t flags) {
|
368
|
+
Arena *meta_data_arena = DefaultArena();
|
369
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
370
|
+
if ((flags & LowLevelAlloc::kAsyncSignalSafe) != 0) {
|
371
|
+
meta_data_arena = UnhookedAsyncSigSafeArena();
|
372
|
+
} else // NOLINT(readability/braces)
|
373
|
+
#endif
|
374
|
+
if ((flags & LowLevelAlloc::kCallMallocHook) == 0) {
|
375
|
+
meta_data_arena = UnhookedArena();
|
376
|
+
}
|
377
|
+
Arena *result =
|
378
|
+
new (AllocWithArena(sizeof (*result), meta_data_arena)) Arena(flags);
|
379
|
+
return result;
|
380
|
+
}
|
381
|
+
|
382
|
+
// L < arena->mu, L < arena->arena->mu
|
383
|
+
bool LowLevelAlloc::DeleteArena(Arena *arena) {
|
384
|
+
ABSL_RAW_CHECK(
|
385
|
+
arena != nullptr && arena != DefaultArena() && arena != UnhookedArena(),
|
386
|
+
"may not delete default arena");
|
387
|
+
ArenaLock section(arena);
|
388
|
+
if (arena->allocation_count != 0) {
|
389
|
+
section.Leave();
|
390
|
+
return false;
|
391
|
+
}
|
392
|
+
while (arena->freelist.next[0] != nullptr) {
|
393
|
+
AllocList *region = arena->freelist.next[0];
|
394
|
+
size_t size = region->header.size;
|
395
|
+
arena->freelist.next[0] = region->next[0];
|
396
|
+
ABSL_RAW_CHECK(
|
397
|
+
region->header.magic == Magic(kMagicUnallocated, ®ion->header),
|
398
|
+
"bad magic number in DeleteArena()");
|
399
|
+
ABSL_RAW_CHECK(region->header.arena == arena,
|
400
|
+
"bad arena pointer in DeleteArena()");
|
401
|
+
ABSL_RAW_CHECK(size % arena->pagesize == 0,
|
402
|
+
"empty arena has non-page-aligned block size");
|
403
|
+
ABSL_RAW_CHECK(reinterpret_cast<uintptr_t>(region) % arena->pagesize == 0,
|
404
|
+
"empty arena has non-page-aligned block");
|
405
|
+
int munmap_result;
|
406
|
+
#ifdef _WIN32
|
407
|
+
munmap_result = VirtualFree(region, 0, MEM_RELEASE);
|
408
|
+
ABSL_RAW_CHECK(munmap_result != 0,
|
409
|
+
"LowLevelAlloc::DeleteArena: VitualFree failed");
|
410
|
+
#else
|
411
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
412
|
+
if ((arena->flags & LowLevelAlloc::kAsyncSignalSafe) == 0) {
|
413
|
+
munmap_result = munmap(region, size);
|
414
|
+
} else {
|
415
|
+
munmap_result = base_internal::DirectMunmap(region, size);
|
416
|
+
}
|
417
|
+
#else
|
418
|
+
munmap_result = munmap(region, size);
|
419
|
+
#endif // ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
420
|
+
if (munmap_result != 0) {
|
421
|
+
ABSL_RAW_LOG(FATAL, "LowLevelAlloc::DeleteArena: munmap failed: %d",
|
422
|
+
errno);
|
423
|
+
}
|
424
|
+
#endif // _WIN32
|
425
|
+
}
|
426
|
+
section.Leave();
|
427
|
+
arena->~Arena();
|
428
|
+
Free(arena);
|
429
|
+
return true;
|
430
|
+
}
|
431
|
+
|
432
|
+
// ---------------------------------------------------------------------------
|
433
|
+
|
434
|
+
// Addition, checking for overflow. The intent is to die if an external client
|
435
|
+
// manages to push through a request that would cause arithmetic to fail.
|
436
|
+
static inline uintptr_t CheckedAdd(uintptr_t a, uintptr_t b) {
|
437
|
+
uintptr_t sum = a + b;
|
438
|
+
ABSL_RAW_CHECK(sum >= a, "LowLevelAlloc arithmetic overflow");
|
439
|
+
return sum;
|
440
|
+
}
|
441
|
+
|
442
|
+
// Return value rounded up to next multiple of align.
|
443
|
+
// align must be a power of two.
|
444
|
+
static inline uintptr_t RoundUp(uintptr_t addr, uintptr_t align) {
|
445
|
+
return CheckedAdd(addr, align - 1) & ~(align - 1);
|
446
|
+
}
|
447
|
+
|
448
|
+
// Equivalent to "return prev->next[i]" but with sanity checking
|
449
|
+
// that the freelist is in the correct order, that it
|
450
|
+
// consists of regions marked "unallocated", and that no two regions
|
451
|
+
// are adjacent in memory (they should have been coalesced).
|
452
|
+
// L >= arena->mu
|
453
|
+
static AllocList *Next(int i, AllocList *prev, LowLevelAlloc::Arena *arena) {
|
454
|
+
ABSL_RAW_CHECK(i < prev->levels, "too few levels in Next()");
|
455
|
+
AllocList *next = prev->next[i];
|
456
|
+
if (next != nullptr) {
|
457
|
+
ABSL_RAW_CHECK(
|
458
|
+
next->header.magic == Magic(kMagicUnallocated, &next->header),
|
459
|
+
"bad magic number in Next()");
|
460
|
+
ABSL_RAW_CHECK(next->header.arena == arena, "bad arena pointer in Next()");
|
461
|
+
if (prev != &arena->freelist) {
|
462
|
+
ABSL_RAW_CHECK(prev < next, "unordered freelist");
|
463
|
+
ABSL_RAW_CHECK(reinterpret_cast<char *>(prev) + prev->header.size <
|
464
|
+
reinterpret_cast<char *>(next),
|
465
|
+
"malformed freelist");
|
466
|
+
}
|
467
|
+
}
|
468
|
+
return next;
|
469
|
+
}
|
470
|
+
|
471
|
+
// Coalesce list item "a" with its successor if they are adjacent.
|
472
|
+
static void Coalesce(AllocList *a) {
|
473
|
+
AllocList *n = a->next[0];
|
474
|
+
if (n != nullptr && reinterpret_cast<char *>(a) + a->header.size ==
|
475
|
+
reinterpret_cast<char *>(n)) {
|
476
|
+
LowLevelAlloc::Arena *arena = a->header.arena;
|
477
|
+
a->header.size += n->header.size;
|
478
|
+
n->header.magic = 0;
|
479
|
+
n->header.arena = nullptr;
|
480
|
+
AllocList *prev[kMaxLevel];
|
481
|
+
LLA_SkiplistDelete(&arena->freelist, n, prev);
|
482
|
+
LLA_SkiplistDelete(&arena->freelist, a, prev);
|
483
|
+
a->levels = LLA_SkiplistLevels(a->header.size, arena->min_size,
|
484
|
+
&arena->random);
|
485
|
+
LLA_SkiplistInsert(&arena->freelist, a, prev);
|
486
|
+
}
|
487
|
+
}
|
488
|
+
|
489
|
+
// Adds block at location "v" to the free list
|
490
|
+
// L >= arena->mu
|
491
|
+
static void AddToFreelist(void *v, LowLevelAlloc::Arena *arena) {
|
492
|
+
AllocList *f = reinterpret_cast<AllocList *>(
|
493
|
+
reinterpret_cast<char *>(v) - sizeof (f->header));
|
494
|
+
ABSL_RAW_CHECK(f->header.magic == Magic(kMagicAllocated, &f->header),
|
495
|
+
"bad magic number in AddToFreelist()");
|
496
|
+
ABSL_RAW_CHECK(f->header.arena == arena,
|
497
|
+
"bad arena pointer in AddToFreelist()");
|
498
|
+
f->levels = LLA_SkiplistLevels(f->header.size, arena->min_size,
|
499
|
+
&arena->random);
|
500
|
+
AllocList *prev[kMaxLevel];
|
501
|
+
LLA_SkiplistInsert(&arena->freelist, f, prev);
|
502
|
+
f->header.magic = Magic(kMagicUnallocated, &f->header);
|
503
|
+
Coalesce(f); // maybe coalesce with successor
|
504
|
+
Coalesce(prev[0]); // maybe coalesce with predecessor
|
505
|
+
}
|
506
|
+
|
507
|
+
// Frees storage allocated by LowLevelAlloc::Alloc().
|
508
|
+
// L < arena->mu
|
509
|
+
void LowLevelAlloc::Free(void *v) {
|
510
|
+
if (v != nullptr) {
|
511
|
+
AllocList *f = reinterpret_cast<AllocList *>(
|
512
|
+
reinterpret_cast<char *>(v) - sizeof (f->header));
|
513
|
+
LowLevelAlloc::Arena *arena = f->header.arena;
|
514
|
+
ArenaLock section(arena);
|
515
|
+
AddToFreelist(v, arena);
|
516
|
+
ABSL_RAW_CHECK(arena->allocation_count > 0, "nothing in arena to free");
|
517
|
+
arena->allocation_count--;
|
518
|
+
section.Leave();
|
519
|
+
}
|
520
|
+
}
|
521
|
+
|
522
|
+
// allocates and returns a block of size bytes, to be freed with Free()
|
523
|
+
// L < arena->mu
|
524
|
+
static void *DoAllocWithArena(size_t request, LowLevelAlloc::Arena *arena) {
|
525
|
+
void *result = nullptr;
|
526
|
+
if (request != 0) {
|
527
|
+
AllocList *s; // will point to region that satisfies request
|
528
|
+
ArenaLock section(arena);
|
529
|
+
// round up with header
|
530
|
+
size_t req_rnd = RoundUp(CheckedAdd(request, sizeof (s->header)),
|
531
|
+
arena->round_up);
|
532
|
+
for (;;) { // loop until we find a suitable region
|
533
|
+
// find the minimum levels that a block of this size must have
|
534
|
+
int i = LLA_SkiplistLevels(req_rnd, arena->min_size, nullptr) - 1;
|
535
|
+
if (i < arena->freelist.levels) { // potential blocks exist
|
536
|
+
AllocList *before = &arena->freelist; // predecessor of s
|
537
|
+
while ((s = Next(i, before, arena)) != nullptr &&
|
538
|
+
s->header.size < req_rnd) {
|
539
|
+
before = s;
|
540
|
+
}
|
541
|
+
if (s != nullptr) { // we found a region
|
542
|
+
break;
|
543
|
+
}
|
544
|
+
}
|
545
|
+
// we unlock before mmap() both because mmap() may call a callback hook,
|
546
|
+
// and because it may be slow.
|
547
|
+
arena->mu.Unlock();
|
548
|
+
// mmap generous 64K chunks to decrease
|
549
|
+
// the chances/impact of fragmentation:
|
550
|
+
size_t new_pages_size = RoundUp(req_rnd, arena->pagesize * 16);
|
551
|
+
void *new_pages;
|
552
|
+
#ifdef _WIN32
|
553
|
+
new_pages = VirtualAlloc(0, new_pages_size,
|
554
|
+
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
555
|
+
ABSL_RAW_CHECK(new_pages != nullptr, "VirtualAlloc failed");
|
556
|
+
#else
|
557
|
+
#ifndef ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
558
|
+
if ((arena->flags & LowLevelAlloc::kAsyncSignalSafe) != 0) {
|
559
|
+
new_pages = base_internal::DirectMmap(nullptr, new_pages_size,
|
560
|
+
PROT_WRITE|PROT_READ, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
|
561
|
+
} else {
|
562
|
+
new_pages = mmap(nullptr, new_pages_size, PROT_WRITE | PROT_READ,
|
563
|
+
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
564
|
+
}
|
565
|
+
#else
|
566
|
+
new_pages = mmap(nullptr, new_pages_size, PROT_WRITE | PROT_READ,
|
567
|
+
MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
568
|
+
#endif // ABSL_LOW_LEVEL_ALLOC_ASYNC_SIGNAL_SAFE_MISSING
|
569
|
+
if (new_pages == MAP_FAILED) {
|
570
|
+
ABSL_RAW_LOG(FATAL, "mmap error: %d", errno);
|
571
|
+
}
|
572
|
+
|
573
|
+
#endif // _WIN32
|
574
|
+
arena->mu.Lock();
|
575
|
+
s = reinterpret_cast<AllocList *>(new_pages);
|
576
|
+
s->header.size = new_pages_size;
|
577
|
+
// Pretend the block is allocated; call AddToFreelist() to free it.
|
578
|
+
s->header.magic = Magic(kMagicAllocated, &s->header);
|
579
|
+
s->header.arena = arena;
|
580
|
+
AddToFreelist(&s->levels, arena); // insert new region into free list
|
581
|
+
}
|
582
|
+
AllocList *prev[kMaxLevel];
|
583
|
+
LLA_SkiplistDelete(&arena->freelist, s, prev); // remove from free list
|
584
|
+
// s points to the first free region that's big enough
|
585
|
+
if (CheckedAdd(req_rnd, arena->min_size) <= s->header.size) {
|
586
|
+
// big enough to split
|
587
|
+
AllocList *n = reinterpret_cast<AllocList *>
|
588
|
+
(req_rnd + reinterpret_cast<char *>(s));
|
589
|
+
n->header.size = s->header.size - req_rnd;
|
590
|
+
n->header.magic = Magic(kMagicAllocated, &n->header);
|
591
|
+
n->header.arena = arena;
|
592
|
+
s->header.size = req_rnd;
|
593
|
+
AddToFreelist(&n->levels, arena);
|
594
|
+
}
|
595
|
+
s->header.magic = Magic(kMagicAllocated, &s->header);
|
596
|
+
ABSL_RAW_CHECK(s->header.arena == arena, "");
|
597
|
+
arena->allocation_count++;
|
598
|
+
section.Leave();
|
599
|
+
result = &s->levels;
|
600
|
+
}
|
601
|
+
ANNOTATE_MEMORY_IS_UNINITIALIZED(result, request);
|
602
|
+
return result;
|
603
|
+
}
|
604
|
+
|
605
|
+
void *LowLevelAlloc::Alloc(size_t request) {
|
606
|
+
void *result = DoAllocWithArena(request, DefaultArena());
|
607
|
+
return result;
|
608
|
+
}
|
609
|
+
|
610
|
+
void *LowLevelAlloc::AllocWithArena(size_t request, Arena *arena) {
|
611
|
+
ABSL_RAW_CHECK(arena != nullptr, "must pass a valid arena");
|
612
|
+
void *result = DoAllocWithArena(request, arena);
|
613
|
+
return result;
|
614
|
+
}
|
615
|
+
|
616
|
+
} // namespace base_internal
|
617
|
+
ABSL_NAMESPACE_END
|
618
|
+
} // namespace absl
|
619
|
+
|
620
|
+
#endif // ABSL_LOW_LEVEL_ALLOC_MISSING
|