grpc 1.30.0 → 1.46.3

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 (2443) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1497 -18376
  3. data/etc/roots.pem +592 -899
  4. data/include/grpc/byte_buffer.h +1 -1
  5. data/include/grpc/byte_buffer_reader.h +1 -1
  6. data/include/grpc/compression.h +1 -1
  7. data/include/grpc/event_engine/README.md +38 -0
  8. data/include/grpc/event_engine/endpoint_config.h +43 -0
  9. data/include/grpc/event_engine/event_engine.h +399 -0
  10. data/include/grpc/event_engine/internal/memory_allocator_impl.h +68 -0
  11. data/include/grpc/event_engine/memory_allocator.h +226 -0
  12. data/include/grpc/event_engine/memory_request.h +57 -0
  13. data/include/grpc/event_engine/port.h +39 -0
  14. data/include/grpc/fork.h +1 -1
  15. data/include/grpc/grpc.h +90 -25
  16. data/include/grpc/grpc_posix.h +22 -18
  17. data/include/grpc/grpc_security.h +563 -315
  18. data/include/grpc/grpc_security_constants.h +20 -14
  19. data/include/grpc/impl/codegen/README.md +22 -0
  20. data/include/grpc/impl/codegen/atm.h +5 -3
  21. data/include/grpc/impl/codegen/atm_gcc_atomic.h +2 -0
  22. data/include/grpc/impl/codegen/atm_gcc_sync.h +2 -0
  23. data/include/grpc/impl/codegen/atm_windows.h +6 -0
  24. data/include/grpc/impl/codegen/byte_buffer.h +3 -1
  25. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -0
  26. data/include/grpc/impl/codegen/compression_types.h +2 -2
  27. data/include/grpc/impl/codegen/connectivity_state.h +2 -0
  28. data/include/grpc/impl/codegen/fork.h +2 -0
  29. data/include/grpc/impl/codegen/gpr_slice.h +2 -0
  30. data/include/grpc/impl/codegen/gpr_types.h +2 -0
  31. data/include/grpc/impl/codegen/grpc_types.h +84 -53
  32. data/include/grpc/impl/codegen/log.h +2 -2
  33. data/include/grpc/impl/codegen/port_platform.h +100 -97
  34. data/include/grpc/impl/codegen/propagation_bits.h +2 -0
  35. data/include/grpc/impl/codegen/slice.h +6 -1
  36. data/include/grpc/impl/codegen/status.h +2 -0
  37. data/include/grpc/impl/codegen/sync.h +8 -5
  38. data/include/grpc/impl/codegen/sync_abseil.h +2 -0
  39. data/include/grpc/impl/codegen/sync_custom.h +2 -0
  40. data/include/grpc/impl/codegen/sync_generic.h +3 -0
  41. data/include/grpc/impl/codegen/sync_posix.h +4 -2
  42. data/include/grpc/impl/codegen/sync_windows.h +6 -0
  43. data/include/grpc/module.modulemap +14 -14
  44. data/include/grpc/slice.h +1 -12
  45. data/include/grpc/slice_buffer.h +3 -3
  46. data/include/grpc/status.h +1 -1
  47. data/include/grpc/support/atm.h +1 -1
  48. data/include/grpc/support/atm_gcc_atomic.h +1 -1
  49. data/include/grpc/support/atm_gcc_sync.h +1 -1
  50. data/include/grpc/support/atm_windows.h +1 -1
  51. data/include/grpc/support/log.h +1 -1
  52. data/include/grpc/support/port_platform.h +1 -1
  53. data/include/grpc/support/sync.h +4 -4
  54. data/include/grpc/support/sync_abseil.h +1 -1
  55. data/include/grpc/support/sync_custom.h +1 -1
  56. data/include/grpc/support/sync_generic.h +1 -1
  57. data/include/grpc/support/sync_posix.h +1 -1
  58. data/include/grpc/support/sync_windows.h +1 -1
  59. data/include/grpc/support/time.h +9 -9
  60. data/src/core/ext/filters/census/grpc_context.cc +1 -0
  61. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +309 -0
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +122 -0
  63. data/src/core/ext/filters/channel_idle/idle_filter_state.cc +96 -0
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +66 -0
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +33 -35
  66. data/src/core/ext/filters/client_channel/backend_metric.h +4 -3
  67. data/src/core/ext/filters/client_channel/backup_poller.cc +20 -14
  68. data/src/core/ext/filters/client_channel/backup_poller.h +1 -0
  69. data/src/core/ext/filters/client_channel/channel_connectivity.cc +158 -202
  70. data/src/core/ext/filters/client_channel/client_channel.cc +2284 -3096
  71. data/src/core/ext/filters/client_channel/client_channel.h +566 -63
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +6 -5
  73. data/src/core/ext/filters/client_channel/client_channel_channelz.h +2 -5
  74. data/src/core/ext/filters/client_channel/client_channel_factory.cc +2 -1
  75. data/src/core/ext/filters/client_channel/client_channel_factory.h +18 -19
  76. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +19 -22
  77. data/src/core/ext/filters/client_channel/config_selector.cc +59 -0
  78. data/src/core/ext/filters/client_channel/config_selector.h +145 -0
  79. data/src/core/ext/filters/client_channel/connector.h +20 -20
  80. data/src/core/ext/filters/client_channel/dynamic_filters.cc +189 -0
  81. data/src/core/ext/filters/client_channel/dynamic_filters.h +99 -0
  82. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +27 -143
  83. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +16 -24
  84. data/src/core/ext/filters/client_channel/health/health_check_client.cc +129 -572
  85. data/src/core/ext/filters/client_channel/health/health_check_client.h +24 -158
  86. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +60 -62
  87. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +10 -2
  88. data/src/core/ext/filters/client_channel/http_proxy.cc +113 -117
  89. data/src/core/ext/filters/client_channel/http_proxy.h +17 -0
  90. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +52 -38
  91. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +12 -9
  92. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +16 -9
  93. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -1
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +12 -24
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +519 -388
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +3 -6
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -14
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -4
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +4 -3
  100. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -5
  101. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +20 -21
  102. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -4
  103. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -75
  104. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +307 -211
  105. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +804 -0
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +37 -0
  107. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2542 -0
  108. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +84 -84
  109. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +32 -49
  110. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +138 -96
  111. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +443 -156
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +52 -24
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +29 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +872 -0
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +710 -0
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +1215 -0
  117. data/src/core/ext/filters/client_channel/lb_policy.cc +23 -29
  118. data/src/core/ext/filters/client_channel/lb_policy.h +178 -142
  119. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -1
  120. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +13 -10
  121. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  122. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +27 -67
  123. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +10 -9
  124. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +133 -0
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +304 -339
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -42
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +31 -0
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +31 -24
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +58 -72
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +524 -230
  131. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +44 -26
  132. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +28 -0
  133. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -2
  134. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +98 -247
  135. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +60 -62
  136. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +10 -7
  137. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +400 -0
  138. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +201 -0
  139. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +106 -0
  140. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +71 -63
  141. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +983 -101
  142. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +28 -0
  143. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +57 -314
  144. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +40 -62
  145. data/src/core/ext/filters/client_channel/retry_filter.cc +2655 -0
  146. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  147. data/src/core/ext/filters/client_channel/retry_service_config.cc +314 -0
  148. data/src/core/ext/filters/client_channel/retry_service_config.h +102 -0
  149. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -60
  150. data/src/core/ext/filters/client_channel/retry_throttle.h +15 -7
  151. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +157 -0
  152. data/src/core/ext/filters/client_channel/subchannel.cc +284 -397
  153. data/src/core/ext/filters/client_channel/subchannel.h +116 -161
  154. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -5
  155. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +38 -9
  156. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +27 -12
  157. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +544 -0
  158. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +214 -0
  159. data/src/core/ext/filters/deadline/deadline_filter.cc +120 -114
  160. data/src/core/ext/filters/deadline/deadline_filter.h +9 -12
  161. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +258 -0
  162. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +62 -0
  163. data/src/core/ext/filters/fault_injection/service_config_parser.cc +179 -0
  164. data/src/core/ext/filters/fault_injection/service_config_parser.h +91 -0
  165. data/src/core/ext/filters/http/client/http_client_filter.cc +84 -539
  166. data/src/core/ext/filters/http/client/http_client_filter.h +21 -4
  167. data/src/core/ext/filters/http/client_authority_filter.cc +39 -103
  168. data/src/core/ext/filters/http/client_authority_filter.h +24 -5
  169. data/src/core/ext/filters/http/http_filters_plugin.cc +55 -69
  170. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +67 -157
  171. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +103 -75
  172. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +3 -1
  173. data/src/core/ext/filters/http/server/http_server_filter.cc +89 -295
  174. data/src/core/ext/filters/message_size/message_size_filter.cc +101 -130
  175. data/src/core/ext/filters/message_size/message_size_filter.h +17 -3
  176. data/src/core/ext/filters/rbac/rbac_filter.cc +162 -0
  177. data/src/core/ext/filters/rbac/rbac_filter.h +76 -0
  178. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +606 -0
  179. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +75 -0
  180. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +61 -0
  181. data/src/core/ext/filters/server_config_selector/server_config_selector.h +71 -0
  182. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +143 -0
  183. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  184. data/src/core/ext/transport/chttp2/alpn/alpn.cc +2 -1
  185. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +335 -46
  186. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +22 -5
  187. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1005 -355
  188. data/src/core/ext/transport/chttp2/server/chttp2_server.h +16 -2
  189. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +11 -9
  190. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  191. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  192. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +807 -778
  193. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +24 -5
  194. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -6
  195. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -6
  196. data/src/core/ext/transport/chttp2/transport/flow_control.cc +89 -67
  197. data/src/core/ext/transport/chttp2/transport/flow_control.h +52 -38
  198. data/src/core/ext/transport/chttp2/transport/frame_data.cc +30 -30
  199. data/src/core/ext/transport/chttp2/transport/frame_data.h +11 -10
  200. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +25 -25
  201. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +7 -6
  202. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +19 -20
  203. data/src/core/ext/transport/chttp2/transport/frame_ping.h +8 -6
  204. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +23 -22
  205. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +7 -6
  206. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +55 -22
  207. data/src/core/ext/transport/chttp2/transport/frame_settings.h +9 -7
  208. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +25 -25
  209. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +5 -6
  210. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +41 -0
  211. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +516 -749
  212. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +183 -71
  213. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +86 -0
  214. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +71 -0
  215. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +814 -1196
  216. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +101 -83
  217. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +239 -0
  218. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +115 -0
  219. data/src/core/ext/transport/chttp2/transport/internal.h +79 -78
  220. data/src/core/ext/transport/chttp2/transport/parsing.cc +177 -327
  221. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +2 -2
  222. data/src/core/ext/transport/chttp2/transport/varint.cc +13 -7
  223. data/src/core/ext/transport/chttp2/transport/varint.h +39 -28
  224. data/src/core/ext/transport/chttp2/transport/writing.cc +145 -190
  225. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  226. data/src/core/ext/transport/inproc/inproc_transport.cc +262 -237
  227. data/src/core/ext/transport/inproc/inproc_transport.h +1 -4
  228. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +117 -0
  229. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +482 -0
  230. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +121 -0
  231. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +553 -0
  232. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +444 -0
  233. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2156 -0
  234. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +56 -0
  235. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +151 -0
  236. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +62 -0
  237. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +160 -0
  238. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +46 -0
  239. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +124 -0
  240. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +43 -0
  241. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +102 -0
  242. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +43 -0
  243. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +97 -0
  244. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +106 -0
  245. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +605 -0
  246. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +48 -0
  247. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +103 -0
  248. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +44 -1
  249. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +53 -2
  250. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +31 -5
  251. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +59 -14
  252. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +270 -0
  253. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +1240 -0
  254. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +411 -0
  255. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2161 -0
  256. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +95 -0
  257. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +382 -0
  258. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +543 -0
  259. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2961 -0
  260. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +48 -0
  261. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +103 -0
  262. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +89 -0
  263. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +545 -0
  264. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +299 -0
  265. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +1381 -0
  266. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +145 -0
  267. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +636 -0
  268. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +49 -0
  269. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +116 -0
  270. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +419 -0
  271. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +1783 -0
  272. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +163 -0
  273. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +778 -0
  274. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +47 -0
  275. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +100 -0
  276. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +47 -0
  277. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +103 -0
  278. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +58 -0
  279. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +151 -0
  280. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +269 -0
  281. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +1277 -0
  282. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +220 -0
  283. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +1219 -0
  284. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +49 -0
  285. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +122 -0
  286. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +322 -0
  287. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +1686 -0
  288. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +40 -0
  289. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +84 -0
  290. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +60 -0
  291. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +169 -0
  292. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +47 -0
  293. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +144 -0
  294. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +56 -0
  295. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +178 -0
  296. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +48 -0
  297. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +118 -0
  298. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +106 -0
  299. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +348 -0
  300. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +144 -0
  301. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +623 -0
  302. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +129 -0
  303. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +568 -0
  304. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +46 -0
  305. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +94 -0
  306. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +165 -0
  307. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +886 -0
  308. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +186 -0
  309. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +941 -0
  310. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +63 -0
  311. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +234 -0
  312. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +56 -0
  313. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +154 -0
  314. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +53 -0
  315. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +136 -0
  316. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +165 -0
  317. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +716 -0
  318. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +174 -0
  319. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +721 -0
  320. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +209 -0
  321. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +1008 -0
  322. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +101 -0
  323. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +443 -0
  324. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +1051 -0
  325. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +5956 -0
  326. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +79 -0
  327. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +255 -0
  328. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +222 -0
  329. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +1052 -0
  330. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +44 -0
  331. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +88 -0
  332. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +49 -0
  333. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +103 -0
  334. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +63 -0
  335. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +167 -0
  336. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +52 -0
  337. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +134 -0
  338. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +63 -0
  339. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +250 -0
  340. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +47 -0
  341. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +94 -0
  342. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +69 -0
  343. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +213 -0
  344. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +32 -0
  345. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +42 -0
  346. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +71 -0
  347. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +218 -0
  348. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +54 -0
  349. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +146 -0
  350. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +42 -0
  351. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +85 -0
  352. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +96 -0
  353. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +375 -0
  354. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +94 -0
  355. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +433 -0
  356. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +64 -0
  357. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +183 -0
  358. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +55 -0
  359. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +168 -0
  360. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +463 -0
  361. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2606 -0
  362. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +28 -0
  363. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +38 -0
  364. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +175 -0
  365. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +880 -0
  366. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +88 -0
  367. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +308 -0
  368. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +191 -0
  369. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +1035 -0
  370. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +62 -0
  371. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +160 -0
  372. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +38 -0
  373. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +70 -0
  374. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +165 -0
  375. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +755 -0
  376. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +68 -0
  377. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +210 -0
  378. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +138 -0
  379. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +631 -0
  380. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +48 -0
  381. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +112 -0
  382. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +76 -0
  383. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +249 -0
  384. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +74 -0
  385. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +214 -0
  386. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +62 -0
  387. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +188 -0
  388. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +49 -0
  389. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +117 -0
  390. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +48 -0
  391. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +113 -0
  392. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +47 -0
  393. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +100 -0
  394. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +80 -0
  395. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +234 -0
  396. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +67 -0
  397. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +218 -0
  398. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +60 -0
  399. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +170 -0
  400. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +78 -0
  401. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +294 -0
  402. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +107 -0
  403. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +429 -0
  404. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +107 -0
  405. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +419 -0
  406. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +66 -0
  407. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +201 -0
  408. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +26 -0
  409. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +39 -0
  410. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +42 -0
  411. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +139 -0
  412. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +54 -0
  413. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +139 -0
  414. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +66 -0
  415. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +196 -0
  416. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.c +26 -0
  417. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_unit.upb.h +41 -0
  418. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +43 -0
  419. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +97 -0
  420. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +51 -0
  421. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +127 -0
  422. data/src/core/ext/upb-generated/google/api/annotations.upb.c +23 -1
  423. data/src/core/ext/upb-generated/google/api/annotations.upb.h +25 -2
  424. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +271 -0
  425. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +1236 -0
  426. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +283 -0
  427. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +1338 -0
  428. data/src/core/ext/upb-generated/google/api/http.upb.c +44 -29
  429. data/src/core/ext/upb-generated/google/api/http.upb.h +241 -100
  430. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +46 -0
  431. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +111 -0
  432. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +19 -6
  433. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +48 -18
  434. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +374 -283
  435. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2368 -969
  436. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +19 -6
  437. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +46 -16
  438. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +16 -3
  439. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +31 -11
  440. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +48 -32
  441. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +203 -101
  442. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +19 -6
  443. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +46 -16
  444. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +58 -37
  445. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +313 -112
  446. data/src/core/ext/upb-generated/google/rpc/status.upb.c +22 -9
  447. data/src/core/ext/upb-generated/google/rpc/status.upb.h +63 -26
  448. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +84 -0
  449. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +319 -0
  450. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +33 -19
  451. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +118 -60
  452. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +136 -108
  453. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +777 -337
  454. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +28 -13
  455. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +99 -34
  456. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +23 -9
  457. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +74 -27
  458. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +82 -62
  459. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +460 -184
  460. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +70 -0
  461. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +208 -0
  462. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  463. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  464. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +76 -14
  465. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +217 -43
  466. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +55 -0
  467. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +108 -0
  468. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +22 -1
  469. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +18 -2
  470. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +32 -6
  471. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +66 -16
  472. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +53 -0
  473. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +99 -0
  474. data/src/core/ext/upb-generated/validate/validate.upb.c +407 -295
  475. data/src/core/ext/upb-generated/validate/validate.upb.h +3024 -1084
  476. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +110 -0
  477. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +278 -0
  478. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +55 -0
  479. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +108 -0
  480. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +38 -0
  481. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +46 -0
  482. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +105 -0
  483. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +290 -0
  484. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +53 -0
  485. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +99 -0
  486. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +41 -0
  487. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +79 -0
  488. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +66 -0
  489. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +200 -0
  490. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +56 -0
  491. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +115 -0
  492. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +46 -0
  493. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +103 -0
  494. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +49 -0
  495. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +127 -0
  496. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +68 -0
  497. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +240 -0
  498. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +49 -0
  499. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +121 -0
  500. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +73 -0
  501. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +187 -0
  502. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +207 -0
  503. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +878 -0
  504. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +52 -0
  505. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +143 -0
  506. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +65 -0
  507. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +218 -0
  508. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +46 -0
  509. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +103 -0
  510. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.c +84 -0
  511. data/src/core/ext/upbdefs-generated/envoy/admin/v3/certs.upbdefs.h +55 -0
  512. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.c +127 -0
  513. data/src/core/ext/upbdefs-generated/envoy/admin/v3/clusters.upbdefs.h +50 -0
  514. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +309 -0
  515. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +140 -0
  516. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.c +43 -0
  517. data/src/core/ext/upbdefs-generated/envoy/admin/v3/init_dump.upbdefs.h +40 -0
  518. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +53 -0
  519. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.h +40 -0
  520. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.c +49 -0
  521. data/src/core/ext/upbdefs-generated/envoy/admin/v3/memory.upbdefs.h +35 -0
  522. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.c +46 -0
  523. data/src/core/ext/upbdefs-generated/envoy/admin/v3/metrics.upbdefs.h +35 -0
  524. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.c +46 -0
  525. data/src/core/ext/upbdefs-generated/envoy/admin/v3/mutex_stats.upbdefs.h +35 -0
  526. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.c +142 -0
  527. data/src/core/ext/upbdefs-generated/envoy/admin/v3/server_info.upbdefs.h +40 -0
  528. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.c +51 -0
  529. data/src/core/ext/upbdefs-generated/envoy/admin/v3/tap.upbdefs.h +35 -0
  530. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +48 -0
  531. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.h +30 -0
  532. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +38 -0
  533. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.h +35 -0
  534. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +222 -0
  535. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.h +105 -0
  536. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +393 -0
  537. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +120 -0
  538. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +98 -0
  539. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.h +45 -0
  540. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +557 -0
  541. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +155 -0
  542. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +51 -0
  543. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.h +35 -0
  544. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +138 -0
  545. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.h +35 -0
  546. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.c +206 -0
  547. data/src/core/ext/upbdefs-generated/envoy/config/common/matcher/v3/matcher.upbdefs.h +105 -0
  548. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +112 -0
  549. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.h +65 -0
  550. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +54 -0
  551. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.h +35 -0
  552. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +267 -0
  553. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +150 -0
  554. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +168 -0
  555. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +65 -0
  556. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +53 -0
  557. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.h +35 -0
  558. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +47 -0
  559. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +35 -0
  560. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.c +53 -0
  561. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_method_list.upbdefs.h +40 -0
  562. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +235 -0
  563. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.h +100 -0
  564. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +228 -0
  565. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +75 -0
  566. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +53 -0
  567. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.h +35 -0
  568. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +298 -0
  569. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +110 -0
  570. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +41 -0
  571. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.h +35 -0
  572. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +55 -0
  573. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +40 -0
  574. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +57 -0
  575. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.h +35 -0
  576. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +70 -0
  577. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.h +35 -0
  578. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +49 -0
  579. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +35 -0
  580. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +99 -0
  581. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.h +50 -0
  582. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +128 -0
  583. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +60 -0
  584. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +136 -0
  585. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.h +55 -0
  586. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +48 -0
  587. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.h +35 -0
  588. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +197 -0
  589. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +60 -0
  590. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +190 -0
  591. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.h +65 -0
  592. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +88 -0
  593. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +35 -0
  594. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +63 -0
  595. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.h +40 -0
  596. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.c +69 -0
  597. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/metrics_service.upbdefs.h +35 -0
  598. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +125 -0
  599. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.h +70 -0
  600. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +134 -0
  601. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.h +75 -0
  602. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +190 -0
  603. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  604. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +115 -0
  605. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +45 -0
  606. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +896 -0
  607. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +295 -0
  608. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +77 -0
  609. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.h +45 -0
  610. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +188 -0
  611. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +85 -0
  612. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.c +54 -0
  613. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/datadog.upbdefs.h +35 -0
  614. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.c +57 -0
  615. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/dynamic_ot.upbdefs.h +35 -0
  616. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +57 -0
  617. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.h +40 -0
  618. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.c +72 -0
  619. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/lightstep.upbdefs.h +35 -0
  620. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.c +99 -0
  621. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opencensus.upbdefs.h +35 -0
  622. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.c +52 -0
  623. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/service.upbdefs.h +35 -0
  624. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.c +71 -0
  625. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/skywalking.upbdefs.h +40 -0
  626. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +57 -0
  627. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.h +30 -0
  628. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.c +75 -0
  629. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/xray.upbdefs.h +40 -0
  630. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.c +77 -0
  631. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/zipkin.upbdefs.h +35 -0
  632. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +50 -0
  633. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +35 -0
  634. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +92 -0
  635. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.h +55 -0
  636. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +117 -0
  637. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.h +45 -0
  638. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +59 -0
  639. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  640. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +78 -0
  641. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.h +35 -0
  642. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +551 -0
  643. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +130 -0
  644. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +48 -0
  645. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.h +30 -0
  646. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +210 -0
  647. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.h +65 -0
  648. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +91 -0
  649. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +45 -0
  650. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +254 -0
  651. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +65 -0
  652. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.c +58 -0
  653. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upbdefs.h +40 -0
  654. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +58 -0
  655. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.h +35 -0
  656. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +128 -0
  657. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +65 -0
  658. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +76 -0
  659. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.h +40 -0
  660. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +153 -0
  661. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +55 -0
  662. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.c +46 -0
  663. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/cookie.upbdefs.h +35 -0
  664. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +56 -0
  665. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +50 -0
  666. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.c +52 -0
  667. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/http_inputs.upbdefs.h +50 -0
  668. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +61 -0
  669. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.h +40 -0
  670. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +54 -0
  671. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.h +35 -0
  672. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +52 -0
  673. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.h +35 -0
  674. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +51 -0
  675. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.h +35 -0
  676. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +70 -0
  677. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.h +45 -0
  678. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +65 -0
  679. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.h +40 -0
  680. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +58 -0
  681. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.h +40 -0
  682. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +75 -0
  683. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.h +45 -0
  684. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +78 -0
  685. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.h +65 -0
  686. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +85 -0
  687. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.h +55 -0
  688. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.c +53 -0
  689. data/src/core/ext/upbdefs-generated/envoy/type/v3/hash_policy.upbdefs.h +45 -0
  690. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +36 -0
  691. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.h +30 -0
  692. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.c +94 -0
  693. data/src/core/ext/upbdefs-generated/envoy/type/v3/http_status.upbdefs.h +35 -0
  694. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +54 -0
  695. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.h +40 -0
  696. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +48 -0
  697. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.h +45 -0
  698. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.c +38 -0
  699. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_unit.upbdefs.h +30 -0
  700. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +44 -0
  701. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.h +35 -0
  702. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.c +57 -0
  703. data/src/core/ext/upbdefs-generated/envoy/type/v3/token_bucket.upbdefs.h +35 -0
  704. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +40 -0
  705. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.h +30 -0
  706. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  707. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  708. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  709. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  710. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +52 -0
  711. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.h +45 -0
  712. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.c +39 -0
  713. data/src/core/ext/upbdefs-generated/google/api/httpbody.upbdefs.h +35 -0
  714. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +34 -0
  715. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.h +35 -0
  716. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +329 -0
  717. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.h +165 -0
  718. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +35 -0
  719. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.h +35 -0
  720. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +32 -0
  721. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.h +35 -0
  722. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +54 -0
  723. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.h +50 -0
  724. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +35 -0
  725. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.h +35 -0
  726. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +45 -0
  727. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.h +75 -0
  728. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +37 -0
  729. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.h +35 -0
  730. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.c +67 -0
  731. data/src/core/ext/upbdefs-generated/opencensus/proto/trace/v1/trace_config.upbdefs.h +50 -0
  732. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  733. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  734. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +62 -0
  735. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.h +45 -0
  736. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +47 -0
  737. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.h +35 -0
  738. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +34 -0
  739. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.h +30 -0
  740. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +46 -0
  741. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.h +35 -0
  742. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +39 -0
  743. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.h +35 -0
  744. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +283 -0
  745. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.h +145 -0
  746. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.c +63 -0
  747. data/src/core/ext/upbdefs-generated/xds/annotations/v3/migrate.upbdefs.h +45 -0
  748. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.c +47 -0
  749. data/src/core/ext/upbdefs-generated/xds/annotations/v3/security.upbdefs.h +35 -0
  750. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.c +35 -0
  751. data/src/core/ext/upbdefs-generated/xds/annotations/v3/sensitive.upbdefs.h +30 -0
  752. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +64 -0
  753. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  754. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.c +40 -0
  755. data/src/core/ext/upbdefs-generated/xds/annotations/v3/versioning.upbdefs.h +35 -0
  756. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +38 -0
  757. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.h +35 -0
  758. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +56 -0
  759. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.h +40 -0
  760. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +39 -0
  761. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.h +40 -0
  762. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.c +41 -0
  763. data/src/core/ext/upbdefs-generated/xds/core/v3/extension.upbdefs.h +35 -0
  764. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +45 -0
  765. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.h +35 -0
  766. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +61 -0
  767. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.h +40 -0
  768. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +46 -0
  769. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.h +35 -0
  770. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +126 -0
  771. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.h +80 -0
  772. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.c +40 -0
  773. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/regex.upbdefs.h +40 -0
  774. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.c +52 -0
  775. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/string.upbdefs.h +40 -0
  776. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +40 -0
  777. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  778. data/src/core/ext/xds/certificate_provider_factory.h +61 -0
  779. data/src/core/ext/xds/certificate_provider_registry.cc +103 -0
  780. data/src/core/ext/xds/certificate_provider_registry.h +57 -0
  781. data/src/core/ext/xds/certificate_provider_store.cc +95 -0
  782. data/src/core/ext/xds/certificate_provider_store.h +121 -0
  783. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +144 -0
  784. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +69 -0
  785. data/src/core/ext/xds/upb_utils.h +67 -0
  786. data/src/core/ext/xds/xds_api.cc +730 -0
  787. data/src/core/ext/xds/xds_api.h +191 -0
  788. data/src/core/ext/xds/xds_bootstrap.cc +570 -0
  789. data/src/core/ext/xds/xds_bootstrap.h +143 -0
  790. data/src/core/ext/xds/xds_certificate_provider.cc +407 -0
  791. data/src/core/ext/xds/xds_certificate_provider.h +159 -0
  792. data/src/core/ext/xds/xds_channel_args.h +32 -0
  793. data/src/core/ext/xds/xds_channel_stack_modifier.cc +109 -0
  794. data/src/core/ext/xds/xds_channel_stack_modifier.h +53 -0
  795. data/src/core/ext/xds/xds_client.cc +2512 -0
  796. data/src/core/ext/xds/xds_client.h +348 -0
  797. data/src/core/ext/xds/xds_client_stats.cc +160 -0
  798. data/src/core/ext/xds/xds_client_stats.h +241 -0
  799. data/src/core/ext/xds/xds_cluster.cc +453 -0
  800. data/src/core/ext/xds/xds_cluster.h +108 -0
  801. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  802. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  803. data/src/core/ext/xds/xds_common_types.cc +388 -0
  804. data/src/core/ext/xds/xds_common_types.h +95 -0
  805. data/src/core/ext/xds/xds_endpoint.cc +371 -0
  806. data/src/core/ext/xds/xds_endpoint.h +135 -0
  807. data/src/core/ext/xds/xds_http_fault_filter.cc +227 -0
  808. data/src/core/ext/xds/xds_http_fault_filter.h +64 -0
  809. data/src/core/ext/xds/xds_http_filters.cc +122 -0
  810. data/src/core/ext/xds/xds_http_filters.h +133 -0
  811. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  812. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  813. data/src/core/ext/xds/xds_listener.cc +1039 -0
  814. data/src/core/ext/xds/xds_listener.h +220 -0
  815. data/src/core/ext/xds/xds_resource_type.cc +33 -0
  816. data/src/core/ext/xds/xds_resource_type.h +98 -0
  817. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  818. data/src/core/ext/xds/xds_route_config.cc +1122 -0
  819. data/src/core/ext/xds/xds_route_config.h +218 -0
  820. data/src/core/ext/xds/xds_routing.cc +250 -0
  821. data/src/core/ext/xds/xds_routing.h +101 -0
  822. data/src/core/ext/xds/xds_server_config_fetcher.cc +1314 -0
  823. data/src/core/lib/address_utils/parse_address.cc +340 -0
  824. data/src/core/lib/address_utils/parse_address.h +82 -0
  825. data/src/core/lib/address_utils/sockaddr_utils.cc +409 -0
  826. data/src/core/lib/address_utils/sockaddr_utils.h +95 -0
  827. data/src/core/lib/avl/avl.h +452 -88
  828. data/src/core/lib/backoff/backoff.cc +9 -38
  829. data/src/core/lib/backoff/backoff.h +11 -11
  830. data/src/core/lib/channel/call_finalization.h +86 -0
  831. data/src/core/lib/channel/call_tracer.h +88 -0
  832. data/src/core/lib/channel/channel_args.cc +182 -24
  833. data/src/core/lib/channel/channel_args.h +214 -2
  834. data/src/core/lib/channel/channel_args_preconditioning.cc +42 -0
  835. data/src/core/lib/channel/channel_args_preconditioning.h +61 -0
  836. data/src/core/lib/channel/channel_stack.cc +37 -15
  837. data/src/core/lib/channel/channel_stack.h +57 -16
  838. data/src/core/lib/channel/channel_stack_builder.cc +24 -283
  839. data/src/core/lib/channel/channel_stack_builder.h +118 -157
  840. data/src/core/lib/channel/channel_stack_builder_impl.cc +102 -0
  841. data/src/core/lib/channel/channel_stack_builder_impl.h +48 -0
  842. data/src/core/lib/channel/channel_trace.cc +14 -18
  843. data/src/core/lib/channel/channel_trace.h +3 -2
  844. data/src/core/lib/channel/channelz.cc +191 -137
  845. data/src/core/lib/channel/channelz.h +76 -53
  846. data/src/core/lib/channel/channelz_registry.cc +37 -19
  847. data/src/core/lib/channel/channelz_registry.h +4 -2
  848. data/src/core/lib/channel/connected_channel.cc +14 -10
  849. data/src/core/lib/channel/connected_channel.h +2 -2
  850. data/src/core/lib/channel/context.h +14 -0
  851. data/src/core/lib/channel/handshaker.cc +14 -54
  852. data/src/core/lib/channel/handshaker.h +10 -28
  853. data/src/core/lib/channel/handshaker_factory.h +10 -2
  854. data/src/core/lib/channel/handshaker_registry.cc +15 -70
  855. data/src/core/lib/channel/handshaker_registry.h +29 -12
  856. data/src/core/lib/channel/promise_based_filter.cc +1002 -0
  857. data/src/core/lib/channel/promise_based_filter.h +437 -0
  858. data/src/core/lib/channel/status_util.cc +12 -2
  859. data/src/core/lib/channel/status_util.h +11 -2
  860. data/src/core/lib/compression/compression.cc +22 -110
  861. data/src/core/lib/compression/compression_internal.cc +139 -202
  862. data/src/core/lib/compression/compression_internal.h +67 -71
  863. data/src/core/lib/compression/message_compress.cc +13 -13
  864. data/src/core/lib/compression/message_compress.h +2 -2
  865. data/src/core/lib/config/core_configuration.cc +104 -0
  866. data/src/core/lib/config/core_configuration.h +196 -0
  867. data/src/core/lib/debug/stats.cc +1 -1
  868. data/src/core/lib/debug/stats.h +4 -3
  869. data/src/core/lib/debug/stats_data.cc +17 -19
  870. data/src/core/lib/debug/stats_data.h +6 -8
  871. data/src/core/lib/debug/trace.cc +1 -0
  872. data/src/core/lib/debug/trace.h +4 -3
  873. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +46 -0
  874. data/src/core/lib/event_engine/channel_args_endpoint_config.h +42 -0
  875. data/src/core/lib/event_engine/default_event_engine_factory.cc +27 -0
  876. data/src/core/lib/event_engine/event_engine.cc +52 -0
  877. data/src/core/lib/event_engine/event_engine_factory.h +36 -0
  878. data/src/core/lib/event_engine/memory_allocator.cc +66 -0
  879. data/src/core/lib/event_engine/resolved_address.cc +39 -0
  880. data/src/core/lib/event_engine/sockaddr.cc +40 -0
  881. data/src/core/lib/event_engine/sockaddr.h +44 -0
  882. data/src/core/lib/gpr/alloc.cc +7 -5
  883. data/src/core/lib/gpr/atm.cc +1 -1
  884. data/src/core/lib/gpr/cpu_iphone.cc +10 -2
  885. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  886. data/src/core/lib/gpr/env_linux.cc +1 -2
  887. data/src/core/lib/gpr/env_posix.cc +2 -3
  888. data/src/core/lib/gpr/log.cc +61 -19
  889. data/src/core/lib/gpr/log_android.cc +3 -2
  890. data/src/core/lib/gpr/log_linux.cc +30 -13
  891. data/src/core/lib/gpr/log_posix.cc +25 -10
  892. data/src/core/lib/gpr/log_windows.cc +18 -4
  893. data/src/core/lib/gpr/murmur_hash.cc +5 -3
  894. data/src/core/lib/gpr/spinlock.h +10 -2
  895. data/src/core/lib/gpr/string.cc +35 -33
  896. data/src/core/lib/gpr/string.h +11 -10
  897. data/src/core/lib/gpr/sync.cc +6 -6
  898. data/src/core/lib/gpr/sync_abseil.cc +10 -12
  899. data/src/core/lib/gpr/sync_posix.cc +6 -11
  900. data/src/core/lib/gpr/sync_windows.cc +2 -2
  901. data/src/core/lib/gpr/time.cc +17 -15
  902. data/src/core/lib/gpr/time_precise.cc +5 -2
  903. data/src/core/lib/gpr/time_precise.h +6 -2
  904. data/src/core/lib/gpr/time_windows.cc +3 -2
  905. data/src/core/lib/gpr/tls.h +126 -36
  906. data/src/core/lib/gpr/tmpfile_posix.cc +1 -2
  907. data/src/core/lib/gpr/useful.h +97 -31
  908. data/src/core/lib/gpr/wrap_memcpy.cc +2 -1
  909. data/src/core/lib/gprpp/atomic_utils.h +47 -0
  910. data/src/core/lib/gprpp/bitset.h +207 -0
  911. data/src/core/lib/gprpp/capture.h +76 -0
  912. data/src/core/lib/gprpp/chunked_vector.h +253 -0
  913. data/src/core/lib/gprpp/construct_destruct.h +39 -0
  914. data/src/core/lib/gprpp/cpp_impl_of.h +49 -0
  915. data/src/core/lib/gprpp/debug_location.h +2 -0
  916. data/src/core/lib/gprpp/dual_ref_counted.h +330 -0
  917. data/src/core/lib/gprpp/examine_stack.cc +43 -0
  918. data/src/core/lib/gprpp/examine_stack.h +46 -0
  919. data/src/core/lib/gprpp/fork.cc +16 -14
  920. data/src/core/lib/gprpp/fork.h +4 -4
  921. data/src/core/lib/gprpp/global_config.h +1 -2
  922. data/src/core/lib/gprpp/global_config_env.cc +18 -16
  923. data/src/core/lib/gprpp/global_config_env.h +2 -2
  924. data/src/core/lib/gprpp/global_config_generic.h +2 -2
  925. data/src/core/lib/gprpp/manual_constructor.h +12 -10
  926. data/src/core/lib/gprpp/match.h +73 -0
  927. data/src/core/lib/gprpp/memory.h +9 -3
  928. data/src/core/lib/gprpp/mpscq.cc +9 -9
  929. data/src/core/lib/gprpp/mpscq.h +6 -5
  930. data/src/core/lib/gprpp/orphanable.h +11 -15
  931. data/src/core/lib/gprpp/overload.h +59 -0
  932. data/src/core/lib/gprpp/ref_counted.h +125 -86
  933. data/src/core/lib/gprpp/ref_counted_ptr.h +166 -7
  934. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  935. data/src/core/lib/gprpp/stat.h +38 -0
  936. data/src/core/lib/gprpp/stat_posix.cc +49 -0
  937. data/src/core/lib/gprpp/stat_windows.cc +48 -0
  938. data/src/core/lib/gprpp/status_helper.cc +435 -0
  939. data/src/core/lib/gprpp/status_helper.h +181 -0
  940. data/src/core/lib/gprpp/sync.h +106 -43
  941. data/src/core/lib/gprpp/table.h +434 -0
  942. data/src/core/lib/gprpp/thd.h +3 -3
  943. data/src/core/lib/gprpp/thd_posix.cc +47 -42
  944. data/src/core/lib/gprpp/thd_windows.cc +7 -12
  945. data/src/core/lib/gprpp/time.cc +198 -0
  946. data/src/core/lib/gprpp/time.h +292 -0
  947. data/src/core/lib/gprpp/time_util.cc +77 -0
  948. data/src/core/lib/gprpp/time_util.h +42 -0
  949. data/src/core/lib/http/format_request.cc +29 -25
  950. data/src/core/lib/http/format_request.h +8 -6
  951. data/src/core/lib/http/httpcli.cc +304 -211
  952. data/src/core/lib/http/httpcli.h +183 -86
  953. data/src/core/lib/http/httpcli_security_connector.cc +75 -85
  954. data/src/core/lib/http/httpcli_ssl_credentials.h +37 -0
  955. data/src/core/lib/http/parser.cc +145 -54
  956. data/src/core/lib/http/parser.h +20 -6
  957. data/src/core/lib/iomgr/buffer_list.cc +16 -17
  958. data/src/core/lib/iomgr/buffer_list.h +23 -25
  959. data/src/core/lib/iomgr/call_combiner.cc +60 -25
  960. data/src/core/lib/iomgr/call_combiner.h +12 -14
  961. data/src/core/lib/iomgr/cfstream_handle.cc +7 -6
  962. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  963. data/src/core/lib/iomgr/closure.h +33 -12
  964. data/src/core/lib/iomgr/combiner.cc +48 -37
  965. data/src/core/lib/iomgr/combiner.h +3 -2
  966. data/src/core/lib/iomgr/dualstack_socket_posix.cc +1 -0
  967. data/src/core/lib/iomgr/endpoint.cc +6 -6
  968. data/src/core/lib/iomgr/endpoint.h +10 -9
  969. data/src/core/lib/iomgr/endpoint_cfstream.cc +56 -60
  970. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  971. data/src/core/lib/iomgr/endpoint_pair.h +1 -0
  972. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +32 -0
  973. data/src/core/lib/iomgr/endpoint_pair_posix.cc +19 -17
  974. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -6
  975. data/src/core/lib/iomgr/error.cc +287 -111
  976. data/src/core/lib/iomgr/error.h +278 -114
  977. data/src/core/lib/iomgr/error_cfstream.cc +17 -10
  978. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  979. data/src/core/lib/iomgr/error_internal.h +7 -2
  980. data/src/core/lib/iomgr/ev_apple.cc +19 -15
  981. data/src/core/lib/iomgr/ev_apple.h +1 -1
  982. data/src/core/lib/iomgr/ev_epoll1_linux.cc +64 -64
  983. data/src/core/lib/iomgr/ev_poll_posix.cc +82 -79
  984. data/src/core/lib/iomgr/ev_posix.cc +21 -22
  985. data/src/core/lib/iomgr/ev_posix.h +9 -9
  986. data/src/core/lib/iomgr/event_engine/closure.cc +77 -0
  987. data/src/core/lib/iomgr/event_engine/closure.h +42 -0
  988. data/src/core/lib/iomgr/event_engine/endpoint.cc +172 -0
  989. data/src/core/lib/iomgr/event_engine/endpoint.h +52 -0
  990. data/src/core/lib/iomgr/event_engine/iomgr.cc +85 -0
  991. data/src/core/lib/iomgr/event_engine/pollset.cc +87 -0
  992. data/src/core/lib/iomgr/event_engine/pollset.h +25 -0
  993. data/src/core/lib/iomgr/event_engine/promise.h +51 -0
  994. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +47 -0
  995. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +37 -0
  996. data/src/core/lib/iomgr/event_engine/resolver.cc +133 -0
  997. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  998. data/src/core/lib/iomgr/event_engine/tcp.cc +296 -0
  999. data/src/core/lib/iomgr/event_engine/timer.cc +62 -0
  1000. data/src/core/lib/iomgr/exec_ctx.cc +30 -99
  1001. data/src/core/lib/iomgr/exec_ctx.h +42 -63
  1002. data/src/core/lib/iomgr/executor/mpmcqueue.cc +15 -16
  1003. data/src/core/lib/iomgr/executor/mpmcqueue.h +11 -15
  1004. data/src/core/lib/iomgr/executor/threadpool.cc +4 -5
  1005. data/src/core/lib/iomgr/executor/threadpool.h +8 -7
  1006. data/src/core/lib/iomgr/executor.cc +37 -45
  1007. data/src/core/lib/iomgr/executor.h +4 -4
  1008. data/src/core/lib/iomgr/fork_posix.cc +2 -1
  1009. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +2 -2
  1010. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +2 -2
  1011. data/src/core/lib/iomgr/internal_errqueue.cc +3 -2
  1012. data/src/core/lib/iomgr/iocp_windows.cc +10 -9
  1013. data/src/core/lib/iomgr/iocp_windows.h +1 -1
  1014. data/src/core/lib/iomgr/iomgr.cc +6 -4
  1015. data/src/core/lib/iomgr/iomgr.h +3 -3
  1016. data/src/core/lib/iomgr/iomgr_internal.cc +8 -12
  1017. data/src/core/lib/iomgr/iomgr_internal.h +6 -5
  1018. data/src/core/lib/iomgr/iomgr_posix.cc +5 -4
  1019. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +44 -15
  1020. data/src/core/lib/iomgr/iomgr_windows.cc +4 -5
  1021. data/src/core/lib/iomgr/load_file.cc +6 -6
  1022. data/src/core/lib/iomgr/load_file.h +2 -2
  1023. data/src/core/lib/iomgr/lockfree_event.cc +38 -15
  1024. data/src/core/lib/iomgr/lockfree_event.h +2 -2
  1025. data/src/core/lib/iomgr/polling_entity.cc +2 -2
  1026. data/src/core/lib/iomgr/polling_entity.h +6 -0
  1027. data/src/core/lib/iomgr/pollset.cc +5 -5
  1028. data/src/core/lib/iomgr/pollset.h +9 -9
  1029. data/src/core/lib/iomgr/pollset_set_windows.cc +1 -0
  1030. data/src/core/lib/iomgr/pollset_windows.cc +6 -6
  1031. data/src/core/lib/iomgr/port.h +9 -37
  1032. data/src/core/lib/iomgr/python_util.h +6 -5
  1033. data/src/core/lib/iomgr/resolve_address.cc +10 -24
  1034. data/src/core/lib/iomgr/resolve_address.h +48 -43
  1035. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  1036. data/src/core/lib/iomgr/resolve_address_posix.cc +91 -83
  1037. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  1038. data/src/core/lib/iomgr/resolve_address_windows.cc +106 -89
  1039. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  1040. data/src/core/lib/iomgr/resolved_address.h +39 -0
  1041. data/src/core/lib/iomgr/sockaddr.h +2 -1
  1042. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +62 -0
  1043. data/src/core/lib/iomgr/socket_factory_posix.cc +8 -7
  1044. data/src/core/lib/iomgr/socket_factory_posix.h +1 -0
  1045. data/src/core/lib/iomgr/socket_mutator.cc +20 -6
  1046. data/src/core/lib/iomgr/socket_mutator.h +27 -3
  1047. data/src/core/lib/iomgr/socket_utils_common_posix.cc +124 -99
  1048. data/src/core/lib/iomgr/socket_utils_linux.cc +4 -4
  1049. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -2
  1050. data/src/core/lib/iomgr/socket_utils_posix.h +22 -22
  1051. data/src/core/lib/iomgr/socket_utils_windows.cc +2 -2
  1052. data/src/core/lib/iomgr/socket_windows.cc +4 -5
  1053. data/src/core/lib/iomgr/tcp_client.cc +4 -4
  1054. data/src/core/lib/iomgr/tcp_client.h +5 -2
  1055. data/src/core/lib/iomgr/tcp_client_cfstream.cc +19 -37
  1056. data/src/core/lib/iomgr/tcp_client_posix.cc +51 -67
  1057. data/src/core/lib/iomgr/tcp_client_posix.h +7 -6
  1058. data/src/core/lib/iomgr/tcp_client_windows.cc +21 -21
  1059. data/src/core/lib/iomgr/tcp_posix.cc +256 -209
  1060. data/src/core/lib/iomgr/tcp_posix.h +17 -12
  1061. data/src/core/lib/iomgr/tcp_server.cc +9 -10
  1062. data/src/core/lib/iomgr/tcp_server.h +21 -17
  1063. data/src/core/lib/iomgr/tcp_server_posix.cc +98 -86
  1064. data/src/core/lib/iomgr/tcp_server_utils_posix.h +36 -32
  1065. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +28 -27
  1066. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +14 -19
  1067. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  1068. data/src/core/lib/iomgr/tcp_server_windows.cc +38 -41
  1069. data/src/core/lib/iomgr/tcp_windows.cc +56 -57
  1070. data/src/core/lib/iomgr/tcp_windows.h +3 -3
  1071. data/src/core/lib/iomgr/timer.cc +3 -2
  1072. data/src/core/lib/iomgr/timer.h +17 -8
  1073. data/src/core/lib/iomgr/timer_generic.cc +129 -139
  1074. data/src/core/lib/iomgr/timer_generic.h +1 -0
  1075. data/src/core/lib/iomgr/timer_heap.cc +2 -3
  1076. data/src/core/lib/iomgr/timer_manager.cc +19 -18
  1077. data/src/core/lib/iomgr/unix_sockets_posix.cc +33 -41
  1078. data/src/core/lib/iomgr/unix_sockets_posix.h +9 -6
  1079. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +15 -11
  1080. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  1081. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +2 -1
  1082. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +8 -9
  1083. data/src/core/lib/iomgr/wakeup_fd_posix.cc +4 -3
  1084. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  1085. data/src/core/lib/iomgr/work_serializer.cc +120 -44
  1086. data/src/core/lib/iomgr/work_serializer.h +33 -5
  1087. data/src/core/lib/json/json.h +13 -3
  1088. data/src/core/lib/json/json_reader.cc +112 -70
  1089. data/src/core/lib/json/json_util.cc +126 -0
  1090. data/src/core/lib/json/json_util.h +154 -0
  1091. data/src/core/lib/json/json_writer.cc +2 -4
  1092. data/src/core/lib/matchers/matchers.cc +327 -0
  1093. data/src/core/lib/matchers/matchers.h +160 -0
  1094. data/src/core/lib/profiling/basic_timers.cc +8 -6
  1095. data/src/core/lib/profiling/stap_timers.cc +2 -2
  1096. data/src/core/lib/promise/activity.cc +121 -0
  1097. data/src/core/lib/promise/activity.h +540 -0
  1098. data/src/core/lib/promise/arena_promise.h +188 -0
  1099. data/src/core/lib/promise/call_push_pull.h +144 -0
  1100. data/src/core/lib/promise/context.h +86 -0
  1101. data/src/core/lib/promise/detail/basic_seq.h +496 -0
  1102. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  1103. data/src/core/lib/promise/detail/promise_like.h +85 -0
  1104. data/src/core/lib/promise/detail/status.h +50 -0
  1105. data/src/core/lib/promise/detail/switch.h +1455 -0
  1106. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  1107. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  1108. data/src/core/lib/promise/latch.h +104 -0
  1109. data/src/core/lib/promise/loop.h +134 -0
  1110. data/src/core/lib/promise/map.h +88 -0
  1111. data/src/core/lib/promise/poll.h +66 -0
  1112. data/src/core/lib/promise/promise.h +95 -0
  1113. data/src/core/lib/promise/race.h +84 -0
  1114. data/src/core/lib/promise/seq.h +89 -0
  1115. data/src/core/lib/promise/sleep.cc +74 -0
  1116. data/src/core/lib/promise/sleep.h +66 -0
  1117. data/src/core/lib/promise/try_seq.h +157 -0
  1118. data/src/core/lib/resolver/resolver.cc +79 -0
  1119. data/src/core/lib/resolver/resolver.h +135 -0
  1120. data/src/core/lib/resolver/resolver_factory.h +76 -0
  1121. data/src/core/lib/resolver/resolver_registry.cc +156 -0
  1122. data/src/core/lib/resolver/resolver_registry.h +113 -0
  1123. data/src/core/lib/resolver/server_address.cc +170 -0
  1124. data/src/core/lib/resolver/server_address.h +144 -0
  1125. data/src/core/lib/resource_quota/api.cc +83 -0
  1126. data/src/core/lib/resource_quota/api.h +40 -0
  1127. data/src/core/lib/resource_quota/arena.cc +107 -0
  1128. data/src/core/lib/resource_quota/arena.h +142 -0
  1129. data/src/core/lib/resource_quota/memory_quota.cc +478 -0
  1130. data/src/core/lib/resource_quota/memory_quota.h +457 -0
  1131. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  1132. data/src/core/lib/resource_quota/resource_quota.h +66 -0
  1133. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  1134. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  1135. data/src/core/lib/resource_quota/trace.cc +19 -0
  1136. data/src/core/lib/resource_quota/trace.h +24 -0
  1137. data/src/core/lib/security/authorization/authorization_engine.h +44 -0
  1138. data/src/core/lib/security/authorization/authorization_policy_provider.h +40 -0
  1139. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +46 -0
  1140. data/src/core/lib/security/authorization/evaluate_args.cc +212 -0
  1141. data/src/core/lib/security/authorization/evaluate_args.h +92 -0
  1142. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  1143. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  1144. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +106 -0
  1145. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +50 -0
  1146. data/src/core/lib/security/authorization/matchers.cc +227 -0
  1147. data/src/core/lib/security/authorization/matchers.h +211 -0
  1148. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  1149. data/src/core/lib/security/authorization/rbac_policy.h +171 -0
  1150. data/src/core/lib/security/context/security_context.cc +19 -13
  1151. data/src/core/lib/security/context/security_context.h +12 -3
  1152. data/src/core/lib/security/credentials/alts/alts_credentials.cc +8 -6
  1153. data/src/core/lib/security/credentials/alts/alts_credentials.h +11 -1
  1154. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  1155. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +2 -2
  1156. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +2 -2
  1157. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +2 -2
  1158. data/src/core/lib/security/credentials/call_creds_util.cc +87 -0
  1159. data/src/core/lib/security/credentials/call_creds_util.h +42 -0
  1160. data/src/core/lib/security/credentials/channel_creds_registry.h +97 -0
  1161. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +70 -0
  1162. data/src/core/lib/security/credentials/composite/composite_credentials.cc +28 -86
  1163. data/src/core/lib/security/credentials/composite/composite_credentials.h +23 -10
  1164. data/src/core/lib/security/credentials/credentials.cc +18 -17
  1165. data/src/core/lib/security/credentials/credentials.h +92 -90
  1166. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +419 -0
  1167. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +82 -0
  1168. data/src/core/lib/security/credentials/external/aws_request_signer.cc +214 -0
  1169. data/src/core/lib/security/credentials/external/aws_request_signer.h +72 -0
  1170. data/src/core/lib/security/credentials/external/external_account_credentials.cc +544 -0
  1171. data/src/core/lib/security/credentials/external/external_account_credentials.h +118 -0
  1172. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +135 -0
  1173. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +49 -0
  1174. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +230 -0
  1175. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +61 -0
  1176. data/src/core/lib/security/credentials/fake/fake_credentials.cc +26 -29
  1177. data/src/core/lib/security/credentials/fake/fake_credentials.h +22 -21
  1178. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +8 -7
  1179. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +169 -82
  1180. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +9 -3
  1181. data/src/core/lib/security/credentials/iam/iam_credentials.cc +23 -29
  1182. data/src/core/lib/security/credentials/iam/iam_credentials.h +15 -9
  1183. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +63 -0
  1184. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  1185. data/src/core/lib/security/credentials/jwt/json_token.cc +10 -12
  1186. data/src/core/lib/security/credentials/jwt/json_token.h +2 -1
  1187. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +61 -53
  1188. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +31 -18
  1189. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +70 -62
  1190. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -4
  1191. data/src/core/lib/security/credentials/local/local_credentials.cc +8 -7
  1192. data/src/core/lib/security/credentials/local/local_credentials.h +11 -1
  1193. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +216 -251
  1194. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +67 -38
  1195. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +100 -158
  1196. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +56 -27
  1197. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +36 -22
  1198. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +26 -6
  1199. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +348 -0
  1200. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +217 -0
  1201. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +454 -0
  1202. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +195 -0
  1203. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +209 -0
  1204. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +145 -0
  1205. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +62 -184
  1206. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +98 -294
  1207. data/src/core/lib/security/credentials/tls/tls_credentials.cc +40 -21
  1208. data/src/core/lib/security/credentials/tls/tls_credentials.h +9 -3
  1209. data/src/core/lib/security/credentials/tls/tls_utils.cc +123 -0
  1210. data/src/core/lib/security/credentials/tls/tls_utils.h +51 -0
  1211. data/src/core/lib/security/credentials/xds/xds_credentials.cc +237 -0
  1212. data/src/core/lib/security/credentials/xds/xds_credentials.h +100 -0
  1213. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +23 -19
  1214. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +3 -3
  1215. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +37 -43
  1216. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +0 -2
  1217. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +111 -0
  1218. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +92 -0
  1219. data/src/core/lib/security/security_connector/load_system_roots.h +4 -0
  1220. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +1 -0
  1221. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +5 -6
  1222. data/src/core/lib/security/security_connector/load_system_roots_linux.h +2 -0
  1223. data/src/core/lib/security/security_connector/local/local_security_connector.cc +35 -27
  1224. data/src/core/lib/security/security_connector/security_connector.cc +14 -18
  1225. data/src/core/lib/security/security_connector/security_connector.h +38 -27
  1226. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +43 -32
  1227. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +6 -2
  1228. data/src/core/lib/security/security_connector/ssl_utils.cc +119 -65
  1229. data/src/core/lib/security/security_connector/ssl_utils.h +40 -40
  1230. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +646 -423
  1231. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +187 -104
  1232. data/src/core/lib/security/transport/auth_filters.h +37 -8
  1233. data/src/core/lib/security/transport/client_auth_filter.cc +102 -358
  1234. data/src/core/lib/security/transport/secure_endpoint.cc +214 -149
  1235. data/src/core/lib/security/transport/secure_endpoint.h +2 -1
  1236. data/src/core/lib/security/transport/security_handshaker.cc +172 -94
  1237. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  1238. data/src/core/lib/security/transport/server_auth_filter.cc +58 -47
  1239. data/src/core/lib/security/transport/tsi_error.cc +5 -6
  1240. data/src/core/lib/security/transport/tsi_error.h +2 -1
  1241. data/src/core/lib/security/util/json_util.cc +10 -13
  1242. data/src/core/lib/security/util/json_util.h +2 -1
  1243. data/src/core/lib/service_config/service_config.h +82 -0
  1244. data/src/core/lib/service_config/service_config_call_data.h +72 -0
  1245. data/src/core/lib/service_config/service_config_impl.cc +230 -0
  1246. data/src/core/lib/service_config/service_config_impl.h +125 -0
  1247. data/src/core/lib/service_config/service_config_parser.cc +93 -0
  1248. data/src/core/lib/service_config/service_config_parser.h +106 -0
  1249. data/src/core/lib/slice/percent_encoding.cc +84 -97
  1250. data/src/core/lib/slice/percent_encoding.h +23 -28
  1251. data/src/core/lib/slice/slice.cc +111 -181
  1252. data/src/core/lib/slice/slice.h +384 -0
  1253. data/src/core/lib/slice/slice_api.cc +39 -0
  1254. data/src/core/lib/slice/slice_buffer.cc +12 -8
  1255. data/src/core/lib/slice/slice_internal.h +17 -277
  1256. data/src/core/lib/slice/slice_refcount.cc +35 -0
  1257. data/src/core/lib/slice/slice_refcount.h +46 -0
  1258. data/src/core/lib/slice/slice_refcount_base.h +61 -0
  1259. data/src/core/lib/slice/slice_split.cc +100 -0
  1260. data/src/core/lib/slice/slice_split.h +40 -0
  1261. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  1262. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  1263. data/src/core/lib/surface/api_trace.cc +2 -1
  1264. data/src/core/lib/surface/api_trace.h +1 -0
  1265. data/src/core/lib/surface/builtins.cc +49 -0
  1266. data/src/core/lib/surface/builtins.h +26 -0
  1267. data/src/core/lib/surface/byte_buffer_reader.cc +1 -1
  1268. data/src/core/lib/surface/call.cc +1171 -1248
  1269. data/src/core/lib/surface/call.h +16 -24
  1270. data/src/core/lib/surface/call_details.cc +10 -10
  1271. data/src/core/lib/surface/call_log_batch.cc +2 -2
  1272. data/src/core/lib/surface/channel.cc +96 -135
  1273. data/src/core/lib/surface/channel.h +31 -22
  1274. data/src/core/lib/surface/channel_init.cc +22 -76
  1275. data/src/core/lib/surface/channel_init.h +44 -40
  1276. data/src/core/lib/surface/channel_ping.cc +2 -3
  1277. data/src/core/lib/surface/channel_stack_type.cc +2 -1
  1278. data/src/core/lib/surface/completion_queue.cc +154 -162
  1279. data/src/core/lib/surface/completion_queue.h +18 -17
  1280. data/src/core/lib/surface/completion_queue_factory.cc +3 -3
  1281. data/src/core/lib/surface/completion_queue_factory.h +1 -0
  1282. data/src/core/lib/surface/event_string.cc +1 -0
  1283. data/src/core/lib/surface/init.cc +121 -83
  1284. data/src/core/lib/surface/init.h +10 -4
  1285. data/src/core/lib/surface/lame_client.cc +80 -72
  1286. data/src/core/lib/surface/lame_client.h +5 -0
  1287. data/src/core/lib/surface/metadata_array.cc +2 -2
  1288. data/src/core/lib/surface/server.cc +1142 -1373
  1289. data/src/core/lib/surface/server.h +467 -71
  1290. data/src/core/lib/surface/validate_metadata.cc +55 -24
  1291. data/src/core/lib/surface/validate_metadata.h +6 -2
  1292. data/src/core/lib/surface/version.cc +2 -2
  1293. data/src/core/lib/transport/bdp_estimator.cc +11 -12
  1294. data/src/core/lib/transport/bdp_estimator.h +4 -3
  1295. data/src/core/lib/transport/byte_stream.cc +11 -5
  1296. data/src/core/lib/transport/byte_stream.h +12 -11
  1297. data/src/core/lib/transport/connectivity_state.cc +27 -19
  1298. data/src/core/lib/transport/connectivity_state.h +28 -14
  1299. data/src/core/lib/transport/error_utils.cc +73 -21
  1300. data/src/core/lib/transport/error_utils.h +17 -4
  1301. data/src/core/lib/transport/metadata_batch.h +1355 -152
  1302. data/src/core/lib/transport/parsed_metadata.cc +37 -0
  1303. data/src/core/lib/transport/parsed_metadata.h +401 -0
  1304. data/src/core/lib/transport/pid_controller.cc +4 -4
  1305. data/src/core/lib/transport/status_conversion.cc +2 -2
  1306. data/src/core/lib/transport/status_conversion.h +1 -1
  1307. data/src/core/lib/transport/timeout_encoding.cc +208 -71
  1308. data/src/core/lib/transport/timeout_encoding.h +40 -10
  1309. data/src/core/lib/transport/transport.cc +18 -36
  1310. data/src/core/lib/transport/transport.h +129 -15
  1311. data/src/core/lib/transport/transport_impl.h +14 -0
  1312. data/src/core/lib/transport/transport_op_string.cc +13 -35
  1313. data/src/core/lib/uri/uri_parser.cc +305 -254
  1314. data/src/core/lib/uri/uri_parser.h +92 -38
  1315. data/src/core/plugin_registry/grpc_plugin_registry.cc +76 -68
  1316. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +85 -0
  1317. data/src/core/tsi/alts/crypt/aes_gcm.cc +6 -3
  1318. data/src/core/tsi/alts/crypt/gsec.cc +5 -4
  1319. data/src/core/tsi/alts/crypt/gsec.h +5 -0
  1320. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  1321. data/src/core/tsi/alts/frame_protector/frame_handler.cc +18 -17
  1322. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +77 -68
  1323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +2 -3
  1324. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +9 -1
  1325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +103 -64
  1326. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +1 -1
  1327. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  1328. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -2
  1329. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +1 -1
  1330. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +5 -5
  1331. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  1332. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +2 -2
  1333. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  1334. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +8 -6
  1335. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +6 -6
  1336. data/src/core/tsi/fake_transport_security.cc +32 -12
  1337. data/src/core/tsi/local_transport_security.cc +46 -87
  1338. data/src/core/tsi/local_transport_security.h +6 -10
  1339. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +141 -0
  1340. data/src/core/tsi/ssl/key_logging/ssl_key_logging.h +81 -0
  1341. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  1342. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  1343. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +20 -55
  1344. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +9 -9
  1345. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -2
  1346. data/src/core/tsi/ssl_transport_security.cc +422 -129
  1347. data/src/core/tsi/ssl_transport_security.h +68 -16
  1348. data/src/core/tsi/transport_security.cc +25 -11
  1349. data/src/core/tsi/transport_security.h +16 -1
  1350. data/src/core/tsi/transport_security_grpc.h +1 -0
  1351. data/src/core/tsi/transport_security_interface.h +34 -1
  1352. data/src/ruby/bin/math_services_pb.rb +5 -5
  1353. data/src/ruby/ext/grpc/extconf.rb +34 -11
  1354. data/src/ruby/ext/grpc/rb_byte_buffer.c +2 -1
  1355. data/src/ruby/ext/grpc/rb_call.c +8 -7
  1356. data/src/ruby/ext/grpc/rb_call.h +4 -0
  1357. data/src/ruby/ext/grpc/rb_call_credentials.c +62 -17
  1358. data/src/ruby/ext/grpc/rb_channel.c +24 -10
  1359. data/src/ruby/ext/grpc/rb_channel_args.c +2 -2
  1360. data/src/ruby/ext/grpc/rb_channel_credentials.c +24 -5
  1361. data/src/ruby/ext/grpc/rb_channel_credentials.h +5 -0
  1362. data/src/ruby/ext/grpc/rb_completion_queue.c +3 -2
  1363. data/src/ruby/ext/grpc/rb_compression_options.c +6 -5
  1364. data/src/ruby/ext/grpc/rb_enable_cpp.cc +1 -1
  1365. data/src/ruby/ext/grpc/rb_event_thread.c +4 -2
  1366. data/src/ruby/ext/grpc/rb_grpc.c +9 -4
  1367. data/src/ruby/ext/grpc/rb_grpc.h +1 -0
  1368. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +76 -48
  1369. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +130 -88
  1370. data/src/ruby/ext/grpc/rb_server.c +26 -10
  1371. data/src/ruby/ext/grpc/rb_server_credentials.c +22 -6
  1372. data/src/ruby/ext/grpc/rb_server_credentials.h +5 -0
  1373. data/src/ruby/ext/grpc/rb_xds_channel_credentials.c +218 -0
  1374. data/src/ruby/ext/grpc/rb_xds_channel_credentials.h +37 -0
  1375. data/src/ruby/ext/grpc/rb_xds_server_credentials.c +170 -0
  1376. data/src/ruby/ext/grpc/rb_xds_server_credentials.h +37 -0
  1377. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  1378. data/src/ruby/lib/grpc/generic/client_stub.rb +5 -3
  1379. data/src/ruby/lib/grpc/generic/interceptors.rb +1 -1
  1380. data/src/ruby/lib/grpc/grpc.rb +1 -1
  1381. data/src/ruby/lib/grpc/version.rb +1 -1
  1382. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  1383. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +3 -3
  1384. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +40 -0
  1385. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -0
  1386. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +50 -16
  1387. data/src/ruby/pb/test/client.rb +769 -0
  1388. data/src/ruby/pb/test/server.rb +252 -0
  1389. data/src/ruby/pb/test/xds_client.rb +415 -0
  1390. data/src/ruby/spec/call_spec.rb +1 -1
  1391. data/src/ruby/spec/channel_credentials_spec.rb +42 -0
  1392. data/src/ruby/spec/channel_spec.rb +17 -6
  1393. data/src/ruby/spec/client_auth_spec.rb +27 -1
  1394. data/src/ruby/spec/client_server_spec.rb +1 -1
  1395. data/src/ruby/spec/errors_spec.rb +1 -1
  1396. data/src/ruby/spec/generic/active_call_spec.rb +21 -10
  1397. data/src/ruby/spec/generic/client_stub_spec.rb +4 -4
  1398. data/src/ruby/spec/generic/rpc_server_spec.rb +1 -1
  1399. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  1400. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +2 -0
  1401. data/src/ruby/spec/pb/codegen/grpc/testing/same_package_service_name.proto +27 -0
  1402. data/src/ruby/spec/pb/codegen/grpc/testing/same_ruby_package_service_name.proto +29 -0
  1403. data/src/ruby/spec/pb/codegen/package_option_spec.rb +27 -7
  1404. data/src/ruby/spec/server_credentials_spec.rb +25 -0
  1405. data/src/ruby/spec/server_spec.rb +22 -0
  1406. data/src/ruby/spec/support/services.rb +10 -4
  1407. data/src/ruby/spec/user_agent_spec.rb +74 -0
  1408. data/third_party/abseil-cpp/absl/algorithm/container.h +1774 -0
  1409. data/third_party/abseil-cpp/absl/base/attributes.h +169 -55
  1410. data/third_party/abseil-cpp/absl/base/call_once.h +3 -10
  1411. data/third_party/abseil-cpp/absl/base/casts.h +9 -6
  1412. data/third_party/abseil-cpp/absl/base/config.h +150 -49
  1413. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +417 -335
  1414. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +169 -0
  1415. data/third_party/abseil-cpp/absl/base/internal/dynamic_annotations.h +398 -0
  1416. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  1417. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  1418. data/third_party/abseil-cpp/absl/base/internal/invoke.h +4 -4
  1419. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +620 -0
  1420. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.h +126 -0
  1421. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +31 -4
  1422. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +35 -33
  1423. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +17 -5
  1424. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +36 -40
  1425. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +36 -31
  1426. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  1427. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +11 -3
  1428. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  1429. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +13 -11
  1430. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  1431. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +97 -5
  1432. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +8 -0
  1433. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +9 -6
  1434. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +58 -52
  1435. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  1436. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +3 -1
  1437. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  1438. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +17 -3
  1439. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +7 -7
  1440. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  1441. data/third_party/abseil-cpp/absl/base/macros.h +47 -109
  1442. data/third_party/abseil-cpp/absl/base/optimization.h +69 -6
  1443. data/third_party/abseil-cpp/absl/base/options.h +31 -4
  1444. data/third_party/abseil-cpp/absl/base/policy_checks.h +1 -1
  1445. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  1446. data/third_party/abseil-cpp/absl/base/thread_annotations.h +95 -40
  1447. data/third_party/abseil-cpp/absl/container/fixed_array.h +527 -0
  1448. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +606 -0
  1449. data/third_party/abseil-cpp/absl/container/inlined_vector.h +141 -134
  1450. data/third_party/abseil-cpp/absl/container/internal/common.h +206 -0
  1451. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +34 -9
  1452. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +460 -0
  1453. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +163 -0
  1454. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +208 -0
  1455. data/third_party/abseil-cpp/absl/container/internal/hashtable_debug_hooks.h +85 -0
  1456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +190 -0
  1457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +281 -0
  1458. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +31 -0
  1459. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +50 -0
  1460. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +469 -429
  1461. data/third_party/abseil-cpp/absl/container/internal/layout.h +743 -0
  1462. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +198 -0
  1463. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +67 -0
  1464. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +2034 -0
  1465. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +139 -0
  1466. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.h +32 -0
  1467. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +1959 -0
  1468. data/third_party/abseil-cpp/absl/debugging/internal/demangle.h +71 -0
  1469. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +383 -0
  1470. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +138 -0
  1471. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +199 -0
  1472. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +134 -0
  1473. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +87 -0
  1474. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  1475. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +108 -0
  1476. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +253 -0
  1477. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  1478. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +24 -0
  1479. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +93 -0
  1480. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +364 -0
  1481. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +153 -0
  1482. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +191 -0
  1483. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.h +158 -0
  1484. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +142 -0
  1485. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +231 -0
  1486. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +38 -0
  1487. data/third_party/abseil-cpp/absl/debugging/symbolize.h +99 -0
  1488. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +101 -0
  1489. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +1574 -0
  1490. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  1491. data/third_party/abseil-cpp/absl/debugging/symbolize_unimplemented.inc +40 -0
  1492. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +81 -0
  1493. data/third_party/abseil-cpp/absl/functional/bind_front.h +184 -0
  1494. data/third_party/abseil-cpp/absl/functional/function_ref.h +142 -0
  1495. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +95 -0
  1496. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +106 -0
  1497. data/third_party/abseil-cpp/absl/hash/hash.h +347 -0
  1498. data/third_party/abseil-cpp/absl/hash/internal/city.cc +349 -0
  1499. data/third_party/abseil-cpp/absl/hash/internal/city.h +78 -0
  1500. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +69 -0
  1501. data/third_party/abseil-cpp/absl/hash/internal/hash.h +1096 -0
  1502. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +123 -0
  1503. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +50 -0
  1504. data/third_party/abseil-cpp/absl/memory/memory.h +4 -0
  1505. data/third_party/abseil-cpp/absl/meta/type_traits.h +49 -11
  1506. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  1507. data/third_party/abseil-cpp/absl/numeric/int128.cc +16 -37
  1508. data/third_party/abseil-cpp/absl/numeric/int128.h +159 -85
  1509. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  1510. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  1511. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  1512. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  1513. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +93 -0
  1514. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.h +130 -0
  1515. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  1516. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  1517. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  1518. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  1519. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  1520. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  1521. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  1522. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  1523. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  1524. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  1525. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  1526. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  1527. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  1528. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  1529. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  1530. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  1531. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  1532. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  1533. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  1534. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  1535. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  1536. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  1537. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  1538. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  1539. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  1540. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  1541. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  1542. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  1543. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  1544. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  1545. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  1546. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  1547. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  1548. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  1549. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  1550. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  1551. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  1552. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  1553. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  1554. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  1555. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  1556. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  1557. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  1558. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  1559. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  1560. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  1561. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +69 -0
  1562. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +396 -0
  1563. data/third_party/abseil-cpp/absl/status/status.cc +444 -0
  1564. data/third_party/abseil-cpp/absl/status/status.h +882 -0
  1565. data/third_party/abseil-cpp/absl/status/status_payload_printer.cc +38 -0
  1566. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +51 -0
  1567. data/third_party/abseil-cpp/absl/status/statusor.cc +103 -0
  1568. data/third_party/abseil-cpp/absl/status/statusor.h +770 -0
  1569. data/third_party/abseil-cpp/absl/strings/charconv.cc +10 -10
  1570. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  1571. data/third_party/abseil-cpp/absl/strings/cord.cc +2047 -0
  1572. data/third_party/abseil-cpp/absl/strings/cord.h +1521 -0
  1573. data/third_party/abseil-cpp/absl/strings/escaping.cc +13 -13
  1574. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +1 -1
  1575. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  1576. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +2 -2
  1577. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +9 -9
  1578. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +89 -0
  1579. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +620 -0
  1580. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  1581. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  1582. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  1583. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  1584. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  1585. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  1586. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  1587. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  1588. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  1589. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +771 -0
  1590. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +607 -0
  1591. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +118 -0
  1592. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  1593. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  1594. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  1595. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  1596. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  1597. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  1598. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  1599. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  1600. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  1601. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  1602. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +236 -136
  1603. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +158 -64
  1604. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +19 -6
  1605. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +30 -22
  1606. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +21 -14
  1607. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +37 -13
  1608. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +183 -153
  1609. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +1017 -87
  1610. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +17 -3
  1611. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +4 -12
  1612. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +82 -77
  1613. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +51 -27
  1614. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +49 -74
  1615. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  1616. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  1617. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  1618. data/third_party/abseil-cpp/absl/strings/numbers.cc +133 -5
  1619. data/third_party/abseil-cpp/absl/strings/numbers.h +44 -10
  1620. data/third_party/abseil-cpp/absl/strings/str_cat.cc +8 -8
  1621. data/third_party/abseil-cpp/absl/strings/str_cat.h +1 -1
  1622. data/third_party/abseil-cpp/absl/strings/str_format.h +290 -15
  1623. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  1624. data/third_party/abseil-cpp/absl/strings/str_split.cc +2 -2
  1625. data/third_party/abseil-cpp/absl/strings/str_split.h +39 -4
  1626. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  1627. data/third_party/abseil-cpp/absl/strings/string_view.h +143 -55
  1628. data/third_party/abseil-cpp/absl/strings/substitute.cc +7 -6
  1629. data/third_party/abseil-cpp/absl/strings/substitute.h +109 -81
  1630. data/third_party/abseil-cpp/absl/synchronization/barrier.cc +52 -0
  1631. data/third_party/abseil-cpp/absl/synchronization/barrier.h +79 -0
  1632. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +67 -0
  1633. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +101 -0
  1634. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +140 -0
  1635. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +60 -0
  1636. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  1637. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.cc +698 -0
  1638. data/third_party/abseil-cpp/absl/synchronization/internal/graphcycles.h +141 -0
  1639. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +156 -0
  1640. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +106 -0
  1641. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +115 -0
  1642. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +428 -0
  1643. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +155 -0
  1644. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +2751 -0
  1645. data/third_party/abseil-cpp/absl/synchronization/mutex.h +1082 -0
  1646. data/third_party/abseil-cpp/absl/synchronization/notification.cc +78 -0
  1647. data/third_party/abseil-cpp/absl/synchronization/notification.h +123 -0
  1648. data/third_party/abseil-cpp/absl/time/civil_time.cc +9 -11
  1649. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  1650. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  1651. data/third_party/abseil-cpp/absl/time/duration.cc +93 -61
  1652. data/third_party/abseil-cpp/absl/time/format.cc +43 -36
  1653. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +33 -27
  1654. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +97 -22
  1655. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +1 -1
  1656. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  1657. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +136 -29
  1658. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  1659. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +13 -21
  1660. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +1 -1
  1661. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +219 -150
  1662. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +4 -5
  1663. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +15 -8
  1664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  1665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +3 -3
  1666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +1 -1
  1667. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  1668. data/third_party/abseil-cpp/absl/time/time.h +107 -75
  1669. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  1670. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +64 -0
  1671. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +82 -0
  1672. data/third_party/abseil-cpp/absl/types/internal/variant.h +1646 -0
  1673. data/third_party/abseil-cpp/absl/types/optional.h +9 -9
  1674. data/third_party/abseil-cpp/absl/types/span.h +51 -38
  1675. data/third_party/abseil-cpp/absl/types/variant.h +866 -0
  1676. data/third_party/abseil-cpp/absl/utility/utility.h +2 -2
  1677. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  1678. data/third_party/address_sorting/include/address_sorting/address_sorting.h +2 -0
  1679. data/third_party/boringssl-with-bazel/err_data.c +775 -721
  1680. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +72 -59
  1681. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +22 -23
  1682. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.c +0 -2
  1683. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_enum.c +5 -5
  1684. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.c +6 -1
  1685. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_int.c +6 -6
  1686. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +16 -23
  1687. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +70 -57
  1688. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.c +3 -3
  1689. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_print.c +19 -29
  1690. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.c +650 -0
  1691. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +106 -153
  1692. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +6 -6
  1693. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +23 -11
  1694. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.c +3 -42
  1695. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_utf8.c +1 -1
  1696. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +74 -68
  1697. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.c +1 -1
  1698. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +25 -29
  1699. data/third_party/boringssl-with-bazel/src/crypto/{x509 → asn1}/charmap.h +0 -0
  1700. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +6 -1
  1701. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c +1 -1
  1702. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +224 -0
  1703. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +79 -354
  1704. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +327 -281
  1705. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +15 -26
  1706. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.c +20 -75
  1707. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -8
  1708. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.c +3 -2
  1709. data/third_party/boringssl-with-bazel/src/crypto/asn1/time_support.c +1 -1
  1710. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +24 -8
  1711. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +2 -0
  1712. data/third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.c +1 -7
  1713. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +1 -5
  1714. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +0 -4
  1715. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +1 -7
  1716. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +1 -6
  1717. data/third_party/boringssl-with-bazel/src/crypto/bio/socket.c +3 -17
  1718. data/third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.c +4 -0
  1719. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +156 -0
  1720. data/third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.c +3 -10
  1721. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +11 -10
  1722. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +9 -0
  1723. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +68 -45
  1724. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  1725. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +49 -65
  1726. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.c +6 -81
  1727. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  1728. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +101 -3
  1729. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +120 -273
  1730. data/third_party/boringssl-with-bazel/src/crypto/conf/conf.c +14 -3
  1731. data/third_party/boringssl-with-bazel/src/crypto/cpu-aarch64-win.c +41 -0
  1732. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +11 -2
  1733. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm.c +3 -3
  1734. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +1 -1
  1735. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  1736. data/third_party/boringssl-with-bazel/src/crypto/{dh → dh_extra}/dh_asn1.c +0 -0
  1737. data/third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c +272 -0
  1738. data/third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c +31 -3
  1739. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +30 -43
  1740. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.c +55 -4
  1741. data/third_party/boringssl-with-bazel/src/crypto/dsa/internal.h +34 -0
  1742. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.c +2 -17
  1743. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +12 -52
  1744. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +0 -22
  1745. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  1746. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +13 -0
  1747. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +161 -2
  1748. data/third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.c +6 -2
  1749. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  1750. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +17 -1
  1751. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +4 -1
  1752. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c +13 -20
  1753. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c +28 -12
  1754. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c +3 -2
  1755. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +26 -5
  1756. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +0 -4
  1757. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  1758. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +44 -16
  1759. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +208 -37
  1760. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  1761. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  1762. data/third_party/boringssl-with-bazel/src/crypto/{dh → fipsmodule/dh}/check.c +0 -0
  1763. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +456 -0
  1764. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +11 -0
  1765. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  1766. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +87 -160
  1767. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +16 -0
  1768. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +9 -2
  1769. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +2 -5
  1770. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +13 -11
  1771. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +24 -23
  1772. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +20 -16
  1773. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +2 -2
  1774. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c +3 -3
  1775. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +105 -95
  1776. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  1777. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +56 -72
  1778. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +56 -73
  1779. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  1780. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  1781. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  1782. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  1783. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +1 -1
  1784. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  1785. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  1786. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +30 -9
  1787. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +123 -44
  1788. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +30 -20
  1789. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +4 -0
  1790. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +80 -43
  1791. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +120 -62
  1792. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  1793. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +238 -18
  1794. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +93 -107
  1795. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +91 -113
  1796. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +50 -86
  1797. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +618 -0
  1798. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +219 -121
  1799. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +9 -2
  1800. data/third_party/boringssl-with-bazel/src/crypto/internal.h +125 -0
  1801. data/third_party/boringssl-with-bazel/src/crypto/lhash/internal.h +253 -0
  1802. data/third_party/boringssl-with-bazel/src/crypto/lhash/lhash.c +28 -23
  1803. data/third_party/boringssl-with-bazel/src/crypto/mem.c +75 -24
  1804. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +10 -6
  1805. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_all.c +0 -9
  1806. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +0 -2
  1807. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +0 -8
  1808. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +0 -2
  1809. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +0 -4
  1810. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/internal.h +16 -7
  1811. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +38 -4
  1812. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +156 -15
  1813. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +7 -1
  1814. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1815. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +132 -54
  1816. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +11 -8
  1817. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +13 -11
  1818. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +4 -0
  1819. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1820. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -22
  1821. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +4 -0
  1822. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/fuchsia.c +4 -0
  1823. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +34 -0
  1824. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +5 -1
  1825. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +4 -0
  1826. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c +1 -2
  1827. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  1828. data/third_party/boringssl-with-bazel/src/crypto/stack/stack.c +7 -13
  1829. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  1830. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +110 -70
  1831. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +348 -423
  1832. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +217 -79
  1833. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +766 -0
  1834. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +15 -11
  1835. data/third_party/boringssl-with-bazel/src/crypto/x509/algorithm.c +11 -1
  1836. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +5 -21
  1837. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +1 -0
  1838. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +2 -0
  1839. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +351 -13
  1840. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +246 -0
  1841. data/third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.c +20 -5
  1842. data/third_party/boringssl-with-bazel/src/crypto/x509/t_crl.c +13 -8
  1843. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  1844. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +1 -180
  1845. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +7 -2
  1846. data/third_party/boringssl-with-bazel/src/crypto/x509/x509.c +0 -67
  1847. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +24 -47
  1848. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +24 -39
  1849. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.c +29 -23
  1850. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.c +1 -5
  1851. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +2 -1
  1852. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +52 -89
  1853. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +67 -12
  1854. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +9 -4
  1855. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.c +67 -67
  1856. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.c +29 -26
  1857. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +82 -113
  1858. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +54 -74
  1859. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +99 -25
  1860. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -12
  1861. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +3 -0
  1862. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -19
  1863. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +13 -26
  1864. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +21 -34
  1865. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +52 -28
  1866. data/third_party/boringssl-with-bazel/src/crypto/x509/x_exten.c +2 -0
  1867. data/third_party/boringssl-with-bazel/src/crypto/x509/x_name.c +49 -59
  1868. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pkey.c +2 -2
  1869. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +21 -172
  1870. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +5 -8
  1871. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +25 -0
  1872. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  1873. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509.c +75 -15
  1874. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +5 -2
  1875. data/third_party/boringssl-with-bazel/src/crypto/x509v3/ext_dat.h +1 -4
  1876. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +244 -11
  1877. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +2 -1
  1878. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +7 -5
  1879. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1880. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +2 -1
  1881. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1882. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +5 -4
  1883. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_akey.c +27 -8
  1884. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +43 -32
  1885. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_bitst.c +6 -3
  1886. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -28
  1887. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +10 -13
  1888. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_crld.c +4 -2
  1889. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +7 -1
  1890. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_genn.c +42 -22
  1891. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ia5.c +3 -4
  1892. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +1 -1
  1893. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +48 -40
  1894. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_ncons.c +112 -55
  1895. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pci.c +2 -1
  1896. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +15 -14
  1897. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +128 -42
  1898. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +8 -7
  1899. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +86 -44
  1900. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +25 -4
  1901. data/third_party/boringssl-with-bazel/src/include/openssl/aes.h +16 -4
  1902. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +119 -0
  1903. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +1801 -673
  1904. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +5 -179
  1905. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +67 -15
  1906. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1907. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +7 -1
  1908. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +62 -0
  1909. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +3 -3
  1910. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +32 -7
  1911. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  1912. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +42 -7
  1913. data/third_party/boringssl-with-bazel/src/include/openssl/conf.h +8 -5
  1914. data/third_party/boringssl-with-bazel/src/include/openssl/cpu.h +22 -32
  1915. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +25 -5
  1916. data/third_party/boringssl-with-bazel/src/include/openssl/des.h +6 -0
  1917. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +66 -32
  1918. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +19 -2
  1919. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1920. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +20 -2
  1921. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1922. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +41 -10
  1923. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  1924. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +108 -75
  1925. data/third_party/boringssl-with-bazel/src/include/openssl/evp_errors.h +99 -0
  1926. data/third_party/boringssl-with-bazel/src/include/openssl/hkdf.h +4 -0
  1927. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +350 -0
  1928. data/third_party/boringssl-with-bazel/src/include/openssl/hrss.h +14 -12
  1929. data/third_party/boringssl-with-bazel/src/include/openssl/lhash.h +4 -205
  1930. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +12 -3
  1931. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +26 -6
  1932. data/third_party/boringssl-with-bazel/src/include/openssl/opensslconf.h +3 -0
  1933. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +194 -146
  1934. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +42 -18
  1935. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +15 -2
  1936. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1937. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +5 -2
  1938. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +128 -91
  1939. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +39 -16
  1940. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +570 -144
  1941. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +53 -38
  1942. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +43 -24
  1943. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +2041 -829
  1944. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -679
  1945. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +642 -452
  1946. data/third_party/boringssl-with-bazel/src/ssl/bio_ssl.cc +18 -5
  1947. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +16 -18
  1948. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +1 -1
  1949. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +1084 -0
  1950. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +4325 -0
  1951. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +336 -25
  1952. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +108 -53
  1953. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +317 -221
  1954. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +187 -36
  1955. data/third_party/boringssl-with-bazel/src/ssl/internal.h +554 -173
  1956. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +9 -3
  1957. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +0 -2
  1958. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +14 -19
  1959. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +55 -15
  1960. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +7 -12
  1961. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +10 -11
  1962. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +34 -31
  1963. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +167 -110
  1964. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +2 -0
  1965. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +147 -138
  1966. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -0
  1967. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +12 -17
  1968. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +16 -8
  1969. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +28 -23
  1970. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +47 -28
  1971. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +80 -36
  1972. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +316 -211
  1973. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +160 -91
  1974. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +398 -145
  1975. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  1976. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +5 -3
  1977. data/third_party/cares/cares/include/ares.h +742 -0
  1978. data/third_party/cares/cares/include/ares_dns.h +112 -0
  1979. data/third_party/cares/cares/{ares_rules.h → include/ares_rules.h} +0 -0
  1980. data/third_party/cares/cares/include/ares_version.h +24 -0
  1981. data/third_party/cares/cares/src/lib/ares__close_sockets.c +61 -0
  1982. data/third_party/cares/cares/src/lib/ares__get_hostent.c +260 -0
  1983. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +260 -0
  1984. data/third_party/cares/cares/{ares__read_line.c → src/lib/ares__read_line.c} +0 -0
  1985. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +264 -0
  1986. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +499 -0
  1987. data/third_party/cares/cares/{ares__timeval.c → src/lib/ares__timeval.c} +0 -0
  1988. data/third_party/cares/cares/src/lib/ares_android.c +444 -0
  1989. data/third_party/cares/cares/src/lib/ares_android.h +27 -0
  1990. data/third_party/cares/cares/{ares_cancel.c → src/lib/ares_cancel.c} +0 -0
  1991. data/third_party/cares/cares/src/lib/ares_create_query.c +197 -0
  1992. data/third_party/cares/cares/src/lib/ares_data.c +240 -0
  1993. data/third_party/cares/cares/src/lib/ares_data.h +74 -0
  1994. data/third_party/cares/cares/{ares_destroy.c → src/lib/ares_destroy.c} +0 -0
  1995. data/third_party/cares/cares/src/lib/ares_expand_name.c +300 -0
  1996. data/third_party/cares/cares/src/lib/ares_expand_string.c +67 -0
  1997. data/third_party/cares/cares/{ares_fds.c → src/lib/ares_fds.c} +0 -0
  1998. data/third_party/cares/cares/src/lib/ares_free_hostent.c +43 -0
  1999. data/third_party/cares/cares/{ares_free_string.c → src/lib/ares_free_string.c} +0 -0
  2000. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +59 -0
  2001. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +772 -0
  2002. data/third_party/cares/cares/src/lib/ares_getenv.c +28 -0
  2003. data/third_party/cares/cares/{ares_getenv.h → src/lib/ares_getenv.h} +0 -0
  2004. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +287 -0
  2005. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +534 -0
  2006. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +447 -0
  2007. data/third_party/cares/cares/{ares_getsock.c → src/lib/ares_getsock.c} +0 -0
  2008. data/third_party/cares/cares/{ares_inet_net_pton.h → src/lib/ares_inet_net_pton.h} +0 -0
  2009. data/third_party/cares/cares/src/lib/ares_init.c +2654 -0
  2010. data/third_party/cares/cares/{ares_iphlpapi.h → src/lib/ares_iphlpapi.h} +0 -0
  2011. data/third_party/cares/cares/src/lib/ares_ipv6.h +85 -0
  2012. data/third_party/cares/cares/src/lib/ares_library_init.c +200 -0
  2013. data/third_party/cares/cares/src/lib/ares_library_init.h +43 -0
  2014. data/third_party/cares/cares/{ares_llist.c → src/lib/ares_llist.c} +0 -0
  2015. data/third_party/cares/cares/{ares_llist.h → src/lib/ares_llist.h} +0 -0
  2016. data/third_party/cares/cares/{ares_mkquery.c → src/lib/ares_mkquery.c} +0 -0
  2017. data/third_party/cares/cares/src/lib/ares_nameser.h +482 -0
  2018. data/third_party/cares/cares/{ares_nowarn.c → src/lib/ares_nowarn.c} +0 -0
  2019. data/third_party/cares/cares/{ares_nowarn.h → src/lib/ares_nowarn.h} +0 -0
  2020. data/third_party/cares/cares/{ares_options.c → src/lib/ares_options.c} +0 -0
  2021. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +209 -0
  2022. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +212 -0
  2023. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +199 -0
  2024. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +164 -0
  2025. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +183 -0
  2026. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +177 -0
  2027. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +228 -0
  2028. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +179 -0
  2029. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +168 -0
  2030. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +214 -0
  2031. data/third_party/cares/cares/{ares_platform.c → src/lib/ares_platform.c} +0 -0
  2032. data/third_party/cares/cares/{ares_platform.h → src/lib/ares_platform.h} +0 -0
  2033. data/third_party/cares/cares/src/lib/ares_private.h +423 -0
  2034. data/third_party/cares/cares/src/lib/ares_process.c +1548 -0
  2035. data/third_party/cares/cares/src/lib/ares_query.c +180 -0
  2036. data/third_party/cares/cares/src/lib/ares_search.c +321 -0
  2037. data/third_party/cares/cares/src/lib/ares_send.c +131 -0
  2038. data/third_party/cares/cares/src/lib/ares_setup.h +220 -0
  2039. data/third_party/cares/cares/{ares_strcasecmp.c → src/lib/ares_strcasecmp.c} +0 -0
  2040. data/third_party/cares/cares/{ares_strcasecmp.h → src/lib/ares_strcasecmp.h} +0 -0
  2041. data/third_party/cares/cares/{ares_strdup.c → src/lib/ares_strdup.c} +0 -0
  2042. data/third_party/cares/cares/{ares_strdup.h → src/lib/ares_strdup.h} +0 -0
  2043. data/third_party/cares/cares/{ares_strerror.c → src/lib/ares_strerror.c} +0 -0
  2044. data/third_party/cares/cares/src/lib/ares_strsplit.c +178 -0
  2045. data/third_party/cares/cares/{ares_strsplit.h → src/lib/ares_strsplit.h} +0 -0
  2046. data/third_party/cares/cares/{ares_timeout.c → src/lib/ares_timeout.c} +0 -0
  2047. data/third_party/cares/cares/{ares_version.c → src/lib/ares_version.c} +0 -0
  2048. data/third_party/cares/cares/{ares_writev.c → src/lib/ares_writev.c} +0 -0
  2049. data/third_party/cares/cares/src/lib/ares_writev.h +36 -0
  2050. data/third_party/cares/cares/{bitncmp.c → src/lib/bitncmp.c} +0 -0
  2051. data/third_party/cares/cares/{bitncmp.h → src/lib/bitncmp.h} +0 -0
  2052. data/third_party/cares/cares/src/lib/config-dos.h +115 -0
  2053. data/third_party/cares/cares/{config-win32.h → src/lib/config-win32.h} +0 -0
  2054. data/third_party/cares/cares/src/lib/inet_net_pton.c +444 -0
  2055. data/third_party/cares/cares/src/lib/inet_ntop.c +201 -0
  2056. data/third_party/cares/cares/{setup_once.h → src/lib/setup_once.h} +0 -0
  2057. data/third_party/cares/cares/{windows_port.c → src/lib/windows_port.c} +0 -0
  2058. data/third_party/re2/re2/bitmap256.h +117 -0
  2059. data/third_party/re2/re2/bitstate.cc +385 -0
  2060. data/third_party/re2/re2/compile.cc +1261 -0
  2061. data/third_party/re2/re2/dfa.cc +2118 -0
  2062. data/third_party/re2/re2/filtered_re2.cc +137 -0
  2063. data/third_party/re2/re2/filtered_re2.h +114 -0
  2064. data/third_party/re2/re2/mimics_pcre.cc +197 -0
  2065. data/third_party/re2/re2/nfa.cc +713 -0
  2066. data/third_party/re2/re2/onepass.cc +623 -0
  2067. data/third_party/re2/re2/parse.cc +2483 -0
  2068. data/third_party/re2/re2/perl_groups.cc +119 -0
  2069. data/third_party/re2/re2/pod_array.h +55 -0
  2070. data/third_party/re2/re2/prefilter.cc +711 -0
  2071. data/third_party/re2/re2/prefilter.h +108 -0
  2072. data/third_party/re2/re2/prefilter_tree.cc +407 -0
  2073. data/third_party/re2/re2/prefilter_tree.h +139 -0
  2074. data/third_party/re2/re2/prog.cc +1166 -0
  2075. data/third_party/re2/re2/prog.h +455 -0
  2076. data/third_party/re2/re2/re2.cc +1331 -0
  2077. data/third_party/re2/re2/re2.h +1017 -0
  2078. data/third_party/re2/re2/regexp.cc +987 -0
  2079. data/third_party/re2/re2/regexp.h +665 -0
  2080. data/third_party/re2/re2/set.cc +176 -0
  2081. data/third_party/re2/re2/set.h +85 -0
  2082. data/third_party/re2/re2/simplify.cc +665 -0
  2083. data/third_party/re2/re2/sparse_array.h +392 -0
  2084. data/third_party/re2/re2/sparse_set.h +264 -0
  2085. data/third_party/re2/re2/stringpiece.cc +65 -0
  2086. data/third_party/re2/re2/stringpiece.h +210 -0
  2087. data/third_party/re2/re2/tostring.cc +351 -0
  2088. data/third_party/re2/re2/unicode_casefold.cc +582 -0
  2089. data/third_party/re2/re2/unicode_casefold.h +78 -0
  2090. data/third_party/re2/re2/unicode_groups.cc +6269 -0
  2091. data/third_party/re2/re2/unicode_groups.h +67 -0
  2092. data/third_party/re2/re2/walker-inl.h +246 -0
  2093. data/third_party/re2/util/benchmark.h +156 -0
  2094. data/third_party/re2/util/flags.h +26 -0
  2095. data/third_party/re2/util/logging.h +109 -0
  2096. data/third_party/re2/util/malloc_counter.h +19 -0
  2097. data/third_party/re2/util/mix.h +41 -0
  2098. data/third_party/re2/util/mutex.h +148 -0
  2099. data/third_party/re2/util/pcre.cc +1025 -0
  2100. data/third_party/re2/util/pcre.h +681 -0
  2101. data/third_party/re2/util/rune.cc +260 -0
  2102. data/third_party/re2/util/strutil.cc +149 -0
  2103. data/third_party/re2/util/strutil.h +21 -0
  2104. data/third_party/re2/util/test.h +50 -0
  2105. data/third_party/re2/util/utf.h +44 -0
  2106. data/third_party/re2/util/util.h +42 -0
  2107. data/third_party/upb/third_party/utf8_range/naive.c +92 -0
  2108. data/third_party/upb/third_party/utf8_range/range2-neon.c +157 -0
  2109. data/third_party/upb/third_party/utf8_range/range2-sse.c +170 -0
  2110. data/third_party/upb/third_party/utf8_range/utf8_range.h +9 -0
  2111. data/third_party/upb/upb/decode.c +997 -481
  2112. data/third_party/upb/upb/decode.h +79 -6
  2113. data/third_party/upb/upb/decode_fast.c +1055 -0
  2114. data/third_party/upb/upb/decode_fast.h +153 -0
  2115. data/third_party/upb/upb/decode_internal.h +211 -0
  2116. data/third_party/upb/upb/def.c +3261 -0
  2117. data/third_party/upb/upb/def.h +409 -0
  2118. data/third_party/upb/upb/def.hpp +438 -0
  2119. data/third_party/upb/upb/encode.c +459 -233
  2120. data/third_party/upb/upb/encode.h +56 -6
  2121. data/third_party/upb/upb/json_encode.c +776 -0
  2122. data/third_party/upb/upb/json_encode.h +62 -0
  2123. data/third_party/upb/upb/msg.c +387 -70
  2124. data/third_party/upb/upb/msg.h +90 -45
  2125. data/third_party/upb/upb/msg_internal.h +831 -0
  2126. data/third_party/upb/upb/port_def.inc +195 -84
  2127. data/third_party/upb/upb/port_undef.inc +48 -7
  2128. data/third_party/upb/upb/reflection.c +480 -0
  2129. data/third_party/upb/upb/reflection.h +220 -0
  2130. data/third_party/upb/upb/reflection.hpp +37 -0
  2131. data/third_party/upb/upb/table.c +441 -428
  2132. data/third_party/upb/upb/table_internal.h +385 -0
  2133. data/third_party/upb/upb/text_encode.c +472 -0
  2134. data/third_party/upb/upb/text_encode.h +64 -0
  2135. data/third_party/upb/upb/upb.c +255 -154
  2136. data/third_party/upb/upb/upb.h +235 -226
  2137. data/third_party/upb/upb/upb.hpp +115 -0
  2138. data/third_party/upb/upb/upb_internal.h +68 -0
  2139. data/third_party/xxhash/xxhash.h +5580 -0
  2140. data/third_party/zlib/crc32.c +966 -292
  2141. data/third_party/zlib/crc32.h +9441 -436
  2142. data/third_party/zlib/deflate.c +78 -30
  2143. data/third_party/zlib/deflate.h +12 -15
  2144. data/third_party/zlib/gzguts.h +3 -2
  2145. data/third_party/zlib/gzlib.c +5 -3
  2146. data/third_party/zlib/gzread.c +5 -7
  2147. data/third_party/zlib/gzwrite.c +25 -13
  2148. data/third_party/zlib/infback.c +2 -1
  2149. data/third_party/zlib/inffast.c +14 -14
  2150. data/third_party/zlib/inflate.c +39 -8
  2151. data/third_party/zlib/inflate.h +3 -2
  2152. data/third_party/zlib/inftrees.c +3 -3
  2153. data/third_party/zlib/trees.c +27 -48
  2154. data/third_party/zlib/zlib.h +123 -100
  2155. data/third_party/zlib/zutil.c +2 -2
  2156. data/third_party/zlib/zutil.h +12 -9
  2157. metadata +1175 -359
  2158. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +0 -45
  2159. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +0 -121
  2160. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +0 -938
  2161. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +0 -528
  2162. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +0 -834
  2163. data/src/core/ext/filters/client_channel/parse_address.cc +0 -238
  2164. data/src/core/ext/filters/client_channel/parse_address.h +0 -53
  2165. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +0 -484
  2166. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +0 -177
  2167. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +0 -68
  2168. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +0 -38
  2169. data/src/core/ext/filters/client_channel/resolver.cc +0 -85
  2170. data/src/core/ext/filters/client_channel/resolver.h +0 -144
  2171. data/src/core/ext/filters/client_channel/resolver_factory.h +0 -73
  2172. data/src/core/ext/filters/client_channel/resolver_registry.cc +0 -197
  2173. data/src/core/ext/filters/client_channel/resolver_registry.h +0 -89
  2174. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +0 -348
  2175. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +0 -123
  2176. data/src/core/ext/filters/client_channel/server_address.cc +0 -48
  2177. data/src/core/ext/filters/client_channel/server_address.h +0 -90
  2178. data/src/core/ext/filters/client_channel/service_config.cc +0 -221
  2179. data/src/core/ext/filters/client_channel/service_config.h +0 -123
  2180. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -68
  2181. data/src/core/ext/filters/client_channel/service_config_parser.cc +0 -87
  2182. data/src/core/ext/filters/client_channel/service_config_parser.h +0 -89
  2183. data/src/core/ext/filters/client_channel/xds/xds_api.cc +0 -1906
  2184. data/src/core/ext/filters/client_channel/xds/xds_api.h +0 -280
  2185. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +0 -342
  2186. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +0 -88
  2187. data/src/core/ext/filters/client_channel/xds/xds_channel.h +0 -46
  2188. data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +0 -26
  2189. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +0 -106
  2190. data/src/core/ext/filters/client_channel/xds/xds_client.cc +0 -2367
  2191. data/src/core/ext/filters/client_channel/xds/xds_client.h +0 -309
  2192. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +0 -115
  2193. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +0 -211
  2194. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -440
  2195. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -556
  2196. data/src/core/ext/filters/max_age/max_age_filter.h +0 -26
  2197. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -210
  2198. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +0 -27
  2199. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  2200. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  2201. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  2202. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  2203. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +0 -112
  2204. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +0 -79
  2205. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +0 -225
  2206. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +0 -45
  2207. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +0 -75
  2208. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +0 -86
  2209. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -37
  2210. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +0 -246
  2211. data/src/core/ext/transport/chttp2/transport/hpack_table.h +0 -148
  2212. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  2213. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  2214. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +0 -21
  2215. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +0 -35
  2216. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +0 -114
  2217. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +0 -418
  2218. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +0 -72
  2219. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +0 -197
  2220. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +0 -105
  2221. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +0 -378
  2222. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +0 -28
  2223. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +0 -53
  2224. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +0 -74
  2225. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +0 -218
  2226. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +0 -35
  2227. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.h +0 -69
  2228. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +0 -55
  2229. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.h +0 -305
  2230. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +0 -403
  2231. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +0 -1447
  2232. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +0 -112
  2233. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +0 -328
  2234. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +0 -35
  2235. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +0 -78
  2236. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +0 -313
  2237. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +0 -897
  2238. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +0 -96
  2239. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +0 -322
  2240. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +0 -34
  2241. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +0 -72
  2242. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +0 -197
  2243. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +0 -642
  2244. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +0 -172
  2245. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +0 -673
  2246. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +0 -36
  2247. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.h +0 -80
  2248. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +0 -152
  2249. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +0 -518
  2250. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +0 -34
  2251. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +0 -89
  2252. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +0 -129
  2253. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.h +0 -392
  2254. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +0 -31
  2255. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +0 -53
  2256. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +0 -18
  2257. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +0 -33
  2258. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +0 -91
  2259. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +0 -266
  2260. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +0 -112
  2261. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.h +0 -324
  2262. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +0 -92
  2263. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +0 -240
  2264. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +0 -31
  2265. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +0 -53
  2266. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +0 -18
  2267. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +0 -33
  2268. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +0 -145
  2269. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +0 -527
  2270. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +0 -43
  2271. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +0 -112
  2272. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +0 -109
  2273. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +0 -399
  2274. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +0 -30
  2275. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +0 -53
  2276. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +0 -18
  2277. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +0 -33
  2278. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +0 -815
  2279. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +0 -3032
  2280. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +0 -63
  2281. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +0 -199
  2282. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +0 -59
  2283. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +0 -134
  2284. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +0 -28
  2285. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +0 -53
  2286. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +0 -228
  2287. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +0 -725
  2288. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +0 -316
  2289. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +0 -1132
  2290. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +0 -33
  2291. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +0 -65
  2292. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +0 -51
  2293. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +0 -125
  2294. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +0 -24
  2295. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.h +0 -50
  2296. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +0 -54
  2297. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +0 -134
  2298. data/src/core/ext/upb-generated/envoy/type/http.upb.c +0 -17
  2299. data/src/core/ext/upb-generated/envoy/type/http.upb.h +0 -36
  2300. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +0 -63
  2301. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +0 -144
  2302. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +0 -53
  2303. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +0 -133
  2304. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +0 -88
  2305. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +0 -258
  2306. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +0 -39
  2307. data/src/core/ext/upb-generated/envoy/type/percent.upb.h +0 -87
  2308. data/src/core/ext/upb-generated/envoy/type/range.upb.c +0 -50
  2309. data/src/core/ext/upb-generated/envoy/type/range.upb.h +0 -112
  2310. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +0 -29
  2311. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +0 -62
  2312. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +0 -89
  2313. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +0 -249
  2314. data/src/core/ext/upb-generated/gogoproto/gogo.upb.c +0 -17
  2315. data/src/core/ext/upb-generated/gogoproto/gogo.upb.h +0 -30
  2316. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  2317. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -144
  2318. data/src/core/lib/avl/avl.cc +0 -306
  2319. data/src/core/lib/compression/algorithm_metadata.h +0 -61
  2320. data/src/core/lib/compression/compression_args.cc +0 -134
  2321. data/src/core/lib/compression/compression_args.h +0 -56
  2322. data/src/core/lib/compression/stream_compression.cc +0 -80
  2323. data/src/core/lib/compression/stream_compression.h +0 -116
  2324. data/src/core/lib/compression/stream_compression_gzip.cc +0 -230
  2325. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  2326. data/src/core/lib/compression/stream_compression_identity.cc +0 -92
  2327. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  2328. data/src/core/lib/gpr/arena.h +0 -47
  2329. data/src/core/lib/gpr/tls_gcc.h +0 -52
  2330. data/src/core/lib/gpr/tls_msvc.h +0 -52
  2331. data/src/core/lib/gpr/tls_pthread.cc +0 -30
  2332. data/src/core/lib/gpr/tls_pthread.h +0 -56
  2333. data/src/core/lib/gprpp/arena.cc +0 -103
  2334. data/src/core/lib/gprpp/arena.h +0 -120
  2335. data/src/core/lib/gprpp/atomic.h +0 -104
  2336. data/src/core/lib/gprpp/map.h +0 -53
  2337. data/src/core/lib/iomgr/endpoint_pair_uv.cc +0 -40
  2338. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1656
  2339. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  2340. data/src/core/lib/iomgr/iomgr_custom.cc +0 -79
  2341. data/src/core/lib/iomgr/iomgr_custom.h +0 -49
  2342. data/src/core/lib/iomgr/iomgr_posix.h +0 -26
  2343. data/src/core/lib/iomgr/iomgr_uv.cc +0 -43
  2344. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -105
  2345. data/src/core/lib/iomgr/is_epollexclusive_available.h +0 -36
  2346. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -87
  2347. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  2348. data/src/core/lib/iomgr/pollset_custom.cc +0 -106
  2349. data/src/core/lib/iomgr/pollset_custom.h +0 -35
  2350. data/src/core/lib/iomgr/pollset_set_custom.cc +0 -48
  2351. data/src/core/lib/iomgr/pollset_set_custom.h +0 -26
  2352. data/src/core/lib/iomgr/pollset_uv.cc +0 -93
  2353. data/src/core/lib/iomgr/pollset_uv.h +0 -32
  2354. data/src/core/lib/iomgr/resolve_address_custom.cc +0 -173
  2355. data/src/core/lib/iomgr/resolve_address_custom.h +0 -45
  2356. data/src/core/lib/iomgr/resource_quota.cc +0 -1013
  2357. data/src/core/lib/iomgr/resource_quota.h +0 -177
  2358. data/src/core/lib/iomgr/sockaddr_custom.h +0 -54
  2359. data/src/core/lib/iomgr/sockaddr_utils.cc +0 -293
  2360. data/src/core/lib/iomgr/sockaddr_utils.h +0 -79
  2361. data/src/core/lib/iomgr/socket_utils_uv.cc +0 -49
  2362. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
  2363. data/src/core/lib/iomgr/tcp_client_custom.cc +0 -163
  2364. data/src/core/lib/iomgr/tcp_custom.cc +0 -370
  2365. data/src/core/lib/iomgr/tcp_custom.h +0 -84
  2366. data/src/core/lib/iomgr/tcp_server_custom.cc +0 -485
  2367. data/src/core/lib/iomgr/tcp_uv.cc +0 -419
  2368. data/src/core/lib/iomgr/timer_custom.cc +0 -95
  2369. data/src/core/lib/iomgr/timer_custom.h +0 -43
  2370. data/src/core/lib/iomgr/timer_uv.cc +0 -66
  2371. data/src/core/lib/iomgr/udp_server.cc +0 -747
  2372. data/src/core/lib/iomgr/udp_server.h +0 -101
  2373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -62
  2374. data/src/core/lib/security/transport/target_authority_table.cc +0 -75
  2375. data/src/core/lib/security/transport/target_authority_table.h +0 -40
  2376. data/src/core/lib/slice/slice_hash_table.h +0 -199
  2377. data/src/core/lib/slice/slice_intern.cc +0 -375
  2378. data/src/core/lib/slice/slice_utils.h +0 -200
  2379. data/src/core/lib/slice/slice_weak_hash_table.h +0 -102
  2380. data/src/core/lib/surface/init_secure.cc +0 -81
  2381. data/src/core/lib/transport/metadata.cc +0 -679
  2382. data/src/core/lib/transport/metadata.h +0 -446
  2383. data/src/core/lib/transport/metadata_batch.cc +0 -392
  2384. data/src/core/lib/transport/static_metadata.cc +0 -1230
  2385. data/src/core/lib/transport/static_metadata.h +0 -597
  2386. data/src/core/lib/transport/status_metadata.cc +0 -61
  2387. data/src/core/lib/transport/status_metadata.h +0 -48
  2388. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +0 -129
  2389. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -218
  2390. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +0 -104
  2391. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  2392. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +0 -533
  2393. data/third_party/boringssl-with-bazel/src/crypto/dh/params.c +0 -93
  2394. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  2395. data/third_party/boringssl-with-bazel/src/crypto/x509/a_strex.c +0 -653
  2396. data/third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h +0 -71
  2397. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +0 -116
  2398. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
  2399. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_pku.c +0 -110
  2400. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_sxnet.c +0 -274
  2401. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +0 -3870
  2402. data/third_party/cares/cares/ares.h +0 -670
  2403. data/third_party/cares/cares/ares__close_sockets.c +0 -61
  2404. data/third_party/cares/cares/ares__get_hostent.c +0 -261
  2405. data/third_party/cares/cares/ares_create_query.c +0 -206
  2406. data/third_party/cares/cares/ares_data.c +0 -222
  2407. data/third_party/cares/cares/ares_data.h +0 -72
  2408. data/third_party/cares/cares/ares_dns.h +0 -103
  2409. data/third_party/cares/cares/ares_expand_name.c +0 -209
  2410. data/third_party/cares/cares/ares_expand_string.c +0 -70
  2411. data/third_party/cares/cares/ares_free_hostent.c +0 -41
  2412. data/third_party/cares/cares/ares_getenv.c +0 -30
  2413. data/third_party/cares/cares/ares_gethostbyaddr.c +0 -294
  2414. data/third_party/cares/cares/ares_gethostbyname.c +0 -529
  2415. data/third_party/cares/cares/ares_getnameinfo.c +0 -453
  2416. data/third_party/cares/cares/ares_getopt.c +0 -122
  2417. data/third_party/cares/cares/ares_getopt.h +0 -53
  2418. data/third_party/cares/cares/ares_init.c +0 -2615
  2419. data/third_party/cares/cares/ares_ipv6.h +0 -78
  2420. data/third_party/cares/cares/ares_library_init.c +0 -195
  2421. data/third_party/cares/cares/ares_library_init.h +0 -43
  2422. data/third_party/cares/cares/ares_parse_a_reply.c +0 -264
  2423. data/third_party/cares/cares/ares_parse_aaaa_reply.c +0 -264
  2424. data/third_party/cares/cares/ares_parse_mx_reply.c +0 -170
  2425. data/third_party/cares/cares/ares_parse_naptr_reply.c +0 -194
  2426. data/third_party/cares/cares/ares_parse_ns_reply.c +0 -183
  2427. data/third_party/cares/cares/ares_parse_ptr_reply.c +0 -221
  2428. data/third_party/cares/cares/ares_parse_soa_reply.c +0 -133
  2429. data/third_party/cares/cares/ares_parse_srv_reply.c +0 -179
  2430. data/third_party/cares/cares/ares_parse_txt_reply.c +0 -220
  2431. data/third_party/cares/cares/ares_private.h +0 -382
  2432. data/third_party/cares/cares/ares_process.c +0 -1473
  2433. data/third_party/cares/cares/ares_query.c +0 -186
  2434. data/third_party/cares/cares/ares_search.c +0 -323
  2435. data/third_party/cares/cares/ares_send.c +0 -137
  2436. data/third_party/cares/cares/ares_setup.h +0 -217
  2437. data/third_party/cares/cares/ares_strsplit.c +0 -174
  2438. data/third_party/cares/cares/ares_version.h +0 -24
  2439. data/third_party/cares/cares/inet_net_pton.c +0 -450
  2440. data/third_party/cares/cares/inet_ntop.c +0 -207
  2441. data/third_party/upb/upb/generated_util.h +0 -105
  2442. data/third_party/upb/upb/port.c +0 -26
  2443. data/third_party/upb/upb/table.int.h +0 -507
@@ -0,0 +1,2751 @@
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/mutex.h"
16
+
17
+ #ifdef _WIN32
18
+ #include <windows.h>
19
+ #ifdef ERROR
20
+ #undef ERROR
21
+ #endif
22
+ #else
23
+ #include <fcntl.h>
24
+ #include <pthread.h>
25
+ #include <sched.h>
26
+ #include <sys/time.h>
27
+ #endif
28
+
29
+ #include <assert.h>
30
+ #include <errno.h>
31
+ #include <stdio.h>
32
+ #include <stdlib.h>
33
+ #include <string.h>
34
+ #include <time.h>
35
+
36
+ #include <algorithm>
37
+ #include <atomic>
38
+ #include <cinttypes>
39
+ #include <thread> // NOLINT(build/c++11)
40
+
41
+ #include "absl/base/attributes.h"
42
+ #include "absl/base/call_once.h"
43
+ #include "absl/base/config.h"
44
+ #include "absl/base/dynamic_annotations.h"
45
+ #include "absl/base/internal/atomic_hook.h"
46
+ #include "absl/base/internal/cycleclock.h"
47
+ #include "absl/base/internal/hide_ptr.h"
48
+ #include "absl/base/internal/low_level_alloc.h"
49
+ #include "absl/base/internal/raw_logging.h"
50
+ #include "absl/base/internal/spinlock.h"
51
+ #include "absl/base/internal/sysinfo.h"
52
+ #include "absl/base/internal/thread_identity.h"
53
+ #include "absl/base/internal/tsan_mutex_interface.h"
54
+ #include "absl/base/port.h"
55
+ #include "absl/debugging/stacktrace.h"
56
+ #include "absl/debugging/symbolize.h"
57
+ #include "absl/synchronization/internal/graphcycles.h"
58
+ #include "absl/synchronization/internal/per_thread_sem.h"
59
+ #include "absl/time/time.h"
60
+
61
+ using absl::base_internal::CurrentThreadIdentityIfPresent;
62
+ using absl::base_internal::PerThreadSynch;
63
+ using absl::base_internal::SchedulingGuard;
64
+ using absl::base_internal::ThreadIdentity;
65
+ using absl::synchronization_internal::GetOrCreateCurrentThreadIdentity;
66
+ using absl::synchronization_internal::GraphCycles;
67
+ using absl::synchronization_internal::GraphId;
68
+ using absl::synchronization_internal::InvalidGraphId;
69
+ using absl::synchronization_internal::KernelTimeout;
70
+ using absl::synchronization_internal::PerThreadSem;
71
+
72
+ extern "C" {
73
+ ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)() {
74
+ std::this_thread::yield();
75
+ }
76
+ } // extern "C"
77
+
78
+ namespace absl {
79
+ ABSL_NAMESPACE_BEGIN
80
+
81
+ namespace {
82
+
83
+ #if defined(ABSL_HAVE_THREAD_SANITIZER)
84
+ constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kIgnore;
85
+ #else
86
+ constexpr OnDeadlockCycle kDeadlockDetectionDefault = OnDeadlockCycle::kAbort;
87
+ #endif
88
+
89
+ ABSL_CONST_INIT std::atomic<OnDeadlockCycle> synch_deadlock_detection(
90
+ kDeadlockDetectionDefault);
91
+ ABSL_CONST_INIT std::atomic<bool> synch_check_invariants(false);
92
+
93
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
94
+ absl::base_internal::AtomicHook<void (*)(int64_t wait_cycles)>
95
+ submit_profile_data;
96
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook<void (*)(
97
+ const char *msg, const void *obj, int64_t wait_cycles)>
98
+ mutex_tracer;
99
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
100
+ absl::base_internal::AtomicHook<void (*)(const char *msg, const void *cv)>
101
+ cond_var_tracer;
102
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook<
103
+ bool (*)(const void *pc, char *out, int out_size)>
104
+ symbolizer(absl::Symbolize);
105
+
106
+ } // namespace
107
+
108
+ static inline bool EvalConditionAnnotated(const Condition *cond, Mutex *mu,
109
+ bool locking, bool trylock,
110
+ bool read_lock);
111
+
112
+ void RegisterMutexProfiler(void (*fn)(int64_t wait_timestamp)) {
113
+ submit_profile_data.Store(fn);
114
+ }
115
+
116
+ void RegisterMutexTracer(void (*fn)(const char *msg, const void *obj,
117
+ int64_t wait_cycles)) {
118
+ mutex_tracer.Store(fn);
119
+ }
120
+
121
+ void RegisterCondVarTracer(void (*fn)(const char *msg, const void *cv)) {
122
+ cond_var_tracer.Store(fn);
123
+ }
124
+
125
+ void RegisterSymbolizer(bool (*fn)(const void *pc, char *out, int out_size)) {
126
+ symbolizer.Store(fn);
127
+ }
128
+
129
+ namespace {
130
+ // Represents the strategy for spin and yield.
131
+ // See the comment in GetMutexGlobals() for more information.
132
+ enum DelayMode { AGGRESSIVE, GENTLE };
133
+
134
+ struct ABSL_CACHELINE_ALIGNED MutexGlobals {
135
+ absl::once_flag once;
136
+ int spinloop_iterations = 0;
137
+ int32_t mutex_sleep_limit[2] = {};
138
+ };
139
+
140
+ const MutexGlobals &GetMutexGlobals() {
141
+ ABSL_CONST_INIT static MutexGlobals data;
142
+ absl::base_internal::LowLevelCallOnce(&data.once, [&]() {
143
+ const int num_cpus = absl::base_internal::NumCPUs();
144
+ data.spinloop_iterations = num_cpus > 1 ? 1500 : 0;
145
+ // If this a uniprocessor, only yield/sleep. Otherwise, if the mode is
146
+ // aggressive then spin many times before yielding. If the mode is
147
+ // gentle then spin only a few times before yielding. Aggressive spinning
148
+ // is used to ensure that an Unlock() call, which must get the spin lock
149
+ // for any thread to make progress gets it without undue delay.
150
+ if (num_cpus > 1) {
151
+ data.mutex_sleep_limit[AGGRESSIVE] = 5000;
152
+ data.mutex_sleep_limit[GENTLE] = 250;
153
+ } else {
154
+ data.mutex_sleep_limit[AGGRESSIVE] = 0;
155
+ data.mutex_sleep_limit[GENTLE] = 0;
156
+ }
157
+ });
158
+ return data;
159
+ }
160
+ } // namespace
161
+
162
+ namespace synchronization_internal {
163
+ // Returns the Mutex delay on iteration `c` depending on the given `mode`.
164
+ // The returned value should be used as `c` for the next call to `MutexDelay`.
165
+ int MutexDelay(int32_t c, int mode) {
166
+ const int32_t limit = GetMutexGlobals().mutex_sleep_limit[mode];
167
+ if (c < limit) {
168
+ // Spin.
169
+ c++;
170
+ } else {
171
+ SchedulingGuard::ScopedEnable enable_rescheduling;
172
+ ABSL_TSAN_MUTEX_PRE_DIVERT(nullptr, 0);
173
+ if (c == limit) {
174
+ // Yield once.
175
+ ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)();
176
+ c++;
177
+ } else {
178
+ // Then wait.
179
+ absl::SleepFor(absl::Microseconds(10));
180
+ c = 0;
181
+ }
182
+ ABSL_TSAN_MUTEX_POST_DIVERT(nullptr, 0);
183
+ }
184
+ return c;
185
+ }
186
+ } // namespace synchronization_internal
187
+
188
+ // --------------------------Generic atomic ops
189
+ // Ensure that "(*pv & bits) == bits" by doing an atomic update of "*pv" to
190
+ // "*pv | bits" if necessary. Wait until (*pv & wait_until_clear)==0
191
+ // before making any change.
192
+ // This is used to set flags in mutex and condition variable words.
193
+ static void AtomicSetBits(std::atomic<intptr_t>* pv, intptr_t bits,
194
+ intptr_t wait_until_clear) {
195
+ intptr_t v;
196
+ do {
197
+ v = pv->load(std::memory_order_relaxed);
198
+ } while ((v & bits) != bits &&
199
+ ((v & wait_until_clear) != 0 ||
200
+ !pv->compare_exchange_weak(v, v | bits,
201
+ std::memory_order_release,
202
+ std::memory_order_relaxed)));
203
+ }
204
+
205
+ // Ensure that "(*pv & bits) == 0" by doing an atomic update of "*pv" to
206
+ // "*pv & ~bits" if necessary. Wait until (*pv & wait_until_clear)==0
207
+ // before making any change.
208
+ // This is used to unset flags in mutex and condition variable words.
209
+ static void AtomicClearBits(std::atomic<intptr_t>* pv, intptr_t bits,
210
+ intptr_t wait_until_clear) {
211
+ intptr_t v;
212
+ do {
213
+ v = pv->load(std::memory_order_relaxed);
214
+ } while ((v & bits) != 0 &&
215
+ ((v & wait_until_clear) != 0 ||
216
+ !pv->compare_exchange_weak(v, v & ~bits,
217
+ std::memory_order_release,
218
+ std::memory_order_relaxed)));
219
+ }
220
+
221
+ //------------------------------------------------------------------
222
+
223
+ // Data for doing deadlock detection.
224
+ ABSL_CONST_INIT static absl::base_internal::SpinLock deadlock_graph_mu(
225
+ absl::kConstInit, base_internal::SCHEDULE_KERNEL_ONLY);
226
+
227
+ // Graph used to detect deadlocks.
228
+ ABSL_CONST_INIT static GraphCycles *deadlock_graph
229
+ ABSL_GUARDED_BY(deadlock_graph_mu) ABSL_PT_GUARDED_BY(deadlock_graph_mu);
230
+
231
+ //------------------------------------------------------------------
232
+ // An event mechanism for debugging mutex use.
233
+ // It also allows mutexes to be given names for those who can't handle
234
+ // addresses, and instead like to give their data structures names like
235
+ // "Henry", "Fido", or "Rupert IV, King of Yondavia".
236
+
237
+ namespace { // to prevent name pollution
238
+ enum { // Mutex and CondVar events passed as "ev" to PostSynchEvent
239
+ // Mutex events
240
+ SYNCH_EV_TRYLOCK_SUCCESS,
241
+ SYNCH_EV_TRYLOCK_FAILED,
242
+ SYNCH_EV_READERTRYLOCK_SUCCESS,
243
+ SYNCH_EV_READERTRYLOCK_FAILED,
244
+ SYNCH_EV_LOCK,
245
+ SYNCH_EV_LOCK_RETURNING,
246
+ SYNCH_EV_READERLOCK,
247
+ SYNCH_EV_READERLOCK_RETURNING,
248
+ SYNCH_EV_UNLOCK,
249
+ SYNCH_EV_READERUNLOCK,
250
+
251
+ // CondVar events
252
+ SYNCH_EV_WAIT,
253
+ SYNCH_EV_WAIT_RETURNING,
254
+ SYNCH_EV_SIGNAL,
255
+ SYNCH_EV_SIGNALALL,
256
+ };
257
+
258
+ enum { // Event flags
259
+ SYNCH_F_R = 0x01, // reader event
260
+ SYNCH_F_LCK = 0x02, // PostSynchEvent called with mutex held
261
+ SYNCH_F_TRY = 0x04, // TryLock or ReaderTryLock
262
+ SYNCH_F_UNLOCK = 0x08, // Unlock or ReaderUnlock
263
+
264
+ SYNCH_F_LCK_W = SYNCH_F_LCK,
265
+ SYNCH_F_LCK_R = SYNCH_F_LCK | SYNCH_F_R,
266
+ };
267
+ } // anonymous namespace
268
+
269
+ // Properties of the events.
270
+ static const struct {
271
+ int flags;
272
+ const char *msg;
273
+ } event_properties[] = {
274
+ {SYNCH_F_LCK_W | SYNCH_F_TRY, "TryLock succeeded "},
275
+ {0, "TryLock failed "},
276
+ {SYNCH_F_LCK_R | SYNCH_F_TRY, "ReaderTryLock succeeded "},
277
+ {0, "ReaderTryLock failed "},
278
+ {0, "Lock blocking "},
279
+ {SYNCH_F_LCK_W, "Lock returning "},
280
+ {0, "ReaderLock blocking "},
281
+ {SYNCH_F_LCK_R, "ReaderLock returning "},
282
+ {SYNCH_F_LCK_W | SYNCH_F_UNLOCK, "Unlock "},
283
+ {SYNCH_F_LCK_R | SYNCH_F_UNLOCK, "ReaderUnlock "},
284
+ {0, "Wait on "},
285
+ {0, "Wait unblocked "},
286
+ {0, "Signal on "},
287
+ {0, "SignalAll on "},
288
+ };
289
+
290
+ ABSL_CONST_INIT static absl::base_internal::SpinLock synch_event_mu(
291
+ absl::kConstInit, base_internal::SCHEDULE_KERNEL_ONLY);
292
+
293
+ // Hash table size; should be prime > 2.
294
+ // Can't be too small, as it's used for deadlock detection information.
295
+ static constexpr uint32_t kNSynchEvent = 1031;
296
+
297
+ static struct SynchEvent { // this is a trivial hash table for the events
298
+ // struct is freed when refcount reaches 0
299
+ int refcount ABSL_GUARDED_BY(synch_event_mu);
300
+
301
+ // buckets have linear, 0-terminated chains
302
+ SynchEvent *next ABSL_GUARDED_BY(synch_event_mu);
303
+
304
+ // Constant after initialization
305
+ uintptr_t masked_addr; // object at this address is called "name"
306
+
307
+ // No explicit synchronization used. Instead we assume that the
308
+ // client who enables/disables invariants/logging on a Mutex does so
309
+ // while the Mutex is not being concurrently accessed by others.
310
+ void (*invariant)(void *arg); // called on each event
311
+ void *arg; // first arg to (*invariant)()
312
+ bool log; // logging turned on
313
+
314
+ // Constant after initialization
315
+ char name[1]; // actually longer---NUL-terminated string
316
+ } * synch_event[kNSynchEvent] ABSL_GUARDED_BY(synch_event_mu);
317
+
318
+ // Ensure that the object at "addr" has a SynchEvent struct associated with it,
319
+ // set "bits" in the word there (waiting until lockbit is clear before doing
320
+ // so), and return a refcounted reference that will remain valid until
321
+ // UnrefSynchEvent() is called. If a new SynchEvent is allocated,
322
+ // the string name is copied into it.
323
+ // When used with a mutex, the caller should also ensure that kMuEvent
324
+ // is set in the mutex word, and similarly for condition variables and kCVEvent.
325
+ static SynchEvent *EnsureSynchEvent(std::atomic<intptr_t> *addr,
326
+ const char *name, intptr_t bits,
327
+ intptr_t lockbit) {
328
+ uint32_t h = reinterpret_cast<intptr_t>(addr) % kNSynchEvent;
329
+ SynchEvent *e;
330
+ // first look for existing SynchEvent struct..
331
+ synch_event_mu.Lock();
332
+ for (e = synch_event[h];
333
+ e != nullptr && e->masked_addr != base_internal::HidePtr(addr);
334
+ e = e->next) {
335
+ }
336
+ if (e == nullptr) { // no SynchEvent struct found; make one.
337
+ if (name == nullptr) {
338
+ name = "";
339
+ }
340
+ size_t l = strlen(name);
341
+ e = reinterpret_cast<SynchEvent *>(
342
+ base_internal::LowLevelAlloc::Alloc(sizeof(*e) + l));
343
+ e->refcount = 2; // one for return value, one for linked list
344
+ e->masked_addr = base_internal::HidePtr(addr);
345
+ e->invariant = nullptr;
346
+ e->arg = nullptr;
347
+ e->log = false;
348
+ strcpy(e->name, name); // NOLINT(runtime/printf)
349
+ e->next = synch_event[h];
350
+ AtomicSetBits(addr, bits, lockbit);
351
+ synch_event[h] = e;
352
+ } else {
353
+ e->refcount++; // for return value
354
+ }
355
+ synch_event_mu.Unlock();
356
+ return e;
357
+ }
358
+
359
+ // Deallocate the SynchEvent *e, whose refcount has fallen to zero.
360
+ static void DeleteSynchEvent(SynchEvent *e) {
361
+ base_internal::LowLevelAlloc::Free(e);
362
+ }
363
+
364
+ // Decrement the reference count of *e, or do nothing if e==null.
365
+ static void UnrefSynchEvent(SynchEvent *e) {
366
+ if (e != nullptr) {
367
+ synch_event_mu.Lock();
368
+ bool del = (--(e->refcount) == 0);
369
+ synch_event_mu.Unlock();
370
+ if (del) {
371
+ DeleteSynchEvent(e);
372
+ }
373
+ }
374
+ }
375
+
376
+ // Forget the mapping from the object (Mutex or CondVar) at address addr
377
+ // to SynchEvent object, and clear "bits" in its word (waiting until lockbit
378
+ // is clear before doing so).
379
+ static void ForgetSynchEvent(std::atomic<intptr_t> *addr, intptr_t bits,
380
+ intptr_t lockbit) {
381
+ uint32_t h = reinterpret_cast<intptr_t>(addr) % kNSynchEvent;
382
+ SynchEvent **pe;
383
+ SynchEvent *e;
384
+ synch_event_mu.Lock();
385
+ for (pe = &synch_event[h];
386
+ (e = *pe) != nullptr && e->masked_addr != base_internal::HidePtr(addr);
387
+ pe = &e->next) {
388
+ }
389
+ bool del = false;
390
+ if (e != nullptr) {
391
+ *pe = e->next;
392
+ del = (--(e->refcount) == 0);
393
+ }
394
+ AtomicClearBits(addr, bits, lockbit);
395
+ synch_event_mu.Unlock();
396
+ if (del) {
397
+ DeleteSynchEvent(e);
398
+ }
399
+ }
400
+
401
+ // Return a refcounted reference to the SynchEvent of the object at address
402
+ // "addr", if any. The pointer returned is valid until the UnrefSynchEvent() is
403
+ // called.
404
+ static SynchEvent *GetSynchEvent(const void *addr) {
405
+ uint32_t h = reinterpret_cast<intptr_t>(addr) % kNSynchEvent;
406
+ SynchEvent *e;
407
+ synch_event_mu.Lock();
408
+ for (e = synch_event[h];
409
+ e != nullptr && e->masked_addr != base_internal::HidePtr(addr);
410
+ e = e->next) {
411
+ }
412
+ if (e != nullptr) {
413
+ e->refcount++;
414
+ }
415
+ synch_event_mu.Unlock();
416
+ return e;
417
+ }
418
+
419
+ // Called when an event "ev" occurs on a Mutex of CondVar "obj"
420
+ // if event recording is on
421
+ static void PostSynchEvent(void *obj, int ev) {
422
+ SynchEvent *e = GetSynchEvent(obj);
423
+ // logging is on if event recording is on and either there's no event struct,
424
+ // or it explicitly says to log
425
+ if (e == nullptr || e->log) {
426
+ void *pcs[40];
427
+ int n = absl::GetStackTrace(pcs, ABSL_ARRAYSIZE(pcs), 1);
428
+ // A buffer with enough space for the ASCII for all the PCs, even on a
429
+ // 64-bit machine.
430
+ char buffer[ABSL_ARRAYSIZE(pcs) * 24];
431
+ int pos = snprintf(buffer, sizeof (buffer), " @");
432
+ for (int i = 0; i != n; i++) {
433
+ pos += snprintf(&buffer[pos], sizeof (buffer) - pos, " %p", pcs[i]);
434
+ }
435
+ ABSL_RAW_LOG(INFO, "%s%p %s %s", event_properties[ev].msg, obj,
436
+ (e == nullptr ? "" : e->name), buffer);
437
+ }
438
+ const int flags = event_properties[ev].flags;
439
+ if ((flags & SYNCH_F_LCK) != 0 && e != nullptr && e->invariant != nullptr) {
440
+ // Calling the invariant as is causes problems under ThreadSanitizer.
441
+ // We are currently inside of Mutex Lock/Unlock and are ignoring all
442
+ // memory accesses and synchronization. If the invariant transitively
443
+ // synchronizes something else and we ignore the synchronization, we will
444
+ // get false positive race reports later.
445
+ // Reuse EvalConditionAnnotated to properly call into user code.
446
+ struct local {
447
+ static bool pred(SynchEvent *ev) {
448
+ (*ev->invariant)(ev->arg);
449
+ return false;
450
+ }
451
+ };
452
+ Condition cond(&local::pred, e);
453
+ Mutex *mu = static_cast<Mutex *>(obj);
454
+ const bool locking = (flags & SYNCH_F_UNLOCK) == 0;
455
+ const bool trylock = (flags & SYNCH_F_TRY) != 0;
456
+ const bool read_lock = (flags & SYNCH_F_R) != 0;
457
+ EvalConditionAnnotated(&cond, mu, locking, trylock, read_lock);
458
+ }
459
+ UnrefSynchEvent(e);
460
+ }
461
+
462
+ //------------------------------------------------------------------
463
+
464
+ // The SynchWaitParams struct encapsulates the way in which a thread is waiting:
465
+ // whether it has a timeout, the condition, exclusive/shared, and whether a
466
+ // condition variable wait has an associated Mutex (as opposed to another
467
+ // type of lock). It also points to the PerThreadSynch struct of its thread.
468
+ // cv_word tells Enqueue() to enqueue on a CondVar using CondVarEnqueue().
469
+ //
470
+ // This structure is held on the stack rather than directly in
471
+ // PerThreadSynch because a thread can be waiting on multiple Mutexes if,
472
+ // while waiting on one Mutex, the implementation calls a client callback
473
+ // (such as a Condition function) that acquires another Mutex. We don't
474
+ // strictly need to allow this, but programmers become confused if we do not
475
+ // allow them to use functions such a LOG() within Condition functions. The
476
+ // PerThreadSynch struct points at the most recent SynchWaitParams struct when
477
+ // the thread is on a Mutex's waiter queue.
478
+ struct SynchWaitParams {
479
+ SynchWaitParams(Mutex::MuHow how_arg, const Condition *cond_arg,
480
+ KernelTimeout timeout_arg, Mutex *cvmu_arg,
481
+ PerThreadSynch *thread_arg,
482
+ std::atomic<intptr_t> *cv_word_arg)
483
+ : how(how_arg),
484
+ cond(cond_arg),
485
+ timeout(timeout_arg),
486
+ cvmu(cvmu_arg),
487
+ thread(thread_arg),
488
+ cv_word(cv_word_arg),
489
+ contention_start_cycles(base_internal::CycleClock::Now()) {}
490
+
491
+ const Mutex::MuHow how; // How this thread needs to wait.
492
+ const Condition *cond; // The condition that this thread is waiting for.
493
+ // In Mutex, this field is set to zero if a timeout
494
+ // expires.
495
+ KernelTimeout timeout; // timeout expiry---absolute time
496
+ // In Mutex, this field is set to zero if a timeout
497
+ // expires.
498
+ Mutex *const cvmu; // used for transfer from cond var to mutex
499
+ PerThreadSynch *const thread; // thread that is waiting
500
+
501
+ // If not null, thread should be enqueued on the CondVar whose state
502
+ // word is cv_word instead of queueing normally on the Mutex.
503
+ std::atomic<intptr_t> *cv_word;
504
+
505
+ int64_t contention_start_cycles; // Time (in cycles) when this thread started
506
+ // to contend for the mutex.
507
+ };
508
+
509
+ struct SynchLocksHeld {
510
+ int n; // number of valid entries in locks[]
511
+ bool overflow; // true iff we overflowed the array at some point
512
+ struct {
513
+ Mutex *mu; // lock acquired
514
+ int32_t count; // times acquired
515
+ GraphId id; // deadlock_graph id of acquired lock
516
+ } locks[40];
517
+ // If a thread overfills the array during deadlock detection, we
518
+ // continue, discarding information as needed. If no overflow has
519
+ // taken place, we can provide more error checking, such as
520
+ // detecting when a thread releases a lock it does not hold.
521
+ };
522
+
523
+ // A sentinel value in lists that is not 0.
524
+ // A 0 value is used to mean "not on a list".
525
+ static PerThreadSynch *const kPerThreadSynchNull =
526
+ reinterpret_cast<PerThreadSynch *>(1);
527
+
528
+ static SynchLocksHeld *LocksHeldAlloc() {
529
+ SynchLocksHeld *ret = reinterpret_cast<SynchLocksHeld *>(
530
+ base_internal::LowLevelAlloc::Alloc(sizeof(SynchLocksHeld)));
531
+ ret->n = 0;
532
+ ret->overflow = false;
533
+ return ret;
534
+ }
535
+
536
+ // Return the PerThreadSynch-struct for this thread.
537
+ static PerThreadSynch *Synch_GetPerThread() {
538
+ ThreadIdentity *identity = GetOrCreateCurrentThreadIdentity();
539
+ return &identity->per_thread_synch;
540
+ }
541
+
542
+ static PerThreadSynch *Synch_GetPerThreadAnnotated(Mutex *mu) {
543
+ if (mu) {
544
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
545
+ }
546
+ PerThreadSynch *w = Synch_GetPerThread();
547
+ if (mu) {
548
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
549
+ }
550
+ return w;
551
+ }
552
+
553
+ static SynchLocksHeld *Synch_GetAllLocks() {
554
+ PerThreadSynch *s = Synch_GetPerThread();
555
+ if (s->all_locks == nullptr) {
556
+ s->all_locks = LocksHeldAlloc(); // Freed by ReclaimThreadIdentity.
557
+ }
558
+ return s->all_locks;
559
+ }
560
+
561
+ // Post on "w"'s associated PerThreadSem.
562
+ void Mutex::IncrementSynchSem(Mutex *mu, PerThreadSynch *w) {
563
+ if (mu) {
564
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
565
+ }
566
+ PerThreadSem::Post(w->thread_identity());
567
+ if (mu) {
568
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
569
+ }
570
+ }
571
+
572
+ // Wait on "w"'s associated PerThreadSem; returns false if timeout expired.
573
+ bool Mutex::DecrementSynchSem(Mutex *mu, PerThreadSynch *w, KernelTimeout t) {
574
+ if (mu) {
575
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
576
+ }
577
+ assert(w == Synch_GetPerThread());
578
+ static_cast<void>(w);
579
+ bool res = PerThreadSem::Wait(t);
580
+ if (mu) {
581
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
582
+ }
583
+ return res;
584
+ }
585
+
586
+ // We're in a fatal signal handler that hopes to use Mutex and to get
587
+ // lucky by not deadlocking. We try to improve its chances of success
588
+ // by effectively disabling some of the consistency checks. This will
589
+ // prevent certain ABSL_RAW_CHECK() statements from being triggered when
590
+ // re-rentry is detected. The ABSL_RAW_CHECK() statements are those in the
591
+ // Mutex code checking that the "waitp" field has not been reused.
592
+ void Mutex::InternalAttemptToUseMutexInFatalSignalHandler() {
593
+ // Fix the per-thread state only if it exists.
594
+ ThreadIdentity *identity = CurrentThreadIdentityIfPresent();
595
+ if (identity != nullptr) {
596
+ identity->per_thread_synch.suppress_fatal_errors = true;
597
+ }
598
+ // Don't do deadlock detection when we are already failing.
599
+ synch_deadlock_detection.store(OnDeadlockCycle::kIgnore,
600
+ std::memory_order_release);
601
+ }
602
+
603
+ // --------------------------time support
604
+
605
+ // Return the current time plus the timeout. Use the same clock as
606
+ // PerThreadSem::Wait() for consistency. Unfortunately, we don't have
607
+ // such a choice when a deadline is given directly.
608
+ static absl::Time DeadlineFromTimeout(absl::Duration timeout) {
609
+ #ifndef _WIN32
610
+ struct timeval tv;
611
+ gettimeofday(&tv, nullptr);
612
+ return absl::TimeFromTimeval(tv) + timeout;
613
+ #else
614
+ return absl::Now() + timeout;
615
+ #endif
616
+ }
617
+
618
+ // --------------------------Mutexes
619
+
620
+ // In the layout below, the msb of the bottom byte is currently unused. Also,
621
+ // the following constraints were considered in choosing the layout:
622
+ // o Both the debug allocator's "uninitialized" and "freed" patterns (0xab and
623
+ // 0xcd) are illegal: reader and writer lock both held.
624
+ // o kMuWriter and kMuEvent should exceed kMuDesig and kMuWait, to enable the
625
+ // bit-twiddling trick in Mutex::Unlock().
626
+ // o kMuWriter / kMuReader == kMuWrWait / kMuWait,
627
+ // to enable the bit-twiddling trick in CheckForMutexCorruption().
628
+ static const intptr_t kMuReader = 0x0001L; // a reader holds the lock
629
+ static const intptr_t kMuDesig = 0x0002L; // there's a designated waker
630
+ static const intptr_t kMuWait = 0x0004L; // threads are waiting
631
+ static const intptr_t kMuWriter = 0x0008L; // a writer holds the lock
632
+ static const intptr_t kMuEvent = 0x0010L; // record this mutex's events
633
+ // INVARIANT1: there's a thread that was blocked on the mutex, is
634
+ // no longer, yet has not yet acquired the mutex. If there's a
635
+ // designated waker, all threads can avoid taking the slow path in
636
+ // unlock because the designated waker will subsequently acquire
637
+ // the lock and wake someone. To maintain INVARIANT1 the bit is
638
+ // set when a thread is unblocked(INV1a), and threads that were
639
+ // unblocked reset the bit when they either acquire or re-block
640
+ // (INV1b).
641
+ static const intptr_t kMuWrWait = 0x0020L; // runnable writer is waiting
642
+ // for a reader
643
+ static const intptr_t kMuSpin = 0x0040L; // spinlock protects wait list
644
+ static const intptr_t kMuLow = 0x00ffL; // mask all mutex bits
645
+ static const intptr_t kMuHigh = ~kMuLow; // mask pointer/reader count
646
+
647
+ // Hack to make constant values available to gdb pretty printer
648
+ enum {
649
+ kGdbMuSpin = kMuSpin,
650
+ kGdbMuEvent = kMuEvent,
651
+ kGdbMuWait = kMuWait,
652
+ kGdbMuWriter = kMuWriter,
653
+ kGdbMuDesig = kMuDesig,
654
+ kGdbMuWrWait = kMuWrWait,
655
+ kGdbMuReader = kMuReader,
656
+ kGdbMuLow = kMuLow,
657
+ };
658
+
659
+ // kMuWrWait implies kMuWait.
660
+ // kMuReader and kMuWriter are mutually exclusive.
661
+ // If kMuReader is zero, there are no readers.
662
+ // Otherwise, if kMuWait is zero, the high order bits contain a count of the
663
+ // number of readers. Otherwise, the reader count is held in
664
+ // PerThreadSynch::readers of the most recently queued waiter, again in the
665
+ // bits above kMuLow.
666
+ static const intptr_t kMuOne = 0x0100; // a count of one reader
667
+
668
+ // flags passed to Enqueue and LockSlow{,WithTimeout,Loop}
669
+ static const int kMuHasBlocked = 0x01; // already blocked (MUST == 1)
670
+ static const int kMuIsCond = 0x02; // conditional waiter (CV or Condition)
671
+
672
+ static_assert(PerThreadSynch::kAlignment > kMuLow,
673
+ "PerThreadSynch::kAlignment must be greater than kMuLow");
674
+
675
+ // This struct contains various bitmasks to be used in
676
+ // acquiring and releasing a mutex in a particular mode.
677
+ struct MuHowS {
678
+ // if all the bits in fast_need_zero are zero, the lock can be acquired by
679
+ // adding fast_add and oring fast_or. The bit kMuDesig should be reset iff
680
+ // this is the designated waker.
681
+ intptr_t fast_need_zero;
682
+ intptr_t fast_or;
683
+ intptr_t fast_add;
684
+
685
+ intptr_t slow_need_zero; // fast_need_zero with events (e.g. logging)
686
+
687
+ intptr_t slow_inc_need_zero; // if all the bits in slow_inc_need_zero are
688
+ // zero a reader can acquire a read share by
689
+ // setting the reader bit and incrementing
690
+ // the reader count (in last waiter since
691
+ // we're now slow-path). kMuWrWait be may
692
+ // be ignored if we already waited once.
693
+ };
694
+
695
+ static const MuHowS kSharedS = {
696
+ // shared or read lock
697
+ kMuWriter | kMuWait | kMuEvent, // fast_need_zero
698
+ kMuReader, // fast_or
699
+ kMuOne, // fast_add
700
+ kMuWriter | kMuWait, // slow_need_zero
701
+ kMuSpin | kMuWriter | kMuWrWait, // slow_inc_need_zero
702
+ };
703
+ static const MuHowS kExclusiveS = {
704
+ // exclusive or write lock
705
+ kMuWriter | kMuReader | kMuEvent, // fast_need_zero
706
+ kMuWriter, // fast_or
707
+ 0, // fast_add
708
+ kMuWriter | kMuReader, // slow_need_zero
709
+ ~static_cast<intptr_t>(0), // slow_inc_need_zero
710
+ };
711
+ static const Mutex::MuHow kShared = &kSharedS; // shared lock
712
+ static const Mutex::MuHow kExclusive = &kExclusiveS; // exclusive lock
713
+
714
+ #ifdef NDEBUG
715
+ static constexpr bool kDebugMode = false;
716
+ #else
717
+ static constexpr bool kDebugMode = true;
718
+ #endif
719
+
720
+ #ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE
721
+ static unsigned TsanFlags(Mutex::MuHow how) {
722
+ return how == kShared ? __tsan_mutex_read_lock : 0;
723
+ }
724
+ #endif
725
+
726
+ static bool DebugOnlyIsExiting() {
727
+ return false;
728
+ }
729
+
730
+ Mutex::~Mutex() {
731
+ intptr_t v = mu_.load(std::memory_order_relaxed);
732
+ if ((v & kMuEvent) != 0 && !DebugOnlyIsExiting()) {
733
+ ForgetSynchEvent(&this->mu_, kMuEvent, kMuSpin);
734
+ }
735
+ if (kDebugMode) {
736
+ this->ForgetDeadlockInfo();
737
+ }
738
+ ABSL_TSAN_MUTEX_DESTROY(this, __tsan_mutex_not_static);
739
+ }
740
+
741
+ void Mutex::EnableDebugLog(const char *name) {
742
+ SynchEvent *e = EnsureSynchEvent(&this->mu_, name, kMuEvent, kMuSpin);
743
+ e->log = true;
744
+ UnrefSynchEvent(e);
745
+ }
746
+
747
+ void EnableMutexInvariantDebugging(bool enabled) {
748
+ synch_check_invariants.store(enabled, std::memory_order_release);
749
+ }
750
+
751
+ void Mutex::EnableInvariantDebugging(void (*invariant)(void *),
752
+ void *arg) {
753
+ if (synch_check_invariants.load(std::memory_order_acquire) &&
754
+ invariant != nullptr) {
755
+ SynchEvent *e = EnsureSynchEvent(&this->mu_, nullptr, kMuEvent, kMuSpin);
756
+ e->invariant = invariant;
757
+ e->arg = arg;
758
+ UnrefSynchEvent(e);
759
+ }
760
+ }
761
+
762
+ void SetMutexDeadlockDetectionMode(OnDeadlockCycle mode) {
763
+ synch_deadlock_detection.store(mode, std::memory_order_release);
764
+ }
765
+
766
+ // Return true iff threads x and y are part of the same equivalence
767
+ // class of waiters. An equivalence class is defined as the set of
768
+ // waiters with the same condition, type of lock, and thread priority.
769
+ //
770
+ // Requires that x and y be waiting on the same Mutex queue.
771
+ static bool MuEquivalentWaiter(PerThreadSynch *x, PerThreadSynch *y) {
772
+ return x->waitp->how == y->waitp->how && x->priority == y->priority &&
773
+ Condition::GuaranteedEqual(x->waitp->cond, y->waitp->cond);
774
+ }
775
+
776
+ // Given the contents of a mutex word containing a PerThreadSynch pointer,
777
+ // return the pointer.
778
+ static inline PerThreadSynch *GetPerThreadSynch(intptr_t v) {
779
+ return reinterpret_cast<PerThreadSynch *>(v & kMuHigh);
780
+ }
781
+
782
+ // The next several routines maintain the per-thread next and skip fields
783
+ // used in the Mutex waiter queue.
784
+ // The queue is a circular singly-linked list, of which the "head" is the
785
+ // last element, and head->next if the first element.
786
+ // The skip field has the invariant:
787
+ // For thread x, x->skip is one of:
788
+ // - invalid (iff x is not in a Mutex wait queue),
789
+ // - null, or
790
+ // - a pointer to a distinct thread waiting later in the same Mutex queue
791
+ // such that all threads in [x, x->skip] have the same condition, priority
792
+ // and lock type (MuEquivalentWaiter() is true for all pairs in [x,
793
+ // x->skip]).
794
+ // In addition, if x->skip is valid, (x->may_skip || x->skip == null)
795
+ //
796
+ // By the spec of MuEquivalentWaiter(), it is not necessary when removing the
797
+ // first runnable thread y from the front a Mutex queue to adjust the skip
798
+ // field of another thread x because if x->skip==y, x->skip must (have) become
799
+ // invalid before y is removed. The function TryRemove can remove a specified
800
+ // thread from an arbitrary position in the queue whether runnable or not, so
801
+ // it fixes up skip fields that would otherwise be left dangling.
802
+ // The statement
803
+ // if (x->may_skip && MuEquivalentWaiter(x, x->next)) { x->skip = x->next; }
804
+ // maintains the invariant provided x is not the last waiter in a Mutex queue
805
+ // The statement
806
+ // if (x->skip != null) { x->skip = x->skip->skip; }
807
+ // maintains the invariant.
808
+
809
+ // Returns the last thread y in a mutex waiter queue such that all threads in
810
+ // [x, y] inclusive share the same condition. Sets skip fields of some threads
811
+ // in that range to optimize future evaluation of Skip() on x values in
812
+ // the range. Requires thread x is in a mutex waiter queue.
813
+ // The locking is unusual. Skip() is called under these conditions:
814
+ // - spinlock is held in call from Enqueue(), with maybe_unlocking == false
815
+ // - Mutex is held in call from UnlockSlow() by last unlocker, with
816
+ // maybe_unlocking == true
817
+ // - both Mutex and spinlock are held in call from DequeueAllWakeable() (from
818
+ // UnlockSlow()) and TryRemove()
819
+ // These cases are mutually exclusive, so Skip() never runs concurrently
820
+ // with itself on the same Mutex. The skip chain is used in these other places
821
+ // that cannot occur concurrently:
822
+ // - FixSkip() (from TryRemove()) - spinlock and Mutex are held)
823
+ // - Dequeue() (with spinlock and Mutex held)
824
+ // - UnlockSlow() (with spinlock and Mutex held)
825
+ // A more complex case is Enqueue()
826
+ // - Enqueue() (with spinlock held and maybe_unlocking == false)
827
+ // This is the first case in which Skip is called, above.
828
+ // - Enqueue() (without spinlock held; but queue is empty and being freshly
829
+ // formed)
830
+ // - Enqueue() (with spinlock held and maybe_unlocking == true)
831
+ // The first case has mutual exclusion, and the second isolation through
832
+ // working on an otherwise unreachable data structure.
833
+ // In the last case, Enqueue() is required to change no skip/next pointers
834
+ // except those in the added node and the former "head" node. This implies
835
+ // that the new node is added after head, and so must be the new head or the
836
+ // new front of the queue.
837
+ static PerThreadSynch *Skip(PerThreadSynch *x) {
838
+ PerThreadSynch *x0 = nullptr;
839
+ PerThreadSynch *x1 = x;
840
+ PerThreadSynch *x2 = x->skip;
841
+ if (x2 != nullptr) {
842
+ // Each iteration attempts to advance sequence (x0,x1,x2) to next sequence
843
+ // such that x1 == x0->skip && x2 == x1->skip
844
+ while ((x0 = x1, x1 = x2, x2 = x2->skip) != nullptr) {
845
+ x0->skip = x2; // short-circuit skip from x0 to x2
846
+ }
847
+ x->skip = x1; // short-circuit skip from x to result
848
+ }
849
+ return x1;
850
+ }
851
+
852
+ // "ancestor" appears before "to_be_removed" in the same Mutex waiter queue.
853
+ // The latter is going to be removed out of order, because of a timeout.
854
+ // Check whether "ancestor" has a skip field pointing to "to_be_removed",
855
+ // and fix it if it does.
856
+ static void FixSkip(PerThreadSynch *ancestor, PerThreadSynch *to_be_removed) {
857
+ if (ancestor->skip == to_be_removed) { // ancestor->skip left dangling
858
+ if (to_be_removed->skip != nullptr) {
859
+ ancestor->skip = to_be_removed->skip; // can skip past to_be_removed
860
+ } else if (ancestor->next != to_be_removed) { // they are not adjacent
861
+ ancestor->skip = ancestor->next; // can skip one past ancestor
862
+ } else {
863
+ ancestor->skip = nullptr; // can't skip at all
864
+ }
865
+ }
866
+ }
867
+
868
+ static void CondVarEnqueue(SynchWaitParams *waitp);
869
+
870
+ // Enqueue thread "waitp->thread" on a waiter queue.
871
+ // Called with mutex spinlock held if head != nullptr
872
+ // If head==nullptr and waitp->cv_word==nullptr, then Enqueue() is
873
+ // idempotent; it alters no state associated with the existing (empty)
874
+ // queue.
875
+ //
876
+ // If waitp->cv_word == nullptr, queue the thread at either the front or
877
+ // the end (according to its priority) of the circular mutex waiter queue whose
878
+ // head is "head", and return the new head. mu is the previous mutex state,
879
+ // which contains the reader count (perhaps adjusted for the operation in
880
+ // progress) if the list was empty and a read lock held, and the holder hint if
881
+ // the list was empty and a write lock held. (flags & kMuIsCond) indicates
882
+ // whether this thread was transferred from a CondVar or is waiting for a
883
+ // non-trivial condition. In this case, Enqueue() never returns nullptr
884
+ //
885
+ // If waitp->cv_word != nullptr, CondVarEnqueue() is called, and "head" is
886
+ // returned. This mechanism is used by CondVar to queue a thread on the
887
+ // condition variable queue instead of the mutex queue in implementing Wait().
888
+ // In this case, Enqueue() can return nullptr (if head==nullptr).
889
+ static PerThreadSynch *Enqueue(PerThreadSynch *head,
890
+ SynchWaitParams *waitp, intptr_t mu, int flags) {
891
+ // If we have been given a cv_word, call CondVarEnqueue() and return
892
+ // the previous head of the Mutex waiter queue.
893
+ if (waitp->cv_word != nullptr) {
894
+ CondVarEnqueue(waitp);
895
+ return head;
896
+ }
897
+
898
+ PerThreadSynch *s = waitp->thread;
899
+ ABSL_RAW_CHECK(
900
+ s->waitp == nullptr || // normal case
901
+ s->waitp == waitp || // Fer()---transfer from condition variable
902
+ s->suppress_fatal_errors,
903
+ "detected illegal recursion into Mutex code");
904
+ s->waitp = waitp;
905
+ s->skip = nullptr; // maintain skip invariant (see above)
906
+ s->may_skip = true; // always true on entering queue
907
+ s->wake = false; // not being woken
908
+ s->cond_waiter = ((flags & kMuIsCond) != 0);
909
+ if (head == nullptr) { // s is the only waiter
910
+ s->next = s; // it's the only entry in the cycle
911
+ s->readers = mu; // reader count is from mu word
912
+ s->maybe_unlocking = false; // no one is searching an empty list
913
+ head = s; // s is new head
914
+ } else {
915
+ PerThreadSynch *enqueue_after = nullptr; // we'll put s after this element
916
+ #ifdef ABSL_HAVE_PTHREAD_GETSCHEDPARAM
917
+ int64_t now_cycles = base_internal::CycleClock::Now();
918
+ if (s->next_priority_read_cycles < now_cycles) {
919
+ // Every so often, update our idea of the thread's priority.
920
+ // pthread_getschedparam() is 5% of the block/wakeup time;
921
+ // base_internal::CycleClock::Now() is 0.5%.
922
+ int policy;
923
+ struct sched_param param;
924
+ const int err = pthread_getschedparam(pthread_self(), &policy, &param);
925
+ if (err != 0) {
926
+ ABSL_RAW_LOG(ERROR, "pthread_getschedparam failed: %d", err);
927
+ } else {
928
+ s->priority = param.sched_priority;
929
+ s->next_priority_read_cycles =
930
+ now_cycles +
931
+ static_cast<int64_t>(base_internal::CycleClock::Frequency());
932
+ }
933
+ }
934
+ if (s->priority > head->priority) { // s's priority is above head's
935
+ // try to put s in priority-fifo order, or failing that at the front.
936
+ if (!head->maybe_unlocking) {
937
+ // No unlocker can be scanning the queue, so we can insert into the
938
+ // middle of the queue.
939
+ //
940
+ // Within a skip chain, all waiters have the same priority, so we can
941
+ // skip forward through the chains until we find one with a lower
942
+ // priority than the waiter to be enqueued.
943
+ PerThreadSynch *advance_to = head; // next value of enqueue_after
944
+ do {
945
+ enqueue_after = advance_to;
946
+ // (side-effect: optimizes skip chain)
947
+ advance_to = Skip(enqueue_after->next);
948
+ } while (s->priority <= advance_to->priority);
949
+ // termination guaranteed because s->priority > head->priority
950
+ // and head is the end of a skip chain
951
+ } else if (waitp->how == kExclusive &&
952
+ Condition::GuaranteedEqual(waitp->cond, nullptr)) {
953
+ // An unlocker could be scanning the queue, but we know it will recheck
954
+ // the queue front for writers that have no condition, which is what s
955
+ // is, so an insert at front is safe.
956
+ enqueue_after = head; // add after head, at front
957
+ }
958
+ }
959
+ #endif
960
+ if (enqueue_after != nullptr) {
961
+ s->next = enqueue_after->next;
962
+ enqueue_after->next = s;
963
+
964
+ // enqueue_after can be: head, Skip(...), or cur.
965
+ // The first two imply enqueue_after->skip == nullptr, and
966
+ // the last is used only if MuEquivalentWaiter(s, cur).
967
+ // We require this because clearing enqueue_after->skip
968
+ // is impossible; enqueue_after's predecessors might also
969
+ // incorrectly skip over s if we were to allow other
970
+ // insertion points.
971
+ ABSL_RAW_CHECK(enqueue_after->skip == nullptr ||
972
+ MuEquivalentWaiter(enqueue_after, s),
973
+ "Mutex Enqueue failure");
974
+
975
+ if (enqueue_after != head && enqueue_after->may_skip &&
976
+ MuEquivalentWaiter(enqueue_after, enqueue_after->next)) {
977
+ // enqueue_after can skip to its new successor, s
978
+ enqueue_after->skip = enqueue_after->next;
979
+ }
980
+ if (MuEquivalentWaiter(s, s->next)) { // s->may_skip is known to be true
981
+ s->skip = s->next; // s may skip to its successor
982
+ }
983
+ } else { // enqueue not done any other way, so
984
+ // we're inserting s at the back
985
+ // s will become new head; copy data from head into it
986
+ s->next = head->next; // add s after head
987
+ head->next = s;
988
+ s->readers = head->readers; // reader count is from previous head
989
+ s->maybe_unlocking = head->maybe_unlocking; // same for unlock hint
990
+ if (head->may_skip && MuEquivalentWaiter(head, s)) {
991
+ // head now has successor; may skip
992
+ head->skip = s;
993
+ }
994
+ head = s; // s is new head
995
+ }
996
+ }
997
+ s->state.store(PerThreadSynch::kQueued, std::memory_order_relaxed);
998
+ return head;
999
+ }
1000
+
1001
+ // Dequeue the successor pw->next of thread pw from the Mutex waiter queue
1002
+ // whose last element is head. The new head element is returned, or null
1003
+ // if the list is made empty.
1004
+ // Dequeue is called with both spinlock and Mutex held.
1005
+ static PerThreadSynch *Dequeue(PerThreadSynch *head, PerThreadSynch *pw) {
1006
+ PerThreadSynch *w = pw->next;
1007
+ pw->next = w->next; // snip w out of list
1008
+ if (head == w) { // we removed the head
1009
+ head = (pw == w) ? nullptr : pw; // either emptied list, or pw is new head
1010
+ } else if (pw != head && MuEquivalentWaiter(pw, pw->next)) {
1011
+ // pw can skip to its new successor
1012
+ if (pw->next->skip !=
1013
+ nullptr) { // either skip to its successors skip target
1014
+ pw->skip = pw->next->skip;
1015
+ } else { // or to pw's successor
1016
+ pw->skip = pw->next;
1017
+ }
1018
+ }
1019
+ return head;
1020
+ }
1021
+
1022
+ // Traverse the elements [ pw->next, h] of the circular list whose last element
1023
+ // is head.
1024
+ // Remove all elements with wake==true and place them in the
1025
+ // singly-linked list wake_list in the order found. Assumes that
1026
+ // there is only one such element if the element has how == kExclusive.
1027
+ // Return the new head.
1028
+ static PerThreadSynch *DequeueAllWakeable(PerThreadSynch *head,
1029
+ PerThreadSynch *pw,
1030
+ PerThreadSynch **wake_tail) {
1031
+ PerThreadSynch *orig_h = head;
1032
+ PerThreadSynch *w = pw->next;
1033
+ bool skipped = false;
1034
+ do {
1035
+ if (w->wake) { // remove this element
1036
+ ABSL_RAW_CHECK(pw->skip == nullptr, "bad skip in DequeueAllWakeable");
1037
+ // we're removing pw's successor so either pw->skip is zero or we should
1038
+ // already have removed pw since if pw->skip!=null, pw has the same
1039
+ // condition as w.
1040
+ head = Dequeue(head, pw);
1041
+ w->next = *wake_tail; // keep list terminated
1042
+ *wake_tail = w; // add w to wake_list;
1043
+ wake_tail = &w->next; // next addition to end
1044
+ if (w->waitp->how == kExclusive) { // wake at most 1 writer
1045
+ break;
1046
+ }
1047
+ } else { // not waking this one; skip
1048
+ pw = Skip(w); // skip as much as possible
1049
+ skipped = true;
1050
+ }
1051
+ w = pw->next;
1052
+ // We want to stop processing after we've considered the original head,
1053
+ // orig_h. We can't test for w==orig_h in the loop because w may skip over
1054
+ // it; we are guaranteed only that w's predecessor will not skip over
1055
+ // orig_h. When we've considered orig_h, either we've processed it and
1056
+ // removed it (so orig_h != head), or we considered it and skipped it (so
1057
+ // skipped==true && pw == head because skipping from head always skips by
1058
+ // just one, leaving pw pointing at head). So we want to
1059
+ // continue the loop with the negation of that expression.
1060
+ } while (orig_h == head && (pw != head || !skipped));
1061
+ return head;
1062
+ }
1063
+
1064
+ // Try to remove thread s from the list of waiters on this mutex.
1065
+ // Does nothing if s is not on the waiter list.
1066
+ void Mutex::TryRemove(PerThreadSynch *s) {
1067
+ SchedulingGuard::ScopedDisable disable_rescheduling;
1068
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1069
+ // acquire spinlock & lock
1070
+ if ((v & (kMuWait | kMuSpin | kMuWriter | kMuReader)) == kMuWait &&
1071
+ mu_.compare_exchange_strong(v, v | kMuSpin | kMuWriter,
1072
+ std::memory_order_acquire,
1073
+ std::memory_order_relaxed)) {
1074
+ PerThreadSynch *h = GetPerThreadSynch(v);
1075
+ if (h != nullptr) {
1076
+ PerThreadSynch *pw = h; // pw is w's predecessor
1077
+ PerThreadSynch *w;
1078
+ if ((w = pw->next) != s) { // search for thread,
1079
+ do { // processing at least one element
1080
+ // If the current element isn't equivalent to the waiter to be
1081
+ // removed, we can skip the entire chain.
1082
+ if (!MuEquivalentWaiter(s, w)) {
1083
+ pw = Skip(w); // so skip all that won't match
1084
+ // we don't have to worry about dangling skip fields
1085
+ // in the threads we skipped; none can point to s
1086
+ // because they are in a different equivalence class.
1087
+ } else { // seeking same condition
1088
+ FixSkip(w, s); // fix up any skip pointer from w to s
1089
+ pw = w;
1090
+ }
1091
+ // don't search further if we found the thread, or we're about to
1092
+ // process the first thread again.
1093
+ } while ((w = pw->next) != s && pw != h);
1094
+ }
1095
+ if (w == s) { // found thread; remove it
1096
+ // pw->skip may be non-zero here; the loop above ensured that
1097
+ // no ancestor of s can skip to s, so removal is safe anyway.
1098
+ h = Dequeue(h, pw);
1099
+ s->next = nullptr;
1100
+ s->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
1101
+ }
1102
+ }
1103
+ intptr_t nv;
1104
+ do { // release spinlock and lock
1105
+ v = mu_.load(std::memory_order_relaxed);
1106
+ nv = v & (kMuDesig | kMuEvent);
1107
+ if (h != nullptr) {
1108
+ nv |= kMuWait | reinterpret_cast<intptr_t>(h);
1109
+ h->readers = 0; // we hold writer lock
1110
+ h->maybe_unlocking = false; // finished unlocking
1111
+ }
1112
+ } while (!mu_.compare_exchange_weak(v, nv,
1113
+ std::memory_order_release,
1114
+ std::memory_order_relaxed));
1115
+ }
1116
+ }
1117
+
1118
+ // Wait until thread "s", which must be the current thread, is removed from the
1119
+ // this mutex's waiter queue. If "s->waitp->timeout" has a timeout, wake up
1120
+ // if the wait extends past the absolute time specified, even if "s" is still
1121
+ // on the mutex queue. In this case, remove "s" from the queue and return
1122
+ // true, otherwise return false.
1123
+ ABSL_XRAY_LOG_ARGS(1) void Mutex::Block(PerThreadSynch *s) {
1124
+ while (s->state.load(std::memory_order_acquire) == PerThreadSynch::kQueued) {
1125
+ if (!DecrementSynchSem(this, s, s->waitp->timeout)) {
1126
+ // After a timeout, we go into a spin loop until we remove ourselves
1127
+ // from the queue, or someone else removes us. We can't be sure to be
1128
+ // able to remove ourselves in a single lock acquisition because this
1129
+ // mutex may be held, and the holder has the right to read the centre
1130
+ // of the waiter queue without holding the spinlock.
1131
+ this->TryRemove(s);
1132
+ int c = 0;
1133
+ while (s->next != nullptr) {
1134
+ c = synchronization_internal::MutexDelay(c, GENTLE);
1135
+ this->TryRemove(s);
1136
+ }
1137
+ if (kDebugMode) {
1138
+ // This ensures that we test the case that TryRemove() is called when s
1139
+ // is not on the queue.
1140
+ this->TryRemove(s);
1141
+ }
1142
+ s->waitp->timeout = KernelTimeout::Never(); // timeout is satisfied
1143
+ s->waitp->cond = nullptr; // condition no longer relevant for wakeups
1144
+ }
1145
+ }
1146
+ ABSL_RAW_CHECK(s->waitp != nullptr || s->suppress_fatal_errors,
1147
+ "detected illegal recursion in Mutex code");
1148
+ s->waitp = nullptr;
1149
+ }
1150
+
1151
+ // Wake thread w, and return the next thread in the list.
1152
+ PerThreadSynch *Mutex::Wakeup(PerThreadSynch *w) {
1153
+ PerThreadSynch *next = w->next;
1154
+ w->next = nullptr;
1155
+ w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
1156
+ IncrementSynchSem(this, w);
1157
+
1158
+ return next;
1159
+ }
1160
+
1161
+ static GraphId GetGraphIdLocked(Mutex *mu)
1162
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(deadlock_graph_mu) {
1163
+ if (!deadlock_graph) { // (re)create the deadlock graph.
1164
+ deadlock_graph =
1165
+ new (base_internal::LowLevelAlloc::Alloc(sizeof(*deadlock_graph)))
1166
+ GraphCycles;
1167
+ }
1168
+ return deadlock_graph->GetId(mu);
1169
+ }
1170
+
1171
+ static GraphId GetGraphId(Mutex *mu) ABSL_LOCKS_EXCLUDED(deadlock_graph_mu) {
1172
+ deadlock_graph_mu.Lock();
1173
+ GraphId id = GetGraphIdLocked(mu);
1174
+ deadlock_graph_mu.Unlock();
1175
+ return id;
1176
+ }
1177
+
1178
+ // Record a lock acquisition. This is used in debug mode for deadlock
1179
+ // detection. The held_locks pointer points to the relevant data
1180
+ // structure for each case.
1181
+ static void LockEnter(Mutex* mu, GraphId id, SynchLocksHeld *held_locks) {
1182
+ int n = held_locks->n;
1183
+ int i = 0;
1184
+ while (i != n && held_locks->locks[i].id != id) {
1185
+ i++;
1186
+ }
1187
+ if (i == n) {
1188
+ if (n == ABSL_ARRAYSIZE(held_locks->locks)) {
1189
+ held_locks->overflow = true; // lost some data
1190
+ } else { // we have room for lock
1191
+ held_locks->locks[i].mu = mu;
1192
+ held_locks->locks[i].count = 1;
1193
+ held_locks->locks[i].id = id;
1194
+ held_locks->n = n + 1;
1195
+ }
1196
+ } else {
1197
+ held_locks->locks[i].count++;
1198
+ }
1199
+ }
1200
+
1201
+ // Record a lock release. Each call to LockEnter(mu, id, x) should be
1202
+ // eventually followed by a call to LockLeave(mu, id, x) by the same thread.
1203
+ // It does not process the event if is not needed when deadlock detection is
1204
+ // disabled.
1205
+ static void LockLeave(Mutex* mu, GraphId id, SynchLocksHeld *held_locks) {
1206
+ int n = held_locks->n;
1207
+ int i = 0;
1208
+ while (i != n && held_locks->locks[i].id != id) {
1209
+ i++;
1210
+ }
1211
+ if (i == n) {
1212
+ if (!held_locks->overflow) {
1213
+ // The deadlock id may have been reassigned after ForgetDeadlockInfo,
1214
+ // but in that case mu should still be present.
1215
+ i = 0;
1216
+ while (i != n && held_locks->locks[i].mu != mu) {
1217
+ i++;
1218
+ }
1219
+ if (i == n) { // mu missing means releasing unheld lock
1220
+ SynchEvent *mu_events = GetSynchEvent(mu);
1221
+ ABSL_RAW_LOG(FATAL,
1222
+ "thread releasing lock it does not hold: %p %s; "
1223
+ ,
1224
+ static_cast<void *>(mu),
1225
+ mu_events == nullptr ? "" : mu_events->name);
1226
+ }
1227
+ }
1228
+ } else if (held_locks->locks[i].count == 1) {
1229
+ held_locks->n = n - 1;
1230
+ held_locks->locks[i] = held_locks->locks[n - 1];
1231
+ held_locks->locks[n - 1].id = InvalidGraphId();
1232
+ held_locks->locks[n - 1].mu =
1233
+ nullptr; // clear mu to please the leak detector.
1234
+ } else {
1235
+ assert(held_locks->locks[i].count > 0);
1236
+ held_locks->locks[i].count--;
1237
+ }
1238
+ }
1239
+
1240
+ // Call LockEnter() if in debug mode and deadlock detection is enabled.
1241
+ static inline void DebugOnlyLockEnter(Mutex *mu) {
1242
+ if (kDebugMode) {
1243
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1244
+ OnDeadlockCycle::kIgnore) {
1245
+ LockEnter(mu, GetGraphId(mu), Synch_GetAllLocks());
1246
+ }
1247
+ }
1248
+ }
1249
+
1250
+ // Call LockEnter() if in debug mode and deadlock detection is enabled.
1251
+ static inline void DebugOnlyLockEnter(Mutex *mu, GraphId id) {
1252
+ if (kDebugMode) {
1253
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1254
+ OnDeadlockCycle::kIgnore) {
1255
+ LockEnter(mu, id, Synch_GetAllLocks());
1256
+ }
1257
+ }
1258
+ }
1259
+
1260
+ // Call LockLeave() if in debug mode and deadlock detection is enabled.
1261
+ static inline void DebugOnlyLockLeave(Mutex *mu) {
1262
+ if (kDebugMode) {
1263
+ if (synch_deadlock_detection.load(std::memory_order_acquire) !=
1264
+ OnDeadlockCycle::kIgnore) {
1265
+ LockLeave(mu, GetGraphId(mu), Synch_GetAllLocks());
1266
+ }
1267
+ }
1268
+ }
1269
+
1270
+ static char *StackString(void **pcs, int n, char *buf, int maxlen,
1271
+ bool symbolize) {
1272
+ static const int kSymLen = 200;
1273
+ char sym[kSymLen];
1274
+ int len = 0;
1275
+ for (int i = 0; i != n; i++) {
1276
+ if (symbolize) {
1277
+ if (!symbolizer(pcs[i], sym, kSymLen)) {
1278
+ sym[0] = '\0';
1279
+ }
1280
+ snprintf(buf + len, maxlen - len, "%s\t@ %p %s\n",
1281
+ (i == 0 ? "\n" : ""),
1282
+ pcs[i], sym);
1283
+ } else {
1284
+ snprintf(buf + len, maxlen - len, " %p", pcs[i]);
1285
+ }
1286
+ len += strlen(&buf[len]);
1287
+ }
1288
+ return buf;
1289
+ }
1290
+
1291
+ static char *CurrentStackString(char *buf, int maxlen, bool symbolize) {
1292
+ void *pcs[40];
1293
+ return StackString(pcs, absl::GetStackTrace(pcs, ABSL_ARRAYSIZE(pcs), 2), buf,
1294
+ maxlen, symbolize);
1295
+ }
1296
+
1297
+ namespace {
1298
+ enum { kMaxDeadlockPathLen = 10 }; // maximum length of a deadlock cycle;
1299
+ // a path this long would be remarkable
1300
+ // Buffers required to report a deadlock.
1301
+ // We do not allocate them on stack to avoid large stack frame.
1302
+ struct DeadlockReportBuffers {
1303
+ char buf[6100];
1304
+ GraphId path[kMaxDeadlockPathLen];
1305
+ };
1306
+
1307
+ struct ScopedDeadlockReportBuffers {
1308
+ ScopedDeadlockReportBuffers() {
1309
+ b = reinterpret_cast<DeadlockReportBuffers *>(
1310
+ base_internal::LowLevelAlloc::Alloc(sizeof(*b)));
1311
+ }
1312
+ ~ScopedDeadlockReportBuffers() { base_internal::LowLevelAlloc::Free(b); }
1313
+ DeadlockReportBuffers *b;
1314
+ };
1315
+
1316
+ // Helper to pass to GraphCycles::UpdateStackTrace.
1317
+ int GetStack(void** stack, int max_depth) {
1318
+ return absl::GetStackTrace(stack, max_depth, 3);
1319
+ }
1320
+ } // anonymous namespace
1321
+
1322
+ // Called in debug mode when a thread is about to acquire a lock in a way that
1323
+ // may block.
1324
+ static GraphId DeadlockCheck(Mutex *mu) {
1325
+ if (synch_deadlock_detection.load(std::memory_order_acquire) ==
1326
+ OnDeadlockCycle::kIgnore) {
1327
+ return InvalidGraphId();
1328
+ }
1329
+
1330
+ SynchLocksHeld *all_locks = Synch_GetAllLocks();
1331
+
1332
+ absl::base_internal::SpinLockHolder lock(&deadlock_graph_mu);
1333
+ const GraphId mu_id = GetGraphIdLocked(mu);
1334
+
1335
+ if (all_locks->n == 0) {
1336
+ // There are no other locks held. Return now so that we don't need to
1337
+ // call GetSynchEvent(). This way we do not record the stack trace
1338
+ // for this Mutex. It's ok, since if this Mutex is involved in a deadlock,
1339
+ // it can't always be the first lock acquired by a thread.
1340
+ return mu_id;
1341
+ }
1342
+
1343
+ // We prefer to keep stack traces that show a thread holding and acquiring
1344
+ // as many locks as possible. This increases the chances that a given edge
1345
+ // in the acquires-before graph will be represented in the stack traces
1346
+ // recorded for the locks.
1347
+ deadlock_graph->UpdateStackTrace(mu_id, all_locks->n + 1, GetStack);
1348
+
1349
+ // For each other mutex already held by this thread:
1350
+ for (int i = 0; i != all_locks->n; i++) {
1351
+ const GraphId other_node_id = all_locks->locks[i].id;
1352
+ const Mutex *other =
1353
+ static_cast<const Mutex *>(deadlock_graph->Ptr(other_node_id));
1354
+ if (other == nullptr) {
1355
+ // Ignore stale lock
1356
+ continue;
1357
+ }
1358
+
1359
+ // Add the acquired-before edge to the graph.
1360
+ if (!deadlock_graph->InsertEdge(other_node_id, mu_id)) {
1361
+ ScopedDeadlockReportBuffers scoped_buffers;
1362
+ DeadlockReportBuffers *b = scoped_buffers.b;
1363
+ static int number_of_reported_deadlocks = 0;
1364
+ number_of_reported_deadlocks++;
1365
+ // Symbolize only 2 first deadlock report to avoid huge slowdowns.
1366
+ bool symbolize = number_of_reported_deadlocks <= 2;
1367
+ ABSL_RAW_LOG(ERROR, "Potential Mutex deadlock: %s",
1368
+ CurrentStackString(b->buf, sizeof (b->buf), symbolize));
1369
+ int len = 0;
1370
+ for (int j = 0; j != all_locks->n; j++) {
1371
+ void* pr = deadlock_graph->Ptr(all_locks->locks[j].id);
1372
+ if (pr != nullptr) {
1373
+ snprintf(b->buf + len, sizeof (b->buf) - len, " %p", pr);
1374
+ len += static_cast<int>(strlen(&b->buf[len]));
1375
+ }
1376
+ }
1377
+ ABSL_RAW_LOG(ERROR,
1378
+ "Acquiring absl::Mutex %p while holding %s; a cycle in the "
1379
+ "historical lock ordering graph has been observed",
1380
+ static_cast<void *>(mu), b->buf);
1381
+ ABSL_RAW_LOG(ERROR, "Cycle: ");
1382
+ int path_len = deadlock_graph->FindPath(
1383
+ mu_id, other_node_id, ABSL_ARRAYSIZE(b->path), b->path);
1384
+ for (int j = 0; j != path_len; j++) {
1385
+ GraphId id = b->path[j];
1386
+ Mutex *path_mu = static_cast<Mutex *>(deadlock_graph->Ptr(id));
1387
+ if (path_mu == nullptr) continue;
1388
+ void** stack;
1389
+ int depth = deadlock_graph->GetStackTrace(id, &stack);
1390
+ snprintf(b->buf, sizeof(b->buf),
1391
+ "mutex@%p stack: ", static_cast<void *>(path_mu));
1392
+ StackString(stack, depth, b->buf + strlen(b->buf),
1393
+ static_cast<int>(sizeof(b->buf) - strlen(b->buf)),
1394
+ symbolize);
1395
+ ABSL_RAW_LOG(ERROR, "%s", b->buf);
1396
+ }
1397
+ if (synch_deadlock_detection.load(std::memory_order_acquire) ==
1398
+ OnDeadlockCycle::kAbort) {
1399
+ deadlock_graph_mu.Unlock(); // avoid deadlock in fatal sighandler
1400
+ ABSL_RAW_LOG(FATAL, "dying due to potential deadlock");
1401
+ return mu_id;
1402
+ }
1403
+ break; // report at most one potential deadlock per acquisition
1404
+ }
1405
+ }
1406
+
1407
+ return mu_id;
1408
+ }
1409
+
1410
+ // Invoke DeadlockCheck() iff we're in debug mode and
1411
+ // deadlock checking has been enabled.
1412
+ static inline GraphId DebugOnlyDeadlockCheck(Mutex *mu) {
1413
+ if (kDebugMode && synch_deadlock_detection.load(std::memory_order_acquire) !=
1414
+ OnDeadlockCycle::kIgnore) {
1415
+ return DeadlockCheck(mu);
1416
+ } else {
1417
+ return InvalidGraphId();
1418
+ }
1419
+ }
1420
+
1421
+ void Mutex::ForgetDeadlockInfo() {
1422
+ if (kDebugMode && synch_deadlock_detection.load(std::memory_order_acquire) !=
1423
+ OnDeadlockCycle::kIgnore) {
1424
+ deadlock_graph_mu.Lock();
1425
+ if (deadlock_graph != nullptr) {
1426
+ deadlock_graph->RemoveNode(this);
1427
+ }
1428
+ deadlock_graph_mu.Unlock();
1429
+ }
1430
+ }
1431
+
1432
+ void Mutex::AssertNotHeld() const {
1433
+ // We have the data to allow this check only if in debug mode and deadlock
1434
+ // detection is enabled.
1435
+ if (kDebugMode &&
1436
+ (mu_.load(std::memory_order_relaxed) & (kMuWriter | kMuReader)) != 0 &&
1437
+ synch_deadlock_detection.load(std::memory_order_acquire) !=
1438
+ OnDeadlockCycle::kIgnore) {
1439
+ GraphId id = GetGraphId(const_cast<Mutex *>(this));
1440
+ SynchLocksHeld *locks = Synch_GetAllLocks();
1441
+ for (int i = 0; i != locks->n; i++) {
1442
+ if (locks->locks[i].id == id) {
1443
+ SynchEvent *mu_events = GetSynchEvent(this);
1444
+ ABSL_RAW_LOG(FATAL, "thread should not hold mutex %p %s",
1445
+ static_cast<const void *>(this),
1446
+ (mu_events == nullptr ? "" : mu_events->name));
1447
+ }
1448
+ }
1449
+ }
1450
+ }
1451
+
1452
+ // Attempt to acquire *mu, and return whether successful. The implementation
1453
+ // may spin for a short while if the lock cannot be acquired immediately.
1454
+ static bool TryAcquireWithSpinning(std::atomic<intptr_t>* mu) {
1455
+ int c = GetMutexGlobals().spinloop_iterations;
1456
+ do { // do/while somewhat faster on AMD
1457
+ intptr_t v = mu->load(std::memory_order_relaxed);
1458
+ if ((v & (kMuReader|kMuEvent)) != 0) {
1459
+ return false; // a reader or tracing -> give up
1460
+ } else if (((v & kMuWriter) == 0) && // no holder -> try to acquire
1461
+ mu->compare_exchange_strong(v, kMuWriter | v,
1462
+ std::memory_order_acquire,
1463
+ std::memory_order_relaxed)) {
1464
+ return true;
1465
+ }
1466
+ } while (--c > 0);
1467
+ return false;
1468
+ }
1469
+
1470
+ ABSL_XRAY_LOG_ARGS(1) void Mutex::Lock() {
1471
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, 0);
1472
+ GraphId id = DebugOnlyDeadlockCheck(this);
1473
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1474
+ // try fast acquire, then spin loop
1475
+ if ((v & (kMuWriter | kMuReader | kMuEvent)) != 0 ||
1476
+ !mu_.compare_exchange_strong(v, kMuWriter | v,
1477
+ std::memory_order_acquire,
1478
+ std::memory_order_relaxed)) {
1479
+ // try spin acquire, then slow loop
1480
+ if (!TryAcquireWithSpinning(&this->mu_)) {
1481
+ this->LockSlow(kExclusive, nullptr, 0);
1482
+ }
1483
+ }
1484
+ DebugOnlyLockEnter(this, id);
1485
+ ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0);
1486
+ }
1487
+
1488
+ ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderLock() {
1489
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_read_lock);
1490
+ GraphId id = DebugOnlyDeadlockCheck(this);
1491
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1492
+ // try fast acquire, then slow loop
1493
+ if ((v & (kMuWriter | kMuWait | kMuEvent)) != 0 ||
1494
+ !mu_.compare_exchange_strong(v, (kMuReader | v) + kMuOne,
1495
+ std::memory_order_acquire,
1496
+ std::memory_order_relaxed)) {
1497
+ this->LockSlow(kShared, nullptr, 0);
1498
+ }
1499
+ DebugOnlyLockEnter(this, id);
1500
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_read_lock, 0);
1501
+ }
1502
+
1503
+ void Mutex::LockWhen(const Condition &cond) {
1504
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, 0);
1505
+ GraphId id = DebugOnlyDeadlockCheck(this);
1506
+ this->LockSlow(kExclusive, &cond, 0);
1507
+ DebugOnlyLockEnter(this, id);
1508
+ ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0);
1509
+ }
1510
+
1511
+ bool Mutex::LockWhenWithTimeout(const Condition &cond, absl::Duration timeout) {
1512
+ return LockWhenWithDeadline(cond, DeadlineFromTimeout(timeout));
1513
+ }
1514
+
1515
+ bool Mutex::LockWhenWithDeadline(const Condition &cond, absl::Time deadline) {
1516
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, 0);
1517
+ GraphId id = DebugOnlyDeadlockCheck(this);
1518
+ bool res = LockSlowWithDeadline(kExclusive, &cond,
1519
+ KernelTimeout(deadline), 0);
1520
+ DebugOnlyLockEnter(this, id);
1521
+ ABSL_TSAN_MUTEX_POST_LOCK(this, 0, 0);
1522
+ return res;
1523
+ }
1524
+
1525
+ void Mutex::ReaderLockWhen(const Condition &cond) {
1526
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_read_lock);
1527
+ GraphId id = DebugOnlyDeadlockCheck(this);
1528
+ this->LockSlow(kShared, &cond, 0);
1529
+ DebugOnlyLockEnter(this, id);
1530
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_read_lock, 0);
1531
+ }
1532
+
1533
+ bool Mutex::ReaderLockWhenWithTimeout(const Condition &cond,
1534
+ absl::Duration timeout) {
1535
+ return ReaderLockWhenWithDeadline(cond, DeadlineFromTimeout(timeout));
1536
+ }
1537
+
1538
+ bool Mutex::ReaderLockWhenWithDeadline(const Condition &cond,
1539
+ absl::Time deadline) {
1540
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_read_lock);
1541
+ GraphId id = DebugOnlyDeadlockCheck(this);
1542
+ bool res = LockSlowWithDeadline(kShared, &cond, KernelTimeout(deadline), 0);
1543
+ DebugOnlyLockEnter(this, id);
1544
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_read_lock, 0);
1545
+ return res;
1546
+ }
1547
+
1548
+ void Mutex::Await(const Condition &cond) {
1549
+ if (cond.Eval()) { // condition already true; nothing to do
1550
+ if (kDebugMode) {
1551
+ this->AssertReaderHeld();
1552
+ }
1553
+ } else { // normal case
1554
+ ABSL_RAW_CHECK(this->AwaitCommon(cond, KernelTimeout::Never()),
1555
+ "condition untrue on return from Await");
1556
+ }
1557
+ }
1558
+
1559
+ bool Mutex::AwaitWithTimeout(const Condition &cond, absl::Duration timeout) {
1560
+ return AwaitWithDeadline(cond, DeadlineFromTimeout(timeout));
1561
+ }
1562
+
1563
+ bool Mutex::AwaitWithDeadline(const Condition &cond, absl::Time deadline) {
1564
+ if (cond.Eval()) { // condition already true; nothing to do
1565
+ if (kDebugMode) {
1566
+ this->AssertReaderHeld();
1567
+ }
1568
+ return true;
1569
+ }
1570
+
1571
+ KernelTimeout t{deadline};
1572
+ bool res = this->AwaitCommon(cond, t);
1573
+ ABSL_RAW_CHECK(res || t.has_timeout(),
1574
+ "condition untrue on return from Await");
1575
+ return res;
1576
+ }
1577
+
1578
+ bool Mutex::AwaitCommon(const Condition &cond, KernelTimeout t) {
1579
+ this->AssertReaderHeld();
1580
+ MuHow how =
1581
+ (mu_.load(std::memory_order_relaxed) & kMuWriter) ? kExclusive : kShared;
1582
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, TsanFlags(how));
1583
+ SynchWaitParams waitp(
1584
+ how, &cond, t, nullptr /*no cvmu*/, Synch_GetPerThreadAnnotated(this),
1585
+ nullptr /*no cv_word*/);
1586
+ int flags = kMuHasBlocked;
1587
+ if (!Condition::GuaranteedEqual(&cond, nullptr)) {
1588
+ flags |= kMuIsCond;
1589
+ }
1590
+ this->UnlockSlow(&waitp);
1591
+ this->Block(waitp.thread);
1592
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, TsanFlags(how));
1593
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, TsanFlags(how));
1594
+ this->LockSlowLoop(&waitp, flags);
1595
+ bool res = waitp.cond != nullptr || // => cond known true from LockSlowLoop
1596
+ EvalConditionAnnotated(&cond, this, true, false, how == kShared);
1597
+ ABSL_TSAN_MUTEX_POST_LOCK(this, TsanFlags(how), 0);
1598
+ return res;
1599
+ }
1600
+
1601
+ ABSL_XRAY_LOG_ARGS(1) bool Mutex::TryLock() {
1602
+ ABSL_TSAN_MUTEX_PRE_LOCK(this, __tsan_mutex_try_lock);
1603
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1604
+ if ((v & (kMuWriter | kMuReader | kMuEvent)) == 0 && // try fast acquire
1605
+ mu_.compare_exchange_strong(v, kMuWriter | v,
1606
+ std::memory_order_acquire,
1607
+ std::memory_order_relaxed)) {
1608
+ DebugOnlyLockEnter(this);
1609
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_try_lock, 0);
1610
+ return true;
1611
+ }
1612
+ if ((v & kMuEvent) != 0) { // we're recording events
1613
+ if ((v & kExclusive->slow_need_zero) == 0 && // try fast acquire
1614
+ mu_.compare_exchange_strong(
1615
+ v, (kExclusive->fast_or | v) + kExclusive->fast_add,
1616
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1617
+ DebugOnlyLockEnter(this);
1618
+ PostSynchEvent(this, SYNCH_EV_TRYLOCK_SUCCESS);
1619
+ ABSL_TSAN_MUTEX_POST_LOCK(this, __tsan_mutex_try_lock, 0);
1620
+ return true;
1621
+ } else {
1622
+ PostSynchEvent(this, SYNCH_EV_TRYLOCK_FAILED);
1623
+ }
1624
+ }
1625
+ ABSL_TSAN_MUTEX_POST_LOCK(
1626
+ this, __tsan_mutex_try_lock | __tsan_mutex_try_lock_failed, 0);
1627
+ return false;
1628
+ }
1629
+
1630
+ ABSL_XRAY_LOG_ARGS(1) bool Mutex::ReaderTryLock() {
1631
+ ABSL_TSAN_MUTEX_PRE_LOCK(this,
1632
+ __tsan_mutex_read_lock | __tsan_mutex_try_lock);
1633
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1634
+ // The while-loops (here and below) iterate only if the mutex word keeps
1635
+ // changing (typically because the reader count changes) under the CAS. We
1636
+ // limit the number of attempts to avoid having to think about livelock.
1637
+ int loop_limit = 5;
1638
+ while ((v & (kMuWriter|kMuWait|kMuEvent)) == 0 && loop_limit != 0) {
1639
+ if (mu_.compare_exchange_strong(v, (kMuReader | v) + kMuOne,
1640
+ std::memory_order_acquire,
1641
+ std::memory_order_relaxed)) {
1642
+ DebugOnlyLockEnter(this);
1643
+ ABSL_TSAN_MUTEX_POST_LOCK(
1644
+ this, __tsan_mutex_read_lock | __tsan_mutex_try_lock, 0);
1645
+ return true;
1646
+ }
1647
+ loop_limit--;
1648
+ v = mu_.load(std::memory_order_relaxed);
1649
+ }
1650
+ if ((v & kMuEvent) != 0) { // we're recording events
1651
+ loop_limit = 5;
1652
+ while ((v & kShared->slow_need_zero) == 0 && loop_limit != 0) {
1653
+ if (mu_.compare_exchange_strong(v, (kMuReader | v) + kMuOne,
1654
+ std::memory_order_acquire,
1655
+ std::memory_order_relaxed)) {
1656
+ DebugOnlyLockEnter(this);
1657
+ PostSynchEvent(this, SYNCH_EV_READERTRYLOCK_SUCCESS);
1658
+ ABSL_TSAN_MUTEX_POST_LOCK(
1659
+ this, __tsan_mutex_read_lock | __tsan_mutex_try_lock, 0);
1660
+ return true;
1661
+ }
1662
+ loop_limit--;
1663
+ v = mu_.load(std::memory_order_relaxed);
1664
+ }
1665
+ if ((v & kMuEvent) != 0) {
1666
+ PostSynchEvent(this, SYNCH_EV_READERTRYLOCK_FAILED);
1667
+ }
1668
+ }
1669
+ ABSL_TSAN_MUTEX_POST_LOCK(this,
1670
+ __tsan_mutex_read_lock | __tsan_mutex_try_lock |
1671
+ __tsan_mutex_try_lock_failed,
1672
+ 0);
1673
+ return false;
1674
+ }
1675
+
1676
+ ABSL_XRAY_LOG_ARGS(1) void Mutex::Unlock() {
1677
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, 0);
1678
+ DebugOnlyLockLeave(this);
1679
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1680
+
1681
+ if (kDebugMode && ((v & (kMuWriter | kMuReader)) != kMuWriter)) {
1682
+ ABSL_RAW_LOG(FATAL, "Mutex unlocked when destroyed or not locked: v=0x%x",
1683
+ static_cast<unsigned>(v));
1684
+ }
1685
+
1686
+ // should_try_cas is whether we'll try a compare-and-swap immediately.
1687
+ // NOTE: optimized out when kDebugMode is false.
1688
+ bool should_try_cas = ((v & (kMuEvent | kMuWriter)) == kMuWriter &&
1689
+ (v & (kMuWait | kMuDesig)) != kMuWait);
1690
+ // But, we can use an alternate computation of it, that compilers
1691
+ // currently don't find on their own. When that changes, this function
1692
+ // can be simplified.
1693
+ intptr_t x = (v ^ (kMuWriter | kMuWait)) & (kMuWriter | kMuEvent);
1694
+ intptr_t y = (v ^ (kMuWriter | kMuWait)) & (kMuWait | kMuDesig);
1695
+ // Claim: "x == 0 && y > 0" is equal to should_try_cas.
1696
+ // Also, because kMuWriter and kMuEvent exceed kMuDesig and kMuWait,
1697
+ // all possible non-zero values for x exceed all possible values for y.
1698
+ // Therefore, (x == 0 && y > 0) == (x < y).
1699
+ if (kDebugMode && should_try_cas != (x < y)) {
1700
+ // We would usually use PRIdPTR here, but is not correctly implemented
1701
+ // within the android toolchain.
1702
+ ABSL_RAW_LOG(FATAL, "internal logic error %llx %llx %llx\n",
1703
+ static_cast<long long>(v), static_cast<long long>(x),
1704
+ static_cast<long long>(y));
1705
+ }
1706
+ if (x < y &&
1707
+ mu_.compare_exchange_strong(v, v & ~(kMuWrWait | kMuWriter),
1708
+ std::memory_order_release,
1709
+ std::memory_order_relaxed)) {
1710
+ // fast writer release (writer with no waiters or with designated waker)
1711
+ } else {
1712
+ this->UnlockSlow(nullptr /*no waitp*/); // take slow path
1713
+ }
1714
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, 0);
1715
+ }
1716
+
1717
+ // Requires v to represent a reader-locked state.
1718
+ static bool ExactlyOneReader(intptr_t v) {
1719
+ assert((v & (kMuWriter|kMuReader)) == kMuReader);
1720
+ assert((v & kMuHigh) != 0);
1721
+ // The more straightforward "(v & kMuHigh) == kMuOne" also works, but
1722
+ // on some architectures the following generates slightly smaller code.
1723
+ // It may be faster too.
1724
+ constexpr intptr_t kMuMultipleWaitersMask = kMuHigh ^ kMuOne;
1725
+ return (v & kMuMultipleWaitersMask) == 0;
1726
+ }
1727
+
1728
+ ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderUnlock() {
1729
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(this, __tsan_mutex_read_lock);
1730
+ DebugOnlyLockLeave(this);
1731
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1732
+ assert((v & (kMuWriter|kMuReader)) == kMuReader);
1733
+ if ((v & (kMuReader|kMuWait|kMuEvent)) == kMuReader) {
1734
+ // fast reader release (reader with no waiters)
1735
+ intptr_t clear = ExactlyOneReader(v) ? kMuReader|kMuOne : kMuOne;
1736
+ if (mu_.compare_exchange_strong(v, v - clear,
1737
+ std::memory_order_release,
1738
+ std::memory_order_relaxed)) {
1739
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, __tsan_mutex_read_lock);
1740
+ return;
1741
+ }
1742
+ }
1743
+ this->UnlockSlow(nullptr /*no waitp*/); // take slow path
1744
+ ABSL_TSAN_MUTEX_POST_UNLOCK(this, __tsan_mutex_read_lock);
1745
+ }
1746
+
1747
+ // The zap_desig_waker bitmask is used to clear the designated waker flag in
1748
+ // the mutex if this thread has blocked, and therefore may be the designated
1749
+ // waker.
1750
+ static const intptr_t zap_desig_waker[] = {
1751
+ ~static_cast<intptr_t>(0), // not blocked
1752
+ ~static_cast<intptr_t>(
1753
+ kMuDesig) // blocked; turn off the designated waker bit
1754
+ };
1755
+
1756
+ // The ignore_waiting_writers bitmask is used to ignore the existence
1757
+ // of waiting writers if a reader that has already blocked once
1758
+ // wakes up.
1759
+ static const intptr_t ignore_waiting_writers[] = {
1760
+ ~static_cast<intptr_t>(0), // not blocked
1761
+ ~static_cast<intptr_t>(
1762
+ kMuWrWait) // blocked; pretend there are no waiting writers
1763
+ };
1764
+
1765
+ // Internal version of LockWhen(). See LockSlowWithDeadline()
1766
+ ABSL_ATTRIBUTE_NOINLINE void Mutex::LockSlow(MuHow how, const Condition *cond,
1767
+ int flags) {
1768
+ ABSL_RAW_CHECK(
1769
+ this->LockSlowWithDeadline(how, cond, KernelTimeout::Never(), flags),
1770
+ "condition untrue on return from LockSlow");
1771
+ }
1772
+
1773
+ // Compute cond->Eval() and tell race detectors that we do it under mutex mu.
1774
+ static inline bool EvalConditionAnnotated(const Condition *cond, Mutex *mu,
1775
+ bool locking, bool trylock,
1776
+ bool read_lock) {
1777
+ // Delicate annotation dance.
1778
+ // We are currently inside of read/write lock/unlock operation.
1779
+ // All memory accesses are ignored inside of mutex operations + for unlock
1780
+ // operation tsan considers that we've already released the mutex.
1781
+ bool res = false;
1782
+ #ifdef ABSL_INTERNAL_HAVE_TSAN_INTERFACE
1783
+ const int flags = read_lock ? __tsan_mutex_read_lock : 0;
1784
+ const int tryflags = flags | (trylock ? __tsan_mutex_try_lock : 0);
1785
+ #endif
1786
+ if (locking) {
1787
+ // For lock we pretend that we have finished the operation,
1788
+ // evaluate the predicate, then unlock the mutex and start locking it again
1789
+ // to match the annotation at the end of outer lock operation.
1790
+ // Note: we can't simply do POST_LOCK, Eval, PRE_LOCK, because then tsan
1791
+ // will think the lock acquisition is recursive which will trigger
1792
+ // deadlock detector.
1793
+ ABSL_TSAN_MUTEX_POST_LOCK(mu, tryflags, 0);
1794
+ res = cond->Eval();
1795
+ // There is no "try" version of Unlock, so use flags instead of tryflags.
1796
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mu, flags);
1797
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mu, flags);
1798
+ ABSL_TSAN_MUTEX_PRE_LOCK(mu, tryflags);
1799
+ } else {
1800
+ // Similarly, for unlock we pretend that we have unlocked the mutex,
1801
+ // lock the mutex, evaluate the predicate, and start unlocking it again
1802
+ // to match the annotation at the end of outer unlock operation.
1803
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mu, flags);
1804
+ ABSL_TSAN_MUTEX_PRE_LOCK(mu, flags);
1805
+ ABSL_TSAN_MUTEX_POST_LOCK(mu, flags, 0);
1806
+ res = cond->Eval();
1807
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mu, flags);
1808
+ }
1809
+ // Prevent unused param warnings in non-TSAN builds.
1810
+ static_cast<void>(mu);
1811
+ static_cast<void>(trylock);
1812
+ static_cast<void>(read_lock);
1813
+ return res;
1814
+ }
1815
+
1816
+ // Compute cond->Eval() hiding it from race detectors.
1817
+ // We are hiding it because inside of UnlockSlow we can evaluate a predicate
1818
+ // that was just added by a concurrent Lock operation; Lock adds the predicate
1819
+ // to the internal Mutex list without actually acquiring the Mutex
1820
+ // (it only acquires the internal spinlock, which is rightfully invisible for
1821
+ // tsan). As the result there is no tsan-visible synchronization between the
1822
+ // addition and this thread. So if we would enable race detection here,
1823
+ // it would race with the predicate initialization.
1824
+ static inline bool EvalConditionIgnored(Mutex *mu, const Condition *cond) {
1825
+ // Memory accesses are already ignored inside of lock/unlock operations,
1826
+ // but synchronization operations are also ignored. When we evaluate the
1827
+ // predicate we must ignore only memory accesses but not synchronization,
1828
+ // because missed synchronization can lead to false reports later.
1829
+ // So we "divert" (which un-ignores both memory accesses and synchronization)
1830
+ // and then separately turn on ignores of memory accesses.
1831
+ ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
1832
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_BEGIN();
1833
+ bool res = cond->Eval();
1834
+ ABSL_ANNOTATE_IGNORE_READS_AND_WRITES_END();
1835
+ ABSL_TSAN_MUTEX_POST_DIVERT(mu, 0);
1836
+ static_cast<void>(mu); // Prevent unused param warning in non-TSAN builds.
1837
+ return res;
1838
+ }
1839
+
1840
+ // Internal equivalent of *LockWhenWithDeadline(), where
1841
+ // "t" represents the absolute timeout; !t.has_timeout() means "forever".
1842
+ // "how" is "kShared" (for ReaderLockWhen) or "kExclusive" (for LockWhen)
1843
+ // In flags, bits are ored together:
1844
+ // - kMuHasBlocked indicates that the client has already blocked on the call so
1845
+ // the designated waker bit must be cleared and waiting writers should not
1846
+ // obstruct this call
1847
+ // - kMuIsCond indicates that this is a conditional acquire (condition variable,
1848
+ // Await, LockWhen) so contention profiling should be suppressed.
1849
+ bool Mutex::LockSlowWithDeadline(MuHow how, const Condition *cond,
1850
+ KernelTimeout t, int flags) {
1851
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1852
+ bool unlock = false;
1853
+ if ((v & how->fast_need_zero) == 0 && // try fast acquire
1854
+ mu_.compare_exchange_strong(
1855
+ v, (how->fast_or | (v & zap_desig_waker[flags & kMuHasBlocked])) +
1856
+ how->fast_add,
1857
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1858
+ if (cond == nullptr ||
1859
+ EvalConditionAnnotated(cond, this, true, false, how == kShared)) {
1860
+ return true;
1861
+ }
1862
+ unlock = true;
1863
+ }
1864
+ SynchWaitParams waitp(
1865
+ how, cond, t, nullptr /*no cvmu*/, Synch_GetPerThreadAnnotated(this),
1866
+ nullptr /*no cv_word*/);
1867
+ if (!Condition::GuaranteedEqual(cond, nullptr)) {
1868
+ flags |= kMuIsCond;
1869
+ }
1870
+ if (unlock) {
1871
+ this->UnlockSlow(&waitp);
1872
+ this->Block(waitp.thread);
1873
+ flags |= kMuHasBlocked;
1874
+ }
1875
+ this->LockSlowLoop(&waitp, flags);
1876
+ return waitp.cond != nullptr || // => cond known true from LockSlowLoop
1877
+ cond == nullptr ||
1878
+ EvalConditionAnnotated(cond, this, true, false, how == kShared);
1879
+ }
1880
+
1881
+ // RAW_CHECK_FMT() takes a condition, a printf-style format string, and
1882
+ // the printf-style argument list. The format string must be a literal.
1883
+ // Arguments after the first are not evaluated unless the condition is true.
1884
+ #define RAW_CHECK_FMT(cond, ...) \
1885
+ do { \
1886
+ if (ABSL_PREDICT_FALSE(!(cond))) { \
1887
+ ABSL_RAW_LOG(FATAL, "Check " #cond " failed: " __VA_ARGS__); \
1888
+ } \
1889
+ } while (0)
1890
+
1891
+ static void CheckForMutexCorruption(intptr_t v, const char* label) {
1892
+ // Test for either of two situations that should not occur in v:
1893
+ // kMuWriter and kMuReader
1894
+ // kMuWrWait and !kMuWait
1895
+ const uintptr_t w = v ^ kMuWait;
1896
+ // By flipping that bit, we can now test for:
1897
+ // kMuWriter and kMuReader in w
1898
+ // kMuWrWait and kMuWait in w
1899
+ // We've chosen these two pairs of values to be so that they will overlap,
1900
+ // respectively, when the word is left shifted by three. This allows us to
1901
+ // save a branch in the common (correct) case of them not being coincident.
1902
+ static_assert(kMuReader << 3 == kMuWriter, "must match");
1903
+ static_assert(kMuWait << 3 == kMuWrWait, "must match");
1904
+ if (ABSL_PREDICT_TRUE((w & (w << 3) & (kMuWriter | kMuWrWait)) == 0)) return;
1905
+ RAW_CHECK_FMT((v & (kMuWriter | kMuReader)) != (kMuWriter | kMuReader),
1906
+ "%s: Mutex corrupt: both reader and writer lock held: %p",
1907
+ label, reinterpret_cast<void *>(v));
1908
+ RAW_CHECK_FMT((v & (kMuWait | kMuWrWait)) != kMuWrWait,
1909
+ "%s: Mutex corrupt: waiting writer with no waiters: %p",
1910
+ label, reinterpret_cast<void *>(v));
1911
+ assert(false);
1912
+ }
1913
+
1914
+ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
1915
+ SchedulingGuard::ScopedDisable disable_rescheduling;
1916
+ int c = 0;
1917
+ intptr_t v = mu_.load(std::memory_order_relaxed);
1918
+ if ((v & kMuEvent) != 0) {
1919
+ PostSynchEvent(this,
1920
+ waitp->how == kExclusive? SYNCH_EV_LOCK: SYNCH_EV_READERLOCK);
1921
+ }
1922
+ ABSL_RAW_CHECK(
1923
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
1924
+ "detected illegal recursion into Mutex code");
1925
+ for (;;) {
1926
+ v = mu_.load(std::memory_order_relaxed);
1927
+ CheckForMutexCorruption(v, "Lock");
1928
+ if ((v & waitp->how->slow_need_zero) == 0) {
1929
+ if (mu_.compare_exchange_strong(
1930
+ v, (waitp->how->fast_or |
1931
+ (v & zap_desig_waker[flags & kMuHasBlocked])) +
1932
+ waitp->how->fast_add,
1933
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1934
+ if (waitp->cond == nullptr ||
1935
+ EvalConditionAnnotated(waitp->cond, this, true, false,
1936
+ waitp->how == kShared)) {
1937
+ break; // we timed out, or condition true, so return
1938
+ }
1939
+ this->UnlockSlow(waitp); // got lock but condition false
1940
+ this->Block(waitp->thread);
1941
+ flags |= kMuHasBlocked;
1942
+ c = 0;
1943
+ }
1944
+ } else { // need to access waiter list
1945
+ bool dowait = false;
1946
+ if ((v & (kMuSpin|kMuWait)) == 0) { // no waiters
1947
+ // This thread tries to become the one and only waiter.
1948
+ PerThreadSynch *new_h = Enqueue(nullptr, waitp, v, flags);
1949
+ intptr_t nv = (v & zap_desig_waker[flags & kMuHasBlocked] & kMuLow) |
1950
+ kMuWait;
1951
+ ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to empty list failed");
1952
+ if (waitp->how == kExclusive && (v & kMuReader) != 0) {
1953
+ nv |= kMuWrWait;
1954
+ }
1955
+ if (mu_.compare_exchange_strong(
1956
+ v, reinterpret_cast<intptr_t>(new_h) | nv,
1957
+ std::memory_order_release, std::memory_order_relaxed)) {
1958
+ dowait = true;
1959
+ } else { // attempted Enqueue() failed
1960
+ // zero out the waitp field set by Enqueue()
1961
+ waitp->thread->waitp = nullptr;
1962
+ }
1963
+ } else if ((v & waitp->how->slow_inc_need_zero &
1964
+ ignore_waiting_writers[flags & kMuHasBlocked]) == 0) {
1965
+ // This is a reader that needs to increment the reader count,
1966
+ // but the count is currently held in the last waiter.
1967
+ if (mu_.compare_exchange_strong(
1968
+ v, (v & zap_desig_waker[flags & kMuHasBlocked]) | kMuSpin |
1969
+ kMuReader,
1970
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1971
+ PerThreadSynch *h = GetPerThreadSynch(v);
1972
+ h->readers += kMuOne; // inc reader count in waiter
1973
+ do { // release spinlock
1974
+ v = mu_.load(std::memory_order_relaxed);
1975
+ } while (!mu_.compare_exchange_weak(v, (v & ~kMuSpin) | kMuReader,
1976
+ std::memory_order_release,
1977
+ std::memory_order_relaxed));
1978
+ if (waitp->cond == nullptr ||
1979
+ EvalConditionAnnotated(waitp->cond, this, true, false,
1980
+ waitp->how == kShared)) {
1981
+ break; // we timed out, or condition true, so return
1982
+ }
1983
+ this->UnlockSlow(waitp); // got lock but condition false
1984
+ this->Block(waitp->thread);
1985
+ flags |= kMuHasBlocked;
1986
+ c = 0;
1987
+ }
1988
+ } else if ((v & kMuSpin) == 0 && // attempt to queue ourselves
1989
+ mu_.compare_exchange_strong(
1990
+ v, (v & zap_desig_waker[flags & kMuHasBlocked]) | kMuSpin |
1991
+ kMuWait,
1992
+ std::memory_order_acquire, std::memory_order_relaxed)) {
1993
+ PerThreadSynch *h = GetPerThreadSynch(v);
1994
+ PerThreadSynch *new_h = Enqueue(h, waitp, v, flags);
1995
+ intptr_t wr_wait = 0;
1996
+ ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to list failed");
1997
+ if (waitp->how == kExclusive && (v & kMuReader) != 0) {
1998
+ wr_wait = kMuWrWait; // give priority to a waiting writer
1999
+ }
2000
+ do { // release spinlock
2001
+ v = mu_.load(std::memory_order_relaxed);
2002
+ } while (!mu_.compare_exchange_weak(
2003
+ v, (v & (kMuLow & ~kMuSpin)) | kMuWait | wr_wait |
2004
+ reinterpret_cast<intptr_t>(new_h),
2005
+ std::memory_order_release, std::memory_order_relaxed));
2006
+ dowait = true;
2007
+ }
2008
+ if (dowait) {
2009
+ this->Block(waitp->thread); // wait until removed from list or timeout
2010
+ flags |= kMuHasBlocked;
2011
+ c = 0;
2012
+ }
2013
+ }
2014
+ ABSL_RAW_CHECK(
2015
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
2016
+ "detected illegal recursion into Mutex code");
2017
+ // delay, then try again
2018
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2019
+ }
2020
+ ABSL_RAW_CHECK(
2021
+ waitp->thread->waitp == nullptr || waitp->thread->suppress_fatal_errors,
2022
+ "detected illegal recursion into Mutex code");
2023
+ if ((v & kMuEvent) != 0) {
2024
+ PostSynchEvent(this,
2025
+ waitp->how == kExclusive? SYNCH_EV_LOCK_RETURNING :
2026
+ SYNCH_EV_READERLOCK_RETURNING);
2027
+ }
2028
+ }
2029
+
2030
+ // Unlock this mutex, which is held by the current thread.
2031
+ // If waitp is non-zero, it must be the wait parameters for the current thread
2032
+ // which holds the lock but is not runnable because its condition is false
2033
+ // or it is in the process of blocking on a condition variable; it must requeue
2034
+ // itself on the mutex/condvar to wait for its condition to become true.
2035
+ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) {
2036
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2037
+ intptr_t v = mu_.load(std::memory_order_relaxed);
2038
+ this->AssertReaderHeld();
2039
+ CheckForMutexCorruption(v, "Unlock");
2040
+ if ((v & kMuEvent) != 0) {
2041
+ PostSynchEvent(this,
2042
+ (v & kMuWriter) != 0? SYNCH_EV_UNLOCK: SYNCH_EV_READERUNLOCK);
2043
+ }
2044
+ int c = 0;
2045
+ // the waiter under consideration to wake, or zero
2046
+ PerThreadSynch *w = nullptr;
2047
+ // the predecessor to w or zero
2048
+ PerThreadSynch *pw = nullptr;
2049
+ // head of the list searched previously, or zero
2050
+ PerThreadSynch *old_h = nullptr;
2051
+ // a condition that's known to be false.
2052
+ const Condition *known_false = nullptr;
2053
+ PerThreadSynch *wake_list = kPerThreadSynchNull; // list of threads to wake
2054
+ intptr_t wr_wait = 0; // set to kMuWrWait if we wake a reader and a
2055
+ // later writer could have acquired the lock
2056
+ // (starvation avoidance)
2057
+ ABSL_RAW_CHECK(waitp == nullptr || waitp->thread->waitp == nullptr ||
2058
+ waitp->thread->suppress_fatal_errors,
2059
+ "detected illegal recursion into Mutex code");
2060
+ // This loop finds threads wake_list to wakeup if any, and removes them from
2061
+ // the list of waiters. In addition, it places waitp.thread on the queue of
2062
+ // waiters if waitp is non-zero.
2063
+ for (;;) {
2064
+ v = mu_.load(std::memory_order_relaxed);
2065
+ if ((v & kMuWriter) != 0 && (v & (kMuWait | kMuDesig)) != kMuWait &&
2066
+ waitp == nullptr) {
2067
+ // fast writer release (writer with no waiters or with designated waker)
2068
+ if (mu_.compare_exchange_strong(v, v & ~(kMuWrWait | kMuWriter),
2069
+ std::memory_order_release,
2070
+ std::memory_order_relaxed)) {
2071
+ return;
2072
+ }
2073
+ } else if ((v & (kMuReader | kMuWait)) == kMuReader && waitp == nullptr) {
2074
+ // fast reader release (reader with no waiters)
2075
+ intptr_t clear = ExactlyOneReader(v) ? kMuReader | kMuOne : kMuOne;
2076
+ if (mu_.compare_exchange_strong(v, v - clear,
2077
+ std::memory_order_release,
2078
+ std::memory_order_relaxed)) {
2079
+ return;
2080
+ }
2081
+ } else if ((v & kMuSpin) == 0 && // attempt to get spinlock
2082
+ mu_.compare_exchange_strong(v, v | kMuSpin,
2083
+ std::memory_order_acquire,
2084
+ std::memory_order_relaxed)) {
2085
+ if ((v & kMuWait) == 0) { // no one to wake
2086
+ intptr_t nv;
2087
+ bool do_enqueue = true; // always Enqueue() the first time
2088
+ ABSL_RAW_CHECK(waitp != nullptr,
2089
+ "UnlockSlow is confused"); // about to sleep
2090
+ do { // must loop to release spinlock as reader count may change
2091
+ v = mu_.load(std::memory_order_relaxed);
2092
+ // decrement reader count if there are readers
2093
+ intptr_t new_readers = (v >= kMuOne)? v - kMuOne : v;
2094
+ PerThreadSynch *new_h = nullptr;
2095
+ if (do_enqueue) {
2096
+ // If we are enqueuing on a CondVar (waitp->cv_word != nullptr) then
2097
+ // we must not retry here. The initial attempt will always have
2098
+ // succeeded, further attempts would enqueue us against *this due to
2099
+ // Fer() handling.
2100
+ do_enqueue = (waitp->cv_word == nullptr);
2101
+ new_h = Enqueue(nullptr, waitp, new_readers, kMuIsCond);
2102
+ }
2103
+ intptr_t clear = kMuWrWait | kMuWriter; // by default clear write bit
2104
+ if ((v & kMuWriter) == 0 && ExactlyOneReader(v)) { // last reader
2105
+ clear = kMuWrWait | kMuReader; // clear read bit
2106
+ }
2107
+ nv = (v & kMuLow & ~clear & ~kMuSpin);
2108
+ if (new_h != nullptr) {
2109
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2110
+ } else { // new_h could be nullptr if we queued ourselves on a
2111
+ // CondVar
2112
+ // In that case, we must place the reader count back in the mutex
2113
+ // word, as Enqueue() did not store it in the new waiter.
2114
+ nv |= new_readers & kMuHigh;
2115
+ }
2116
+ // release spinlock & our lock; retry if reader-count changed
2117
+ // (writer count cannot change since we hold lock)
2118
+ } while (!mu_.compare_exchange_weak(v, nv,
2119
+ std::memory_order_release,
2120
+ std::memory_order_relaxed));
2121
+ break;
2122
+ }
2123
+
2124
+ // There are waiters.
2125
+ // Set h to the head of the circular waiter list.
2126
+ PerThreadSynch *h = GetPerThreadSynch(v);
2127
+ if ((v & kMuReader) != 0 && (h->readers & kMuHigh) > kMuOne) {
2128
+ // a reader but not the last
2129
+ h->readers -= kMuOne; // release our lock
2130
+ intptr_t nv = v; // normally just release spinlock
2131
+ if (waitp != nullptr) { // but waitp!=nullptr => must queue ourselves
2132
+ PerThreadSynch *new_h = Enqueue(h, waitp, v, kMuIsCond);
2133
+ ABSL_RAW_CHECK(new_h != nullptr,
2134
+ "waiters disappeared during Enqueue()!");
2135
+ nv &= kMuLow;
2136
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2137
+ }
2138
+ mu_.store(nv, std::memory_order_release); // release spinlock
2139
+ // can release with a store because there were waiters
2140
+ break;
2141
+ }
2142
+
2143
+ // Either we didn't search before, or we marked the queue
2144
+ // as "maybe_unlocking" and no one else should have changed it.
2145
+ ABSL_RAW_CHECK(old_h == nullptr || h->maybe_unlocking,
2146
+ "Mutex queue changed beneath us");
2147
+
2148
+ // The lock is becoming free, and there's a waiter
2149
+ if (old_h != nullptr &&
2150
+ !old_h->may_skip) { // we used old_h as a terminator
2151
+ old_h->may_skip = true; // allow old_h to skip once more
2152
+ ABSL_RAW_CHECK(old_h->skip == nullptr, "illegal skip from head");
2153
+ if (h != old_h && MuEquivalentWaiter(old_h, old_h->next)) {
2154
+ old_h->skip = old_h->next; // old_h not head & can skip to successor
2155
+ }
2156
+ }
2157
+ if (h->next->waitp->how == kExclusive &&
2158
+ Condition::GuaranteedEqual(h->next->waitp->cond, nullptr)) {
2159
+ // easy case: writer with no condition; no need to search
2160
+ pw = h; // wake w, the successor of h (=pw)
2161
+ w = h->next;
2162
+ w->wake = true;
2163
+ // We are waking up a writer. This writer may be racing against
2164
+ // an already awake reader for the lock. We want the
2165
+ // writer to usually win this race,
2166
+ // because if it doesn't, we can potentially keep taking a reader
2167
+ // perpetually and writers will starve. Worse than
2168
+ // that, this can also starve other readers if kMuWrWait gets set
2169
+ // later.
2170
+ wr_wait = kMuWrWait;
2171
+ } else if (w != nullptr && (w->waitp->how == kExclusive || h == old_h)) {
2172
+ // we found a waiter w to wake on a previous iteration and either it's
2173
+ // a writer, or we've searched the entire list so we have all the
2174
+ // readers.
2175
+ if (pw == nullptr) { // if w's predecessor is unknown, it must be h
2176
+ pw = h;
2177
+ }
2178
+ } else {
2179
+ // At this point we don't know all the waiters to wake, and the first
2180
+ // waiter has a condition or is a reader. We avoid searching over
2181
+ // waiters we've searched on previous iterations by starting at
2182
+ // old_h if it's set. If old_h==h, there's no one to wakeup at all.
2183
+ if (old_h == h) { // we've searched before, and nothing's new
2184
+ // so there's no one to wake.
2185
+ intptr_t nv = (v & ~(kMuReader|kMuWriter|kMuWrWait));
2186
+ h->readers = 0;
2187
+ h->maybe_unlocking = false; // finished unlocking
2188
+ if (waitp != nullptr) { // we must queue ourselves and sleep
2189
+ PerThreadSynch *new_h = Enqueue(h, waitp, v, kMuIsCond);
2190
+ nv &= kMuLow;
2191
+ if (new_h != nullptr) {
2192
+ nv |= kMuWait | reinterpret_cast<intptr_t>(new_h);
2193
+ } // else new_h could be nullptr if we queued ourselves on a
2194
+ // CondVar
2195
+ }
2196
+ // release spinlock & lock
2197
+ // can release with a store because there were waiters
2198
+ mu_.store(nv, std::memory_order_release);
2199
+ break;
2200
+ }
2201
+
2202
+ // set up to walk the list
2203
+ PerThreadSynch *w_walk; // current waiter during list walk
2204
+ PerThreadSynch *pw_walk; // previous waiter during list walk
2205
+ if (old_h != nullptr) { // we've searched up to old_h before
2206
+ pw_walk = old_h;
2207
+ w_walk = old_h->next;
2208
+ } else { // no prior search, start at beginning
2209
+ pw_walk =
2210
+ nullptr; // h->next's predecessor may change; don't record it
2211
+ w_walk = h->next;
2212
+ }
2213
+
2214
+ h->may_skip = false; // ensure we never skip past h in future searches
2215
+ // even if other waiters are queued after it.
2216
+ ABSL_RAW_CHECK(h->skip == nullptr, "illegal skip from head");
2217
+
2218
+ h->maybe_unlocking = true; // we're about to scan the waiter list
2219
+ // without the spinlock held.
2220
+ // Enqueue must be conservative about
2221
+ // priority queuing.
2222
+
2223
+ // We must release the spinlock to evaluate the conditions.
2224
+ mu_.store(v, std::memory_order_release); // release just spinlock
2225
+ // can release with a store because there were waiters
2226
+
2227
+ // h is the last waiter queued, and w_walk the first unsearched waiter.
2228
+ // Without the spinlock, the locations mu_ and h->next may now change
2229
+ // underneath us, but since we hold the lock itself, the only legal
2230
+ // change is to add waiters between h and w_walk. Therefore, it's safe
2231
+ // to walk the path from w_walk to h inclusive. (TryRemove() can remove
2232
+ // a waiter anywhere, but it acquires both the spinlock and the Mutex)
2233
+
2234
+ old_h = h; // remember we searched to here
2235
+
2236
+ // Walk the path upto and including h looking for waiters we can wake.
2237
+ while (pw_walk != h) {
2238
+ w_walk->wake = false;
2239
+ if (w_walk->waitp->cond ==
2240
+ nullptr || // no condition => vacuously true OR
2241
+ (w_walk->waitp->cond != known_false &&
2242
+ // this thread's condition is not known false, AND
2243
+ // is in fact true
2244
+ EvalConditionIgnored(this, w_walk->waitp->cond))) {
2245
+ if (w == nullptr) {
2246
+ w_walk->wake = true; // can wake this waiter
2247
+ w = w_walk;
2248
+ pw = pw_walk;
2249
+ if (w_walk->waitp->how == kExclusive) {
2250
+ wr_wait = kMuWrWait;
2251
+ break; // bail if waking this writer
2252
+ }
2253
+ } else if (w_walk->waitp->how == kShared) { // wake if a reader
2254
+ w_walk->wake = true;
2255
+ } else { // writer with true condition
2256
+ wr_wait = kMuWrWait;
2257
+ }
2258
+ } else { // can't wake; condition false
2259
+ known_false = w_walk->waitp->cond; // remember last false condition
2260
+ }
2261
+ if (w_walk->wake) { // we're waking reader w_walk
2262
+ pw_walk = w_walk; // don't skip similar waiters
2263
+ } else { // not waking; skip as much as possible
2264
+ pw_walk = Skip(w_walk);
2265
+ }
2266
+ // If pw_walk == h, then load of pw_walk->next can race with
2267
+ // concurrent write in Enqueue(). However, at the same time
2268
+ // we do not need to do the load, because we will bail out
2269
+ // from the loop anyway.
2270
+ if (pw_walk != h) {
2271
+ w_walk = pw_walk->next;
2272
+ }
2273
+ }
2274
+
2275
+ continue; // restart for(;;)-loop to wakeup w or to find more waiters
2276
+ }
2277
+ ABSL_RAW_CHECK(pw->next == w, "pw not w's predecessor");
2278
+ // The first (and perhaps only) waiter we've chosen to wake is w, whose
2279
+ // predecessor is pw. If w is a reader, we must wake all the other
2280
+ // waiters with wake==true as well. We may also need to queue
2281
+ // ourselves if waitp != null. The spinlock and the lock are still
2282
+ // held.
2283
+
2284
+ // This traverses the list in [ pw->next, h ], where h is the head,
2285
+ // removing all elements with wake==true and placing them in the
2286
+ // singly-linked list wake_list. Returns the new head.
2287
+ h = DequeueAllWakeable(h, pw, &wake_list);
2288
+
2289
+ intptr_t nv = (v & kMuEvent) | kMuDesig;
2290
+ // assume no waiters left,
2291
+ // set kMuDesig for INV1a
2292
+
2293
+ if (waitp != nullptr) { // we must queue ourselves and sleep
2294
+ h = Enqueue(h, waitp, v, kMuIsCond);
2295
+ // h is new last waiter; could be null if we queued ourselves on a
2296
+ // CondVar
2297
+ }
2298
+
2299
+ ABSL_RAW_CHECK(wake_list != kPerThreadSynchNull,
2300
+ "unexpected empty wake list");
2301
+
2302
+ if (h != nullptr) { // there are waiters left
2303
+ h->readers = 0;
2304
+ h->maybe_unlocking = false; // finished unlocking
2305
+ nv |= wr_wait | kMuWait | reinterpret_cast<intptr_t>(h);
2306
+ }
2307
+
2308
+ // release both spinlock & lock
2309
+ // can release with a store because there were waiters
2310
+ mu_.store(nv, std::memory_order_release);
2311
+ break; // out of for(;;)-loop
2312
+ }
2313
+ // aggressive here; no one can proceed till we do
2314
+ c = synchronization_internal::MutexDelay(c, AGGRESSIVE);
2315
+ } // end of for(;;)-loop
2316
+
2317
+ if (wake_list != kPerThreadSynchNull) {
2318
+ int64_t enqueue_timestamp = wake_list->waitp->contention_start_cycles;
2319
+ bool cond_waiter = wake_list->cond_waiter;
2320
+ do {
2321
+ wake_list = Wakeup(wake_list); // wake waiters
2322
+ } while (wake_list != kPerThreadSynchNull);
2323
+ if (!cond_waiter) {
2324
+ // Sample lock contention events only if the (first) waiter was trying to
2325
+ // acquire the lock, not waiting on a condition variable or Condition.
2326
+ int64_t wait_cycles =
2327
+ base_internal::CycleClock::Now() - enqueue_timestamp;
2328
+ mutex_tracer("slow release", this, wait_cycles);
2329
+ ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
2330
+ submit_profile_data(enqueue_timestamp);
2331
+ ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
2332
+ }
2333
+ }
2334
+ }
2335
+
2336
+ // Used by CondVar implementation to reacquire mutex after waking from
2337
+ // condition variable. This routine is used instead of Lock() because the
2338
+ // waiting thread may have been moved from the condition variable queue to the
2339
+ // mutex queue without a wakeup, by Trans(). In that case, when the thread is
2340
+ // finally woken, the woken thread will believe it has been woken from the
2341
+ // condition variable (i.e. its PC will be in when in the CondVar code), when
2342
+ // in fact it has just been woken from the mutex. Thus, it must enter the slow
2343
+ // path of the mutex in the same state as if it had just woken from the mutex.
2344
+ // That is, it must ensure to clear kMuDesig (INV1b).
2345
+ void Mutex::Trans(MuHow how) {
2346
+ this->LockSlow(how, nullptr, kMuHasBlocked | kMuIsCond);
2347
+ }
2348
+
2349
+ // Used by CondVar implementation to effectively wake thread w from the
2350
+ // condition variable. If this mutex is free, we simply wake the thread.
2351
+ // It will later acquire the mutex with high probability. Otherwise, we
2352
+ // enqueue thread w on this mutex.
2353
+ void Mutex::Fer(PerThreadSynch *w) {
2354
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2355
+ int c = 0;
2356
+ ABSL_RAW_CHECK(w->waitp->cond == nullptr,
2357
+ "Mutex::Fer while waiting on Condition");
2358
+ ABSL_RAW_CHECK(!w->waitp->timeout.has_timeout(),
2359
+ "Mutex::Fer while in timed wait");
2360
+ ABSL_RAW_CHECK(w->waitp->cv_word == nullptr,
2361
+ "Mutex::Fer with pending CondVar queueing");
2362
+ for (;;) {
2363
+ intptr_t v = mu_.load(std::memory_order_relaxed);
2364
+ // Note: must not queue if the mutex is unlocked (nobody will wake it).
2365
+ // For example, we can have only kMuWait (conditional) or maybe
2366
+ // kMuWait|kMuWrWait.
2367
+ // conflicting != 0 implies that the waking thread cannot currently take
2368
+ // the mutex, which in turn implies that someone else has it and can wake
2369
+ // us if we queue.
2370
+ const intptr_t conflicting =
2371
+ kMuWriter | (w->waitp->how == kShared ? 0 : kMuReader);
2372
+ if ((v & conflicting) == 0) {
2373
+ w->next = nullptr;
2374
+ w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
2375
+ IncrementSynchSem(this, w);
2376
+ return;
2377
+ } else {
2378
+ if ((v & (kMuSpin|kMuWait)) == 0) { // no waiters
2379
+ // This thread tries to become the one and only waiter.
2380
+ PerThreadSynch *new_h = Enqueue(nullptr, w->waitp, v, kMuIsCond);
2381
+ ABSL_RAW_CHECK(new_h != nullptr,
2382
+ "Enqueue failed"); // we must queue ourselves
2383
+ if (mu_.compare_exchange_strong(
2384
+ v, reinterpret_cast<intptr_t>(new_h) | (v & kMuLow) | kMuWait,
2385
+ std::memory_order_release, std::memory_order_relaxed)) {
2386
+ return;
2387
+ }
2388
+ } else if ((v & kMuSpin) == 0 &&
2389
+ mu_.compare_exchange_strong(v, v | kMuSpin | kMuWait)) {
2390
+ PerThreadSynch *h = GetPerThreadSynch(v);
2391
+ PerThreadSynch *new_h = Enqueue(h, w->waitp, v, kMuIsCond);
2392
+ ABSL_RAW_CHECK(new_h != nullptr,
2393
+ "Enqueue failed"); // we must queue ourselves
2394
+ do {
2395
+ v = mu_.load(std::memory_order_relaxed);
2396
+ } while (!mu_.compare_exchange_weak(
2397
+ v,
2398
+ (v & kMuLow & ~kMuSpin) | kMuWait |
2399
+ reinterpret_cast<intptr_t>(new_h),
2400
+ std::memory_order_release, std::memory_order_relaxed));
2401
+ return;
2402
+ }
2403
+ }
2404
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2405
+ }
2406
+ }
2407
+
2408
+ void Mutex::AssertHeld() const {
2409
+ if ((mu_.load(std::memory_order_relaxed) & kMuWriter) == 0) {
2410
+ SynchEvent *e = GetSynchEvent(this);
2411
+ ABSL_RAW_LOG(FATAL, "thread should hold write lock on Mutex %p %s",
2412
+ static_cast<const void *>(this),
2413
+ (e == nullptr ? "" : e->name));
2414
+ }
2415
+ }
2416
+
2417
+ void Mutex::AssertReaderHeld() const {
2418
+ if ((mu_.load(std::memory_order_relaxed) & (kMuReader | kMuWriter)) == 0) {
2419
+ SynchEvent *e = GetSynchEvent(this);
2420
+ ABSL_RAW_LOG(
2421
+ FATAL, "thread should hold at least a read lock on Mutex %p %s",
2422
+ static_cast<const void *>(this), (e == nullptr ? "" : e->name));
2423
+ }
2424
+ }
2425
+
2426
+ // -------------------------------- condition variables
2427
+ static const intptr_t kCvSpin = 0x0001L; // spinlock protects waiter list
2428
+ static const intptr_t kCvEvent = 0x0002L; // record events
2429
+
2430
+ static const intptr_t kCvLow = 0x0003L; // low order bits of CV
2431
+
2432
+ // Hack to make constant values available to gdb pretty printer
2433
+ enum { kGdbCvSpin = kCvSpin, kGdbCvEvent = kCvEvent, kGdbCvLow = kCvLow, };
2434
+
2435
+ static_assert(PerThreadSynch::kAlignment > kCvLow,
2436
+ "PerThreadSynch::kAlignment must be greater than kCvLow");
2437
+
2438
+ void CondVar::EnableDebugLog(const char *name) {
2439
+ SynchEvent *e = EnsureSynchEvent(&this->cv_, name, kCvEvent, kCvSpin);
2440
+ e->log = true;
2441
+ UnrefSynchEvent(e);
2442
+ }
2443
+
2444
+ CondVar::~CondVar() {
2445
+ if ((cv_.load(std::memory_order_relaxed) & kCvEvent) != 0) {
2446
+ ForgetSynchEvent(&this->cv_, kCvEvent, kCvSpin);
2447
+ }
2448
+ }
2449
+
2450
+
2451
+ // Remove thread s from the list of waiters on this condition variable.
2452
+ void CondVar::Remove(PerThreadSynch *s) {
2453
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2454
+ intptr_t v;
2455
+ int c = 0;
2456
+ for (v = cv_.load(std::memory_order_relaxed);;
2457
+ v = cv_.load(std::memory_order_relaxed)) {
2458
+ if ((v & kCvSpin) == 0 && // attempt to acquire spinlock
2459
+ cv_.compare_exchange_strong(v, v | kCvSpin,
2460
+ std::memory_order_acquire,
2461
+ std::memory_order_relaxed)) {
2462
+ PerThreadSynch *h = reinterpret_cast<PerThreadSynch *>(v & ~kCvLow);
2463
+ if (h != nullptr) {
2464
+ PerThreadSynch *w = h;
2465
+ while (w->next != s && w->next != h) { // search for thread
2466
+ w = w->next;
2467
+ }
2468
+ if (w->next == s) { // found thread; remove it
2469
+ w->next = s->next;
2470
+ if (h == s) {
2471
+ h = (w == s) ? nullptr : w;
2472
+ }
2473
+ s->next = nullptr;
2474
+ s->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
2475
+ }
2476
+ }
2477
+ // release spinlock
2478
+ cv_.store((v & kCvEvent) | reinterpret_cast<intptr_t>(h),
2479
+ std::memory_order_release);
2480
+ return;
2481
+ } else {
2482
+ // try again after a delay
2483
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2484
+ }
2485
+ }
2486
+ }
2487
+
2488
+ // Queue thread waitp->thread on condition variable word cv_word using
2489
+ // wait parameters waitp.
2490
+ // We split this into a separate routine, rather than simply doing it as part
2491
+ // of WaitCommon(). If we were to queue ourselves on the condition variable
2492
+ // before calling Mutex::UnlockSlow(), the Mutex code might be re-entered (via
2493
+ // the logging code, or via a Condition function) and might potentially attempt
2494
+ // to block this thread. That would be a problem if the thread were already on
2495
+ // a the condition variable waiter queue. Thus, we use the waitp->cv_word
2496
+ // to tell the unlock code to call CondVarEnqueue() to queue the thread on the
2497
+ // condition variable queue just before the mutex is to be unlocked, and (most
2498
+ // importantly) after any call to an external routine that might re-enter the
2499
+ // mutex code.
2500
+ static void CondVarEnqueue(SynchWaitParams *waitp) {
2501
+ // This thread might be transferred to the Mutex queue by Fer() when
2502
+ // we are woken. To make sure that is what happens, Enqueue() doesn't
2503
+ // call CondVarEnqueue() again but instead uses its normal code. We
2504
+ // must do this before we queue ourselves so that cv_word will be null
2505
+ // when seen by the dequeuer, who may wish immediately to requeue
2506
+ // this thread on another queue.
2507
+ std::atomic<intptr_t> *cv_word = waitp->cv_word;
2508
+ waitp->cv_word = nullptr;
2509
+
2510
+ intptr_t v = cv_word->load(std::memory_order_relaxed);
2511
+ int c = 0;
2512
+ while ((v & kCvSpin) != 0 || // acquire spinlock
2513
+ !cv_word->compare_exchange_weak(v, v | kCvSpin,
2514
+ std::memory_order_acquire,
2515
+ std::memory_order_relaxed)) {
2516
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2517
+ v = cv_word->load(std::memory_order_relaxed);
2518
+ }
2519
+ ABSL_RAW_CHECK(waitp->thread->waitp == nullptr, "waiting when shouldn't be");
2520
+ waitp->thread->waitp = waitp; // prepare ourselves for waiting
2521
+ PerThreadSynch *h = reinterpret_cast<PerThreadSynch *>(v & ~kCvLow);
2522
+ if (h == nullptr) { // add this thread to waiter list
2523
+ waitp->thread->next = waitp->thread;
2524
+ } else {
2525
+ waitp->thread->next = h->next;
2526
+ h->next = waitp->thread;
2527
+ }
2528
+ waitp->thread->state.store(PerThreadSynch::kQueued,
2529
+ std::memory_order_relaxed);
2530
+ cv_word->store((v & kCvEvent) | reinterpret_cast<intptr_t>(waitp->thread),
2531
+ std::memory_order_release);
2532
+ }
2533
+
2534
+ bool CondVar::WaitCommon(Mutex *mutex, KernelTimeout t) {
2535
+ bool rc = false; // return value; true iff we timed-out
2536
+
2537
+ intptr_t mutex_v = mutex->mu_.load(std::memory_order_relaxed);
2538
+ Mutex::MuHow mutex_how = ((mutex_v & kMuWriter) != 0) ? kExclusive : kShared;
2539
+ ABSL_TSAN_MUTEX_PRE_UNLOCK(mutex, TsanFlags(mutex_how));
2540
+
2541
+ // maybe trace this call
2542
+ intptr_t v = cv_.load(std::memory_order_relaxed);
2543
+ cond_var_tracer("Wait", this);
2544
+ if ((v & kCvEvent) != 0) {
2545
+ PostSynchEvent(this, SYNCH_EV_WAIT);
2546
+ }
2547
+
2548
+ // Release mu and wait on condition variable.
2549
+ SynchWaitParams waitp(mutex_how, nullptr, t, mutex,
2550
+ Synch_GetPerThreadAnnotated(mutex), &cv_);
2551
+ // UnlockSlow() will call CondVarEnqueue() just before releasing the
2552
+ // Mutex, thus queuing this thread on the condition variable. See
2553
+ // CondVarEnqueue() for the reasons.
2554
+ mutex->UnlockSlow(&waitp);
2555
+
2556
+ // wait for signal
2557
+ while (waitp.thread->state.load(std::memory_order_acquire) ==
2558
+ PerThreadSynch::kQueued) {
2559
+ if (!Mutex::DecrementSynchSem(mutex, waitp.thread, t)) {
2560
+ this->Remove(waitp.thread);
2561
+ rc = true;
2562
+ }
2563
+ }
2564
+
2565
+ ABSL_RAW_CHECK(waitp.thread->waitp != nullptr, "not waiting when should be");
2566
+ waitp.thread->waitp = nullptr; // cleanup
2567
+
2568
+ // maybe trace this call
2569
+ cond_var_tracer("Unwait", this);
2570
+ if ((v & kCvEvent) != 0) {
2571
+ PostSynchEvent(this, SYNCH_EV_WAIT_RETURNING);
2572
+ }
2573
+
2574
+ // From synchronization point of view Wait is unlock of the mutex followed
2575
+ // by lock of the mutex. We've annotated start of unlock in the beginning
2576
+ // of the function. Now, finish unlock and annotate lock of the mutex.
2577
+ // (Trans is effectively lock).
2578
+ ABSL_TSAN_MUTEX_POST_UNLOCK(mutex, TsanFlags(mutex_how));
2579
+ ABSL_TSAN_MUTEX_PRE_LOCK(mutex, TsanFlags(mutex_how));
2580
+ mutex->Trans(mutex_how); // Reacquire mutex
2581
+ ABSL_TSAN_MUTEX_POST_LOCK(mutex, TsanFlags(mutex_how), 0);
2582
+ return rc;
2583
+ }
2584
+
2585
+ bool CondVar::WaitWithTimeout(Mutex *mu, absl::Duration timeout) {
2586
+ return WaitWithDeadline(mu, DeadlineFromTimeout(timeout));
2587
+ }
2588
+
2589
+ bool CondVar::WaitWithDeadline(Mutex *mu, absl::Time deadline) {
2590
+ return WaitCommon(mu, KernelTimeout(deadline));
2591
+ }
2592
+
2593
+ void CondVar::Wait(Mutex *mu) {
2594
+ WaitCommon(mu, KernelTimeout::Never());
2595
+ }
2596
+
2597
+ // Wake thread w
2598
+ // If it was a timed wait, w will be waiting on w->cv
2599
+ // Otherwise, if it was not a Mutex mutex, w will be waiting on w->sem
2600
+ // Otherwise, w is transferred to the Mutex mutex via Mutex::Fer().
2601
+ void CondVar::Wakeup(PerThreadSynch *w) {
2602
+ if (w->waitp->timeout.has_timeout() || w->waitp->cvmu == nullptr) {
2603
+ // The waiting thread only needs to observe "w->state == kAvailable" to be
2604
+ // released, we must cache "cvmu" before clearing "next".
2605
+ Mutex *mu = w->waitp->cvmu;
2606
+ w->next = nullptr;
2607
+ w->state.store(PerThreadSynch::kAvailable, std::memory_order_release);
2608
+ Mutex::IncrementSynchSem(mu, w);
2609
+ } else {
2610
+ w->waitp->cvmu->Fer(w);
2611
+ }
2612
+ }
2613
+
2614
+ void CondVar::Signal() {
2615
+ SchedulingGuard::ScopedDisable disable_rescheduling;
2616
+ ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
2617
+ intptr_t v;
2618
+ int c = 0;
2619
+ for (v = cv_.load(std::memory_order_relaxed); v != 0;
2620
+ v = cv_.load(std::memory_order_relaxed)) {
2621
+ if ((v & kCvSpin) == 0 && // attempt to acquire spinlock
2622
+ cv_.compare_exchange_strong(v, v | kCvSpin,
2623
+ std::memory_order_acquire,
2624
+ std::memory_order_relaxed)) {
2625
+ PerThreadSynch *h = reinterpret_cast<PerThreadSynch *>(v & ~kCvLow);
2626
+ PerThreadSynch *w = nullptr;
2627
+ if (h != nullptr) { // remove first waiter
2628
+ w = h->next;
2629
+ if (w == h) {
2630
+ h = nullptr;
2631
+ } else {
2632
+ h->next = w->next;
2633
+ }
2634
+ }
2635
+ // release spinlock
2636
+ cv_.store((v & kCvEvent) | reinterpret_cast<intptr_t>(h),
2637
+ std::memory_order_release);
2638
+ if (w != nullptr) {
2639
+ CondVar::Wakeup(w); // wake waiter, if there was one
2640
+ cond_var_tracer("Signal wakeup", this);
2641
+ }
2642
+ if ((v & kCvEvent) != 0) {
2643
+ PostSynchEvent(this, SYNCH_EV_SIGNAL);
2644
+ }
2645
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2646
+ return;
2647
+ } else {
2648
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2649
+ }
2650
+ }
2651
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2652
+ }
2653
+
2654
+ void CondVar::SignalAll () {
2655
+ ABSL_TSAN_MUTEX_PRE_SIGNAL(nullptr, 0);
2656
+ intptr_t v;
2657
+ int c = 0;
2658
+ for (v = cv_.load(std::memory_order_relaxed); v != 0;
2659
+ v = cv_.load(std::memory_order_relaxed)) {
2660
+ // empty the list if spinlock free
2661
+ // We do this by simply setting the list to empty using
2662
+ // compare and swap. We then have the entire list in our hands,
2663
+ // which cannot be changing since we grabbed it while no one
2664
+ // held the lock.
2665
+ if ((v & kCvSpin) == 0 &&
2666
+ cv_.compare_exchange_strong(v, v & kCvEvent, std::memory_order_acquire,
2667
+ std::memory_order_relaxed)) {
2668
+ PerThreadSynch *h = reinterpret_cast<PerThreadSynch *>(v & ~kCvLow);
2669
+ if (h != nullptr) {
2670
+ PerThreadSynch *w;
2671
+ PerThreadSynch *n = h->next;
2672
+ do { // for every thread, wake it up
2673
+ w = n;
2674
+ n = n->next;
2675
+ CondVar::Wakeup(w);
2676
+ } while (w != h);
2677
+ cond_var_tracer("SignalAll wakeup", this);
2678
+ }
2679
+ if ((v & kCvEvent) != 0) {
2680
+ PostSynchEvent(this, SYNCH_EV_SIGNALALL);
2681
+ }
2682
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2683
+ return;
2684
+ } else {
2685
+ // try again after a delay
2686
+ c = synchronization_internal::MutexDelay(c, GENTLE);
2687
+ }
2688
+ }
2689
+ ABSL_TSAN_MUTEX_POST_SIGNAL(nullptr, 0);
2690
+ }
2691
+
2692
+ void ReleasableMutexLock::Release() {
2693
+ ABSL_RAW_CHECK(this->mu_ != nullptr,
2694
+ "ReleasableMutexLock::Release may only be called once");
2695
+ this->mu_->Unlock();
2696
+ this->mu_ = nullptr;
2697
+ }
2698
+
2699
+ #ifdef ABSL_HAVE_THREAD_SANITIZER
2700
+ extern "C" void __tsan_read1(void *addr);
2701
+ #else
2702
+ #define __tsan_read1(addr) // do nothing if TSan not enabled
2703
+ #endif
2704
+
2705
+ // A function that just returns its argument, dereferenced
2706
+ static bool Dereference(void *arg) {
2707
+ // ThreadSanitizer does not instrument this file for memory accesses.
2708
+ // This function dereferences a user variable that can participate
2709
+ // in a data race, so we need to manually tell TSan about this memory access.
2710
+ __tsan_read1(arg);
2711
+ return *(static_cast<bool *>(arg));
2712
+ }
2713
+
2714
+ Condition::Condition() {} // null constructor, used for kTrue only
2715
+ const Condition Condition::kTrue;
2716
+
2717
+ Condition::Condition(bool (*func)(void *), void *arg)
2718
+ : eval_(&CallVoidPtrFunction),
2719
+ function_(func),
2720
+ method_(nullptr),
2721
+ arg_(arg) {}
2722
+
2723
+ bool Condition::CallVoidPtrFunction(const Condition *c) {
2724
+ return (*c->function_)(c->arg_);
2725
+ }
2726
+
2727
+ Condition::Condition(const bool *cond)
2728
+ : eval_(CallVoidPtrFunction),
2729
+ function_(Dereference),
2730
+ method_(nullptr),
2731
+ // const_cast is safe since Dereference does not modify arg
2732
+ arg_(const_cast<bool *>(cond)) {}
2733
+
2734
+ bool Condition::Eval() const {
2735
+ // eval_ == null for kTrue
2736
+ return (this->eval_ == nullptr) || (*this->eval_)(this);
2737
+ }
2738
+
2739
+ bool Condition::GuaranteedEqual(const Condition *a, const Condition *b) {
2740
+ if (a == nullptr) {
2741
+ return b == nullptr || b->eval_ == nullptr;
2742
+ }
2743
+ if (b == nullptr || b->eval_ == nullptr) {
2744
+ return a->eval_ == nullptr;
2745
+ }
2746
+ return a->eval_ == b->eval_ && a->function_ == b->function_ &&
2747
+ a->arg_ == b->arg_ && a->method_ == b->method_;
2748
+ }
2749
+
2750
+ ABSL_NAMESPACE_END
2751
+ } // namespace absl