grpc 1.28.0 → 1.30.0

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 (497) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7694 -11190
  3. data/include/grpc/grpc.h +2 -2
  4. data/include/grpc/grpc_security.h +22 -9
  5. data/include/grpc/grpc_security_constants.h +1 -0
  6. data/include/grpc/impl/codegen/grpc_types.h +19 -21
  7. data/include/grpc/impl/codegen/port_platform.h +6 -2
  8. data/include/grpc/module.modulemap +24 -39
  9. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +203 -236
  11. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_proxy.cc +17 -10
  15. data/src/core/ext/filters/client_channel/lb_policy.cc +19 -18
  16. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  17. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +10 -4
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +240 -301
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  28. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  29. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +84 -37
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  34. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +6 -2
  35. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  36. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  37. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  38. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +73 -59
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +16 -20
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +184 -133
  46. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  48. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +40 -43
  49. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +93 -102
  50. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  51. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +2 -2
  52. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +32 -5
  53. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  54. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  55. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  56. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +16 -16
  57. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +19 -16
  58. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +20 -31
  59. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +4 -3
  60. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  61. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  62. data/src/core/ext/filters/client_channel/service_config.cc +104 -144
  63. data/src/core/ext/filters/client_channel/service_config.h +28 -98
  64. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  65. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  66. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  67. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  68. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  69. data/src/core/ext/filters/client_channel/xds/xds_api.cc +348 -221
  70. data/src/core/ext/filters/client_channel/xds/xds_api.h +37 -37
  71. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +44 -49
  72. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +4 -3
  73. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +4 -2
  74. data/src/core/ext/filters/client_channel/xds/xds_client.cc +532 -339
  75. data/src/core/ext/filters/client_channel/xds/xds_client.h +57 -22
  76. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +11 -12
  77. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +31 -19
  78. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  79. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  80. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  81. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  82. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  83. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  84. data/src/core/ext/filters/message_size/message_size_filter.cc +7 -10
  85. data/src/core/ext/filters/message_size/message_size_filter.h +4 -4
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +4 -4
  87. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +23 -22
  89. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  90. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  91. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  92. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  93. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  94. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  95. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  96. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  97. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  98. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  99. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  100. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  101. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  102. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  103. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  104. data/src/core/ext/transport/chttp2/transport/writing.cc +15 -8
  105. data/src/core/ext/transport/inproc/inproc_transport.cc +19 -0
  106. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +4 -229
  107. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -875
  108. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  109. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  110. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  111. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  112. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  113. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  114. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +1 -0
  115. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +21 -8
  116. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +43 -7
  117. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +1 -0
  118. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +1 -0
  119. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +1 -0
  120. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +2 -1
  121. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  122. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  123. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +47 -26
  124. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +115 -65
  125. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +1 -0
  126. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +2 -1
  129. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +24 -20
  130. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +28 -13
  131. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +1 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +38 -18
  133. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +88 -6
  134. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +1 -0
  137. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +1 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +1 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +1 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +9 -6
  141. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +12 -4
  142. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +1 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +1 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +15 -10
  145. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +16 -0
  146. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +2 -1
  148. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +1 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +1 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +1 -0
  151. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +1 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +63 -41
  153. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +173 -77
  154. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +1 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +1 -0
  156. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +1 -0
  157. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +48 -28
  158. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +90 -30
  159. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +1 -0
  160. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  161. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  163. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  164. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  165. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  166. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +16 -0
  167. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +36 -0
  168. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +1 -0
  169. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +1 -0
  170. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  171. data/src/core/ext/upb-generated/envoy/type/range.upb.c +1 -0
  172. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +1 -0
  173. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +1 -0
  174. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  175. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  176. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  177. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  178. data/src/core/ext/upb-generated/validate/validate.upb.c +21 -20
  179. data/src/core/ext/upb-generated/validate/validate.upb.h +69 -63
  180. data/src/core/lib/channel/channel_args.cc +15 -14
  181. data/src/core/lib/channel/channel_args.h +3 -1
  182. data/src/core/lib/channel/channel_stack.h +20 -13
  183. data/src/core/lib/channel/channelz.cc +5 -6
  184. data/src/core/lib/channel/channelz.h +3 -2
  185. data/src/core/lib/channel/channelz_registry.cc +5 -3
  186. data/src/core/lib/channel/connected_channel.cc +7 -5
  187. data/src/core/lib/channel/context.h +1 -1
  188. data/src/core/lib/channel/handshaker.cc +11 -13
  189. data/src/core/lib/channel/handshaker.h +4 -2
  190. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  191. data/src/core/lib/channel/status_util.cc +2 -3
  192. data/src/core/lib/compression/message_compress.cc +5 -1
  193. data/src/core/lib/debug/stats.cc +21 -27
  194. data/src/core/lib/debug/stats.h +3 -1
  195. data/src/core/lib/gpr/spinlock.h +2 -3
  196. data/src/core/lib/gpr/string.cc +2 -26
  197. data/src/core/lib/gpr/string.h +0 -16
  198. data/src/core/lib/gpr/sync_abseil.cc +2 -0
  199. data/src/core/lib/gpr/time.cc +4 -0
  200. data/src/core/lib/gpr/time_posix.cc +1 -1
  201. data/src/core/lib/gprpp/atomic.h +6 -6
  202. data/src/core/lib/gprpp/fork.cc +1 -1
  203. data/src/core/lib/gprpp/host_port.cc +29 -35
  204. data/src/core/lib/gprpp/host_port.h +14 -17
  205. data/src/core/lib/gprpp/map.h +5 -11
  206. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  207. data/src/core/lib/http/format_request.cc +46 -65
  208. data/src/core/lib/http/httpcli.cc +2 -3
  209. data/src/core/lib/http/httpcli.h +2 -3
  210. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  211. data/src/core/lib/http/parser.h +2 -3
  212. data/src/core/lib/iomgr/buffer_list.h +22 -21
  213. data/src/core/lib/iomgr/call_combiner.h +3 -2
  214. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  215. data/src/core/lib/iomgr/closure.h +2 -3
  216. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  217. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  218. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  219. data/src/core/lib/iomgr/error.cc +6 -9
  220. data/src/core/lib/iomgr/error.h +0 -1
  221. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  222. data/src/core/lib/iomgr/ev_apple.h +43 -0
  223. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  224. data/src/core/lib/iomgr/ev_epollex_linux.cc +2 -3
  225. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  226. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  227. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  228. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  229. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  230. data/src/core/lib/{gprpp/optional.h → iomgr/pollset_uv.h} +11 -12
  231. data/src/core/lib/iomgr/port.h +1 -0
  232. data/src/core/lib/iomgr/python_util.h +46 -0
  233. data/src/core/lib/iomgr/resolve_address.h +4 -6
  234. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  235. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  236. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  237. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  238. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  239. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  240. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  241. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  242. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  243. data/src/core/lib/iomgr/socket_utils_common_posix.cc +7 -26
  244. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  245. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  246. data/src/core/lib/iomgr/tcp_client_posix.cc +8 -5
  247. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  248. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  249. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -9
  250. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  251. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +5 -4
  252. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  253. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  254. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  255. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  256. data/src/core/lib/{gprpp/inlined_vector.h → iomgr/timer_generic.h} +19 -17
  257. data/src/core/lib/iomgr/timer_heap.h +2 -3
  258. data/src/core/lib/iomgr/udp_server.cc +9 -14
  259. data/src/core/lib/json/json.h +3 -2
  260. data/src/core/lib/json/json_reader.cc +5 -5
  261. data/src/core/lib/json/json_writer.cc +13 -12
  262. data/src/core/lib/security/credentials/composite/composite_credentials.cc +12 -0
  263. data/src/core/lib/security/credentials/composite/composite_credentials.h +6 -3
  264. data/src/core/lib/security/credentials/credentials.cc +0 -84
  265. data/src/core/lib/security/credentials/credentials.h +8 -59
  266. data/src/core/lib/security/credentials/fake/fake_credentials.h +4 -0
  267. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +3 -8
  268. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  269. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  270. data/src/core/lib/security/credentials/jwt/json_token.cc +1 -1
  271. data/src/core/lib/security/credentials/jwt/json_token.h +2 -5
  272. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  273. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +8 -15
  274. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +2 -3
  275. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +55 -27
  276. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +9 -3
  277. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +13 -0
  278. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -0
  279. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +23 -13
  280. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +38 -11
  281. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +21 -6
  282. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +7 -7
  283. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +3 -2
  284. data/src/core/lib/security/security_connector/local/local_security_connector.cc +1 -1
  285. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  286. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -25
  287. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  288. data/src/core/lib/security/security_connector/ssl_utils.cc +59 -12
  289. data/src/core/lib/security/security_connector/ssl_utils.h +12 -10
  290. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +77 -51
  291. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +27 -5
  292. data/src/core/lib/security/transport/client_auth_filter.cc +1 -2
  293. data/src/core/lib/slice/slice_intern.cc +2 -3
  294. data/src/core/lib/slice/slice_internal.h +14 -0
  295. data/src/core/lib/slice/slice_utils.h +9 -0
  296. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  297. data/src/core/lib/surface/call.cc +2 -3
  298. data/src/core/lib/surface/call_log_batch.cc +50 -58
  299. data/src/core/lib/surface/channel.cc +53 -31
  300. data/src/core/lib/surface/channel.h +35 -4
  301. data/src/core/lib/surface/channel_ping.cc +2 -3
  302. data/src/core/lib/surface/completion_queue.cc +33 -33
  303. data/src/core/lib/surface/event_string.cc +18 -25
  304. data/src/core/lib/surface/event_string.h +3 -1
  305. data/src/core/lib/surface/init_secure.cc +1 -4
  306. data/src/core/lib/surface/server.cc +570 -369
  307. data/src/core/lib/surface/server.h +32 -0
  308. data/src/core/lib/surface/version.cc +2 -2
  309. data/src/core/lib/transport/byte_stream.h +7 -2
  310. data/src/core/lib/transport/connectivity_state.cc +7 -6
  311. data/src/core/lib/transport/connectivity_state.h +5 -3
  312. data/src/core/lib/transport/metadata.cc +3 -3
  313. data/src/core/lib/transport/metadata_batch.h +2 -3
  314. data/src/core/lib/transport/static_metadata.h +1 -1
  315. data/src/core/lib/transport/status_conversion.cc +6 -14
  316. data/src/core/lib/transport/transport.cc +2 -3
  317. data/src/core/lib/transport/transport.h +3 -2
  318. data/src/core/lib/transport/transport_op_string.cc +61 -102
  319. data/src/core/lib/uri/uri_parser.h +2 -3
  320. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  321. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  322. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +8 -1
  323. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  324. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +32 -2
  325. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +9 -1
  326. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  327. data/src/core/tsi/fake_transport_security.cc +10 -15
  328. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  329. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  330. data/src/core/tsi/ssl_transport_security.cc +52 -39
  331. data/src/core/tsi/ssl_transport_security.h +8 -8
  332. data/src/core/tsi/ssl_types.h +0 -2
  333. data/src/core/tsi/transport_security.h +6 -9
  334. data/src/core/tsi/transport_security_grpc.h +2 -3
  335. data/src/core/tsi/transport_security_interface.h +3 -3
  336. data/src/ruby/ext/grpc/rb_call.c +9 -1
  337. data/src/ruby/lib/grpc/errors.rb +103 -42
  338. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  339. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  340. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  341. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  342. data/src/ruby/lib/grpc/structs.rb +1 -1
  343. data/src/ruby/lib/grpc/version.rb +1 -1
  344. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  345. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
  346. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  347. data/src/ruby/spec/debug_message_spec.rb +134 -0
  348. data/src/ruby/spec/generic/service_spec.rb +2 -0
  349. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
  350. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
  351. data/src/ruby/spec/testdata/ca.pem +18 -13
  352. data/src/ruby/spec/testdata/client.key +26 -14
  353. data/src/ruby/spec/testdata/client.pem +18 -12
  354. data/src/ruby/spec/testdata/server1.key +26 -14
  355. data/src/ruby/spec/testdata/server1.pem +20 -14
  356. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  357. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  358. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  359. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  360. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  361. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  362. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  363. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  364. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  365. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  366. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  367. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  368. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  369. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  370. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  371. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  372. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  373. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  374. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  375. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  376. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  377. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  378. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  379. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  380. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  381. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  382. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  383. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  384. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  385. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  386. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  387. data/third_party/boringssl-with-bazel/err_data.c +329 -297
  388. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +1 -1
  389. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +7 -5
  390. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +13 -4
  391. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +11 -0
  392. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519.c +18 -26
  393. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/curve25519_tables.h +13 -21
  394. data/third_party/boringssl-with-bazel/src/{third_party/fiat → crypto/curve25519}/internal.h +14 -22
  395. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +1 -1
  396. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +15 -0
  397. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +10 -0
  398. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  399. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  400. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +2 -2
  401. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +33 -32
  402. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1 -1
  403. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +2 -1
  404. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +3 -3
  405. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +14 -11
  406. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +8 -8
  407. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +30 -154
  408. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +16 -0
  409. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +289 -117
  410. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +13 -27
  411. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +96 -55
  412. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +25 -7
  413. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +432 -160
  414. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +63 -71
  415. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +5 -14
  416. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9481 -9485
  417. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +80 -99
  418. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  419. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  420. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +90 -11
  421. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +125 -148
  422. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +189 -3
  423. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +61 -18
  424. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +2 -2
  425. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +20 -5
  426. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  427. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  428. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  429. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +41 -5
  430. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +32 -17
  431. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +24 -114
  432. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +4 -0
  433. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +1 -0
  434. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +51 -38
  435. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +15 -1
  436. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +44 -35
  437. data/third_party/boringssl-with-bazel/src/crypto/mem.c +29 -12
  438. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +15 -1
  439. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +6 -10
  440. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +16 -0
  441. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +4 -0
  442. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +4 -0
  443. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  444. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  445. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  446. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +16 -0
  447. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +5 -0
  448. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +4 -3
  449. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -1
  450. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +9 -4
  451. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +20 -0
  452. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +1 -0
  453. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +16 -0
  454. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +6 -0
  455. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +2 -0
  456. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +5 -0
  457. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +3 -17
  458. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +31 -0
  459. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +26 -0
  460. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +172 -77
  461. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +1 -0
  462. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  463. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +5 -3
  464. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +1 -0
  465. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +0 -4
  466. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +3 -3
  467. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +13 -4
  468. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +146 -57
  469. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +14 -3
  470. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +28 -20
  471. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +12 -4
  472. data/third_party/boringssl-with-bazel/src/ssl/internal.h +64 -47
  473. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +10 -10
  474. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  475. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +21 -21
  476. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +29 -0
  477. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -0
  478. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +6 -1
  479. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +13 -2
  480. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +64 -5
  481. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +6 -0
  482. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +6 -2
  483. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +47 -53
  484. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +1 -1
  485. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -27
  486. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +23 -75
  487. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +50 -20
  488. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +63 -25
  489. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +245 -175
  490. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +135 -75
  491. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +1593 -1672
  492. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +512 -503
  493. metadata +111 -37
  494. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1754
  495. data/src/core/lib/gprpp/string_view.h +0 -60
  496. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3311
  497. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256.c +0 -1063
@@ -0,0 +1,569 @@
1
+ // Copyright 2017 The Abseil Authors.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // https://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include "absl/time/clock.h"
16
+
17
+ #include "absl/base/attributes.h"
18
+
19
+ #ifdef _WIN32
20
+ #include <windows.h>
21
+ #endif
22
+
23
+ #include <algorithm>
24
+ #include <atomic>
25
+ #include <cerrno>
26
+ #include <cstdint>
27
+ #include <ctime>
28
+ #include <limits>
29
+
30
+ #include "absl/base/internal/spinlock.h"
31
+ #include "absl/base/internal/unscaledcycleclock.h"
32
+ #include "absl/base/macros.h"
33
+ #include "absl/base/port.h"
34
+ #include "absl/base/thread_annotations.h"
35
+
36
+ namespace absl {
37
+ ABSL_NAMESPACE_BEGIN
38
+ Time Now() {
39
+ // TODO(bww): Get a timespec instead so we don't have to divide.
40
+ int64_t n = absl::GetCurrentTimeNanos();
41
+ if (n >= 0) {
42
+ return time_internal::FromUnixDuration(
43
+ time_internal::MakeDuration(n / 1000000000, n % 1000000000 * 4));
44
+ }
45
+ return time_internal::FromUnixDuration(absl::Nanoseconds(n));
46
+ }
47
+ ABSL_NAMESPACE_END
48
+ } // namespace absl
49
+
50
+ // Decide if we should use the fast GetCurrentTimeNanos() algorithm
51
+ // based on the cyclecounter, otherwise just get the time directly
52
+ // from the OS on every call. This can be chosen at compile-time via
53
+ // -DABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS=[0|1]
54
+ #ifndef ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS
55
+ #if ABSL_USE_UNSCALED_CYCLECLOCK
56
+ #define ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS 1
57
+ #else
58
+ #define ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS 0
59
+ #endif
60
+ #endif
61
+
62
+ #if defined(__APPLE__) || defined(_WIN32)
63
+ #include "absl/time/internal/get_current_time_chrono.inc"
64
+ #else
65
+ #include "absl/time/internal/get_current_time_posix.inc"
66
+ #endif
67
+
68
+ // Allows override by test.
69
+ #ifndef GET_CURRENT_TIME_NANOS_FROM_SYSTEM
70
+ #define GET_CURRENT_TIME_NANOS_FROM_SYSTEM() \
71
+ ::absl::time_internal::GetCurrentTimeNanosFromSystem()
72
+ #endif
73
+
74
+ #if !ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS
75
+ namespace absl {
76
+ ABSL_NAMESPACE_BEGIN
77
+ int64_t GetCurrentTimeNanos() {
78
+ return GET_CURRENT_TIME_NANOS_FROM_SYSTEM();
79
+ }
80
+ ABSL_NAMESPACE_END
81
+ } // namespace absl
82
+ #else // Use the cyclecounter-based implementation below.
83
+
84
+ // Allows override by test.
85
+ #ifndef GET_CURRENT_TIME_NANOS_CYCLECLOCK_NOW
86
+ #define GET_CURRENT_TIME_NANOS_CYCLECLOCK_NOW() \
87
+ ::absl::time_internal::UnscaledCycleClockWrapperForGetCurrentTime::Now()
88
+ #endif
89
+
90
+ // The following counters are used only by the test code.
91
+ static int64_t stats_initializations;
92
+ static int64_t stats_reinitializations;
93
+ static int64_t stats_calibrations;
94
+ static int64_t stats_slow_paths;
95
+ static int64_t stats_fast_slow_paths;
96
+
97
+ namespace absl {
98
+ ABSL_NAMESPACE_BEGIN
99
+ namespace time_internal {
100
+ // This is a friend wrapper around UnscaledCycleClock::Now()
101
+ // (needed to access UnscaledCycleClock).
102
+ class UnscaledCycleClockWrapperForGetCurrentTime {
103
+ public:
104
+ static int64_t Now() { return base_internal::UnscaledCycleClock::Now(); }
105
+ };
106
+ } // namespace time_internal
107
+
108
+ // uint64_t is used in this module to provide an extra bit in multiplications
109
+
110
+ // Return the time in ns as told by the kernel interface. Place in *cycleclock
111
+ // the value of the cycleclock at about the time of the syscall.
112
+ // This call represents the time base that this module synchronizes to.
113
+ // Ensures that *cycleclock does not step back by up to (1 << 16) from
114
+ // last_cycleclock, to discard small backward counter steps. (Larger steps are
115
+ // assumed to be complete resyncs, which shouldn't happen. If they do, a full
116
+ // reinitialization of the outer algorithm should occur.)
117
+ static int64_t GetCurrentTimeNanosFromKernel(uint64_t last_cycleclock,
118
+ uint64_t *cycleclock) {
119
+ // We try to read clock values at about the same time as the kernel clock.
120
+ // This value gets adjusted up or down as estimate of how long that should
121
+ // take, so we can reject attempts that take unusually long.
122
+ static std::atomic<uint64_t> approx_syscall_time_in_cycles{10 * 1000};
123
+
124
+ uint64_t local_approx_syscall_time_in_cycles = // local copy
125
+ approx_syscall_time_in_cycles.load(std::memory_order_relaxed);
126
+
127
+ int64_t current_time_nanos_from_system;
128
+ uint64_t before_cycles;
129
+ uint64_t after_cycles;
130
+ uint64_t elapsed_cycles;
131
+ int loops = 0;
132
+ do {
133
+ before_cycles = GET_CURRENT_TIME_NANOS_CYCLECLOCK_NOW();
134
+ current_time_nanos_from_system = GET_CURRENT_TIME_NANOS_FROM_SYSTEM();
135
+ after_cycles = GET_CURRENT_TIME_NANOS_CYCLECLOCK_NOW();
136
+ // elapsed_cycles is unsigned, so is large on overflow
137
+ elapsed_cycles = after_cycles - before_cycles;
138
+ if (elapsed_cycles >= local_approx_syscall_time_in_cycles &&
139
+ ++loops == 20) { // clock changed frequencies? Back off.
140
+ loops = 0;
141
+ if (local_approx_syscall_time_in_cycles < 1000 * 1000) {
142
+ local_approx_syscall_time_in_cycles =
143
+ (local_approx_syscall_time_in_cycles + 1) << 1;
144
+ }
145
+ approx_syscall_time_in_cycles.store(
146
+ local_approx_syscall_time_in_cycles,
147
+ std::memory_order_relaxed);
148
+ }
149
+ } while (elapsed_cycles >= local_approx_syscall_time_in_cycles ||
150
+ last_cycleclock - after_cycles < (static_cast<uint64_t>(1) << 16));
151
+
152
+ // Number of times in a row we've seen a kernel time call take substantially
153
+ // less than approx_syscall_time_in_cycles.
154
+ static std::atomic<uint32_t> seen_smaller{ 0 };
155
+
156
+ // Adjust approx_syscall_time_in_cycles to be within a factor of 2
157
+ // of the typical time to execute one iteration of the loop above.
158
+ if ((local_approx_syscall_time_in_cycles >> 1) < elapsed_cycles) {
159
+ // measured time is no smaller than half current approximation
160
+ seen_smaller.store(0, std::memory_order_relaxed);
161
+ } else if (seen_smaller.fetch_add(1, std::memory_order_relaxed) >= 3) {
162
+ // smaller delays several times in a row; reduce approximation by 12.5%
163
+ const uint64_t new_approximation =
164
+ local_approx_syscall_time_in_cycles -
165
+ (local_approx_syscall_time_in_cycles >> 3);
166
+ approx_syscall_time_in_cycles.store(new_approximation,
167
+ std::memory_order_relaxed);
168
+ seen_smaller.store(0, std::memory_order_relaxed);
169
+ }
170
+
171
+ *cycleclock = after_cycles;
172
+ return current_time_nanos_from_system;
173
+ }
174
+
175
+
176
+ // ---------------------------------------------------------------------
177
+ // An implementation of reader-write locks that use no atomic ops in the read
178
+ // case. This is a generalization of Lamport's method for reading a multiword
179
+ // clock. Increment a word on each write acquisition, using the low-order bit
180
+ // as a spinlock; the word is the high word of the "clock". Readers read the
181
+ // high word, then all other data, then the high word again, and repeat the
182
+ // read if the reads of the high words yields different answers, or an odd
183
+ // value (either case suggests possible interference from a writer).
184
+ // Here we use a spinlock to ensure only one writer at a time, rather than
185
+ // spinning on the bottom bit of the word to benefit from SpinLock
186
+ // spin-delay tuning.
187
+
188
+ // Acquire seqlock (*seq) and return the value to be written to unlock.
189
+ static inline uint64_t SeqAcquire(std::atomic<uint64_t> *seq) {
190
+ uint64_t x = seq->fetch_add(1, std::memory_order_relaxed);
191
+
192
+ // We put a release fence between update to *seq and writes to shared data.
193
+ // Thus all stores to shared data are effectively release operations and
194
+ // update to *seq above cannot be re-ordered past any of them. Note that
195
+ // this barrier is not for the fetch_add above. A release barrier for the
196
+ // fetch_add would be before it, not after.
197
+ std::atomic_thread_fence(std::memory_order_release);
198
+
199
+ return x + 2; // original word plus 2
200
+ }
201
+
202
+ // Release seqlock (*seq) by writing x to it---a value previously returned by
203
+ // SeqAcquire.
204
+ static inline void SeqRelease(std::atomic<uint64_t> *seq, uint64_t x) {
205
+ // The unlock store to *seq must have release ordering so that all
206
+ // updates to shared data must finish before this store.
207
+ seq->store(x, std::memory_order_release); // release lock for readers
208
+ }
209
+
210
+ // ---------------------------------------------------------------------
211
+
212
+ // "nsscaled" is unit of time equal to a (2**kScale)th of a nanosecond.
213
+ enum { kScale = 30 };
214
+
215
+ // The minimum interval between samples of the time base.
216
+ // We pick enough time to amortize the cost of the sample,
217
+ // to get a reasonably accurate cycle counter rate reading,
218
+ // and not so much that calculations will overflow 64-bits.
219
+ static const uint64_t kMinNSBetweenSamples = 2000 << 20;
220
+
221
+ // We require that kMinNSBetweenSamples shifted by kScale
222
+ // have at least a bit left over for 64-bit calculations.
223
+ static_assert(((kMinNSBetweenSamples << (kScale + 1)) >> (kScale + 1)) ==
224
+ kMinNSBetweenSamples,
225
+ "cannot represent kMaxBetweenSamplesNSScaled");
226
+
227
+ // A reader-writer lock protecting the static locations below.
228
+ // See SeqAcquire() and SeqRelease() above.
229
+ static absl::base_internal::SpinLock lock(
230
+ absl::base_internal::kLinkerInitialized);
231
+ static std::atomic<uint64_t> seq(0);
232
+
233
+ // data from a sample of the kernel's time value
234
+ struct TimeSampleAtomic {
235
+ std::atomic<uint64_t> raw_ns; // raw kernel time
236
+ std::atomic<uint64_t> base_ns; // our estimate of time
237
+ std::atomic<uint64_t> base_cycles; // cycle counter reading
238
+ std::atomic<uint64_t> nsscaled_per_cycle; // cycle period
239
+ // cycles before we'll sample again (a scaled reciprocal of the period,
240
+ // to avoid a division on the fast path).
241
+ std::atomic<uint64_t> min_cycles_per_sample;
242
+ };
243
+ // Same again, but with non-atomic types
244
+ struct TimeSample {
245
+ uint64_t raw_ns; // raw kernel time
246
+ uint64_t base_ns; // our estimate of time
247
+ uint64_t base_cycles; // cycle counter reading
248
+ uint64_t nsscaled_per_cycle; // cycle period
249
+ uint64_t min_cycles_per_sample; // approx cycles before next sample
250
+ };
251
+
252
+ static struct TimeSampleAtomic last_sample; // the last sample; under seq
253
+
254
+ static int64_t GetCurrentTimeNanosSlowPath() ABSL_ATTRIBUTE_COLD;
255
+
256
+ // Read the contents of *atomic into *sample.
257
+ // Each field is read atomically, but to maintain atomicity between fields,
258
+ // the access must be done under a lock.
259
+ static void ReadTimeSampleAtomic(const struct TimeSampleAtomic *atomic,
260
+ struct TimeSample *sample) {
261
+ sample->base_ns = atomic->base_ns.load(std::memory_order_relaxed);
262
+ sample->base_cycles = atomic->base_cycles.load(std::memory_order_relaxed);
263
+ sample->nsscaled_per_cycle =
264
+ atomic->nsscaled_per_cycle.load(std::memory_order_relaxed);
265
+ sample->min_cycles_per_sample =
266
+ atomic->min_cycles_per_sample.load(std::memory_order_relaxed);
267
+ sample->raw_ns = atomic->raw_ns.load(std::memory_order_relaxed);
268
+ }
269
+
270
+ // Public routine.
271
+ // Algorithm: We wish to compute real time from a cycle counter. In normal
272
+ // operation, we construct a piecewise linear approximation to the kernel time
273
+ // source, using the cycle counter value. The start of each line segment is at
274
+ // the same point as the end of the last, but may have a different slope (that
275
+ // is, a different idea of the cycle counter frequency). Every couple of
276
+ // seconds, the kernel time source is sampled and compared with the current
277
+ // approximation. A new slope is chosen that, if followed for another couple
278
+ // of seconds, will correct the error at the current position. The information
279
+ // for a sample is in the "last_sample" struct. The linear approximation is
280
+ // estimated_time = last_sample.base_ns +
281
+ // last_sample.ns_per_cycle * (counter_reading - last_sample.base_cycles)
282
+ // (ns_per_cycle is actually stored in different units and scaled, to avoid
283
+ // overflow). The base_ns of the next linear approximation is the
284
+ // estimated_time using the last approximation; the base_cycles is the cycle
285
+ // counter value at that time; the ns_per_cycle is the number of ns per cycle
286
+ // measured since the last sample, but adjusted so that most of the difference
287
+ // between the estimated_time and the kernel time will be corrected by the
288
+ // estimated time to the next sample. In normal operation, this algorithm
289
+ // relies on:
290
+ // - the cycle counter and kernel time rates not changing a lot in a few
291
+ // seconds.
292
+ // - the client calling into the code often compared to a couple of seconds, so
293
+ // the time to the next correction can be estimated.
294
+ // Any time ns_per_cycle is not known, a major error is detected, or the
295
+ // assumption about frequent calls is violated, the implementation returns the
296
+ // kernel time. It records sufficient data that a linear approximation can
297
+ // resume a little later.
298
+
299
+ int64_t GetCurrentTimeNanos() {
300
+ // read the data from the "last_sample" struct (but don't need raw_ns yet)
301
+ // The reads of "seq" and test of the values emulate a reader lock.
302
+ uint64_t base_ns;
303
+ uint64_t base_cycles;
304
+ uint64_t nsscaled_per_cycle;
305
+ uint64_t min_cycles_per_sample;
306
+ uint64_t seq_read0;
307
+ uint64_t seq_read1;
308
+
309
+ // If we have enough information to interpolate, the value returned will be
310
+ // derived from this cycleclock-derived time estimate. On some platforms
311
+ // (POWER) the function to retrieve this value has enough complexity to
312
+ // contribute to register pressure - reading it early before initializing
313
+ // the other pieces of the calculation minimizes spill/restore instructions,
314
+ // minimizing icache cost.
315
+ uint64_t now_cycles = GET_CURRENT_TIME_NANOS_CYCLECLOCK_NOW();
316
+
317
+ // Acquire pairs with the barrier in SeqRelease - if this load sees that
318
+ // store, the shared-data reads necessarily see that SeqRelease's updates
319
+ // to the same shared data.
320
+ seq_read0 = seq.load(std::memory_order_acquire);
321
+
322
+ base_ns = last_sample.base_ns.load(std::memory_order_relaxed);
323
+ base_cycles = last_sample.base_cycles.load(std::memory_order_relaxed);
324
+ nsscaled_per_cycle =
325
+ last_sample.nsscaled_per_cycle.load(std::memory_order_relaxed);
326
+ min_cycles_per_sample =
327
+ last_sample.min_cycles_per_sample.load(std::memory_order_relaxed);
328
+
329
+ // This acquire fence pairs with the release fence in SeqAcquire. Since it
330
+ // is sequenced between reads of shared data and seq_read1, the reads of
331
+ // shared data are effectively acquiring.
332
+ std::atomic_thread_fence(std::memory_order_acquire);
333
+
334
+ // The shared-data reads are effectively acquire ordered, and the
335
+ // shared-data writes are effectively release ordered. Therefore if our
336
+ // shared-data reads see any of a particular update's shared-data writes,
337
+ // seq_read1 is guaranteed to see that update's SeqAcquire.
338
+ seq_read1 = seq.load(std::memory_order_relaxed);
339
+
340
+ // Fast path. Return if min_cycles_per_sample has not yet elapsed since the
341
+ // last sample, and we read a consistent sample. The fast path activates
342
+ // only when min_cycles_per_sample is non-zero, which happens when we get an
343
+ // estimate for the cycle time. The predicate will fail if now_cycles <
344
+ // base_cycles, or if some other thread is in the slow path.
345
+ //
346
+ // Since we now read now_cycles before base_ns, it is possible for now_cycles
347
+ // to be less than base_cycles (if we were interrupted between those loads and
348
+ // last_sample was updated). This is harmless, because delta_cycles will wrap
349
+ // and report a time much much bigger than min_cycles_per_sample. In that case
350
+ // we will take the slow path.
351
+ uint64_t delta_cycles = now_cycles - base_cycles;
352
+ if (seq_read0 == seq_read1 && (seq_read0 & 1) == 0 &&
353
+ delta_cycles < min_cycles_per_sample) {
354
+ return base_ns + ((delta_cycles * nsscaled_per_cycle) >> kScale);
355
+ }
356
+ return GetCurrentTimeNanosSlowPath();
357
+ }
358
+
359
+ // Return (a << kScale)/b.
360
+ // Zero is returned if b==0. Scaling is performed internally to
361
+ // preserve precision without overflow.
362
+ static uint64_t SafeDivideAndScale(uint64_t a, uint64_t b) {
363
+ // Find maximum safe_shift so that
364
+ // 0 <= safe_shift <= kScale and (a << safe_shift) does not overflow.
365
+ int safe_shift = kScale;
366
+ while (((a << safe_shift) >> safe_shift) != a) {
367
+ safe_shift--;
368
+ }
369
+ uint64_t scaled_b = b >> (kScale - safe_shift);
370
+ uint64_t quotient = 0;
371
+ if (scaled_b != 0) {
372
+ quotient = (a << safe_shift) / scaled_b;
373
+ }
374
+ return quotient;
375
+ }
376
+
377
+ static uint64_t UpdateLastSample(
378
+ uint64_t now_cycles, uint64_t now_ns, uint64_t delta_cycles,
379
+ const struct TimeSample *sample) ABSL_ATTRIBUTE_COLD;
380
+
381
+ // The slow path of GetCurrentTimeNanos(). This is taken while gathering
382
+ // initial samples, when enough time has elapsed since the last sample, and if
383
+ // any other thread is writing to last_sample.
384
+ //
385
+ // Manually mark this 'noinline' to minimize stack frame size of the fast
386
+ // path. Without this, sometimes a compiler may inline this big block of code
387
+ // into the fast path. That causes lots of register spills and reloads that
388
+ // are unnecessary unless the slow path is taken.
389
+ //
390
+ // TODO(absl-team): Remove this attribute when our compiler is smart enough
391
+ // to do the right thing.
392
+ ABSL_ATTRIBUTE_NOINLINE
393
+ static int64_t GetCurrentTimeNanosSlowPath() ABSL_LOCKS_EXCLUDED(lock) {
394
+ // Serialize access to slow-path. Fast-path readers are not blocked yet, and
395
+ // code below must not modify last_sample until the seqlock is acquired.
396
+ lock.Lock();
397
+
398
+ // Sample the kernel time base. This is the definition of
399
+ // "now" if we take the slow path.
400
+ static uint64_t last_now_cycles; // protected by lock
401
+ uint64_t now_cycles;
402
+ uint64_t now_ns = GetCurrentTimeNanosFromKernel(last_now_cycles, &now_cycles);
403
+ last_now_cycles = now_cycles;
404
+
405
+ uint64_t estimated_base_ns;
406
+
407
+ // ----------
408
+ // Read the "last_sample" values again; this time holding the write lock.
409
+ struct TimeSample sample;
410
+ ReadTimeSampleAtomic(&last_sample, &sample);
411
+
412
+ // ----------
413
+ // Try running the fast path again; another thread may have updated the
414
+ // sample between our run of the fast path and the sample we just read.
415
+ uint64_t delta_cycles = now_cycles - sample.base_cycles;
416
+ if (delta_cycles < sample.min_cycles_per_sample) {
417
+ // Another thread updated the sample. This path does not take the seqlock
418
+ // so that blocked readers can make progress without blocking new readers.
419
+ estimated_base_ns = sample.base_ns +
420
+ ((delta_cycles * sample.nsscaled_per_cycle) >> kScale);
421
+ stats_fast_slow_paths++;
422
+ } else {
423
+ estimated_base_ns =
424
+ UpdateLastSample(now_cycles, now_ns, delta_cycles, &sample);
425
+ }
426
+
427
+ lock.Unlock();
428
+
429
+ return estimated_base_ns;
430
+ }
431
+
432
+ // Main part of the algorithm. Locks out readers, updates the approximation
433
+ // using the new sample from the kernel, and stores the result in last_sample
434
+ // for readers. Returns the new estimated time.
435
+ static uint64_t UpdateLastSample(uint64_t now_cycles, uint64_t now_ns,
436
+ uint64_t delta_cycles,
437
+ const struct TimeSample *sample)
438
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(lock) {
439
+ uint64_t estimated_base_ns = now_ns;
440
+ uint64_t lock_value = SeqAcquire(&seq); // acquire seqlock to block readers
441
+
442
+ // The 5s in the next if-statement limits the time for which we will trust
443
+ // the cycle counter and our last sample to give a reasonable result.
444
+ // Errors in the rate of the source clock can be multiplied by the ratio
445
+ // between this limit and kMinNSBetweenSamples.
446
+ if (sample->raw_ns == 0 || // no recent sample, or clock went backwards
447
+ sample->raw_ns + static_cast<uint64_t>(5) * 1000 * 1000 * 1000 < now_ns ||
448
+ now_ns < sample->raw_ns || now_cycles < sample->base_cycles) {
449
+ // record this sample, and forget any previously known slope.
450
+ last_sample.raw_ns.store(now_ns, std::memory_order_relaxed);
451
+ last_sample.base_ns.store(estimated_base_ns, std::memory_order_relaxed);
452
+ last_sample.base_cycles.store(now_cycles, std::memory_order_relaxed);
453
+ last_sample.nsscaled_per_cycle.store(0, std::memory_order_relaxed);
454
+ last_sample.min_cycles_per_sample.store(0, std::memory_order_relaxed);
455
+ stats_initializations++;
456
+ } else if (sample->raw_ns + 500 * 1000 * 1000 < now_ns &&
457
+ sample->base_cycles + 50 < now_cycles) {
458
+ // Enough time has passed to compute the cycle time.
459
+ if (sample->nsscaled_per_cycle != 0) { // Have a cycle time estimate.
460
+ // Compute time from counter reading, but avoiding overflow
461
+ // delta_cycles may be larger than on the fast path.
462
+ uint64_t estimated_scaled_ns;
463
+ int s = -1;
464
+ do {
465
+ s++;
466
+ estimated_scaled_ns = (delta_cycles >> s) * sample->nsscaled_per_cycle;
467
+ } while (estimated_scaled_ns / sample->nsscaled_per_cycle !=
468
+ (delta_cycles >> s));
469
+ estimated_base_ns = sample->base_ns +
470
+ (estimated_scaled_ns >> (kScale - s));
471
+ }
472
+
473
+ // Compute the assumed cycle time kMinNSBetweenSamples ns into the future
474
+ // assuming the cycle counter rate stays the same as the last interval.
475
+ uint64_t ns = now_ns - sample->raw_ns;
476
+ uint64_t measured_nsscaled_per_cycle = SafeDivideAndScale(ns, delta_cycles);
477
+
478
+ uint64_t assumed_next_sample_delta_cycles =
479
+ SafeDivideAndScale(kMinNSBetweenSamples, measured_nsscaled_per_cycle);
480
+
481
+ int64_t diff_ns = now_ns - estimated_base_ns; // estimate low by this much
482
+
483
+ // We want to set nsscaled_per_cycle so that our estimate of the ns time
484
+ // at the assumed cycle time is the assumed ns time.
485
+ // That is, we want to set nsscaled_per_cycle so:
486
+ // kMinNSBetweenSamples + diff_ns ==
487
+ // (assumed_next_sample_delta_cycles * nsscaled_per_cycle) >> kScale
488
+ // But we wish to damp oscillations, so instead correct only most
489
+ // of our current error, by solving:
490
+ // kMinNSBetweenSamples + diff_ns - (diff_ns / 16) ==
491
+ // (assumed_next_sample_delta_cycles * nsscaled_per_cycle) >> kScale
492
+ ns = kMinNSBetweenSamples + diff_ns - (diff_ns / 16);
493
+ uint64_t new_nsscaled_per_cycle =
494
+ SafeDivideAndScale(ns, assumed_next_sample_delta_cycles);
495
+ if (new_nsscaled_per_cycle != 0 &&
496
+ diff_ns < 100 * 1000 * 1000 && -diff_ns < 100 * 1000 * 1000) {
497
+ // record the cycle time measurement
498
+ last_sample.nsscaled_per_cycle.store(
499
+ new_nsscaled_per_cycle, std::memory_order_relaxed);
500
+ uint64_t new_min_cycles_per_sample =
501
+ SafeDivideAndScale(kMinNSBetweenSamples, new_nsscaled_per_cycle);
502
+ last_sample.min_cycles_per_sample.store(
503
+ new_min_cycles_per_sample, std::memory_order_relaxed);
504
+ stats_calibrations++;
505
+ } else { // something went wrong; forget the slope
506
+ last_sample.nsscaled_per_cycle.store(0, std::memory_order_relaxed);
507
+ last_sample.min_cycles_per_sample.store(0, std::memory_order_relaxed);
508
+ estimated_base_ns = now_ns;
509
+ stats_reinitializations++;
510
+ }
511
+ last_sample.raw_ns.store(now_ns, std::memory_order_relaxed);
512
+ last_sample.base_ns.store(estimated_base_ns, std::memory_order_relaxed);
513
+ last_sample.base_cycles.store(now_cycles, std::memory_order_relaxed);
514
+ } else {
515
+ // have a sample, but no slope; waiting for enough time for a calibration
516
+ stats_slow_paths++;
517
+ }
518
+
519
+ SeqRelease(&seq, lock_value); // release the readers
520
+
521
+ return estimated_base_ns;
522
+ }
523
+ ABSL_NAMESPACE_END
524
+ } // namespace absl
525
+ #endif // ABSL_USE_CYCLECLOCK_FOR_GET_CURRENT_TIME_NANOS
526
+
527
+ namespace absl {
528
+ ABSL_NAMESPACE_BEGIN
529
+ namespace {
530
+
531
+ // Returns the maximum duration that SleepOnce() can sleep for.
532
+ constexpr absl::Duration MaxSleep() {
533
+ #ifdef _WIN32
534
+ // Windows Sleep() takes unsigned long argument in milliseconds.
535
+ return absl::Milliseconds(
536
+ std::numeric_limits<unsigned long>::max()); // NOLINT(runtime/int)
537
+ #else
538
+ return absl::Seconds(std::numeric_limits<time_t>::max());
539
+ #endif
540
+ }
541
+
542
+ // Sleeps for the given duration.
543
+ // REQUIRES: to_sleep <= MaxSleep().
544
+ void SleepOnce(absl::Duration to_sleep) {
545
+ #ifdef _WIN32
546
+ Sleep(to_sleep / absl::Milliseconds(1));
547
+ #else
548
+ struct timespec sleep_time = absl::ToTimespec(to_sleep);
549
+ while (nanosleep(&sleep_time, &sleep_time) != 0 && errno == EINTR) {
550
+ // Ignore signals and wait for the full interval to elapse.
551
+ }
552
+ #endif
553
+ }
554
+
555
+ } // namespace
556
+ ABSL_NAMESPACE_END
557
+ } // namespace absl
558
+
559
+ extern "C" {
560
+
561
+ ABSL_ATTRIBUTE_WEAK void AbslInternalSleepFor(absl::Duration duration) {
562
+ while (duration > absl::ZeroDuration()) {
563
+ absl::Duration to_sleep = std::min(duration, absl::MaxSleep());
564
+ absl::SleepOnce(to_sleep);
565
+ duration -= to_sleep;
566
+ }
567
+ }
568
+
569
+ } // extern "C"