grpc 1.45.0 → 1.47.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 (859) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +69 -110
  3. data/include/grpc/event_engine/event_engine.h +42 -7
  4. data/include/grpc/event_engine/memory_allocator.h +0 -15
  5. data/include/grpc/event_engine/port.h +1 -1
  6. data/include/grpc/event_engine/slice.h +286 -0
  7. data/include/grpc/event_engine/slice_buffer.h +112 -0
  8. data/include/grpc/grpc_security.h +11 -0
  9. data/include/grpc/impl/codegen/grpc_types.h +7 -13
  10. data/include/grpc/impl/codegen/port_platform.h +100 -36
  11. data/include/grpc/impl/codegen/slice.h +1 -1
  12. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +297 -0
  13. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +125 -0
  14. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.cc +1 -1
  15. data/src/core/ext/filters/{client_idle → channel_idle}/idle_filter_state.h +3 -3
  16. data/src/core/ext/filters/client_channel/backend_metric.cc +17 -12
  17. data/src/core/ext/filters/client_channel/backend_metric.h +19 -9
  18. data/src/core/ext/filters/client_channel/backup_poller.cc +5 -5
  19. data/src/core/ext/filters/client_channel/backup_poller.h +2 -4
  20. data/src/core/ext/filters/client_channel/channel_connectivity.cc +42 -20
  21. data/src/core/ext/filters/client_channel/client_channel.cc +223 -113
  22. data/src/core/ext/filters/client_channel/client_channel.h +28 -6
  23. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +3 -5
  24. data/src/core/ext/filters/client_channel/client_channel_channelz.h +12 -2
  25. data/src/core/ext/filters/client_channel/client_channel_factory.cc +5 -0
  26. data/src/core/ext/filters/client_channel/client_channel_factory.h +8 -0
  27. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -13
  28. data/src/core/ext/filters/client_channel/config_selector.cc +1 -0
  29. data/src/core/ext/filters/client_channel/config_selector.h +7 -5
  30. data/src/core/ext/filters/client_channel/connector.h +8 -2
  31. data/src/core/ext/filters/client_channel/dynamic_filters.cc +13 -2
  32. data/src/core/ext/filters/client_channel/dynamic_filters.h +11 -1
  33. data/src/core/ext/filters/client_channel/global_subchannel_pool.cc +2 -0
  34. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +3 -0
  35. data/src/core/ext/filters/client_channel/health/health_check_client.cc +138 -582
  36. data/src/core/ext/filters/client_channel/health/health_check_client.h +26 -160
  37. data/src/core/ext/filters/client_channel/http_proxy.cc +98 -112
  38. data/src/core/ext/filters/client_channel/http_proxy.h +20 -0
  39. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +6 -2
  40. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +1 -0
  41. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +49 -0
  42. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +12 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -0
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +9 -3
  45. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +59 -19
  46. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +4 -0
  47. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +6 -0
  48. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +10 -1
  49. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -3
  50. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +408 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +57 -0
  52. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +1038 -0
  53. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +54 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +60 -52
  55. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +277 -195
  56. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +158 -101
  57. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +2 -0
  58. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +46 -20
  59. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +182 -171
  60. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +39 -36
  61. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +117 -63
  62. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +142 -63
  63. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +6 -0
  64. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +30 -4
  65. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +37 -10
  66. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +300 -291
  67. data/src/core/ext/filters/client_channel/lb_policy.cc +4 -2
  68. data/src/core/ext/filters/client_channel/lb_policy.h +18 -24
  69. data/src/core/ext/filters/client_channel/lb_policy_factory.h +2 -0
  70. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +8 -1
  71. data/src/core/ext/filters/client_channel/lb_policy_registry.h +6 -1
  72. data/src/core/ext/filters/client_channel/local_subchannel_pool.cc +4 -0
  73. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +1 -0
  74. data/src/core/ext/filters/client_channel/proxy_mapper.h +1 -1
  75. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +2 -0
  76. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +5 -0
  77. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +23 -5
  78. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +226 -300
  79. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -1
  80. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +10 -8
  81. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +1 -1
  82. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +26 -9
  83. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +13 -4
  84. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -1
  85. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +2 -0
  86. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +2 -1
  87. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +73 -220
  88. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -14
  89. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +5 -2
  90. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +59 -13
  91. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +213 -0
  92. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +113 -0
  93. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +15 -11
  94. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +182 -79
  95. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -11
  96. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +11 -5
  97. data/src/core/ext/filters/client_channel/retry_filter.cc +60 -5
  98. data/src/core/ext/filters/client_channel/retry_service_config.cc +8 -9
  99. data/src/core/ext/filters/client_channel/retry_service_config.h +10 -1
  100. data/src/core/ext/filters/client_channel/retry_throttle.cc +1 -8
  101. data/src/core/ext/filters/client_channel/retry_throttle.h +7 -1
  102. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +22 -5
  103. data/src/core/ext/filters/client_channel/subchannel.cc +161 -165
  104. data/src/core/ext/filters/client_channel/subchannel.h +80 -20
  105. data/src/core/ext/filters/client_channel/subchannel_interface.h +41 -23
  106. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +38 -0
  107. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +12 -2
  108. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +6 -3
  109. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +558 -0
  110. data/src/core/ext/filters/client_channel/subchannel_stream_client.h +226 -0
  111. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -2
  112. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +123 -366
  113. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +24 -1
  114. data/src/core/ext/filters/http/client/http_client_filter.cc +87 -458
  115. data/src/core/ext/filters/http/client/http_client_filter.h +27 -4
  116. data/src/core/ext/filters/http/client_authority_filter.cc +21 -31
  117. data/src/core/ext/filters/http/client_authority_filter.h +6 -5
  118. data/src/core/ext/filters/http/http_filters_plugin.cc +16 -14
  119. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +1 -0
  120. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +3 -1
  121. data/src/core/ext/filters/http/server/http_server_filter.cc +80 -361
  122. data/src/core/ext/filters/http/server/http_server_filter.h +31 -2
  123. data/src/core/ext/filters/message_size/message_size_filter.cc +20 -26
  124. data/src/core/ext/filters/message_size/message_size_filter.h +2 -2
  125. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -0
  126. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +2 -8
  127. data/src/core/ext/filters/server_config_selector/server_config_selector.h +2 -2
  128. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +73 -201
  129. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +102 -135
  130. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +9 -7
  131. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +49 -19
  132. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -0
  133. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +3 -3
  134. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +2 -1
  135. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -0
  136. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +205 -45
  137. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +5 -0
  138. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -0
  139. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -1
  140. data/src/core/ext/transport/chttp2/transport/flow_control.cc +6 -2
  141. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -2
  142. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  143. data/src/core/ext/transport/chttp2/transport/frame_data.cc +7 -1
  144. data/src/core/ext/transport/chttp2/transport/frame_data.h +4 -1
  145. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +3 -0
  146. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +3 -1
  147. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +5 -0
  148. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -0
  149. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +6 -2
  150. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +3 -0
  151. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +14 -3
  152. data/src/core/ext/transport/chttp2/transport/frame_settings.h +4 -0
  153. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -1
  154. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +3 -0
  155. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +13 -15
  156. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +15 -2
  157. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +3 -0
  158. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +3 -0
  159. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +25 -7
  160. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -1
  161. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +55 -37
  162. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +38 -21
  163. data/src/core/ext/transport/chttp2/transport/http2_settings.h +0 -1
  164. data/src/core/ext/transport/chttp2/transport/internal.h +28 -5
  165. data/src/core/ext/transport/chttp2/transport/parsing.cc +35 -6
  166. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +13 -9
  167. data/src/core/ext/transport/chttp2/transport/stream_map.cc +1 -1
  168. data/src/core/ext/transport/chttp2/transport/stream_map.h +1 -0
  169. data/src/core/ext/transport/chttp2/transport/varint.h +2 -0
  170. data/src/core/ext/transport/chttp2/transport/writing.cc +62 -15
  171. data/src/core/ext/transport/inproc/inproc_transport.cc +8 -5
  172. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +27 -24
  173. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +143 -63
  174. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +37 -35
  175. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +177 -77
  176. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +115 -111
  177. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +547 -207
  178. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +5 -5
  179. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +26 -13
  180. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +5 -5
  181. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +23 -9
  182. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +7 -7
  183. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +18 -0
  184. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +4 -4
  185. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +13 -4
  186. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.c +4 -4
  187. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +9 -0
  188. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.c +49 -46
  189. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +217 -78
  190. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +3 -3
  191. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +10 -2
  192. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +12 -12
  193. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +40 -8
  194. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +5 -5
  195. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +20 -2
  196. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +55 -55
  197. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +289 -110
  198. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +133 -125
  199. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +656 -267
  200. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +24 -18
  201. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +96 -23
  202. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +185 -173
  203. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +860 -309
  204. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +3 -3
  205. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +10 -2
  206. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +44 -24
  207. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +165 -40
  208. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +72 -63
  209. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +433 -174
  210. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +33 -31
  211. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +154 -52
  212. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +5 -4
  213. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +14 -4
  214. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +89 -89
  215. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +460 -166
  216. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +76 -33
  217. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +379 -69
  218. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +2 -2
  219. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +14 -6
  220. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +5 -25
  221. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +10 -91
  222. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +5 -5
  223. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +26 -13
  224. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +70 -68
  225. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +369 -131
  226. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +94 -65
  227. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +447 -161
  228. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +4 -4
  229. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +27 -11
  230. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +104 -85
  231. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +378 -113
  232. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +2 -2
  233. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +3 -0
  234. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +6 -6
  235. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +30 -13
  236. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +7 -7
  237. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +43 -16
  238. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +8 -8
  239. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +58 -24
  240. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +4 -4
  241. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +14 -4
  242. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +18 -18
  243. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +100 -43
  244. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +31 -30
  245. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +171 -71
  246. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +32 -32
  247. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +196 -95
  248. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +2 -2
  249. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +7 -2
  250. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +53 -46
  251. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +284 -129
  252. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +56 -50
  253. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +337 -146
  254. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +13 -11
  255. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +49 -14
  256. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +4 -4
  257. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +14 -4
  258. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +5 -5
  259. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +20 -4
  260. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +33 -32
  261. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +205 -86
  262. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +34 -34
  263. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +175 -74
  264. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +56 -52
  265. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +370 -146
  266. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +27 -23
  267. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +173 -74
  268. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +362 -341
  269. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2056 -845
  270. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +11 -11
  271. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +49 -16
  272. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +56 -50
  273. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +293 -111
  274. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +3 -3
  275. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -0
  276. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +3 -3
  277. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +10 -2
  278. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +5 -5
  279. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +26 -10
  280. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +5 -5
  281. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +27 -12
  282. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +17 -16
  283. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +83 -36
  284. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +2 -2
  285. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +7 -2
  286. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +8 -8
  287. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +46 -17
  288. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +9 -9
  289. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +38 -12
  290. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +7 -7
  291. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +30 -10
  292. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +2 -2
  293. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +10 -6
  294. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +15 -15
  295. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +71 -28
  296. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +25 -25
  297. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +149 -65
  298. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +8 -7
  299. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +30 -12
  300. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +9 -9
  301. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +42 -15
  302. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +173 -144
  303. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +898 -323
  304. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +51 -45
  305. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +261 -116
  306. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +13 -13
  307. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +70 -25
  308. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +80 -55
  309. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +410 -124
  310. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +5 -5
  311. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +23 -9
  312. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  313. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +44 -44
  314. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +261 -122
  315. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +8 -8
  316. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +47 -21
  317. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +32 -32
  318. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +175 -66
  319. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +4 -4
  320. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +17 -6
  321. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +8 -8
  322. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +38 -17
  323. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +8 -8
  324. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +12 -0
  325. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +7 -7
  326. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +43 -18
  327. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +3 -3
  328. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +20 -9
  329. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +3 -3
  330. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +24 -9
  331. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +2 -2
  332. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +14 -6
  333. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +8 -8
  334. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +40 -16
  335. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +9 -9
  336. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +70 -25
  337. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +5 -5
  338. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +37 -18
  339. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +12 -12
  340. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +81 -30
  341. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +16 -16
  342. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +76 -30
  343. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +20 -20
  344. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +90 -30
  345. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +7 -7
  346. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +28 -10
  347. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +2 -2
  348. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +3 -0
  349. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +5 -5
  350. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +13 -4
  351. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +9 -9
  352. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -0
  353. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +4 -4
  354. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +9 -0
  355. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.c +5 -5
  356. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +17 -4
  357. data/src/core/ext/upb-generated/google/api/annotations.upb.c +3 -3
  358. data/src/core/ext/upb-generated/google/api/annotations.upb.h +17 -2
  359. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +70 -66
  360. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +410 -162
  361. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +80 -74
  362. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +440 -158
  363. data/src/core/ext/upb-generated/google/api/http.upb.c +17 -17
  364. data/src/core/ext/upb-generated/google/api/http.upb.h +116 -43
  365. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +4 -4
  366. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +19 -7
  367. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +3 -3
  368. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -0
  369. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +163 -162
  370. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +1157 -435
  371. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +3 -3
  372. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +10 -4
  373. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  374. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +15 -15
  375. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +108 -40
  376. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +3 -3
  377. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +10 -4
  378. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +18 -18
  379. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +27 -0
  380. data/src/core/ext/upb-generated/google/rpc/status.upb.c +4 -4
  381. data/src/core/ext/upb-generated/google/rpc/status.upb.h +19 -7
  382. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +15 -15
  383. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +65 -22
  384. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +12 -12
  385. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +49 -12
  386. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +69 -65
  387. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +364 -149
  388. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +8 -7
  389. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +20 -4
  390. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +4 -4
  391. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +6 -0
  392. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +31 -31
  393. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +150 -58
  394. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +11 -11
  395. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +51 -18
  396. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +175 -0
  397. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +764 -0
  398. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +22 -22
  399. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +97 -10
  400. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +6 -6
  401. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +23 -2
  402. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +3 -3
  403. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +10 -2
  404. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +6 -6
  405. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +27 -6
  406. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +5 -5
  407. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +20 -2
  408. data/src/core/ext/upb-generated/validate/validate.upb.c +261 -250
  409. data/src/core/ext/upb-generated/validate/validate.upb.h +1836 -663
  410. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +22 -22
  411. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +97 -10
  412. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +6 -6
  413. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +23 -2
  414. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.c +3 -3
  415. data/src/core/ext/upb-generated/xds/annotations/v3/sensitive.upb.h +10 -2
  416. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +18 -18
  417. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +70 -10
  418. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +5 -5
  419. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +20 -2
  420. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +2 -2
  421. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +3 -0
  422. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +8 -8
  423. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +38 -12
  424. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +5 -5
  425. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +27 -10
  426. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +3 -3
  427. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +10 -2
  428. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +5 -5
  429. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +21 -8
  430. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +10 -10
  431. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +71 -30
  432. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +5 -5
  433. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +16 -2
  434. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +12 -12
  435. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +69 -26
  436. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +47 -0
  437. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +109 -0
  438. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +43 -39
  439. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +255 -103
  440. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +4 -4
  441. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +19 -8
  442. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +9 -9
  443. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +70 -25
  444. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +3 -3
  445. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +10 -2
  446. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +50 -46
  447. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +195 -185
  448. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +16 -12
  449. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +129 -94
  450. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.h +10 -0
  451. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +18 -33
  452. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.h +0 -5
  453. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +163 -155
  454. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.h +5 -0
  455. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +141 -138
  456. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +26 -20
  457. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +738 -730
  458. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +271 -251
  459. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  460. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +207 -193
  461. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.h +5 -0
  462. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.c +99 -0
  463. data/src/core/ext/upbdefs-generated/src/proto/grpc/lookup/v1/rls_config.upbdefs.h +75 -0
  464. data/src/core/ext/xds/certificate_provider_store.cc +10 -0
  465. data/src/core/ext/xds/certificate_provider_store.h +9 -0
  466. data/src/core/ext/xds/xds_api.cc +20 -0
  467. data/src/core/ext/xds/xds_bootstrap.cc +2 -2
  468. data/src/core/ext/xds/xds_bootstrap.h +2 -0
  469. data/src/core/ext/xds/xds_certificate_provider.cc +5 -0
  470. data/src/core/ext/xds/xds_certificate_provider.h +8 -0
  471. data/src/core/ext/xds/xds_channel_stack_modifier.cc +5 -5
  472. data/src/core/ext/xds/xds_client.cc +125 -109
  473. data/src/core/ext/xds/xds_client.h +13 -5
  474. data/src/core/ext/xds/xds_cluster.cc +106 -16
  475. data/src/core/ext/xds/xds_cluster.h +3 -0
  476. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +142 -0
  477. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +79 -0
  478. data/src/core/ext/xds/xds_common_types.cc +9 -9
  479. data/src/core/ext/xds/xds_common_types.h +3 -3
  480. data/src/core/ext/xds/xds_endpoint.cc +12 -5
  481. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -4
  482. data/src/core/ext/xds/xds_listener.cc +20 -10
  483. data/src/core/ext/xds/xds_route_config.cc +162 -25
  484. data/src/core/ext/xds/xds_route_config.h +13 -10
  485. data/src/core/ext/xds/xds_server_config_fetcher.cc +19 -23
  486. data/src/core/lib/address_utils/sockaddr_utils.cc +56 -23
  487. data/src/core/lib/address_utils/sockaddr_utils.h +7 -4
  488. data/src/core/lib/avl/avl.h +71 -6
  489. data/src/core/lib/channel/call_finalization.h +4 -0
  490. data/src/core/lib/channel/call_tracer.h +12 -3
  491. data/src/core/lib/channel/channel_args.cc +179 -81
  492. data/src/core/lib/channel/channel_args.h +242 -11
  493. data/src/core/lib/channel/channel_args_preconditioning.cc +5 -11
  494. data/src/core/lib/channel/channel_args_preconditioning.h +4 -4
  495. data/src/core/lib/channel/channel_stack.cc +41 -3
  496. data/src/core/lib/channel/channel_stack.h +51 -8
  497. data/src/core/lib/channel/channel_stack_builder.cc +9 -84
  498. data/src/core/lib/channel/channel_stack_builder.h +35 -26
  499. data/src/core/lib/channel/channel_stack_builder_impl.cc +97 -0
  500. data/src/core/lib/channel/channel_stack_builder_impl.h +45 -0
  501. data/src/core/lib/channel/channel_trace.cc +8 -13
  502. data/src/core/lib/channel/channel_trace.h +6 -3
  503. data/src/core/lib/channel/channelz.cc +8 -13
  504. data/src/core/lib/channel/channelz.h +13 -4
  505. data/src/core/lib/channel/channelz_registry.cc +7 -14
  506. data/src/core/lib/channel/channelz_registry.h +10 -9
  507. data/src/core/lib/channel/connected_channel.cc +21 -31
  508. data/src/core/lib/channel/connected_channel.h +2 -0
  509. data/src/core/lib/channel/promise_based_filter.cc +848 -260
  510. data/src/core/lib/channel/promise_based_filter.h +215 -68
  511. data/src/core/lib/channel/status_util.cc +2 -0
  512. data/src/core/lib/channel/status_util.h +0 -3
  513. data/src/core/lib/compression/compression_internal.cc +46 -17
  514. data/src/core/lib/compression/compression_internal.h +1 -1
  515. data/src/core/lib/config/core_configuration.cc +3 -0
  516. data/src/core/lib/config/core_configuration.h +2 -1
  517. data/src/core/lib/debug/stats_data.cc +2 -6
  518. data/src/core/lib/debug/stats_data.h +18 -21
  519. data/src/core/lib/event_engine/channel_args_endpoint_config.cc +4 -2
  520. data/src/core/lib/event_engine/channel_args_endpoint_config.h +3 -2
  521. data/src/core/lib/event_engine/default_event_engine_factory.cc +8 -2
  522. data/src/core/lib/event_engine/event_engine.cc +12 -2
  523. data/src/core/lib/event_engine/event_engine_factory.h +5 -0
  524. data/src/core/lib/event_engine/handle_containers.h +67 -0
  525. data/src/core/lib/event_engine/iomgr_engine.cc +206 -0
  526. data/src/core/lib/event_engine/iomgr_engine.h +118 -0
  527. data/src/core/lib/event_engine/memory_allocator.cc +12 -4
  528. data/src/core/lib/event_engine/resolved_address.cc +4 -2
  529. data/src/core/lib/event_engine/slice.cc +102 -0
  530. data/src/core/lib/event_engine/slice_buffer.cc +50 -0
  531. data/src/core/{ext/filters/max_age/max_age_filter.h → lib/event_engine/trace.cc} +3 -11
  532. data/src/core/lib/{iomgr/endpoint_pair_event_engine.cc → event_engine/trace.h} +12 -14
  533. data/src/core/lib/gpr/log.cc +5 -0
  534. data/src/core/lib/gpr/tls.h +4 -5
  535. data/src/core/lib/gprpp/bitset.h +17 -1
  536. data/src/core/lib/gprpp/chunked_vector.h +4 -0
  537. data/src/core/lib/gprpp/construct_destruct.h +1 -0
  538. data/src/core/lib/gprpp/cpp_impl_of.h +4 -0
  539. data/src/core/lib/gprpp/dual_ref_counted.h +1 -4
  540. data/src/core/lib/gprpp/examine_stack.h +0 -1
  541. data/src/core/lib/gprpp/fork.cc +3 -6
  542. data/src/core/lib/gprpp/global_config.h +2 -4
  543. data/src/core/lib/gprpp/global_config_env.cc +3 -2
  544. data/src/core/lib/gprpp/global_config_env.h +3 -1
  545. data/src/core/lib/gprpp/global_config_generic.h +0 -4
  546. data/src/core/lib/gprpp/host_port.cc +2 -0
  547. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  548. data/src/core/lib/gprpp/match.h +75 -0
  549. data/src/core/lib/gprpp/memory.h +1 -5
  550. data/src/core/lib/gprpp/orphanable.h +1 -4
  551. data/src/core/lib/gprpp/overload.h +59 -0
  552. data/src/core/lib/gprpp/ref_counted.h +3 -3
  553. data/src/core/lib/gprpp/ref_counted_ptr.h +1 -1
  554. data/src/core/lib/gprpp/single_set_ptr.h +87 -0
  555. data/src/core/lib/gprpp/stat.h +0 -2
  556. data/src/core/lib/gprpp/stat_posix.cc +7 -2
  557. data/src/core/lib/gprpp/status_helper.cc +25 -5
  558. data/src/core/lib/gprpp/status_helper.h +4 -0
  559. data/src/core/lib/gprpp/sync.h +3 -1
  560. data/src/core/lib/gprpp/table.h +10 -0
  561. data/src/core/lib/gprpp/thd.h +2 -5
  562. data/src/core/lib/gprpp/thd_posix.cc +4 -2
  563. data/src/core/lib/gprpp/thd_windows.cc +2 -0
  564. data/src/core/lib/gprpp/time.cc +20 -0
  565. data/src/core/lib/gprpp/time.h +7 -2
  566. data/src/core/lib/gprpp/time_util.cc +4 -0
  567. data/src/core/lib/gprpp/time_util.h +1 -1
  568. data/src/core/lib/gprpp/unique_type_name.h +104 -0
  569. data/src/core/lib/http/format_request.cc +30 -2
  570. data/src/core/lib/http/format_request.h +2 -0
  571. data/src/core/lib/http/httpcli.cc +88 -81
  572. data/src/core/lib/http/httpcli.h +39 -7
  573. data/src/core/lib/http/httpcli_security_connector.cc +6 -7
  574. data/src/core/lib/http/parser.cc +80 -9
  575. data/src/core/lib/http/parser.h +14 -1
  576. data/src/core/lib/iomgr/endpoint.cc +4 -4
  577. data/src/core/lib/iomgr/endpoint.h +6 -4
  578. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -4
  579. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  580. data/src/core/lib/iomgr/ev_posix.cc +7 -11
  581. data/src/core/lib/iomgr/exec_ctx.h +1 -2
  582. data/src/core/lib/iomgr/fork_posix.cc +1 -1
  583. data/src/core/lib/iomgr/internal_errqueue.cc +38 -47
  584. data/src/core/lib/iomgr/internal_errqueue.h +1 -6
  585. data/src/core/lib/iomgr/iomgr.cc +0 -1
  586. data/src/core/lib/iomgr/{event_engine/pollset.h → iomgr_fwd.h} +9 -9
  587. data/src/core/lib/iomgr/pollset_set.h +1 -2
  588. data/src/core/lib/iomgr/port.h +25 -8
  589. data/src/core/lib/iomgr/resolve_address.cc +8 -0
  590. data/src/core/lib/iomgr/resolve_address.h +21 -14
  591. data/src/core/lib/iomgr/resolve_address_impl.h +2 -3
  592. data/src/core/lib/iomgr/resolve_address_posix.cc +8 -14
  593. data/src/core/lib/iomgr/resolve_address_posix.h +5 -2
  594. data/src/core/lib/iomgr/resolve_address_windows.cc +7 -14
  595. data/src/core/lib/iomgr/resolve_address_windows.h +5 -2
  596. data/src/core/lib/iomgr/sockaddr.h +2 -3
  597. data/src/core/lib/iomgr/sockaddr_posix.h +2 -0
  598. data/src/core/lib/iomgr/sockaddr_windows.h +2 -0
  599. data/src/core/lib/iomgr/socket_utils_common_posix.cc +3 -2
  600. data/src/core/lib/iomgr/tcp_client_cfstream.cc +10 -2
  601. data/src/core/lib/iomgr/tcp_client_posix.cc +14 -7
  602. data/src/core/lib/iomgr/tcp_client_windows.cc +13 -6
  603. data/src/core/lib/iomgr/tcp_posix.cc +77 -37
  604. data/src/core/lib/iomgr/tcp_server_posix.cc +50 -27
  605. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +30 -27
  606. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +7 -4
  607. data/src/core/lib/iomgr/tcp_server_windows.cc +13 -5
  608. data/src/core/lib/iomgr/tcp_windows.cc +7 -4
  609. data/src/core/lib/json/json.h +1 -2
  610. data/src/core/lib/json/json_reader.cc +9 -1
  611. data/src/core/lib/json/json_util.cc +7 -0
  612. data/src/core/lib/json/json_util.h +13 -4
  613. data/src/core/lib/json/json_writer.cc +6 -1
  614. data/src/core/lib/promise/activity.cc +1 -1
  615. data/src/core/lib/promise/activity.h +6 -6
  616. data/src/core/lib/promise/arena_promise.h +11 -1
  617. data/src/core/lib/promise/call_push_pull.h +148 -0
  618. data/src/core/lib/promise/context.h +1 -1
  619. data/src/core/lib/promise/detail/basic_seq.h +2 -2
  620. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  621. data/src/core/lib/promise/detail/status.h +2 -1
  622. data/src/core/lib/promise/intra_activity_waiter.h +49 -0
  623. data/src/core/lib/promise/latch.h +103 -0
  624. data/src/core/lib/promise/loop.h +1 -0
  625. data/src/core/lib/promise/race.h +0 -1
  626. data/src/core/lib/promise/seq.h +0 -2
  627. data/src/core/lib/promise/sleep.cc +2 -0
  628. data/src/core/lib/promise/sleep.h +10 -0
  629. data/src/core/lib/promise/try_seq.h +2 -2
  630. data/src/core/lib/resolver/resolver_factory.h +1 -2
  631. data/src/core/lib/resolver/server_address.cc +9 -3
  632. data/src/core/lib/resolver/server_address.h +4 -4
  633. data/src/core/lib/resource_quota/api.cc +19 -31
  634. data/src/core/lib/resource_quota/api.h +5 -2
  635. data/src/core/lib/resource_quota/arena.cc +0 -6
  636. data/src/core/lib/resource_quota/arena.h +1 -2
  637. data/src/core/lib/resource_quota/memory_quota.cc +47 -5
  638. data/src/core/lib/resource_quota/memory_quota.h +24 -5
  639. data/src/core/lib/resource_quota/resource_quota.h +16 -0
  640. data/src/core/lib/resource_quota/thread_quota.cc +2 -0
  641. data/src/core/lib/resource_quota/thread_quota.h +4 -0
  642. data/src/core/lib/security/authorization/authorization_policy_provider.h +7 -0
  643. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +12 -12
  644. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +5 -6
  645. data/src/core/lib/security/context/security_context.h +8 -1
  646. data/src/core/lib/security/credentials/alts/alts_credentials.cc +12 -5
  647. data/src/core/lib/security/credentials/alts/alts_credentials.h +4 -0
  648. data/src/core/lib/security/credentials/call_creds_util.cc +5 -3
  649. data/src/core/lib/security/credentials/call_creds_util.h +2 -2
  650. data/src/core/lib/security/credentials/channel_creds_registry.h +1 -0
  651. data/src/core/lib/security/credentials/composite/composite_credentials.cc +19 -10
  652. data/src/core/lib/security/credentials/composite/composite_credentials.h +11 -9
  653. data/src/core/lib/security/credentials/credentials.h +29 -39
  654. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +81 -0
  655. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +8 -0
  656. data/src/core/lib/security/credentials/external/external_account_credentials.cc +3 -0
  657. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -0
  658. data/src/core/lib/security/credentials/fake/fake_credentials.cc +18 -12
  659. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -5
  660. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -13
  661. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +4 -4
  662. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -4
  663. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -2
  664. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +28 -29
  665. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +57 -0
  666. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -3
  667. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +6 -2
  668. data/src/core/lib/security/credentials/local/local_credentials.cc +12 -6
  669. data/src/core/lib/security/credentials/local/local_credentials.h +4 -0
  670. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +22 -10
  671. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +14 -6
  672. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +11 -6
  673. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +8 -6
  674. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +12 -4
  675. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +8 -0
  676. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +10 -0
  677. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +47 -0
  678. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +34 -1
  679. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +66 -3
  680. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +66 -95
  681. data/src/core/lib/security/credentials/tls/tls_credentials.cc +19 -6
  682. data/src/core/lib/security/credentials/tls/tls_credentials.h +5 -5
  683. data/src/core/lib/security/credentials/xds/xds_credentials.cc +57 -50
  684. data/src/core/lib/security/credentials/xds/xds_credentials.h +31 -5
  685. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +1 -1
  686. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +1 -1
  687. data/src/core/lib/security/security_connector/local/local_security_connector.cc +2 -2
  688. data/src/core/lib/security/security_connector/security_connector.cc +1 -1
  689. data/src/core/lib/security/security_connector/security_connector.h +10 -1
  690. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -3
  691. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +4 -2
  692. data/src/core/lib/security/transport/auth_filters.h +7 -7
  693. data/src/core/lib/security/transport/client_auth_filter.cc +26 -20
  694. data/src/core/lib/security/transport/secure_endpoint.cc +213 -133
  695. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  696. data/src/core/lib/security/transport/security_handshaker.cc +11 -9
  697. data/src/core/lib/security/transport/security_handshaker.h +1 -1
  698. data/src/core/lib/security/transport/server_auth_filter.cc +3 -2
  699. data/src/core/lib/service_config/service_config.h +4 -8
  700. data/src/core/lib/service_config/service_config_call_data.h +4 -1
  701. data/src/core/lib/service_config/service_config_impl.cc +7 -0
  702. data/src/core/lib/service_config/service_config_impl.h +9 -2
  703. data/src/core/lib/service_config/service_config_parser.cc +8 -0
  704. data/src/core/lib/service_config/service_config_parser.h +7 -0
  705. data/src/core/lib/slice/b64.cc +1 -1
  706. data/src/core/lib/slice/b64.h +2 -0
  707. data/src/core/lib/slice/percent_encoding.cc +4 -1
  708. data/src/core/lib/slice/percent_encoding.h +0 -6
  709. data/src/core/lib/slice/slice.cc +2 -1
  710. data/src/core/lib/slice/slice.h +10 -5
  711. data/src/core/lib/slice/slice_api.cc +1 -1
  712. data/src/core/lib/slice/slice_buffer.cc +50 -23
  713. data/src/core/lib/slice/slice_buffer.h +106 -0
  714. data/src/core/lib/{iomgr/is_epollexclusive_available.h → slice/slice_buffer_api.cc} +11 -12
  715. data/src/core/lib/slice/slice_internal.h +4 -3
  716. data/src/core/lib/slice/slice_refcount.h +2 -3
  717. data/src/core/lib/slice/slice_refcount_base.h +2 -3
  718. data/src/core/lib/slice/slice_split.cc +3 -0
  719. data/src/core/lib/slice/slice_split.h +0 -4
  720. data/src/core/lib/slice/slice_string_helpers.cc +4 -0
  721. data/src/core/lib/slice/slice_string_helpers.h +1 -4
  722. data/src/core/lib/surface/builtins.cc +7 -2
  723. data/src/core/lib/surface/byte_buffer.cc +7 -1
  724. data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
  725. data/src/core/lib/surface/call.cc +1052 -917
  726. data/src/core/lib/surface/call.h +16 -16
  727. data/src/core/lib/surface/call_details.cc +4 -4
  728. data/src/core/lib/surface/call_log_batch.cc +7 -1
  729. data/src/core/lib/surface/call_test_only.h +4 -1
  730. data/src/core/lib/surface/channel.cc +181 -243
  731. data/src/core/lib/surface/channel.h +94 -57
  732. data/src/core/lib/surface/channel_init.cc +2 -3
  733. data/src/core/lib/surface/channel_init.h +3 -5
  734. data/src/core/lib/surface/channel_ping.cc +8 -2
  735. data/src/core/lib/surface/channel_stack_type.cc +0 -2
  736. data/src/core/lib/surface/channel_stack_type.h +0 -2
  737. data/src/core/lib/surface/completion_queue.cc +14 -6
  738. data/src/core/lib/surface/completion_queue.h +5 -1
  739. data/src/core/lib/surface/completion_queue_factory.cc +1 -0
  740. data/src/core/lib/surface/completion_queue_factory.h +1 -3
  741. data/src/core/lib/surface/event_string.cc +1 -7
  742. data/src/core/lib/surface/event_string.h +1 -1
  743. data/src/core/lib/surface/init.cc +17 -45
  744. data/src/core/lib/surface/init.h +0 -8
  745. data/src/core/lib/surface/lame_client.cc +64 -110
  746. data/src/core/lib/surface/lame_client.h +40 -2
  747. data/src/core/lib/surface/metadata_array.cc +2 -0
  748. data/src/core/lib/surface/server.cc +72 -70
  749. data/src/core/lib/surface/server.h +40 -11
  750. data/src/core/lib/surface/validate_metadata.cc +2 -5
  751. data/src/core/lib/surface/validate_metadata.h +3 -0
  752. data/src/core/lib/surface/version.cc +2 -2
  753. data/src/core/lib/transport/bdp_estimator.cc +3 -1
  754. data/src/core/lib/transport/bdp_estimator.h +2 -3
  755. data/src/core/lib/transport/byte_stream.cc +6 -3
  756. data/src/core/lib/transport/byte_stream.h +5 -1
  757. data/src/core/lib/transport/connectivity_state.cc +6 -4
  758. data/src/core/lib/transport/connectivity_state.h +2 -3
  759. data/src/core/lib/transport/error_utils.cc +4 -2
  760. data/src/core/lib/transport/error_utils.h +5 -1
  761. data/src/core/lib/{channel → transport}/handshaker.cc +9 -4
  762. data/src/core/lib/{channel → transport}/handshaker.h +13 -6
  763. data/src/core/lib/{channel → transport}/handshaker_factory.h +9 -10
  764. data/src/core/lib/{channel → transport}/handshaker_registry.cc +5 -1
  765. data/src/core/lib/{channel → transport}/handshaker_registry.h +5 -4
  766. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.cc +24 -10
  767. data/src/core/{ext/filters/client_channel → lib/transport}/http_connect_handshaker.h +3 -3
  768. data/src/core/lib/transport/metadata_batch.cc +287 -0
  769. data/src/core/lib/transport/metadata_batch.h +142 -269
  770. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  771. data/src/core/lib/transport/parsed_metadata.h +10 -3
  772. data/src/core/lib/transport/status_conversion.cc +2 -0
  773. data/src/core/lib/transport/status_conversion.h +2 -2
  774. data/src/core/lib/transport/tcp_connect_handshaker.cc +253 -0
  775. data/src/core/lib/transport/tcp_connect_handshaker.h +39 -0
  776. data/src/core/lib/transport/timeout_encoding.cc +2 -6
  777. data/src/core/lib/transport/timeout_encoding.h +5 -1
  778. data/src/core/lib/transport/transport.cc +18 -17
  779. data/src/core/lib/transport/transport.h +48 -7
  780. data/src/core/lib/transport/transport_impl.h +14 -3
  781. data/src/core/lib/transport/transport_op_string.cc +9 -10
  782. data/src/core/lib/uri/uri_parser.cc +11 -3
  783. data/src/core/lib/uri/uri_parser.h +0 -2
  784. data/src/core/plugin_registry/grpc_plugin_registry.cc +13 -4
  785. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +2 -2
  786. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -0
  787. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +2 -0
  788. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +2 -0
  789. data/src/core/tsi/ssl_transport_security.cc +75 -38
  790. data/src/core/tsi/ssl_transport_security.h +8 -2
  791. data/src/core/tsi/transport_security_interface.h +2 -0
  792. data/src/ruby/ext/grpc/extconf.rb +2 -2
  793. data/src/ruby/lib/grpc/generic/active_call.rb +7 -1
  794. data/src/ruby/lib/grpc/grpc.rb +1 -1
  795. data/src/ruby/lib/grpc/version.rb +1 -1
  796. data/src/ruby/pb/generate_proto_ruby.sh +1 -0
  797. data/src/ruby/pb/test/client.rb +769 -0
  798. data/src/ruby/pb/test/server.rb +252 -0
  799. data/src/ruby/pb/test/xds_client.rb +415 -0
  800. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  801. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  802. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +504 -0
  803. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  804. data/third_party/upb/upb/decode.c +32 -16
  805. data/third_party/upb/upb/def.c +118 -55
  806. data/third_party/upb/upb/def.h +12 -3
  807. data/third_party/upb/upb/encode.c +14 -8
  808. data/third_party/upb/upb/json_encode.c +776 -0
  809. data/third_party/upb/upb/json_encode.h +62 -0
  810. data/third_party/upb/upb/msg.c +5 -7
  811. data/third_party/upb/upb/msg.h +1 -2
  812. data/third_party/upb/upb/msg_internal.h +49 -36
  813. data/third_party/upb/upb/port_def.inc +8 -0
  814. data/third_party/upb/upb/port_undef.inc +1 -0
  815. data/third_party/upb/upb/table.c +10 -6
  816. data/third_party/upb/upb/table_internal.h +2 -0
  817. data/third_party/upb/upb/upb.h +41 -11
  818. data/third_party/zlib/crc32.c +966 -292
  819. data/third_party/zlib/crc32.h +9441 -436
  820. data/third_party/zlib/deflate.c +78 -30
  821. data/third_party/zlib/deflate.h +12 -15
  822. data/third_party/zlib/gzguts.h +3 -2
  823. data/third_party/zlib/gzlib.c +5 -3
  824. data/third_party/zlib/gzread.c +5 -7
  825. data/third_party/zlib/gzwrite.c +25 -13
  826. data/third_party/zlib/infback.c +2 -1
  827. data/third_party/zlib/inffast.c +14 -14
  828. data/third_party/zlib/inflate.c +39 -8
  829. data/third_party/zlib/inflate.h +3 -2
  830. data/third_party/zlib/inftrees.c +3 -3
  831. data/third_party/zlib/trees.c +27 -48
  832. data/third_party/zlib/zlib.h +123 -100
  833. data/third_party/zlib/zutil.c +2 -2
  834. data/third_party/zlib/zutil.h +12 -9
  835. metadata +100 -72
  836. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +0 -31
  837. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +0 -28
  838. data/src/core/ext/filters/client_idle/client_idle_filter.cc +0 -201
  839. data/src/core/ext/filters/max_age/max_age_filter.cc +0 -566
  840. data/src/core/lib/event_engine/sockaddr.cc +0 -40
  841. data/src/core/lib/event_engine/sockaddr.h +0 -44
  842. data/src/core/lib/gprpp/capture.h +0 -76
  843. data/src/core/lib/iomgr/ev_epollex_linux.cc +0 -1657
  844. data/src/core/lib/iomgr/ev_epollex_linux.h +0 -30
  845. data/src/core/lib/iomgr/event_engine/closure.cc +0 -77
  846. data/src/core/lib/iomgr/event_engine/closure.h +0 -42
  847. data/src/core/lib/iomgr/event_engine/endpoint.cc +0 -172
  848. data/src/core/lib/iomgr/event_engine/endpoint.h +0 -52
  849. data/src/core/lib/iomgr/event_engine/iomgr.cc +0 -85
  850. data/src/core/lib/iomgr/event_engine/pollset.cc +0 -87
  851. data/src/core/lib/iomgr/event_engine/promise.h +0 -51
  852. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +0 -47
  853. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +0 -37
  854. data/src/core/lib/iomgr/event_engine/resolver.cc +0 -133
  855. data/src/core/lib/iomgr/event_engine/resolver.h +0 -56
  856. data/src/core/lib/iomgr/event_engine/tcp.cc +0 -296
  857. data/src/core/lib/iomgr/event_engine/timer.cc +0 -62
  858. data/src/core/lib/iomgr/is_epollexclusive_available.cc +0 -119
  859. data/src/core/lib/iomgr/sys_epoll_wrapper.h +0 -30
@@ -1,1657 +0,0 @@
1
- /*
2
- *
3
- * Copyright 2017 gRPC authors.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License");
6
- * you may not use this file except in compliance with the License.
7
- * You may obtain a copy of the License at
8
- *
9
- * http://www.apache.org/licenses/LICENSE-2.0
10
- *
11
- * Unless required by applicable law or agreed to in writing, software
12
- * distributed under the License is distributed on an "AS IS" BASIS,
13
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- * See the License for the specific language governing permissions and
15
- * limitations under the License.
16
- *
17
- */
18
-
19
- #include <grpc/support/port_platform.h>
20
-
21
- #include <grpc/support/log.h>
22
-
23
- #include "src/core/lib/iomgr/port.h"
24
-
25
- /* This polling engine is only relevant on linux kernels supporting epoll() */
26
- #ifdef GRPC_LINUX_EPOLL_CREATE1
27
-
28
- #include <assert.h>
29
- #include <errno.h>
30
- #include <limits.h>
31
- #include <poll.h>
32
- #include <pthread.h>
33
- #include <string.h>
34
- #include <sys/epoll.h>
35
- #include <sys/socket.h>
36
- #include <sys/syscall.h>
37
- #include <unistd.h>
38
-
39
- #include <string>
40
-
41
- #include "absl/container/inlined_vector.h"
42
- #include "absl/strings/str_cat.h"
43
- #include "absl/strings/str_format.h"
44
-
45
- #include <grpc/support/alloc.h>
46
-
47
- #include "src/core/lib/debug/stats.h"
48
- #include "src/core/lib/gpr/spinlock.h"
49
- #include "src/core/lib/gpr/tls.h"
50
- #include "src/core/lib/gpr/useful.h"
51
- #include "src/core/lib/gprpp/manual_constructor.h"
52
- #include "src/core/lib/gprpp/ref_counted.h"
53
- #include "src/core/lib/gprpp/sync.h"
54
- #include "src/core/lib/iomgr/block_annotate.h"
55
- #include "src/core/lib/iomgr/ev_epollex_linux.h"
56
- #include "src/core/lib/iomgr/iomgr_internal.h"
57
- #include "src/core/lib/iomgr/is_epollexclusive_available.h"
58
- #include "src/core/lib/iomgr/lockfree_event.h"
59
- #include "src/core/lib/iomgr/sys_epoll_wrapper.h"
60
- #include "src/core/lib/iomgr/timer.h"
61
- #include "src/core/lib/iomgr/wakeup_fd_posix.h"
62
- #include "src/core/lib/profiling/timers.h"
63
-
64
- // debug aid: create workers on the heap (allows asan to spot
65
- // use-after-destruction)
66
- //#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1
67
-
68
- #define MAX_EPOLL_EVENTS 100
69
- #define MAX_FDS_IN_CACHE 32
70
-
71
- grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false,
72
- "pollable_refcount");
73
-
74
- /*******************************************************************************
75
- * pollable Declarations
76
- */
77
-
78
- typedef enum { PO_MULTI, PO_FD, PO_EMPTY } pollable_type;
79
-
80
- typedef struct pollable pollable;
81
-
82
- /// A pollable is something that can be polled: it has an epoll set to poll on,
83
- /// and a wakeup fd for kicks
84
- /// There are three broad types:
85
- /// - PO_EMPTY - the empty pollable, used before file descriptors are added to
86
- /// a pollset
87
- /// - PO_FD - a pollable containing only one FD - used to optimize single-fd
88
- /// pollsets (which are common with synchronous api usage)
89
- /// - PO_MULTI - a pollable containing many fds
90
- struct pollable {
91
- pollable_type type; // immutable
92
- grpc_core::RefCount refs;
93
-
94
- int epfd;
95
- grpc_wakeup_fd wakeup;
96
-
97
- // The following are relevant only for type PO_FD
98
- grpc_fd* owner_fd; // Set to the owner_fd if the type is PO_FD
99
- gpr_mu owner_orphan_mu; // Synchronizes access to owner_orphaned field
100
- bool owner_orphaned; // Is the owner fd orphaned
101
-
102
- grpc_pollset_set* pollset_set;
103
- pollable* next;
104
- pollable* prev;
105
-
106
- gpr_mu mu;
107
- grpc_pollset_worker* root_worker;
108
-
109
- int event_cursor;
110
- int event_count;
111
- struct epoll_event events[MAX_EPOLL_EVENTS];
112
- };
113
-
114
- static const char* pollable_type_string(pollable_type t) {
115
- switch (t) {
116
- case PO_MULTI:
117
- return "pollset";
118
- case PO_FD:
119
- return "fd";
120
- case PO_EMPTY:
121
- return "empty";
122
- }
123
- return "<invalid>";
124
- }
125
-
126
- static std::string pollable_desc(pollable* p) {
127
- return absl::StrFormat("type=%s epfd=%d wakeup=%d",
128
- pollable_type_string(p->type), p->epfd,
129
- p->wakeup.read_fd);
130
- }
131
-
132
- /// Shared empty pollable - used by pollset to poll on until the first fd is
133
- /// added
134
- static pollable* g_empty_pollable;
135
-
136
- static grpc_error_handle pollable_create(pollable_type type, pollable** p);
137
- static pollable* pollable_ref(pollable* p,
138
- const grpc_core::DebugLocation& dbg_loc,
139
- const char* reason) {
140
- p->refs.Ref(dbg_loc, reason);
141
- return p;
142
- }
143
- static void pollable_unref(pollable* p, const grpc_core::DebugLocation& dbg_loc,
144
- const char* reason) {
145
- if (p == nullptr) return;
146
- if (GPR_UNLIKELY(p != nullptr && p->refs.Unref(dbg_loc, reason))) {
147
- GRPC_FD_TRACE("pollable_unref: Closing epfd: %d", p->epfd);
148
- close(p->epfd);
149
- grpc_wakeup_fd_destroy(&p->wakeup);
150
- gpr_mu_destroy(&p->owner_orphan_mu);
151
- gpr_mu_destroy(&p->mu);
152
- gpr_free(p);
153
- }
154
- }
155
- #define POLLABLE_REF(p, r) pollable_ref((p), DEBUG_LOCATION, (r))
156
- #define POLLABLE_UNREF(p, r) pollable_unref((p), DEBUG_LOCATION, (r))
157
-
158
- /*******************************************************************************
159
- * Fd Declarations
160
- */
161
-
162
- struct grpc_fd {
163
- grpc_fd(int fd, const char* name, bool track_err)
164
- : fd(fd), track_err(track_err) {
165
- gpr_mu_init(&orphan_mu);
166
- gpr_mu_init(&pollable_mu);
167
- read_closure.InitEvent();
168
- write_closure.InitEvent();
169
- error_closure.InitEvent();
170
-
171
- std::string fd_name = absl::StrCat(name, " fd=", fd);
172
- grpc_iomgr_register_object(&iomgr_object, fd_name.c_str());
173
- #ifndef NDEBUG
174
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_fd_refcount)) {
175
- gpr_log(GPR_DEBUG, "FD %d %p create %s", fd, this, fd_name.c_str());
176
- }
177
- #endif
178
- }
179
-
180
- // This is really the dtor, but the poller threads waking up from
181
- // epoll_wait() may access the (read|write|error)_closure after destruction.
182
- // Since the object will be added to the free pool, this behavior is
183
- // not going to cause issues, except spurious events if the FD is reused
184
- // while the race happens.
185
- void destroy() {
186
- grpc_iomgr_unregister_object(&iomgr_object);
187
-
188
- POLLABLE_UNREF(pollable_obj, "fd_pollable");
189
-
190
- // To clear out the allocations of pollset_fds, we need to swap its
191
- // contents with a newly-constructed (and soon to be destructed) local
192
- // variable of its same type. This is because InlinedVector::clear is _not_
193
- // guaranteed to actually free up allocations and this is important since
194
- // this object doesn't have a conventional destructor.
195
- absl::InlinedVector<int, 1> pollset_fds_tmp;
196
- pollset_fds_tmp.swap(pollset_fds);
197
-
198
- gpr_mu_destroy(&pollable_mu);
199
- gpr_mu_destroy(&orphan_mu);
200
-
201
- read_closure.DestroyEvent();
202
- write_closure.DestroyEvent();
203
- error_closure.DestroyEvent();
204
-
205
- invalidate();
206
- }
207
-
208
- #ifndef NDEBUG
209
- /* Since an fd is never really destroyed (i.e gpr_free() is not called), it is
210
- * hard-to-debug cases where fd fields are accessed even after calling
211
- * fd_destroy(). The following invalidates fd fields to make catching such
212
- * errors easier */
213
- void invalidate() {
214
- fd = -1;
215
- gpr_atm_no_barrier_store(&refst, -1);
216
- memset(&orphan_mu, -1, sizeof(orphan_mu));
217
- memset(&pollable_mu, -1, sizeof(pollable_mu));
218
- pollable_obj = nullptr;
219
- on_done_closure = nullptr;
220
- memset(&iomgr_object, -1, sizeof(iomgr_object));
221
- track_err = false;
222
- }
223
- #else
224
- void invalidate() {}
225
- #endif
226
-
227
- int fd;
228
-
229
- // refst format:
230
- // bit 0 : 1=Active / 0=Orphaned
231
- // bits 1-n : refcount
232
- // Ref/Unref by two to avoid altering the orphaned bit
233
- gpr_atm refst = 1;
234
-
235
- gpr_mu orphan_mu;
236
-
237
- // Protects pollable_obj and pollset_fds.
238
- gpr_mu pollable_mu;
239
- absl::InlinedVector<int, 1> pollset_fds; // Used in PO_MULTI.
240
- pollable* pollable_obj = nullptr; // Used in PO_FD.
241
-
242
- grpc_core::LockfreeEvent read_closure;
243
- grpc_core::LockfreeEvent write_closure;
244
- grpc_core::LockfreeEvent error_closure;
245
-
246
- struct grpc_fd* freelist_next = nullptr;
247
- grpc_closure* on_done_closure = nullptr;
248
-
249
- grpc_iomgr_object iomgr_object;
250
-
251
- // Do we need to track EPOLLERR events separately?
252
- bool track_err;
253
- };
254
-
255
- static void fd_global_init(void);
256
- static void fd_global_shutdown(void);
257
-
258
- /*******************************************************************************
259
- * Pollset Declarations
260
- */
261
-
262
- struct pwlink {
263
- grpc_pollset_worker* next;
264
- grpc_pollset_worker* prev;
265
- };
266
- typedef enum { PWLINK_POLLABLE = 0, PWLINK_POLLSET, PWLINK_COUNT } pwlinks;
267
-
268
- struct grpc_pollset_worker {
269
- bool kicked;
270
- bool initialized_cv;
271
- #ifndef NDEBUG
272
- // debug aid: which thread started this worker
273
- pid_t originator;
274
- #endif
275
- gpr_cv cv;
276
- grpc_pollset* pollset;
277
- pollable* pollable_obj;
278
-
279
- pwlink links[PWLINK_COUNT];
280
- };
281
-
282
- struct grpc_pollset {
283
- gpr_mu mu;
284
- gpr_atm worker_count;
285
- gpr_atm active_pollable_type;
286
- pollable* active_pollable;
287
- bool kicked_without_poller;
288
- grpc_closure* shutdown_closure;
289
- bool already_shutdown;
290
- grpc_pollset_worker* root_worker;
291
- int containing_pollset_set_count;
292
- };
293
-
294
- /*******************************************************************************
295
- * Pollset-set Declarations
296
- */
297
-
298
- struct grpc_pollset_set {
299
- grpc_core::RefCount refs;
300
- gpr_mu mu;
301
- grpc_pollset_set* parent;
302
-
303
- size_t pollset_count;
304
- size_t pollset_capacity;
305
- grpc_pollset** pollsets;
306
-
307
- size_t fd_count;
308
- size_t fd_capacity;
309
- grpc_fd** fds;
310
- };
311
-
312
- /*******************************************************************************
313
- * Common helpers
314
- */
315
-
316
- static bool append_error(grpc_error_handle* composite, grpc_error_handle error,
317
- const char* desc) {
318
- if (error == GRPC_ERROR_NONE) return true;
319
- if (*composite == GRPC_ERROR_NONE) {
320
- *composite = GRPC_ERROR_CREATE_FROM_COPIED_STRING(desc);
321
- }
322
- *composite = grpc_error_add_child(*composite, error);
323
- return false;
324
- }
325
-
326
- /*******************************************************************************
327
- * Fd Definitions
328
- */
329
-
330
- /* We need to keep a freelist not because of any concerns of malloc performance
331
- * but instead so that implementations with multiple threads in (for example)
332
- * epoll_wait deal with the race between pollset removal and incoming poll
333
- * notifications.
334
- *
335
- * The problem is that the poller ultimately holds a reference to this
336
- * object, so it is very difficult to know when is safe to free it, at least
337
- * without some expensive synchronization.
338
- *
339
- * If we keep the object freelisted, in the worst case losing this race just
340
- * becomes a spurious read notification on a reused fd.
341
- */
342
-
343
- static grpc_fd* fd_freelist = nullptr;
344
- static gpr_mu fd_freelist_mu;
345
-
346
- #ifndef NDEBUG
347
- #define REF_BY(fd, n, reason) ref_by(fd, n, reason, __FILE__, __LINE__)
348
- #define UNREF_BY(fd, n, reason) unref_by(fd, n, reason, __FILE__, __LINE__)
349
- static void ref_by(grpc_fd* fd, int n, const char* reason, const char* file,
350
- int line) {
351
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_fd_refcount)) {
352
- gpr_log(GPR_DEBUG,
353
- "FD %d %p ref %d %" PRIdPTR " -> %" PRIdPTR " [%s; %s:%d]",
354
- fd->fd, fd, n, gpr_atm_no_barrier_load(&fd->refst),
355
- gpr_atm_no_barrier_load(&fd->refst) + n, reason, file, line);
356
- }
357
- #else
358
- #define REF_BY(fd, n, reason) \
359
- do { \
360
- ref_by(fd, n); \
361
- (void)(reason); \
362
- } while (0)
363
- #define UNREF_BY(fd, n, reason) \
364
- do { \
365
- unref_by(fd, n); \
366
- (void)(reason); \
367
- } while (0)
368
- static void ref_by(grpc_fd* fd, int n) {
369
- #endif
370
- GPR_ASSERT(gpr_atm_no_barrier_fetch_add(&fd->refst, n) > 0);
371
- }
372
-
373
- /* Uninitialize and add to the freelist */
374
- static void fd_destroy(void* arg, grpc_error_handle /*error*/) {
375
- grpc_fd* fd = static_cast<grpc_fd*>(arg);
376
- fd->destroy();
377
-
378
- /* Add the fd to the freelist */
379
- gpr_mu_lock(&fd_freelist_mu);
380
- fd->freelist_next = fd_freelist;
381
- fd_freelist = fd;
382
- gpr_mu_unlock(&fd_freelist_mu);
383
- }
384
-
385
- #ifndef NDEBUG
386
- static void unref_by(grpc_fd* fd, int n, const char* reason, const char* file,
387
- int line) {
388
- if (GRPC_TRACE_FLAG_ENABLED(grpc_trace_fd_refcount)) {
389
- gpr_log(GPR_DEBUG,
390
- "FD %d %p unref %d %" PRIdPTR " -> %" PRIdPTR " [%s; %s:%d]",
391
- fd->fd, fd, n, gpr_atm_no_barrier_load(&fd->refst),
392
- gpr_atm_no_barrier_load(&fd->refst) - n, reason, file, line);
393
- }
394
- #else
395
- static void unref_by(grpc_fd* fd, int n) {
396
- #endif
397
- gpr_atm old = gpr_atm_full_fetch_add(&fd->refst, -n);
398
- if (old == n) {
399
- grpc_core::ExecCtx::Run(
400
- DEBUG_LOCATION,
401
- GRPC_CLOSURE_CREATE(fd_destroy, fd, grpc_schedule_on_exec_ctx),
402
- GRPC_ERROR_NONE);
403
- } else {
404
- GPR_ASSERT(old > n);
405
- }
406
- }
407
-
408
- static void fd_global_init(void) { gpr_mu_init(&fd_freelist_mu); }
409
-
410
- static void fd_global_shutdown(void) {
411
- // TODO(guantaol): We don't have a reasonable explanation about this
412
- // lock()/unlock() pattern. It can be a valid barrier if there is at most one
413
- // pending lock() at this point. Otherwise, there is still a possibility of
414
- // use-after-free race. Need to reason about the code and/or clean it up.
415
- gpr_mu_lock(&fd_freelist_mu);
416
- gpr_mu_unlock(&fd_freelist_mu);
417
- while (fd_freelist != nullptr) {
418
- grpc_fd* fd = fd_freelist;
419
- fd_freelist = fd_freelist->freelist_next;
420
- gpr_free(fd);
421
- }
422
- gpr_mu_destroy(&fd_freelist_mu);
423
- }
424
-
425
- static grpc_fd* fd_create(int fd, const char* name, bool track_err) {
426
- grpc_fd* new_fd = nullptr;
427
-
428
- gpr_mu_lock(&fd_freelist_mu);
429
- if (fd_freelist != nullptr) {
430
- new_fd = fd_freelist;
431
- fd_freelist = fd_freelist->freelist_next;
432
- }
433
- gpr_mu_unlock(&fd_freelist_mu);
434
-
435
- if (new_fd == nullptr) {
436
- new_fd = static_cast<grpc_fd*>(gpr_malloc(sizeof(grpc_fd)));
437
- }
438
-
439
- return new (new_fd) grpc_fd(fd, name, track_err);
440
- }
441
-
442
- static int fd_wrapped_fd(grpc_fd* fd) {
443
- int ret_fd = fd->fd;
444
- return (gpr_atm_acq_load(&fd->refst) & 1) ? ret_fd : -1;
445
- }
446
-
447
- static void fd_orphan(grpc_fd* fd, grpc_closure* on_done, int* release_fd,
448
- const char* reason) {
449
- bool is_fd_closed = false;
450
-
451
- gpr_mu_lock(&fd->orphan_mu);
452
-
453
- // Get the fd->pollable_obj and set the owner_orphaned on that pollable to
454
- // true so that the pollable will no longer access its owner_fd field.
455
- gpr_mu_lock(&fd->pollable_mu);
456
- pollable* pollable_obj = fd->pollable_obj;
457
-
458
- if (pollable_obj) {
459
- gpr_mu_lock(&pollable_obj->owner_orphan_mu);
460
- pollable_obj->owner_orphaned = true;
461
- }
462
-
463
- fd->on_done_closure = on_done;
464
-
465
- /* If release_fd is not NULL, we should be relinquishing control of the file
466
- descriptor fd->fd (but we still own the grpc_fd structure). */
467
- if (release_fd != nullptr) {
468
- // Remove the FD from all epolls sets, before releasing it.
469
- // Otherwise, we will receive epoll events after we release the FD.
470
- epoll_event ev_fd;
471
- memset(&ev_fd, 0, sizeof(ev_fd));
472
- if (pollable_obj != nullptr) { // For PO_FD.
473
- epoll_ctl(pollable_obj->epfd, EPOLL_CTL_DEL, fd->fd, &ev_fd);
474
- }
475
- for (size_t i = 0; i < fd->pollset_fds.size(); ++i) { // For PO_MULTI.
476
- const int epfd = fd->pollset_fds[i];
477
- epoll_ctl(epfd, EPOLL_CTL_DEL, fd->fd, &ev_fd);
478
- }
479
- *release_fd = fd->fd;
480
- } else {
481
- close(fd->fd);
482
- is_fd_closed = true;
483
- }
484
-
485
- // TODO(sreek): handle fd removal (where is_fd_closed=false)
486
- if (!is_fd_closed) {
487
- GRPC_FD_TRACE("epoll_fd %p (%d) was orphaned but not closed.", fd, fd->fd);
488
- }
489
-
490
- /* Remove the active status but keep referenced. We want this grpc_fd struct
491
- to be alive (and not added to freelist) until the end of this function */
492
- REF_BY(fd, 1, reason);
493
-
494
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, fd->on_done_closure, GRPC_ERROR_NONE);
495
-
496
- if (pollable_obj) {
497
- gpr_mu_unlock(&pollable_obj->owner_orphan_mu);
498
- }
499
-
500
- gpr_mu_unlock(&fd->pollable_mu);
501
- gpr_mu_unlock(&fd->orphan_mu);
502
-
503
- UNREF_BY(fd, 2, reason); /* Drop the reference */
504
- }
505
-
506
- static bool fd_is_shutdown(grpc_fd* fd) {
507
- return fd->read_closure.IsShutdown();
508
- }
509
-
510
- /* Might be called multiple times */
511
- static void fd_shutdown(grpc_fd* fd, grpc_error_handle why) {
512
- if (fd->read_closure.SetShutdown(GRPC_ERROR_REF(why))) {
513
- if (shutdown(fd->fd, SHUT_RDWR)) {
514
- if (errno != ENOTCONN) {
515
- gpr_log(GPR_ERROR, "Error shutting down fd %d. errno: %d",
516
- grpc_fd_wrapped_fd(fd), errno);
517
- }
518
- }
519
- fd->write_closure.SetShutdown(GRPC_ERROR_REF(why));
520
- fd->error_closure.SetShutdown(GRPC_ERROR_REF(why));
521
- }
522
- GRPC_ERROR_UNREF(why);
523
- }
524
-
525
- static void fd_notify_on_read(grpc_fd* fd, grpc_closure* closure) {
526
- fd->read_closure.NotifyOn(closure);
527
- }
528
-
529
- static void fd_notify_on_write(grpc_fd* fd, grpc_closure* closure) {
530
- fd->write_closure.NotifyOn(closure);
531
- }
532
-
533
- static void fd_notify_on_error(grpc_fd* fd, grpc_closure* closure) {
534
- fd->error_closure.NotifyOn(closure);
535
- }
536
-
537
- static bool fd_has_pollset(grpc_fd* fd, grpc_pollset* pollset) {
538
- const int epfd = pollset->active_pollable->epfd;
539
- grpc_core::MutexLockForGprMu lock(&fd->pollable_mu);
540
- for (size_t i = 0; i < fd->pollset_fds.size(); ++i) {
541
- if (fd->pollset_fds[i] == epfd) {
542
- return true;
543
- }
544
- }
545
- return false;
546
- }
547
-
548
- static void fd_add_pollset(grpc_fd* fd, grpc_pollset* pollset) {
549
- const int epfd = pollset->active_pollable->epfd;
550
- grpc_core::MutexLockForGprMu lock(&fd->pollable_mu);
551
- fd->pollset_fds.push_back(epfd);
552
- }
553
-
554
- /*******************************************************************************
555
- * Pollable Definitions
556
- */
557
-
558
- static grpc_error_handle pollable_create(pollable_type type, pollable** p) {
559
- *p = nullptr;
560
-
561
- int epfd = epoll_create1(EPOLL_CLOEXEC);
562
- if (epfd == -1) {
563
- return GRPC_OS_ERROR(errno, "epoll_create1");
564
- }
565
- GRPC_FD_TRACE("Pollable_create: created epfd: %d (type: %d)", epfd, type);
566
- *p = static_cast<pollable*>(gpr_malloc(sizeof(**p)));
567
- grpc_error_handle err = grpc_wakeup_fd_init(&(*p)->wakeup);
568
- if (err != GRPC_ERROR_NONE) {
569
- GRPC_FD_TRACE(
570
- "Pollable_create: closed epfd: %d (type: %d). wakeupfd_init error",
571
- epfd, type);
572
- close(epfd);
573
- gpr_free(*p);
574
- *p = nullptr;
575
- return err;
576
- }
577
- struct epoll_event ev;
578
- ev.events = static_cast<uint32_t>(EPOLLIN | EPOLLET);
579
- ev.data.ptr =
580
- reinterpret_cast<void*>(1 | reinterpret_cast<intptr_t>(&(*p)->wakeup));
581
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, (*p)->wakeup.read_fd, &ev) != 0) {
582
- err = GRPC_OS_ERROR(errno, "epoll_ctl");
583
- GRPC_FD_TRACE(
584
- "Pollable_create: closed epfd: %d (type: %d). epoll_ctl error", epfd,
585
- type);
586
- close(epfd);
587
- grpc_wakeup_fd_destroy(&(*p)->wakeup);
588
- gpr_free(*p);
589
- *p = nullptr;
590
- return err;
591
- }
592
-
593
- (*p)->type = type;
594
- new (&(*p)->refs) grpc_core::RefCount(
595
- 1, GRPC_TRACE_FLAG_ENABLED(grpc_trace_pollable_refcount)
596
- ? "pollable_refcount"
597
- : nullptr);
598
- gpr_mu_init(&(*p)->mu);
599
- (*p)->epfd = epfd;
600
- (*p)->owner_fd = nullptr;
601
- gpr_mu_init(&(*p)->owner_orphan_mu);
602
- (*p)->owner_orphaned = false;
603
- (*p)->pollset_set = nullptr;
604
- (*p)->next = (*p)->prev = *p;
605
- (*p)->root_worker = nullptr;
606
- (*p)->event_cursor = 0;
607
- (*p)->event_count = 0;
608
- return GRPC_ERROR_NONE;
609
- }
610
-
611
- static grpc_error_handle pollable_add_fd(pollable* p, grpc_fd* fd) {
612
- grpc_error_handle error = GRPC_ERROR_NONE;
613
- static const char* err_desc = "pollable_add_fd";
614
- const int epfd = p->epfd;
615
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
616
- gpr_log(GPR_INFO, "add fd %p (%d) to pollable %p", fd, fd->fd, p);
617
- }
618
-
619
- struct epoll_event ev_fd;
620
- ev_fd.events =
621
- static_cast<uint32_t>(EPOLLET | EPOLLIN | EPOLLOUT | EPOLLEXCLUSIVE);
622
- /* Use the second least significant bit of ev_fd.data.ptr to store track_err
623
- * to avoid synchronization issues when accessing it after receiving an event.
624
- * Accessing fd would be a data race there because the fd might have been
625
- * returned to the free list at that point. */
626
- ev_fd.data.ptr = reinterpret_cast<void*>(reinterpret_cast<intptr_t>(fd) |
627
- (fd->track_err ? 2 : 0));
628
- GRPC_STATS_INC_SYSCALL_EPOLL_CTL();
629
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd->fd, &ev_fd) != 0) {
630
- switch (errno) {
631
- case EEXIST:
632
- break;
633
- default:
634
- append_error(&error, GRPC_OS_ERROR(errno, "epoll_ctl"), err_desc);
635
- }
636
- }
637
-
638
- return error;
639
- }
640
-
641
- /*******************************************************************************
642
- * Pollset Definitions
643
- */
644
-
645
- static GPR_THREAD_LOCAL(grpc_pollset*) g_current_thread_pollset;
646
- static GPR_THREAD_LOCAL(grpc_pollset_worker*) g_current_thread_worker;
647
-
648
- /* Global state management */
649
- static grpc_error_handle pollset_global_init(void) {
650
- return pollable_create(PO_EMPTY, &g_empty_pollable);
651
- }
652
-
653
- static void pollset_global_shutdown(void) {
654
- POLLABLE_UNREF(g_empty_pollable, "g_empty_pollable");
655
- }
656
-
657
- /* pollset->mu must be held while calling this function */
658
- static void pollset_maybe_finish_shutdown(grpc_pollset* pollset) {
659
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
660
- gpr_log(GPR_INFO,
661
- "PS:%p (pollable:%p) maybe_finish_shutdown sc=%p (target:!NULL) "
662
- "rw=%p (target:NULL) cpsc=%d (target:0)",
663
- pollset, pollset->active_pollable, pollset->shutdown_closure,
664
- pollset->root_worker, pollset->containing_pollset_set_count);
665
- }
666
- if (pollset->shutdown_closure != nullptr && pollset->root_worker == nullptr &&
667
- pollset->containing_pollset_set_count == 0) {
668
- GPR_TIMER_MARK("pollset_finish_shutdown", 0);
669
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, pollset->shutdown_closure,
670
- GRPC_ERROR_NONE);
671
- pollset->shutdown_closure = nullptr;
672
- pollset->already_shutdown = true;
673
- }
674
- }
675
-
676
- /* pollset->mu must be held before calling this function,
677
- * pollset->active_pollable->mu & specific_worker->pollable_obj->mu must not be
678
- * held */
679
- static grpc_error_handle kick_one_worker(grpc_pollset_worker* specific_worker) {
680
- GPR_TIMER_SCOPE("kick_one_worker", 0);
681
- pollable* p = specific_worker->pollable_obj;
682
- grpc_core::MutexLockForGprMu lock(&p->mu);
683
- GPR_ASSERT(specific_worker != nullptr);
684
- if (specific_worker->kicked) {
685
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
686
- gpr_log(GPR_INFO, "PS:%p kicked_specific_but_already_kicked", p);
687
- }
688
- GRPC_STATS_INC_POLLSET_KICKED_AGAIN();
689
- return GRPC_ERROR_NONE;
690
- }
691
- if (g_current_thread_worker == specific_worker) {
692
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
693
- gpr_log(GPR_INFO, "PS:%p kicked_specific_but_awake", p);
694
- }
695
- GRPC_STATS_INC_POLLSET_KICK_OWN_THREAD();
696
- specific_worker->kicked = true;
697
- return GRPC_ERROR_NONE;
698
- }
699
- if (specific_worker == p->root_worker) {
700
- GRPC_STATS_INC_POLLSET_KICK_WAKEUP_FD();
701
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
702
- gpr_log(GPR_INFO, "PS:%p kicked_specific_via_wakeup_fd", p);
703
- }
704
- specific_worker->kicked = true;
705
- grpc_error_handle error = grpc_wakeup_fd_wakeup(&p->wakeup);
706
- return error;
707
- }
708
- if (specific_worker->initialized_cv) {
709
- GRPC_STATS_INC_POLLSET_KICK_WAKEUP_CV();
710
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
711
- gpr_log(GPR_INFO, "PS:%p kicked_specific_via_cv", p);
712
- }
713
- specific_worker->kicked = true;
714
- gpr_cv_signal(&specific_worker->cv);
715
- return GRPC_ERROR_NONE;
716
- }
717
- // we can get here during end_worker after removing specific_worker from the
718
- // pollable list but before removing it from the pollset list
719
- return GRPC_ERROR_NONE;
720
- }
721
-
722
- static grpc_error_handle pollset_kick(grpc_pollset* pollset,
723
- grpc_pollset_worker* specific_worker) {
724
- GPR_TIMER_SCOPE("pollset_kick", 0);
725
- GRPC_STATS_INC_POLLSET_KICK();
726
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
727
- gpr_log(GPR_INFO,
728
- "PS:%p kick %p tls_pollset=%p tls_worker=%p pollset.root_worker=%p",
729
- pollset, specific_worker,
730
- static_cast<void*>(g_current_thread_pollset),
731
- static_cast<void*>(g_current_thread_worker), pollset->root_worker);
732
- }
733
- if (specific_worker == nullptr) {
734
- if (g_current_thread_pollset != pollset) {
735
- if (pollset->root_worker == nullptr) {
736
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
737
- gpr_log(GPR_INFO, "PS:%p kicked_any_without_poller", pollset);
738
- }
739
- GRPC_STATS_INC_POLLSET_KICKED_WITHOUT_POLLER();
740
- pollset->kicked_without_poller = true;
741
- return GRPC_ERROR_NONE;
742
- } else {
743
- // We've been asked to kick a poller, but we haven't been told which one
744
- // ... any will do
745
- // We look at the pollset worker list because:
746
- // 1. the pollable list may include workers from other pollers, so we'd
747
- // need to do an O(N) search
748
- // 2. we'd additionally need to take the pollable lock, which we've so
749
- // far avoided
750
- // Now, we would prefer to wake a poller in cv_wait, and not in
751
- // epoll_wait (since the latter would imply the need to do an additional
752
- // wakeup)
753
- // We know that if a worker is at the root of a pollable, it's (likely)
754
- // also the root of a pollset, and we know that if a worker is NOT at
755
- // the root of a pollset, it's (likely) not at the root of a pollable,
756
- // so we take our chances and choose the SECOND worker enqueued against
757
- // the pollset as a worker that's likely to be in cv_wait
758
- return kick_one_worker(
759
- pollset->root_worker->links[PWLINK_POLLSET].next);
760
- }
761
- } else {
762
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
763
- gpr_log(GPR_INFO, "PS:%p kicked_any_but_awake", pollset);
764
- }
765
- GRPC_STATS_INC_POLLSET_KICK_OWN_THREAD();
766
- return GRPC_ERROR_NONE;
767
- }
768
- } else {
769
- return kick_one_worker(specific_worker);
770
- }
771
- }
772
-
773
- static grpc_error_handle pollset_kick_all(grpc_pollset* pollset) {
774
- GPR_TIMER_SCOPE("pollset_kick_all", 0);
775
- grpc_error_handle error = GRPC_ERROR_NONE;
776
- const char* err_desc = "pollset_kick_all";
777
- grpc_pollset_worker* w = pollset->root_worker;
778
- if (w != nullptr) {
779
- do {
780
- GRPC_STATS_INC_POLLSET_KICK();
781
- append_error(&error, kick_one_worker(w), err_desc);
782
- w = w->links[PWLINK_POLLSET].next;
783
- } while (w != pollset->root_worker);
784
- }
785
- return error;
786
- }
787
-
788
- static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) {
789
- gpr_mu_init(&pollset->mu);
790
- gpr_atm_no_barrier_store(&pollset->worker_count, 0);
791
- gpr_atm_no_barrier_store(&pollset->active_pollable_type, PO_EMPTY);
792
- pollset->active_pollable = POLLABLE_REF(g_empty_pollable, "pollset");
793
- pollset->kicked_without_poller = false;
794
- pollset->shutdown_closure = nullptr;
795
- pollset->already_shutdown = false;
796
- pollset->root_worker = nullptr;
797
- pollset->containing_pollset_set_count = 0;
798
- *mu = &pollset->mu;
799
- }
800
-
801
- static int poll_deadline_to_millis_timeout(grpc_core::Timestamp millis) {
802
- if (millis == grpc_core::Timestamp::InfFuture()) return -1;
803
- int64_t delta = (millis - grpc_core::ExecCtx::Get()->Now()).millis();
804
- if (delta > INT_MAX) {
805
- return INT_MAX;
806
- } else if (delta < 0) {
807
- return 0;
808
- } else {
809
- return static_cast<int>(delta);
810
- }
811
- }
812
-
813
- static void fd_become_readable(grpc_fd* fd) { fd->read_closure.SetReady(); }
814
-
815
- static void fd_become_writable(grpc_fd* fd) { fd->write_closure.SetReady(); }
816
-
817
- static void fd_has_errors(grpc_fd* fd) { fd->error_closure.SetReady(); }
818
-
819
- /* Get the pollable_obj attached to this fd. If none is attached, create a new
820
- * pollable object (of type PO_FD), attach it to the fd and return it
821
- *
822
- * Note that if a pollable object is already attached to the fd, it may be of
823
- * either PO_FD or PO_MULTI type */
824
- static grpc_error_handle get_fd_pollable(grpc_fd* fd, pollable** p) {
825
- gpr_mu_lock(&fd->pollable_mu);
826
- grpc_error_handle error = GRPC_ERROR_NONE;
827
- static const char* err_desc = "get_fd_pollable";
828
- if (fd->pollable_obj == nullptr) {
829
- if (append_error(&error, pollable_create(PO_FD, &fd->pollable_obj),
830
- err_desc)) {
831
- fd->pollable_obj->owner_fd = fd;
832
- if (!append_error(&error, pollable_add_fd(fd->pollable_obj, fd),
833
- err_desc)) {
834
- POLLABLE_UNREF(fd->pollable_obj, "fd_pollable");
835
- fd->pollable_obj = nullptr;
836
- }
837
- }
838
- }
839
- if (error == GRPC_ERROR_NONE) {
840
- GPR_ASSERT(fd->pollable_obj != nullptr);
841
- *p = POLLABLE_REF(fd->pollable_obj, "pollset");
842
- } else {
843
- GPR_ASSERT(fd->pollable_obj == nullptr);
844
- *p = nullptr;
845
- }
846
- gpr_mu_unlock(&fd->pollable_mu);
847
- return error;
848
- }
849
-
850
- /* pollset->po.mu lock must be held by the caller before calling this */
851
- static void pollset_shutdown(grpc_pollset* pollset, grpc_closure* closure) {
852
- GPR_TIMER_SCOPE("pollset_shutdown", 0);
853
- GPR_ASSERT(pollset->shutdown_closure == nullptr);
854
- pollset->shutdown_closure = closure;
855
- GRPC_LOG_IF_ERROR("pollset_shutdown", pollset_kick_all(pollset));
856
- pollset_maybe_finish_shutdown(pollset);
857
- }
858
-
859
- static grpc_error_handle pollable_process_events(grpc_pollset* pollset,
860
- pollable* pollable_obj,
861
- bool drain) {
862
- GPR_TIMER_SCOPE("pollable_process_events", 0);
863
- static const char* err_desc = "pollset_process_events";
864
- // Use a simple heuristic to determine how many fd events to process
865
- // per loop iteration. (events/workers)
866
- int handle_count = 1;
867
- int worker_count = gpr_atm_no_barrier_load(&pollset->worker_count);
868
- GPR_ASSERT(worker_count > 0);
869
- handle_count =
870
- (pollable_obj->event_count - pollable_obj->event_cursor) / worker_count;
871
- if (handle_count == 0) {
872
- handle_count = 1;
873
- }
874
- grpc_error_handle error = GRPC_ERROR_NONE;
875
- for (int i = 0; (drain || i < handle_count) &&
876
- pollable_obj->event_cursor != pollable_obj->event_count;
877
- i++) {
878
- int n = pollable_obj->event_cursor++;
879
- struct epoll_event* ev = &pollable_obj->events[n];
880
- void* data_ptr = ev->data.ptr;
881
- if (1 & reinterpret_cast<intptr_t>(data_ptr)) {
882
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
883
- gpr_log(GPR_INFO, "PS:%p got pollset_wakeup %p", pollset, data_ptr);
884
- }
885
- append_error(
886
- &error,
887
- grpc_wakeup_fd_consume_wakeup(reinterpret_cast<grpc_wakeup_fd*>(
888
- ~static_cast<intptr_t>(1) &
889
- reinterpret_cast<intptr_t>(data_ptr))),
890
- err_desc);
891
- } else {
892
- grpc_fd* fd =
893
- reinterpret_cast<grpc_fd*>(reinterpret_cast<intptr_t>(data_ptr) & ~2);
894
- bool track_err = reinterpret_cast<intptr_t>(data_ptr) & 2;
895
- bool cancel = (ev->events & EPOLLHUP) != 0;
896
- bool error = (ev->events & EPOLLERR) != 0;
897
- bool read_ev = (ev->events & (EPOLLIN | EPOLLPRI)) != 0;
898
- bool write_ev = (ev->events & EPOLLOUT) != 0;
899
- bool err_fallback = error && !track_err;
900
-
901
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
902
- gpr_log(GPR_INFO,
903
- "PS:%p got fd %p: cancel=%d read=%d "
904
- "write=%d",
905
- pollset, fd, cancel, read_ev, write_ev);
906
- }
907
- if (error && !err_fallback) {
908
- fd_has_errors(fd);
909
- }
910
- if (read_ev || cancel || err_fallback) {
911
- fd_become_readable(fd);
912
- }
913
- if (write_ev || cancel || err_fallback) {
914
- fd_become_writable(fd);
915
- }
916
- }
917
- }
918
-
919
- return error;
920
- }
921
-
922
- /* pollset_shutdown is guaranteed to be called before pollset_destroy. */
923
- static void pollset_destroy(grpc_pollset* pollset) {
924
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
925
- pollset->active_pollable = nullptr;
926
- gpr_mu_destroy(&pollset->mu);
927
- }
928
-
929
- static grpc_error_handle pollable_epoll(pollable* p,
930
- grpc_core::Timestamp deadline) {
931
- GPR_TIMER_SCOPE("pollable_epoll", 0);
932
- int timeout = poll_deadline_to_millis_timeout(deadline);
933
-
934
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
935
- gpr_log(GPR_INFO, "POLLABLE:%p[%s] poll for %dms", p,
936
- pollable_desc(p).c_str(), timeout);
937
- }
938
-
939
- if (timeout != 0) {
940
- GRPC_SCHEDULING_START_BLOCKING_REGION;
941
- }
942
- int r;
943
- do {
944
- GRPC_STATS_INC_SYSCALL_POLL();
945
- r = epoll_wait(p->epfd, p->events, MAX_EPOLL_EVENTS, timeout);
946
- } while (r < 0 && errno == EINTR);
947
- if (timeout != 0) {
948
- GRPC_SCHEDULING_END_BLOCKING_REGION;
949
- }
950
-
951
- if (r < 0) return GRPC_OS_ERROR(errno, "epoll_wait");
952
-
953
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
954
- gpr_log(GPR_INFO, "POLLABLE:%p got %d events", p, r);
955
- }
956
-
957
- p->event_cursor = 0;
958
- p->event_count = r;
959
-
960
- return GRPC_ERROR_NONE;
961
- }
962
-
963
- /* Return true if first in list */
964
- static bool worker_insert(grpc_pollset_worker** root_worker,
965
- grpc_pollset_worker* worker, pwlinks link) {
966
- if (*root_worker == nullptr) {
967
- *root_worker = worker;
968
- worker->links[link].next = worker->links[link].prev = worker;
969
- return true;
970
- } else {
971
- worker->links[link].next = *root_worker;
972
- worker->links[link].prev = worker->links[link].next->links[link].prev;
973
- worker->links[link].next->links[link].prev = worker;
974
- worker->links[link].prev->links[link].next = worker;
975
- return false;
976
- }
977
- }
978
-
979
- /* returns the new root IFF the root changed */
980
- typedef enum { WRR_NEW_ROOT, WRR_EMPTIED, WRR_REMOVED } worker_remove_result;
981
-
982
- static worker_remove_result worker_remove(grpc_pollset_worker** root_worker,
983
- grpc_pollset_worker* worker,
984
- pwlinks link) {
985
- if (worker == *root_worker) {
986
- if (worker == worker->links[link].next) {
987
- *root_worker = nullptr;
988
- return WRR_EMPTIED;
989
- } else {
990
- *root_worker = worker->links[link].next;
991
- worker->links[link].prev->links[link].next = worker->links[link].next;
992
- worker->links[link].next->links[link].prev = worker->links[link].prev;
993
- return WRR_NEW_ROOT;
994
- }
995
- } else {
996
- worker->links[link].prev->links[link].next = worker->links[link].next;
997
- worker->links[link].next->links[link].prev = worker->links[link].prev;
998
- return WRR_REMOVED;
999
- }
1000
- }
1001
-
1002
- /* Return true if this thread should poll */
1003
- static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
1004
- grpc_pollset_worker** worker_hdl,
1005
- grpc_core::Timestamp deadline) {
1006
- GPR_TIMER_SCOPE("begin_worker", 0);
1007
- bool do_poll =
1008
- (pollset->shutdown_closure == nullptr && !pollset->already_shutdown);
1009
- gpr_atm_no_barrier_fetch_add(&pollset->worker_count, 1);
1010
- if (worker_hdl != nullptr) *worker_hdl = worker;
1011
- worker->initialized_cv = false;
1012
- worker->kicked = false;
1013
- worker->pollset = pollset;
1014
- worker->pollable_obj =
1015
- POLLABLE_REF(pollset->active_pollable, "pollset_worker");
1016
- worker_insert(&pollset->root_worker, worker, PWLINK_POLLSET);
1017
- gpr_mu_lock(&worker->pollable_obj->mu);
1018
- if (!worker_insert(&worker->pollable_obj->root_worker, worker,
1019
- PWLINK_POLLABLE)) {
1020
- worker->initialized_cv = true;
1021
- gpr_cv_init(&worker->cv);
1022
- gpr_mu_unlock(&pollset->mu);
1023
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace) &&
1024
- worker->pollable_obj->root_worker != worker) {
1025
- gpr_log(GPR_INFO, "PS:%p wait %p w=%p for %dms", pollset,
1026
- worker->pollable_obj, worker,
1027
- poll_deadline_to_millis_timeout(deadline));
1028
- }
1029
- while (do_poll && worker->pollable_obj->root_worker != worker) {
1030
- if (gpr_cv_wait(&worker->cv, &worker->pollable_obj->mu,
1031
- deadline.as_timespec(GPR_CLOCK_REALTIME))) {
1032
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1033
- gpr_log(GPR_INFO, "PS:%p timeout_wait %p w=%p", pollset,
1034
- worker->pollable_obj, worker);
1035
- }
1036
- do_poll = false;
1037
- } else if (worker->kicked) {
1038
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1039
- gpr_log(GPR_INFO, "PS:%p wakeup %p w=%p", pollset,
1040
- worker->pollable_obj, worker);
1041
- }
1042
- do_poll = false;
1043
- } else if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace) &&
1044
- worker->pollable_obj->root_worker != worker) {
1045
- gpr_log(GPR_INFO, "PS:%p spurious_wakeup %p w=%p", pollset,
1046
- worker->pollable_obj, worker);
1047
- }
1048
- }
1049
- grpc_core::ExecCtx::Get()->InvalidateNow();
1050
- } else {
1051
- gpr_mu_unlock(&pollset->mu);
1052
- }
1053
- gpr_mu_unlock(&worker->pollable_obj->mu);
1054
-
1055
- return do_poll;
1056
- }
1057
-
1058
- static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker,
1059
- grpc_pollset_worker** /*worker_hdl*/) {
1060
- GPR_TIMER_SCOPE("end_worker", 0);
1061
- gpr_mu_lock(&pollset->mu);
1062
- gpr_mu_lock(&worker->pollable_obj->mu);
1063
- switch (worker_remove(&worker->pollable_obj->root_worker, worker,
1064
- PWLINK_POLLABLE)) {
1065
- case WRR_NEW_ROOT: {
1066
- // wakeup new poller
1067
- grpc_pollset_worker* new_root = worker->pollable_obj->root_worker;
1068
- GPR_ASSERT(new_root->initialized_cv);
1069
- gpr_cv_signal(&new_root->cv);
1070
- break;
1071
- }
1072
- case WRR_EMPTIED:
1073
- if (pollset->active_pollable != worker->pollable_obj) {
1074
- // pollable no longer being polled: flush events
1075
- (void)pollable_process_events(pollset, worker->pollable_obj, true);
1076
- }
1077
- break;
1078
- case WRR_REMOVED:
1079
- break;
1080
- }
1081
- gpr_mu_unlock(&worker->pollable_obj->mu);
1082
- POLLABLE_UNREF(worker->pollable_obj, "pollset_worker");
1083
- if (worker_remove(&pollset->root_worker, worker, PWLINK_POLLSET) ==
1084
- WRR_EMPTIED) {
1085
- pollset_maybe_finish_shutdown(pollset);
1086
- }
1087
- if (worker->initialized_cv) {
1088
- gpr_cv_destroy(&worker->cv);
1089
- }
1090
- gpr_atm_no_barrier_fetch_add(&pollset->worker_count, -1);
1091
- }
1092
-
1093
- #ifndef NDEBUG
1094
- static long sys_gettid(void) { return syscall(__NR_gettid); }
1095
- #endif
1096
-
1097
- /* pollset->mu lock must be held by the caller before calling this.
1098
- The function pollset_work() may temporarily release the lock (pollset->po.mu)
1099
- during the course of its execution but it will always re-acquire the lock and
1100
- ensure that it is held by the time the function returns */
1101
- static grpc_error_handle pollset_work(grpc_pollset* pollset,
1102
- grpc_pollset_worker** worker_hdl,
1103
- grpc_core::Timestamp deadline) {
1104
- GPR_TIMER_SCOPE("pollset_work", 0);
1105
- #ifdef GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP
1106
- grpc_pollset_worker* worker =
1107
- (grpc_pollset_worker*)gpr_malloc(sizeof(*worker));
1108
- #define WORKER_PTR (worker)
1109
- #else
1110
- grpc_pollset_worker worker;
1111
- #define WORKER_PTR (&worker)
1112
- #endif
1113
- #ifndef NDEBUG
1114
- WORKER_PTR->originator = sys_gettid();
1115
- #endif
1116
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1117
- gpr_log(GPR_INFO,
1118
- "PS:%p work hdl=%p worker=%p now=%" PRId64 " deadline=%" PRId64
1119
- " kwp=%d pollable=%p",
1120
- pollset, worker_hdl, WORKER_PTR,
1121
- grpc_core::ExecCtx::Get()->Now().milliseconds_after_process_epoch(),
1122
- deadline.milliseconds_after_process_epoch(),
1123
- pollset->kicked_without_poller, pollset->active_pollable);
1124
- }
1125
- static const char* err_desc = "pollset_work";
1126
- grpc_error_handle error = GRPC_ERROR_NONE;
1127
- if (pollset->kicked_without_poller) {
1128
- pollset->kicked_without_poller = false;
1129
- } else {
1130
- if (begin_worker(pollset, WORKER_PTR, worker_hdl, deadline)) {
1131
- g_current_thread_pollset = pollset;
1132
- g_current_thread_worker = WORKER_PTR;
1133
- if (WORKER_PTR->pollable_obj->event_cursor ==
1134
- WORKER_PTR->pollable_obj->event_count) {
1135
- append_error(&error, pollable_epoll(WORKER_PTR->pollable_obj, deadline),
1136
- err_desc);
1137
- }
1138
- append_error(
1139
- &error,
1140
- pollable_process_events(pollset, WORKER_PTR->pollable_obj, false),
1141
- err_desc);
1142
- grpc_core::ExecCtx::Get()->Flush();
1143
- g_current_thread_pollset = nullptr;
1144
- g_current_thread_worker = nullptr;
1145
- }
1146
- end_worker(pollset, WORKER_PTR, worker_hdl);
1147
- }
1148
- #ifdef GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP
1149
- gpr_free(worker);
1150
- #endif
1151
- #undef WORKER_PTR
1152
- return error;
1153
- }
1154
-
1155
- static grpc_error_handle pollset_transition_pollable_from_empty_to_fd_locked(
1156
- grpc_pollset* pollset, grpc_fd* fd) {
1157
- static const char* err_desc = "pollset_transition_pollable_from_empty_to_fd";
1158
- grpc_error_handle error = GRPC_ERROR_NONE;
1159
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1160
- gpr_log(GPR_INFO,
1161
- "PS:%p add fd %p (%d); transition pollable from empty to fd",
1162
- pollset, fd, fd->fd);
1163
- }
1164
- append_error(&error, pollset_kick_all(pollset), err_desc);
1165
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1166
- append_error(&error, get_fd_pollable(fd, &pollset->active_pollable),
1167
- err_desc);
1168
- return error;
1169
- }
1170
-
1171
- static grpc_error_handle pollset_transition_pollable_from_fd_to_multi_locked(
1172
- grpc_pollset* pollset, grpc_fd* and_add_fd) {
1173
- static const char* err_desc = "pollset_transition_pollable_from_fd_to_multi";
1174
- grpc_error_handle error = GRPC_ERROR_NONE;
1175
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1176
- gpr_log(
1177
- GPR_INFO,
1178
- "PS:%p add fd %p (%d); transition pollable from fd %p to multipoller",
1179
- pollset, and_add_fd, and_add_fd ? and_add_fd->fd : -1,
1180
- pollset->active_pollable->owner_fd);
1181
- }
1182
- append_error(&error, pollset_kick_all(pollset), err_desc);
1183
- grpc_fd* initial_fd = pollset->active_pollable->owner_fd;
1184
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1185
- pollset->active_pollable = nullptr;
1186
- if (append_error(&error, pollable_create(PO_MULTI, &pollset->active_pollable),
1187
- err_desc)) {
1188
- append_error(&error, pollable_add_fd(pollset->active_pollable, initial_fd),
1189
- err_desc);
1190
- if (and_add_fd != nullptr) {
1191
- append_error(&error,
1192
- pollable_add_fd(pollset->active_pollable, and_add_fd),
1193
- err_desc);
1194
- }
1195
- }
1196
- return error;
1197
- }
1198
-
1199
- /* expects pollsets locked, flag whether fd is locked or not */
1200
- static grpc_error_handle pollset_add_fd_locked(grpc_pollset* pollset,
1201
- grpc_fd* fd) {
1202
- grpc_error_handle error = GRPC_ERROR_NONE;
1203
- pollable* po_at_start =
1204
- POLLABLE_REF(pollset->active_pollable, "pollset_add_fd");
1205
- switch (pollset->active_pollable->type) {
1206
- case PO_EMPTY:
1207
- /* empty pollable --> single fd pollable */
1208
- error = pollset_transition_pollable_from_empty_to_fd_locked(pollset, fd);
1209
- break;
1210
- case PO_FD:
1211
- gpr_mu_lock(&po_at_start->owner_orphan_mu);
1212
- if (po_at_start->owner_orphaned) {
1213
- error =
1214
- pollset_transition_pollable_from_empty_to_fd_locked(pollset, fd);
1215
- } else {
1216
- /* fd --> multipoller */
1217
- error =
1218
- pollset_transition_pollable_from_fd_to_multi_locked(pollset, fd);
1219
- }
1220
- gpr_mu_unlock(&po_at_start->owner_orphan_mu);
1221
- break;
1222
- case PO_MULTI:
1223
- error = pollable_add_fd(pollset->active_pollable, fd);
1224
- break;
1225
- }
1226
- if (error != GRPC_ERROR_NONE) {
1227
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1228
- pollset->active_pollable = po_at_start;
1229
- } else {
1230
- gpr_atm_rel_store(&pollset->active_pollable_type,
1231
- pollset->active_pollable->type);
1232
- POLLABLE_UNREF(po_at_start, "pollset_add_fd");
1233
- }
1234
- return error;
1235
- }
1236
-
1237
- static grpc_error_handle pollset_as_multipollable_locked(
1238
- grpc_pollset* pollset, pollable** pollable_obj) {
1239
- grpc_error_handle error = GRPC_ERROR_NONE;
1240
- pollable* po_at_start =
1241
- POLLABLE_REF(pollset->active_pollable, "pollset_as_multipollable");
1242
- switch (pollset->active_pollable->type) {
1243
- case PO_EMPTY:
1244
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1245
- error = pollable_create(PO_MULTI, &pollset->active_pollable);
1246
- /* Any workers currently polling on this pollset must now be woked up so
1247
- * that they can pick up the new active_pollable */
1248
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1249
- gpr_log(GPR_INFO,
1250
- "PS:%p active pollable transition from empty to multi",
1251
- pollset);
1252
- }
1253
- static const char* err_desc =
1254
- "pollset_as_multipollable_locked: empty -> multi";
1255
- append_error(&error, pollset_kick_all(pollset), err_desc);
1256
- break;
1257
- case PO_FD:
1258
- gpr_mu_lock(&po_at_start->owner_orphan_mu);
1259
- if (po_at_start->owner_orphaned) {
1260
- // Unlock before Unref'ing the pollable
1261
- gpr_mu_unlock(&po_at_start->owner_orphan_mu);
1262
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1263
- error = pollable_create(PO_MULTI, &pollset->active_pollable);
1264
- } else {
1265
- error = pollset_transition_pollable_from_fd_to_multi_locked(pollset,
1266
- nullptr);
1267
- gpr_mu_unlock(&po_at_start->owner_orphan_mu);
1268
- }
1269
- break;
1270
- case PO_MULTI:
1271
- break;
1272
- }
1273
- if (error != GRPC_ERROR_NONE) {
1274
- POLLABLE_UNREF(pollset->active_pollable, "pollset");
1275
- pollset->active_pollable = po_at_start;
1276
- *pollable_obj = nullptr;
1277
- } else {
1278
- gpr_atm_rel_store(&pollset->active_pollable_type,
1279
- pollset->active_pollable->type);
1280
- *pollable_obj = POLLABLE_REF(pollset->active_pollable, "pollset_set");
1281
- POLLABLE_UNREF(po_at_start, "pollset_as_multipollable");
1282
- }
1283
- return error;
1284
- }
1285
-
1286
- static void pollset_add_fd(grpc_pollset* pollset, grpc_fd* fd) {
1287
- GPR_TIMER_SCOPE("pollset_add_fd", 0);
1288
-
1289
- // We never transition from PO_MULTI to other modes (i.e., PO_FD or PO_EMPTY)
1290
- // and, thus, it is safe to simply store and check whether the FD has already
1291
- // been added to the active pollable previously.
1292
- if (gpr_atm_acq_load(&pollset->active_pollable_type) == PO_MULTI &&
1293
- fd_has_pollset(fd, pollset)) {
1294
- return;
1295
- }
1296
-
1297
- grpc_core::MutexLockForGprMu lock(&pollset->mu);
1298
- grpc_error_handle error = pollset_add_fd_locked(pollset, fd);
1299
-
1300
- // If we are in PO_MULTI mode, we should update the pollsets of the FD.
1301
- if (gpr_atm_no_barrier_load(&pollset->active_pollable_type) == PO_MULTI) {
1302
- fd_add_pollset(fd, pollset);
1303
- }
1304
-
1305
- GRPC_LOG_IF_ERROR("pollset_add_fd", error);
1306
- }
1307
-
1308
- /*******************************************************************************
1309
- * Pollset-set Definitions
1310
- */
1311
-
1312
- static grpc_pollset_set* pss_lock_adam(grpc_pollset_set* pss) {
1313
- gpr_mu_lock(&pss->mu);
1314
- while (pss->parent != nullptr) {
1315
- gpr_mu_unlock(&pss->mu);
1316
- pss = pss->parent;
1317
- gpr_mu_lock(&pss->mu);
1318
- }
1319
- return pss;
1320
- }
1321
-
1322
- static grpc_pollset_set* pollset_set_create(void) {
1323
- grpc_pollset_set* pss =
1324
- static_cast<grpc_pollset_set*>(gpr_zalloc(sizeof(*pss)));
1325
- gpr_mu_init(&pss->mu);
1326
- new (&pss->refs) grpc_core::RefCount();
1327
- return pss;
1328
- }
1329
-
1330
- static void pollset_set_unref(grpc_pollset_set* pss) {
1331
- if (pss == nullptr) return;
1332
- if (GPR_LIKELY(!pss->refs.Unref())) return;
1333
- pollset_set_unref(pss->parent);
1334
- gpr_mu_destroy(&pss->mu);
1335
- for (size_t i = 0; i < pss->pollset_count; i++) {
1336
- gpr_mu_lock(&pss->pollsets[i]->mu);
1337
- if (0 == --pss->pollsets[i]->containing_pollset_set_count) {
1338
- pollset_maybe_finish_shutdown(pss->pollsets[i]);
1339
- }
1340
- gpr_mu_unlock(&pss->pollsets[i]->mu);
1341
- }
1342
- for (size_t i = 0; i < pss->fd_count; i++) {
1343
- UNREF_BY(pss->fds[i], 2, "pollset_set");
1344
- }
1345
- gpr_free(pss->pollsets);
1346
- gpr_free(pss->fds);
1347
- gpr_free(pss);
1348
- }
1349
-
1350
- static void pollset_set_add_fd(grpc_pollset_set* pss, grpc_fd* fd) {
1351
- GPR_TIMER_SCOPE("pollset_set_add_fd", 0);
1352
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1353
- gpr_log(GPR_INFO, "PSS:%p: add fd %p (%d)", pss, fd, fd->fd);
1354
- }
1355
- grpc_error_handle error = GRPC_ERROR_NONE;
1356
- static const char* err_desc = "pollset_set_add_fd";
1357
- pss = pss_lock_adam(pss);
1358
- for (size_t i = 0; i < pss->pollset_count; i++) {
1359
- append_error(&error, pollable_add_fd(pss->pollsets[i]->active_pollable, fd),
1360
- err_desc);
1361
- }
1362
- if (pss->fd_count == pss->fd_capacity) {
1363
- pss->fd_capacity = std::max(pss->fd_capacity * 2, size_t(8));
1364
- pss->fds = static_cast<grpc_fd**>(
1365
- gpr_realloc(pss->fds, pss->fd_capacity * sizeof(*pss->fds)));
1366
- }
1367
- REF_BY(fd, 2, "pollset_set");
1368
- pss->fds[pss->fd_count++] = fd;
1369
- gpr_mu_unlock(&pss->mu);
1370
-
1371
- GRPC_LOG_IF_ERROR(err_desc, error);
1372
- }
1373
-
1374
- static void pollset_set_del_fd(grpc_pollset_set* pss, grpc_fd* fd) {
1375
- GPR_TIMER_SCOPE("pollset_set_del_fd", 0);
1376
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1377
- gpr_log(GPR_INFO, "PSS:%p: del fd %p", pss, fd);
1378
- }
1379
- pss = pss_lock_adam(pss);
1380
- size_t i;
1381
- for (i = 0; i < pss->fd_count; i++) {
1382
- if (pss->fds[i] == fd) {
1383
- UNREF_BY(fd, 2, "pollset_set");
1384
- break;
1385
- }
1386
- }
1387
- GPR_ASSERT(i != pss->fd_count);
1388
- for (; i < pss->fd_count - 1; i++) {
1389
- pss->fds[i] = pss->fds[i + 1];
1390
- }
1391
- pss->fd_count--;
1392
- gpr_mu_unlock(&pss->mu);
1393
- }
1394
-
1395
- static void pollset_set_del_pollset(grpc_pollset_set* pss, grpc_pollset* ps) {
1396
- GPR_TIMER_SCOPE("pollset_set_del_pollset", 0);
1397
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1398
- gpr_log(GPR_INFO, "PSS:%p: del pollset %p", pss, ps);
1399
- }
1400
- pss = pss_lock_adam(pss);
1401
- size_t i;
1402
- for (i = 0; i < pss->pollset_count; i++) {
1403
- if (pss->pollsets[i] == ps) {
1404
- break;
1405
- }
1406
- }
1407
- GPR_ASSERT(i != pss->pollset_count);
1408
- for (; i < pss->pollset_count - 1; i++) {
1409
- pss->pollsets[i] = pss->pollsets[i + 1];
1410
- }
1411
- pss->pollset_count--;
1412
- gpr_mu_unlock(&pss->mu);
1413
- gpr_mu_lock(&ps->mu);
1414
- if (0 == --ps->containing_pollset_set_count) {
1415
- pollset_maybe_finish_shutdown(ps);
1416
- }
1417
- gpr_mu_unlock(&ps->mu);
1418
- }
1419
-
1420
- // add all fds to pollables, and output a new array of unorphaned out_fds
1421
- // assumes pollsets are multipollable
1422
- static grpc_error_handle add_fds_to_pollsets(grpc_fd** fds, size_t fd_count,
1423
- grpc_pollset** pollsets,
1424
- size_t pollset_count,
1425
- const char* err_desc,
1426
- grpc_fd** out_fds,
1427
- size_t* out_fd_count) {
1428
- GPR_TIMER_SCOPE("add_fds_to_pollsets", 0);
1429
- grpc_error_handle error = GRPC_ERROR_NONE;
1430
- for (size_t i = 0; i < fd_count; i++) {
1431
- gpr_mu_lock(&fds[i]->orphan_mu);
1432
- if ((gpr_atm_no_barrier_load(&fds[i]->refst) & 1) == 0) {
1433
- gpr_mu_unlock(&fds[i]->orphan_mu);
1434
- UNREF_BY(fds[i], 2, "pollset_set");
1435
- } else {
1436
- for (size_t j = 0; j < pollset_count; j++) {
1437
- append_error(&error,
1438
- pollable_add_fd(pollsets[j]->active_pollable, fds[i]),
1439
- err_desc);
1440
- }
1441
- gpr_mu_unlock(&fds[i]->orphan_mu);
1442
- out_fds[(*out_fd_count)++] = fds[i];
1443
- }
1444
- }
1445
- return error;
1446
- }
1447
-
1448
- static void pollset_set_add_pollset(grpc_pollset_set* pss, grpc_pollset* ps) {
1449
- GPR_TIMER_SCOPE("pollset_set_add_pollset", 0);
1450
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1451
- gpr_log(GPR_INFO, "PSS:%p: add pollset %p", pss, ps);
1452
- }
1453
- grpc_error_handle error = GRPC_ERROR_NONE;
1454
- static const char* err_desc = "pollset_set_add_pollset";
1455
- pollable* pollable_obj = nullptr;
1456
- gpr_mu_lock(&ps->mu);
1457
- if (!GRPC_LOG_IF_ERROR(err_desc,
1458
- pollset_as_multipollable_locked(ps, &pollable_obj))) {
1459
- GPR_ASSERT(pollable_obj == nullptr);
1460
- gpr_mu_unlock(&ps->mu);
1461
- return;
1462
- }
1463
- ps->containing_pollset_set_count++;
1464
- gpr_mu_unlock(&ps->mu);
1465
- pss = pss_lock_adam(pss);
1466
- size_t initial_fd_count = pss->fd_count;
1467
- pss->fd_count = 0;
1468
- append_error(&error,
1469
- add_fds_to_pollsets(pss->fds, initial_fd_count, &ps, 1, err_desc,
1470
- pss->fds, &pss->fd_count),
1471
- err_desc);
1472
- if (pss->pollset_count == pss->pollset_capacity) {
1473
- pss->pollset_capacity = std::max(pss->pollset_capacity * 2, size_t(8));
1474
- pss->pollsets = static_cast<grpc_pollset**>(gpr_realloc(
1475
- pss->pollsets, pss->pollset_capacity * sizeof(*pss->pollsets)));
1476
- }
1477
- pss->pollsets[pss->pollset_count++] = ps;
1478
- gpr_mu_unlock(&pss->mu);
1479
- POLLABLE_UNREF(pollable_obj, "pollset_set");
1480
-
1481
- GRPC_LOG_IF_ERROR(err_desc, error);
1482
- }
1483
-
1484
- static void pollset_set_add_pollset_set(grpc_pollset_set* a,
1485
- grpc_pollset_set* b) {
1486
- GPR_TIMER_SCOPE("pollset_set_add_pollset_set", 0);
1487
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1488
- gpr_log(GPR_INFO, "PSS: merge (%p, %p)", a, b);
1489
- }
1490
- grpc_error_handle error = GRPC_ERROR_NONE;
1491
- static const char* err_desc = "pollset_set_add_fd";
1492
- for (;;) {
1493
- if (a == b) {
1494
- // pollset ancestors are the same: nothing to do
1495
- return;
1496
- }
1497
- if (a > b) {
1498
- std::swap(a, b);
1499
- }
1500
- gpr_mu* a_mu = &a->mu;
1501
- gpr_mu* b_mu = &b->mu;
1502
- gpr_mu_lock(a_mu);
1503
- gpr_mu_lock(b_mu);
1504
- if (a->parent != nullptr) {
1505
- a = a->parent;
1506
- } else if (b->parent != nullptr) {
1507
- b = b->parent;
1508
- } else {
1509
- break; // exit loop, both pollsets locked
1510
- }
1511
- gpr_mu_unlock(a_mu);
1512
- gpr_mu_unlock(b_mu);
1513
- }
1514
- // try to do the least copying possible
1515
- // TODO(sreek): there's probably a better heuristic here
1516
- const size_t a_size = a->fd_count + a->pollset_count;
1517
- const size_t b_size = b->fd_count + b->pollset_count;
1518
- if (b_size > a_size) {
1519
- std::swap(a, b);
1520
- }
1521
- if (GRPC_TRACE_FLAG_ENABLED(grpc_polling_trace)) {
1522
- gpr_log(GPR_INFO, "PSS: parent %p to %p", b, a);
1523
- }
1524
- a->refs.Ref();
1525
- b->parent = a;
1526
- if (a->fd_capacity < a->fd_count + b->fd_count) {
1527
- a->fd_capacity = std::max(2 * a->fd_capacity, a->fd_count + b->fd_count);
1528
- a->fds = static_cast<grpc_fd**>(
1529
- gpr_realloc(a->fds, a->fd_capacity * sizeof(*a->fds)));
1530
- }
1531
- size_t initial_a_fd_count = a->fd_count;
1532
- a->fd_count = 0;
1533
- append_error(
1534
- &error,
1535
- add_fds_to_pollsets(a->fds, initial_a_fd_count, b->pollsets,
1536
- b->pollset_count, "merge_a2b", a->fds, &a->fd_count),
1537
- err_desc);
1538
- append_error(
1539
- &error,
1540
- add_fds_to_pollsets(b->fds, b->fd_count, a->pollsets, a->pollset_count,
1541
- "merge_b2a", a->fds, &a->fd_count),
1542
- err_desc);
1543
- if (a->pollset_capacity < a->pollset_count + b->pollset_count) {
1544
- a->pollset_capacity =
1545
- std::max(2 * a->pollset_capacity, a->pollset_count + b->pollset_count);
1546
- a->pollsets = static_cast<grpc_pollset**>(
1547
- gpr_realloc(a->pollsets, a->pollset_capacity * sizeof(*a->pollsets)));
1548
- }
1549
- if (b->pollset_count > 0) {
1550
- memcpy(a->pollsets + a->pollset_count, b->pollsets,
1551
- b->pollset_count * sizeof(*b->pollsets));
1552
- }
1553
- a->pollset_count += b->pollset_count;
1554
- gpr_free(b->fds);
1555
- gpr_free(b->pollsets);
1556
- b->fds = nullptr;
1557
- b->pollsets = nullptr;
1558
- b->fd_count = b->fd_capacity = b->pollset_count = b->pollset_capacity = 0;
1559
- gpr_mu_unlock(&a->mu);
1560
- gpr_mu_unlock(&b->mu);
1561
- }
1562
-
1563
- static void pollset_set_del_pollset_set(grpc_pollset_set* /*bag*/,
1564
- grpc_pollset_set* /*item*/) {}
1565
-
1566
- /*******************************************************************************
1567
- * Event engine binding
1568
- */
1569
-
1570
- static bool is_any_background_poller_thread(void) { return false; }
1571
-
1572
- static void shutdown_background_closure(void) {}
1573
-
1574
- static bool add_closure_to_background_poller(grpc_closure* /*closure*/,
1575
- grpc_error_handle /*error*/) {
1576
- return false;
1577
- }
1578
-
1579
- static void shutdown_engine(void) {
1580
- fd_global_shutdown();
1581
- pollset_global_shutdown();
1582
- }
1583
-
1584
- static const grpc_event_engine_vtable vtable = {
1585
- sizeof(grpc_pollset),
1586
- true,
1587
- false,
1588
-
1589
- fd_create,
1590
- fd_wrapped_fd,
1591
- fd_orphan,
1592
- fd_shutdown,
1593
- fd_notify_on_read,
1594
- fd_notify_on_write,
1595
- fd_notify_on_error,
1596
- fd_become_readable,
1597
- fd_become_writable,
1598
- fd_has_errors,
1599
- fd_is_shutdown,
1600
-
1601
- pollset_init,
1602
- pollset_shutdown,
1603
- pollset_destroy,
1604
- pollset_work,
1605
- pollset_kick,
1606
- pollset_add_fd,
1607
-
1608
- pollset_set_create,
1609
- pollset_set_unref, // destroy ==> unref 1 public ref
1610
- pollset_set_add_pollset,
1611
- pollset_set_del_pollset,
1612
- pollset_set_add_pollset_set,
1613
- pollset_set_del_pollset_set,
1614
- pollset_set_add_fd,
1615
- pollset_set_del_fd,
1616
-
1617
- is_any_background_poller_thread,
1618
- shutdown_background_closure,
1619
- shutdown_engine,
1620
- add_closure_to_background_poller,
1621
- };
1622
-
1623
- const grpc_event_engine_vtable* grpc_init_epollex_linux(
1624
- bool /*explicitly_requested*/) {
1625
- if (!grpc_has_wakeup_fd()) {
1626
- gpr_log(GPR_ERROR, "Skipping epollex because of no wakeup fd.");
1627
- return nullptr;
1628
- }
1629
-
1630
- if (!grpc_is_epollexclusive_available()) {
1631
- gpr_log(GPR_INFO, "Skipping epollex because it is not supported.");
1632
- return nullptr;
1633
- }
1634
-
1635
- fd_global_init();
1636
-
1637
- if (!GRPC_LOG_IF_ERROR("pollset_global_init", pollset_global_init())) {
1638
- pollset_global_shutdown();
1639
- fd_global_shutdown();
1640
- return nullptr;
1641
- }
1642
-
1643
- return &vtable;
1644
- }
1645
-
1646
- #else /* defined(GRPC_LINUX_EPOLL_CREATE1) */
1647
- #if defined(GRPC_POSIX_SOCKET_EV_EPOLLEX)
1648
- #include "src/core/lib/iomgr/ev_epollex_linux.h"
1649
- /* If GRPC_LINUX_EPOLL_CREATE1 is not defined, it means
1650
- epoll_create1 is not available. Return NULL */
1651
- const grpc_event_engine_vtable* grpc_init_epollex_linux(
1652
- bool /*explicitly_requested*/) {
1653
- return nullptr;
1654
- }
1655
- #endif /* defined(GRPC_POSIX_SOCKET_EV_EPOLLEX) */
1656
-
1657
- #endif /* !defined(GRPC_LINUX_EPOLL_CREATE1) */