grpc 1.47.0 → 1.48.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 (574) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +105 -47
  3. data/include/grpc/compression.h +1 -1
  4. data/include/grpc/event_engine/event_engine.h +20 -11
  5. data/include/grpc/event_engine/slice_buffer.h +8 -2
  6. data/include/grpc/grpc.h +3 -3
  7. data/include/grpc/impl/codegen/compression_types.h +2 -1
  8. data/include/grpc/impl/codegen/connectivity_state.h +2 -1
  9. data/include/grpc/impl/codegen/gpr_types.h +2 -1
  10. data/include/grpc/impl/codegen/grpc_types.h +2 -1
  11. data/include/grpc/impl/codegen/port_platform.h +6 -3
  12. data/src/core/ext/filters/census/grpc_context.cc +3 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +17 -5
  14. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +16 -0
  15. data/src/core/ext/filters/channel_idle/idle_filter_state.h +2 -0
  16. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -1
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +2 -2
  18. data/src/core/ext/filters/client_channel/client_channel.cc +51 -65
  19. data/src/core/ext/filters/client_channel/client_channel.h +19 -4
  20. data/src/core/ext/filters/client_channel/config_selector.h +1 -1
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +6 -4
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +1 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +73 -43
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  29. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +0 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +33 -35
  31. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +106 -112
  32. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +91 -42
  33. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +177 -138
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +4 -1
  35. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +47 -44
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +118 -103
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +83 -78
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +57 -67
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +2 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +5 -7
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +13 -17
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +3 -3
  43. data/src/core/ext/filters/client_channel/lb_policy.h +0 -7
  44. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +3 -5
  45. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +0 -1
  46. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -1
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +6 -6
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +5 -5
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +10 -5
  50. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +12 -3
  51. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +5 -5
  52. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +3 -4
  53. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +1 -1
  54. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
  55. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +24 -15
  56. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +3 -1
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -7
  58. data/src/core/ext/filters/client_channel/retry_filter.cc +35 -36
  59. data/src/core/ext/filters/client_channel/retry_filter.h +1 -0
  60. data/src/core/ext/filters/client_channel/retry_service_config.cc +4 -4
  61. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -1
  62. data/src/core/ext/filters/client_channel/subchannel.cc +53 -50
  63. data/src/core/ext/filters/client_channel/subchannel.h +6 -22
  64. data/src/core/ext/filters/client_channel/subchannel_interface.h +10 -18
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +12 -97
  66. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +5 -9
  67. data/src/core/ext/filters/deadline/deadline_filter.cc +12 -7
  68. data/src/core/ext/filters/deadline/deadline_filter.h +8 -1
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +21 -2
  70. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -3
  71. data/src/core/ext/filters/fault_injection/service_config_parser.cc +7 -4
  72. data/src/core/ext/filters/fault_injection/service_config_parser.h +17 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.cc +16 -5
  74. data/src/core/ext/filters/http/client/http_client_filter.h +8 -1
  75. data/src/core/ext/filters/http/client_authority_filter.cc +11 -10
  76. data/src/core/ext/filters/http/client_authority_filter.h +5 -2
  77. data/src/core/ext/filters/http/http_filters_plugin.cc +9 -1
  78. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +64 -187
  79. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +1 -2
  80. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +42 -106
  81. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +1 -0
  82. data/src/core/ext/filters/http/server/http_server_filter.cc +16 -9
  83. data/src/core/ext/filters/http/server/http_server_filter.h +6 -1
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +25 -15
  85. data/src/core/ext/filters/message_size/message_size_filter.h +13 -0
  86. data/src/core/ext/filters/rbac/rbac_filter.cc +14 -3
  87. data/src/core/ext/filters/rbac/rbac_filter.h +8 -0
  88. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +13 -2
  89. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +14 -2
  90. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +1 -0
  91. data/src/core/ext/filters/server_config_selector/server_config_selector.h +9 -0
  92. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +22 -2
  93. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +1 -0
  94. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -4
  95. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +15 -15
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +196 -476
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -1
  98. data/src/core/ext/transport/chttp2/transport/flow_control.cc +141 -261
  99. data/src/core/ext/transport/chttp2/transport/flow_control.h +176 -289
  100. data/src/core/ext/transport/chttp2/transport/frame_data.cc +57 -215
  101. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -36
  102. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +0 -41
  103. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +7 -12
  104. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +7 -6
  105. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +0 -2
  106. data/src/core/ext/transport/chttp2/transport/internal.h +9 -111
  107. data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -38
  108. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +0 -4
  109. data/src/core/ext/transport/chttp2/transport/writing.cc +18 -21
  110. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -1
  111. data/src/core/ext/transport/inproc/inproc_transport.cc +85 -81
  112. data/src/core/ext/transport/inproc/inproc_transport.h +3 -1
  113. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.c +52 -0
  114. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +164 -0
  115. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +46 -0
  116. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +94 -0
  117. data/src/core/ext/xds/certificate_provider_factory.h +6 -1
  118. data/src/core/ext/xds/certificate_provider_registry.cc +8 -8
  119. data/src/core/ext/xds/certificate_provider_registry.h +3 -1
  120. data/src/core/ext/xds/certificate_provider_store.cc +2 -0
  121. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  122. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +9 -0
  123. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +8 -0
  124. data/src/core/ext/xds/upb_utils.h +1 -2
  125. data/src/core/ext/xds/xds_api.cc +16 -18
  126. data/src/core/ext/xds/xds_api.h +12 -5
  127. data/src/core/ext/xds/xds_bootstrap.cc +37 -24
  128. data/src/core/ext/xds/xds_bootstrap.h +9 -11
  129. data/src/core/ext/xds/xds_certificate_provider.cc +12 -3
  130. data/src/core/ext/xds/xds_certificate_provider.h +16 -1
  131. data/src/core/ext/xds/xds_channel_stack_modifier.cc +9 -0
  132. data/src/core/ext/xds/xds_channel_stack_modifier.h +5 -1
  133. data/src/core/ext/xds/xds_client.cc +71 -22
  134. data/src/core/ext/xds/xds_client.h +17 -3
  135. data/src/core/ext/xds/xds_client_stats.cc +3 -4
  136. data/src/core/ext/xds/xds_client_stats.h +4 -3
  137. data/src/core/ext/xds/xds_cluster.cc +21 -10
  138. data/src/core/ext/xds/xds_cluster.h +9 -1
  139. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +16 -7
  140. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -8
  141. data/src/core/ext/xds/xds_common_types.cc +36 -22
  142. data/src/core/ext/xds/xds_common_types.h +12 -4
  143. data/src/core/ext/xds/xds_endpoint.cc +25 -15
  144. data/src/core/ext/xds/xds_endpoint.h +13 -5
  145. data/src/core/ext/xds/xds_http_fault_filter.cc +7 -5
  146. data/src/core/ext/xds/xds_http_fault_filter.h +3 -1
  147. data/src/core/ext/xds/xds_http_filters.cc +7 -0
  148. data/src/core/ext/xds/xds_http_filters.h +3 -3
  149. data/src/core/ext/xds/xds_http_rbac_filter.cc +16 -0
  150. data/src/core/ext/xds/xds_http_rbac_filter.h +7 -0
  151. data/src/core/ext/xds/xds_lb_policy_registry.cc +291 -0
  152. data/src/core/ext/xds/xds_lb_policy_registry.h +72 -0
  153. data/src/core/ext/xds/xds_listener.cc +51 -33
  154. data/src/core/ext/xds/xds_listener.h +10 -1
  155. data/src/core/ext/xds/xds_resource_type.h +3 -3
  156. data/src/core/ext/xds/xds_resource_type_impl.h +7 -3
  157. data/src/core/ext/xds/xds_route_config.cc +56 -28
  158. data/src/core/ext/xds/xds_route_config.h +11 -2
  159. data/src/core/ext/xds/xds_routing.cc +16 -0
  160. data/src/core/ext/xds/xds_routing.h +7 -2
  161. data/src/core/ext/xds/xds_server_config_fetcher.cc +54 -6
  162. data/src/core/lib/address_utils/parse_address.cc +5 -8
  163. data/src/core/lib/address_utils/parse_address.h +3 -2
  164. data/src/core/lib/address_utils/sockaddr_utils.cc +8 -7
  165. data/src/core/lib/address_utils/sockaddr_utils.h +2 -0
  166. data/src/core/lib/avl/avl.h +3 -3
  167. data/src/core/lib/backoff/backoff.cc +1 -1
  168. data/src/core/lib/backoff/backoff.h +1 -1
  169. data/src/core/lib/channel/call_tracer.h +3 -3
  170. data/src/core/lib/channel/channel_args.h +1 -0
  171. data/src/core/lib/channel/channel_args_preconditioning.cc +1 -0
  172. data/src/core/lib/channel/channel_fwd.h +26 -0
  173. data/src/core/lib/channel/channel_stack.cc +4 -4
  174. data/src/core/lib/channel/channel_stack.h +1 -11
  175. data/src/core/lib/channel/channel_stack_builder.h +2 -5
  176. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  177. data/src/core/lib/channel/channel_stack_builder_impl.h +1 -0
  178. data/src/core/lib/channel/channelz.cc +2 -1
  179. data/src/core/lib/channel/channelz.h +2 -3
  180. data/src/core/lib/channel/channelz_registry.cc +4 -5
  181. data/src/core/lib/channel/connected_channel.cc +1 -0
  182. data/src/core/lib/channel/connected_channel.h +1 -0
  183. data/src/core/lib/channel/promise_based_filter.cc +11 -5
  184. data/src/core/lib/channel/promise_based_filter.h +2 -0
  185. data/src/core/lib/compression/compression.cc +6 -1
  186. data/src/core/lib/compression/compression_internal.cc +3 -6
  187. data/src/core/lib/compression/compression_internal.h +3 -2
  188. data/src/core/lib/compression/message_compress.cc +3 -1
  189. data/src/core/lib/compression/message_compress.h +2 -3
  190. data/src/core/lib/debug/stats.cc +9 -9
  191. data/src/core/lib/debug/stats.h +2 -1
  192. data/src/core/lib/debug/stats_data.cc +2 -1
  193. data/src/core/lib/debug/stats_data.h +0 -4
  194. data/src/core/lib/debug/trace.h +13 -12
  195. data/src/core/lib/event_engine/default_event_engine_factory.cc +1 -1
  196. data/src/core/lib/event_engine/event_engine.cc +24 -19
  197. data/src/core/lib/event_engine/event_engine_factory.h +2 -2
  198. data/src/core/lib/event_engine/{iomgr_engine.cc → iomgr_engine/iomgr_engine.cc} +44 -91
  199. data/src/core/lib/event_engine/{iomgr_engine.h → iomgr_engine/iomgr_engine.h} +20 -16
  200. data/src/core/lib/event_engine/iomgr_engine/thread_pool.cc +123 -0
  201. data/src/core/lib/event_engine/iomgr_engine/thread_pool.h +70 -0
  202. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.cc +62 -0
  203. data/src/core/lib/event_engine/iomgr_engine/time_averaged_stats.h +81 -0
  204. data/src/core/lib/event_engine/iomgr_engine/timer.cc +312 -0
  205. data/src/core/lib/event_engine/iomgr_engine/timer.h +193 -0
  206. data/src/core/lib/event_engine/iomgr_engine/timer_heap.cc +107 -0
  207. data/src/core/lib/event_engine/iomgr_engine/timer_heap.h +56 -0
  208. data/src/core/lib/event_engine/iomgr_engine/timer_manager.cc +254 -0
  209. data/src/core/lib/event_engine/iomgr_engine/timer_manager.h +111 -0
  210. data/src/core/lib/event_engine/promise.h +69 -0
  211. data/src/core/lib/gpr/time_posix.cc +6 -9
  212. data/src/core/lib/gpr/time_windows.cc +10 -7
  213. data/src/core/lib/gprpp/manual_constructor.h +0 -67
  214. data/src/core/lib/gprpp/status_helper.cc +44 -30
  215. data/src/core/lib/gprpp/time.cc +8 -0
  216. data/src/core/lib/gprpp/time.h +4 -0
  217. data/src/core/lib/http/format_request.cc +5 -4
  218. data/src/core/lib/http/format_request.h +1 -1
  219. data/src/core/lib/http/httpcli.cc +18 -12
  220. data/src/core/lib/http/httpcli.h +19 -3
  221. data/src/core/lib/http/httpcli_security_connector.cc +16 -4
  222. data/src/core/lib/http/httpcli_ssl_credentials.h +3 -1
  223. data/src/core/lib/http/parser.cc +6 -7
  224. data/src/core/lib/http/parser.h +3 -0
  225. data/src/core/lib/iomgr/call_combiner.cc +2 -2
  226. data/src/core/lib/iomgr/endpoint.h +1 -1
  227. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -2
  228. data/src/core/lib/iomgr/error.cc +11 -9
  229. data/src/core/lib/iomgr/error.h +9 -5
  230. data/src/core/lib/iomgr/ev_epoll1_linux.cc +57 -18
  231. data/src/core/lib/iomgr/ev_epoll1_linux.h +1 -1
  232. data/src/core/lib/iomgr/ev_poll_posix.cc +77 -52
  233. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  234. data/src/core/lib/iomgr/ev_posix.cc +54 -92
  235. data/src/core/lib/iomgr/ev_posix.h +5 -3
  236. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  237. data/src/core/lib/iomgr/iomgr.cc +7 -0
  238. data/src/core/lib/iomgr/iomgr_posix.cc +1 -0
  239. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -0
  240. data/src/core/lib/iomgr/load_file.cc +1 -1
  241. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  242. data/src/core/lib/iomgr/resolve_address_windows.cc +1 -1
  243. data/src/core/lib/iomgr/tcp_client.cc +12 -7
  244. data/src/core/lib/iomgr/tcp_client.h +24 -13
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +15 -9
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +143 -25
  247. data/src/core/lib/iomgr/tcp_client_posix.h +1 -1
  248. data/src/core/lib/iomgr/tcp_client_windows.cc +14 -10
  249. data/src/core/lib/iomgr/tcp_posix.cc +91 -29
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +7 -7
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +12 -12
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +2 -2
  253. data/src/core/lib/iomgr/tcp_server_windows.cc +7 -7
  254. data/src/core/lib/iomgr/tcp_windows.cc +5 -5
  255. data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -2
  256. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +2 -2
  257. data/src/core/lib/iomgr/wakeup_fd_posix.cc +15 -12
  258. data/src/core/lib/iomgr/wakeup_fd_posix.h +0 -2
  259. data/src/core/lib/iomgr/work_serializer.h +2 -3
  260. data/src/core/lib/matchers/matchers.cc +6 -3
  261. data/src/core/lib/matchers/matchers.h +2 -0
  262. data/src/core/lib/promise/activity.cc +0 -1
  263. data/src/core/lib/promise/activity.h +7 -13
  264. data/src/core/lib/promise/loop.h +1 -0
  265. data/src/core/lib/promise/promise.h +1 -0
  266. data/src/core/lib/promise/sleep.cc +36 -31
  267. data/src/core/lib/promise/sleep.h +25 -25
  268. data/src/core/lib/resolver/resolver.cc +5 -0
  269. data/src/core/lib/resolver/resolver.h +3 -0
  270. data/src/core/lib/resolver/resolver_factory.h +5 -2
  271. data/src/core/lib/resolver/resolver_registry.cc +2 -9
  272. data/src/core/lib/resolver/resolver_registry.h +12 -1
  273. data/src/core/lib/resolver/server_address.cc +8 -0
  274. data/src/core/lib/resolver/server_address.h +9 -2
  275. data/src/core/lib/resource_quota/memory_quota.cc +18 -60
  276. data/src/core/lib/resource_quota/memory_quota.h +11 -25
  277. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  278. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +4 -0
  279. data/src/core/lib/security/authorization/evaluate_args.cc +9 -3
  280. data/src/core/lib/security/authorization/evaluate_args.h +6 -3
  281. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +6 -0
  282. data/src/core/lib/security/authorization/grpc_authorization_engine.h +7 -0
  283. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -0
  284. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +12 -1
  285. data/src/core/lib/security/authorization/matchers.cc +9 -1
  286. data/src/core/lib/security/authorization/matchers.h +7 -0
  287. data/src/core/lib/security/authorization/rbac_policy.cc +5 -0
  288. data/src/core/lib/security/authorization/rbac_policy.h +7 -0
  289. data/src/core/lib/security/context/security_context.cc +5 -2
  290. data/src/core/lib/security/context/security_context.h +14 -2
  291. data/src/core/lib/security/credentials/alts/alts_credentials.cc +4 -2
  292. data/src/core/lib/security/credentials/alts/alts_credentials.h +6 -1
  293. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +1 -3
  294. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -4
  295. data/src/core/lib/security/credentials/call_creds_util.cc +8 -0
  296. data/src/core/lib/security/credentials/call_creds_util.h +1 -0
  297. data/src/core/lib/security/credentials/channel_creds_registry.h +6 -1
  298. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +10 -0
  299. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  300. data/src/core/lib/security/credentials/composite/composite_credentials.h +16 -2
  301. data/src/core/lib/security/credentials/credentials.cc +4 -8
  302. data/src/core/lib/security/credentials/credentials.h +10 -8
  303. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +28 -10
  304. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +10 -0
  305. data/src/core/lib/security/credentials/external/aws_request_signer.cc +9 -0
  306. data/src/core/lib/security/credentials/external/external_account_credentials.cc +24 -9
  307. data/src/core/lib/security/credentials/external/external_account_credentials.h +11 -0
  308. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +12 -4
  309. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +6 -0
  310. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +20 -4
  311. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +10 -0
  312. data/src/core/lib/security/credentials/fake/fake_credentials.cc +8 -6
  313. data/src/core/lib/security/credentials/fake/fake_credentials.h +13 -1
  314. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +1 -0
  315. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -10
  316. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +10 -1
  317. data/src/core/lib/security/credentials/iam/iam_credentials.cc +9 -3
  318. data/src/core/lib/security/credentials/iam/iam_credentials.h +10 -0
  319. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +4 -0
  320. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +5 -0
  321. data/src/core/lib/security/credentials/jwt/json_token.cc +5 -2
  322. data/src/core/lib/security/credentials/jwt/json_token.h +2 -2
  323. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +11 -5
  324. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +14 -0
  325. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +28 -3
  326. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -2
  327. data/src/core/lib/security/credentials/local/local_credentials.cc +4 -3
  328. data/src/core/lib/security/credentials/local/local_credentials.h +7 -0
  329. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +26 -13
  330. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +20 -0
  331. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -7
  332. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +24 -0
  333. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +5 -0
  334. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +13 -0
  335. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +6 -6
  336. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -3
  337. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -10
  338. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +9 -4
  339. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +9 -2
  340. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +6 -7
  341. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -5
  342. data/src/core/lib/security/credentials/tls/tls_credentials.cc +7 -2
  343. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -1
  344. data/src/core/lib/security/credentials/tls/tls_utils.cc +2 -0
  345. data/src/core/lib/security/credentials/tls/tls_utils.h +1 -1
  346. data/src/core/lib/security/credentials/xds/xds_credentials.cc +8 -1
  347. data/src/core/lib/security/credentials/xds/xds_credentials.h +14 -0
  348. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +22 -2
  349. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +6 -3
  350. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +17 -1
  351. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  352. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +9 -0
  353. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +17 -2
  354. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +5 -3
  355. data/src/core/lib/security/security_connector/{load_system_roots_linux.cc → load_system_roots_supported.cc} +27 -19
  356. data/src/core/lib/security/security_connector/{load_system_roots_linux.h → load_system_roots_supported.h} +5 -5
  357. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -3
  358. data/src/core/lib/security/security_connector/local/local_security_connector.h +6 -2
  359. data/src/core/lib/security/security_connector/security_connector.cc +20 -18
  360. data/src/core/lib/security/security_connector/security_connector.h +18 -6
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +18 -6
  362. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -2
  363. data/src/core/lib/security/security_connector/ssl_utils.cc +12 -2
  364. data/src/core/lib/security/security_connector/ssl_utils.h +10 -7
  365. data/src/core/lib/security/security_connector/ssl_utils_config.h +1 -1
  366. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -13
  367. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +23 -3
  368. data/src/core/lib/security/transport/auth_filters.h +7 -0
  369. data/src/core/lib/security/transport/client_auth_filter.cc +18 -9
  370. data/src/core/lib/security/transport/secure_endpoint.cc +63 -13
  371. data/src/core/lib/security/transport/secure_endpoint.h +4 -3
  372. data/src/core/lib/security/transport/security_handshaker.cc +44 -11
  373. data/src/core/lib/security/transport/security_handshaker.h +4 -0
  374. data/src/core/lib/security/transport/server_auth_filter.cc +26 -4
  375. data/src/core/lib/security/util/json_util.cc +3 -2
  376. data/src/core/lib/security/util/json_util.h +0 -2
  377. data/src/core/lib/service_config/service_config_call_data.h +2 -1
  378. data/src/core/lib/service_config/service_config_impl.cc +6 -6
  379. data/src/core/lib/service_config/service_config_impl.h +1 -3
  380. data/src/core/lib/service_config/service_config_parser.cc +2 -4
  381. data/src/core/lib/slice/slice_buffer.cc +30 -1
  382. data/src/core/lib/slice/slice_buffer.h +37 -6
  383. data/src/core/lib/slice/slice_string_helpers.cc +0 -20
  384. data/src/core/lib/slice/slice_string_helpers.h +0 -4
  385. data/src/core/lib/surface/call.cc +53 -115
  386. data/src/core/lib/surface/call.h +5 -1
  387. data/src/core/lib/surface/channel.h +2 -0
  388. data/src/core/lib/surface/channel_ping.cc +1 -1
  389. data/src/core/lib/surface/completion_queue.cc +15 -14
  390. data/src/core/lib/surface/completion_queue.h +2 -1
  391. data/src/core/lib/surface/init.cc +0 -1
  392. data/src/core/lib/surface/lame_client.cc +1 -1
  393. data/src/core/lib/surface/lame_client.h +1 -1
  394. data/src/core/lib/surface/server.cc +14 -8
  395. data/src/core/lib/surface/server.h +4 -1
  396. data/src/core/lib/surface/validate_metadata.cc +1 -1
  397. data/src/core/lib/surface/version.cc +2 -2
  398. data/src/core/lib/transport/error_utils.cc +13 -7
  399. data/src/core/lib/transport/handshaker.cc +3 -3
  400. data/src/core/lib/transport/http_connect_handshaker.cc +4 -4
  401. data/src/core/lib/transport/tcp_connect_handshaker.cc +2 -2
  402. data/src/core/lib/transport/transport.cc +0 -3
  403. data/src/core/lib/transport/transport.h +20 -14
  404. data/src/core/lib/transport/transport_fwd.h +20 -0
  405. data/src/core/lib/transport/transport_impl.h +1 -0
  406. data/src/core/lib/transport/transport_op_string.cc +9 -9
  407. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +1 -1
  408. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +9 -1
  409. data/src/core/tsi/fake_transport_security.cc +13 -1
  410. data/src/core/tsi/fake_transport_security.h +6 -0
  411. data/src/core/tsi/ssl_transport_security.cc +1 -1
  412. data/src/core/tsi/transport_security_grpc.cc +3 -2
  413. data/src/core/tsi/transport_security_grpc.h +5 -2
  414. data/src/ruby/ext/grpc/ext-export-truffleruby.clang +2 -0
  415. data/src/ruby/ext/grpc/ext-export-truffleruby.gcc +7 -0
  416. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  417. data/src/ruby/ext/grpc/ext-export.gcc +1 -0
  418. data/src/ruby/ext/grpc/extconf.rb +49 -18
  419. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  420. data/src/ruby/lib/grpc/errors.rb +1 -1
  421. data/src/ruby/lib/grpc/version.rb +1 -1
  422. data/src/ruby/spec/generic/client_stub_spec.rb +23 -23
  423. data/third_party/abseil-cpp/absl/algorithm/container.h +1 -1
  424. data/third_party/abseil-cpp/absl/base/attributes.h +49 -22
  425. data/third_party/abseil-cpp/absl/base/casts.h +61 -68
  426. data/third_party/abseil-cpp/absl/base/config.h +182 -41
  427. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +12 -42
  428. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +67 -2
  429. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +3 -3
  430. data/third_party/abseil-cpp/absl/base/internal/endian.h +17 -62
  431. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +2 -0
  432. data/third_party/abseil-cpp/absl/base/internal/invoke.h +54 -0
  433. data/third_party/abseil-cpp/absl/base/internal/prefetch.h +138 -0
  434. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +29 -22
  435. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +13 -12
  436. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +3 -0
  437. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +8 -0
  438. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +2 -5
  439. data/third_party/abseil-cpp/absl/base/internal/strerror.cc +88 -0
  440. data/third_party/abseil-cpp/absl/base/internal/strerror.h +39 -0
  441. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +0 -1
  442. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +2 -1
  443. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +6 -7
  444. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +12 -3
  445. data/third_party/abseil-cpp/absl/base/log_severity.cc +28 -0
  446. data/third_party/abseil-cpp/absl/base/log_severity.h +51 -0
  447. data/third_party/abseil-cpp/absl/base/optimization.h +19 -11
  448. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  449. data/third_party/abseil-cpp/absl/base/thread_annotations.h +2 -2
  450. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -0
  451. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +11 -4
  452. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +15 -9
  453. data/third_party/abseil-cpp/absl/container/inlined_vector.h +20 -9
  454. data/third_party/abseil-cpp/absl/container/internal/common.h +6 -5
  455. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +10 -28
  456. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +68 -20
  457. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +29 -11
  458. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +59 -38
  459. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +4 -0
  460. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +515 -184
  461. data/third_party/abseil-cpp/absl/debugging/internal/address_is_readable.cc +45 -88
  462. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +4 -0
  463. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +3 -2
  464. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +8 -3
  465. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +8 -3
  466. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +2 -1
  467. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +8 -3
  468. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +20 -18
  469. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +8 -3
  470. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +15 -2
  471. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +6 -1
  472. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +46 -7
  473. data/third_party/abseil-cpp/absl/functional/bind_front.h +10 -1
  474. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -1
  475. data/third_party/abseil-cpp/absl/hash/hash.h +82 -8
  476. data/third_party/abseil-cpp/absl/hash/internal/hash.h +218 -23
  477. data/third_party/abseil-cpp/absl/numeric/bits.h +2 -1
  478. data/third_party/abseil-cpp/absl/numeric/int128.cc +4 -2
  479. data/third_party/abseil-cpp/absl/numeric/int128.h +2 -2
  480. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +21 -6
  481. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +4 -4
  482. data/third_party/abseil-cpp/absl/random/distributions.h +3 -3
  483. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +3 -0
  484. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +2 -1
  485. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +2 -2
  486. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +59 -48
  487. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +1 -1
  488. data/third_party/abseil-cpp/absl/random/internal/randen.h +5 -11
  489. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +6 -2
  490. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +48 -23
  491. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +24 -26
  492. data/third_party/abseil-cpp/absl/random/internal/traits.h +53 -5
  493. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +5 -5
  494. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +33 -48
  495. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +9 -10
  496. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +7 -4
  497. data/third_party/abseil-cpp/absl/random/seed_sequences.h +1 -0
  498. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +2 -2
  499. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +1 -1
  500. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +4 -3
  501. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +17 -0
  502. data/third_party/abseil-cpp/absl/status/status.cc +174 -2
  503. data/third_party/abseil-cpp/absl/status/status.h +22 -12
  504. data/third_party/abseil-cpp/absl/status/statusor.h +9 -3
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +4 -4
  506. data/third_party/abseil-cpp/absl/strings/cord.cc +194 -913
  507. data/third_party/abseil-cpp/absl/strings/cord.h +202 -81
  508. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +188 -0
  509. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +44 -0
  510. data/third_party/abseil-cpp/absl/strings/cord_buffer.cc +30 -0
  511. data/third_party/abseil-cpp/absl/strings/cord_buffer.h +572 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/cord_data_edge.h +63 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +20 -32
  514. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +123 -88
  515. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +149 -49
  516. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +44 -59
  517. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +3 -1
  518. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +4 -2
  519. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +3 -2
  520. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +5 -4
  521. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +7 -74
  522. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.cc +54 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_crc.h +102 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +58 -17
  525. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +13 -11
  526. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +11 -38
  527. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +1 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +4 -2
  529. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +6 -5
  530. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +1 -1
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +1 -1
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -1
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +38 -7
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +7 -2
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +4 -5
  536. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +5 -2
  537. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +2 -1
  538. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  539. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +9 -6
  540. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +10 -2
  541. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +9 -9
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +8 -8
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +26 -23
  544. data/third_party/abseil-cpp/absl/strings/str_cat.h +20 -13
  545. data/third_party/abseil-cpp/absl/strings/str_join.h +9 -15
  546. data/third_party/abseil-cpp/absl/strings/str_split.h +1 -2
  547. data/third_party/abseil-cpp/absl/strings/string_view.cc +2 -13
  548. data/third_party/abseil-cpp/absl/strings/string_view.h +3 -2
  549. data/third_party/abseil-cpp/absl/strings/strip.h +8 -6
  550. data/third_party/abseil-cpp/absl/strings/substitute.h +10 -2
  551. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.cc +9 -6
  552. data/third_party/abseil-cpp/absl/synchronization/internal/create_thread_identity.h +0 -4
  553. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +0 -4
  554. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +1 -6
  555. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +0 -25
  556. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +10 -4
  557. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +75 -40
  558. data/third_party/abseil-cpp/absl/synchronization/mutex.h +17 -9
  559. data/third_party/abseil-cpp/absl/synchronization/notification.h +3 -2
  560. data/third_party/abseil-cpp/absl/time/duration.cc +5 -4
  561. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +11 -7
  562. data/third_party/abseil-cpp/absl/time/time.h +16 -12
  563. data/third_party/abseil-cpp/absl/types/internal/optional.h +8 -0
  564. data/third_party/abseil-cpp/absl/types/internal/variant.h +3 -3
  565. data/third_party/abseil-cpp/absl/types/optional.h +17 -14
  566. data/third_party/abseil-cpp/absl/types/span.h +2 -1
  567. metadata +39 -15
  568. data/src/core/lib/slice/slice_split.cc +0 -103
  569. data/src/core/lib/slice/slice_split.h +0 -36
  570. data/src/core/lib/transport/byte_stream.cc +0 -165
  571. data/src/core/lib/transport/byte_stream.h +0 -170
  572. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +0 -140
  573. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +0 -100
  574. data/third_party/abseil-cpp/absl/container/internal/have_sse.h +0 -50
@@ -38,7 +38,7 @@ ABSL_CONST_INIT static base_internal::ThreadIdentity* thread_identity_freelist;
38
38
 
39
39
  // A per-thread destructor for reclaiming associated ThreadIdentity objects.
40
40
  // Since we must preserve their storage we cache them for re-use.
41
- void ReclaimThreadIdentity(void* v) {
41
+ static void ReclaimThreadIdentity(void* v) {
42
42
  base_internal::ThreadIdentity* identity =
43
43
  static_cast<base_internal::ThreadIdentity*>(v);
44
44
 
@@ -48,8 +48,6 @@ void ReclaimThreadIdentity(void* v) {
48
48
  base_internal::LowLevelAlloc::Free(identity->per_thread_synch.all_locks);
49
49
  }
50
50
 
51
- PerThreadSem::Destroy(identity);
52
-
53
51
  // We must explicitly clear the current thread's identity:
54
52
  // (a) Subsequent (unrelated) per-thread destructors may require an identity.
55
53
  // We must guarantee a new identity is used in this case (this instructor
@@ -71,7 +69,12 @@ static intptr_t RoundUp(intptr_t addr, intptr_t align) {
71
69
  return (addr + align - 1) & ~(align - 1);
72
70
  }
73
71
 
74
- static void ResetThreadIdentity(base_internal::ThreadIdentity* identity) {
72
+ void OneTimeInitThreadIdentity(base_internal::ThreadIdentity* identity) {
73
+ PerThreadSem::Init(identity);
74
+ }
75
+
76
+ static void ResetThreadIdentityBetweenReuse(
77
+ base_internal::ThreadIdentity* identity) {
75
78
  base_internal::PerThreadSynch* pts = &identity->per_thread_synch;
76
79
  pts->next = nullptr;
77
80
  pts->skip = nullptr;
@@ -116,8 +119,9 @@ static base_internal::ThreadIdentity* NewThreadIdentity() {
116
119
  identity = reinterpret_cast<base_internal::ThreadIdentity*>(
117
120
  RoundUp(reinterpret_cast<intptr_t>(allocation),
118
121
  base_internal::PerThreadSynch::kAlignment));
122
+ OneTimeInitThreadIdentity(identity);
119
123
  }
120
- ResetThreadIdentity(identity);
124
+ ResetThreadIdentityBetweenReuse(identity);
121
125
 
122
126
  return identity;
123
127
  }
@@ -127,7 +131,6 @@ static base_internal::ThreadIdentity* NewThreadIdentity() {
127
131
  // REQUIRES: CurrentThreadIdentity(false) == nullptr
128
132
  base_internal::ThreadIdentity* CreateThreadIdentity() {
129
133
  base_internal::ThreadIdentity* identity = NewThreadIdentity();
130
- PerThreadSem::Init(identity);
131
134
  // Associate the value with the current thread, and attach our destructor.
132
135
  base_internal::SetCurrentThreadIdentity(identity, ReclaimThreadIdentity);
133
136
  return identity;
@@ -36,10 +36,6 @@ namespace synchronization_internal {
36
36
  // For private use only.
37
37
  base_internal::ThreadIdentity* CreateThreadIdentity();
38
38
 
39
- // A per-thread destructor for reclaiming associated ThreadIdentity objects.
40
- // For private use only.
41
- void ReclaimThreadIdentity(void* v);
42
-
43
39
  // Returns the ThreadIdentity object representing the calling thread; guaranteed
44
40
  // to be unique for its lifetime. The returned object will remain valid for the
45
41
  // program's lifetime; although it may be re-assigned to a subsequent thread.
@@ -47,10 +47,6 @@ void PerThreadSem::Init(base_internal::ThreadIdentity *identity) {
47
47
  identity->is_idle.store(false, std::memory_order_relaxed);
48
48
  }
49
49
 
50
- void PerThreadSem::Destroy(base_internal::ThreadIdentity *identity) {
51
- Waiter::GetWaiter(identity)->~Waiter();
52
- }
53
-
54
50
  void PerThreadSem::Tick(base_internal::ThreadIdentity *identity) {
55
51
  const int ticker =
56
52
  identity->ticker.fetch_add(1, std::memory_order_relaxed) + 1;
@@ -66,10 +66,6 @@ class PerThreadSem {
66
66
  // REQUIRES: May only be called by ThreadIdentity.
67
67
  static void Init(base_internal::ThreadIdentity* identity);
68
68
 
69
- // Destroy the PerThreadSem associated with "identity".
70
- // REQUIRES: May only be called by ThreadIdentity.
71
- static void Destroy(base_internal::ThreadIdentity* identity);
72
-
73
69
  // Increments "identity"'s count.
74
70
  static inline void Post(base_internal::ThreadIdentity* identity);
75
71
 
@@ -81,8 +77,7 @@ class PerThreadSem {
81
77
  // Permitted callers.
82
78
  friend class PerThreadSemTest;
83
79
  friend class absl::Mutex;
84
- friend absl::base_internal::ThreadIdentity* CreateThreadIdentity();
85
- friend void ReclaimThreadIdentity(void* v);
80
+ friend void OneTimeInitThreadIdentity(absl::base_internal::ThreadIdentity*);
86
81
  };
87
82
 
88
83
  } // namespace synchronization_internal
@@ -71,8 +71,6 @@ Waiter::Waiter() {
71
71
  futex_.store(0, std::memory_order_relaxed);
72
72
  }
73
73
 
74
- Waiter::~Waiter() = default;
75
-
76
74
  bool Waiter::Wait(KernelTimeout t) {
77
75
  // Loop until we can atomically decrement futex from a positive
78
76
  // value, waiting on a futex while we believe it is zero.
@@ -161,18 +159,6 @@ Waiter::Waiter() {
161
159
  wakeup_count_ = 0;
162
160
  }
163
161
 
164
- Waiter::~Waiter() {
165
- const int err = pthread_mutex_destroy(&mu_);
166
- if (err != 0) {
167
- ABSL_RAW_LOG(FATAL, "pthread_mutex_destroy failed: %d", err);
168
- }
169
-
170
- const int err2 = pthread_cond_destroy(&cv_);
171
- if (err2 != 0) {
172
- ABSL_RAW_LOG(FATAL, "pthread_cond_destroy failed: %d", err2);
173
- }
174
- }
175
-
176
162
  bool Waiter::Wait(KernelTimeout t) {
177
163
  struct timespec abs_timeout;
178
164
  if (t.has_timeout()) {
@@ -240,12 +226,6 @@ Waiter::Waiter() {
240
226
  wakeups_.store(0, std::memory_order_relaxed);
241
227
  }
242
228
 
243
- Waiter::~Waiter() {
244
- if (sem_destroy(&sem_) != 0) {
245
- ABSL_RAW_LOG(FATAL, "sem_destroy failed with errno %d\n", errno);
246
- }
247
- }
248
-
249
229
  bool Waiter::Wait(KernelTimeout t) {
250
230
  struct timespec abs_timeout;
251
231
  if (t.has_timeout()) {
@@ -363,11 +343,6 @@ Waiter::Waiter() {
363
343
  wakeup_count_ = 0;
364
344
  }
365
345
 
366
- // SRW locks and condition variables do not need to be explicitly destroyed.
367
- // https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-initializesrwlock
368
- // https://stackoverflow.com/questions/28975958/why-does-windows-have-no-deleteconditionvariable-function-to-go-together-with
369
- Waiter::~Waiter() = default;
370
-
371
346
  bool Waiter::Wait(KernelTimeout t) {
372
347
  SRWLOCK *mu = WinHelper::GetLock(this);
373
348
  CONDITION_VARIABLE *cv = WinHelper::GetCond(this);
@@ -71,9 +71,6 @@ class Waiter {
71
71
  Waiter(const Waiter&) = delete;
72
72
  Waiter& operator=(const Waiter&) = delete;
73
73
 
74
- // Destroy any data to track waits.
75
- ~Waiter();
76
-
77
74
  // Blocks the calling thread until a matching call to `Post()` or
78
75
  // `t` has passed. Returns `true` if woken (`Post()` called),
79
76
  // `false` on timeout.
@@ -106,6 +103,12 @@ class Waiter {
106
103
  #endif
107
104
 
108
105
  private:
106
+ // The destructor must not be called since Mutex/CondVar
107
+ // can use PerThreadSem/Waiter after the thread exits.
108
+ // Waiter objects are embedded in ThreadIdentity objects,
109
+ // which are reused via a freelist and are never destroyed.
110
+ ~Waiter() = delete;
111
+
109
112
  #if ABSL_WAITER_MODE == ABSL_WAITER_MODE_FUTEX
110
113
  // Futexes are defined by specification to be 32-bits.
111
114
  // Thus std::atomic<int32_t> must be just an int32_t with lockfree methods.
@@ -136,8 +139,11 @@ class Waiter {
136
139
  // REQUIRES: WinHelper::GetLock(this) must be held.
137
140
  void InternalCondVarPoke();
138
141
 
139
- // We can't include Windows.h in our headers, so we use aligned charachter
142
+ // We can't include Windows.h in our headers, so we use aligned character
140
143
  // buffers to define the storage of SRWLOCK and CONDITION_VARIABLE.
144
+ // SRW locks and condition variables do not need to be explicitly destroyed.
145
+ // https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-initializesrwlock
146
+ // https://stackoverflow.com/questions/28975958/why-does-windows-have-no-deleteconditionvariable-function-to-go-together-with
141
147
  alignas(void*) unsigned char mu_storage_[sizeof(void*)];
142
148
  alignas(void*) unsigned char cv_storage_[sizeof(void*)];
143
149
  int waiter_count_;
@@ -109,7 +109,7 @@ static inline bool EvalConditionAnnotated(const Condition *cond, Mutex *mu,
109
109
  bool locking, bool trylock,
110
110
  bool read_lock);
111
111
 
112
- void RegisterMutexProfiler(void (*fn)(int64_t wait_timestamp)) {
112
+ void RegisterMutexProfiler(void (*fn)(int64_t wait_cycles)) {
113
113
  submit_profile_data.Store(fn);
114
114
  }
115
115
 
@@ -1744,23 +1744,33 @@ ABSL_XRAY_LOG_ARGS(1) void Mutex::ReaderUnlock() {
1744
1744
  ABSL_TSAN_MUTEX_POST_UNLOCK(this, __tsan_mutex_read_lock);
1745
1745
  }
1746
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
- };
1747
+ // Clears the designated waker flag in the mutex if this thread has blocked, and
1748
+ // therefore may be the designated waker.
1749
+ static intptr_t ClearDesignatedWakerMask(int flag) {
1750
+ assert(flag >= 0);
1751
+ assert(flag <= 1);
1752
+ switch (flag) {
1753
+ case 0: // not blocked
1754
+ return ~static_cast<intptr_t>(0);
1755
+ case 1: // blocked; turn off the designated waker bit
1756
+ return ~static_cast<intptr_t>(kMuDesig);
1757
+ }
1758
+ ABSL_INTERNAL_UNREACHABLE;
1759
+ }
1755
1760
 
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
- };
1761
+ // Conditionally ignores the existence of waiting writers if a reader that has
1762
+ // already blocked once wakes up.
1763
+ static intptr_t IgnoreWaitingWritersMask(int flag) {
1764
+ assert(flag >= 0);
1765
+ assert(flag <= 1);
1766
+ switch (flag) {
1767
+ case 0: // not blocked
1768
+ return ~static_cast<intptr_t>(0);
1769
+ case 1: // blocked; pretend there are no waiting writers
1770
+ return ~static_cast<intptr_t>(kMuWrWait);
1771
+ }
1772
+ ABSL_INTERNAL_UNREACHABLE;
1773
+ }
1764
1774
 
1765
1775
  // Internal version of LockWhen(). See LockSlowWithDeadline()
1766
1776
  ABSL_ATTRIBUTE_NOINLINE void Mutex::LockSlow(MuHow how, const Condition *cond,
@@ -1852,8 +1862,10 @@ bool Mutex::LockSlowWithDeadline(MuHow how, const Condition *cond,
1852
1862
  bool unlock = false;
1853
1863
  if ((v & how->fast_need_zero) == 0 && // try fast acquire
1854
1864
  mu_.compare_exchange_strong(
1855
- v, (how->fast_or | (v & zap_desig_waker[flags & kMuHasBlocked])) +
1856
- how->fast_add,
1865
+ v,
1866
+ (how->fast_or |
1867
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
1868
+ how->fast_add,
1857
1869
  std::memory_order_acquire, std::memory_order_relaxed)) {
1858
1870
  if (cond == nullptr ||
1859
1871
  EvalConditionAnnotated(cond, this, true, false, how == kShared)) {
@@ -1927,9 +1939,10 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
1927
1939
  CheckForMutexCorruption(v, "Lock");
1928
1940
  if ((v & waitp->how->slow_need_zero) == 0) {
1929
1941
  if (mu_.compare_exchange_strong(
1930
- v, (waitp->how->fast_or |
1931
- (v & zap_desig_waker[flags & kMuHasBlocked])) +
1932
- waitp->how->fast_add,
1942
+ v,
1943
+ (waitp->how->fast_or |
1944
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked))) +
1945
+ waitp->how->fast_add,
1933
1946
  std::memory_order_acquire, std::memory_order_relaxed)) {
1934
1947
  if (waitp->cond == nullptr ||
1935
1948
  EvalConditionAnnotated(waitp->cond, this, true, false,
@@ -1946,8 +1959,9 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
1946
1959
  if ((v & (kMuSpin|kMuWait)) == 0) { // no waiters
1947
1960
  // This thread tries to become the one and only waiter.
1948
1961
  PerThreadSynch *new_h = Enqueue(nullptr, waitp, v, flags);
1949
- intptr_t nv = (v & zap_desig_waker[flags & kMuHasBlocked] & kMuLow) |
1950
- kMuWait;
1962
+ intptr_t nv =
1963
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked) & kMuLow) |
1964
+ kMuWait;
1951
1965
  ABSL_RAW_CHECK(new_h != nullptr, "Enqueue to empty list failed");
1952
1966
  if (waitp->how == kExclusive && (v & kMuReader) != 0) {
1953
1967
  nv |= kMuWrWait;
@@ -1961,12 +1975,13 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
1961
1975
  waitp->thread->waitp = nullptr;
1962
1976
  }
1963
1977
  } else if ((v & waitp->how->slow_inc_need_zero &
1964
- ignore_waiting_writers[flags & kMuHasBlocked]) == 0) {
1978
+ IgnoreWaitingWritersMask(flags & kMuHasBlocked)) == 0) {
1965
1979
  // This is a reader that needs to increment the reader count,
1966
1980
  // but the count is currently held in the last waiter.
1967
1981
  if (mu_.compare_exchange_strong(
1968
- v, (v & zap_desig_waker[flags & kMuHasBlocked]) | kMuSpin |
1969
- kMuReader,
1982
+ v,
1983
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
1984
+ kMuSpin | kMuReader,
1970
1985
  std::memory_order_acquire, std::memory_order_relaxed)) {
1971
1986
  PerThreadSynch *h = GetPerThreadSynch(v);
1972
1987
  h->readers += kMuOne; // inc reader count in waiter
@@ -1987,8 +2002,9 @@ void Mutex::LockSlowLoop(SynchWaitParams *waitp, int flags) {
1987
2002
  }
1988
2003
  } else if ((v & kMuSpin) == 0 && // attempt to queue ourselves
1989
2004
  mu_.compare_exchange_strong(
1990
- v, (v & zap_desig_waker[flags & kMuHasBlocked]) | kMuSpin |
1991
- kMuWait,
2005
+ v,
2006
+ (v & ClearDesignatedWakerMask(flags & kMuHasBlocked)) |
2007
+ kMuSpin | kMuWait,
1992
2008
  std::memory_order_acquire, std::memory_order_relaxed)) {
1993
2009
  PerThreadSynch *h = GetPerThreadSynch(v);
1994
2010
  PerThreadSynch *new_h = Enqueue(h, waitp, v, flags);
@@ -2315,19 +2331,21 @@ ABSL_ATTRIBUTE_NOINLINE void Mutex::UnlockSlow(SynchWaitParams *waitp) {
2315
2331
  } // end of for(;;)-loop
2316
2332
 
2317
2333
  if (wake_list != kPerThreadSynchNull) {
2318
- int64_t enqueue_timestamp = wake_list->waitp->contention_start_cycles;
2319
- bool cond_waiter = wake_list->cond_waiter;
2334
+ int64_t wait_cycles = 0;
2335
+ int64_t now = base_internal::CycleClock::Now();
2320
2336
  do {
2337
+ // Sample lock contention events only if the waiter was trying to acquire
2338
+ // the lock, not waiting on a condition variable or Condition.
2339
+ if (!wake_list->cond_waiter) {
2340
+ wait_cycles += (now - wake_list->waitp->contention_start_cycles);
2341
+ wake_list->waitp->contention_start_cycles = now;
2342
+ }
2321
2343
  wake_list = Wakeup(wake_list); // wake waiters
2322
2344
  } 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;
2345
+ if (wait_cycles > 0) {
2328
2346
  mutex_tracer("slow release", this, wait_cycles);
2329
2347
  ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
2330
- submit_profile_data(enqueue_timestamp);
2348
+ submit_profile_data(wait_cycles);
2331
2349
  ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
2332
2350
  }
2333
2351
  }
@@ -2492,9 +2510,9 @@ void CondVar::Remove(PerThreadSynch *s) {
2492
2510
  // before calling Mutex::UnlockSlow(), the Mutex code might be re-entered (via
2493
2511
  // the logging code, or via a Condition function) and might potentially attempt
2494
2512
  // 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
2513
+ // a condition variable waiter queue. Thus, we use the waitp->cv_word to tell
2514
+ // the unlock code to call CondVarEnqueue() to queue the thread on the condition
2515
+ // variable queue just before the mutex is to be unlocked, and (most
2498
2516
  // importantly) after any call to an external routine that might re-enter the
2499
2517
  // mutex code.
2500
2518
  static void CondVarEnqueue(SynchWaitParams *waitp) {
@@ -2557,6 +2575,23 @@ bool CondVar::WaitCommon(Mutex *mutex, KernelTimeout t) {
2557
2575
  while (waitp.thread->state.load(std::memory_order_acquire) ==
2558
2576
  PerThreadSynch::kQueued) {
2559
2577
  if (!Mutex::DecrementSynchSem(mutex, waitp.thread, t)) {
2578
+ // DecrementSynchSem returned due to timeout.
2579
+ // Now we will either (1) remove ourselves from the wait list in Remove
2580
+ // below, in which case Remove will set thread.state = kAvailable and
2581
+ // we will not call DecrementSynchSem again; or (2) Signal/SignalAll
2582
+ // has removed us concurrently and is calling Wakeup, which will set
2583
+ // thread.state = kAvailable and post to the semaphore.
2584
+ // It's important to reset the timeout for the case (2) because otherwise
2585
+ // we can live-lock in this loop since DecrementSynchSem will always
2586
+ // return immediately due to timeout, but Signal/SignalAll is not
2587
+ // necessary set thread.state = kAvailable yet (and is not scheduled
2588
+ // due to thread priorities or other scheduler artifacts).
2589
+ // Note this could also be resolved if Signal/SignalAll would set
2590
+ // thread.state = kAvailable while holding the wait list spin lock.
2591
+ // But this can't be easily done for SignalAll since it grabs the whole
2592
+ // wait list with a single compare-exchange and does not really grab
2593
+ // the spin lock.
2594
+ t = KernelTimeout::Never();
2560
2595
  this->Remove(waitp.thread);
2561
2596
  rc = true;
2562
2597
  }
@@ -174,9 +174,12 @@ class ABSL_LOCKABLE Mutex {
174
174
 
175
175
  // Mutex::AssertHeld()
176
176
  //
177
- // Return immediately if this thread holds the `Mutex` exclusively (in write
178
- // mode). Otherwise, may report an error (typically by crashing with a
179
- // diagnostic), or may return immediately.
177
+ // Require that the mutex be held exclusively (write mode) by this thread.
178
+ //
179
+ // If the mutex is not currently held by this thread, this function may report
180
+ // an error (typically by crashing with a diagnostic) or it may do nothing.
181
+ // This function is intended only as a tool to assist debugging; it doesn't
182
+ // guarantee correctness.
180
183
  void AssertHeld() const ABSL_ASSERT_EXCLUSIVE_LOCK();
181
184
 
182
185
  // ---------------------------------------------------------------------------
@@ -236,9 +239,13 @@ class ABSL_LOCKABLE Mutex {
236
239
 
237
240
  // Mutex::AssertReaderHeld()
238
241
  //
239
- // Returns immediately if this thread holds the `Mutex` in at least shared
240
- // mode (read mode). Otherwise, may report an error (typically by
241
- // crashing with a diagnostic), or may return immediately.
242
+ // Require that the mutex be held at least in shared mode (read mode) by this
243
+ // thread.
244
+ //
245
+ // If the mutex is not currently held by this thread, this function may report
246
+ // an error (typically by crashing with a diagnostic) or it may do nothing.
247
+ // This function is intended only as a tool to assist debugging; it doesn't
248
+ // guarantee correctness.
242
249
  void AssertReaderHeld() const ABSL_ASSERT_SHARED_LOCK();
243
250
 
244
251
  // Mutex::WriterLock()
@@ -984,14 +991,15 @@ inline Condition::Condition(const T *object,
984
991
  // Register a hook for profiling support.
985
992
  //
986
993
  // The function pointer registered here will be called whenever a mutex is
987
- // contended. The callback is given the absl/base/cycleclock.h timestamp when
988
- // waiting began.
994
+ // contended. The callback is given the cycles for which waiting happened (as
995
+ // measured by //absl/base/internal/cycleclock.h, and which may not
996
+ // be real "cycle" counts.)
989
997
  //
990
998
  // Calls to this function do not race or block, but there is no ordering
991
999
  // guaranteed between calls to this function and call to the provided hook.
992
1000
  // In particular, the previously registered hook may still be called for some
993
1001
  // time after this function returns.
994
- void RegisterMutexProfiler(void (*fn)(int64_t wait_timestamp));
1002
+ void RegisterMutexProfiler(void (*fn)(int64_t wait_cycles));
995
1003
 
996
1004
  // Register a hook for Mutex tracing.
997
1005
  //
@@ -22,7 +22,7 @@
22
22
  // The `Notification` object maintains a private boolean "notified" state that
23
23
  // transitions to `true` at most once. The `Notification` class provides the
24
24
  // following primary member functions:
25
- // * `HasBeenNotified() `to query its state
25
+ // * `HasBeenNotified()` to query its state
26
26
  // * `WaitForNotification*()` to have threads wait until the "notified" state
27
27
  // is `true`.
28
28
  // * `Notify()` to set the notification's "notified" state to `true` and
@@ -52,6 +52,7 @@
52
52
 
53
53
  #include <atomic>
54
54
 
55
+ #include "absl/base/attributes.h"
55
56
  #include "absl/base/macros.h"
56
57
  #include "absl/synchronization/mutex.h"
57
58
  #include "absl/time/time.h"
@@ -74,7 +75,7 @@ class Notification {
74
75
  // Notification::HasBeenNotified()
75
76
  //
76
77
  // Returns the value of the notification's internal "notified" state.
77
- bool HasBeenNotified() const {
78
+ ABSL_MUST_USE_RESULT bool HasBeenNotified() const {
78
79
  return HasBeenNotifiedInternal(&this->notified_yet_);
79
80
  }
80
81
 
@@ -766,13 +766,14 @@ void AppendNumberUnit(std::string* out, double n, DisplayUnit unit) {
766
766
  // is non-zero.
767
767
  // Unlike Go, we format the zero duration as 0, with no unit.
768
768
  std::string FormatDuration(Duration d) {
769
- const Duration min_duration = Seconds(kint64min);
770
- if (d == min_duration) {
769
+ constexpr Duration kMinDuration = Seconds(kint64min);
770
+ std::string s;
771
+ if (d == kMinDuration) {
771
772
  // Avoid needing to negate kint64min by directly returning what the
772
773
  // following code should produce in that case.
773
- return "-2562047788015215h30m8s";
774
+ s = "-2562047788015215h30m8s";
775
+ return s;
774
776
  }
775
- std::string s;
776
777
  if (d < ZeroDuration()) {
777
778
  s.append("-");
778
779
  d = -d;
@@ -84,14 +84,13 @@ CONSTEXPR_F bool is_leap_year(year_t y) noexcept {
84
84
  return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
85
85
  }
86
86
  CONSTEXPR_F int year_index(year_t y, month_t m) noexcept {
87
- return (static_cast<int>((y + (m > 2)) % 400) + 400) % 400;
87
+ const int yi = static_cast<int>((y + (m > 2)) % 400);
88
+ return yi < 0 ? yi + 400 : yi;
88
89
  }
89
- CONSTEXPR_F int days_per_century(year_t y, month_t m) noexcept {
90
- const int yi = year_index(y, m);
90
+ CONSTEXPR_F int days_per_century(int yi) noexcept {
91
91
  return 36524 + (yi == 0 || yi > 300);
92
92
  }
93
- CONSTEXPR_F int days_per_4years(year_t y, month_t m) noexcept {
94
- const int yi = year_index(y, m);
93
+ CONSTEXPR_F int days_per_4years(int yi) noexcept {
95
94
  return 1460 + (yi == 0 || yi > 300 || (yi - 1) % 100 < 96);
96
95
  }
97
96
  CONSTEXPR_F int days_per_year(year_t y, month_t m) noexcept {
@@ -133,17 +132,22 @@ CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, hour_t hh,
133
132
  }
134
133
  }
135
134
  if (d > 365) {
135
+ int yi = year_index(ey, m); // Index into Gregorian 400 year cycle.
136
136
  for (;;) {
137
- int n = days_per_century(ey, m);
137
+ int n = days_per_century(yi);
138
138
  if (d <= n) break;
139
139
  d -= n;
140
140
  ey += 100;
141
+ yi += 100;
142
+ if (yi >= 400) yi -= 400;
141
143
  }
142
144
  for (;;) {
143
- int n = days_per_4years(ey, m);
145
+ int n = days_per_4years(yi);
144
146
  if (d <= n) break;
145
147
  d -= n;
146
148
  ey += 4;
149
+ yi += 4;
150
+ if (yi >= 400) yi -= 400;
147
151
  }
148
152
  for (;;) {
149
153
  int n = days_per_year(ey, m);
@@ -120,7 +120,7 @@ using EnableIfFloat =
120
120
 
121
121
  // Duration
122
122
  //
123
- // The `absl::Duration` class represents a signed, fixed-length span of time.
123
+ // The `absl::Duration` class represents a signed, fixed-length amount of time.
124
124
  // A `Duration` is generated using a unit-specific factory function, or is
125
125
  // the result of subtracting one `absl::Time` from another. Durations behave
126
126
  // like unit-safe integers and they support all the natural integer-like
@@ -162,7 +162,7 @@ class Duration {
162
162
  constexpr Duration() : rep_hi_(0), rep_lo_(0) {} // zero-length duration
163
163
 
164
164
  // Copyable.
165
- #if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER < 1910
165
+ #if !defined(__clang__) && defined(_MSC_VER) && _MSC_VER < 1930
166
166
  // Explicitly defining the constexpr copy constructor avoids an MSVC bug.
167
167
  constexpr Duration(const Duration& d)
168
168
  : rep_hi_(d.rep_hi_), rep_lo_(d.rep_lo_) {}
@@ -579,7 +579,7 @@ bool ParseDuration(absl::string_view dur_string, Duration* d);
579
579
 
580
580
  // AbslParseFlag()
581
581
  //
582
- // Parses a command-line flag string representation `text` into a a Duration
582
+ // Parses a command-line flag string representation `text` into a Duration
583
583
  // value. Duration flags must be specified in a format that is valid input for
584
584
  // `absl::ParseDuration()`.
585
585
  bool AbslParseFlag(absl::string_view text, Duration* dst, std::string* error);
@@ -750,23 +750,24 @@ constexpr Time UnixEpoch() { return Time(); }
750
750
  constexpr Time UniversalEpoch() {
751
751
  // 719162 is the number of days from 0001-01-01 to 1970-01-01,
752
752
  // assuming the Gregorian calendar.
753
- return Time(time_internal::MakeDuration(-24 * 719162 * int64_t{3600}, 0U));
753
+ return Time(
754
+ time_internal::MakeDuration(-24 * 719162 * int64_t{3600}, uint32_t{0}));
754
755
  }
755
756
 
756
757
  // InfiniteFuture()
757
758
  //
758
759
  // Returns an `absl::Time` that is infinitely far in the future.
759
760
  constexpr Time InfiniteFuture() {
760
- return Time(
761
- time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(), ~0U));
761
+ return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
762
+ ~uint32_t{0}));
762
763
  }
763
764
 
764
765
  // InfinitePast()
765
766
  //
766
767
  // Returns an `absl::Time` that is infinitely far in the past.
767
768
  constexpr Time InfinitePast() {
768
- return Time(
769
- time_internal::MakeDuration((std::numeric_limits<int64_t>::min)(), ~0U));
769
+ return Time(time_internal::MakeDuration((std::numeric_limits<int64_t>::min)(),
770
+ ~uint32_t{0}));
770
771
  }
771
772
 
772
773
  // FromUnixNanos()
@@ -1422,14 +1423,17 @@ constexpr int64_t GetRepHi(Duration d) { return d.rep_hi_; }
1422
1423
  constexpr uint32_t GetRepLo(Duration d) { return d.rep_lo_; }
1423
1424
 
1424
1425
  // Returns true iff d is positive or negative infinity.
1425
- constexpr bool IsInfiniteDuration(Duration d) { return GetRepLo(d) == ~0U; }
1426
+ constexpr bool IsInfiniteDuration(Duration d) {
1427
+ return GetRepLo(d) == ~uint32_t{0};
1428
+ }
1426
1429
 
1427
1430
  // Returns an infinite Duration with the opposite sign.
1428
1431
  // REQUIRES: IsInfiniteDuration(d)
1429
1432
  constexpr Duration OppositeInfinity(Duration d) {
1430
1433
  return GetRepHi(d) < 0
1431
- ? MakeDuration((std::numeric_limits<int64_t>::max)(), ~0U)
1432
- : MakeDuration((std::numeric_limits<int64_t>::min)(), ~0U);
1434
+ ? MakeDuration((std::numeric_limits<int64_t>::max)(), ~uint32_t{0})
1435
+ : MakeDuration((std::numeric_limits<int64_t>::min)(),
1436
+ ~uint32_t{0});
1433
1437
  }
1434
1438
 
1435
1439
  // Returns (-n)-1 (equivalently -(n+1)) without avoidable overflow.
@@ -1568,7 +1572,7 @@ constexpr Duration operator-(Duration d) {
1568
1572
 
1569
1573
  constexpr Duration InfiniteDuration() {
1570
1574
  return time_internal::MakeDuration((std::numeric_limits<int64_t>::max)(),
1571
- ~0U);
1575
+ ~uint32_t{0});
1572
1576
  }
1573
1577
 
1574
1578
  constexpr Duration FromChrono(const std::chrono::nanoseconds& d) {
@@ -91,7 +91,15 @@ class optional_data_dtor_base {
91
91
 
92
92
  void destruct() noexcept {
93
93
  if (engaged_) {
94
+ // `data_` must be initialized if `engaged_` is true.
95
+ #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
96
+ #pragma GCC diagnostic push
97
+ #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
98
+ #endif
94
99
  data_.~T();
100
+ #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(12, 0)
101
+ #pragma GCC diagnostic pop
102
+ #endif
95
103
  engaged_ = false;
96
104
  }
97
105
  }
@@ -16,8 +16,8 @@
16
16
  // separate file to avoid cluttering the top of the API header with
17
17
  // implementation details.
18
18
 
19
- #ifndef ABSL_TYPES_variant_internal_H_
20
- #define ABSL_TYPES_variant_internal_H_
19
+ #ifndef ABSL_TYPES_VARIANT_INTERNAL_H_
20
+ #define ABSL_TYPES_VARIANT_INTERNAL_H_
21
21
 
22
22
  #include <cassert>
23
23
  #include <cstddef>
@@ -1643,4 +1643,4 @@ ABSL_NAMESPACE_END
1643
1643
  } // namespace absl
1644
1644
 
1645
1645
  #endif // !defined(ABSL_USES_STD_VARIANT)
1646
- #endif // ABSL_TYPES_variant_internal_H_
1646
+ #endif // ABSL_TYPES_VARIANT_INTERNAL_H_