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
@@ -30,16 +30,12 @@ bool AddressIsReadable(const void* /* addr */) { return true; }
30
30
  ABSL_NAMESPACE_END
31
31
  } // namespace absl
32
32
 
33
- #else
33
+ #else // __linux__ && !__ANDROID__
34
34
 
35
- #include <fcntl.h>
36
- #include <sys/syscall.h>
35
+ #include <stdint.h>
36
+ #include <syscall.h>
37
37
  #include <unistd.h>
38
38
 
39
- #include <atomic>
40
- #include <cerrno>
41
- #include <cstdint>
42
-
43
39
  #include "absl/base/internal/errno_saver.h"
44
40
  #include "absl/base/internal/raw_logging.h"
45
41
 
@@ -47,93 +43,54 @@ namespace absl {
47
43
  ABSL_NAMESPACE_BEGIN
48
44
  namespace debugging_internal {
49
45
 
50
- // Pack a pid and two file descriptors into a 64-bit word,
51
- // using 16, 24, and 24 bits for each respectively.
52
- static uint64_t Pack(uint64_t pid, uint64_t read_fd, uint64_t write_fd) {
53
- ABSL_RAW_CHECK((read_fd >> 24) == 0 && (write_fd >> 24) == 0,
54
- "fd out of range");
55
- return (pid << 48) | ((read_fd & 0xffffff) << 24) | (write_fd & 0xffffff);
56
- }
57
-
58
- // Unpack x into a pid and two file descriptors, where x was created with
59
- // Pack().
60
- static void Unpack(uint64_t x, int *pid, int *read_fd, int *write_fd) {
61
- *pid = x >> 48;
62
- *read_fd = (x >> 24) & 0xffffff;
63
- *write_fd = x & 0xffffff;
64
- }
46
+ // NOTE: be extra careful about adding any interposable function calls here
47
+ // (such as open(), read(), etc.). These symbols may be interposed and will get
48
+ // invoked in contexts they don't expect.
49
+ //
50
+ // NOTE: any new system calls here may also require sandbox reconfiguration.
51
+ //
52
+ bool AddressIsReadable(const void *addr) {
53
+ // Align address on 8-byte boundary. On aarch64, checking last
54
+ // byte before inaccessible page returned unexpected EFAULT.
55
+ const uintptr_t u_addr = reinterpret_cast<uintptr_t>(addr) & ~7;
56
+ addr = reinterpret_cast<const void *>(u_addr);
65
57
 
66
- // Return whether the byte at *addr is readable, without faulting.
67
- // Save and restores errno. Returns true on systems where
68
- // unimplemented.
69
- // This is a namespace-scoped variable for correct zero-initialization.
70
- static std::atomic<uint64_t> pid_and_fds; // initially 0, an invalid pid.
58
+ // rt_sigprocmask below will succeed for this input.
59
+ if (addr == nullptr) return false;
71
60
 
72
- bool AddressIsReadable(const void *addr) {
73
61
  absl::base_internal::ErrnoSaver errno_saver;
74
- // We test whether a byte is readable by using write(). Normally, this would
75
- // be done via a cached file descriptor to /dev/null, but linux fails to
76
- // check whether the byte is readable when the destination is /dev/null, so
77
- // we use a cached pipe. We store the pid of the process that created the
78
- // pipe to handle the case where a process forks, and the child closes all
79
- // the file descriptors and then calls this routine. This is not perfect:
80
- // the child could use the routine, then close all file descriptors and then
81
- // use this routine again. But the likely use of this routine is when
82
- // crashing, to test the validity of pages when dumping the stack. Beware
83
- // that we may leak file descriptors, but we're unlikely to leak many.
84
- int bytes_written;
85
- int current_pid = getpid() & 0xffff; // we use only the low order 16 bits
86
- do { // until we do not get EBADF trying to use file descriptors
87
- int pid;
88
- int read_fd;
89
- int write_fd;
90
- uint64_t local_pid_and_fds = pid_and_fds.load(std::memory_order_acquire);
91
- Unpack(local_pid_and_fds, &pid, &read_fd, &write_fd);
92
- while (current_pid != pid) {
93
- int p[2];
94
- // new pipe
95
- if (pipe(p) != 0) {
96
- ABSL_RAW_LOG(FATAL, "Failed to create pipe, errno=%d", errno);
97
- }
98
- fcntl(p[0], F_SETFD, FD_CLOEXEC);
99
- fcntl(p[1], F_SETFD, FD_CLOEXEC);
100
- uint64_t new_pid_and_fds = Pack(current_pid, p[0], p[1]);
101
- if (pid_and_fds.compare_exchange_strong(
102
- local_pid_and_fds, new_pid_and_fds, std::memory_order_release,
103
- std::memory_order_relaxed)) {
104
- local_pid_and_fds = new_pid_and_fds; // fds exposed to other threads
105
- } else { // fds not exposed to other threads; we can close them.
106
- close(p[0]);
107
- close(p[1]);
108
- local_pid_and_fds = pid_and_fds.load(std::memory_order_acquire);
109
- }
110
- Unpack(local_pid_and_fds, &pid, &read_fd, &write_fd);
111
- }
112
- errno = 0;
113
- // Use syscall(SYS_write, ...) instead of write() to prevent ASAN
114
- // and other checkers from complaining about accesses to arbitrary
115
- // memory.
116
- do {
117
- bytes_written = syscall(SYS_write, write_fd, addr, 1);
118
- } while (bytes_written == -1 && errno == EINTR);
119
- if (bytes_written == 1) { // remove the byte from the pipe
120
- char c;
121
- while (read(read_fd, &c, 1) == -1 && errno == EINTR) {
122
- }
123
- }
124
- if (errno == EBADF) { // Descriptors invalid.
125
- // If pid_and_fds contains the problematic file descriptors we just used,
126
- // this call will forget them, and the loop will try again.
127
- pid_and_fds.compare_exchange_strong(local_pid_and_fds, 0,
128
- std::memory_order_release,
129
- std::memory_order_relaxed);
130
- }
131
- } while (errno == EBADF);
132
- return bytes_written == 1;
62
+
63
+ // Here we probe with some syscall which
64
+ // - accepts an 8-byte region of user memory as input
65
+ // - tests for EFAULT before other validation
66
+ // - has no problematic side-effects
67
+ //
68
+ // rt_sigprocmask(2) works for this. It copies sizeof(kernel_sigset_t)==8
69
+ // bytes from the address into the kernel memory before any validation.
70
+ //
71
+ // The call can never succeed, since the `how` parameter is not one of
72
+ // SIG_BLOCK, SIG_UNBLOCK, SIG_SETMASK.
73
+ //
74
+ // This strategy depends on Linux implementation details,
75
+ // so we rely on the test to alert us if it stops working.
76
+ //
77
+ // Some discarded past approaches:
78
+ // - msync() doesn't reject PROT_NONE regions
79
+ // - write() on /dev/null doesn't return EFAULT
80
+ // - write() on a pipe requires creating it and draining the writes
81
+ // - connect() works but is problematic for sandboxes and needs a valid
82
+ // file descriptor
83
+ //
84
+ // This can never succeed (invalid first argument to sigprocmask).
85
+ ABSL_RAW_CHECK(syscall(SYS_rt_sigprocmask, ~0, addr, nullptr,
86
+ /*sizeof(kernel_sigset_t)*/ 8) == -1,
87
+ "unexpected success");
88
+ ABSL_RAW_CHECK(errno == EFAULT || errno == EINVAL, "unexpected errno");
89
+ return errno != EFAULT;
133
90
  }
134
91
 
135
92
  } // namespace debugging_internal
136
93
  ABSL_NAMESPACE_END
137
94
  } // namespace absl
138
95
 
139
- #endif
96
+ #endif // __linux__ && !__ANDROID__
@@ -351,7 +351,11 @@ void ElfMemImage::SymbolIterator::Update(int increment) {
351
351
  const ElfW(Versym) *version_symbol = image->GetVersym(index_);
352
352
  ABSL_RAW_CHECK(symbol && version_symbol, "");
353
353
  const char *const symbol_name = image->GetDynstr(symbol->st_name);
354
+ #if defined(__NetBSD__)
355
+ const int version_index = version_symbol->vs_vers & VERSYM_VERSION;
356
+ #else
354
357
  const ElfW(Versym) version_index = version_symbol[0] & VERSYM_VERSION;
358
+ #endif
355
359
  const ElfW(Verdef) *version_definition = nullptr;
356
360
  const char *version_name = "";
357
361
  if (symbol->st_shndx == SHN_UNDEF) {
@@ -31,8 +31,9 @@
31
31
  #error ABSL_HAVE_ELF_MEM_IMAGE cannot be directly set
32
32
  #endif
33
33
 
34
- #if defined(__ELF__) && !defined(__native_client__) && !defined(__asmjs__) && \
35
- !defined(__wasm__)
34
+ #if defined(__ELF__) && !defined(__OpenBSD__) && !defined(__QNX__) && \
35
+ !defined(__native_client__) && !defined(__asmjs__) && \
36
+ !defined(__wasm__) && !defined(__HAIKU__)
36
37
  #define ABSL_HAVE_ELF_MEM_IMAGE 1
37
38
  #endif
38
39
 
@@ -176,12 +176,17 @@ static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
176
176
  // Implementation detail: we clamp the max of frames we are willing to
177
177
  // count, so as not to spend too much time in the loop below.
178
178
  const int kMaxUnwind = 200;
179
- int j = 0;
180
- for (; frame_pointer != nullptr && j < kMaxUnwind; j++) {
179
+ int num_dropped_frames = 0;
180
+ for (int j = 0; frame_pointer != nullptr && j < kMaxUnwind; j++) {
181
+ if (skip_count > 0) {
182
+ skip_count--;
183
+ } else {
184
+ num_dropped_frames++;
185
+ }
181
186
  frame_pointer =
182
187
  NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(frame_pointer, ucp);
183
188
  }
184
- *min_dropped_frames = j;
189
+ *min_dropped_frames = num_dropped_frames;
185
190
  }
186
191
  return n;
187
192
  }
@@ -112,11 +112,16 @@ static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
112
112
  // Implementation detail: we clamp the max of frames we are willing to
113
113
  // count, so as not to spend too much time in the loop below.
114
114
  const int kMaxUnwind = 200;
115
- int j = 0;
116
- for (; sp != nullptr && j < kMaxUnwind; j++) {
115
+ int num_dropped_frames = 0;
116
+ for (int j = 0; sp != nullptr && j < kMaxUnwind; j++) {
117
+ if (skip_count > 0) {
118
+ skip_count--;
119
+ } else {
120
+ num_dropped_frames++;
121
+ }
117
122
  sp = NextStackFrame<!IS_STACK_FRAMES>(sp);
118
123
  }
119
- *min_dropped_frames = j;
124
+ *min_dropped_frames = num_dropped_frames;
120
125
  }
121
126
  return n;
122
127
  }
@@ -37,7 +37,8 @@
37
37
  "absl/debugging/internal/stacktrace_generic-inl.inc"
38
38
  #endif // defined(ABSL_HAVE_THREAD_LOCAL)
39
39
 
40
- #elif defined(__EMSCRIPTEN__)
40
+ // Emscripten stacktraces rely on JS. Do not use them in standalone mode.
41
+ #elif defined(__EMSCRIPTEN__) && !defined(STANDALONE_WASM)
41
42
  #define ABSL_STACKTRACE_INL_HEADER \
42
43
  "absl/debugging/internal/stacktrace_emscripten-inl.inc"
43
44
 
@@ -231,11 +231,16 @@ static int UnwindImpl(void** result, int* sizes, int max_depth, int skip_count,
231
231
  // Implementation detail: we clamp the max of frames we are willing to
232
232
  // count, so as not to spend too much time in the loop below.
233
233
  const int kMaxUnwind = 1000;
234
- int j = 0;
235
- for (; next_sp != nullptr && j < kMaxUnwind; j++) {
234
+ int num_dropped_frames = 0;
235
+ for (int j = 0; next_sp != nullptr && j < kMaxUnwind; j++) {
236
+ if (skip_count > 0) {
237
+ skip_count--;
238
+ } else {
239
+ num_dropped_frames++;
240
+ }
236
241
  next_sp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(next_sp, ucp);
237
242
  }
238
- *min_dropped_frames = j;
243
+ *min_dropped_frames = num_dropped_frames;
239
244
  }
240
245
  return n;
241
246
  }
@@ -56,7 +56,7 @@ static const unsigned char *GetKernelRtSigreturnAddress() {
56
56
  absl::debugging_internal::VDSOSupport::SymbolInfo symbol_info;
57
57
  // Symbol versioning pulled from arch/riscv/kernel/vdso/vdso.lds at v5.10.
58
58
  auto lookup = [&](int type) {
59
- return vdso.LookupSymbol("__kernel_rt_sigreturn", "LINUX_4.15", type,
59
+ return vdso.LookupSymbol("__vdso_rt_sigreturn", "LINUX_4.15", type,
60
60
  &symbol_info);
61
61
  };
62
62
  if ((!lookup(STT_FUNC) && !lookup(STT_NOTYPE)) ||
@@ -171,26 +171,21 @@ ABSL_ATTRIBUTE_NO_SANITIZE_ADDRESS // May read random elements from stack.
171
171
  ABSL_ATTRIBUTE_NO_SANITIZE_MEMORY // May read random elements from stack.
172
172
  static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
173
173
  const void *ucp, int *min_dropped_frames) {
174
+ // The `frame_pointer` that is computed here points to the top of the frame.
175
+ // The two words preceding the address are the return address and the previous
176
+ // frame pointer.
174
177
  #if defined(__GNUC__)
175
178
  void **frame_pointer = reinterpret_cast<void **>(__builtin_frame_address(0));
176
179
  #else
177
180
  #error reading stack pointer not yet supported on this platform
178
181
  #endif
179
182
 
180
- skip_count++; // Skip the frame for this function.
181
183
  int n = 0;
182
-
183
- // The `frame_pointer` that is computed here points to the top of the frame.
184
- // The two words preceding the address are the return address and the previous
185
- // frame pointer. To find a PC value associated with the current frame, we
186
- // need to go down a level in the call chain. So we remember the return
187
- // address of the last frame seen. This does not work for the first stack
188
- // frame, which belongs to `UnwindImp()` but we skip the frame for
189
- // `UnwindImp()` anyway.
190
- void *prev_return_address = nullptr;
191
-
184
+ void *return_address = nullptr;
192
185
  while (frame_pointer && n < max_depth) {
193
- // The absl::GetStackFrames routine si called when we are in some
186
+ return_address = frame_pointer[-1];
187
+
188
+ // The absl::GetStackFrames routine is called when we are in some
194
189
  // informational context (the failure signal handler for example). Use the
195
190
  // non-strict unwinding rules to produce a stack trace that is as complete
196
191
  // as possible (even if it contains a few bogus entries in some rare cases).
@@ -200,26 +195,33 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
200
195
  if (skip_count > 0) {
201
196
  skip_count--;
202
197
  } else {
203
- result[n] = prev_return_address;
198
+ result[n] = return_address;
204
199
  if (IS_STACK_FRAMES) {
205
200
  sizes[n] = ComputeStackFrameSize(frame_pointer, next_frame_pointer);
206
201
  }
207
202
  n++;
208
203
  }
209
- prev_return_address = frame_pointer[-1];
204
+
210
205
  frame_pointer = next_frame_pointer;
211
206
  }
207
+
212
208
  if (min_dropped_frames != nullptr) {
213
209
  // Implementation detail: we clamp the max of frames we are willing to
214
210
  // count, so as not to spend too much time in the loop below.
215
211
  const int kMaxUnwind = 200;
216
- int j = 0;
217
- for (; frame_pointer != nullptr && j < kMaxUnwind; j++) {
212
+ int num_dropped_frames = 0;
213
+ for (int j = 0; frame_pointer != nullptr && j < kMaxUnwind; j++) {
214
+ if (skip_count > 0) {
215
+ skip_count--;
216
+ } else {
217
+ num_dropped_frames++;
218
+ }
218
219
  frame_pointer =
219
220
  NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(frame_pointer, ucp);
220
221
  }
221
- *min_dropped_frames = j;
222
+ *min_dropped_frames = num_dropped_frames;
222
223
  }
224
+
223
225
  return n;
224
226
  }
225
227
 
@@ -341,12 +341,17 @@ static int UnwindImpl(void **result, int *sizes, int max_depth, int skip_count,
341
341
  // Implementation detail: we clamp the max of frames we are willing to
342
342
  // count, so as not to spend too much time in the loop below.
343
343
  const int kMaxUnwind = 1000;
344
- int j = 0;
345
- for (; fp != nullptr && j < kMaxUnwind; j++) {
344
+ int num_dropped_frames = 0;
345
+ for (int j = 0; fp != nullptr && j < kMaxUnwind; j++) {
346
+ if (skip_count > 0) {
347
+ skip_count--;
348
+ } else {
349
+ num_dropped_frames++;
350
+ }
346
351
  fp = NextStackFrame<!IS_STACK_FRAMES, IS_WITH_CONTEXT>(fp, ucp, stack_low,
347
352
  stack_high);
348
353
  }
349
- *min_dropped_frames = j;
354
+ *min_dropped_frames = num_dropped_frames;
350
355
  }
351
356
  return n;
352
357
  }
@@ -33,7 +33,7 @@
33
33
  #endif
34
34
  #include <unistd.h>
35
35
 
36
- #if defined(__GLIBC__) && \
36
+ #if !defined(__UCLIBC__) && defined(__GLIBC__) && \
37
37
  (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 16))
38
38
  #define ABSL_HAVE_GETAUXVAL
39
39
  #endif
@@ -50,8 +50,14 @@
50
50
  #define AT_SYSINFO_EHDR 33 // for crosstoolv10
51
51
  #endif
52
52
 
53
+ #if defined(__NetBSD__)
54
+ using Elf32_auxv_t = Aux32Info;
55
+ using Elf64_auxv_t = Aux64Info;
56
+ #endif
53
57
  #if defined(__FreeBSD__)
58
+ #if defined(__ELF_WORD_SIZE) && __ELF_WORD_SIZE == 64
54
59
  using Elf64_auxv_t = Elf64_Auxinfo;
60
+ #endif
55
61
  using Elf32_auxv_t = Elf32_Auxinfo;
56
62
  #endif
57
63
 
@@ -63,7 +69,9 @@ ABSL_CONST_INIT
63
69
  std::atomic<const void *> VDSOSupport::vdso_base_(
64
70
  debugging_internal::ElfMemImage::kInvalidBase);
65
71
 
66
- std::atomic<VDSOSupport::GetCpuFn> VDSOSupport::getcpu_fn_(&InitAndGetCPU);
72
+ ABSL_CONST_INIT std::atomic<VDSOSupport::GetCpuFn> VDSOSupport::getcpu_fn_(
73
+ &InitAndGetCPU);
74
+
67
75
  VDSOSupport::VDSOSupport()
68
76
  // If vdso_base_ is still set to kInvalidBase, we got here
69
77
  // before VDSOSupport::Init has been called. Call it now.
@@ -104,8 +112,13 @@ const void *VDSOSupport::Init() {
104
112
  ElfW(auxv_t) aux;
105
113
  while (read(fd, &aux, sizeof(aux)) == sizeof(aux)) {
106
114
  if (aux.a_type == AT_SYSINFO_EHDR) {
115
+ #if defined(__NetBSD__)
116
+ vdso_base_.store(reinterpret_cast<void *>(aux.a_v),
117
+ std::memory_order_relaxed);
118
+ #else
107
119
  vdso_base_.store(reinterpret_cast<void *>(aux.a_un.a_val),
108
120
  std::memory_order_relaxed);
121
+ #endif
109
122
  break;
110
123
  }
111
124
  }
@@ -23,6 +23,11 @@
23
23
  #endif
24
24
  #endif
25
25
 
26
+ // Emscripten symbolization relies on JS. Do not use them in standalone mode.
27
+ #if defined(__EMSCRIPTEN__) && !defined(STANDALONE_WASM)
28
+ #define ABSL_INTERNAL_HAVE_SYMBOLIZE_WASM
29
+ #endif
30
+
26
31
  #if defined(ABSL_INTERNAL_HAVE_ELF_SYMBOLIZE)
27
32
  #include "absl/debugging/symbolize_elf.inc"
28
33
  #elif defined(ABSL_INTERNAL_HAVE_SYMBOLIZE_WIN32)
@@ -31,7 +36,7 @@
31
36
  #include "absl/debugging/symbolize_win32.inc"
32
37
  #elif defined(__APPLE__)
33
38
  #include "absl/debugging/symbolize_darwin.inc"
34
- #elif defined(__EMSCRIPTEN__)
39
+ #elif defined(ABSL_INTERNAL_HAVE_SYMBOLIZE_WASM)
35
40
  #include "absl/debugging/symbolize_emscripten.inc"
36
41
  #else
37
42
  #include "absl/debugging/symbolize_unimplemented.inc"
@@ -323,6 +323,7 @@ class Symbolizer {
323
323
  const ptrdiff_t relocation,
324
324
  char *out, int out_size,
325
325
  char *tmp_buf, int tmp_buf_size);
326
+ const char *GetUncachedSymbol(const void *pc);
326
327
 
327
328
  enum {
328
329
  SYMBOL_BUF_SIZE = 3072,
@@ -1145,6 +1146,14 @@ bool Symbolizer::RegisterObjFile(const char *filename,
1145
1146
  reinterpret_cast<uintptr_t>(old->end_addr), old->filename);
1146
1147
  }
1147
1148
  return true;
1149
+ } else if (old->end_addr == start_addr &&
1150
+ reinterpret_cast<uintptr_t>(old->start_addr) - old->offset ==
1151
+ reinterpret_cast<uintptr_t>(start_addr) - offset &&
1152
+ strcmp(old->filename, filename) == 0) {
1153
+ // Two contiguous map entries that span a contiguous region of the file,
1154
+ // perhaps because some part of the file was mlock()ed. Combine them.
1155
+ old->end_addr = end_addr;
1156
+ return true;
1148
1157
  }
1149
1158
  }
1150
1159
  ObjFile *obj = impl->addr_map_.Add();
@@ -1333,13 +1342,7 @@ static bool MaybeInitializeObjFile(ObjFile *obj) {
1333
1342
  // they are called here as well.
1334
1343
  // To keep stack consumption low, we would like this function to not
1335
1344
  // get inlined.
1336
- const char *Symbolizer::GetSymbol(const void *const pc) {
1337
- const char *entry = FindSymbolInCache(pc);
1338
- if (entry != nullptr) {
1339
- return entry;
1340
- }
1341
- symbol_buf_[0] = '\0';
1342
-
1345
+ const char *Symbolizer::GetUncachedSymbol(const void *pc) {
1343
1346
  ObjFile *const obj = FindObjFile(pc, 1);
1344
1347
  ptrdiff_t relocation = 0;
1345
1348
  int fd = -1;
@@ -1427,6 +1430,42 @@ const char *Symbolizer::GetSymbol(const void *const pc) {
1427
1430
  return InsertSymbolInCache(pc, symbol_buf_);
1428
1431
  }
1429
1432
 
1433
+ const char *Symbolizer::GetSymbol(const void *pc) {
1434
+ const char *entry = FindSymbolInCache(pc);
1435
+ if (entry != nullptr) {
1436
+ return entry;
1437
+ }
1438
+ symbol_buf_[0] = '\0';
1439
+
1440
+ #ifdef __hppa__
1441
+ {
1442
+ // In some contexts (e.g., return addresses), PA-RISC uses the lowest two
1443
+ // bits of the address to indicate the privilege level. Clear those bits
1444
+ // before trying to symbolize.
1445
+ const auto pc_bits = reinterpret_cast<uintptr_t>(pc);
1446
+ const auto address = pc_bits & ~0x3;
1447
+ entry = GetUncachedSymbol(reinterpret_cast<const void *>(address));
1448
+ if (entry != nullptr) {
1449
+ return entry;
1450
+ }
1451
+
1452
+ // In some contexts, PA-RISC also uses bit 1 of the address to indicate that
1453
+ // this is a cross-DSO function pointer. Such function pointers actually
1454
+ // point to a procedure label, a struct whose first 32-bit (pointer) element
1455
+ // actually points to the function text. With no symbol found for this
1456
+ // address so far, try interpreting it as a cross-DSO function pointer and
1457
+ // see how that goes.
1458
+ if (pc_bits & 0x2) {
1459
+ return GetUncachedSymbol(*reinterpret_cast<const void *const *>(address));
1460
+ }
1461
+
1462
+ return nullptr;
1463
+ }
1464
+ #else
1465
+ return GetUncachedSymbol(pc);
1466
+ #endif
1467
+ }
1468
+
1430
1469
  bool RemoveAllSymbolDecorators(void) {
1431
1470
  if (!g_decorators_mu.TryLock()) {
1432
1471
  // Someone else is using decorators. Get out.
@@ -30,6 +30,10 @@
30
30
  #ifndef ABSL_FUNCTIONAL_BIND_FRONT_H_
31
31
  #define ABSL_FUNCTIONAL_BIND_FRONT_H_
32
32
 
33
+ #if defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L
34
+ #include <functional> // For std::bind_front.
35
+ #endif // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L
36
+
33
37
  #include "absl/functional/internal/front_binder.h"
34
38
  #include "absl/utility/utility.h"
35
39
 
@@ -46,7 +50,8 @@ ABSL_NAMESPACE_BEGIN
46
50
  // specified. More importantly, it provides more reliable correctness guarantees
47
51
  // than `std::bind()`; while `std::bind()` will silently ignore passing more
48
52
  // parameters than expected, for example, `absl::bind_front()` will report such
49
- // mis-uses as errors.
53
+ // mis-uses as errors. In C++20, `absl::bind_front` is replaced by
54
+ // `std::bind_front`.
50
55
  //
51
56
  // absl::bind_front(a...) can be seen as storing the results of
52
57
  // std::make_tuple(a...).
@@ -170,6 +175,9 @@ ABSL_NAMESPACE_BEGIN
170
175
  // // Doesn't copy "hi".
171
176
  // absl::bind_front(Print, absl::string_view(hi))("Chuk");
172
177
  //
178
+ #if defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L
179
+ using std::bind_front;
180
+ #else // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L
173
181
  template <class F, class... BoundArgs>
174
182
  constexpr functional_internal::bind_front_t<F, BoundArgs...> bind_front(
175
183
  F&& func, BoundArgs&&... args) {
@@ -177,6 +185,7 @@ constexpr functional_internal::bind_front_t<F, BoundArgs...> bind_front(
177
185
  absl::in_place, absl::forward<F>(func),
178
186
  absl::forward<BoundArgs>(args)...);
179
187
  }
188
+ #endif // defined(__cpp_lib_bind_front) && __cpp_lib_bind_front >= 201907L
180
189
 
181
190
  ABSL_NAMESPACE_END
182
191
  } // namespace absl
@@ -69,7 +69,8 @@ class FunctionRef;
69
69
  // An `absl::FunctionRef` is a lightweight wrapper to any invokable object with
70
70
  // a compatible signature. Generally, an `absl::FunctionRef` should only be used
71
71
  // as an argument type and should be preferred as an argument over a const
72
- // reference to a `std::function`.
72
+ // reference to a `std::function`. `absl::FunctionRef` itself does not allocate,
73
+ // although the wrapped invokable may.
73
74
  //
74
75
  // Example:
75
76
  //