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,141 @@
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
+ #ifndef ABSL_SYNCHRONIZATION_INTERNAL_GRAPHCYCLES_H_
17
+ #define ABSL_SYNCHRONIZATION_INTERNAL_GRAPHCYCLES_H_
18
+
19
+ // GraphCycles detects the introduction of a cycle into a directed
20
+ // graph that is being built up incrementally.
21
+ //
22
+ // Nodes are identified by small integers. It is not possible to
23
+ // record multiple edges with the same (source, destination) pair;
24
+ // requests to add an edge where one already exists are silently
25
+ // ignored.
26
+ //
27
+ // It is also not possible to introduce a cycle; an attempt to insert
28
+ // an edge that would introduce a cycle fails and returns false.
29
+ //
30
+ // GraphCycles uses no internal locking; calls into it should be
31
+ // serialized externally.
32
+
33
+ // Performance considerations:
34
+ // Works well on sparse graphs, poorly on dense graphs.
35
+ // Extra information is maintained incrementally to detect cycles quickly.
36
+ // InsertEdge() is very fast when the edge already exists, and reasonably fast
37
+ // otherwise.
38
+ // FindPath() is linear in the size of the graph.
39
+ // The current implementation uses O(|V|+|E|) space.
40
+
41
+ #include <cstdint>
42
+
43
+ #include "absl/base/config.h"
44
+
45
+ namespace absl {
46
+ ABSL_NAMESPACE_BEGIN
47
+ namespace synchronization_internal {
48
+
49
+ // Opaque identifier for a graph node.
50
+ struct GraphId {
51
+ uint64_t handle;
52
+
53
+ bool operator==(const GraphId& x) const { return handle == x.handle; }
54
+ bool operator!=(const GraphId& x) const { return handle != x.handle; }
55
+ };
56
+
57
+ // Return an invalid graph id that will never be assigned by GraphCycles.
58
+ inline GraphId InvalidGraphId() {
59
+ return GraphId{0};
60
+ }
61
+
62
+ class GraphCycles {
63
+ public:
64
+ GraphCycles();
65
+ ~GraphCycles();
66
+
67
+ // Return the id to use for ptr, assigning one if necessary.
68
+ // Subsequent calls with the same ptr value will return the same id
69
+ // until Remove().
70
+ GraphId GetId(void* ptr);
71
+
72
+ // Remove "ptr" from the graph. Its corresponding node and all
73
+ // edges to and from it are removed.
74
+ void RemoveNode(void* ptr);
75
+
76
+ // Return the pointer associated with id, or nullptr if id is not
77
+ // currently in the graph.
78
+ void* Ptr(GraphId id);
79
+
80
+ // Attempt to insert an edge from source_node to dest_node. If the
81
+ // edge would introduce a cycle, return false without making any
82
+ // changes. Otherwise add the edge and return true.
83
+ bool InsertEdge(GraphId source_node, GraphId dest_node);
84
+
85
+ // Remove any edge that exists from source_node to dest_node.
86
+ void RemoveEdge(GraphId source_node, GraphId dest_node);
87
+
88
+ // Return whether node exists in the graph.
89
+ bool HasNode(GraphId node);
90
+
91
+ // Return whether there is an edge directly from source_node to dest_node.
92
+ bool HasEdge(GraphId source_node, GraphId dest_node) const;
93
+
94
+ // Return whether dest_node is reachable from source_node
95
+ // by following edges.
96
+ bool IsReachable(GraphId source_node, GraphId dest_node) const;
97
+
98
+ // Find a path from "source" to "dest". If such a path exists,
99
+ // place the nodes on the path in the array path[], and return
100
+ // the number of nodes on the path. If the path is longer than
101
+ // max_path_len nodes, only the first max_path_len nodes are placed
102
+ // in path[]. The client should compare the return value with
103
+ // max_path_len" to see when this occurs. If no path exists, return
104
+ // 0. Any valid path stored in path[] will start with "source" and
105
+ // end with "dest". There is no guarantee that the path is the
106
+ // shortest, but no node will appear twice in the path, except the
107
+ // source and destination node if they are identical; therefore, the
108
+ // return value is at most one greater than the number of nodes in
109
+ // the graph.
110
+ int FindPath(GraphId source, GraphId dest, int max_path_len,
111
+ GraphId path[]) const;
112
+
113
+ // Update the stack trace recorded for id with the current stack
114
+ // trace if the last time it was updated had a smaller priority
115
+ // than the priority passed on this call.
116
+ //
117
+ // *get_stack_trace is called to get the stack trace.
118
+ void UpdateStackTrace(GraphId id, int priority,
119
+ int (*get_stack_trace)(void**, int));
120
+
121
+ // Set *ptr to the beginning of the array that holds the recorded
122
+ // stack trace for id and return the depth of the stack trace.
123
+ int GetStackTrace(GraphId id, void*** ptr);
124
+
125
+ // Check internal invariants. Crashes on failure, returns true on success.
126
+ // Expensive: should only be called from graphcycles_test.cc.
127
+ bool CheckInvariants() const;
128
+
129
+ // ----------------------------------------------------
130
+ struct Rep;
131
+ private:
132
+ Rep *rep_; // opaque representation
133
+ GraphCycles(const GraphCycles&) = delete;
134
+ GraphCycles& operator=(const GraphCycles&) = delete;
135
+ };
136
+
137
+ } // namespace synchronization_internal
138
+ ABSL_NAMESPACE_END
139
+ } // namespace absl
140
+
141
+ #endif
@@ -0,0 +1,155 @@
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
+ // An optional absolute timeout, with nanosecond granularity,
17
+ // compatible with absl::Time. Suitable for in-register
18
+ // parameter-passing (e.g. syscalls.)
19
+ // Constructible from a absl::Time (for a timeout to be respected) or {}
20
+ // (for "no timeout".)
21
+ // This is a private low-level API for use by a handful of low-level
22
+ // components that are friends of this class. Higher-level components
23
+ // should build APIs based on absl::Time and absl::Duration.
24
+
25
+ #ifndef ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
26
+ #define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
27
+
28
+ #include <time.h>
29
+ #include <algorithm>
30
+ #include <limits>
31
+
32
+ #include "absl/base/internal/raw_logging.h"
33
+ #include "absl/time/clock.h"
34
+ #include "absl/time/time.h"
35
+
36
+ namespace absl {
37
+ ABSL_NAMESPACE_BEGIN
38
+ namespace synchronization_internal {
39
+
40
+ class Futex;
41
+ class Waiter;
42
+
43
+ class KernelTimeout {
44
+ public:
45
+ // A timeout that should expire at <t>. Any value, in the full
46
+ // InfinitePast() to InfiniteFuture() range, is valid here and will be
47
+ // respected.
48
+ explicit KernelTimeout(absl::Time t) : ns_(MakeNs(t)) {}
49
+ // No timeout.
50
+ KernelTimeout() : ns_(0) {}
51
+
52
+ // A more explicit factory for those who prefer it. Equivalent to {}.
53
+ static KernelTimeout Never() { return {}; }
54
+
55
+ // We explicitly do not support other custom formats: timespec, int64_t nanos.
56
+ // Unify on this and absl::Time, please.
57
+
58
+ bool has_timeout() const { return ns_ != 0; }
59
+
60
+ private:
61
+ // internal rep, not user visible: ns after unix epoch.
62
+ // zero = no timeout.
63
+ // Negative we treat as an unlikely (and certainly expired!) but valid
64
+ // timeout.
65
+ int64_t ns_;
66
+
67
+ static int64_t MakeNs(absl::Time t) {
68
+ // optimization--InfiniteFuture is common "no timeout" value
69
+ // and cheaper to compare than convert.
70
+ if (t == absl::InfiniteFuture()) return 0;
71
+ int64_t x = ToUnixNanos(t);
72
+
73
+ // A timeout that lands exactly on the epoch (x=0) needs to be respected,
74
+ // so we alter it unnoticably to 1. Negative timeouts are in
75
+ // theory supported, but handled poorly by the kernel (long
76
+ // delays) so push them forward too; since all such times have
77
+ // already passed, it's indistinguishable.
78
+ if (x <= 0) x = 1;
79
+ // A time larger than what can be represented to the kernel is treated
80
+ // as no timeout.
81
+ if (x == (std::numeric_limits<int64_t>::max)()) x = 0;
82
+ return x;
83
+ }
84
+
85
+ // Convert to parameter for sem_timedwait/futex/similar. Only for approved
86
+ // users. Do not call if !has_timeout.
87
+ struct timespec MakeAbsTimespec() {
88
+ int64_t n = ns_;
89
+ static const int64_t kNanosPerSecond = 1000 * 1000 * 1000;
90
+ if (n == 0) {
91
+ ABSL_RAW_LOG(
92
+ ERROR,
93
+ "Tried to create a timespec from a non-timeout; never do this.");
94
+ // But we'll try to continue sanely. no-timeout ~= saturated timeout.
95
+ n = (std::numeric_limits<int64_t>::max)();
96
+ }
97
+
98
+ // Kernel APIs validate timespecs as being at or after the epoch,
99
+ // despite the kernel time type being signed. However, no one can
100
+ // tell the difference between a timeout at or before the epoch (since
101
+ // all such timeouts have expired!)
102
+ if (n < 0) n = 0;
103
+
104
+ struct timespec abstime;
105
+ int64_t seconds = (std::min)(n / kNanosPerSecond,
106
+ int64_t{(std::numeric_limits<time_t>::max)()});
107
+ abstime.tv_sec = static_cast<time_t>(seconds);
108
+ abstime.tv_nsec =
109
+ static_cast<decltype(abstime.tv_nsec)>(n % kNanosPerSecond);
110
+ return abstime;
111
+ }
112
+
113
+ #ifdef _WIN32
114
+ // Converts to milliseconds from now, or INFINITE when
115
+ // !has_timeout(). For use by SleepConditionVariableSRW on
116
+ // Windows. Callers should recognize that the return value is a
117
+ // relative duration (it should be recomputed by calling this method
118
+ // in the case of a spurious wakeup).
119
+ // This header file may be included transitively by public header files,
120
+ // so we define our own DWORD and INFINITE instead of getting them from
121
+ // <intsafe.h> and <WinBase.h>.
122
+ typedef unsigned long DWord; // NOLINT
123
+ DWord InMillisecondsFromNow() const {
124
+ constexpr DWord kInfinite = (std::numeric_limits<DWord>::max)();
125
+ if (!has_timeout()) {
126
+ return kInfinite;
127
+ }
128
+ // The use of absl::Now() to convert from absolute time to
129
+ // relative time means that absl::Now() cannot use anything that
130
+ // depends on KernelTimeout (for example, Mutex) on Windows.
131
+ int64_t now = ToUnixNanos(absl::Now());
132
+ if (ns_ >= now) {
133
+ // Round up so that Now() + ms_from_now >= ns_.
134
+ constexpr uint64_t max_nanos =
135
+ (std::numeric_limits<int64_t>::max)() - 999999u;
136
+ uint64_t ms_from_now =
137
+ (std::min<uint64_t>(max_nanos, ns_ - now) + 999999u) / 1000000u;
138
+ if (ms_from_now > kInfinite) {
139
+ return kInfinite;
140
+ }
141
+ return static_cast<DWord>(ms_from_now);
142
+ }
143
+ return 0;
144
+ }
145
+ #endif
146
+
147
+ friend class Futex;
148
+ friend class Waiter;
149
+ };
150
+
151
+ } // namespace synchronization_internal
152
+ ABSL_NAMESPACE_END
153
+ } // namespace absl
154
+
155
+ #endif // ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
@@ -0,0 +1,261 @@
1
+ // Do not include. This is an implementation detail of base/mutex.h.
2
+ //
3
+ // Declares three classes:
4
+ //
5
+ // base::internal::MutexImpl - implementation helper for Mutex
6
+ // base::internal::CondVarImpl - implementation helper for CondVar
7
+ // base::internal::SynchronizationStorage<T> - implementation helper for
8
+ // Mutex, CondVar
9
+
10
+ #include <type_traits>
11
+
12
+ #if defined(_WIN32)
13
+ #include <condition_variable>
14
+ #include <mutex>
15
+ #else
16
+ #include <pthread.h>
17
+ #endif
18
+
19
+ #include "absl/base/call_once.h"
20
+ #include "absl/time/time.h"
21
+
22
+ // Declare that Mutex::ReaderLock is actually Lock(). Intended primarily
23
+ // for tests, and even then as a last resort.
24
+ #ifdef ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE
25
+ #error ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE cannot be directly set
26
+ #else
27
+ #define ABSL_MUTEX_READER_LOCK_IS_EXCLUSIVE 1
28
+ #endif
29
+
30
+ // Declare that Mutex::EnableInvariantDebugging is not implemented.
31
+ // Intended primarily for tests, and even then as a last resort.
32
+ #ifdef ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED
33
+ #error ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED cannot be directly set
34
+ #else
35
+ #define ABSL_MUTEX_ENABLE_INVARIANT_DEBUGGING_NOT_IMPLEMENTED 1
36
+ #endif
37
+
38
+ namespace absl {
39
+ ABSL_NAMESPACE_BEGIN
40
+ class Condition;
41
+
42
+ namespace synchronization_internal {
43
+
44
+ class MutexImpl;
45
+
46
+ // Do not use this implementation detail of CondVar. Provides most of the
47
+ // implementation, but should not be placed directly in static storage
48
+ // because it will not linker initialize properly. See
49
+ // SynchronizationStorage<T> below for what we mean by linker
50
+ // initialization.
51
+ class CondVarImpl {
52
+ public:
53
+ CondVarImpl();
54
+ CondVarImpl(const CondVarImpl&) = delete;
55
+ CondVarImpl& operator=(const CondVarImpl&) = delete;
56
+ ~CondVarImpl();
57
+
58
+ void Signal();
59
+ void SignalAll();
60
+ void Wait(MutexImpl* mutex);
61
+ bool WaitWithDeadline(MutexImpl* mutex, absl::Time deadline);
62
+
63
+ private:
64
+ #if defined(_WIN32)
65
+ std::condition_variable_any std_cv_;
66
+ #else
67
+ pthread_cond_t pthread_cv_;
68
+ #endif
69
+ };
70
+
71
+ // Do not use this implementation detail of Mutex. Provides most of the
72
+ // implementation, but should not be placed directly in static storage
73
+ // because it will not linker initialize properly. See
74
+ // SynchronizationStorage<T> below for what we mean by linker
75
+ // initialization.
76
+ class MutexImpl {
77
+ public:
78
+ MutexImpl();
79
+ MutexImpl(const MutexImpl&) = delete;
80
+ MutexImpl& operator=(const MutexImpl&) = delete;
81
+ ~MutexImpl();
82
+
83
+ void Lock();
84
+ bool TryLock();
85
+ void Unlock();
86
+ void Await(const Condition& cond);
87
+ bool AwaitWithDeadline(const Condition& cond, absl::Time deadline);
88
+
89
+ private:
90
+ friend class CondVarImpl;
91
+
92
+ #if defined(_WIN32)
93
+ std::mutex std_mutex_;
94
+ #else
95
+ pthread_mutex_t pthread_mutex_;
96
+ #endif
97
+
98
+ // True if the underlying mutex is locked. If the destructor is entered
99
+ // while locked_, the underlying mutex is unlocked. Mutex supports
100
+ // destruction while locked, but the same is undefined behavior for both
101
+ // pthread_mutex_t and std::mutex.
102
+ bool locked_ = false;
103
+
104
+ // Signaled before releasing the lock, in support of Await.
105
+ CondVarImpl released_;
106
+ };
107
+
108
+ // Do not use this implementation detail of CondVar and Mutex. A storage
109
+ // space for T that supports a LinkerInitialized constructor. T must
110
+ // have a default constructor, which is called by the first call to
111
+ // get(). T's destructor is never called if the LinkerInitialized
112
+ // constructor is called.
113
+ //
114
+ // Objects constructed with the default constructor are constructed and
115
+ // destructed like any other object, and should never be allocated in
116
+ // static storage.
117
+ //
118
+ // Objects constructed with the LinkerInitialized constructor should
119
+ // always be in static storage. For such objects, calls to get() are always
120
+ // valid, except from signal handlers.
121
+ //
122
+ // Note that this implementation relies on undefined language behavior that
123
+ // are known to hold for the set of supported compilers. An analysis
124
+ // follows.
125
+ //
126
+ // From the C++11 standard:
127
+ //
128
+ // [basic.life] says an object has non-trivial initialization if it is of
129
+ // class type and it is initialized by a constructor other than a trivial
130
+ // default constructor. (the LinkerInitialized constructor is
131
+ // non-trivial)
132
+ //
133
+ // [basic.life] says the lifetime of an object with a non-trivial
134
+ // constructor begins when the call to the constructor is complete.
135
+ //
136
+ // [basic.life] says the lifetime of an object with non-trivial destructor
137
+ // ends when the call to the destructor begins.
138
+ //
139
+ // [basic.life] p5 specifies undefined behavior when accessing non-static
140
+ // members of an instance outside its
141
+ // lifetime. (SynchronizationStorage::get() access non-static members)
142
+ //
143
+ // So, LinkerInitialized object of SynchronizationStorage uses a
144
+ // non-trivial constructor, which is called at some point during dynamic
145
+ // initialization, and is therefore subject to order of dynamic
146
+ // initialization bugs, where get() is called before the object's
147
+ // constructor is, resulting in undefined behavior.
148
+ //
149
+ // Similarly, a LinkerInitialized SynchronizationStorage object has a
150
+ // non-trivial destructor, and so its lifetime ends at some point during
151
+ // destruction of objects with static storage duration [basic.start.term]
152
+ // p4. There is a window where other exit code could call get() after this
153
+ // occurs, resulting in undefined behavior.
154
+ //
155
+ // Combined, these statements imply that LinkerInitialized instances
156
+ // of SynchronizationStorage<T> rely on undefined behavior.
157
+ //
158
+ // However, in practice, the implementation works on all supported
159
+ // compilers. Specifically, we rely on:
160
+ //
161
+ // a) zero-initialization being sufficient to initialize
162
+ // LinkerInitialized instances for the purposes of calling
163
+ // get(), regardless of when the constructor is called. This is
164
+ // because the is_dynamic_ boolean is correctly zero-initialized to
165
+ // false.
166
+ //
167
+ // b) the LinkerInitialized constructor is a NOP, and immaterial to
168
+ // even to concurrent calls to get().
169
+ //
170
+ // c) the destructor being a NOP for LinkerInitialized objects
171
+ // (guaranteed by a check for !is_dynamic_), and so any concurrent and
172
+ // subsequent calls to get() functioning as if the destructor were not
173
+ // called, by virtue of the instances' storage remaining valid after the
174
+ // destructor runs.
175
+ //
176
+ // d) That a-c apply transitively when SynchronizationStorage<T> is the
177
+ // only member of a class allocated in static storage.
178
+ //
179
+ // Nothing in the language standard guarantees that a-d hold. In practice,
180
+ // these hold in all supported compilers.
181
+ //
182
+ // Future direction:
183
+ //
184
+ // Ideally, we would simply use std::mutex or a similar class, which when
185
+ // allocated statically would support use immediately after static
186
+ // initialization up until static storage is reclaimed (i.e. the properties
187
+ // we require of all "linker initialized" instances).
188
+ //
189
+ // Regarding construction in static storage, std::mutex is required to
190
+ // provide a constexpr default constructor [thread.mutex.class], which
191
+ // ensures the instance's lifetime begins with static initialization
192
+ // [basic.start.init], and so is immune to any problems caused by the order
193
+ // of dynamic initialization. However, as of this writing Microsoft's
194
+ // Visual Studio does not provide a constexpr constructor for std::mutex.
195
+ // See
196
+ // https://blogs.msdn.microsoft.com/vcblog/2015/06/02/constexpr-complete-for-vs-2015-rtm-c11-compiler-c17-stl/
197
+ //
198
+ // Regarding destruction of instances in static storage, [basic.life] does
199
+ // say an object ends when storage in which the occupies is released, in
200
+ // the case of non-trivial destructor. However, std::mutex is not specified
201
+ // to have a trivial destructor.
202
+ //
203
+ // So, we would need a class with a constexpr default constructor and a
204
+ // trivial destructor. Today, we can achieve neither desired property using
205
+ // std::mutex directly.
206
+ template <typename T>
207
+ class SynchronizationStorage {
208
+ public:
209
+ // Instances allocated on the heap or on the stack should use the default
210
+ // constructor.
211
+ SynchronizationStorage()
212
+ : is_dynamic_(true), once_() {}
213
+
214
+ // Instances allocated in static storage (not on the heap, not on the
215
+ // stack) should use this constructor.
216
+ explicit SynchronizationStorage(base_internal::LinkerInitialized) {}
217
+
218
+ constexpr explicit SynchronizationStorage(absl::ConstInitType)
219
+ : is_dynamic_(false), once_(), space_{{0}} {}
220
+
221
+ SynchronizationStorage(SynchronizationStorage&) = delete;
222
+ SynchronizationStorage& operator=(SynchronizationStorage&) = delete;
223
+
224
+ ~SynchronizationStorage() {
225
+ if (is_dynamic_) {
226
+ get()->~T();
227
+ }
228
+ }
229
+
230
+ // Retrieve the object in storage. This is fast and thread safe, but does
231
+ // incur the cost of absl::call_once().
232
+ //
233
+ // For instances in static storage constructed with the
234
+ // LinkerInitialized constructor, may be called at any time without
235
+ // regard for order of dynamic initialization or destruction of objects
236
+ // in static storage. See the class comment for caveats.
237
+ T* get() {
238
+ absl::call_once(once_, SynchronizationStorage::Construct, this);
239
+ return reinterpret_cast<T*>(&space_);
240
+ }
241
+
242
+ private:
243
+ static void Construct(SynchronizationStorage<T>* self) {
244
+ new (&self->space_) T();
245
+ }
246
+
247
+ // When true, T's destructor is run when this is destructed.
248
+ //
249
+ // The LinkerInitialized constructor assumes this value will be set
250
+ // false by static initialization.
251
+ bool is_dynamic_;
252
+
253
+ absl::once_flag once_;
254
+
255
+ // An aligned space for the T.
256
+ alignas(T) unsigned char space_[sizeof(T)];
257
+ };
258
+
259
+ } // namespace synchronization_internal
260
+ ABSL_NAMESPACE_END
261
+ } // namespace absl