grpc 1.20.0 → 1.21.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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +500 -29
  3. data/etc/roots.pem +146 -0
  4. data/include/grpc/grpc_security.h +1 -1
  5. data/include/grpc/impl/codegen/grpc_types.h +10 -7
  6. data/include/grpc/impl/codegen/port_platform.h +11 -1
  7. data/include/grpc/impl/codegen/slice.h +1 -21
  8. data/include/grpc/impl/codegen/status.h +2 -1
  9. data/include/grpc/slice.h +1 -1
  10. data/src/core/ext/filters/client_channel/backup_poller.cc +19 -13
  11. data/src/core/ext/filters/client_channel/backup_poller.h +3 -0
  12. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  13. data/src/core/ext/filters/client_channel/client_channel.cc +2084 -1673
  14. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
  15. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -0
  16. data/src/core/ext/filters/client_channel/health/health_check_client.cc +54 -49
  17. data/src/core/ext/filters/client_channel/health/health_check_client.h +20 -9
  18. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -2
  19. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  20. data/src/core/ext/filters/client_channel/lb_policy.cc +3 -30
  21. data/src/core/ext/filters/client_channel/lb_policy.h +16 -25
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +106 -81
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +6 -2
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +8 -12
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -2
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +57 -49
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +47 -41
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +24 -20
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +989 -284
  31. data/src/core/ext/filters/client_channel/lb_policy_factory.h +4 -1
  32. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +105 -2
  33. data/src/core/ext/filters/client_channel/lb_policy_registry.h +9 -2
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +79 -36
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +84 -2
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +3 -0
  37. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +179 -0
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +15 -3
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +80 -4
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +7 -13
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +39 -0
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +0 -6
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +2 -64
  45. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.cc +28 -0
  46. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +29 -0
  47. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +4 -4
  48. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +367 -232
  49. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +55 -76
  50. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +50 -39
  51. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +18 -12
  52. data/src/core/ext/filters/client_channel/service_config.cc +247 -27
  53. data/src/core/ext/filters/client_channel/service_config.h +119 -166
  54. data/src/core/ext/filters/client_channel/subchannel.cc +46 -84
  55. data/src/core/ext/filters/client_channel/subchannel.h +7 -7
  56. data/src/core/ext/filters/deadline/deadline_filter.cc +3 -4
  57. data/src/core/ext/filters/deadline/deadline_filter.h +3 -2
  58. data/src/core/ext/filters/http/client/http_client_filter.cc +7 -5
  59. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  60. data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
  61. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -3
  62. data/src/core/ext/filters/http/server/http_server_filter.cc +18 -12
  63. data/src/core/ext/filters/message_size/message_size_filter.cc +118 -76
  64. data/src/core/ext/filters/message_size/message_size_filter.h +33 -0
  65. data/src/core/ext/transport/chttp2/alpn/alpn.h +1 -1
  66. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +9 -7
  67. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +93 -60
  68. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -1
  69. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +4 -3
  70. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +3 -3
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +8 -2
  72. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +2 -2
  73. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +1 -1
  74. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +3 -2
  75. data/src/core/ext/transport/chttp2/transport/internal.h +35 -23
  76. data/src/core/ext/transport/chttp2/transport/parsing.cc +4 -4
  77. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +3 -3
  78. data/src/core/ext/transport/chttp2/transport/writing.cc +61 -27
  79. data/src/core/ext/transport/inproc/inproc_transport.cc +18 -18
  80. data/src/core/lib/channel/channel_args.cc +0 -101
  81. data/src/core/lib/channel/channel_args.h +0 -37
  82. data/src/core/lib/channel/channel_stack.h +9 -5
  83. data/src/core/lib/channel/channelz_registry.cc +1 -1
  84. data/src/core/lib/channel/connected_channel.cc +2 -2
  85. data/src/core/lib/channel/context.h +3 -0
  86. data/src/core/lib/channel/handshaker.cc +4 -4
  87. data/src/core/lib/channel/handshaker.h +1 -1
  88. data/src/core/lib/compression/compression_args.cc +127 -0
  89. data/src/core/lib/compression/compression_args.h +55 -0
  90. data/src/core/lib/debug/trace.cc +13 -7
  91. data/src/core/lib/debug/trace.h +12 -0
  92. data/src/core/lib/gpr/arena.h +13 -9
  93. data/src/core/lib/gpr/env.h +2 -5
  94. data/src/core/lib/gpr/env_linux.cc +6 -1
  95. data/src/core/lib/gpr/env_posix.cc +5 -0
  96. data/src/core/lib/gpr/env_windows.cc +7 -5
  97. data/src/core/lib/gpr/log.cc +9 -13
  98. data/src/core/lib/gpr/string.cc +12 -6
  99. data/src/core/lib/gpr/string.h +4 -2
  100. data/src/core/lib/gpr/time_posix.cc +13 -0
  101. data/src/core/lib/gprpp/arena.cc +103 -0
  102. data/src/core/lib/gprpp/arena.h +121 -0
  103. data/src/core/lib/gprpp/fork.cc +12 -29
  104. data/src/core/lib/gprpp/global_config.h +87 -0
  105. data/src/core/lib/gprpp/global_config_custom.h +29 -0
  106. data/src/core/lib/gprpp/global_config_env.cc +135 -0
  107. data/src/core/lib/gprpp/global_config_env.h +131 -0
  108. data/src/core/lib/gprpp/global_config_generic.h +44 -0
  109. data/src/core/lib/gprpp/map.h +419 -0
  110. data/src/core/lib/gprpp/optional.h +1 -0
  111. data/src/core/lib/gprpp/orphanable.h +2 -2
  112. data/src/core/lib/gprpp/{mutex_lock.h → pair.h} +15 -19
  113. data/src/core/lib/gprpp/ref_counted.h +18 -2
  114. data/src/core/lib/gprpp/sync.h +126 -0
  115. data/src/core/lib/http/parser.cc +1 -1
  116. data/src/core/lib/iomgr/call_combiner.cc +84 -90
  117. data/src/core/lib/iomgr/call_combiner.h +75 -82
  118. data/src/core/lib/iomgr/cfstream_handle.cc +202 -0
  119. data/src/core/lib/iomgr/cfstream_handle.h +82 -0
  120. data/src/core/lib/iomgr/combiner.h +1 -1
  121. data/src/core/lib/iomgr/endpoint_cfstream.cc +375 -0
  122. data/src/core/lib/iomgr/endpoint_cfstream.h +49 -0
  123. data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
  124. data/src/core/lib/iomgr/error.h +23 -0
  125. data/src/core/lib/iomgr/error_cfstream.cc +52 -0
  126. data/src/core/lib/iomgr/error_cfstream.h +31 -0
  127. data/src/core/lib/iomgr/ev_epoll1_linux.cc +34 -27
  128. data/src/core/lib/iomgr/ev_epollex_linux.cc +33 -33
  129. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -7
  130. data/src/core/lib/iomgr/ev_posix.cc +15 -13
  131. data/src/core/lib/iomgr/ev_posix.h +4 -1
  132. data/src/core/lib/iomgr/executor.cc +13 -9
  133. data/src/core/lib/iomgr/fork_posix.cc +0 -1
  134. data/src/core/lib/iomgr/internal_errqueue.cc +1 -1
  135. data/src/core/lib/iomgr/iomgr.cc +6 -5
  136. data/src/core/lib/iomgr/iomgr_custom.cc +3 -0
  137. data/src/core/lib/iomgr/iomgr_custom.h +2 -0
  138. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +93 -0
  139. data/src/core/lib/iomgr/iomgr_windows.cc +1 -0
  140. data/src/core/lib/iomgr/lockfree_event.cc +3 -3
  141. data/src/core/lib/iomgr/port.h +11 -0
  142. data/src/core/lib/iomgr/resource_quota.cc +40 -37
  143. data/src/core/lib/iomgr/socket_utils_common_posix.cc +6 -2
  144. data/src/core/lib/iomgr/socket_windows.cc +19 -0
  145. data/src/core/lib/iomgr/socket_windows.h +8 -0
  146. data/src/core/lib/iomgr/tcp_client_cfstream.cc +216 -0
  147. data/src/core/lib/iomgr/tcp_client_custom.cc +2 -2
  148. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -3
  149. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -1
  150. data/src/core/lib/iomgr/tcp_custom.cc +9 -9
  151. data/src/core/lib/iomgr/tcp_posix.cc +41 -41
  152. data/src/core/lib/iomgr/tcp_server_custom.cc +3 -3
  153. data/src/core/lib/iomgr/tcp_server_posix.cc +14 -1
  154. data/src/core/lib/iomgr/tcp_server_windows.cc +2 -2
  155. data/src/core/lib/iomgr/tcp_windows.cc +7 -9
  156. data/src/core/lib/iomgr/timer_generic.cc +16 -16
  157. data/src/core/lib/iomgr/timer_manager.cc +12 -11
  158. data/src/core/lib/profiling/basic_timers.cc +10 -4
  159. data/src/core/lib/security/context/security_context.cc +6 -7
  160. data/src/core/lib/security/context/security_context.h +3 -4
  161. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  162. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +2 -3
  163. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -1
  164. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +7 -7
  165. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +7 -5
  166. data/src/core/lib/security/security_connector/security_connector.cc +0 -1
  167. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +3 -2
  168. data/src/core/lib/security/security_connector/ssl_utils.cc +30 -26
  169. data/src/core/lib/security/security_connector/ssl_utils.h +5 -1
  170. data/src/core/lib/security/transport/client_auth_filter.cc +7 -11
  171. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  172. data/src/core/lib/security/transport/server_auth_filter.cc +2 -3
  173. data/src/core/lib/slice/slice.cc +99 -116
  174. data/src/core/lib/slice/slice_buffer.cc +5 -0
  175. data/src/core/lib/slice/slice_intern.cc +38 -95
  176. data/src/core/lib/slice/slice_internal.h +200 -2
  177. data/src/core/lib/surface/api_trace.h +1 -1
  178. data/src/core/lib/surface/call.cc +41 -35
  179. data/src/core/lib/surface/call.h +7 -2
  180. data/src/core/lib/surface/call_details.cc +0 -1
  181. data/src/core/lib/surface/completion_queue.cc +36 -27
  182. data/src/core/lib/surface/init.cc +3 -4
  183. data/src/core/lib/surface/lame_client.cc +1 -1
  184. data/src/core/lib/surface/server.cc +18 -25
  185. data/src/core/lib/surface/version.cc +1 -1
  186. data/src/core/lib/transport/bdp_estimator.cc +3 -3
  187. data/src/core/lib/transport/bdp_estimator.h +2 -2
  188. data/src/core/lib/transport/connectivity_state.cc +10 -40
  189. data/src/core/lib/transport/connectivity_state.h +0 -8
  190. data/src/core/lib/transport/error_utils.cc +12 -0
  191. data/src/core/lib/transport/metadata.cc +206 -278
  192. data/src/core/lib/transport/metadata.h +205 -10
  193. data/src/core/lib/transport/static_metadata.cc +108 -116
  194. data/src/core/lib/transport/static_metadata.h +1 -2
  195. data/src/core/lib/transport/status_metadata.cc +3 -3
  196. data/src/core/lib/transport/transport.cc +29 -66
  197. data/src/core/lib/transport/transport.h +36 -8
  198. data/src/core/lib/transport/transport_impl.h +1 -1
  199. data/src/core/tsi/fake_transport_security.cc +4 -4
  200. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +1 -1
  201. data/src/core/tsi/ssl_transport_security.cc +1 -1
  202. data/src/ruby/ext/grpc/rb_grpc.c +1 -1
  203. data/src/ruby/lib/grpc/errors.rb +22 -3
  204. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  205. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  206. data/src/ruby/lib/grpc/version.rb +1 -1
  207. data/src/ruby/spec/errors_spec.rb +141 -0
  208. metadata +57 -33
  209. data/src/core/lib/gpr/arena.cc +0 -192
@@ -30,7 +30,11 @@
30
30
  #include <fcntl.h>
31
31
  #include <limits.h>
32
32
  #include <netinet/in.h>
33
+ #ifdef GRPC_LINUX_TCP_H
34
+ #include <linux/tcp.h>
35
+ #else
33
36
  #include <netinet/tcp.h>
37
+ #endif
34
38
  #include <stdio.h>
35
39
  #include <string.h>
36
40
  #include <sys/socket.h>
@@ -288,7 +292,7 @@ grpc_error* grpc_set_socket_tcp_user_timeout(
288
292
  }
289
293
  if (enable) {
290
294
  extern grpc_core::TraceFlag grpc_tcp_trace;
291
- if (grpc_tcp_trace.enabled()) {
295
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
292
296
  gpr_log(GPR_INFO, "Enabling TCP_USER_TIMEOUT with a timeout of %d ms",
293
297
  timeout);
294
298
  }
@@ -311,7 +315,7 @@ grpc_error* grpc_set_socket_tcp_user_timeout(
311
315
  }
312
316
  #else
313
317
  extern grpc_core::TraceFlag grpc_tcp_trace;
314
- if (grpc_tcp_trace.enabled()) {
318
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
315
319
  gpr_log(GPR_INFO, "TCP_USER_TIMEOUT not supported for this platform");
316
320
  }
317
321
  #endif /* GRPC_HAVE_TCP_USER_TIMEOUT */
@@ -39,6 +39,8 @@
39
39
  #include "src/core/lib/iomgr/sockaddr_windows.h"
40
40
  #include "src/core/lib/iomgr/socket_windows.h"
41
41
 
42
+ static DWORD s_wsa_socket_flags;
43
+
42
44
  grpc_winsocket* grpc_winsocket_create(SOCKET socket, const char* name) {
43
45
  char* final_name;
44
46
  grpc_winsocket* r = (grpc_winsocket*)gpr_malloc(sizeof(grpc_winsocket));
@@ -181,4 +183,21 @@ int grpc_ipv6_loopback_available(void) {
181
183
  return g_ipv6_loopback_available;
182
184
  }
183
185
 
186
+ DWORD grpc_get_default_wsa_socket_flags() { return s_wsa_socket_flags; }
187
+
188
+ void grpc_wsa_socket_flags_init() {
189
+ s_wsa_socket_flags = WSA_FLAG_OVERLAPPED;
190
+ /* WSA_FLAG_NO_HANDLE_INHERIT may be not supported on the older Windows
191
+ versions, see
192
+ https://msdn.microsoft.com/en-us/library/windows/desktop/ms742212(v=vs.85).aspx
193
+ for details. */
194
+ SOCKET sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
195
+ s_wsa_socket_flags | WSA_FLAG_NO_HANDLE_INHERIT);
196
+ if (sock != INVALID_SOCKET) {
197
+ /* Windows 7, Windows 2008 R2 with SP1 or later */
198
+ s_wsa_socket_flags |= WSA_FLAG_NO_HANDLE_INHERIT;
199
+ closesocket(sock);
200
+ }
201
+ }
202
+
184
203
  #endif /* GRPC_WINSOCK_SOCKET */
@@ -32,6 +32,10 @@
32
32
  #include "src/core/lib/iomgr/closure.h"
33
33
  #include "src/core/lib/iomgr/iomgr_internal.h"
34
34
 
35
+ #ifndef WSA_FLAG_NO_HANDLE_INHERIT
36
+ #define WSA_FLAG_NO_HANDLE_INHERIT 0x80
37
+ #endif
38
+
35
39
  /* This holds the data for an outstanding read or write on a socket.
36
40
  The mutex to protect the concurrent access to that data is the one
37
41
  inside the winsocket wrapper. */
@@ -114,6 +118,10 @@ void grpc_socket_become_ready(grpc_winsocket* winsocket,
114
118
  The value is probed once, and cached for the life of the process. */
115
119
  int grpc_ipv6_loopback_available(void);
116
120
 
121
+ void grpc_wsa_socket_flags_init();
122
+
123
+ DWORD grpc_get_default_wsa_socket_flags();
124
+
117
125
  #endif
118
126
 
119
127
  #endif /* GRPC_CORE_LIB_IOMGR_SOCKET_WINDOWS_H */
@@ -0,0 +1,216 @@
1
+
2
+ /*
3
+ *
4
+ * Copyright 2018 gRPC authors.
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ *
18
+ */
19
+
20
+ #include <grpc/support/port_platform.h>
21
+
22
+ #include "src/core/lib/iomgr/port.h"
23
+
24
+ #ifdef GRPC_CFSTREAM_CLIENT
25
+
26
+ #include <CoreFoundation/CoreFoundation.h>
27
+
28
+ #include <string.h>
29
+
30
+ #include <grpc/support/alloc.h>
31
+ #include <grpc/support/log.h>
32
+ #include <grpc/support/sync.h>
33
+
34
+ #include <netinet/in.h>
35
+
36
+ #include "src/core/lib/channel/channel_args.h"
37
+ #include "src/core/lib/gpr/host_port.h"
38
+ #include "src/core/lib/iomgr/cfstream_handle.h"
39
+ #include "src/core/lib/iomgr/closure.h"
40
+ #include "src/core/lib/iomgr/endpoint_cfstream.h"
41
+ #include "src/core/lib/iomgr/error.h"
42
+ #include "src/core/lib/iomgr/error_cfstream.h"
43
+ #include "src/core/lib/iomgr/sockaddr_utils.h"
44
+ #include "src/core/lib/iomgr/tcp_client.h"
45
+ #include "src/core/lib/iomgr/timer.h"
46
+
47
+ extern grpc_core::TraceFlag grpc_tcp_trace;
48
+
49
+ typedef struct CFStreamConnect {
50
+ gpr_mu mu;
51
+ gpr_refcount refcount;
52
+
53
+ CFReadStreamRef read_stream;
54
+ CFWriteStreamRef write_stream;
55
+ CFStreamHandle* stream_handle;
56
+
57
+ grpc_timer alarm;
58
+ grpc_closure on_alarm;
59
+ grpc_closure on_open;
60
+
61
+ bool read_stream_open;
62
+ bool write_stream_open;
63
+ bool failed;
64
+
65
+ grpc_closure* closure;
66
+ grpc_endpoint** endpoint;
67
+ int refs;
68
+ char* addr_name;
69
+ grpc_resource_quota* resource_quota;
70
+ } CFStreamConnect;
71
+
72
+ static void CFStreamConnectCleanup(CFStreamConnect* connect) {
73
+ grpc_resource_quota_unref_internal(connect->resource_quota);
74
+ CFSTREAM_HANDLE_UNREF(connect->stream_handle, "async connect clean up");
75
+ CFRelease(connect->read_stream);
76
+ CFRelease(connect->write_stream);
77
+ gpr_mu_destroy(&connect->mu);
78
+ gpr_free(connect->addr_name);
79
+ gpr_free(connect);
80
+ }
81
+
82
+ static void OnAlarm(void* arg, grpc_error* error) {
83
+ CFStreamConnect* connect = static_cast<CFStreamConnect*>(arg);
84
+ if (grpc_tcp_trace.enabled()) {
85
+ gpr_log(GPR_DEBUG, "CLIENT_CONNECT :%p OnAlarm, error:%p", connect, error);
86
+ }
87
+ gpr_mu_lock(&connect->mu);
88
+ grpc_closure* closure = connect->closure;
89
+ connect->closure = nil;
90
+ const bool done = (--connect->refs == 0);
91
+ gpr_mu_unlock(&connect->mu);
92
+ // Only schedule a callback once, by either OnAlarm or OnOpen. The
93
+ // first one issues callback while the second one does cleanup.
94
+ if (done) {
95
+ CFStreamConnectCleanup(connect);
96
+ } else {
97
+ grpc_error* error =
98
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("connect() timed out");
99
+ GRPC_CLOSURE_SCHED(closure, error);
100
+ }
101
+ }
102
+
103
+ static void OnOpen(void* arg, grpc_error* error) {
104
+ CFStreamConnect* connect = static_cast<CFStreamConnect*>(arg);
105
+ if (grpc_tcp_trace.enabled()) {
106
+ gpr_log(GPR_DEBUG, "CLIENT_CONNECT :%p OnOpen, error:%p", connect, error);
107
+ }
108
+ gpr_mu_lock(&connect->mu);
109
+ grpc_timer_cancel(&connect->alarm);
110
+ grpc_closure* closure = connect->closure;
111
+ connect->closure = nil;
112
+
113
+ bool done = (--connect->refs == 0);
114
+ grpc_endpoint** endpoint = connect->endpoint;
115
+
116
+ // Only schedule a callback once, by either OnAlarm or OnOpen. The
117
+ // first one issues callback while the second one does cleanup.
118
+ if (done) {
119
+ gpr_mu_unlock(&connect->mu);
120
+ CFStreamConnectCleanup(connect);
121
+ } else {
122
+ if (error == GRPC_ERROR_NONE) {
123
+ CFErrorRef stream_error = CFReadStreamCopyError(connect->read_stream);
124
+ if (stream_error == NULL) {
125
+ stream_error = CFWriteStreamCopyError(connect->write_stream);
126
+ }
127
+ if (stream_error) {
128
+ error = GRPC_ERROR_CREATE_FROM_CFERROR(stream_error, "connect() error");
129
+ CFRelease(stream_error);
130
+ }
131
+ if (error == GRPC_ERROR_NONE) {
132
+ *endpoint = grpc_cfstream_endpoint_create(
133
+ connect->read_stream, connect->write_stream, connect->addr_name,
134
+ connect->resource_quota, connect->stream_handle);
135
+ }
136
+ } else {
137
+ GRPC_ERROR_REF(error);
138
+ }
139
+ gpr_mu_unlock(&connect->mu);
140
+ GRPC_CLOSURE_SCHED(closure, error);
141
+ }
142
+ }
143
+
144
+ static void ParseResolvedAddress(const grpc_resolved_address* addr,
145
+ CFStringRef* host, int* port) {
146
+ char *host_port, *host_string, *port_string;
147
+ grpc_sockaddr_to_string(&host_port, addr, 1);
148
+ gpr_split_host_port(host_port, &host_string, &port_string);
149
+ *host = CFStringCreateWithCString(NULL, host_string, kCFStringEncodingUTF8);
150
+ gpr_free(host_string);
151
+ gpr_free(port_string);
152
+ gpr_free(host_port);
153
+ *port = grpc_sockaddr_get_port(addr);
154
+ }
155
+
156
+ static void CFStreamClientConnect(grpc_closure* closure, grpc_endpoint** ep,
157
+ grpc_pollset_set* interested_parties,
158
+ const grpc_channel_args* channel_args,
159
+ const grpc_resolved_address* resolved_addr,
160
+ grpc_millis deadline) {
161
+ CFStreamConnect* connect;
162
+
163
+ connect = (CFStreamConnect*)gpr_zalloc(sizeof(CFStreamConnect));
164
+ connect->closure = closure;
165
+ connect->endpoint = ep;
166
+ connect->addr_name = grpc_sockaddr_to_uri(resolved_addr);
167
+ // connect->resource_quota = resource_quota;
168
+ connect->refs = 2; // One for the connect operation, one for the timer.
169
+ gpr_ref_init(&connect->refcount, 1);
170
+ gpr_mu_init(&connect->mu);
171
+
172
+ if (grpc_tcp_trace.enabled()) {
173
+ gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %p, %s: asynchronously connecting",
174
+ connect, connect->addr_name);
175
+ }
176
+
177
+ grpc_resource_quota* resource_quota = grpc_resource_quota_create(NULL);
178
+ if (channel_args != NULL) {
179
+ for (size_t i = 0; i < channel_args->num_args; i++) {
180
+ if (0 == strcmp(channel_args->args[i].key, GRPC_ARG_RESOURCE_QUOTA)) {
181
+ grpc_resource_quota_unref_internal(resource_quota);
182
+ resource_quota = grpc_resource_quota_ref_internal(
183
+ (grpc_resource_quota*)channel_args->args[i].value.pointer.p);
184
+ }
185
+ }
186
+ }
187
+ connect->resource_quota = resource_quota;
188
+
189
+ CFReadStreamRef read_stream;
190
+ CFWriteStreamRef write_stream;
191
+
192
+ CFStringRef host;
193
+ int port;
194
+ ParseResolvedAddress(resolved_addr, &host, &port);
195
+ CFStreamCreatePairWithSocketToHost(NULL, host, port, &read_stream,
196
+ &write_stream);
197
+ CFRelease(host);
198
+ connect->read_stream = read_stream;
199
+ connect->write_stream = write_stream;
200
+ connect->stream_handle =
201
+ CFStreamHandle::CreateStreamHandle(read_stream, write_stream);
202
+ GRPC_CLOSURE_INIT(&connect->on_open, OnOpen, static_cast<void*>(connect),
203
+ grpc_schedule_on_exec_ctx);
204
+ connect->stream_handle->NotifyOnOpen(&connect->on_open);
205
+ GRPC_CLOSURE_INIT(&connect->on_alarm, OnAlarm, connect,
206
+ grpc_schedule_on_exec_ctx);
207
+ gpr_mu_lock(&connect->mu);
208
+ CFReadStreamOpen(read_stream);
209
+ CFWriteStreamOpen(write_stream);
210
+ grpc_timer_init(&connect->alarm, deadline, &connect->on_alarm);
211
+ gpr_mu_unlock(&connect->mu);
212
+ }
213
+
214
+ grpc_tcp_client_vtable grpc_cfstream_client_vtable = {CFStreamClientConnect};
215
+
216
+ #endif /* GRPC_CFSTREAM_CLIENT */
@@ -64,7 +64,7 @@ static void on_alarm(void* acp, grpc_error* error) {
64
64
  int done;
65
65
  grpc_custom_socket* socket = (grpc_custom_socket*)acp;
66
66
  grpc_custom_tcp_connect* connect = socket->connector;
67
- if (grpc_tcp_trace.enabled()) {
67
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
68
68
  const char* str = grpc_error_string(error);
69
69
  gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s",
70
70
  connect->addr_name, str);
@@ -146,7 +146,7 @@ static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
146
146
  socket->listener = nullptr;
147
147
  connect->refs = 2;
148
148
 
149
- if (grpc_tcp_trace.enabled()) {
149
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
150
150
  gpr_log(GPR_INFO, "CLIENT_CONNECT: %p %s: asynchronously connecting",
151
151
  socket, connect->addr_name);
152
152
  }
@@ -108,7 +108,7 @@ done:
108
108
  static void tc_on_alarm(void* acp, grpc_error* error) {
109
109
  int done;
110
110
  async_connect* ac = static_cast<async_connect*>(acp);
111
- if (grpc_tcp_trace.enabled()) {
111
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
112
112
  const char* str = grpc_error_string(error);
113
113
  gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_alarm: error=%s", ac->addr_str,
114
114
  str);
@@ -145,7 +145,7 @@ static void on_writable(void* acp, grpc_error* error) {
145
145
 
146
146
  GRPC_ERROR_REF(error);
147
147
 
148
- if (grpc_tcp_trace.enabled()) {
148
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
149
149
  const char* str = grpc_error_string(error);
150
150
  gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: on_writable: error=%s", ac->addr_str,
151
151
  str);
@@ -328,7 +328,7 @@ void grpc_tcp_client_create_from_prepared_fd(
328
328
  grpc_schedule_on_exec_ctx);
329
329
  ac->channel_args = grpc_channel_args_copy(channel_args);
330
330
 
331
- if (grpc_tcp_trace.enabled()) {
331
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
332
332
  gpr_log(GPR_INFO, "CLIENT_CONNECT: %s: asynchronously connecting fd %p",
333
333
  ac->addr_str, fdobj);
334
334
  }
@@ -148,7 +148,7 @@ static void tcp_connect(grpc_closure* on_done, grpc_endpoint** endpoint,
148
148
  }
149
149
 
150
150
  sock = WSASocket(AF_INET6, SOCK_STREAM, IPPROTO_TCP, NULL, 0,
151
- WSA_FLAG_OVERLAPPED);
151
+ grpc_get_default_wsa_socket_flags());
152
152
  if (sock == INVALID_SOCKET) {
153
153
  error = GRPC_WSA_ERROR(WSAGetLastError(), "WSASocket");
154
154
  goto failure;
@@ -88,7 +88,7 @@ static void tcp_free(grpc_custom_socket* s) {
88
88
  #define TCP_REF(tcp, reason) tcp_ref((tcp), (reason), __FILE__, __LINE__)
89
89
  static void tcp_unref(custom_tcp_endpoint* tcp, const char* reason,
90
90
  const char* file, int line) {
91
- if (grpc_tcp_trace.enabled()) {
91
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
92
92
  gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
93
93
  gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
94
94
  "TCP unref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp->socket, reason,
@@ -101,7 +101,7 @@ static void tcp_unref(custom_tcp_endpoint* tcp, const char* reason,
101
101
 
102
102
  static void tcp_ref(custom_tcp_endpoint* tcp, const char* reason,
103
103
  const char* file, int line) {
104
- if (grpc_tcp_trace.enabled()) {
104
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
105
105
  gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
106
106
  gpr_log(file, line, GPR_LOG_SEVERITY_ERROR,
107
107
  "TCP ref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp->socket, reason,
@@ -123,7 +123,7 @@ static void tcp_ref(custom_tcp_endpoint* tcp) { gpr_ref(&tcp->refcount); }
123
123
 
124
124
  static void call_read_cb(custom_tcp_endpoint* tcp, grpc_error* error) {
125
125
  grpc_closure* cb = tcp->read_cb;
126
- if (grpc_tcp_trace.enabled()) {
126
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
127
127
  gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp->socket, cb, cb->cb,
128
128
  cb->cb_arg);
129
129
  size_t i;
@@ -169,7 +169,7 @@ static void custom_read_callback(grpc_custom_socket* socket, size_t nread,
169
169
 
170
170
  static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
171
171
  custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)tcpp;
172
- if (grpc_tcp_trace.enabled()) {
172
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
173
173
  gpr_log(GPR_INFO, "TCP:%p read_allocation_done: %s", tcp->socket,
174
174
  grpc_error_string(error));
175
175
  }
@@ -185,7 +185,7 @@ static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
185
185
  grpc_slice_buffer_reset_and_unref_internal(tcp->read_slices);
186
186
  call_read_cb(tcp, GRPC_ERROR_REF(error));
187
187
  }
188
- if (grpc_tcp_trace.enabled()) {
188
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
189
189
  const char* str = grpc_error_string(error);
190
190
  gpr_log(GPR_INFO, "Initiating read on %p: error=%s", tcp->socket, str);
191
191
  }
@@ -211,7 +211,7 @@ static void custom_write_callback(grpc_custom_socket* socket,
211
211
  custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)socket->endpoint;
212
212
  grpc_closure* cb = tcp->write_cb;
213
213
  tcp->write_cb = nullptr;
214
- if (grpc_tcp_trace.enabled()) {
214
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
215
215
  const char* str = grpc_error_string(error);
216
216
  gpr_log(GPR_INFO, "write complete on %p: error=%s", tcp->socket, str);
217
217
  }
@@ -224,7 +224,7 @@ static void endpoint_write(grpc_endpoint* ep, grpc_slice_buffer* write_slices,
224
224
  custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep;
225
225
  GRPC_CUSTOM_IOMGR_ASSERT_SAME_THREAD();
226
226
 
227
- if (grpc_tcp_trace.enabled()) {
227
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
228
228
  size_t j;
229
229
 
230
230
  for (j = 0; j < write_slices->count; j++) {
@@ -280,7 +280,7 @@ static void endpoint_delete_from_pollset_set(grpc_endpoint* ep,
280
280
  static void endpoint_shutdown(grpc_endpoint* ep, grpc_error* why) {
281
281
  custom_tcp_endpoint* tcp = (custom_tcp_endpoint*)ep;
282
282
  if (!tcp->shutting_down) {
283
- if (grpc_tcp_trace.enabled()) {
283
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
284
284
  const char* str = grpc_error_string(why);
285
285
  gpr_log(GPR_INFO, "TCP %p shutdown why=%s", tcp->socket, str);
286
286
  }
@@ -345,7 +345,7 @@ grpc_endpoint* custom_tcp_endpoint_create(grpc_custom_socket* socket,
345
345
  (custom_tcp_endpoint*)gpr_malloc(sizeof(custom_tcp_endpoint));
346
346
  grpc_core::ExecCtx exec_ctx;
347
347
 
348
- if (grpc_tcp_trace.enabled()) {
348
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
349
349
  gpr_log(GPR_INFO, "Creating TCP endpoint %p", socket);
350
350
  }
351
351
  memset(tcp, 0, sizeof(custom_tcp_endpoint));
@@ -163,7 +163,7 @@ static void tcp_drop_uncovered_then_handle_write(void* arg /* grpc_tcp */,
163
163
 
164
164
  static void done_poller(void* bp, grpc_error* error_ignored) {
165
165
  backup_poller* p = static_cast<backup_poller*>(bp);
166
- if (grpc_tcp_trace.enabled()) {
166
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
167
167
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p destroy", p);
168
168
  }
169
169
  grpc_pollset_destroy(BACKUP_POLLER_POLLSET(p));
@@ -172,7 +172,7 @@ static void done_poller(void* bp, grpc_error* error_ignored) {
172
172
 
173
173
  static void run_poller(void* bp, grpc_error* error_ignored) {
174
174
  backup_poller* p = static_cast<backup_poller*>(bp);
175
- if (grpc_tcp_trace.enabled()) {
175
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
176
176
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p run", p);
177
177
  }
178
178
  gpr_mu_lock(p->pollset_mu);
@@ -188,18 +188,18 @@ static void run_poller(void* bp, grpc_error* error_ignored) {
188
188
  gpr_atm_full_cas(&g_uncovered_notifications_pending, 1, 0)) {
189
189
  gpr_mu_lock(p->pollset_mu);
190
190
  bool cas_ok = gpr_atm_full_cas(&g_backup_poller, (gpr_atm)p, 0);
191
- if (grpc_tcp_trace.enabled()) {
191
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
192
192
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p done cas_ok=%d", p, cas_ok);
193
193
  }
194
194
  gpr_mu_unlock(p->pollset_mu);
195
- if (grpc_tcp_trace.enabled()) {
195
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
196
196
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p shutdown", p);
197
197
  }
198
198
  grpc_pollset_shutdown(BACKUP_POLLER_POLLSET(p),
199
199
  GRPC_CLOSURE_INIT(&p->run_poller, done_poller, p,
200
200
  grpc_schedule_on_exec_ctx));
201
201
  } else {
202
- if (grpc_tcp_trace.enabled()) {
202
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
203
203
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p reschedule", p);
204
204
  }
205
205
  GRPC_CLOSURE_SCHED(&p->run_poller, GRPC_ERROR_NONE);
@@ -210,7 +210,7 @@ static void drop_uncovered(grpc_tcp* tcp) {
210
210
  backup_poller* p = (backup_poller*)gpr_atm_acq_load(&g_backup_poller);
211
211
  gpr_atm old_count =
212
212
  gpr_atm_full_fetch_add(&g_uncovered_notifications_pending, -1);
213
- if (grpc_tcp_trace.enabled()) {
213
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
214
214
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p uncover cnt %d->%d", p,
215
215
  static_cast<int>(old_count), static_cast<int>(old_count) - 1);
216
216
  }
@@ -228,7 +228,7 @@ static void cover_self(grpc_tcp* tcp) {
228
228
  backup_poller* p;
229
229
  gpr_atm old_count =
230
230
  gpr_atm_no_barrier_fetch_add(&g_uncovered_notifications_pending, 2);
231
- if (grpc_tcp_trace.enabled()) {
231
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
232
232
  gpr_log(GPR_INFO, "BACKUP_POLLER: cover cnt %d->%d",
233
233
  static_cast<int>(old_count), 2 + static_cast<int>(old_count));
234
234
  }
@@ -236,7 +236,7 @@ static void cover_self(grpc_tcp* tcp) {
236
236
  GRPC_STATS_INC_TCP_BACKUP_POLLERS_CREATED();
237
237
  p = static_cast<backup_poller*>(
238
238
  gpr_zalloc(sizeof(*p) + grpc_pollset_size()));
239
- if (grpc_tcp_trace.enabled()) {
239
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
240
240
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p create", p);
241
241
  }
242
242
  grpc_pollset_init(BACKUP_POLLER_POLLSET(p), &p->pollset_mu);
@@ -251,7 +251,7 @@ static void cover_self(grpc_tcp* tcp) {
251
251
  // spin waiting for backup poller
252
252
  }
253
253
  }
254
- if (grpc_tcp_trace.enabled()) {
254
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
255
255
  gpr_log(GPR_INFO, "BACKUP_POLLER:%p add %p", p, tcp);
256
256
  }
257
257
  grpc_pollset_add_fd(BACKUP_POLLER_POLLSET(p), tcp->em_fd);
@@ -261,32 +261,24 @@ static void cover_self(grpc_tcp* tcp) {
261
261
  }
262
262
 
263
263
  static void notify_on_read(grpc_tcp* tcp) {
264
- if (grpc_tcp_trace.enabled()) {
264
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
265
265
  gpr_log(GPR_INFO, "TCP:%p notify_on_read", tcp);
266
266
  }
267
267
  grpc_fd_notify_on_read(tcp->em_fd, &tcp->read_done_closure);
268
268
  }
269
269
 
270
270
  static void notify_on_write(grpc_tcp* tcp) {
271
- if (grpc_tcp_trace.enabled()) {
271
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
272
272
  gpr_log(GPR_INFO, "TCP:%p notify_on_write", tcp);
273
273
  }
274
- if (grpc_event_engine_run_in_background()) {
275
- // If there is a polling engine always running in the background, there is
276
- // no need to run the backup poller.
277
- GRPC_CLOSURE_INIT(&tcp->write_done_closure, tcp_handle_write, tcp,
278
- grpc_schedule_on_exec_ctx);
279
- } else {
274
+ if (!grpc_event_engine_run_in_background()) {
280
275
  cover_self(tcp);
281
- GRPC_CLOSURE_INIT(&tcp->write_done_closure,
282
- tcp_drop_uncovered_then_handle_write, tcp,
283
- grpc_schedule_on_exec_ctx);
284
276
  }
285
277
  grpc_fd_notify_on_write(tcp->em_fd, &tcp->write_done_closure);
286
278
  }
287
279
 
288
280
  static void tcp_drop_uncovered_then_handle_write(void* arg, grpc_error* error) {
289
- if (grpc_tcp_trace.enabled()) {
281
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
290
282
  gpr_log(GPR_INFO, "TCP:%p got_write: %s", arg, grpc_error_string(error));
291
283
  }
292
284
  drop_uncovered(static_cast<grpc_tcp*>(arg));
@@ -371,7 +363,7 @@ static void tcp_free(grpc_tcp* tcp) {
371
363
  #define TCP_REF(tcp, reason) tcp_ref((tcp), (reason), __FILE__, __LINE__)
372
364
  static void tcp_unref(grpc_tcp* tcp, const char* reason, const char* file,
373
365
  int line) {
374
- if (grpc_tcp_trace.enabled()) {
366
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
375
367
  gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
376
368
  gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
377
369
  "TCP unref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp, reason, val,
@@ -384,7 +376,7 @@ static void tcp_unref(grpc_tcp* tcp, const char* reason, const char* file,
384
376
 
385
377
  static void tcp_ref(grpc_tcp* tcp, const char* reason, const char* file,
386
378
  int line) {
387
- if (grpc_tcp_trace.enabled()) {
379
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
388
380
  gpr_atm val = gpr_atm_no_barrier_load(&tcp->refcount.count);
389
381
  gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
390
382
  "TCP ref %p : %s %" PRIdPTR " -> %" PRIdPTR, tcp, reason, val,
@@ -417,7 +409,7 @@ static void tcp_destroy(grpc_endpoint* ep) {
417
409
  static void call_read_cb(grpc_tcp* tcp, grpc_error* error) {
418
410
  grpc_closure* cb = tcp->read_cb;
419
411
 
420
- if (grpc_tcp_trace.enabled()) {
412
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
421
413
  gpr_log(GPR_INFO, "TCP:%p call_cb %p %p:%p", tcp, cb, cb->cb, cb->cb_arg);
422
414
  size_t i;
423
415
  const char* str = grpc_error_string(error);
@@ -581,7 +573,7 @@ static void tcp_do_read(grpc_tcp* tcp) {
581
573
 
582
574
  static void tcp_read_allocation_done(void* tcpp, grpc_error* error) {
583
575
  grpc_tcp* tcp = static_cast<grpc_tcp*>(tcpp);
584
- if (grpc_tcp_trace.enabled()) {
576
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
585
577
  gpr_log(GPR_INFO, "TCP:%p read_allocation_done: %s", tcp,
586
578
  grpc_error_string(error));
587
579
  }
@@ -600,13 +592,13 @@ static void tcp_continue_read(grpc_tcp* tcp) {
600
592
  /* Wait for allocation only when there is no buffer left. */
601
593
  if (tcp->incoming_buffer->length == 0 &&
602
594
  tcp->incoming_buffer->count < MAX_READ_IOVEC) {
603
- if (grpc_tcp_trace.enabled()) {
595
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
604
596
  gpr_log(GPR_INFO, "TCP:%p alloc_slices", tcp);
605
597
  }
606
598
  grpc_resource_user_alloc_slices(&tcp->slice_allocator, target_read_size, 1,
607
599
  tcp->incoming_buffer);
608
600
  } else {
609
- if (grpc_tcp_trace.enabled()) {
601
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
610
602
  gpr_log(GPR_INFO, "TCP:%p do_read", tcp);
611
603
  }
612
604
  tcp_do_read(tcp);
@@ -615,7 +607,7 @@ static void tcp_continue_read(grpc_tcp* tcp) {
615
607
 
616
608
  static void tcp_handle_read(void* arg /* grpc_tcp */, grpc_error* error) {
617
609
  grpc_tcp* tcp = static_cast<grpc_tcp*>(arg);
618
- if (grpc_tcp_trace.enabled()) {
610
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
619
611
  gpr_log(GPR_INFO, "TCP:%p got_read: %s", tcp, grpc_error_string(error));
620
612
  }
621
613
 
@@ -694,7 +686,7 @@ static bool tcp_write_with_timestamps(grpc_tcp* tcp, struct msghdr* msg,
694
686
  if (setsockopt(tcp->fd, SOL_SOCKET, SO_TIMESTAMPING,
695
687
  static_cast<void*>(&opt), sizeof(opt)) != 0) {
696
688
  grpc_slice_buffer_reset_and_unref_internal(tcp->outgoing_buffer);
697
- if (grpc_tcp_trace.enabled()) {
689
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
698
690
  gpr_log(GPR_ERROR, "Failed to set timestamping options on the socket.");
699
691
  }
700
692
  return false;
@@ -743,7 +735,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
743
735
  auto next_cmsg = CMSG_NXTHDR(msg, cmsg);
744
736
  cmsghdr* opt_stats = nullptr;
745
737
  if (next_cmsg == nullptr) {
746
- if (grpc_tcp_trace.enabled()) {
738
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
747
739
  gpr_log(GPR_ERROR, "Received timestamp without extended error");
748
740
  }
749
741
  return cmsg;
@@ -755,7 +747,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
755
747
  opt_stats = next_cmsg;
756
748
  next_cmsg = CMSG_NXTHDR(msg, opt_stats);
757
749
  if (next_cmsg == nullptr) {
758
- if (grpc_tcp_trace.enabled()) {
750
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
759
751
  gpr_log(GPR_ERROR, "Received timestamp without extended error");
760
752
  }
761
753
  return opt_stats;
@@ -765,7 +757,7 @@ struct cmsghdr* process_timestamp(grpc_tcp* tcp, msghdr* msg,
765
757
  if (!(next_cmsg->cmsg_level == SOL_IP || next_cmsg->cmsg_level == SOL_IPV6) ||
766
758
  !(next_cmsg->cmsg_type == IP_RECVERR ||
767
759
  next_cmsg->cmsg_type == IPV6_RECVERR)) {
768
- if (grpc_tcp_trace.enabled()) {
760
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
769
761
  gpr_log(GPR_ERROR, "Unexpected control message");
770
762
  }
771
763
  return cmsg;
@@ -847,7 +839,7 @@ static void process_errors(grpc_tcp* tcp) {
847
839
  cmsg->cmsg_type != SCM_TIMESTAMPING) {
848
840
  /* Got a control message that is not a timestamp. Don't know how to
849
841
  * handle this. */
850
- if (grpc_tcp_trace.enabled()) {
842
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
851
843
  gpr_log(GPR_INFO,
852
844
  "unknown control message cmsg_level:%d cmsg_type:%d",
853
845
  cmsg->cmsg_level, cmsg->cmsg_type);
@@ -865,7 +857,7 @@ static void process_errors(grpc_tcp* tcp) {
865
857
 
866
858
  static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error) {
867
859
  grpc_tcp* tcp = static_cast<grpc_tcp*>(arg);
868
- if (grpc_tcp_trace.enabled()) {
860
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
869
861
  gpr_log(GPR_INFO, "TCP:%p got_error: %s", tcp, grpc_error_string(error));
870
862
  }
871
863
 
@@ -884,8 +876,6 @@ static void tcp_handle_error(void* arg /* grpc_tcp */, grpc_error* error) {
884
876
  * ready. */
885
877
  grpc_fd_set_readable(tcp->em_fd);
886
878
  grpc_fd_set_writable(tcp->em_fd);
887
- GRPC_CLOSURE_INIT(&tcp->error_closure, tcp_handle_error, tcp,
888
- grpc_schedule_on_exec_ctx);
889
879
  grpc_fd_notify_on_error(tcp->em_fd, &tcp->error_closure);
890
880
  }
891
881
 
@@ -1044,14 +1034,14 @@ static void tcp_handle_write(void* arg /* grpc_tcp */, grpc_error* error) {
1044
1034
  }
1045
1035
 
1046
1036
  if (!tcp_flush(tcp, &error)) {
1047
- if (grpc_tcp_trace.enabled()) {
1037
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1048
1038
  gpr_log(GPR_INFO, "write: delayed");
1049
1039
  }
1050
1040
  notify_on_write(tcp);
1051
1041
  } else {
1052
1042
  cb = tcp->write_cb;
1053
1043
  tcp->write_cb = nullptr;
1054
- if (grpc_tcp_trace.enabled()) {
1044
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1055
1045
  const char* str = grpc_error_string(error);
1056
1046
  gpr_log(GPR_INFO, "write: %s", str);
1057
1047
  }
@@ -1066,7 +1056,7 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
1066
1056
  grpc_tcp* tcp = reinterpret_cast<grpc_tcp*>(ep);
1067
1057
  grpc_error* error = GRPC_ERROR_NONE;
1068
1058
 
1069
- if (grpc_tcp_trace.enabled()) {
1059
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1070
1060
  size_t i;
1071
1061
 
1072
1062
  for (i = 0; i < buf->count; i++) {
@@ -1101,12 +1091,12 @@ static void tcp_write(grpc_endpoint* ep, grpc_slice_buffer* buf,
1101
1091
  if (!tcp_flush(tcp, &error)) {
1102
1092
  TCP_REF(tcp, "write");
1103
1093
  tcp->write_cb = cb;
1104
- if (grpc_tcp_trace.enabled()) {
1094
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1105
1095
  gpr_log(GPR_INFO, "write: delayed");
1106
1096
  }
1107
1097
  notify_on_write(tcp);
1108
1098
  } else {
1109
- if (grpc_tcp_trace.enabled()) {
1099
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_tcp_trace)) {
1110
1100
  const char* str = grpc_error_string(error);
1111
1101
  gpr_log(GPR_INFO, "write: %s", str);
1112
1102
  }
@@ -1248,6 +1238,16 @@ grpc_endpoint* grpc_tcp_create(grpc_fd* em_fd,
1248
1238
  tcp->tb_head = nullptr;
1249
1239
  GRPC_CLOSURE_INIT(&tcp->read_done_closure, tcp_handle_read, tcp,
1250
1240
  grpc_schedule_on_exec_ctx);
1241
+ if (grpc_event_engine_run_in_background()) {
1242
+ // If there is a polling engine always running in the background, there is
1243
+ // no need to run the backup poller.
1244
+ GRPC_CLOSURE_INIT(&tcp->write_done_closure, tcp_handle_write, tcp,
1245
+ grpc_schedule_on_exec_ctx);
1246
+ } else {
1247
+ GRPC_CLOSURE_INIT(&tcp->write_done_closure,
1248
+ tcp_drop_uncovered_then_handle_write, tcp,
1249
+ grpc_schedule_on_exec_ctx);
1250
+ }
1251
1251
  /* Always assume there is something on the queue to read. */
1252
1252
  tcp->inq = 1;
1253
1253
  #ifdef GRPC_HAVE_TCP_INQ