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
@@ -14,6 +14,8 @@
14
14
  //
15
15
  // absl::base_internal::invoke(f, args...) is an implementation of
16
16
  // INVOKE(f, args...) from section [func.require] of the C++ standard.
17
+ // When compiled as C++17 and later versions, it is implemented as an alias of
18
+ // std::invoke.
17
19
  //
18
20
  // [func.require]
19
21
  // Define INVOKE (f, t1, t2, ..., tN) as follows:
@@ -35,6 +37,26 @@
35
37
  #ifndef ABSL_BASE_INTERNAL_INVOKE_H_
36
38
  #define ABSL_BASE_INTERNAL_INVOKE_H_
37
39
 
40
+ #include "absl/base/config.h"
41
+
42
+ #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
43
+
44
+ #include <functional>
45
+
46
+ namespace absl {
47
+ ABSL_NAMESPACE_BEGIN
48
+ namespace base_internal {
49
+
50
+ using std::invoke;
51
+ using std::invoke_result_t;
52
+ using std::is_invocable_r;
53
+
54
+ } // namespace base_internal
55
+ ABSL_NAMESPACE_END
56
+ } // namespace absl
57
+
58
+ #else // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
59
+
38
60
  #include <algorithm>
39
61
  #include <type_traits>
40
62
  #include <utility>
@@ -80,8 +102,18 @@ struct MemFunAndRef : StrippedAccept<MemFunAndRef> {
80
102
  static decltype((std::declval<Obj>().*
81
103
  std::declval<MemFun>())(std::declval<Args>()...))
82
104
  Invoke(MemFun&& mem_fun, Obj&& obj, Args&&... args) {
105
+ // Ignore bogus GCC warnings on this line.
106
+ // See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101436 for similar example.
107
+ #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
108
+ #pragma GCC diagnostic push
109
+ #pragma GCC diagnostic ignored "-Warray-bounds"
110
+ #pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
111
+ #endif
83
112
  return (std::forward<Obj>(obj).*
84
113
  std::forward<MemFun>(mem_fun))(std::forward<Args>(args)...);
114
+ #if ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(11, 0)
115
+ #pragma GCC diagnostic pop
116
+ #endif
85
117
  }
86
118
  };
87
119
 
@@ -180,8 +212,30 @@ invoke_result_t<F, Args...> invoke(F&& f, Args&&... args) {
180
212
  return Invoker<F, Args...>::type::Invoke(std::forward<F>(f),
181
213
  std::forward<Args>(args)...);
182
214
  }
215
+
216
+ template <typename AlwaysVoid, typename, typename, typename...>
217
+ struct IsInvocableRImpl : std::false_type {};
218
+
219
+ template <typename R, typename F, typename... Args>
220
+ struct IsInvocableRImpl<
221
+ absl::void_t<absl::base_internal::invoke_result_t<F, Args...> >, R, F,
222
+ Args...>
223
+ : std::integral_constant<
224
+ bool,
225
+ std::is_convertible<absl::base_internal::invoke_result_t<F, Args...>,
226
+ R>::value ||
227
+ std::is_void<R>::value> {};
228
+
229
+ // Type trait whose member `value` is true if invoking `F` with `Args` is valid,
230
+ // and either the return type is convertible to `R`, or `R` is void.
231
+ // C++11-compatible version of `std::is_invocable_r`.
232
+ template <typename R, typename F, typename... Args>
233
+ using is_invocable_r = IsInvocableRImpl<void, R, F, Args...>;
234
+
183
235
  } // namespace base_internal
184
236
  ABSL_NAMESPACE_END
185
237
  } // namespace absl
186
238
 
239
+ #endif // ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
240
+
187
241
  #endif // ABSL_BASE_INTERNAL_INVOKE_H_
@@ -0,0 +1,138 @@
1
+ // Copyright 2022 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_BASE_INTERNAL_PREFETCH_H_
16
+ #define ABSL_BASE_INTERNAL_PREFETCH_H_
17
+
18
+ #include "absl/base/config.h"
19
+
20
+ #ifdef __SSE__
21
+ #include <xmmintrin.h>
22
+ #endif
23
+
24
+ #if defined(_MSC_VER) && defined(ABSL_INTERNAL_HAVE_SSE)
25
+ #include <intrin.h>
26
+ #pragma intrinsic(_mm_prefetch)
27
+ #endif
28
+
29
+ // Compatibility wrappers around __builtin_prefetch, to prefetch data
30
+ // for read if supported by the toolchain.
31
+
32
+ // Move data into the cache before it is read, or "prefetch" it.
33
+ //
34
+ // The value of `addr` is the address of the memory to prefetch. If
35
+ // the target and compiler support it, data prefetch instructions are
36
+ // generated. If the prefetch is done some time before the memory is
37
+ // read, it may be in the cache by the time the read occurs.
38
+ //
39
+ // The function names specify the temporal locality heuristic applied,
40
+ // using the names of Intel prefetch instructions:
41
+ //
42
+ // T0 - high degree of temporal locality; data should be left in as
43
+ // many levels of the cache possible
44
+ // T1 - moderate degree of temporal locality
45
+ // T2 - low degree of temporal locality
46
+ // Nta - no temporal locality, data need not be left in the cache
47
+ // after the read
48
+ //
49
+ // Incorrect or gratuitous use of these functions can degrade
50
+ // performance, so use them only when representative benchmarks show
51
+ // an improvement.
52
+ //
53
+ // Example usage:
54
+ //
55
+ // absl::base_internal::PrefetchT0(addr);
56
+ //
57
+ // Currently, the different prefetch calls behave on some Intel
58
+ // architectures as follows:
59
+ //
60
+ // SNB..SKL SKX
61
+ // PrefetchT0() L1/L2/L3 L1/L2
62
+ // PrefetchT1() L2/L3 L2
63
+ // PrefetchT2() L2/L3 L2
64
+ // PrefetchNta() L1/--/L3 L1*
65
+ //
66
+ // * On SKX PrefetchNta() will bring the line into L1 but will evict
67
+ // from L3 cache. This might result in surprising behavior.
68
+ //
69
+ // SNB = Sandy Bridge, SKL = Skylake, SKX = Skylake Xeon.
70
+ //
71
+ namespace absl {
72
+ ABSL_NAMESPACE_BEGIN
73
+ namespace base_internal {
74
+
75
+ void PrefetchT0(const void* addr);
76
+ void PrefetchT1(const void* addr);
77
+ void PrefetchT2(const void* addr);
78
+ void PrefetchNta(const void* addr);
79
+
80
+ // Implementation details follow.
81
+
82
+ #if ABSL_HAVE_BUILTIN(__builtin_prefetch) || defined(__GNUC__)
83
+
84
+ #define ABSL_INTERNAL_HAVE_PREFETCH 1
85
+
86
+ // See __builtin_prefetch:
87
+ // https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html.
88
+ //
89
+ // These functions speculatively load for read only. This is
90
+ // safe for all currently supported platforms. However, prefetch for
91
+ // store may have problems depending on the target platform.
92
+ //
93
+ inline void PrefetchT0(const void* addr) {
94
+ // Note: this uses prefetcht0 on Intel.
95
+ __builtin_prefetch(addr, 0, 3);
96
+ }
97
+ inline void PrefetchT1(const void* addr) {
98
+ // Note: this uses prefetcht1 on Intel.
99
+ __builtin_prefetch(addr, 0, 2);
100
+ }
101
+ inline void PrefetchT2(const void* addr) {
102
+ // Note: this uses prefetcht2 on Intel.
103
+ __builtin_prefetch(addr, 0, 1);
104
+ }
105
+ inline void PrefetchNta(const void* addr) {
106
+ // Note: this uses prefetchtnta on Intel.
107
+ __builtin_prefetch(addr, 0, 0);
108
+ }
109
+
110
+ #elif defined(ABSL_INTERNAL_HAVE_SSE)
111
+
112
+ #define ABSL_INTERNAL_HAVE_PREFETCH 1
113
+
114
+ inline void PrefetchT0(const void* addr) {
115
+ _mm_prefetch(reinterpret_cast<const char*>(addr), _MM_HINT_T0);
116
+ }
117
+ inline void PrefetchT1(const void* addr) {
118
+ _mm_prefetch(reinterpret_cast<const char*>(addr), _MM_HINT_T1);
119
+ }
120
+ inline void PrefetchT2(const void* addr) {
121
+ _mm_prefetch(reinterpret_cast<const char*>(addr), _MM_HINT_T2);
122
+ }
123
+ inline void PrefetchNta(const void* addr) {
124
+ _mm_prefetch(reinterpret_cast<const char*>(addr), _MM_HINT_NTA);
125
+ }
126
+
127
+ #else
128
+ inline void PrefetchT0(const void*) {}
129
+ inline void PrefetchT1(const void*) {}
130
+ inline void PrefetchT2(const void*) {}
131
+ inline void PrefetchNta(const void*) {}
132
+ #endif
133
+
134
+ } // namespace base_internal
135
+ ABSL_NAMESPACE_END
136
+ } // namespace absl
137
+
138
+ #endif // ABSL_BASE_INTERNAL_PREFETCH_H_
@@ -14,15 +14,17 @@
14
14
 
15
15
  #include "absl/base/internal/raw_logging.h"
16
16
 
17
- #include <stddef.h>
18
17
  #include <cstdarg>
18
+ #include <cstddef>
19
19
  #include <cstdio>
20
20
  #include <cstdlib>
21
21
  #include <cstring>
22
+ #include <string>
22
23
 
23
24
  #include "absl/base/attributes.h"
24
25
  #include "absl/base/config.h"
25
26
  #include "absl/base/internal/atomic_hook.h"
27
+ #include "absl/base/internal/errno_saver.h"
26
28
  #include "absl/base/log_severity.h"
27
29
 
28
30
  // We know how to perform low-level writes to stderr in POSIX and Windows. For
@@ -36,8 +38,8 @@
36
38
  // This preprocessor token is also defined in raw_io.cc. If you need to copy
37
39
  // this, consider moving both to config.h instead.
38
40
  #if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || \
39
- defined(__Fuchsia__) || defined(__native_client__) || \
40
- defined(__EMSCRIPTEN__) || defined(__ASYLO__)
41
+ defined(__Fuchsia__) || defined(__native_client__) || \
42
+ defined(__OpenBSD__) || defined(__EMSCRIPTEN__) || defined(__ASYLO__)
41
43
 
42
44
  #include <unistd.h>
43
45
 
@@ -50,7 +52,8 @@
50
52
  // ABSL_HAVE_SYSCALL_WRITE is defined when the platform provides the syscall
51
53
  // syscall(SYS_write, /*int*/ fd, /*char* */ buf, /*size_t*/ len);
52
54
  // for low level operations that want to avoid libc.
53
- #if (defined(__linux__) || defined(__FreeBSD__)) && !defined(__ANDROID__)
55
+ #if (defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)) && \
56
+ !defined(__ANDROID__)
54
57
  #include <sys/syscall.h>
55
58
  #define ABSL_HAVE_SYSCALL_WRITE 1
56
59
  #define ABSL_LOW_LEVEL_WRITE_SUPPORTED 1
@@ -76,13 +79,6 @@ namespace {
76
79
  // Explicitly `#error` out when not `ABSL_LOW_LEVEL_WRITE_SUPPORTED`, except for
77
80
  // a selected set of platforms for which we expect not to be able to raw log.
78
81
 
79
- ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
80
- absl::base_internal::AtomicHook<LogPrefixHook>
81
- log_prefix_hook;
82
- ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
83
- absl::base_internal::AtomicHook<AbortHook>
84
- abort_hook;
85
-
86
82
  #ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED
87
83
  constexpr char kTruncated[] = " ... (message truncated)\n";
88
84
 
@@ -130,6 +126,18 @@ bool DoRawLog(char** buf, int* size, const char* format, ...) {
130
126
  return true;
131
127
  }
132
128
 
129
+ bool DefaultLogFilterAndPrefix(absl::LogSeverity, const char* file, int line,
130
+ char** buf, int* buf_size) {
131
+ DoRawLog(buf, buf_size, "[%s : %d] RAW: ", file, line);
132
+ return true;
133
+ }
134
+
135
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
136
+ absl::base_internal::AtomicHook<LogFilterAndPrefixHook>
137
+ log_filter_and_prefix_hook(DefaultLogFilterAndPrefix);
138
+ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES
139
+ absl::base_internal::AtomicHook<AbortHook> abort_hook;
140
+
133
141
  void RawLogVA(absl::LogSeverity severity, const char* file, int line,
134
142
  const char* format, va_list ap) ABSL_PRINTF_ATTRIBUTE(4, 0);
135
143
  void RawLogVA(absl::LogSeverity severity, const char* file, int line,
@@ -150,14 +158,7 @@ void RawLogVA(absl::LogSeverity severity, const char* file, int line,
150
158
  }
151
159
  #endif
152
160
 
153
- auto log_prefix_hook_ptr = log_prefix_hook.Load();
154
- if (log_prefix_hook_ptr) {
155
- enabled = log_prefix_hook_ptr(severity, file, line, &buf, &size);
156
- } else {
157
- if (enabled) {
158
- DoRawLog(&buf, &size, "[%s : %d] RAW: ", file, line);
159
- }
160
- }
161
+ enabled = log_filter_and_prefix_hook(severity, file, line, &buf, &size);
161
162
  const char* const prefix_end = buf;
162
163
 
163
164
  #ifdef ABSL_LOW_LEVEL_WRITE_SUPPORTED
@@ -168,11 +169,12 @@ void RawLogVA(absl::LogSeverity severity, const char* file, int line,
168
169
  } else {
169
170
  DoRawLog(&buf, &size, "%s", kTruncated);
170
171
  }
171
- SafeWriteToStderr(buffer, strlen(buffer));
172
+ AsyncSignalSafeWriteToStderr(buffer, strlen(buffer));
172
173
  }
173
174
  #else
174
175
  static_cast<void>(format);
175
176
  static_cast<void>(ap);
177
+ static_cast<void>(enabled);
176
178
  #endif
177
179
 
178
180
  // Abort the process after logging a FATAL message, even if the output itself
@@ -195,8 +197,11 @@ void DefaultInternalLog(absl::LogSeverity severity, const char* file, int line,
195
197
 
196
198
  } // namespace
197
199
 
198
- void SafeWriteToStderr(const char *s, size_t len) {
200
+ void AsyncSignalSafeWriteToStderr(const char* s, size_t len) {
201
+ absl::base_internal::ErrnoSaver errno_saver;
199
202
  #if defined(ABSL_HAVE_SYSCALL_WRITE)
203
+ // We prefer calling write via `syscall` to minimize the risk of libc doing
204
+ // something "helpful".
200
205
  syscall(SYS_write, STDERR_FILENO, s, len);
201
206
  #elif defined(ABSL_HAVE_POSIX_WRITE)
202
207
  write(STDERR_FILENO, s, len);
@@ -229,7 +234,9 @@ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES ABSL_DLL
229
234
  absl::base_internal::AtomicHook<InternalLogFunction>
230
235
  internal_log_function(DefaultInternalLog);
231
236
 
232
- void RegisterLogPrefixHook(LogPrefixHook func) { log_prefix_hook.Store(func); }
237
+ void RegisterLogFilterAndPrefixHook(LogFilterAndPrefixHook func) {
238
+ log_filter_and_prefix_hook.Store(func);
239
+ }
233
240
 
234
241
  void RegisterAbortHook(AbortHook func) { abort_hook.Store(func); }
235
242
 
@@ -109,12 +109,9 @@ namespace raw_logging_internal {
109
109
  void RawLog(absl::LogSeverity severity, const char* file, int line,
110
110
  const char* format, ...) ABSL_PRINTF_ATTRIBUTE(4, 5);
111
111
 
112
- // Writes the provided buffer directly to stderr, in a safe, low-level manner.
113
- //
114
- // In POSIX this means calling write(), which is async-signal safe and does
115
- // not malloc. If the platform supports the SYS_write syscall, we invoke that
116
- // directly to side-step any libc interception.
117
- void SafeWriteToStderr(const char *s, size_t len);
112
+ // Writes the provided buffer directly to stderr, in a signal-safe, low-level
113
+ // manner.
114
+ void AsyncSignalSafeWriteToStderr(const char* s, size_t len);
118
115
 
119
116
  // compile-time function to get the "base" filename, that is, the part of
120
117
  // a filename after the last "/" or "\" path separator. The search starts at
@@ -148,11 +145,12 @@ bool RawLoggingFullySupported();
148
145
  // 'severity' is the severity level of the message being written.
149
146
  // 'file' and 'line' are the file and line number where the ABSL_RAW_LOG macro
150
147
  // was located.
151
- // 'buffer' and 'buf_size' are pointers to the buffer and buffer size. If the
152
- // hook writes a prefix, it must increment *buffer and decrement *buf_size
148
+ // 'buf' and 'buf_size' are pointers to the buffer and buffer size. If the
149
+ // hook writes a prefix, it must increment *buf and decrement *buf_size
153
150
  // accordingly.
154
- using LogPrefixHook = bool (*)(absl::LogSeverity severity, const char* file,
155
- int line, char** buffer, int* buf_size);
151
+ using LogFilterAndPrefixHook = bool (*)(absl::LogSeverity severity,
152
+ const char* file, int line, char** buf,
153
+ int* buf_size);
156
154
 
157
155
  // Function type for a raw_logging customization hook called to abort a process
158
156
  // when a FATAL message is logged. If the provided AbortHook() returns, the
@@ -162,7 +160,10 @@ using LogPrefixHook = bool (*)(absl::LogSeverity severity, const char* file,
162
160
  // was located.
163
161
  // The NUL-terminated logged message lives in the buffer between 'buf_start'
164
162
  // and 'buf_end'. 'prefix_end' points to the first non-prefix character of the
165
- // buffer (as written by the LogPrefixHook.)
163
+ // buffer (as written by the LogFilterAndPrefixHook.)
164
+ //
165
+ // The lifetime of the filename and message buffers will not end while the
166
+ // process remains alive.
166
167
  using AbortHook = void (*)(const char* file, int line, const char* buf_start,
167
168
  const char* prefix_end, const char* buf_end);
168
169
 
@@ -184,7 +185,7 @@ ABSL_INTERNAL_ATOMIC_HOOK_ATTRIBUTES ABSL_DLL extern base_internal::AtomicHook<
184
185
  //
185
186
  // These functions are safe to call at any point during initialization; they do
186
187
  // not block or malloc, and are async-signal safe.
187
- void RegisterLogPrefixHook(LogPrefixHook func);
188
+ void RegisterLogFilterAndPrefixHook(LogFilterAndPrefixHook func);
188
189
  void RegisterAbortHook(AbortHook func);
189
190
  void RegisterInternalLogFunction(InternalLogFunction func);
190
191
 
@@ -19,6 +19,7 @@
19
19
  #include <limits>
20
20
 
21
21
  #include "absl/base/attributes.h"
22
+ #include "absl/base/config.h"
22
23
  #include "absl/base/internal/atomic_hook.h"
23
24
  #include "absl/base/internal/cycleclock.h"
24
25
  #include "absl/base/internal/spinlock_wait.h"
@@ -66,12 +67,14 @@ void RegisterSpinLockProfiler(void (*fn)(const void *contendedlock,
66
67
  submit_profile_data.Store(fn);
67
68
  }
68
69
 
70
+ #ifdef ABSL_INTERNAL_NEED_REDUNDANT_CONSTEXPR_DECL
69
71
  // Static member variable definitions.
70
72
  constexpr uint32_t SpinLock::kSpinLockHeld;
71
73
  constexpr uint32_t SpinLock::kSpinLockCooperative;
72
74
  constexpr uint32_t SpinLock::kSpinLockDisabledScheduling;
73
75
  constexpr uint32_t SpinLock::kSpinLockSleeper;
74
76
  constexpr uint32_t SpinLock::kWaitTimeMask;
77
+ #endif
75
78
 
76
79
  // Uncommon constructors.
77
80
  SpinLock::SpinLock(base_internal::SchedulingMode mode)
@@ -120,6 +120,14 @@ class ABSL_LOCKABLE SpinLock {
120
120
  return (lockword_.load(std::memory_order_relaxed) & kSpinLockHeld) != 0;
121
121
  }
122
122
 
123
+ // Return immediately if this thread holds the SpinLock exclusively.
124
+ // Otherwise, report an error by crashing with a diagnostic.
125
+ inline void AssertHeld() const ABSL_ASSERT_EXCLUSIVE_LOCK() {
126
+ if (!IsHeld()) {
127
+ ABSL_RAW_LOG(FATAL, "thread should hold the lock on SpinLock");
128
+ }
129
+ }
130
+
123
131
  protected:
124
132
  // These should not be exported except for testing.
125
133
 
@@ -57,13 +57,10 @@ static_assert(sizeof(std::atomic<uint32_t>) == sizeof(int),
57
57
  extern "C" {
58
58
 
59
59
  ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalSpinLockDelay)(
60
- std::atomic<uint32_t> *w, uint32_t value, int loop,
60
+ std::atomic<uint32_t> *w, uint32_t value, int,
61
61
  absl::base_internal::SchedulingMode) {
62
62
  absl::base_internal::ErrnoSaver errno_saver;
63
- struct timespec tm;
64
- tm.tv_sec = 0;
65
- tm.tv_nsec = absl::base_internal::SpinLockSuggestedDelayNS(loop);
66
- syscall(SYS_futex, w, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, value, &tm);
63
+ syscall(SYS_futex, w, FUTEX_WAIT | FUTEX_PRIVATE_FLAG, value, nullptr);
67
64
  }
68
65
 
69
66
  ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL(AbslInternalSpinLockWake)(
@@ -0,0 +1,88 @@
1
+ // Copyright 2020 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/base/internal/strerror.h"
16
+
17
+ #include <array>
18
+ #include <cerrno>
19
+ #include <cstddef>
20
+ #include <cstdio>
21
+ #include <cstring>
22
+ #include <string>
23
+ #include <type_traits>
24
+
25
+ #include "absl/base/internal/errno_saver.h"
26
+
27
+ namespace absl {
28
+ ABSL_NAMESPACE_BEGIN
29
+ namespace base_internal {
30
+ namespace {
31
+
32
+ const char* StrErrorAdaptor(int errnum, char* buf, size_t buflen) {
33
+ #if defined(_WIN32)
34
+ int rc = strerror_s(buf, buflen, errnum);
35
+ buf[buflen - 1] = '\0'; // guarantee NUL termination
36
+ if (rc == 0 && strncmp(buf, "Unknown error", buflen) == 0) *buf = '\0';
37
+ return buf;
38
+ #else
39
+ // The type of `ret` is platform-specific; both of these branches must compile
40
+ // either way but only one will execute on any given platform:
41
+ auto ret = strerror_r(errnum, buf, buflen);
42
+ if (std::is_same<decltype(ret), int>::value) {
43
+ // XSI `strerror_r`; `ret` is `int`:
44
+ if (ret) *buf = '\0';
45
+ return buf;
46
+ } else {
47
+ // GNU `strerror_r`; `ret` is `char *`:
48
+ return reinterpret_cast<const char*>(ret);
49
+ }
50
+ #endif
51
+ }
52
+
53
+ std::string StrErrorInternal(int errnum) {
54
+ char buf[100];
55
+ const char* str = StrErrorAdaptor(errnum, buf, sizeof buf);
56
+ if (*str == '\0') {
57
+ snprintf(buf, sizeof buf, "Unknown error %d", errnum);
58
+ str = buf;
59
+ }
60
+ return str;
61
+ }
62
+
63
+ // kSysNerr is the number of errors from a recent glibc. `StrError()` falls back
64
+ // to `StrErrorAdaptor()` if the value is larger than this.
65
+ constexpr int kSysNerr = 135;
66
+
67
+ std::array<std::string, kSysNerr>* NewStrErrorTable() {
68
+ auto* table = new std::array<std::string, kSysNerr>;
69
+ for (int i = 0; i < static_cast<int>(table->size()); ++i) {
70
+ (*table)[i] = StrErrorInternal(i);
71
+ }
72
+ return table;
73
+ }
74
+
75
+ } // namespace
76
+
77
+ std::string StrError(int errnum) {
78
+ absl::base_internal::ErrnoSaver errno_saver;
79
+ static const auto* table = NewStrErrorTable();
80
+ if (errnum >= 0 && errnum < static_cast<int>(table->size())) {
81
+ return (*table)[errnum];
82
+ }
83
+ return StrErrorInternal(errnum);
84
+ }
85
+
86
+ } // namespace base_internal
87
+ ABSL_NAMESPACE_END
88
+ } // namespace absl
@@ -0,0 +1,39 @@
1
+ // Copyright 2020 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #ifndef ABSL_BASE_INTERNAL_STRERROR_H_
16
+ #define ABSL_BASE_INTERNAL_STRERROR_H_
17
+
18
+ #include <string>
19
+
20
+ #include "absl/base/config.h"
21
+
22
+ namespace absl {
23
+ ABSL_NAMESPACE_BEGIN
24
+ namespace base_internal {
25
+
26
+ // A portable and thread-safe alternative to C89's `strerror`.
27
+ //
28
+ // The C89 specification of `strerror` is not suitable for use in a
29
+ // multi-threaded application as the returned string may be changed by calls to
30
+ // `strerror` from another thread. The many non-stdlib alternatives differ
31
+ // enough in their names, availability, and semantics to justify this wrapper
32
+ // around them. `errno` will not be modified by a call to `absl::StrError`.
33
+ std::string StrError(int errnum);
34
+
35
+ } // namespace base_internal
36
+ ABSL_NAMESPACE_END
37
+ } // namespace absl
38
+
39
+ #endif // ABSL_BASE_INTERNAL_STRERROR_H_
@@ -124,7 +124,6 @@ int Win32NumCPUs() {
124
124
 
125
125
  } // namespace
126
126
 
127
-
128
127
  static int GetNumCPUs() {
129
128
  #if defined(__myriad2__)
130
129
  return 1;
@@ -14,7 +14,7 @@
14
14
 
15
15
  #include "absl/base/internal/thread_identity.h"
16
16
 
17
- #ifndef _WIN32
17
+ #if !defined(_WIN32) || defined(__MINGW32__)
18
18
  #include <pthread.h>
19
19
  #include <signal.h>
20
20
  #endif
@@ -56,6 +56,7 @@ void AllocateThreadIdentityKey(ThreadIdentityReclaimerFunction reclaimer) {
56
56
  // *different* instances of this ptr.
57
57
  // Apple platforms have the visibility attribute, but issue a compile warning
58
58
  // that protected visibility is unsupported.
59
+ ABSL_CONST_INIT // Must come before __attribute__((visibility("protected")))
59
60
  #if ABSL_HAVE_ATTRIBUTE(visibility) && !defined(__APPLE__)
60
61
  __attribute__((visibility("protected")))
61
62
  #endif // ABSL_HAVE_ATTRIBUTE(visibility) && !defined(__APPLE__)
@@ -24,8 +24,13 @@
24
24
  #ifdef __GLIBC__
25
25
  #include <sys/platform/ppc.h>
26
26
  #elif defined(__FreeBSD__)
27
- #include <sys/sysctl.h>
27
+ // clang-format off
28
+ // This order does actually matter =(.
28
29
  #include <sys/types.h>
30
+ #include <sys/sysctl.h>
31
+ // clang-format on
32
+
33
+ #include "absl/base/call_once.h"
29
34
  #endif
30
35
  #endif
31
36
 
@@ -49,12 +54,6 @@ double UnscaledCycleClock::Frequency() {
49
54
 
50
55
  #elif defined(__x86_64__)
51
56
 
52
- int64_t UnscaledCycleClock::Now() {
53
- uint64_t low, high;
54
- __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
55
- return (high << 32) | low;
56
- }
57
-
58
57
  double UnscaledCycleClock::Frequency() {
59
58
  return base_internal::NominalCPUFrequency();
60
59
  }
@@ -47,7 +47,7 @@
47
47
  // The following platforms have an implementation of a hardware counter.
48
48
  #if defined(__i386__) || defined(__x86_64__) || defined(__aarch64__) || \
49
49
  defined(__powerpc__) || defined(__ppc__) || defined(__riscv) || \
50
- defined(_M_IX86) || defined(_M_X64)
50
+ defined(_M_IX86) || (defined(_M_X64) && !defined(_M_ARM64EC))
51
51
  #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 1
52
52
  #else
53
53
  #define ABSL_HAVE_UNSCALED_CYCLECLOCK_IMPLEMENTATION 0
@@ -59,8 +59,7 @@
59
59
  // CycleClock that runs at atleast 1 MHz. We've found some Android
60
60
  // ARM64 devices where this is not the case, so we disable it by
61
61
  // default on Android ARM64.
62
- #if defined(__native_client__) || \
63
- (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE) || \
62
+ #if defined(__native_client__) || (defined(__APPLE__)) || \
64
63
  (defined(__ANDROID__) && defined(__aarch64__))
65
64
  #define ABSL_USE_UNSCALED_CYCLECLOCK_DEFAULT 0
66
65
  #else
@@ -115,6 +114,16 @@ class UnscaledCycleClock {
115
114
  friend class base_internal::UnscaledCycleClockWrapperForInitializeFrequency;
116
115
  };
117
116
 
117
+ #if defined(__x86_64__)
118
+
119
+ inline int64_t UnscaledCycleClock::Now() {
120
+ uint64_t low, high;
121
+ __asm__ volatile("rdtsc" : "=a"(low), "=d"(high));
122
+ return (high << 32) | low;
123
+ }
124
+
125
+ #endif
126
+
118
127
  } // namespace base_internal
119
128
  ABSL_NAMESPACE_END
120
129
  } // namespace absl