grpc 1.37.1 → 1.38.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (544) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +64 -58
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/channel_args.h +28 -0
  5. data/include/grpc/event_engine/event_engine.h +336 -0
  6. data/include/grpc/event_engine/port.h +39 -0
  7. data/include/grpc/event_engine/slice_allocator.h +81 -0
  8. data/include/grpc/grpc.h +2 -2
  9. data/include/grpc/grpc_security_constants.h +14 -0
  10. data/include/grpc/impl/codegen/grpc_types.h +11 -0
  11. data/include/grpc/impl/codegen/port_platform.h +5 -0
  12. data/include/grpc/module.modulemap +14 -14
  13. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  14. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  15. data/src/core/ext/filters/client_channel/client_channel.cc +628 -3101
  16. data/src/core/ext/filters/client_channel/client_channel.h +489 -55
  17. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  19. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  20. data/src/core/ext/filters/client_channel/connector.h +1 -1
  21. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  22. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  23. data/src/core/ext/filters/client_channel/health/health_check_client.cc +26 -27
  24. data/src/core/ext/filters/client_channel/health/health_check_client.h +27 -26
  25. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  26. data/src/core/ext/filters/client_channel/lb_policy.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy.h +4 -4
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +46 -43
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +5 -5
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +14 -12
  34. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +4 -4
  35. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  36. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +15 -15
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +36 -30
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +23 -23
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +31 -46
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +84 -61
  41. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  43. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -15
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -9
  55. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  56. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  57. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -11
  58. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +43 -28
  60. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  61. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  62. data/src/core/ext/filters/client_channel/retry_filter.cc +2188 -0
  63. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  64. data/src/core/ext/filters/client_channel/retry_service_config.cc +287 -0
  65. data/src/core/ext/filters/client_channel/retry_service_config.h +90 -0
  66. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  67. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  68. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  69. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  70. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  71. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  72. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  73. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  74. data/src/core/ext/filters/client_idle/client_idle_filter.cc +16 -15
  75. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  76. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  77. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  78. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  79. data/src/core/ext/filters/http/client/http_client_filter.cc +28 -21
  80. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  83. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  84. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  86. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  87. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  88. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  89. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  90. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  91. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  92. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +44 -45
  94. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  95. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  96. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +2 -2
  97. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  98. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -116
  99. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  100. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  101. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  102. data/src/core/ext/transport/chttp2/transport/flow_control.h +8 -8
  103. data/src/core/ext/transport/chttp2/transport/frame_data.cc +8 -8
  104. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +7 -8
  106. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  107. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  108. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  109. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  110. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  111. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +6 -5
  112. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  113. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  114. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  115. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +237 -208
  116. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +10 -10
  117. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  118. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  119. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  120. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  121. data/src/core/ext/transport/chttp2/transport/internal.h +31 -27
  122. data/src/core/ext/transport/chttp2/transport/parsing.cc +63 -56
  123. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  124. data/src/core/ext/transport/inproc/inproc_transport.cc +30 -29
  125. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  126. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  127. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  128. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  129. data/src/core/ext/xds/xds_api.cc +101 -93
  130. data/src/core/ext/xds/xds_api.h +6 -6
  131. data/src/core/ext/xds/xds_bootstrap.cc +97 -159
  132. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  133. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  134. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  135. data/src/core/ext/xds/xds_channel_args.h +5 -2
  136. data/src/core/ext/xds/xds_client.cc +310 -178
  137. data/src/core/ext/xds/xds_client.h +41 -27
  138. data/src/core/ext/xds/xds_client_stats.h +3 -2
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  140. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  141. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  142. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +3 -20
  143. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +6 -11
  144. data/src/core/lib/channel/channel_stack.cc +10 -9
  145. data/src/core/lib/channel/channel_stack.h +10 -9
  146. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  147. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  148. data/src/core/lib/channel/channelz.cc +21 -13
  149. data/src/core/lib/channel/connected_channel.cc +4 -4
  150. data/src/core/lib/channel/handshaker.cc +7 -6
  151. data/src/core/lib/channel/handshaker.h +5 -5
  152. data/src/core/lib/event_engine/slice_allocator.cc +59 -0
  153. data/src/core/lib/event_engine/sockaddr.cc +38 -0
  154. data/src/core/lib/gprpp/ref_counted.h +28 -14
  155. data/src/core/lib/gprpp/status_helper.cc +407 -0
  156. data/src/core/lib/gprpp/status_helper.h +180 -0
  157. data/src/core/lib/http/httpcli.cc +11 -11
  158. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  159. data/src/core/lib/http/parser.cc +16 -16
  160. data/src/core/lib/http/parser.h +4 -4
  161. data/src/core/lib/iomgr/buffer_list.cc +7 -9
  162. data/src/core/lib/iomgr/buffer_list.h +4 -5
  163. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  164. data/src/core/lib/iomgr/call_combiner.h +12 -14
  165. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  166. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  167. data/src/core/lib/iomgr/closure.h +7 -6
  168. data/src/core/lib/iomgr/combiner.cc +14 -12
  169. data/src/core/lib/iomgr/combiner.h +2 -2
  170. data/src/core/lib/iomgr/endpoint.cc +1 -1
  171. data/src/core/lib/iomgr/endpoint.h +2 -2
  172. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  173. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  174. data/src/core/lib/iomgr/error.cc +167 -61
  175. data/src/core/lib/iomgr/error.h +217 -106
  176. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  177. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  178. data/src/core/lib/iomgr/error_internal.h +5 -1
  179. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  180. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  181. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  182. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  183. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  184. data/src/core/lib/iomgr/ev_posix.h +9 -9
  185. data/src/core/lib/iomgr/exec_ctx.cc +4 -4
  186. data/src/core/lib/iomgr/exec_ctx.h +1 -1
  187. data/src/core/lib/iomgr/executor.cc +8 -8
  188. data/src/core/lib/iomgr/executor.h +2 -2
  189. data/src/core/lib/iomgr/iomgr.cc +1 -1
  190. data/src/core/lib/iomgr/iomgr.h +1 -1
  191. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  192. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  193. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  194. data/src/core/lib/iomgr/iomgr_posix.cc +1 -1
  195. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  196. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  197. data/src/core/lib/iomgr/load_file.cc +4 -4
  198. data/src/core/lib/iomgr/load_file.h +2 -2
  199. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  200. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  201. data/src/core/lib/iomgr/pollset.cc +5 -5
  202. data/src/core/lib/iomgr/pollset.h +9 -9
  203. data/src/core/lib/iomgr/pollset_custom.cc +5 -5
  204. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  205. data/src/core/lib/iomgr/port.h +1 -1
  206. data/src/core/lib/iomgr/python_util.h +1 -1
  207. data/src/core/lib/iomgr/resolve_address.cc +3 -3
  208. data/src/core/lib/iomgr/resolve_address.h +6 -6
  209. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  210. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  211. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  212. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  213. data/src/core/lib/iomgr/resource_quota.cc +11 -10
  214. data/src/core/lib/iomgr/socket_utils_common_posix.cc +22 -20
  215. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  216. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  217. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  218. data/src/core/lib/iomgr/tcp_client_posix.cc +15 -17
  219. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  220. data/src/core/lib/iomgr/tcp_client_windows.cc +5 -5
  221. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  222. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  223. data/src/core/lib/iomgr/tcp_posix.cc +36 -34
  224. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  225. data/src/core/lib/iomgr/tcp_server.h +12 -11
  226. data/src/core/lib/iomgr/tcp_server_custom.cc +23 -21
  227. data/src/core/lib/iomgr/tcp_server_posix.cc +22 -21
  228. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  229. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +19 -17
  230. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  231. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  232. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  233. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  234. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  235. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  236. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  237. data/src/core/lib/iomgr/timer_custom.h +1 -1
  238. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  239. data/src/core/lib/iomgr/udp_server.cc +21 -20
  240. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  241. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  242. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  243. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  244. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  245. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  246. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  247. data/src/core/lib/iomgr/work_serializer.h +17 -1
  248. data/src/core/lib/json/json.h +1 -1
  249. data/src/core/lib/json/json_reader.cc +4 -4
  250. data/src/core/lib/matchers/matchers.cc +39 -39
  251. data/src/core/lib/matchers/matchers.h +28 -28
  252. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  253. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  254. data/src/core/lib/security/credentials/credentials.h +2 -2
  255. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  256. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  257. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  258. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  259. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  260. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  261. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  262. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  263. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  264. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  265. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -9
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  271. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  274. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  276. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  278. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  279. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  280. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +19 -13
  281. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  282. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  283. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  284. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  285. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  286. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  287. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  288. data/src/core/lib/security/security_connector/local/local_security_connector.cc +14 -4
  289. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  290. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  291. data/src/core/lib/security/security_connector/ssl_utils.cc +22 -4
  292. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  293. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +56 -60
  294. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  295. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  296. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  297. data/src/core/lib/security/transport/security_handshaker.cc +33 -32
  298. data/src/core/lib/security/transport/server_auth_filter.cc +19 -13
  299. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  300. data/src/core/lib/security/transport/tsi_error.h +2 -1
  301. data/src/core/lib/security/util/json_util.cc +2 -2
  302. data/src/core/lib/security/util/json_util.h +1 -1
  303. data/src/core/lib/surface/call.cc +46 -45
  304. data/src/core/lib/surface/call.h +2 -2
  305. data/src/core/lib/surface/channel.cc +6 -6
  306. data/src/core/lib/surface/channel.h +3 -2
  307. data/src/core/lib/surface/channel_ping.cc +1 -1
  308. data/src/core/lib/surface/completion_queue.cc +46 -47
  309. data/src/core/lib/surface/completion_queue.h +2 -1
  310. data/src/core/lib/surface/lame_client.cc +11 -11
  311. data/src/core/lib/surface/lame_client.h +1 -1
  312. data/src/core/lib/surface/server.cc +28 -22
  313. data/src/core/lib/surface/server.h +16 -15
  314. data/src/core/lib/surface/validate_metadata.cc +7 -7
  315. data/src/core/lib/surface/validate_metadata.h +3 -2
  316. data/src/core/lib/surface/version.cc +4 -2
  317. data/src/core/lib/transport/byte_stream.cc +5 -5
  318. data/src/core/lib/transport/byte_stream.h +8 -8
  319. data/src/core/lib/transport/connectivity_state.cc +1 -1
  320. data/src/core/lib/transport/error_utils.cc +19 -8
  321. data/src/core/lib/transport/error_utils.h +11 -5
  322. data/src/core/lib/transport/metadata_batch.cc +37 -37
  323. data/src/core/lib/transport/metadata_batch.h +19 -18
  324. data/src/core/lib/transport/transport.cc +4 -3
  325. data/src/core/lib/transport/transport.h +4 -4
  326. data/src/core/lib/transport/transport_op_string.cc +5 -5
  327. data/src/core/tsi/alts/crypt/gsec.h +4 -0
  328. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  329. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  330. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  331. data/src/core/tsi/ssl_transport_security.cc +32 -14
  332. data/src/core/tsi/ssl_transport_security.h +3 -4
  333. data/src/ruby/bin/math_services_pb.rb +1 -1
  334. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  335. data/src/ruby/lib/grpc/version.rb +1 -1
  336. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  337. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  338. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  339. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  340. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  341. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  342. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  343. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  344. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  345. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  346. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  347. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  348. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  349. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  350. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  351. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  352. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  353. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  354. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  355. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  356. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  357. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  358. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  359. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  360. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  361. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  362. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  363. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  364. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  365. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  366. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  367. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  368. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  369. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  370. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  371. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  372. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  373. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  374. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  375. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  376. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  377. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  378. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  379. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  380. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  381. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  382. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  383. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  384. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  385. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  387. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  388. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  389. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  390. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  391. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  392. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  393. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  394. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  395. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  396. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  397. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  398. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  399. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  400. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  401. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  402. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  403. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  404. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  405. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  406. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  407. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  408. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  409. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  410. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  411. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  412. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  413. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  414. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  415. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  416. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  417. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  418. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  419. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  420. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  421. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  422. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  423. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  424. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  425. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  426. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  427. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  428. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  429. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  430. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  431. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  432. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  433. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  434. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  435. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  436. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  437. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  438. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  439. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  440. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  441. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  442. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  443. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  444. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  445. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  446. data/third_party/boringssl-with-bazel/err_data.c +477 -461
  447. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  448. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +1 -1
  449. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  450. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  451. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  452. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  453. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  454. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  455. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  456. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  457. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  458. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  459. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  460. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  461. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  462. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  463. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +4 -43
  464. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  465. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  466. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  467. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  468. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  469. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +43 -46
  470. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +43 -46
  471. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  472. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  473. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  474. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  475. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  476. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  477. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  478. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  479. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  480. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +45 -48
  481. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +38 -43
  482. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +37 -45
  483. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +103 -42
  484. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +58 -37
  485. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  486. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  487. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  488. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +1 -1
  489. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  490. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  491. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  492. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +19 -0
  493. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  494. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  495. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  496. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +39 -89
  497. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  498. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +1 -1
  499. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  500. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  501. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  502. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  503. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  504. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  505. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  506. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  507. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +0 -3
  508. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  509. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +9 -0
  510. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  511. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  512. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  513. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +19 -0
  514. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  515. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1 -38
  516. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  517. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  518. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +2 -0
  519. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  520. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  521. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +185 -17
  522. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  523. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +416 -121
  524. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -0
  525. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +5 -0
  526. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +444 -0
  527. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +244 -1
  528. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +43 -12
  529. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +149 -8
  530. data/third_party/boringssl-with-bazel/src/ssl/internal.h +220 -46
  531. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +7 -1
  532. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  533. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  534. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +74 -15
  535. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +98 -64
  536. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +34 -4
  537. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +205 -100
  538. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  539. metadata +68 -45
  540. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  541. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  542. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  543. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  544. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
@@ -0,0 +1,154 @@
1
+ // Copyright 2020 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_
15
+ #define ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_
16
+
17
+ #include "absl/base/config.h"
18
+
19
+ #ifdef _WIN32
20
+ #include <windows.h>
21
+ #else
22
+ #include <sys/time.h>
23
+ #include <unistd.h>
24
+ #endif
25
+
26
+ #ifdef __linux__
27
+ #include <linux/futex.h>
28
+ #include <sys/syscall.h>
29
+ #endif
30
+
31
+ #include <errno.h>
32
+ #include <stdio.h>
33
+ #include <time.h>
34
+
35
+ #include <atomic>
36
+ #include <cstdint>
37
+
38
+ #include "absl/base/optimization.h"
39
+ #include "absl/synchronization/internal/kernel_timeout.h"
40
+
41
+ #ifdef ABSL_INTERNAL_HAVE_FUTEX
42
+ #error ABSL_INTERNAL_HAVE_FUTEX may not be set on the command line
43
+ #elif defined(__BIONIC__)
44
+ // Bionic supports all the futex operations we need even when some of the futex
45
+ // definitions are missing.
46
+ #define ABSL_INTERNAL_HAVE_FUTEX
47
+ #elif defined(__linux__) && defined(FUTEX_CLOCK_REALTIME)
48
+ // FUTEX_CLOCK_REALTIME requires Linux >= 2.6.28.
49
+ #define ABSL_INTERNAL_HAVE_FUTEX
50
+ #endif
51
+
52
+ #ifdef ABSL_INTERNAL_HAVE_FUTEX
53
+
54
+ namespace absl {
55
+ ABSL_NAMESPACE_BEGIN
56
+ namespace synchronization_internal {
57
+
58
+ // Some Android headers are missing these definitions even though they
59
+ // support these futex operations.
60
+ #ifdef __BIONIC__
61
+ #ifndef SYS_futex
62
+ #define SYS_futex __NR_futex
63
+ #endif
64
+ #ifndef FUTEX_WAIT_BITSET
65
+ #define FUTEX_WAIT_BITSET 9
66
+ #endif
67
+ #ifndef FUTEX_PRIVATE_FLAG
68
+ #define FUTEX_PRIVATE_FLAG 128
69
+ #endif
70
+ #ifndef FUTEX_CLOCK_REALTIME
71
+ #define FUTEX_CLOCK_REALTIME 256
72
+ #endif
73
+ #ifndef FUTEX_BITSET_MATCH_ANY
74
+ #define FUTEX_BITSET_MATCH_ANY 0xFFFFFFFF
75
+ #endif
76
+ #endif
77
+
78
+ #if defined(__NR_futex_time64) && !defined(SYS_futex_time64)
79
+ #define SYS_futex_time64 __NR_futex_time64
80
+ #endif
81
+
82
+ #if defined(SYS_futex_time64) && !defined(SYS_futex)
83
+ #define SYS_futex SYS_futex_time64
84
+ #endif
85
+
86
+ class FutexImpl {
87
+ public:
88
+ static int WaitUntil(std::atomic<int32_t> *v, int32_t val,
89
+ KernelTimeout t) {
90
+ int err = 0;
91
+ if (t.has_timeout()) {
92
+ // https://locklessinc.com/articles/futex_cheat_sheet/
93
+ // Unlike FUTEX_WAIT, FUTEX_WAIT_BITSET uses absolute time.
94
+ struct timespec abs_timeout = t.MakeAbsTimespec();
95
+ // Atomically check that the futex value is still 0, and if it
96
+ // is, sleep until abs_timeout or until woken by FUTEX_WAKE.
97
+ err = syscall(
98
+ SYS_futex, reinterpret_cast<int32_t *>(v),
99
+ FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME, val,
100
+ &abs_timeout, nullptr, FUTEX_BITSET_MATCH_ANY);
101
+ } else {
102
+ // Atomically check that the futex value is still 0, and if it
103
+ // is, sleep until woken by FUTEX_WAKE.
104
+ err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
105
+ FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, nullptr);
106
+ }
107
+ if (ABSL_PREDICT_FALSE(err != 0)) {
108
+ err = -errno;
109
+ }
110
+ return err;
111
+ }
112
+
113
+ static int WaitBitsetAbsoluteTimeout(std::atomic<int32_t> *v, int32_t val,
114
+ int32_t bits,
115
+ const struct timespec *abstime) {
116
+ int err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
117
+ FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG, val, abstime,
118
+ nullptr, bits);
119
+ if (ABSL_PREDICT_FALSE(err != 0)) {
120
+ err = -errno;
121
+ }
122
+ return err;
123
+ }
124
+
125
+ static int Wake(std::atomic<int32_t> *v, int32_t count) {
126
+ int err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
127
+ FUTEX_WAKE | FUTEX_PRIVATE_FLAG, count);
128
+ if (ABSL_PREDICT_FALSE(err < 0)) {
129
+ err = -errno;
130
+ }
131
+ return err;
132
+ }
133
+
134
+ // FUTEX_WAKE_BITSET
135
+ static int WakeBitset(std::atomic<int32_t> *v, int32_t count, int32_t bits) {
136
+ int err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
137
+ FUTEX_WAKE_BITSET | FUTEX_PRIVATE_FLAG, count, nullptr,
138
+ nullptr, bits);
139
+ if (ABSL_PREDICT_FALSE(err < 0)) {
140
+ err = -errno;
141
+ }
142
+ return err;
143
+ }
144
+ };
145
+
146
+ class Futex : public FutexImpl {};
147
+
148
+ } // namespace synchronization_internal
149
+ ABSL_NAMESPACE_END
150
+ } // namespace absl
151
+
152
+ #endif // ABSL_INTERNAL_HAVE_FUTEX
153
+
154
+ #endif // ABSL_SYNCHRONIZATION_INTERNAL_FUTEX_H_
@@ -26,6 +26,7 @@
26
26
  #define ABSL_SYNCHRONIZATION_INTERNAL_KERNEL_TIMEOUT_H_
27
27
 
28
28
  #include <time.h>
29
+
29
30
  #include <algorithm>
30
31
  #include <limits>
31
32
 
@@ -142,7 +143,7 @@ inline struct timespec KernelTimeout::MakeAbsTimespec() {
142
143
 
143
144
  struct timespec abstime;
144
145
  int64_t seconds = (std::min)(n / kNanosPerSecond,
145
- int64_t{(std::numeric_limits<time_t>::max)()});
146
+ int64_t{(std::numeric_limits<time_t>::max)()});
146
147
  abstime.tv_sec = static_cast<time_t>(seconds);
147
148
  abstime.tv_nsec = static_cast<decltype(abstime.tv_nsec)>(n % kNanosPerSecond);
148
149
  return abstime;
@@ -68,12 +68,12 @@ ABSL_NAMESPACE_END
68
68
 
69
69
  extern "C" {
70
70
 
71
- ABSL_ATTRIBUTE_WEAK void AbslInternalPerThreadSemPost(
71
+ ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemPost)(
72
72
  absl::base_internal::ThreadIdentity *identity) {
73
73
  absl::synchronization_internal::Waiter::GetWaiter(identity)->Post();
74
74
  }
75
75
 
76
- ABSL_ATTRIBUTE_WEAK bool AbslInternalPerThreadSemWait(
76
+ ABSL_ATTRIBUTE_WEAK bool ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemWait)(
77
77
  absl::synchronization_internal::KernelTimeout t) {
78
78
  bool timeout = false;
79
79
  absl::base_internal::ThreadIdentity *identity;
@@ -96,20 +96,20 @@ ABSL_NAMESPACE_END
96
96
  // By changing our extension points to be extern "C", we dodge this
97
97
  // check.
98
98
  extern "C" {
99
- void AbslInternalPerThreadSemPost(
99
+ void ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemPost)(
100
100
  absl::base_internal::ThreadIdentity* identity);
101
- bool AbslInternalPerThreadSemWait(
101
+ bool ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemWait)(
102
102
  absl::synchronization_internal::KernelTimeout t);
103
103
  } // extern "C"
104
104
 
105
105
  void absl::synchronization_internal::PerThreadSem::Post(
106
106
  absl::base_internal::ThreadIdentity* identity) {
107
- AbslInternalPerThreadSemPost(identity);
107
+ ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemPost)(identity);
108
108
  }
109
109
 
110
110
  bool absl::synchronization_internal::PerThreadSem::Wait(
111
111
  absl::synchronization_internal::KernelTimeout t) {
112
- return AbslInternalPerThreadSemWait(t);
112
+ return ABSL_INTERNAL_C_SYMBOL(AbslInternalPerThreadSemWait)(t);
113
113
  }
114
114
 
115
115
  #endif // ABSL_SYNCHRONIZATION_INTERNAL_PER_THREAD_SEM_H_
@@ -48,6 +48,7 @@
48
48
  #include "absl/base/optimization.h"
49
49
  #include "absl/synchronization/internal/kernel_timeout.h"
50
50
 
51
+
51
52
  namespace absl {
52
53
  ABSL_NAMESPACE_BEGIN
53
54
  namespace synchronization_internal {
@@ -66,71 +67,6 @@ static void MaybeBecomeIdle() {
66
67
 
67
68
  #if ABSL_WAITER_MODE == ABSL_WAITER_MODE_FUTEX
68
69
 
69
- // Some Android headers are missing these definitions even though they
70
- // support these futex operations.
71
- #ifdef __BIONIC__
72
- #ifndef SYS_futex
73
- #define SYS_futex __NR_futex
74
- #endif
75
- #ifndef FUTEX_WAIT_BITSET
76
- #define FUTEX_WAIT_BITSET 9
77
- #endif
78
- #ifndef FUTEX_PRIVATE_FLAG
79
- #define FUTEX_PRIVATE_FLAG 128
80
- #endif
81
- #ifndef FUTEX_CLOCK_REALTIME
82
- #define FUTEX_CLOCK_REALTIME 256
83
- #endif
84
- #ifndef FUTEX_BITSET_MATCH_ANY
85
- #define FUTEX_BITSET_MATCH_ANY 0xFFFFFFFF
86
- #endif
87
- #endif
88
-
89
- #if defined(__NR_futex_time64) && !defined(SYS_futex_time64)
90
- #define SYS_futex_time64 __NR_futex_time64
91
- #endif
92
-
93
- #if defined(SYS_futex_time64) && !defined(SYS_futex)
94
- #define SYS_futex SYS_futex_time64
95
- #endif
96
-
97
- class Futex {
98
- public:
99
- static int WaitUntil(std::atomic<int32_t> *v, int32_t val,
100
- KernelTimeout t) {
101
- int err = 0;
102
- if (t.has_timeout()) {
103
- // https://locklessinc.com/articles/futex_cheat_sheet/
104
- // Unlike FUTEX_WAIT, FUTEX_WAIT_BITSET uses absolute time.
105
- struct timespec abs_timeout = t.MakeAbsTimespec();
106
- // Atomically check that the futex value is still 0, and if it
107
- // is, sleep until abs_timeout or until woken by FUTEX_WAKE.
108
- err = syscall(
109
- SYS_futex, reinterpret_cast<int32_t *>(v),
110
- FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG | FUTEX_CLOCK_REALTIME, val,
111
- &abs_timeout, nullptr, FUTEX_BITSET_MATCH_ANY);
112
- } else {
113
- // Atomically check that the futex value is still 0, and if it
114
- // is, sleep until woken by FUTEX_WAKE.
115
- err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
116
- FUTEX_WAIT | FUTEX_PRIVATE_FLAG, val, nullptr);
117
- }
118
- if (err != 0) {
119
- err = -errno;
120
- }
121
- return err;
122
- }
123
-
124
- static int Wake(std::atomic<int32_t> *v, int32_t count) {
125
- int err = syscall(SYS_futex, reinterpret_cast<int32_t *>(v),
126
- FUTEX_WAKE | FUTEX_PRIVATE_FLAG, count);
127
- if (ABSL_PREDICT_FALSE(err < 0)) {
128
- err = -errno;
129
- }
130
- return err;
131
- }
132
- };
133
-
134
70
  Waiter::Waiter() {
135
71
  futex_.store(0, std::memory_order_relaxed);
136
72
  }
@@ -36,6 +36,7 @@
36
36
  #include <cstdint>
37
37
 
38
38
  #include "absl/base/internal/thread_identity.h"
39
+ #include "absl/synchronization/internal/futex.h"
39
40
  #include "absl/synchronization/internal/kernel_timeout.h"
40
41
 
41
42
  // May be chosen at compile time via -DABSL_FORCE_WAITER_MODE=<index>
@@ -48,12 +49,7 @@
48
49
  #define ABSL_WAITER_MODE ABSL_FORCE_WAITER_MODE
49
50
  #elif defined(_WIN32) && _WIN32_WINNT >= _WIN32_WINNT_VISTA
50
51
  #define ABSL_WAITER_MODE ABSL_WAITER_MODE_WIN32
51
- #elif defined(__BIONIC__)
52
- // Bionic supports all the futex operations we need even when some of the futex
53
- // definitions are missing.
54
- #define ABSL_WAITER_MODE ABSL_WAITER_MODE_FUTEX
55
- #elif defined(__linux__) && defined(FUTEX_CLOCK_REALTIME)
56
- // FUTEX_CLOCK_REALTIME requires Linux >= 2.6.28.
52
+ #elif defined(ABSL_INTERNAL_HAVE_FUTEX)
57
53
  #define ABSL_WAITER_MODE ABSL_WAITER_MODE_FUTEX
58
54
  #elif defined(ABSL_HAVE_SEMAPHORE_H)
59
55
  #define ABSL_WAITER_MODE ABSL_WAITER_MODE_SEM
@@ -70,7 +70,9 @@ using absl::synchronization_internal::KernelTimeout;
70
70
  using absl::synchronization_internal::PerThreadSem;
71
71
 
72
72
  extern "C" {
73
- ABSL_ATTRIBUTE_WEAK void AbslInternalMutexYield() { std::this_thread::yield(); }
73
+ ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)() {
74
+ std::this_thread::yield();
75
+ }
74
76
  } // extern "C"
75
77
 
76
78
  namespace absl {
@@ -89,8 +91,8 @@ ABSL_CONST_INIT std::atomic<OnDeadlockCycle> synch_deadlock_detection(
89
91
  ABSL_CONST_INIT std::atomic<bool> synch_check_invariants(false);
90
92
 
91
93
  ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
92
- absl::base_internal::AtomicHook<void (*)(int64_t wait_cycles)>
93
- submit_profile_data;
94
+ absl::base_internal::AtomicHook<void (*)(int64_t wait_cycles)>
95
+ submit_profile_data;
94
96
  ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES absl::base_internal::AtomicHook<void (*)(
95
97
  const char *msg, const void *obj, int64_t wait_cycles)>
96
98
  mutex_tracer;
@@ -124,35 +126,44 @@ void RegisterSymbolizer(bool (*fn)(const void *pc, char *out, int out_size)) {
124
126
  symbolizer.Store(fn);
125
127
  }
126
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
+
127
134
  struct ABSL_CACHELINE_ALIGNED MutexGlobals {
128
135
  absl::once_flag once;
129
- int num_cpus = 0;
130
136
  int spinloop_iterations = 0;
137
+ int32_t mutex_sleep_limit[2] = {};
131
138
  };
132
139
 
133
- static const MutexGlobals& GetMutexGlobals() {
140
+ const MutexGlobals &GetMutexGlobals() {
134
141
  ABSL_CONST_INIT static MutexGlobals data;
135
142
  absl::base_internal::LowLevelCallOnce(&data.once, [&]() {
136
- data.num_cpus = absl::base_internal::NumCPUs();
137
- data.spinloop_iterations = data.num_cpus > 1 ? 1500 : 0;
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
+ }
138
157
  });
139
158
  return data;
140
159
  }
141
-
142
- // Spinlock delay on iteration c. Returns new c.
143
- namespace {
144
- enum DelayMode { AGGRESSIVE, GENTLE };
145
- };
160
+ } // namespace
146
161
 
147
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`.
148
165
  int MutexDelay(int32_t c, int mode) {
149
- // If this a uniprocessor, only yield/sleep. Otherwise, if the mode is
150
- // aggressive then spin many times before yielding. If the mode is
151
- // gentle then spin only a few times before yielding. Aggressive spinning is
152
- // used to ensure that an Unlock() call, which must get the spin lock for
153
- // any thread to make progress gets it without undue delay.
154
- const int32_t limit =
155
- GetMutexGlobals().num_cpus > 1 ? (mode == AGGRESSIVE ? 5000 : 250) : 0;
166
+ const int32_t limit = GetMutexGlobals().mutex_sleep_limit[mode];
156
167
  if (c < limit) {
157
168
  // Spin.
158
169
  c++;
@@ -161,7 +172,7 @@ int MutexDelay(int32_t c, int mode) {
161
172
  ABSL_TSAN_MUTEX_PRE_DIVERT(nullptr, 0);
162
173
  if (c == limit) {
163
174
  // Yield once.
164
- AbslInternalMutexYield();
175
+ ABSL_INTERNAL_C_SYMBOL(AbslInternalMutexYield)();
165
176
  c++;
166
177
  } else {
167
178
  // Then wait.
@@ -492,7 +503,7 @@ struct SynchWaitParams {
492
503
  std::atomic<intptr_t> *cv_word;
493
504
 
494
505
  int64_t contention_start_cycles; // Time (in cycles) when this thread started
495
- // to contend for the mutex.
506
+ // to contend for the mutex.
496
507
  };
497
508
 
498
509
  struct SynchLocksHeld {
@@ -548,7 +559,7 @@ static SynchLocksHeld *Synch_GetAllLocks() {
548
559
  }
549
560
 
550
561
  // Post on "w"'s associated PerThreadSem.
551
- inline void Mutex::IncrementSynchSem(Mutex *mu, PerThreadSynch *w) {
562
+ void Mutex::IncrementSynchSem(Mutex *mu, PerThreadSynch *w) {
552
563
  if (mu) {
553
564
  ABSL_TSAN_MUTEX_PRE_DIVERT(mu, 0);
554
565
  }
@@ -752,11 +763,13 @@ void SetMutexDeadlockDetectionMode(OnDeadlockCycle mode) {
752
763
  synch_deadlock_detection.store(mode, std::memory_order_release);
753
764
  }
754
765
 
755
- // Return true iff threads x and y are waiting on the same condition for the
756
- // same type of lock. Requires that x and y be waiting on the same Mutex
757
- // queue.
758
- static bool MuSameCondition(PerThreadSynch *x, PerThreadSynch *y) {
759
- return x->waitp->how == y->waitp->how &&
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 &&
760
773
  Condition::GuaranteedEqual(x->waitp->cond, y->waitp->cond);
761
774
  }
762
775
 
@@ -775,18 +788,19 @@ static inline PerThreadSynch *GetPerThreadSynch(intptr_t v) {
775
788
  // - invalid (iff x is not in a Mutex wait queue),
776
789
  // - null, or
777
790
  // - a pointer to a distinct thread waiting later in the same Mutex queue
778
- // such that all threads in [x, x->skip] have the same condition and
779
- // lock type (MuSameCondition() is true for all pairs in [x, x->skip]).
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]).
780
794
  // In addition, if x->skip is valid, (x->may_skip || x->skip == null)
781
795
  //
782
- // By the spec of MuSameCondition(), it is not necessary when removing the
796
+ // By the spec of MuEquivalentWaiter(), it is not necessary when removing the
783
797
  // first runnable thread y from the front a Mutex queue to adjust the skip
784
798
  // field of another thread x because if x->skip==y, x->skip must (have) become
785
799
  // invalid before y is removed. The function TryRemove can remove a specified
786
800
  // thread from an arbitrary position in the queue whether runnable or not, so
787
801
  // it fixes up skip fields that would otherwise be left dangling.
788
802
  // The statement
789
- // if (x->may_skip && MuSameCondition(x, x->next)) { x->skip = x->next; }
803
+ // if (x->may_skip && MuEquivalentWaiter(x, x->next)) { x->skip = x->next; }
790
804
  // maintains the invariant provided x is not the last waiter in a Mutex queue
791
805
  // The statement
792
806
  // if (x->skip != null) { x->skip = x->skip->skip; }
@@ -920,24 +934,17 @@ static PerThreadSynch *Enqueue(PerThreadSynch *head,
920
934
  if (s->priority > head->priority) { // s's priority is above head's
921
935
  // try to put s in priority-fifo order, or failing that at the front.
922
936
  if (!head->maybe_unlocking) {
923
- // No unlocker can be scanning the queue, so we can insert between
924
- // skip-chains, and within a skip-chain if it has the same condition as
925
- // s. We insert in priority-fifo order, examining the end of every
926
- // skip-chain, plus every element with the same condition as s.
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.
927
943
  PerThreadSynch *advance_to = head; // next value of enqueue_after
928
- PerThreadSynch *cur; // successor of enqueue_after
929
944
  do {
930
945
  enqueue_after = advance_to;
931
- cur = enqueue_after->next; // this advance ensures progress
932
- advance_to = Skip(cur); // normally, advance to end of skip chain
933
- // (side-effect: optimizes skip chain)
934
- if (advance_to != cur && s->priority > advance_to->priority &&
935
- MuSameCondition(s, cur)) {
936
- // but this skip chain is not a singleton, s has higher priority
937
- // than its tail and has the same condition as the chain,
938
- // so we can insert within the skip-chain
939
- advance_to = cur; // advance by just one
940
- }
946
+ // (side-effect: optimizes skip chain)
947
+ advance_to = Skip(enqueue_after->next);
941
948
  } while (s->priority <= advance_to->priority);
942
949
  // termination guaranteed because s->priority > head->priority
943
950
  // and head is the end of a skip chain
@@ -956,21 +963,21 @@ static PerThreadSynch *Enqueue(PerThreadSynch *head,
956
963
 
957
964
  // enqueue_after can be: head, Skip(...), or cur.
958
965
  // The first two imply enqueue_after->skip == nullptr, and
959
- // the last is used only if MuSameCondition(s, cur).
966
+ // the last is used only if MuEquivalentWaiter(s, cur).
960
967
  // We require this because clearing enqueue_after->skip
961
968
  // is impossible; enqueue_after's predecessors might also
962
969
  // incorrectly skip over s if we were to allow other
963
970
  // insertion points.
964
- ABSL_RAW_CHECK(
965
- enqueue_after->skip == nullptr || MuSameCondition(enqueue_after, s),
966
- "Mutex Enqueue failure");
971
+ ABSL_RAW_CHECK(enqueue_after->skip == nullptr ||
972
+ MuEquivalentWaiter(enqueue_after, s),
973
+ "Mutex Enqueue failure");
967
974
 
968
975
  if (enqueue_after != head && enqueue_after->may_skip &&
969
- MuSameCondition(enqueue_after, enqueue_after->next)) {
976
+ MuEquivalentWaiter(enqueue_after, enqueue_after->next)) {
970
977
  // enqueue_after can skip to its new successor, s
971
978
  enqueue_after->skip = enqueue_after->next;
972
979
  }
973
- if (MuSameCondition(s, s->next)) { // s->may_skip is known to be true
980
+ if (MuEquivalentWaiter(s, s->next)) { // s->may_skip is known to be true
974
981
  s->skip = s->next; // s may skip to its successor
975
982
  }
976
983
  } else { // enqueue not done any other way, so
@@ -980,7 +987,7 @@ static PerThreadSynch *Enqueue(PerThreadSynch *head,
980
987
  head->next = s;
981
988
  s->readers = head->readers; // reader count is from previous head
982
989
  s->maybe_unlocking = head->maybe_unlocking; // same for unlock hint
983
- if (head->may_skip && MuSameCondition(head, s)) {
990
+ if (head->may_skip && MuEquivalentWaiter(head, s)) {
984
991
  // head now has successor; may skip
985
992
  head->skip = s;
986
993
  }
@@ -1000,7 +1007,7 @@ static PerThreadSynch *Dequeue(PerThreadSynch *head, PerThreadSynch *pw) {
1000
1007
  pw->next = w->next; // snip w out of list
1001
1008
  if (head == w) { // we removed the head
1002
1009
  head = (pw == w) ? nullptr : pw; // either emptied list, or pw is new head
1003
- } else if (pw != head && MuSameCondition(pw, pw->next)) {
1010
+ } else if (pw != head && MuEquivalentWaiter(pw, pw->next)) {
1004
1011
  // pw can skip to its new successor
1005
1012
  if (pw->next->skip !=
1006
1013
  nullptr) { // either skip to its successors skip target
@@ -1070,11 +1077,13 @@ void Mutex::TryRemove(PerThreadSynch *s) {
1070
1077
  PerThreadSynch *w;
1071
1078
  if ((w = pw->next) != s) { // search for thread,
1072
1079
  do { // processing at least one element
1073
- if (!MuSameCondition(s, w)) { // seeking different condition
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)) {
1074
1083
  pw = Skip(w); // so skip all that won't match
1075
1084
  // we don't have to worry about dangling skip fields
1076
1085
  // in the threads we skipped; none can point to s
1077
- // because their condition differs from s
1086
+ // because they are in a different equivalence class.
1078
1087
  } else { // seeking same condition
1079
1088
  FixSkip(w, s); // fix up any skip pointer from w to s
1080
1089
  pw = w;
@@ -1365,7 +1374,9 @@ static GraphId DeadlockCheck(Mutex *mu) {
1365
1374
  len += static_cast<int>(strlen(&b->buf[len]));
1366
1375
  }
1367
1376
  }
1368
- ABSL_RAW_LOG(ERROR, "Acquiring %p Mutexes held: %s",
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",
1369
1380
  static_cast<void *>(mu), b->buf);
1370
1381
  ABSL_RAW_LOG(ERROR, "Cycle: ");
1371
1382
  int path_len = deadlock_graph->FindPath(
@@ -2139,7 +2150,7 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) {
2139
2150
  !old_h->may_skip) { // we used old_h as a terminator
2140
2151
  old_h->may_skip = true; // allow old_h to skip once more
2141
2152
  ABSL_RAW_CHECK(old_h->skip == nullptr, "illegal skip from head");
2142
- if (h != old_h && MuSameCondition(old_h, old_h->next)) {
2153
+ if (h != old_h && MuEquivalentWaiter(old_h, old_h->next)) {
2143
2154
  old_h->skip = old_h->next; // old_h not head & can skip to successor
2144
2155
  }
2145
2156
  }
@@ -2312,7 +2323,8 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) {
2312
2323
  if (!cond_waiter) {
2313
2324
  // Sample lock contention events only if the (first) waiter was trying to
2314
2325
  // acquire the lock, not waiting on a condition variable or Condition.
2315
- int64_t wait_cycles = base_internal::CycleClock::Now() - enqueue_timestamp;
2326
+ int64_t wait_cycles =
2327
+ base_internal::CycleClock::Now() - enqueue_timestamp;
2316
2328
  mutex_tracer("slow release", this, wait_cycles);
2317
2329
  ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
2318
2330
  submit_profile_data(enqueue_timestamp);