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,151 @@
1
+ // Copyright 2020 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_STRINGS_INTERNAL_CORD_INTERNAL_H_
16
+ #define ABSL_STRINGS_INTERNAL_CORD_INTERNAL_H_
17
+
18
+ #include <atomic>
19
+ #include <cassert>
20
+ #include <cstddef>
21
+ #include <cstdint>
22
+ #include <type_traits>
23
+
24
+ #include "absl/meta/type_traits.h"
25
+ #include "absl/strings/string_view.h"
26
+
27
+ namespace absl {
28
+ ABSL_NAMESPACE_BEGIN
29
+ namespace cord_internal {
30
+
31
+ // Wraps std::atomic for reference counting.
32
+ class Refcount {
33
+ public:
34
+ Refcount() : count_{1} {}
35
+ ~Refcount() {}
36
+
37
+ // Increments the reference count by 1. Imposes no memory ordering.
38
+ inline void Increment() { count_.fetch_add(1, std::memory_order_relaxed); }
39
+
40
+ // Asserts that the current refcount is greater than 0. If the refcount is
41
+ // greater than 1, decrements the reference count by 1.
42
+ //
43
+ // Returns false if there are no references outstanding; true otherwise.
44
+ // Inserts barriers to ensure that state written before this method returns
45
+ // false will be visible to a thread that just observed this method returning
46
+ // false.
47
+ inline bool Decrement() {
48
+ int32_t refcount = count_.load(std::memory_order_acquire);
49
+ assert(refcount > 0);
50
+ return refcount != 1 && count_.fetch_sub(1, std::memory_order_acq_rel) != 1;
51
+ }
52
+
53
+ // Same as Decrement but expect that refcount is greater than 1.
54
+ inline bool DecrementExpectHighRefcount() {
55
+ int32_t refcount = count_.fetch_sub(1, std::memory_order_acq_rel);
56
+ assert(refcount > 0);
57
+ return refcount != 1;
58
+ }
59
+
60
+ // Returns the current reference count using acquire semantics.
61
+ inline int32_t Get() const { return count_.load(std::memory_order_acquire); }
62
+
63
+ // Returns whether the atomic integer is 1.
64
+ // If the reference count is used in the conventional way, a
65
+ // reference count of 1 implies that the current thread owns the
66
+ // reference and no other thread shares it.
67
+ // This call performs the test for a reference count of one, and
68
+ // performs the memory barrier needed for the owning thread
69
+ // to act on the object, knowing that it has exclusive access to the
70
+ // object.
71
+ inline bool IsOne() { return count_.load(std::memory_order_acquire) == 1; }
72
+
73
+ private:
74
+ std::atomic<int32_t> count_;
75
+ };
76
+
77
+ // The overhead of a vtable is too much for Cord, so we roll our own subclasses
78
+ // using only a single byte to differentiate classes from each other - the "tag"
79
+ // byte. Define the subclasses first so we can provide downcasting helper
80
+ // functions in the base class.
81
+
82
+ struct CordRepConcat;
83
+ struct CordRepSubstring;
84
+ struct CordRepExternal;
85
+
86
+ struct CordRep {
87
+ // The following three fields have to be less than 32 bytes since
88
+ // that is the smallest supported flat node size.
89
+ // We use uint64_t for the length even in 32-bit binaries.
90
+ uint64_t length;
91
+ Refcount refcount;
92
+ // If tag < FLAT, it represents CordRepKind and indicates the type of node.
93
+ // Otherwise, the node type is CordRepFlat and the tag is the encoded size.
94
+ uint8_t tag;
95
+ char data[1]; // Starting point for flat array: MUST BE LAST FIELD of CordRep
96
+
97
+ inline CordRepConcat* concat();
98
+ inline const CordRepConcat* concat() const;
99
+ inline CordRepSubstring* substring();
100
+ inline const CordRepSubstring* substring() const;
101
+ inline CordRepExternal* external();
102
+ inline const CordRepExternal* external() const;
103
+ };
104
+
105
+ struct CordRepConcat : public CordRep {
106
+ CordRep* left;
107
+ CordRep* right;
108
+
109
+ uint8_t depth() const { return static_cast<uint8_t>(data[0]); }
110
+ void set_depth(uint8_t depth) { data[0] = static_cast<char>(depth); }
111
+ };
112
+
113
+ struct CordRepSubstring : public CordRep {
114
+ size_t start; // Starting offset of substring in child
115
+ CordRep* child;
116
+ };
117
+
118
+ // TODO(strel): replace the following logic (and related functions in cord.cc)
119
+ // with container_internal::Layout.
120
+
121
+ // Alignment requirement for CordRepExternal so that the type erased releaser
122
+ // will be stored at a suitably aligned address.
123
+ constexpr size_t ExternalRepAlignment() {
124
+ #if defined(__STDCPP_DEFAULT_NEW_ALIGNMENT__)
125
+ return __STDCPP_DEFAULT_NEW_ALIGNMENT__;
126
+ #else
127
+ return alignof(max_align_t);
128
+ #endif
129
+ }
130
+
131
+ // Type for function pointer that will invoke and destroy the type-erased
132
+ // releaser function object. Accepts a pointer to the releaser and the
133
+ // `string_view` that were passed in to `NewExternalRep` below. The return value
134
+ // is the size of the `Releaser` type.
135
+ using ExternalReleaserInvoker = size_t (*)(void*, absl::string_view);
136
+
137
+ // External CordReps are allocated together with a type erased releaser. The
138
+ // releaser is stored in the memory directly following the CordRepExternal.
139
+ struct alignas(ExternalRepAlignment()) CordRepExternal : public CordRep {
140
+ const char* base;
141
+ // Pointer to function that knows how to call and destroy the releaser.
142
+ ExternalReleaserInvoker releaser_invoker;
143
+ };
144
+
145
+ // TODO(strel): look into removing, it doesn't seem like anything relies on this
146
+ static_assert(sizeof(CordRepConcat) == sizeof(CordRepSubstring), "");
147
+
148
+ } // namespace cord_internal
149
+ ABSL_NAMESPACE_END
150
+ } // namespace absl
151
+ #endif // ABSL_STRINGS_INTERNAL_CORD_INTERNAL_H_
@@ -0,0 +1,52 @@
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
+ #include "absl/synchronization/barrier.h"
16
+
17
+ #include "absl/base/internal/raw_logging.h"
18
+ #include "absl/synchronization/mutex.h"
19
+
20
+ namespace absl {
21
+ ABSL_NAMESPACE_BEGIN
22
+
23
+ // Return whether int *arg is zero.
24
+ static bool IsZero(void *arg) {
25
+ return 0 == *reinterpret_cast<int *>(arg);
26
+ }
27
+
28
+ bool Barrier::Block() {
29
+ MutexLock l(&this->lock_);
30
+
31
+ this->num_to_block_--;
32
+ if (this->num_to_block_ < 0) {
33
+ ABSL_RAW_LOG(
34
+ FATAL,
35
+ "Block() called too many times. num_to_block_=%d out of total=%d",
36
+ this->num_to_block_, this->num_to_exit_);
37
+ }
38
+
39
+ this->lock_.Await(Condition(IsZero, &this->num_to_block_));
40
+
41
+ // Determine which thread can safely delete this Barrier object
42
+ this->num_to_exit_--;
43
+ ABSL_RAW_CHECK(this->num_to_exit_ >= 0, "barrier underflow");
44
+
45
+ // If num_to_exit_ == 0 then all other threads in the barrier have
46
+ // exited the Wait() and have released the Mutex so this thread is
47
+ // free to delete the barrier.
48
+ return this->num_to_exit_ == 0;
49
+ }
50
+
51
+ ABSL_NAMESPACE_END
52
+ } // namespace absl
@@ -0,0 +1,79 @@
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
+ // -----------------------------------------------------------------------------
16
+ // barrier.h
17
+ // -----------------------------------------------------------------------------
18
+
19
+ #ifndef ABSL_SYNCHRONIZATION_BARRIER_H_
20
+ #define ABSL_SYNCHRONIZATION_BARRIER_H_
21
+
22
+ #include "absl/base/thread_annotations.h"
23
+ #include "absl/synchronization/mutex.h"
24
+
25
+ namespace absl {
26
+ ABSL_NAMESPACE_BEGIN
27
+
28
+ // Barrier
29
+ //
30
+ // This class creates a barrier which blocks threads until a prespecified
31
+ // threshold of threads (`num_threads`) utilizes the barrier. A thread utilizes
32
+ // the `Barrier` by calling `Block()` on the barrier, which will block that
33
+ // thread; no call to `Block()` will return until `num_threads` threads have
34
+ // called it.
35
+ //
36
+ // Exactly one call to `Block()` will return `true`, which is then responsible
37
+ // for destroying the barrier; because stack allocation will cause the barrier
38
+ // to be deleted when it is out of scope, barriers should not be stack
39
+ // allocated.
40
+ //
41
+ // Example:
42
+ //
43
+ // // Main thread creates a `Barrier`:
44
+ // barrier = new Barrier(num_threads);
45
+ //
46
+ // // Each participating thread could then call:
47
+ // if (barrier->Block()) delete barrier; // Exactly one call to `Block()`
48
+ // // returns `true`; that call
49
+ // // deletes the barrier.
50
+ class Barrier {
51
+ public:
52
+ // `num_threads` is the number of threads that will participate in the barrier
53
+ explicit Barrier(int num_threads)
54
+ : num_to_block_(num_threads), num_to_exit_(num_threads) {}
55
+
56
+ Barrier(const Barrier&) = delete;
57
+ Barrier& operator=(const Barrier&) = delete;
58
+
59
+ // Barrier::Block()
60
+ //
61
+ // Blocks the current thread, and returns only when the `num_threads`
62
+ // threshold of threads utilizing this barrier has been reached. `Block()`
63
+ // returns `true` for precisely one caller, which may then destroy the
64
+ // barrier.
65
+ //
66
+ // Memory ordering: For any threads X and Y, any action taken by X
67
+ // before X calls `Block()` will be visible to Y after Y returns from
68
+ // `Block()`.
69
+ bool Block();
70
+
71
+ private:
72
+ Mutex lock_;
73
+ int num_to_block_ ABSL_GUARDED_BY(lock_);
74
+ int num_to_exit_ ABSL_GUARDED_BY(lock_);
75
+ };
76
+
77
+ ABSL_NAMESPACE_END
78
+ } // namespace absl
79
+ #endif // ABSL_SYNCHRONIZATION_BARRIER_H_
@@ -0,0 +1,57 @@
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
+ #include "absl/synchronization/blocking_counter.h"
16
+
17
+ #include "absl/base/internal/raw_logging.h"
18
+
19
+ namespace absl {
20
+ ABSL_NAMESPACE_BEGIN
21
+
22
+ // Return whether int *arg is zero.
23
+ static bool IsZero(void *arg) {
24
+ return 0 == *reinterpret_cast<int *>(arg);
25
+ }
26
+
27
+ bool BlockingCounter::DecrementCount() {
28
+ MutexLock l(&lock_);
29
+ count_--;
30
+ if (count_ < 0) {
31
+ ABSL_RAW_LOG(
32
+ FATAL,
33
+ "BlockingCounter::DecrementCount() called too many times. count=%d",
34
+ count_);
35
+ }
36
+ return count_ == 0;
37
+ }
38
+
39
+ void BlockingCounter::Wait() {
40
+ MutexLock l(&this->lock_);
41
+ ABSL_RAW_CHECK(count_ >= 0, "BlockingCounter underflow");
42
+
43
+ // only one thread may call Wait(). To support more than one thread,
44
+ // implement a counter num_to_exit, like in the Barrier class.
45
+ ABSL_RAW_CHECK(num_waiting_ == 0, "multiple threads called Wait()");
46
+ num_waiting_++;
47
+
48
+ this->lock_.Await(Condition(IsZero, &this->count_));
49
+
50
+ // At this point, We know that all threads executing DecrementCount have
51
+ // released the lock, and so will not touch this object again.
52
+ // Therefore, the thread calling this method is free to delete the object
53
+ // after we return from this method.
54
+ }
55
+
56
+ ABSL_NAMESPACE_END
57
+ } // namespace absl
@@ -0,0 +1,99 @@
1
+ //
2
+ // Copyright 2017 The Abseil Authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // https://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+ // -----------------------------------------------------------------------------
17
+ // blocking_counter.h
18
+ // -----------------------------------------------------------------------------
19
+
20
+ #ifndef ABSL_SYNCHRONIZATION_BLOCKING_COUNTER_H_
21
+ #define ABSL_SYNCHRONIZATION_BLOCKING_COUNTER_H_
22
+
23
+ #include "absl/base/thread_annotations.h"
24
+ #include "absl/synchronization/mutex.h"
25
+
26
+ namespace absl {
27
+ ABSL_NAMESPACE_BEGIN
28
+
29
+ // BlockingCounter
30
+ //
31
+ // This class allows a thread to block for a pre-specified number of actions.
32
+ // `BlockingCounter` maintains a single non-negative abstract integer "count"
33
+ // with an initial value `initial_count`. A thread can then call `Wait()` on
34
+ // this blocking counter to block until the specified number of events occur;
35
+ // worker threads then call 'DecrementCount()` on the counter upon completion of
36
+ // their work. Once the counter's internal "count" reaches zero, the blocked
37
+ // thread unblocks.
38
+ //
39
+ // A `BlockingCounter` requires the following:
40
+ // - its `initial_count` is non-negative.
41
+ // - the number of calls to `DecrementCount()` on it is at most
42
+ // `initial_count`.
43
+ // - `Wait()` is called at most once on it.
44
+ //
45
+ // Given the above requirements, a `BlockingCounter` provides the following
46
+ // guarantees:
47
+ // - Once its internal "count" reaches zero, no legal action on the object
48
+ // can further change the value of "count".
49
+ // - When `Wait()` returns, it is legal to destroy the `BlockingCounter`.
50
+ // - When `Wait()` returns, the number of calls to `DecrementCount()` on
51
+ // this blocking counter exactly equals `initial_count`.
52
+ //
53
+ // Example:
54
+ // BlockingCounter bcount(N); // there are N items of work
55
+ // ... Allow worker threads to start.
56
+ // ... On completing each work item, workers do:
57
+ // ... bcount.DecrementCount(); // an item of work has been completed
58
+ //
59
+ // bcount.Wait(); // wait for all work to be complete
60
+ //
61
+ class BlockingCounter {
62
+ public:
63
+ explicit BlockingCounter(int initial_count)
64
+ : count_(initial_count), num_waiting_(0) {}
65
+
66
+ BlockingCounter(const BlockingCounter&) = delete;
67
+ BlockingCounter& operator=(const BlockingCounter&) = delete;
68
+
69
+ // BlockingCounter::DecrementCount()
70
+ //
71
+ // Decrements the counter's "count" by one, and return "count == 0". This
72
+ // function requires that "count != 0" when it is called.
73
+ //
74
+ // Memory ordering: For any threads X and Y, any action taken by X
75
+ // before it calls `DecrementCount()` is visible to thread Y after
76
+ // Y's call to `DecrementCount()`, provided Y's call returns `true`.
77
+ bool DecrementCount();
78
+
79
+ // BlockingCounter::Wait()
80
+ //
81
+ // Blocks until the counter reaches zero. This function may be called at most
82
+ // once. On return, `DecrementCount()` will have been called "initial_count"
83
+ // times and the blocking counter may be destroyed.
84
+ //
85
+ // Memory ordering: For any threads X and Y, any action taken by X
86
+ // before X calls `DecrementCount()` is visible to Y after Y returns
87
+ // from `Wait()`.
88
+ void Wait();
89
+
90
+ private:
91
+ Mutex lock_;
92
+ int count_ ABSL_GUARDED_BY(lock_);
93
+ int num_waiting_ ABSL_GUARDED_BY(lock_);
94
+ };
95
+
96
+ ABSL_NAMESPACE_END
97
+ } // namespace absl
98
+
99
+ #endif // ABSL_SYNCHRONIZATION_BLOCKING_COUNTER_H_
@@ -0,0 +1,140 @@
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
+ #include <stdint.h>
16
+ #include <new>
17
+
18
+ // This file is a no-op if the required LowLevelAlloc support is missing.
19
+ #include "absl/base/internal/low_level_alloc.h"
20
+ #ifndef ABSL_LOW_LEVEL_ALLOC_MISSING
21
+
22
+ #include <string.h>
23
+
24
+ #include "absl/base/attributes.h"
25
+ #include "absl/base/internal/spinlock.h"
26
+ #include "absl/base/internal/thread_identity.h"
27
+ #include "absl/synchronization/internal/per_thread_sem.h"
28
+
29
+ namespace absl {
30
+ ABSL_NAMESPACE_BEGIN
31
+ namespace synchronization_internal {
32
+
33
+ // ThreadIdentity storage is persistent, we maintain a free-list of previously
34
+ // released ThreadIdentity objects.
35
+ static base_internal::SpinLock freelist_lock(
36
+ base_internal::kLinkerInitialized);
37
+ static base_internal::ThreadIdentity* thread_identity_freelist;
38
+
39
+ // A per-thread destructor for reclaiming associated ThreadIdentity objects.
40
+ // Since we must preserve their storage we cache them for re-use.
41
+ void ReclaimThreadIdentity(void* v) {
42
+ base_internal::ThreadIdentity* identity =
43
+ static_cast<base_internal::ThreadIdentity*>(v);
44
+
45
+ // all_locks might have been allocated by the Mutex implementation.
46
+ // We free it here when we are notified that our thread is dying.
47
+ if (identity->per_thread_synch.all_locks != nullptr) {
48
+ base_internal::LowLevelAlloc::Free(identity->per_thread_synch.all_locks);
49
+ }
50
+
51
+ PerThreadSem::Destroy(identity);
52
+
53
+ // We must explicitly clear the current thread's identity:
54
+ // (a) Subsequent (unrelated) per-thread destructors may require an identity.
55
+ // We must guarantee a new identity is used in this case (this instructor
56
+ // will be reinvoked up to PTHREAD_DESTRUCTOR_ITERATIONS in this case).
57
+ // (b) ThreadIdentity implementations may depend on memory that is not
58
+ // reinitialized before reuse. We must allow explicit clearing of the
59
+ // association state in this case.
60
+ base_internal::ClearCurrentThreadIdentity();
61
+ {
62
+ base_internal::SpinLockHolder l(&freelist_lock);
63
+ identity->next = thread_identity_freelist;
64
+ thread_identity_freelist = identity;
65
+ }
66
+ }
67
+
68
+ // Return value rounded up to next multiple of align.
69
+ // Align must be a power of two.
70
+ static intptr_t RoundUp(intptr_t addr, intptr_t align) {
71
+ return (addr + align - 1) & ~(align - 1);
72
+ }
73
+
74
+ static void ResetThreadIdentity(base_internal::ThreadIdentity* identity) {
75
+ base_internal::PerThreadSynch* pts = &identity->per_thread_synch;
76
+ pts->next = nullptr;
77
+ pts->skip = nullptr;
78
+ pts->may_skip = false;
79
+ pts->waitp = nullptr;
80
+ pts->suppress_fatal_errors = false;
81
+ pts->readers = 0;
82
+ pts->priority = 0;
83
+ pts->next_priority_read_cycles = 0;
84
+ pts->state.store(base_internal::PerThreadSynch::State::kAvailable,
85
+ std::memory_order_relaxed);
86
+ pts->maybe_unlocking = false;
87
+ pts->wake = false;
88
+ pts->cond_waiter = false;
89
+ pts->all_locks = nullptr;
90
+ identity->blocked_count_ptr = nullptr;
91
+ identity->ticker.store(0, std::memory_order_relaxed);
92
+ identity->wait_start.store(0, std::memory_order_relaxed);
93
+ identity->is_idle.store(false, std::memory_order_relaxed);
94
+ identity->next = nullptr;
95
+ }
96
+
97
+ static base_internal::ThreadIdentity* NewThreadIdentity() {
98
+ base_internal::ThreadIdentity* identity = nullptr;
99
+
100
+ {
101
+ // Re-use a previously released object if possible.
102
+ base_internal::SpinLockHolder l(&freelist_lock);
103
+ if (thread_identity_freelist) {
104
+ identity = thread_identity_freelist; // Take list-head.
105
+ thread_identity_freelist = thread_identity_freelist->next;
106
+ }
107
+ }
108
+
109
+ if (identity == nullptr) {
110
+ // Allocate enough space to align ThreadIdentity to a multiple of
111
+ // PerThreadSynch::kAlignment. This space is never released (it is
112
+ // added to a freelist by ReclaimThreadIdentity instead).
113
+ void* allocation = base_internal::LowLevelAlloc::Alloc(
114
+ sizeof(*identity) + base_internal::PerThreadSynch::kAlignment - 1);
115
+ // Round up the address to the required alignment.
116
+ identity = reinterpret_cast<base_internal::ThreadIdentity*>(
117
+ RoundUp(reinterpret_cast<intptr_t>(allocation),
118
+ base_internal::PerThreadSynch::kAlignment));
119
+ }
120
+ ResetThreadIdentity(identity);
121
+
122
+ return identity;
123
+ }
124
+
125
+ // Allocates and attaches ThreadIdentity object for the calling thread. Returns
126
+ // the new identity.
127
+ // REQUIRES: CurrentThreadIdentity(false) == nullptr
128
+ base_internal::ThreadIdentity* CreateThreadIdentity() {
129
+ base_internal::ThreadIdentity* identity = NewThreadIdentity();
130
+ PerThreadSem::Init(identity);
131
+ // Associate the value with the current thread, and attach our destructor.
132
+ base_internal::SetCurrentThreadIdentity(identity, ReclaimThreadIdentity);
133
+ return identity;
134
+ }
135
+
136
+ } // namespace synchronization_internal
137
+ ABSL_NAMESPACE_END
138
+ } // namespace absl
139
+
140
+ #endif // ABSL_LOW_LEVEL_ALLOC_MISSING