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,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, &region->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