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.

Files changed (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +595 -15723
  3. data/include/grpc/grpc_security.h +31 -14
  4. data/include/grpc/impl/codegen/README.md +22 -0
  5. data/include/grpc/impl/codegen/port_platform.h +6 -1
  6. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -2
  7. data/src/core/ext/filters/client_channel/client_channel.cc +64 -20
  8. data/src/core/ext/filters/client_channel/client_channel.h +1 -1
  9. data/src/core/ext/filters/client_channel/client_channel_channelz.h +0 -3
  10. data/src/core/ext/filters/client_channel/health/health_check_client.cc +6 -1
  11. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +2 -3
  12. data/src/core/ext/filters/client_channel/lb_policy.h +2 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +20 -13
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -13
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +0 -3
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -37
  18. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -13
  19. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +29 -10
  20. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +5 -4
  21. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +20 -9
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +18 -12
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +22 -14
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +18 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +54 -56
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  29. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -1
  30. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +363 -14
  32. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +0 -1
  33. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +5 -4
  34. data/src/core/ext/filters/client_channel/server_address.cc +40 -7
  35. data/src/core/ext/filters/client_channel/server_address.h +42 -4
  36. data/src/core/ext/filters/client_channel/subchannel.cc +64 -23
  37. data/src/core/ext/filters/client_channel/subchannel.h +16 -4
  38. data/src/core/ext/filters/max_age/max_age_filter.cc +2 -1
  39. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +87 -31
  40. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +18 -1
  41. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +10 -35
  42. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +19 -25
  43. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -1
  44. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -2
  45. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +6 -6
  46. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -2
  47. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +239 -277
  48. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -1
  49. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  50. data/src/core/ext/transport/chttp2/transport/internal.h +5 -1
  51. data/src/core/ext/transport/chttp2/transport/parsing.cc +1 -28
  52. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -5
  53. data/src/core/ext/transport/inproc/inproc_transport.cc +12 -12
  54. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +224 -0
  55. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +700 -0
  56. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +74 -0
  57. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +226 -0
  58. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +380 -0
  59. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +1378 -0
  60. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/filter.upb.c +8 -8
  61. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +69 -0
  62. data/src/core/ext/upb-generated/envoy/{api/v2/cluster → config/cluster/v3}/outlier_detection.upb.c +8 -8
  63. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +323 -0
  64. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +112 -0
  65. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +334 -0
  66. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/backoff.upb.c +8 -8
  67. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +79 -0
  68. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +309 -0
  69. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +869 -0
  70. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +96 -0
  71. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +328 -0
  72. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +34 -0
  73. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +71 -0
  74. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +195 -0
  75. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +634 -0
  76. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +170 -0
  77. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +684 -0
  78. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/http_uri.upb.c +8 -8
  79. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +80 -0
  80. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +152 -0
  81. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +536 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +28 -0
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +58 -0
  84. data/src/core/ext/upb-generated/envoy/{api/v2/core → config/core/v3}/socket_option.upb.c +6 -6
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +88 -0
  86. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +91 -0
  87. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +220 -0
  88. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +91 -0
  89. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +273 -0
  90. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +112 -0
  91. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +332 -0
  92. data/src/core/ext/upb-generated/envoy/config/listener/{v2 → v3}/api_listener.upb.c +8 -8
  93. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +65 -0
  94. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +108 -0
  95. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +401 -0
  96. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +138 -0
  97. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +490 -0
  98. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +41 -0
  99. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +94 -0
  100. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +174 -0
  101. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +599 -0
  102. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +63 -0
  103. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +204 -0
  104. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +773 -0
  105. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2855 -0
  106. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +59 -0
  107. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +135 -0
  108. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +50 -0
  109. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +108 -0
  110. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +312 -0
  111. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +1125 -0
  112. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +20 -0
  113. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +34 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +111 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +401 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +72 -0
  117. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +198 -0
  118. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +105 -0
  119. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +388 -0
  120. data/src/core/ext/upb-generated/envoy/{api/v2 → service/cluster/v3}/cds.upb.c +5 -6
  121. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +49 -0
  122. data/src/core/ext/upb-generated/envoy/service/discovery/{v2 → v3}/ads.upb.c +5 -4
  123. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +49 -0
  124. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +129 -0
  125. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +386 -0
  126. data/src/core/ext/upb-generated/envoy/{api/v2 → service/endpoint/v3}/eds.upb.c +5 -6
  127. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +49 -0
  128. data/src/core/ext/upb-generated/envoy/{api/v2 → service/listener/v3}/lds.upb.c +5 -6
  129. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +49 -0
  130. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +55 -0
  131. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +136 -0
  132. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/rds.upb.c +5 -6
  133. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +49 -0
  134. data/src/core/ext/upb-generated/envoy/{api/v2 → service/route/v3}/srds.upb.c +5 -6
  135. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +49 -0
  136. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +47 -0
  137. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +114 -0
  138. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +35 -0
  139. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +77 -0
  140. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +34 -0
  141. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +71 -0
  142. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +64 -0
  143. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +145 -0
  144. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +53 -0
  145. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +127 -0
  146. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +63 -0
  147. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +188 -0
  148. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +88 -0
  149. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +258 -0
  150. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +90 -0
  151. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +250 -0
  152. data/src/core/ext/upb-generated/envoy/type/{http.upb.c → v3/http.upb.c} +2 -2
  153. data/src/core/ext/upb-generated/envoy/type/{http.upb.h → v3/http.upb.h} +8 -8
  154. data/src/core/ext/upb-generated/envoy/type/{percent.upb.c → v3/percent.upb.c} +9 -8
  155. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +86 -0
  156. data/src/core/ext/upb-generated/envoy/type/{range.upb.c → v3/range.upb.c} +12 -11
  157. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +111 -0
  158. data/src/core/ext/upb-generated/envoy/type/{semantic_version.upb.c → v3/semantic_version.upb.c} +6 -5
  159. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +61 -0
  160. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +234 -0
  161. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +759 -0
  162. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +36 -36
  163. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +1 -1
  164. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +27 -0
  165. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +53 -0
  166. data/src/core/ext/upb-generated/validate/validate.upb.c +11 -11
  167. data/src/core/ext/upb-generated/validate/validate.upb.h +1 -1
  168. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.cc +1045 -767
  169. data/src/core/ext/{filters/client_channel/xds → xds}/xds_api.h +114 -99
  170. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.cc +44 -2
  171. data/src/core/ext/{filters/client_channel/xds → xds}/xds_bootstrap.h +8 -3
  172. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel.h +4 -4
  173. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_args.h +3 -3
  174. data/src/core/ext/{filters/client_channel/xds → xds}/xds_channel_secure.cc +2 -5
  175. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.cc +85 -417
  176. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client.h +12 -45
  177. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.cc +2 -2
  178. data/src/core/ext/{filters/client_channel/xds → xds}/xds_client_stats.h +3 -3
  179. data/src/core/lib/channel/channelz.cc +14 -15
  180. data/src/core/lib/channel/channelz.h +1 -1
  181. data/src/core/lib/channel/channelz_registry.cc +3 -1
  182. data/src/core/lib/gpr/sync_posix.cc +2 -8
  183. data/src/core/lib/iomgr/endpoint.cc +5 -1
  184. data/src/core/lib/iomgr/endpoint.h +7 -3
  185. data/src/core/lib/iomgr/endpoint_cfstream.cc +32 -11
  186. data/src/core/lib/iomgr/ev_posix.cc +0 -2
  187. data/src/core/lib/iomgr/iomgr.cc +0 -10
  188. data/src/core/lib/iomgr/iomgr.h +0 -10
  189. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.cc +1 -1
  190. data/src/core/{ext/filters/client_channel → lib/iomgr}/parse_address.h +3 -3
  191. data/src/core/lib/iomgr/sockaddr_utils.cc +2 -1
  192. data/src/core/lib/iomgr/sockaddr_utils.h +2 -1
  193. data/src/core/lib/iomgr/tcp_custom.cc +32 -16
  194. data/src/core/lib/iomgr/tcp_posix.cc +31 -13
  195. data/src/core/lib/iomgr/tcp_windows.cc +26 -10
  196. data/src/core/lib/security/authorization/authorization_engine.cc +177 -0
  197. data/src/core/lib/security/authorization/authorization_engine.h +84 -0
  198. data/src/core/lib/security/authorization/evaluate_args.cc +153 -0
  199. data/src/core/lib/security/authorization/evaluate_args.h +59 -0
  200. data/src/core/lib/security/authorization/mock_cel/activation.h +57 -0
  201. data/src/core/lib/security/authorization/mock_cel/cel_expr_builder_factory.h +42 -0
  202. data/src/core/lib/security/authorization/mock_cel/cel_expression.h +68 -0
  203. data/src/core/lib/security/authorization/mock_cel/cel_value.h +93 -0
  204. data/src/core/lib/security/authorization/mock_cel/evaluator_core.h +67 -0
  205. data/src/core/lib/security/authorization/mock_cel/flat_expr_builder.h +56 -0
  206. data/src/core/lib/security/authorization/mock_cel/statusor.h +50 -0
  207. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +56 -38
  208. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -2
  209. data/src/core/lib/security/transport/secure_endpoint.cc +7 -1
  210. data/src/core/lib/surface/call.cc +12 -12
  211. data/src/core/lib/surface/call.h +2 -1
  212. data/src/core/lib/surface/channel.cc +28 -20
  213. data/src/core/lib/surface/channel.h +12 -2
  214. data/src/core/lib/surface/completion_queue.cc +10 -272
  215. data/src/core/lib/surface/completion_queue.h +0 -8
  216. data/src/core/lib/surface/init.cc +1 -3
  217. data/src/core/lib/surface/server.cc +1066 -1244
  218. data/src/core/lib/surface/server.h +363 -87
  219. data/src/core/lib/surface/version.cc +2 -2
  220. data/src/core/lib/transport/authority_override.cc +38 -0
  221. data/src/core/lib/transport/authority_override.h +32 -0
  222. data/src/core/lib/transport/connectivity_state.cc +18 -13
  223. data/src/core/lib/transport/connectivity_state.h +18 -6
  224. data/src/core/lib/transport/error_utils.cc +13 -0
  225. data/src/core/lib/transport/error_utils.h +6 -0
  226. data/src/core/lib/transport/static_metadata.cc +295 -276
  227. data/src/core/lib/transport/static_metadata.h +80 -73
  228. data/src/core/lib/transport/transport.h +7 -0
  229. data/src/core/lib/uri/uri_parser.cc +23 -21
  230. data/src/core/lib/uri/uri_parser.h +3 -1
  231. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +22 -0
  232. data/src/core/tsi/ssl_transport_security.cc +3 -9
  233. data/src/ruby/ext/grpc/rb_channel_credentials.c +9 -0
  234. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -2
  235. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -4
  236. data/src/ruby/lib/grpc/version.rb +1 -1
  237. data/src/ruby/spec/channel_credentials_spec.rb +10 -0
  238. data/src/ruby/spec/generic/active_call_spec.rb +19 -8
  239. data/third_party/abseil-cpp/absl/algorithm/container.h +1727 -0
  240. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +161 -0
  241. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.cc +93 -0
  242. data/third_party/abseil-cpp/absl/base/internal/exponential_biased.h +130 -0
  243. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  244. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  245. data/third_party/abseil-cpp/absl/container/fixed_array.h +515 -0
  246. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +503 -0
  247. data/third_party/abseil-cpp/absl/container/internal/common.h +202 -0
  248. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +440 -0
  249. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +146 -0
  250. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +191 -0
  251. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  252. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +269 -0
  253. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +297 -0
  254. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +30 -0
  255. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +49 -0
  256. data/third_party/abseil-cpp/absl/container/internal/layout.h +741 -0
  257. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +48 -0
  258. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +1882 -0
  259. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +138 -0
  260. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  261. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1895 -0
  262. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  263. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +382 -0
  264. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +134 -0
  265. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +192 -0
  266. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +125 -0
  267. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +70 -0
  268. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +99 -0
  269. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +248 -0
  270. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  271. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +85 -0
  272. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +346 -0
  273. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +128 -0
  274. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +194 -0
  275. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  276. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +140 -0
  277. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  278. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +25 -0
  279. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  280. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1480 -0
  281. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  282. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  283. data/third_party/abseil-cpp/absl/functional/function_ref.h +139 -0
  284. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  285. data/third_party/abseil-cpp/absl/hash/hash.h +324 -0
  286. data/third_party/abseil-cpp/absl/hash/internal/city.cc +346 -0
  287. data/third_party/abseil-cpp/absl/hash/internal/city.h +96 -0
  288. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +55 -0
  289. data/third_party/abseil-cpp/absl/hash/internal/hash.h +988 -0
  290. data/third_party/abseil-cpp/absl/status/status.cc +447 -0
  291. data/third_party/abseil-cpp/absl/status/status.h +428 -0
  292. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +43 -0
  293. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  294. data/third_party/abseil-cpp/absl/strings/cord.cc +2019 -0
  295. data/third_party/abseil-cpp/absl/strings/cord.h +1121 -0
  296. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +151 -0
  297. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  298. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  299. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +57 -0
  300. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +99 -0
  301. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  302. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  303. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +697 -0
  304. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  305. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +155 -0
  306. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +261 -0
  307. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  308. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  309. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +484 -0
  310. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +159 -0
  311. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2728 -0
  312. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1056 -0
  313. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  314. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  315. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  316. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  317. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  318. data/third_party/abseil-cpp/absl/types/variant.h +861 -0
  319. data/third_party/boringssl-with-bazel/err_data.c +263 -257
  320. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +16 -0
  321. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +456 -0
  322. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +192 -0
  323. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +20 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +52 -0
  325. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +1 -1
  326. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +39 -7
  327. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +2 -3
  328. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +11 -0
  329. data/third_party/boringssl-with-bazel/src/ssl/internal.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +3 -6
  331. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +10 -0
  332. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +34 -9
  333. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -0
  334. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  335. data/third_party/upb/upb/decode.c +64 -15
  336. data/third_party/upb/upb/encode.c +2 -2
  337. data/third_party/upb/upb/msg.h +2 -2
  338. data/third_party/upb/upb/port_def.inc +1 -1
  339. data/third_party/upb/upb/table.c +0 -11
  340. data/third_party/upb/upb/table.int.h +0 -9
  341. data/third_party/upb/upb/upb.c +16 -14
  342. data/third_party/upb/upb/upb.h +26 -0
  343. data/third_party/upb/upb/upb.hpp +2 -0
  344. metadata +257 -155
  345. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  346. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -34
  347. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  348. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -429
  349. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  350. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -198
  351. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  352. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -388
  353. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -52
  354. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  355. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1453
  356. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  357. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -226
  358. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  359. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -323
  360. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  361. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -334
  362. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -79
  363. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  364. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -891
  365. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  366. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -328
  367. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  368. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -71
  369. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  370. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -649
  371. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  372. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -693
  373. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  374. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  375. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -536
  376. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -88
  377. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  378. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -386
  379. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -52
  380. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  381. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -224
  382. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  383. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -32
  384. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  385. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -273
  386. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  387. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -332
  388. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -52
  389. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  390. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -415
  391. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  392. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -32
  393. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  394. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -538
  395. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  396. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -111
  397. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -52
  398. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  399. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -204
  400. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  401. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -32
  402. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  403. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -2984
  404. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  405. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -135
  406. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -52
  407. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  408. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -732
  409. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  410. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1167
  411. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  412. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  413. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  414. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -49
  415. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  416. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -136
  417. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  418. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -145
  419. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  420. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  421. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  422. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  423. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -86
  424. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -111
  425. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -61
  426. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  427. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -250
  428. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  429. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  430. data/src/core/lib/slice/slice_hash_table.h +0 -199
  431. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
@@ -0,0 +1,146 @@
1
+ // Copyright 2018 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
+ // Define the default Hash and Eq functions for SwissTable containers.
16
+ //
17
+ // std::hash<T> and std::equal_to<T> are not appropriate hash and equal
18
+ // functions for SwissTable containers. There are two reasons for this.
19
+ //
20
+ // SwissTable containers are power of 2 sized containers:
21
+ //
22
+ // This means they use the lower bits of the hash value to find the slot for
23
+ // each entry. The typical hash function for integral types is the identity.
24
+ // This is a very weak hash function for SwissTable and any power of 2 sized
25
+ // hashtable implementation which will lead to excessive collisions. For
26
+ // SwissTable we use murmur3 style mixing to reduce collisions to a minimum.
27
+ //
28
+ // SwissTable containers support heterogeneous lookup:
29
+ //
30
+ // In order to make heterogeneous lookup work, hash and equal functions must be
31
+ // polymorphic. At the same time they have to satisfy the same requirements the
32
+ // C++ standard imposes on hash functions and equality operators. That is:
33
+ //
34
+ // if hash_default_eq<T>(a, b) returns true for any a and b of type T, then
35
+ // hash_default_hash<T>(a) must equal hash_default_hash<T>(b)
36
+ //
37
+ // For SwissTable containers this requirement is relaxed to allow a and b of
38
+ // any and possibly different types. Note that like the standard the hash and
39
+ // equal functions are still bound to T. This is important because some type U
40
+ // can be hashed by/tested for equality differently depending on T. A notable
41
+ // example is `const char*`. `const char*` is treated as a c-style string when
42
+ // the hash function is hash<std::string> but as a pointer when the hash
43
+ // function is hash<void*>.
44
+ //
45
+ #ifndef ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_
46
+ #define ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_
47
+
48
+ #include <stdint.h>
49
+ #include <cstddef>
50
+ #include <memory>
51
+ #include <string>
52
+ #include <type_traits>
53
+
54
+ #include "absl/base/config.h"
55
+ #include "absl/hash/hash.h"
56
+ #include "absl/strings/string_view.h"
57
+
58
+ namespace absl {
59
+ ABSL_NAMESPACE_BEGIN
60
+ namespace container_internal {
61
+
62
+ // The hash of an object of type T is computed by using absl::Hash.
63
+ template <class T, class E = void>
64
+ struct HashEq {
65
+ using Hash = absl::Hash<T>;
66
+ using Eq = std::equal_to<T>;
67
+ };
68
+
69
+ struct StringHash {
70
+ using is_transparent = void;
71
+
72
+ size_t operator()(absl::string_view v) const {
73
+ return absl::Hash<absl::string_view>{}(v);
74
+ }
75
+ };
76
+
77
+ // Supports heterogeneous lookup for string-like elements.
78
+ struct StringHashEq {
79
+ using Hash = StringHash;
80
+ struct Eq {
81
+ using is_transparent = void;
82
+ bool operator()(absl::string_view lhs, absl::string_view rhs) const {
83
+ return lhs == rhs;
84
+ }
85
+ };
86
+ };
87
+
88
+ template <>
89
+ struct HashEq<std::string> : StringHashEq {};
90
+ template <>
91
+ struct HashEq<absl::string_view> : StringHashEq {};
92
+
93
+ // Supports heterogeneous lookup for pointers and smart pointers.
94
+ template <class T>
95
+ struct HashEq<T*> {
96
+ struct Hash {
97
+ using is_transparent = void;
98
+ template <class U>
99
+ size_t operator()(const U& ptr) const {
100
+ return absl::Hash<const T*>{}(HashEq::ToPtr(ptr));
101
+ }
102
+ };
103
+ struct Eq {
104
+ using is_transparent = void;
105
+ template <class A, class B>
106
+ bool operator()(const A& a, const B& b) const {
107
+ return HashEq::ToPtr(a) == HashEq::ToPtr(b);
108
+ }
109
+ };
110
+
111
+ private:
112
+ static const T* ToPtr(const T* ptr) { return ptr; }
113
+ template <class U, class D>
114
+ static const T* ToPtr(const std::unique_ptr<U, D>& ptr) {
115
+ return ptr.get();
116
+ }
117
+ template <class U>
118
+ static const T* ToPtr(const std::shared_ptr<U>& ptr) {
119
+ return ptr.get();
120
+ }
121
+ };
122
+
123
+ template <class T, class D>
124
+ struct HashEq<std::unique_ptr<T, D>> : HashEq<T*> {};
125
+ template <class T>
126
+ struct HashEq<std::shared_ptr<T>> : HashEq<T*> {};
127
+
128
+ // This header's visibility is restricted. If you need to access the default
129
+ // hasher please use the container's ::hasher alias instead.
130
+ //
131
+ // Example: typename Hash = typename absl::flat_hash_map<K, V>::hasher
132
+ template <class T>
133
+ using hash_default_hash = typename container_internal::HashEq<T>::Hash;
134
+
135
+ // This header's visibility is restricted. If you need to access the default
136
+ // key equal please use the container's ::key_equal alias instead.
137
+ //
138
+ // Example: typename Eq = typename absl::flat_hash_map<K, V, Hash>::key_equal
139
+ template <class T>
140
+ using hash_default_eq = typename container_internal::HashEq<T>::Eq;
141
+
142
+ } // namespace container_internal
143
+ ABSL_NAMESPACE_END
144
+ } // namespace absl
145
+
146
+ #endif // ABSL_CONTAINER_INTERNAL_HASH_FUNCTION_DEFAULTS_H_
@@ -0,0 +1,191 @@
1
+ // Copyright 2018 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_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_
16
+ #define ABSL_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_
17
+
18
+ #include <cstddef>
19
+ #include <memory>
20
+ #include <type_traits>
21
+ #include <utility>
22
+
23
+ #include "absl/meta/type_traits.h"
24
+
25
+ namespace absl {
26
+ ABSL_NAMESPACE_BEGIN
27
+ namespace container_internal {
28
+
29
+ // Defines how slots are initialized/destroyed/moved.
30
+ template <class Policy, class = void>
31
+ struct hash_policy_traits {
32
+ private:
33
+ struct ReturnKey {
34
+ // We return `Key` here.
35
+ // When Key=T&, we forward the lvalue reference.
36
+ // When Key=T, we return by value to avoid a dangling reference.
37
+ // eg, for string_hash_map.
38
+ template <class Key, class... Args>
39
+ Key operator()(Key&& k, const Args&...) const {
40
+ return std::forward<Key>(k);
41
+ }
42
+ };
43
+
44
+ template <class P = Policy, class = void>
45
+ struct ConstantIteratorsImpl : std::false_type {};
46
+
47
+ template <class P>
48
+ struct ConstantIteratorsImpl<P, absl::void_t<typename P::constant_iterators>>
49
+ : P::constant_iterators {};
50
+
51
+ public:
52
+ // The actual object stored in the hash table.
53
+ using slot_type = typename Policy::slot_type;
54
+
55
+ // The type of the keys stored in the hashtable.
56
+ using key_type = typename Policy::key_type;
57
+
58
+ // The argument type for insertions into the hashtable. This is different
59
+ // from value_type for increased performance. See initializer_list constructor
60
+ // and insert() member functions for more details.
61
+ using init_type = typename Policy::init_type;
62
+
63
+ using reference = decltype(Policy::element(std::declval<slot_type*>()));
64
+ using pointer = typename std::remove_reference<reference>::type*;
65
+ using value_type = typename std::remove_reference<reference>::type;
66
+
67
+ // Policies can set this variable to tell raw_hash_set that all iterators
68
+ // should be constant, even `iterator`. This is useful for set-like
69
+ // containers.
70
+ // Defaults to false if not provided by the policy.
71
+ using constant_iterators = ConstantIteratorsImpl<>;
72
+
73
+ // PRECONDITION: `slot` is UNINITIALIZED
74
+ // POSTCONDITION: `slot` is INITIALIZED
75
+ template <class Alloc, class... Args>
76
+ static void construct(Alloc* alloc, slot_type* slot, Args&&... args) {
77
+ Policy::construct(alloc, slot, std::forward<Args>(args)...);
78
+ }
79
+
80
+ // PRECONDITION: `slot` is INITIALIZED
81
+ // POSTCONDITION: `slot` is UNINITIALIZED
82
+ template <class Alloc>
83
+ static void destroy(Alloc* alloc, slot_type* slot) {
84
+ Policy::destroy(alloc, slot);
85
+ }
86
+
87
+ // Transfers the `old_slot` to `new_slot`. Any memory allocated by the
88
+ // allocator inside `old_slot` to `new_slot` can be transferred.
89
+ //
90
+ // OPTIONAL: defaults to:
91
+ //
92
+ // clone(new_slot, std::move(*old_slot));
93
+ // destroy(old_slot);
94
+ //
95
+ // PRECONDITION: `new_slot` is UNINITIALIZED and `old_slot` is INITIALIZED
96
+ // POSTCONDITION: `new_slot` is INITIALIZED and `old_slot` is
97
+ // UNINITIALIZED
98
+ template <class Alloc>
99
+ static void transfer(Alloc* alloc, slot_type* new_slot, slot_type* old_slot) {
100
+ transfer_impl(alloc, new_slot, old_slot, 0);
101
+ }
102
+
103
+ // PRECONDITION: `slot` is INITIALIZED
104
+ // POSTCONDITION: `slot` is INITIALIZED
105
+ template <class P = Policy>
106
+ static auto element(slot_type* slot) -> decltype(P::element(slot)) {
107
+ return P::element(slot);
108
+ }
109
+
110
+ // Returns the amount of memory owned by `slot`, exclusive of `sizeof(*slot)`.
111
+ //
112
+ // If `slot` is nullptr, returns the constant amount of memory owned by any
113
+ // full slot or -1 if slots own variable amounts of memory.
114
+ //
115
+ // PRECONDITION: `slot` is INITIALIZED or nullptr
116
+ template <class P = Policy>
117
+ static size_t space_used(const slot_type* slot) {
118
+ return P::space_used(slot);
119
+ }
120
+
121
+ // Provides generalized access to the key for elements, both for elements in
122
+ // the table and for elements that have not yet been inserted (or even
123
+ // constructed). We would like an API that allows us to say: `key(args...)`
124
+ // but we cannot do that for all cases, so we use this more general API that
125
+ // can be used for many things, including the following:
126
+ //
127
+ // - Given an element in a table, get its key.
128
+ // - Given an element initializer, get its key.
129
+ // - Given `emplace()` arguments, get the element key.
130
+ //
131
+ // Implementations of this must adhere to a very strict technical
132
+ // specification around aliasing and consuming arguments:
133
+ //
134
+ // Let `value_type` be the result type of `element()` without ref- and
135
+ // cv-qualifiers. The first argument is a functor, the rest are constructor
136
+ // arguments for `value_type`. Returns `std::forward<F>(f)(k, xs...)`, where
137
+ // `k` is the element key, and `xs...` are the new constructor arguments for
138
+ // `value_type`. It's allowed for `k` to alias `xs...`, and for both to alias
139
+ // `ts...`. The key won't be touched once `xs...` are used to construct an
140
+ // element; `ts...` won't be touched at all, which allows `apply()` to consume
141
+ // any rvalues among them.
142
+ //
143
+ // If `value_type` is constructible from `Ts&&...`, `Policy::apply()` must not
144
+ // trigger a hard compile error unless it originates from `f`. In other words,
145
+ // `Policy::apply()` must be SFINAE-friendly. If `value_type` is not
146
+ // constructible from `Ts&&...`, either SFINAE or a hard compile error is OK.
147
+ //
148
+ // If `Ts...` is `[cv] value_type[&]` or `[cv] init_type[&]`,
149
+ // `Policy::apply()` must work. A compile error is not allowed, SFINAE or not.
150
+ template <class F, class... Ts, class P = Policy>
151
+ static auto apply(F&& f, Ts&&... ts)
152
+ -> decltype(P::apply(std::forward<F>(f), std::forward<Ts>(ts)...)) {
153
+ return P::apply(std::forward<F>(f), std::forward<Ts>(ts)...);
154
+ }
155
+
156
+ // Returns the "key" portion of the slot.
157
+ // Used for node handle manipulation.
158
+ template <class P = Policy>
159
+ static auto key(slot_type* slot)
160
+ -> decltype(P::apply(ReturnKey(), element(slot))) {
161
+ return P::apply(ReturnKey(), element(slot));
162
+ }
163
+
164
+ // Returns the "value" (as opposed to the "key") portion of the element. Used
165
+ // by maps to implement `operator[]`, `at()` and `insert_or_assign()`.
166
+ template <class T, class P = Policy>
167
+ static auto value(T* elem) -> decltype(P::value(elem)) {
168
+ return P::value(elem);
169
+ }
170
+
171
+ private:
172
+ // Use auto -> decltype as an enabler.
173
+ template <class Alloc, class P = Policy>
174
+ static auto transfer_impl(Alloc* alloc, slot_type* new_slot,
175
+ slot_type* old_slot, int)
176
+ -> decltype((void)P::transfer(alloc, new_slot, old_slot)) {
177
+ P::transfer(alloc, new_slot, old_slot);
178
+ }
179
+ template <class Alloc>
180
+ static void transfer_impl(Alloc* alloc, slot_type* new_slot,
181
+ slot_type* old_slot, char) {
182
+ construct(alloc, new_slot, std::move(element(old_slot)));
183
+ destroy(alloc, old_slot);
184
+ }
185
+ };
186
+
187
+ } // namespace container_internal
188
+ ABSL_NAMESPACE_END
189
+ } // namespace absl
190
+
191
+ #endif // ABSL_CONTAINER_INTERNAL_HASH_POLICY_TRAITS_H_
@@ -0,0 +1,85 @@
1
+ // Copyright 2018 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
+ // Provides the internal API for hashtable_debug.h.
16
+
17
+ #ifndef ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_
18
+ #define ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_
19
+
20
+ #include <cstddef>
21
+
22
+ #include <algorithm>
23
+ #include <type_traits>
24
+ #include <vector>
25
+
26
+ #include "absl/base/config.h"
27
+
28
+ namespace absl {
29
+ ABSL_NAMESPACE_BEGIN
30
+ namespace container_internal {
31
+ namespace hashtable_debug_internal {
32
+
33
+ // If it is a map, call get<0>().
34
+ using std::get;
35
+ template <typename T, typename = typename T::mapped_type>
36
+ auto GetKey(const typename T::value_type& pair, int) -> decltype(get<0>(pair)) {
37
+ return get<0>(pair);
38
+ }
39
+
40
+ // If it is not a map, return the value directly.
41
+ template <typename T>
42
+ const typename T::key_type& GetKey(const typename T::key_type& key, char) {
43
+ return key;
44
+ }
45
+
46
+ // Containers should specialize this to provide debug information for that
47
+ // container.
48
+ template <class Container, typename Enabler = void>
49
+ struct HashtableDebugAccess {
50
+ // Returns the number of probes required to find `key` in `c`. The "number of
51
+ // probes" is a concept that can vary by container. Implementations should
52
+ // return 0 when `key` was found in the minimum number of operations and
53
+ // should increment the result for each non-trivial operation required to find
54
+ // `key`.
55
+ //
56
+ // The default implementation uses the bucket api from the standard and thus
57
+ // works for `std::unordered_*` containers.
58
+ static size_t GetNumProbes(const Container& c,
59
+ const typename Container::key_type& key) {
60
+ if (!c.bucket_count()) return {};
61
+ size_t num_probes = 0;
62
+ size_t bucket = c.bucket(key);
63
+ for (auto it = c.begin(bucket), e = c.end(bucket);; ++it, ++num_probes) {
64
+ if (it == e) return num_probes;
65
+ if (c.key_eq()(key, GetKey<Container>(*it, 0))) return num_probes;
66
+ }
67
+ }
68
+
69
+ // Returns the number of bytes requested from the allocator by the container
70
+ // and not freed.
71
+ //
72
+ // static size_t AllocatedByteSize(const Container& c);
73
+
74
+ // Returns a tight lower bound for AllocatedByteSize(c) where `c` is of type
75
+ // `Container` and `c.size()` is equal to `num_elements`.
76
+ //
77
+ // static size_t LowerBoundAllocatedByteSize(size_t num_elements);
78
+ };
79
+
80
+ } // namespace hashtable_debug_internal
81
+ } // namespace container_internal
82
+ ABSL_NAMESPACE_END
83
+ } // namespace absl
84
+
85
+ #endif // ABSL_CONTAINER_INTERNAL_HASHTABLE_DEBUG_HOOKS_H_
@@ -0,0 +1,269 @@
1
+ // Copyright 2018 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/container/internal/hashtablez_sampler.h"
16
+
17
+ #include <atomic>
18
+ #include <cassert>
19
+ #include <cmath>
20
+ #include <functional>
21
+ #include <limits>
22
+
23
+ #include "absl/base/attributes.h"
24
+ #include "absl/base/internal/exponential_biased.h"
25
+ #include "absl/container/internal/have_sse.h"
26
+ #include "absl/debugging/stacktrace.h"
27
+ #include "absl/memory/memory.h"
28
+ #include "absl/synchronization/mutex.h"
29
+
30
+ namespace absl {
31
+ ABSL_NAMESPACE_BEGIN
32
+ namespace container_internal {
33
+ constexpr int HashtablezInfo::kMaxStackDepth;
34
+
35
+ namespace {
36
+ ABSL_CONST_INIT std::atomic<bool> g_hashtablez_enabled{
37
+ false
38
+ };
39
+ ABSL_CONST_INIT std::atomic<int32_t> g_hashtablez_sample_parameter{1 << 10};
40
+ ABSL_CONST_INIT std::atomic<int32_t> g_hashtablez_max_samples{1 << 20};
41
+
42
+ #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
43
+ ABSL_PER_THREAD_TLS_KEYWORD absl::base_internal::ExponentialBiased
44
+ g_exponential_biased_generator;
45
+ #endif
46
+
47
+ } // namespace
48
+
49
+ #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
50
+ ABSL_PER_THREAD_TLS_KEYWORD int64_t global_next_sample = 0;
51
+ #endif // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
52
+
53
+ HashtablezSampler& HashtablezSampler::Global() {
54
+ static auto* sampler = new HashtablezSampler();
55
+ return *sampler;
56
+ }
57
+
58
+ HashtablezSampler::DisposeCallback HashtablezSampler::SetDisposeCallback(
59
+ DisposeCallback f) {
60
+ return dispose_.exchange(f, std::memory_order_relaxed);
61
+ }
62
+
63
+ HashtablezInfo::HashtablezInfo() { PrepareForSampling(); }
64
+ HashtablezInfo::~HashtablezInfo() = default;
65
+
66
+ void HashtablezInfo::PrepareForSampling() {
67
+ capacity.store(0, std::memory_order_relaxed);
68
+ size.store(0, std::memory_order_relaxed);
69
+ num_erases.store(0, std::memory_order_relaxed);
70
+ max_probe_length.store(0, std::memory_order_relaxed);
71
+ total_probe_length.store(0, std::memory_order_relaxed);
72
+ hashes_bitwise_or.store(0, std::memory_order_relaxed);
73
+ hashes_bitwise_and.store(~size_t{}, std::memory_order_relaxed);
74
+
75
+ create_time = absl::Now();
76
+ // The inliner makes hardcoded skip_count difficult (especially when combined
77
+ // with LTO). We use the ability to exclude stacks by regex when encoding
78
+ // instead.
79
+ depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
80
+ /* skip_count= */ 0);
81
+ dead = nullptr;
82
+ }
83
+
84
+ HashtablezSampler::HashtablezSampler()
85
+ : dropped_samples_(0), size_estimate_(0), all_(nullptr), dispose_(nullptr) {
86
+ absl::MutexLock l(&graveyard_.init_mu);
87
+ graveyard_.dead = &graveyard_;
88
+ }
89
+
90
+ HashtablezSampler::~HashtablezSampler() {
91
+ HashtablezInfo* s = all_.load(std::memory_order_acquire);
92
+ while (s != nullptr) {
93
+ HashtablezInfo* next = s->next;
94
+ delete s;
95
+ s = next;
96
+ }
97
+ }
98
+
99
+ void HashtablezSampler::PushNew(HashtablezInfo* sample) {
100
+ sample->next = all_.load(std::memory_order_relaxed);
101
+ while (!all_.compare_exchange_weak(sample->next, sample,
102
+ std::memory_order_release,
103
+ std::memory_order_relaxed)) {
104
+ }
105
+ }
106
+
107
+ void HashtablezSampler::PushDead(HashtablezInfo* sample) {
108
+ if (auto* dispose = dispose_.load(std::memory_order_relaxed)) {
109
+ dispose(*sample);
110
+ }
111
+
112
+ absl::MutexLock graveyard_lock(&graveyard_.init_mu);
113
+ absl::MutexLock sample_lock(&sample->init_mu);
114
+ sample->dead = graveyard_.dead;
115
+ graveyard_.dead = sample;
116
+ }
117
+
118
+ HashtablezInfo* HashtablezSampler::PopDead() {
119
+ absl::MutexLock graveyard_lock(&graveyard_.init_mu);
120
+
121
+ // The list is circular, so eventually it collapses down to
122
+ // graveyard_.dead == &graveyard_
123
+ // when it is empty.
124
+ HashtablezInfo* sample = graveyard_.dead;
125
+ if (sample == &graveyard_) return nullptr;
126
+
127
+ absl::MutexLock sample_lock(&sample->init_mu);
128
+ graveyard_.dead = sample->dead;
129
+ sample->PrepareForSampling();
130
+ return sample;
131
+ }
132
+
133
+ HashtablezInfo* HashtablezSampler::Register() {
134
+ int64_t size = size_estimate_.fetch_add(1, std::memory_order_relaxed);
135
+ if (size > g_hashtablez_max_samples.load(std::memory_order_relaxed)) {
136
+ size_estimate_.fetch_sub(1, std::memory_order_relaxed);
137
+ dropped_samples_.fetch_add(1, std::memory_order_relaxed);
138
+ return nullptr;
139
+ }
140
+
141
+ HashtablezInfo* sample = PopDead();
142
+ if (sample == nullptr) {
143
+ // Resurrection failed. Hire a new warlock.
144
+ sample = new HashtablezInfo();
145
+ PushNew(sample);
146
+ }
147
+
148
+ return sample;
149
+ }
150
+
151
+ void HashtablezSampler::Unregister(HashtablezInfo* sample) {
152
+ PushDead(sample);
153
+ size_estimate_.fetch_sub(1, std::memory_order_relaxed);
154
+ }
155
+
156
+ int64_t HashtablezSampler::Iterate(
157
+ const std::function<void(const HashtablezInfo& stack)>& f) {
158
+ HashtablezInfo* s = all_.load(std::memory_order_acquire);
159
+ while (s != nullptr) {
160
+ absl::MutexLock l(&s->init_mu);
161
+ if (s->dead == nullptr) {
162
+ f(*s);
163
+ }
164
+ s = s->next;
165
+ }
166
+
167
+ return dropped_samples_.load(std::memory_order_relaxed);
168
+ }
169
+
170
+ static bool ShouldForceSampling() {
171
+ enum ForceState {
172
+ kDontForce,
173
+ kForce,
174
+ kUninitialized
175
+ };
176
+ ABSL_CONST_INIT static std::atomic<ForceState> global_state{
177
+ kUninitialized};
178
+ ForceState state = global_state.load(std::memory_order_relaxed);
179
+ if (ABSL_PREDICT_TRUE(state == kDontForce)) return false;
180
+
181
+ if (state == kUninitialized) {
182
+ state = AbslContainerInternalSampleEverything() ? kForce : kDontForce;
183
+ global_state.store(state, std::memory_order_relaxed);
184
+ }
185
+ return state == kForce;
186
+ }
187
+
188
+ HashtablezInfo* SampleSlow(int64_t* next_sample) {
189
+ if (ABSL_PREDICT_FALSE(ShouldForceSampling())) {
190
+ *next_sample = 1;
191
+ return HashtablezSampler::Global().Register();
192
+ }
193
+
194
+ #if !defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
195
+ *next_sample = std::numeric_limits<int64_t>::max();
196
+ return nullptr;
197
+ #else
198
+ bool first = *next_sample < 0;
199
+ *next_sample = g_exponential_biased_generator.GetStride(
200
+ g_hashtablez_sample_parameter.load(std::memory_order_relaxed));
201
+ // Small values of interval are equivalent to just sampling next time.
202
+ ABSL_ASSERT(*next_sample >= 1);
203
+
204
+ // g_hashtablez_enabled can be dynamically flipped, we need to set a threshold
205
+ // low enough that we will start sampling in a reasonable time, so we just use
206
+ // the default sampling rate.
207
+ if (!g_hashtablez_enabled.load(std::memory_order_relaxed)) return nullptr;
208
+
209
+ // We will only be negative on our first count, so we should just retry in
210
+ // that case.
211
+ if (first) {
212
+ if (ABSL_PREDICT_TRUE(--*next_sample > 0)) return nullptr;
213
+ return SampleSlow(next_sample);
214
+ }
215
+
216
+ return HashtablezSampler::Global().Register();
217
+ #endif
218
+ }
219
+
220
+ void UnsampleSlow(HashtablezInfo* info) {
221
+ HashtablezSampler::Global().Unregister(info);
222
+ }
223
+
224
+ void RecordInsertSlow(HashtablezInfo* info, size_t hash,
225
+ size_t distance_from_desired) {
226
+ // SwissTables probe in groups of 16, so scale this to count items probes and
227
+ // not offset from desired.
228
+ size_t probe_length = distance_from_desired;
229
+ #if SWISSTABLE_HAVE_SSE2
230
+ probe_length /= 16;
231
+ #else
232
+ probe_length /= 8;
233
+ #endif
234
+
235
+ info->hashes_bitwise_and.fetch_and(hash, std::memory_order_relaxed);
236
+ info->hashes_bitwise_or.fetch_or(hash, std::memory_order_relaxed);
237
+ info->max_probe_length.store(
238
+ std::max(info->max_probe_length.load(std::memory_order_relaxed),
239
+ probe_length),
240
+ std::memory_order_relaxed);
241
+ info->total_probe_length.fetch_add(probe_length, std::memory_order_relaxed);
242
+ info->size.fetch_add(1, std::memory_order_relaxed);
243
+ }
244
+
245
+ void SetHashtablezEnabled(bool enabled) {
246
+ g_hashtablez_enabled.store(enabled, std::memory_order_release);
247
+ }
248
+
249
+ void SetHashtablezSampleParameter(int32_t rate) {
250
+ if (rate > 0) {
251
+ g_hashtablez_sample_parameter.store(rate, std::memory_order_release);
252
+ } else {
253
+ ABSL_RAW_LOG(ERROR, "Invalid hashtablez sample rate: %lld",
254
+ static_cast<long long>(rate)); // NOLINT(runtime/int)
255
+ }
256
+ }
257
+
258
+ void SetHashtablezMaxSamples(int32_t max) {
259
+ if (max > 0) {
260
+ g_hashtablez_max_samples.store(max, std::memory_order_release);
261
+ } else {
262
+ ABSL_RAW_LOG(ERROR, "Invalid hashtablez max samples: %lld",
263
+ static_cast<long long>(max)); // NOLINT(runtime/int)
264
+ }
265
+ }
266
+
267
+ } // namespace container_internal
268
+ ABSL_NAMESPACE_END
269
+ } // namespace absl