grpc-flamingo 1.11.0 → 1.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (452) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1150 -176
  3. data/etc/roots.pem +40 -196
  4. data/include/grpc/grpc.h +49 -8
  5. data/include/grpc/grpc_security.h +123 -2
  6. data/include/grpc/grpc_security_constants.h +6 -0
  7. data/include/grpc/impl/codegen/fork.h +4 -4
  8. data/include/grpc/impl/codegen/grpc_types.h +26 -5
  9. data/include/grpc/impl/codegen/log.h +112 -0
  10. data/include/grpc/impl/codegen/port_platform.h +55 -4
  11. data/include/grpc/module.modulemap +2 -0
  12. data/include/grpc/support/log.h +2 -80
  13. data/include/grpc/support/string_util.h +2 -0
  14. data/include/grpc/support/sync.h +0 -16
  15. data/src/boringssl/err_data.c +602 -588
  16. data/src/core/ext/{census → filters/census}/grpc_context.cc +0 -0
  17. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  18. data/src/core/ext/filters/client_channel/client_channel.cc +1234 -1070
  19. data/src/core/ext/filters/client_channel/client_channel.h +5 -0
  20. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +113 -0
  21. data/src/core/ext/filters/client_channel/client_channel_channelz.h +71 -0
  22. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +9 -0
  23. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  24. data/src/core/ext/filters/client_channel/http_proxy.cc +22 -5
  25. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy.h +30 -10
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +120 -127
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +25 -22
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +4 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.c +19 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/duration.pb.h +54 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.c +19 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/google/protobuf/timestamp.pb.h +54 -0
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +4 -17
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +37 -63
  40. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +306 -239
  41. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +444 -392
  42. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +538 -98
  43. data/src/core/ext/filters/client_channel/lb_policy_factory.cc +8 -0
  44. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -0
  45. data/src/core/ext/filters/client_channel/method_params.h +4 -0
  46. data/src/core/ext/filters/client_channel/resolver.h +10 -0
  47. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +36 -19
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +320 -0
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +62 -9
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +49 -294
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +537 -0
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +112 -87
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +17 -2
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +6 -5
  55. data/src/core/ext/filters/{load_reporting/server_load_reporting_filter.h → client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc} +7 -8
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +29 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +32 -15
  58. data/src/core/ext/filters/client_channel/retry_throttle.h +4 -0
  59. data/src/core/ext/filters/client_channel/subchannel.cc +58 -15
  60. data/src/core/ext/filters/client_channel/subchannel.h +11 -0
  61. data/src/core/ext/filters/deadline/deadline_filter.cc +18 -15
  62. data/src/core/ext/filters/deadline/deadline_filter.h +5 -5
  63. data/src/core/ext/filters/http/client/http_client_filter.cc +10 -9
  64. data/src/core/ext/filters/http/client_authority_filter.cc +6 -5
  65. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +6 -6
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  67. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  68. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +1 -1
  69. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  70. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +3 -2
  71. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +97 -48
  73. data/src/core/ext/transport/chttp2/transport/flow_control.cc +10 -7
  74. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +3 -3
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +12 -8
  76. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  77. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -2
  78. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
  79. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  80. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  81. data/src/core/ext/transport/chttp2/transport/writing.cc +32 -27
  82. data/src/core/ext/transport/inproc/inproc_transport.cc +87 -49
  83. data/src/core/lib/channel/channel_args.cc +28 -0
  84. data/src/core/lib/channel/channel_args.h +4 -0
  85. data/src/core/lib/channel/channel_stack.cc +22 -29
  86. data/src/core/lib/channel/channel_stack.h +2 -2
  87. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  88. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  89. data/src/core/lib/channel/channel_trace.cc +28 -63
  90. data/src/core/lib/channel/channel_trace.h +13 -17
  91. data/src/core/lib/channel/channelz.cc +153 -0
  92. data/src/core/lib/channel/channelz.h +133 -0
  93. data/src/core/lib/channel/channelz_registry.cc +145 -0
  94. data/src/core/lib/channel/channelz_registry.h +120 -0
  95. data/src/core/lib/channel/connected_channel.cc +8 -1
  96. data/src/core/lib/channel/handshaker.cc +71 -0
  97. data/src/core/lib/channel/handshaker.h +4 -0
  98. data/src/core/lib/debug/stats.h +7 -0
  99. data/src/core/lib/debug/stats_data.cc +5 -0
  100. data/src/core/lib/debug/stats_data.h +120 -0
  101. data/src/core/lib/debug/trace.cc +2 -1
  102. data/src/core/lib/debug/trace.h +12 -1
  103. data/src/core/lib/gpr/alloc.h +28 -0
  104. data/src/core/lib/gpr/arena.cc +38 -45
  105. data/src/core/lib/gpr/log.cc +8 -2
  106. data/src/core/lib/gpr/log_android.cc +4 -0
  107. data/src/core/lib/gpr/log_linux.cc +4 -0
  108. data/src/core/lib/gpr/log_posix.cc +4 -0
  109. data/src/core/lib/gpr/log_windows.cc +5 -0
  110. data/src/core/lib/gpr/string.cc +28 -0
  111. data/src/core/lib/gpr/string.h +10 -0
  112. data/src/core/lib/gprpp/abstract.h +5 -2
  113. data/src/core/lib/gprpp/fork.cc +268 -0
  114. data/src/core/lib/gprpp/fork.h +88 -0
  115. data/src/core/lib/gprpp/inlined_vector.h +87 -37
  116. data/src/core/lib/gprpp/memory.h +12 -0
  117. data/src/core/lib/gprpp/mutex_lock.h +42 -0
  118. data/src/core/lib/gprpp/orphanable.h +10 -12
  119. data/src/core/lib/gprpp/ref_counted.h +10 -12
  120. data/src/core/lib/gprpp/ref_counted_ptr.h +65 -8
  121. data/src/core/lib/gprpp/thd.h +0 -3
  122. data/src/core/lib/gprpp/thd_posix.cc +5 -54
  123. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  124. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  125. data/src/core/lib/iomgr/call_combiner.cc +13 -13
  126. data/src/core/lib/iomgr/call_combiner.h +84 -1
  127. data/src/core/lib/iomgr/closure.h +6 -5
  128. data/src/core/lib/iomgr/combiner.cc +30 -13
  129. data/src/core/lib/iomgr/combiner.h +1 -1
  130. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
  131. data/src/core/lib/iomgr/error.cc +12 -0
  132. data/src/core/lib/iomgr/error.h +5 -0
  133. data/src/core/lib/iomgr/ev_epoll1_linux.cc +138 -51
  134. data/src/core/lib/iomgr/ev_epollex_linux.cc +276 -93
  135. data/src/core/lib/iomgr/ev_epollsig_linux.cc +58 -50
  136. data/src/core/lib/iomgr/ev_poll_posix.cc +163 -42
  137. data/src/core/lib/iomgr/ev_posix.cc +88 -24
  138. data/src/core/lib/iomgr/ev_posix.h +48 -12
  139. data/src/core/lib/iomgr/exec_ctx.cc +15 -9
  140. data/src/core/lib/iomgr/exec_ctx.h +48 -20
  141. data/src/core/lib/iomgr/executor.cc +274 -142
  142. data/src/core/lib/iomgr/executor.h +82 -16
  143. data/src/core/lib/iomgr/fork_posix.cc +42 -19
  144. data/src/core/lib/iomgr/iocp_windows.cc +9 -4
  145. data/src/core/lib/iomgr/iomgr.cc +2 -0
  146. data/src/core/lib/iomgr/iomgr.h +5 -0
  147. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  148. data/src/core/lib/iomgr/is_epollexclusive_available.cc +1 -0
  149. data/src/core/lib/iomgr/lockfree_event.cc +5 -1
  150. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  151. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  152. data/src/core/lib/iomgr/port.h +51 -1
  153. data/src/core/lib/iomgr/resolve_address.h +1 -1
  154. data/src/core/lib/iomgr/resolve_address_posix.cc +4 -3
  155. data/src/core/lib/iomgr/resolve_address_windows.cc +3 -2
  156. data/src/core/lib/iomgr/resource_quota.cc +89 -12
  157. data/src/core/lib/iomgr/resource_quota.h +16 -0
  158. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  159. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  160. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  161. data/src/core/lib/iomgr/socket_mutator.h +1 -1
  162. data/src/core/lib/iomgr/socket_utils.h +9 -0
  163. data/src/core/lib/iomgr/socket_utils_common_posix.cc +29 -1
  164. data/src/core/lib/iomgr/socket_utils_linux.cc +0 -1
  165. data/src/core/lib/iomgr/socket_utils_posix.cc +2 -3
  166. data/src/core/lib/iomgr/socket_utils_posix.h +3 -0
  167. data/src/core/lib/iomgr/socket_utils_uv.cc +4 -0
  168. data/src/core/lib/iomgr/socket_utils_windows.cc +4 -0
  169. data/src/core/lib/iomgr/socket_windows.cc +33 -0
  170. data/src/core/lib/iomgr/socket_windows.h +6 -0
  171. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -5
  172. data/src/core/lib/iomgr/tcp_client_posix.cc +10 -11
  173. data/src/core/lib/iomgr/tcp_custom.cc +11 -11
  174. data/src/core/lib/iomgr/tcp_posix.cc +49 -36
  175. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  176. data/src/core/lib/iomgr/tcp_server_posix.cc +16 -36
  177. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  178. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +17 -5
  179. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -0
  180. data/src/core/lib/iomgr/tcp_uv.cc +3 -0
  181. data/src/core/lib/iomgr/tcp_windows.cc +18 -2
  182. data/src/core/lib/iomgr/tcp_windows.h +2 -0
  183. data/src/core/lib/iomgr/timer.h +4 -3
  184. data/src/core/lib/iomgr/timer_generic.cc +133 -51
  185. data/src/core/lib/iomgr/timer_manager.cc +12 -14
  186. data/src/core/lib/iomgr/timer_uv.cc +3 -0
  187. data/src/core/lib/iomgr/udp_server.cc +106 -52
  188. data/src/core/lib/iomgr/udp_server.h +8 -4
  189. data/src/core/lib/json/json.cc +12 -1
  190. data/src/core/lib/json/json.h +5 -0
  191. data/src/core/lib/profiling/basic_timers.cc +1 -0
  192. data/src/core/lib/security/context/security_context.cc +8 -8
  193. data/src/core/lib/security/context/security_context.h +6 -2
  194. data/src/core/lib/security/credentials/alts/alts_credentials.h +0 -20
  195. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +3 -2
  196. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +7 -7
  197. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +1 -38
  198. data/src/core/lib/security/credentials/credentials.h +1 -0
  199. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +89 -115
  200. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  201. data/src/core/lib/security/credentials/jwt/json_token.h +2 -0
  202. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -0
  203. data/src/core/lib/security/credentials/local/local_credentials.cc +77 -0
  204. data/src/core/lib/security/credentials/local/local_credentials.h +40 -0
  205. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +11 -7
  206. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  207. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +17 -3
  208. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  209. data/src/core/lib/security/security_connector/load_system_roots.h +29 -0
  210. data/src/core/lib/{gpr/fork.h → security/security_connector/load_system_roots_fallback.cc} +10 -13
  211. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +165 -0
  212. data/src/core/lib/security/security_connector/load_system_roots_linux.h +44 -0
  213. data/src/core/lib/security/security_connector/local_security_connector.cc +245 -0
  214. data/src/core/lib/security/security_connector/local_security_connector.h +58 -0
  215. data/src/core/lib/security/security_connector/security_connector.cc +79 -32
  216. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  217. data/src/core/lib/security/transport/client_auth_filter.cc +5 -5
  218. data/src/core/lib/security/transport/secure_endpoint.cc +2 -2
  219. data/src/core/lib/security/transport/security_handshaker.cc +7 -2
  220. data/src/core/lib/security/transport/server_auth_filter.cc +4 -7
  221. data/src/core/lib/security/util/json_util.cc +4 -0
  222. data/src/core/lib/slice/slice.cc +6 -2
  223. data/src/core/lib/slice/slice_buffer.cc +27 -7
  224. data/src/core/lib/slice/slice_hash_table.h +4 -0
  225. data/src/core/lib/slice/slice_weak_hash_table.h +4 -0
  226. data/src/core/lib/surface/call.cc +119 -58
  227. data/src/core/lib/surface/call.h +7 -0
  228. data/src/core/lib/surface/channel.cc +50 -18
  229. data/src/core/lib/surface/channel.h +4 -0
  230. data/src/core/lib/surface/completion_queue.cc +153 -18
  231. data/src/core/lib/surface/completion_queue.h +20 -2
  232. data/src/core/lib/surface/completion_queue_factory.cc +13 -4
  233. data/src/core/lib/surface/init.cc +7 -8
  234. data/src/core/lib/surface/init.h +0 -1
  235. data/src/core/lib/surface/server.cc +16 -0
  236. data/src/core/lib/surface/version.cc +1 -1
  237. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  238. data/src/core/lib/transport/bdp_estimator.h +2 -2
  239. data/src/core/lib/transport/byte_stream.cc +1 -1
  240. data/src/core/lib/transport/connectivity_state.cc +6 -7
  241. data/src/core/lib/transport/service_config.cc +2 -2
  242. data/src/core/lib/transport/service_config.h +3 -3
  243. data/src/core/lib/transport/transport.cc +22 -10
  244. data/src/core/lib/transport/transport.h +18 -18
  245. data/src/core/lib/transport/transport_op_string.cc +1 -8
  246. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -4
  247. data/src/core/tsi/alts/crypt/aes_gcm.cc +2 -0
  248. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  249. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  250. data/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h +2 -2
  251. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +38 -3
  252. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  253. data/src/core/tsi/alts/handshaker/altscontext.pb.c +0 -1
  254. data/src/core/tsi/alts/handshaker/altscontext.pb.h +1 -2
  255. data/src/core/tsi/alts/handshaker/handshaker.pb.c +0 -1
  256. data/src/core/tsi/alts/handshaker/handshaker.pb.h +1 -2
  257. data/src/core/tsi/alts/handshaker/transport_security_common.pb.c +0 -1
  258. data/src/core/tsi/alts/handshaker/transport_security_common.pb.h +1 -1
  259. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +2 -2
  260. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +47 -1
  261. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +3 -1
  262. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -11
  263. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +7 -2
  264. data/src/core/tsi/fake_transport_security.cc +1 -0
  265. data/src/core/tsi/grpc_shadow_boringssl.h +3006 -0
  266. data/src/core/tsi/local_transport_security.cc +209 -0
  267. data/src/core/tsi/local_transport_security.h +51 -0
  268. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  269. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +5 -5
  270. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -0
  271. data/src/core/tsi/ssl_transport_security.cc +245 -116
  272. data/src/core/tsi/ssl_types.h +2 -0
  273. data/src/core/tsi/transport_security.cc +14 -0
  274. data/src/core/tsi/transport_security.h +2 -0
  275. data/src/core/tsi/transport_security_interface.h +11 -1
  276. data/src/ruby/bin/math_client.rb +17 -9
  277. data/src/ruby/ext/grpc/extconf.rb +1 -26
  278. data/src/ruby/ext/grpc/rb_channel_credentials.c +3 -3
  279. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +42 -16
  280. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +65 -26
  281. data/src/ruby/lib/grpc/generic/active_call.rb +19 -23
  282. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  283. data/src/ruby/lib/grpc/version.rb +1 -1
  284. data/src/ruby/pb/generate_proto_ruby.sh +7 -1
  285. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  286. data/src/ruby/spec/call_credentials_spec.rb +1 -1
  287. data/src/ruby/spec/call_spec.rb +1 -1
  288. data/src/ruby/spec/channel_credentials_spec.rb +1 -1
  289. data/src/ruby/spec/channel_spec.rb +1 -1
  290. data/src/ruby/spec/client_auth_spec.rb +1 -12
  291. data/src/ruby/spec/client_server_spec.rb +1 -1
  292. data/src/ruby/spec/compression_options_spec.rb +1 -1
  293. data/src/ruby/spec/error_sanity_spec.rb +1 -1
  294. data/src/ruby/spec/generic/client_stub_spec.rb +16 -4
  295. data/src/ruby/spec/generic/rpc_desc_spec.rb +1 -1
  296. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  297. data/src/ruby/spec/generic/service_spec.rb +1 -1
  298. data/src/ruby/spec/google_rpc_status_utils_spec.rb +1 -12
  299. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +1 -0
  300. data/src/ruby/spec/pb/health/checker_spec.rb +1 -1
  301. data/src/ruby/spec/server_credentials_spec.rb +1 -1
  302. data/src/ruby/spec/server_spec.rb +1 -1
  303. data/src/ruby/spec/spec_helper.rb +1 -0
  304. data/src/ruby/spec/support/services.rb +1 -1
  305. data/src/ruby/spec/time_consts_spec.rb +1 -1
  306. data/third_party/address_sorting/address_sorting.c +17 -11
  307. data/third_party/address_sorting/address_sorting_windows.c +43 -3
  308. data/third_party/address_sorting/include/address_sorting/address_sorting.h +3 -0
  309. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  310. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  311. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  312. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  313. data/third_party/boringssl/crypto/asn1/tasn_dec.c +40 -19
  314. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  315. data/third_party/boringssl/crypto/bio/file.c +2 -0
  316. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  317. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  318. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  319. data/third_party/boringssl/crypto/bytestring/cbs.c +151 -20
  320. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +203 -0
  321. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  322. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  323. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  324. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  325. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  326. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +9 -10
  327. data/third_party/boringssl/crypto/ecdh/ecdh.c +4 -3
  328. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  329. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +57 -112
  330. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  331. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +128 -70
  332. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  333. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +64 -118
  334. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +284 -122
  335. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  336. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +274 -218
  337. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  338. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +187 -27
  339. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  340. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  341. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  342. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +321 -347
  343. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +326 -66
  344. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +77 -25
  345. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  346. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  347. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +155 -96
  348. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  349. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  350. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  351. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  352. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +99 -163
  353. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  354. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +44 -23
  355. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  356. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +38 -65
  357. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +5378 -5418
  358. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  359. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  360. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  361. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  362. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  363. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -62
  364. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  365. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  366. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  367. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +16 -40
  368. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +1 -6
  369. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +57 -39
  370. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +309 -142
  371. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  372. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  373. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  374. data/third_party/boringssl/crypto/internal.h +65 -2
  375. data/third_party/boringssl/crypto/mem.c +0 -2
  376. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  377. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  378. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  379. data/third_party/boringssl/crypto/x509/vpm_int.h +1 -0
  380. data/third_party/boringssl/crypto/x509/x509_vfy.c +4 -0
  381. data/third_party/boringssl/crypto/x509/x509_vpm.c +44 -22
  382. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  383. data/third_party/boringssl/include/openssl/aead.h +10 -0
  384. data/third_party/boringssl/include/openssl/asn1.h +2 -3
  385. data/third_party/boringssl/include/openssl/base.h +5 -14
  386. data/third_party/boringssl/include/openssl/bio.h +1 -1
  387. data/third_party/boringssl/include/openssl/bn.h +62 -18
  388. data/third_party/boringssl/include/openssl/bytestring.h +53 -28
  389. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  390. data/third_party/boringssl/include/openssl/ec.h +10 -4
  391. data/third_party/boringssl/include/openssl/ec_key.h +7 -6
  392. data/third_party/boringssl/include/openssl/err.h +9 -9
  393. data/third_party/boringssl/include/openssl/evp.h +1 -1
  394. data/third_party/boringssl/include/openssl/rsa.h +35 -10
  395. data/third_party/boringssl/include/openssl/ssl.h +167 -19
  396. data/third_party/boringssl/include/openssl/ssl3.h +0 -1
  397. data/third_party/boringssl/include/openssl/stack.h +1 -1
  398. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  399. data/third_party/boringssl/include/openssl/x509.h +4 -0
  400. data/third_party/boringssl/include/openssl/x509v3.h +1 -0
  401. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  402. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  403. data/third_party/boringssl/ssl/handoff.cc +285 -0
  404. data/third_party/boringssl/ssl/handshake.cc +26 -12
  405. data/third_party/boringssl/ssl/handshake_client.cc +101 -95
  406. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  407. data/third_party/boringssl/ssl/internal.h +132 -79
  408. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  409. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  410. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  411. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  412. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  413. data/third_party/boringssl/ssl/ssl_cipher.cc +12 -8
  414. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  415. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  416. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  417. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  418. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  419. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  420. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  421. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  422. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  423. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  424. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  425. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  426. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  427. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  428. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  429. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  430. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  431. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  432. metadata +86 -71
  433. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.cc +0 -253
  434. data/src/core/ext/filters/load_reporting/server_load_reporting_filter.cc +0 -222
  435. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.cc +0 -71
  436. data/src/core/ext/filters/load_reporting/server_load_reporting_plugin.h +0 -61
  437. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  438. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  439. data/src/core/lib/gpr/fork.cc +0 -78
  440. data/src/core/tsi/transport_security_adapter.cc +0 -235
  441. data/src/core/tsi/transport_security_adapter.h +0 -41
  442. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  443. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  444. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  445. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  446. data/src/ruby/pb/test/client.rb +0 -764
  447. data/src/ruby/pb/test/server.rb +0 -252
  448. data/src/ruby/spec/pb/package_with_underscore/checker_spec.rb +0 -54
  449. data/src/ruby/spec/pb/package_with_underscore/data.proto +0 -23
  450. data/src/ruby/spec/pb/package_with_underscore/service.proto +0 -23
  451. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  452. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -222,10 +222,10 @@ static void finish_accept(grpc_tcp_listener* sp, grpc_custom_socket* socket) {
222
222
  }
223
223
  if (grpc_tcp_trace.enabled()) {
224
224
  if (peer_name_string) {
225
- gpr_log(GPR_DEBUG, "SERVER_CONNECT: %p accepted connection: %s",
225
+ gpr_log(GPR_INFO, "SERVER_CONNECT: %p accepted connection: %s",
226
226
  sp->server, peer_name_string);
227
227
  } else {
228
- gpr_log(GPR_DEBUG, "SERVER_CONNECT: %p accepted connection", sp->server);
228
+ gpr_log(GPR_INFO, "SERVER_CONNECT: %p accepted connection", sp->server);
229
229
  }
230
230
  }
231
231
  ep = custom_tcp_endpoint_create(socket, sp->server->resource_quota,
@@ -377,10 +377,10 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s,
377
377
  grpc_sockaddr_to_string(&port_string, addr, 0);
378
378
  const char* str = grpc_error_string(error);
379
379
  if (port_string) {
380
- gpr_log(GPR_DEBUG, "SERVER %p add_port %s error=%s", s, port_string, str);
380
+ gpr_log(GPR_INFO, "SERVER %p add_port %s error=%s", s, port_string, str);
381
381
  gpr_free(port_string);
382
382
  } else {
383
- gpr_log(GPR_DEBUG, "SERVER %p add_port error=%s", s, str);
383
+ gpr_log(GPR_INFO, "SERVER %p add_port error=%s", s, str);
384
384
  }
385
385
  }
386
386
 
@@ -419,7 +419,7 @@ static void tcp_server_start(grpc_tcp_server* server, grpc_pollset** pollsets,
419
419
  (void)pollset_count;
420
420
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
421
421
  if (grpc_tcp_trace.enabled()) {
422
- gpr_log(GPR_DEBUG, "SERVER_START %p", server);
422
+ gpr_log(GPR_INFO, "SERVER_START %p", server);
423
423
  }
424
424
  GPR_ASSERT(on_accept_cb);
425
425
  GPR_ASSERT(!server->on_accept_cb);
@@ -25,7 +25,7 @@
25
25
 
26
26
  #include "src/core/lib/iomgr/port.h"
27
27
 
28
- #ifdef GRPC_POSIX_SOCKET
28
+ #ifdef GRPC_POSIX_SOCKET_TCP_SERVER
29
29
 
30
30
  #include "src/core/lib/iomgr/tcp_server.h"
31
31
 
@@ -55,39 +55,18 @@
55
55
  #include "src/core/lib/iomgr/tcp_server_utils_posix.h"
56
56
  #include "src/core/lib/iomgr/unix_sockets_posix.h"
57
57
 
58
- static gpr_once check_init = GPR_ONCE_INIT;
59
- static bool has_so_reuseport = false;
60
-
61
- static void init(void) {
62
- #ifndef GPR_MANYLINUX1
63
- int s = socket(AF_INET, SOCK_STREAM, 0);
64
- if (s < 0) {
65
- /* This might be an ipv6-only environment in which case 'socket(AF_INET,..)'
66
- call would fail. Try creating IPv6 socket in that case */
67
- s = socket(AF_INET6, SOCK_STREAM, 0);
68
- }
69
- if (s >= 0) {
70
- has_so_reuseport = GRPC_LOG_IF_ERROR("check for SO_REUSEPORT",
71
- grpc_set_socket_reuse_port(s, 1));
72
- close(s);
73
- }
74
- #endif
75
- }
76
-
77
58
  static grpc_error* tcp_server_create(grpc_closure* shutdown_complete,
78
59
  const grpc_channel_args* args,
79
60
  grpc_tcp_server** server) {
80
- gpr_once_init(&check_init, init);
81
-
82
61
  grpc_tcp_server* s =
83
62
  static_cast<grpc_tcp_server*>(gpr_zalloc(sizeof(grpc_tcp_server)));
84
- s->so_reuseport = has_so_reuseport;
63
+ s->so_reuseport = grpc_is_socket_reuse_port_supported();
85
64
  s->expand_wildcard_addrs = false;
86
65
  for (size_t i = 0; i < (args == nullptr ? 0 : args->num_args); i++) {
87
66
  if (0 == strcmp(GRPC_ARG_ALLOW_REUSEPORT, args->args[i].key)) {
88
67
  if (args->args[i].type == GRPC_ARG_INTEGER) {
89
- s->so_reuseport =
90
- has_so_reuseport && (args->args[i].value.integer != 0);
68
+ s->so_reuseport = grpc_is_socket_reuse_port_supported() &&
69
+ (args->args[i].value.integer != 0);
91
70
  } else {
92
71
  gpr_free(s);
93
72
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(GRPC_ARG_ALLOW_REUSEPORT
@@ -171,7 +150,7 @@ static void deactivated_all_ports(grpc_tcp_server* s) {
171
150
  GRPC_CLOSURE_INIT(&sp->destroyed_closure, destroyed_port, s,
172
151
  grpc_schedule_on_exec_ctx);
173
152
  grpc_fd_orphan(sp->emfd, &sp->destroyed_closure, nullptr,
174
- false /* already_closed */, "tcp_listener_shutdown");
153
+ "tcp_listener_shutdown");
175
154
  }
176
155
  gpr_mu_unlock(&s->mu);
177
156
  } else {
@@ -208,11 +187,6 @@ static void on_read(void* arg, grpc_error* err) {
208
187
  goto error;
209
188
  }
210
189
 
211
- read_notifier_pollset =
212
- sp->server->pollsets[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
213
- &sp->server->next_pollset_to_assign, 1)) %
214
- sp->server->pollset_count];
215
-
216
190
  /* loop until accept4 returns EAGAIN, and then re-arm notification */
217
191
  for (;;) {
218
192
  grpc_resolved_address addr;
@@ -249,10 +223,15 @@ static void on_read(void* arg, grpc_error* err) {
249
223
  gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
250
224
 
251
225
  if (grpc_tcp_trace.enabled()) {
252
- gpr_log(GPR_DEBUG, "SERVER_CONNECT: incoming connection: %s", addr_str);
226
+ gpr_log(GPR_INFO, "SERVER_CONNECT: incoming connection: %s", addr_str);
253
227
  }
254
228
 
255
- grpc_fd* fdobj = grpc_fd_create(fd, name);
229
+ grpc_fd* fdobj = grpc_fd_create(fd, name, false);
230
+
231
+ read_notifier_pollset =
232
+ sp->server->pollsets[static_cast<size_t>(gpr_atm_no_barrier_fetch_add(
233
+ &sp->server->next_pollset_to_assign, 1)) %
234
+ sp->server->pollset_count];
256
235
 
257
236
  grpc_pollset_add_fd(read_notifier_pollset, fdobj);
258
237
 
@@ -367,7 +346,8 @@ static grpc_error* clone_port(grpc_tcp_listener* listener, unsigned count) {
367
346
  err = grpc_create_dualstack_socket(&listener->addr, SOCK_STREAM, 0, &dsmode,
368
347
  &fd);
369
348
  if (err != GRPC_ERROR_NONE) return err;
370
- err = grpc_tcp_server_prepare_socket(fd, &listener->addr, true, &port);
349
+ err = grpc_tcp_server_prepare_socket(listener->server, fd, &listener->addr,
350
+ true, &port);
371
351
  if (err != GRPC_ERROR_NONE) return err;
372
352
  listener->server->nports++;
373
353
  grpc_sockaddr_to_string(&addr_str, &listener->addr, 1);
@@ -382,7 +362,7 @@ static grpc_error* clone_port(grpc_tcp_listener* listener, unsigned count) {
382
362
  listener->sibling = sp;
383
363
  sp->server = listener->server;
384
364
  sp->fd = fd;
385
- sp->emfd = grpc_fd_create(fd, name);
365
+ sp->emfd = grpc_fd_create(fd, name, false);
386
366
  memcpy(&sp->addr, &listener->addr, sizeof(grpc_resolved_address));
387
367
  sp->port = port;
388
368
  sp->port_index = listener->port_index;
@@ -579,4 +559,4 @@ grpc_tcp_server_vtable grpc_posix_tcp_server_vtable = {
579
559
  tcp_server_shutdown_starting_add,
580
560
  tcp_server_unref,
581
561
  tcp_server_shutdown_listeners};
582
- #endif
562
+ #endif /* GRPC_POSIX_SOCKET_TCP_SERVER */
@@ -113,7 +113,7 @@ grpc_error* grpc_tcp_server_add_all_local_addrs(grpc_tcp_server* s,
113
113
  int* out_port);
114
114
 
115
115
  /* Prepare a recently-created socket for listening. */
116
- grpc_error* grpc_tcp_server_prepare_socket(int fd,
116
+ grpc_error* grpc_tcp_server_prepare_socket(grpc_tcp_server*, int fd,
117
117
  const grpc_resolved_address* addr,
118
118
  bool so_reuseport, int* port);
119
119
  /* Ruturn true if the platform supports ifaddrs */
@@ -20,7 +20,7 @@
20
20
 
21
21
  #include "src/core/lib/iomgr/port.h"
22
22
 
23
- #ifdef GRPC_POSIX_SOCKET
23
+ #ifdef GRPC_POSIX_SOCKET_TCP_SERVER_UTILS_COMMON
24
24
 
25
25
  #include "src/core/lib/iomgr/tcp_server_utils_posix.h"
26
26
 
@@ -87,7 +87,7 @@ static grpc_error* add_socket_to_server(grpc_tcp_server* s, int fd,
87
87
  char* name;
88
88
 
89
89
  grpc_error* err =
90
- grpc_tcp_server_prepare_socket(fd, addr, s->so_reuseport, &port);
90
+ grpc_tcp_server_prepare_socket(s, fd, addr, s->so_reuseport, &port);
91
91
  if (err == GRPC_ERROR_NONE) {
92
92
  GPR_ASSERT(port > 0);
93
93
  grpc_sockaddr_to_string(&addr_str, addr, 1);
@@ -105,7 +105,7 @@ static grpc_error* add_socket_to_server(grpc_tcp_server* s, int fd,
105
105
  s->tail = sp;
106
106
  sp->server = s;
107
107
  sp->fd = fd;
108
- sp->emfd = grpc_fd_create(fd, name);
108
+ sp->emfd = grpc_fd_create(fd, name, false);
109
109
  memcpy(&sp->addr, addr, sizeof(grpc_resolved_address));
110
110
  sp->port = port;
111
111
  sp->port_index = port_index;
@@ -144,7 +144,7 @@ grpc_error* grpc_tcp_server_add_addr(grpc_tcp_server* s,
144
144
  }
145
145
 
146
146
  /* Prepare a recently-created socket for listening. */
147
- grpc_error* grpc_tcp_server_prepare_socket(int fd,
147
+ grpc_error* grpc_tcp_server_prepare_socket(grpc_tcp_server* s, int fd,
148
148
  const grpc_resolved_address* addr,
149
149
  bool so_reuseport, int* port) {
150
150
  grpc_resolved_address sockname_temp;
@@ -170,6 +170,18 @@ grpc_error* grpc_tcp_server_prepare_socket(int fd,
170
170
  err = grpc_set_socket_no_sigpipe_if_possible(fd);
171
171
  if (err != GRPC_ERROR_NONE) goto error;
172
172
 
173
+ if (s->channel_args) {
174
+ for (size_t i = 0; i < s->channel_args->num_args; i++) {
175
+ if (0 == strcmp(s->channel_args->args[i].key, GRPC_ARG_SOCKET_MUTATOR)) {
176
+ GPR_ASSERT(s->channel_args->args[i].type == GRPC_ARG_POINTER);
177
+ grpc_socket_mutator* mutator = static_cast<grpc_socket_mutator*>(
178
+ s->channel_args->args[i].value.pointer.p);
179
+ err = grpc_set_socket_with_mutator(fd, mutator);
180
+ if (err != GRPC_ERROR_NONE) goto error;
181
+ }
182
+ }
183
+ }
184
+
173
185
  if (bind(fd, reinterpret_cast<grpc_sockaddr*>(const_cast<char*>(addr->addr)),
174
186
  addr->len) < 0) {
175
187
  err = GRPC_OS_ERROR(errno, "bind");
@@ -205,4 +217,4 @@ error:
205
217
  return ret;
206
218
  }
207
219
 
208
- #endif /* GRPC_POSIX_SOCKET */
220
+ #endif /* GRPC_POSIX_SOCKET_TCP_SERVER_UTILS_COMMON */
@@ -129,6 +129,7 @@ static void destroy_server(void* arg, grpc_error* error) {
129
129
  gpr_free(sp);
130
130
  }
131
131
  grpc_channel_args_destroy(s->channel_args);
132
+ gpr_mu_destroy(&s->mu);
132
133
  gpr_free(s);
133
134
  }
134
135
 
@@ -204,6 +204,9 @@ static grpc_error* uv_socket_init_helper(uv_socket_t* uv_socket, int domain) {
204
204
  uv_socket->write_buffers = nullptr;
205
205
  uv_socket->read_len = 0;
206
206
  uv_tcp_nodelay(uv_socket->handle, 1);
207
+ // Node uses a garbage collector to call destructors, so we don't
208
+ // want to hold the uv loop open with active gRPC objects.
209
+ uv_unref((uv_handle_t*)uv_socket->handle);
207
210
  uv_socket->pending_connection = false;
208
211
  uv_socket->accept_socket = nullptr;
209
212
  uv_socket->accept_error = GRPC_ERROR_NONE;
@@ -53,7 +53,7 @@
53
53
 
54
54
  extern grpc_core::TraceFlag grpc_tcp_trace;
55
55
 
56
- static grpc_error* set_non_block(SOCKET sock) {
56
+ grpc_error* grpc_tcp_set_non_block(SOCKET sock) {
57
57
  int status;
58
58
  uint32_t param = 1;
59
59
  DWORD ret;
@@ -74,12 +74,28 @@ static grpc_error* set_dualstack(SOCKET sock) {
74
74
  : GRPC_WSA_ERROR(WSAGetLastError(), "setsockopt(IPV6_V6ONLY)");
75
75
  }
76
76
 
77
+ static grpc_error* enable_loopback_fast_path(SOCKET sock) {
78
+ int status;
79
+ uint32_t param = 1;
80
+ DWORD ret;
81
+ status = WSAIoctl(sock, /*SIO_LOOPBACK_FAST_PATH==*/_WSAIOW(IOC_VENDOR, 16),
82
+ &param, sizeof(param), NULL, 0, &ret, 0, 0);
83
+ if (status == SOCKET_ERROR) {
84
+ status = WSAGetLastError();
85
+ }
86
+ return status == 0 || status == WSAEOPNOTSUPP
87
+ ? GRPC_ERROR_NONE
88
+ : GRPC_WSA_ERROR(status, "WSAIoctl(SIO_LOOPBACK_FAST_PATH)");
89
+ }
90
+
77
91
  grpc_error* grpc_tcp_prepare_socket(SOCKET sock) {
78
92
  grpc_error* err;
79
- err = set_non_block(sock);
93
+ err = grpc_tcp_set_non_block(sock);
80
94
  if (err != GRPC_ERROR_NONE) return err;
81
95
  err = set_dualstack(sock);
82
96
  if (err != GRPC_ERROR_NONE) return err;
97
+ err = enable_loopback_fast_path(sock);
98
+ if (err != GRPC_ERROR_NONE) return err;
83
99
  return GRPC_ERROR_NONE;
84
100
  }
85
101
 
@@ -46,6 +46,8 @@ grpc_endpoint* grpc_tcp_create(grpc_winsocket* socket,
46
46
 
47
47
  grpc_error* grpc_tcp_prepare_socket(SOCKET sock);
48
48
 
49
+ grpc_error* grpc_tcp_set_non_block(SOCKET sock);
50
+
49
51
  #endif
50
52
 
51
53
  #endif /* GRPC_CORE_LIB_IOMGR_TCP_WINDOWS_H */
@@ -28,7 +28,7 @@
28
28
  #include "src/core/lib/iomgr/iomgr.h"
29
29
 
30
30
  typedef struct grpc_timer {
31
- gpr_atm deadline;
31
+ grpc_millis deadline;
32
32
  uint32_t heap_index; /* INVALID_HEAP_INDEX if not in heap */
33
33
  bool pending;
34
34
  struct grpc_timer* next;
@@ -61,10 +61,11 @@ typedef struct grpc_timer_vtable {
61
61
 
62
62
  /* Initialize *timer. When expired or canceled, closure will be called with
63
63
  error set to indicate if it expired (GRPC_ERROR_NONE) or was canceled
64
- (GRPC_ERROR_CANCELLED). timer_cb is guaranteed to be called exactly once, and
64
+ (GRPC_ERROR_CANCELLED). *closure is guaranteed to be called exactly once, and
65
65
  application code should check the error to determine how it was invoked. The
66
66
  application callback is also responsible for maintaining information about
67
- when to free up any user-level state. */
67
+ when to free up any user-level state. Behavior is undefined for a deadline of
68
+ GRPC_MILLIS_INF_FUTURE. */
68
69
  void grpc_timer_init(grpc_timer* timer, grpc_millis deadline,
69
70
  grpc_closure* closure);
70
71
 
@@ -34,6 +34,7 @@
34
34
  #include "src/core/lib/gpr/spinlock.h"
35
35
  #include "src/core/lib/gpr/tls.h"
36
36
  #include "src/core/lib/gpr/useful.h"
37
+ #include "src/core/lib/iomgr/exec_ctx.h"
37
38
  #include "src/core/lib/iomgr/time_averaged_stats.h"
38
39
  #include "src/core/lib/iomgr/timer_heap.h"
39
40
 
@@ -59,9 +60,9 @@ typedef struct {
59
60
  gpr_mu mu;
60
61
  grpc_time_averaged_stats stats;
61
62
  /* All and only timers with deadlines <= this will be in the heap. */
62
- gpr_atm queue_deadline_cap;
63
+ grpc_millis queue_deadline_cap;
63
64
  /* The deadline of the next timer due in this shard */
64
- gpr_atm min_deadline;
65
+ grpc_millis min_deadline;
65
66
  /* Index of this timer_shard in the g_shard_queue */
66
67
  uint32_t shard_queue_index;
67
68
  /* This holds all timers with deadlines < queue_deadline_cap. Timers in this
@@ -97,6 +98,12 @@ static void init_timer_ht() {
97
98
  }
98
99
  }
99
100
 
101
+ static void destroy_timer_ht() {
102
+ for (int i = 0; i < NUM_HASH_BUCKETS; i++) {
103
+ gpr_mu_destroy(&g_hash_mu[i]);
104
+ }
105
+ }
106
+
100
107
  static bool is_in_ht(grpc_timer* t) {
101
108
  size_t i = GPR_HASH_POINTER(t, NUM_HASH_BUCKETS);
102
109
 
@@ -188,6 +195,7 @@ static void validate_non_pending_timer(grpc_timer* t) {
188
195
  }
189
196
 
190
197
  #define INIT_TIMER_HASH_TABLE() init_timer_ht()
198
+ #define DESTROY_TIMER_HASH_TABLE() destroy_timer_ht()
191
199
  #define ADD_TO_HASH_TABLE(t) add_to_ht((t))
192
200
  #define REMOVE_FROM_HASH_TABLE(t) remove_from_ht((t))
193
201
  #define VALIDATE_NON_PENDING_TIMER(t) validate_non_pending_timer((t))
@@ -195,21 +203,30 @@ static void validate_non_pending_timer(grpc_timer* t) {
195
203
  #else
196
204
 
197
205
  #define INIT_TIMER_HASH_TABLE()
206
+ #define DESTROY_TIMER_HASH_TABLE()
198
207
  #define ADD_TO_HASH_TABLE(t)
199
208
  #define REMOVE_FROM_HASH_TABLE(t)
200
209
  #define VALIDATE_NON_PENDING_TIMER(t)
201
210
 
202
211
  #endif
203
212
 
213
+ #if GPR_ARCH_64
214
+ /* NOTE: TODO(sreek) - Currently the thread local storage support in grpc is
215
+ for intptr_t which means on 32-bit machines it is not wide enough to hold
216
+ grpc_millis which is 64-bit. Adding thread local support for 64 bit values
217
+ is a lot of work for very little gain. So we are currently restricting this
218
+ optimization to only 64 bit machines */
219
+
204
220
  /* Thread local variable that stores the deadline of the next timer the thread
205
221
  * has last-seen. This is an optimization to prevent the thread from checking
206
222
  * shared_mutables.min_timer (which requires acquiring shared_mutables.mu lock,
207
223
  * an expensive operation) */
208
224
  GPR_TLS_DECL(g_last_seen_min_timer);
225
+ #endif
209
226
 
210
227
  struct shared_mutables {
211
228
  /* The deadline of the next timer due across all timer shards */
212
- gpr_atm min_timer;
229
+ grpc_millis min_timer;
213
230
  /* Allow only one run_some_expired_timers at once */
214
231
  gpr_spinlock checker_mu;
215
232
  bool initialized;
@@ -219,18 +236,18 @@ struct shared_mutables {
219
236
 
220
237
  static struct shared_mutables g_shared_mutables;
221
238
 
222
- static gpr_atm saturating_add(gpr_atm a, gpr_atm b) {
223
- if (a > GPR_ATM_MAX - b) {
224
- return GPR_ATM_MAX;
239
+ static grpc_millis saturating_add(grpc_millis a, grpc_millis b) {
240
+ if (a > GRPC_MILLIS_INF_FUTURE - b) {
241
+ return GRPC_MILLIS_INF_FUTURE;
225
242
  }
226
243
  return a + b;
227
244
  }
228
245
 
229
- static grpc_timer_check_result run_some_expired_timers(gpr_atm now,
230
- gpr_atm* next,
246
+ static grpc_timer_check_result run_some_expired_timers(grpc_millis now,
247
+ grpc_millis* next,
231
248
  grpc_error* error);
232
249
 
233
- static gpr_atm compute_min_deadline(timer_shard* shard) {
250
+ static grpc_millis compute_min_deadline(timer_shard* shard) {
234
251
  return grpc_timer_heap_is_empty(&shard->heap)
235
252
  ? saturating_add(shard->queue_deadline_cap, 1)
236
253
  : grpc_timer_heap_top(&shard->heap)->deadline;
@@ -249,8 +266,11 @@ static void timer_list_init() {
249
266
  g_shared_mutables.checker_mu = GPR_SPINLOCK_INITIALIZER;
250
267
  gpr_mu_init(&g_shared_mutables.mu);
251
268
  g_shared_mutables.min_timer = grpc_core::ExecCtx::Get()->Now();
269
+
270
+ #if GPR_ARCH_64
252
271
  gpr_tls_init(&g_last_seen_min_timer);
253
272
  gpr_tls_set(&g_last_seen_min_timer, 0);
273
+ #endif
254
274
 
255
275
  for (i = 0; i < g_num_shards; i++) {
256
276
  timer_shard* shard = &g_shards[i];
@@ -279,10 +299,16 @@ static void timer_list_shutdown() {
279
299
  grpc_timer_heap_destroy(&shard->heap);
280
300
  }
281
301
  gpr_mu_destroy(&g_shared_mutables.mu);
302
+
303
+ #if GPR_ARCH_64
282
304
  gpr_tls_destroy(&g_last_seen_min_timer);
305
+ #endif
306
+
283
307
  gpr_free(g_shards);
284
308
  gpr_free(g_shard_queue);
285
309
  g_shared_mutables.initialized = false;
310
+
311
+ DESTROY_TIMER_HASH_TABLE();
286
312
  }
287
313
 
288
314
  /* returns true if the first element in the list */
@@ -336,9 +362,9 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
336
362
  #endif
337
363
 
338
364
  if (grpc_timer_trace.enabled()) {
339
- gpr_log(GPR_DEBUG,
340
- "TIMER %p: SET %" PRIdPTR " now %" PRIdPTR " call %p[%p]", timer,
341
- deadline, grpc_core::ExecCtx::Get()->Now(), closure, closure->cb);
365
+ gpr_log(GPR_INFO, "TIMER %p: SET %" PRId64 " now %" PRId64 " call %p[%p]",
366
+ timer, deadline, grpc_core::ExecCtx::Get()->Now(), closure,
367
+ closure->cb);
342
368
  }
343
369
 
344
370
  if (!g_shared_mutables.initialized) {
@@ -372,8 +398,8 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
372
398
  list_join(&shard->list, timer);
373
399
  }
374
400
  if (grpc_timer_trace.enabled()) {
375
- gpr_log(GPR_DEBUG,
376
- " .. add to shard %d with queue_deadline_cap=%" PRIdPTR
401
+ gpr_log(GPR_INFO,
402
+ " .. add to shard %d with queue_deadline_cap=%" PRId64
377
403
  " => is_first_timer=%s",
378
404
  static_cast<int>(shard - g_shards), shard->queue_deadline_cap,
379
405
  is_first_timer ? "true" : "false");
@@ -394,15 +420,27 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
394
420
  if (is_first_timer) {
395
421
  gpr_mu_lock(&g_shared_mutables.mu);
396
422
  if (grpc_timer_trace.enabled()) {
397
- gpr_log(GPR_DEBUG, " .. old shard min_deadline=%" PRIdPTR,
423
+ gpr_log(GPR_INFO, " .. old shard min_deadline=%" PRId64,
398
424
  shard->min_deadline);
399
425
  }
400
426
  if (deadline < shard->min_deadline) {
401
- gpr_atm old_min_deadline = g_shard_queue[0]->min_deadline;
427
+ grpc_millis old_min_deadline = g_shard_queue[0]->min_deadline;
402
428
  shard->min_deadline = deadline;
403
429
  note_deadline_change(shard);
404
430
  if (shard->shard_queue_index == 0 && deadline < old_min_deadline) {
405
- gpr_atm_no_barrier_store(&g_shared_mutables.min_timer, deadline);
431
+ #if GPR_ARCH_64
432
+ // TODO: sreek - Using c-style cast here. static_cast<> gives an error
433
+ // (on mac platforms complaining that gpr_atm* is (long *) while
434
+ // (&g_shared_mutables.min_timer) is a (long long *). The cast should be
435
+ // safe since we know that both are pointer types and 64-bit wide.
436
+ gpr_atm_no_barrier_store((gpr_atm*)(&g_shared_mutables.min_timer),
437
+ deadline);
438
+ #else
439
+ // On 32-bit systems, gpr_atm_no_barrier_store does not work on 64-bit
440
+ // types (like grpc_millis). So all reads and writes to
441
+ // g_shared_mutables.min_timer varialbe under g_shared_mutables.mu
442
+ g_shared_mutables.min_timer = deadline;
443
+ #endif
406
444
  grpc_kick_poller();
407
445
  }
408
446
  }
@@ -411,8 +449,10 @@ static void timer_init(grpc_timer* timer, grpc_millis deadline,
411
449
  }
412
450
 
413
451
  static void timer_consume_kick(void) {
414
- /* force re-evaluation of last seeen min */
452
+ #if GPR_ARCH_64
453
+ /* Force re-evaluation of last seen min */
415
454
  gpr_tls_set(&g_last_seen_min_timer, 0);
455
+ #endif
416
456
  }
417
457
 
418
458
  static void timer_cancel(grpc_timer* timer) {
@@ -424,7 +464,7 @@ static void timer_cancel(grpc_timer* timer) {
424
464
  timer_shard* shard = &g_shards[GPR_HASH_POINTER(timer, g_num_shards)];
425
465
  gpr_mu_lock(&shard->mu);
426
466
  if (grpc_timer_trace.enabled()) {
427
- gpr_log(GPR_DEBUG, "TIMER %p: CANCEL pending=%s", timer,
467
+ gpr_log(GPR_INFO, "TIMER %p: CANCEL pending=%s", timer,
428
468
  timer->pending ? "true" : "false");
429
469
  }
430
470
 
@@ -449,7 +489,7 @@ static void timer_cancel(grpc_timer* timer) {
449
489
  'queue_deadline_cap') into into shard->heap.
450
490
  Returns 'true' if shard->heap has atleast ONE element
451
491
  REQUIRES: shard->mu locked */
452
- static int refill_heap(timer_shard* shard, gpr_atm now) {
492
+ static int refill_heap(timer_shard* shard, grpc_millis now) {
453
493
  /* Compute the new queue window width and bound by the limits: */
454
494
  double computed_deadline_delta =
455
495
  grpc_time_averaged_stats_update_average(&shard->stats) *
@@ -462,10 +502,10 @@ static int refill_heap(timer_shard* shard, gpr_atm now) {
462
502
  /* Compute the new cap and put all timers under it into the queue: */
463
503
  shard->queue_deadline_cap =
464
504
  saturating_add(GPR_MAX(now, shard->queue_deadline_cap),
465
- static_cast<gpr_atm>(deadline_delta * 1000.0));
505
+ static_cast<grpc_millis>(deadline_delta * 1000.0));
466
506
 
467
507
  if (grpc_timer_check_trace.enabled()) {
468
- gpr_log(GPR_DEBUG, " .. shard[%d]->queue_deadline_cap --> %" PRIdPTR,
508
+ gpr_log(GPR_INFO, " .. shard[%d]->queue_deadline_cap --> %" PRId64,
469
509
  static_cast<int>(shard - g_shards), shard->queue_deadline_cap);
470
510
  }
471
511
  for (timer = shard->list.next; timer != &shard->list; timer = next) {
@@ -473,7 +513,7 @@ static int refill_heap(timer_shard* shard, gpr_atm now) {
473
513
 
474
514
  if (timer->deadline < shard->queue_deadline_cap) {
475
515
  if (grpc_timer_check_trace.enabled()) {
476
- gpr_log(GPR_DEBUG, " .. add timer with deadline %" PRIdPTR " to heap",
516
+ gpr_log(GPR_INFO, " .. add timer with deadline %" PRId64 " to heap",
477
517
  timer->deadline);
478
518
  }
479
519
  list_remove(timer);
@@ -486,11 +526,11 @@ static int refill_heap(timer_shard* shard, gpr_atm now) {
486
526
  /* This pops the next non-cancelled timer with deadline <= now from the
487
527
  queue, or returns NULL if there isn't one.
488
528
  REQUIRES: shard->mu locked */
489
- static grpc_timer* pop_one(timer_shard* shard, gpr_atm now) {
529
+ static grpc_timer* pop_one(timer_shard* shard, grpc_millis now) {
490
530
  grpc_timer* timer;
491
531
  for (;;) {
492
532
  if (grpc_timer_check_trace.enabled()) {
493
- gpr_log(GPR_DEBUG, " .. shard[%d]: heap_empty=%s",
533
+ gpr_log(GPR_INFO, " .. shard[%d]: heap_empty=%s",
494
534
  static_cast<int>(shard - g_shards),
495
535
  grpc_timer_heap_is_empty(&shard->heap) ? "true" : "false");
496
536
  }
@@ -500,13 +540,13 @@ static grpc_timer* pop_one(timer_shard* shard, gpr_atm now) {
500
540
  }
501
541
  timer = grpc_timer_heap_top(&shard->heap);
502
542
  if (grpc_timer_check_trace.enabled()) {
503
- gpr_log(GPR_DEBUG,
504
- " .. check top timer deadline=%" PRIdPTR " now=%" PRIdPTR,
543
+ gpr_log(GPR_INFO,
544
+ " .. check top timer deadline=%" PRId64 " now=%" PRId64,
505
545
  timer->deadline, now);
506
546
  }
507
547
  if (timer->deadline > now) return nullptr;
508
548
  if (grpc_timer_trace.enabled()) {
509
- gpr_log(GPR_DEBUG, "TIMER %p: FIRE %" PRIdPTR "ms late via %s scheduler",
549
+ gpr_log(GPR_INFO, "TIMER %p: FIRE %" PRId64 "ms late via %s scheduler",
510
550
  timer, now - timer->deadline,
511
551
  timer->closure->scheduler->vtable->name);
512
552
  }
@@ -517,8 +557,8 @@ static grpc_timer* pop_one(timer_shard* shard, gpr_atm now) {
517
557
  }
518
558
 
519
559
  /* REQUIRES: shard->mu unlocked */
520
- static size_t pop_timers(timer_shard* shard, gpr_atm now,
521
- gpr_atm* new_min_deadline, grpc_error* error) {
560
+ static size_t pop_timers(timer_shard* shard, grpc_millis now,
561
+ grpc_millis* new_min_deadline, grpc_error* error) {
522
562
  size_t n = 0;
523
563
  grpc_timer* timer;
524
564
  gpr_mu_lock(&shard->mu);
@@ -530,19 +570,33 @@ static size_t pop_timers(timer_shard* shard, gpr_atm now,
530
570
  *new_min_deadline = compute_min_deadline(shard);
531
571
  gpr_mu_unlock(&shard->mu);
532
572
  if (grpc_timer_check_trace.enabled()) {
533
- gpr_log(GPR_DEBUG, " .. shard[%d] popped %" PRIdPTR,
573
+ gpr_log(GPR_INFO, " .. shard[%d] popped %" PRIdPTR,
534
574
  static_cast<int>(shard - g_shards), n);
535
575
  }
536
576
  return n;
537
577
  }
538
578
 
539
- static grpc_timer_check_result run_some_expired_timers(gpr_atm now,
540
- gpr_atm* next,
579
+ static grpc_timer_check_result run_some_expired_timers(grpc_millis now,
580
+ grpc_millis* next,
541
581
  grpc_error* error) {
542
582
  grpc_timer_check_result result = GRPC_TIMERS_NOT_CHECKED;
543
583
 
544
- gpr_atm min_timer = gpr_atm_no_barrier_load(&g_shared_mutables.min_timer);
584
+ #if GPR_ARCH_64
585
+ // TODO: sreek - Using c-style cast here. static_cast<> gives an error (on
586
+ // mac platforms complaining that gpr_atm* is (long *) while
587
+ // (&g_shared_mutables.min_timer) is a (long long *). The cast should be
588
+ // safe since we know that both are pointer types and 64-bit wide
589
+ grpc_millis min_timer = static_cast<grpc_millis>(
590
+ gpr_atm_no_barrier_load((gpr_atm*)(&g_shared_mutables.min_timer)));
545
591
  gpr_tls_set(&g_last_seen_min_timer, min_timer);
592
+ #else
593
+ // On 32-bit systems, gpr_atm_no_barrier_load does not work on 64-bit types
594
+ // (like grpc_millis). So all reads and writes to g_shared_mutables.min_timer
595
+ // are done under g_shared_mutables.mu
596
+ gpr_mu_lock(&g_shared_mutables.mu);
597
+ grpc_millis min_timer = g_shared_mutables.min_timer;
598
+ gpr_mu_unlock(&g_shared_mutables.mu);
599
+ #endif
546
600
  if (now < min_timer) {
547
601
  if (next != nullptr) *next = GPR_MIN(*next, min_timer);
548
602
  return GRPC_TIMERS_CHECKED_AND_EMPTY;
@@ -553,14 +607,15 @@ static grpc_timer_check_result run_some_expired_timers(gpr_atm now,
553
607
  result = GRPC_TIMERS_CHECKED_AND_EMPTY;
554
608
 
555
609
  if (grpc_timer_check_trace.enabled()) {
556
- gpr_log(GPR_DEBUG, " .. shard[%d]->min_deadline = %" PRIdPTR,
610
+ gpr_log(GPR_INFO, " .. shard[%d]->min_deadline = %" PRId64,
557
611
  static_cast<int>(g_shard_queue[0] - g_shards),
558
612
  g_shard_queue[0]->min_deadline);
559
613
  }
560
614
 
561
615
  while (g_shard_queue[0]->min_deadline < now ||
562
- (now != GPR_ATM_MAX && g_shard_queue[0]->min_deadline == now)) {
563
- gpr_atm new_min_deadline;
616
+ (now != GRPC_MILLIS_INF_FUTURE &&
617
+ g_shard_queue[0]->min_deadline == now)) {
618
+ grpc_millis new_min_deadline;
564
619
 
565
620
  /* For efficiency, we pop as many available timers as we can from the
566
621
  shard. This may violate perfect timer deadline ordering, but that
@@ -570,10 +625,10 @@ static grpc_timer_check_result run_some_expired_timers(gpr_atm now,
570
625
  }
571
626
 
572
627
  if (grpc_timer_check_trace.enabled()) {
573
- gpr_log(GPR_DEBUG,
628
+ gpr_log(GPR_INFO,
574
629
  " .. result --> %d"
575
- ", shard[%d]->min_deadline %" PRIdPTR " --> %" PRIdPTR
576
- ", now=%" PRIdPTR,
630
+ ", shard[%d]->min_deadline %" PRId64 " --> %" PRId64
631
+ ", now=%" PRId64,
577
632
  result, static_cast<int>(g_shard_queue[0] - g_shards),
578
633
  g_shard_queue[0]->min_deadline, new_min_deadline, now);
579
634
  }
@@ -591,8 +646,19 @@ static grpc_timer_check_result run_some_expired_timers(gpr_atm now,
591
646
  *next = GPR_MIN(*next, g_shard_queue[0]->min_deadline);
592
647
  }
593
648
 
594
- gpr_atm_no_barrier_store(&g_shared_mutables.min_timer,
649
+ #if GPR_ARCH_64
650
+ // TODO: sreek - Using c-style cast here. static_cast<> gives an error (on
651
+ // mac platforms complaining that gpr_atm* is (long *) while
652
+ // (&g_shared_mutables.min_timer) is a (long long *). The cast should be
653
+ // safe since we know that both are pointer types and 64-bit wide
654
+ gpr_atm_no_barrier_store((gpr_atm*)(&g_shared_mutables.min_timer),
595
655
  g_shard_queue[0]->min_deadline);
656
+ #else
657
+ // On 32-bit systems, gpr_atm_no_barrier_store does not work on 64-bit
658
+ // types (like grpc_millis). So all reads and writes to
659
+ // g_shared_mutables.min_timer are done under g_shared_mutables.mu
660
+ g_shared_mutables.min_timer = g_shard_queue[0]->min_deadline;
661
+ #endif
596
662
  gpr_mu_unlock(&g_shared_mutables.mu);
597
663
  gpr_spinlock_unlock(&g_shared_mutables.checker_mu);
598
664
  }
@@ -606,17 +672,28 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
606
672
  // prelude
607
673
  grpc_millis now = grpc_core::ExecCtx::Get()->Now();
608
674
 
675
+ #if GPR_ARCH_64
609
676
  /* fetch from a thread-local first: this avoids contention on a globally
610
677
  mutable cacheline in the common case */
611
678
  grpc_millis min_timer = gpr_tls_get(&g_last_seen_min_timer);
679
+ #else
680
+ // On 32-bit systems, we currently do not have thread local support for 64-bit
681
+ // types. In this case, directly read from g_shared_mutables.min_timer.
682
+ // Also, note that on 32-bit systems, gpr_atm_no_barrier_store does not work
683
+ // on 64-bit types (like grpc_millis). So all reads and writes to
684
+ // g_shared_mutables.min_timer are done under g_shared_mutables.mu
685
+ gpr_mu_lock(&g_shared_mutables.mu);
686
+ grpc_millis min_timer = g_shared_mutables.min_timer;
687
+ gpr_mu_unlock(&g_shared_mutables.mu);
688
+ #endif
689
+
612
690
  if (now < min_timer) {
613
691
  if (next != nullptr) {
614
692
  *next = GPR_MIN(*next, min_timer);
615
693
  }
616
694
  if (grpc_timer_check_trace.enabled()) {
617
- gpr_log(GPR_DEBUG,
618
- "TIMER CHECK SKIP: now=%" PRIdPTR " min_timer=%" PRIdPTR, now,
619
- min_timer);
695
+ gpr_log(GPR_INFO, "TIMER CHECK SKIP: now=%" PRId64 " min_timer=%" PRId64,
696
+ now, min_timer);
620
697
  }
621
698
  return GRPC_TIMERS_CHECKED_AND_EMPTY;
622
699
  }
@@ -632,13 +709,18 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
632
709
  if (next == nullptr) {
633
710
  next_str = gpr_strdup("NULL");
634
711
  } else {
635
- gpr_asprintf(&next_str, "%" PRIdPTR, *next);
712
+ gpr_asprintf(&next_str, "%" PRId64, *next);
636
713
  }
637
- gpr_log(GPR_DEBUG,
638
- "TIMER CHECK BEGIN: now=%" PRIdPTR " next=%s tls_min=%" PRIdPTR
714
+ #if GPR_ARCH_64
715
+ gpr_log(GPR_INFO,
716
+ "TIMER CHECK BEGIN: now=%" PRId64 " next=%s tls_min=%" PRId64
639
717
  " glob_min=%" PRIdPTR,
640
- now, next_str, gpr_tls_get(&g_last_seen_min_timer),
641
- gpr_atm_no_barrier_load(&g_shared_mutables.min_timer));
718
+ now, next_str, min_timer,
719
+ gpr_atm_no_barrier_load((gpr_atm*)(&g_shared_mutables.min_timer)));
720
+ #else
721
+ gpr_log(GPR_INFO, "TIMER CHECK BEGIN: now=%" PRId64 " next=%s min=%" PRId64,
722
+ now, next_str, min_timer);
723
+ #endif
642
724
  gpr_free(next_str);
643
725
  }
644
726
  // actual code
@@ -650,9 +732,9 @@ static grpc_timer_check_result timer_check(grpc_millis* next) {
650
732
  if (next == nullptr) {
651
733
  next_str = gpr_strdup("NULL");
652
734
  } else {
653
- gpr_asprintf(&next_str, "%" PRIdPTR, *next);
735
+ gpr_asprintf(&next_str, "%" PRId64, *next);
654
736
  }
655
- gpr_log(GPR_DEBUG, "TIMER CHECK END: r=%d; next=%s", r, next_str);
737
+ gpr_log(GPR_INFO, "TIMER CHECK END: r=%d; next=%s", r, next_str);
656
738
  gpr_free(next_str);
657
739
  }
658
740
  return r;