blob: d38fe66d0613fe21da1792b13287c4d7f348cd2c [file] [log] [blame]
Yuchen Zeng85750b02016-08-08 14:16:34 -07001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2016 gRPC authors.
Yuchen Zeng85750b02016-08-08 14:16:34 -07004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * 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
Yuchen Zeng85750b02016-08-08 14:16:34 -07008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Yuchen Zeng85750b02016-08-08 14:16:34 -070010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * 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.
Yuchen Zeng85750b02016-08-08 14:16:34 -070016 *
17 */
18#include <grpc/support/port_platform.h>
Yuchen Zeng4e298e12016-10-28 16:08:19 -070019#include "src/core/lib/iomgr/port.h"
Yuchen Zeng9e4c8eb2016-11-18 01:06:57 -080020#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET)
Yuchen Zeng85750b02016-08-08 14:16:34 -070021
Nicolas "Pixel" Noble00f2c932017-04-04 20:38:14 +020022#include <ares.h>
Yuchen Zeng79c12b92017-09-18 22:02:52 -070023#include <sys/ioctl.h>
Nicolas "Pixel" Noble00f2c932017-04-04 20:38:14 +020024
Craig Tiller9eb0fde2017-03-31 16:59:30 -070025#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h"
Yuchen Zeng85750b02016-08-08 14:16:34 -070026
Yuchen Zeng85750b02016-08-08 14:16:34 -070027#include <grpc/support/alloc.h>
28#include <grpc/support/log.h>
29#include <grpc/support/string_util.h>
30#include <grpc/support/time.h>
31#include <grpc/support/useful.h>
Craig Tiller9eb0fde2017-03-31 16:59:30 -070032#include "src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h"
Yuchen Zeng4e298e12016-10-28 16:08:19 -070033#include "src/core/lib/iomgr/ev_posix.h"
Yuchen Zeng85750b02016-08-08 14:16:34 -070034#include "src/core/lib/iomgr/iomgr_internal.h"
35#include "src/core/lib/iomgr/sockaddr_utils.h"
Yuchen Zeng85750b02016-08-08 14:16:34 -070036#include "src/core/lib/support/string.h"
37
Yuchen Zengc1893dc2016-09-30 18:49:41 -070038typedef struct fd_node {
Yuchen Zenge8d83092016-10-27 17:30:17 -070039 /** the owner of this fd node */
40 grpc_ares_ev_driver *ev_driver;
Yuchen Zenge8d83092016-10-27 17:30:17 -070041 /** the grpc_fd owned by this fd node */
Yash Tibrewalbc130da2017-09-12 22:44:08 -070042 grpc_fd *fd;
Yuchen Zenge8d83092016-10-27 17:30:17 -070043 /** a closure wrapping on_readable_cb, which should be invoked when the
44 grpc_fd in this node becomes readable. */
45 grpc_closure read_closure;
46 /** a closure wrapping on_writable_cb, which should be invoked when the
47 grpc_fd in this node becomes writable. */
48 grpc_closure write_closure;
49 /** next fd node in the list */
Yuchen Zengc1893dc2016-09-30 18:49:41 -070050 struct fd_node *next;
Yuchen Zenge8d83092016-10-27 17:30:17 -070051
52 /** mutex guarding the rest of the state */
53 gpr_mu mu;
54 /** if the readable closure has been registered */
55 bool readable_registered;
56 /** if the writable closure has been registered */
57 bool writable_registered;
Yuchen Zeng79c12b92017-09-18 22:02:52 -070058 /** if the fd is being shut down */
59 bool shutting_down;
Yuchen Zengc1893dc2016-09-30 18:49:41 -070060} fd_node;
Yuchen Zeng85750b02016-08-08 14:16:34 -070061
62struct grpc_ares_ev_driver {
Yuchen Zengc1893dc2016-09-30 18:49:41 -070063 /** the ares_channel owned by this event driver */
Yuchen Zeng8917aec2016-08-09 18:41:31 -070064 ares_channel channel;
Yuchen Zengc1893dc2016-09-30 18:49:41 -070065 /** pollset set for driving the IO events of the channel */
66 grpc_pollset_set *pollset_set;
Yuchen Zeng8a6cba22016-11-09 18:19:13 -080067 /** refcount of the event driver */
68 gpr_refcount refs;
Yuchen Zengc87b77f2016-10-03 11:36:36 -070069
Yuchen Zeng43aa9a12016-10-25 10:44:39 -070070 /** mutex guarding the rest of the state */
Yuchen Zengc87b77f2016-10-03 11:36:36 -070071 gpr_mu mu;
Yuchen Zenge8d83092016-10-27 17:30:17 -070072 /** a list of grpc_fd that this event driver is currently using. */
73 fd_node *fds;
Yuchen Zengc87b77f2016-10-03 11:36:36 -070074 /** is this event driver currently working? */
75 bool working;
Yuchen Zeng117a3002016-11-17 19:43:36 -080076 /** is this event driver being shut down */
77 bool shutting_down;
Yuchen Zeng85750b02016-08-08 14:16:34 -070078};
79
Yuchen Zenge8d83092016-10-27 17:30:17 -070080static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx,
81 grpc_ares_ev_driver *ev_driver);
82
Yuchen Zeng8a6cba22016-11-09 18:19:13 -080083static grpc_ares_ev_driver *grpc_ares_ev_driver_ref(
84 grpc_ares_ev_driver *ev_driver) {
85 gpr_log(GPR_DEBUG, "Ref ev_driver %" PRIuPTR, (uintptr_t)ev_driver);
86 gpr_ref(&ev_driver->refs);
87 return ev_driver;
Yuchen Zenge8d83092016-10-27 17:30:17 -070088}
89
Yuchen Zeng8a6cba22016-11-09 18:19:13 -080090static void grpc_ares_ev_driver_unref(grpc_ares_ev_driver *ev_driver) {
91 gpr_log(GPR_DEBUG, "Unref ev_driver %" PRIuPTR, (uintptr_t)ev_driver);
92 if (gpr_unref(&ev_driver->refs)) {
93 gpr_log(GPR_DEBUG, "destroy ev_driver %" PRIuPTR, (uintptr_t)ev_driver);
94 GPR_ASSERT(ev_driver->fds == NULL);
95 gpr_mu_destroy(&ev_driver->mu);
96 ares_destroy(ev_driver->channel);
97 gpr_free(ev_driver);
Yuchen Zenge8d83092016-10-27 17:30:17 -070098 }
99}
Yuchen Zeng213d7842016-08-26 19:28:16 -0700100
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800101static void fd_node_destroy(grpc_exec_ctx *exec_ctx, fd_node *fdn) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700102 gpr_log(GPR_DEBUG, "delete fd: %d", grpc_fd_wrapped_fd(fdn->fd));
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800103 GPR_ASSERT(!fdn->readable_registered);
104 GPR_ASSERT(!fdn->writable_registered);
105 gpr_mu_destroy(&fdn->mu);
Yuchen Zeng1f4b2a82017-06-05 15:24:31 -0700106 /* c-ares library has closed the fd inside grpc_fd. This fd may be picked up
107 immediately by another thread, and should not be closed by the following
Yuchen Zengd40a7ae2017-07-12 15:59:56 -0700108 grpc_fd_orphan. */
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700109 grpc_fd_orphan(exec_ctx, fdn->fd, NULL, NULL, true /* already_closed */,
Yuchen Zengd40a7ae2017-07-12 15:59:56 -0700110 "c-ares query finished");
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800111 gpr_free(fdn);
112}
113
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700114static void fd_node_shutdown(grpc_exec_ctx *exec_ctx, fd_node *fdn) {
115 gpr_mu_lock(&fdn->mu);
116 fdn->shutting_down = true;
117 if (!fdn->readable_registered && !fdn->writable_registered) {
118 gpr_mu_unlock(&fdn->mu);
119 fd_node_destroy(exec_ctx, fdn);
120 } else {
121 grpc_fd_shutdown(
122 exec_ctx, fdn->fd,
123 GRPC_ERROR_CREATE_FROM_STATIC_STRING("c-ares fd shutdown"));
124 gpr_mu_unlock(&fdn->mu);
125 }
126}
127
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700128grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver,
129 grpc_pollset_set *pollset_set) {
Yash Tibrewalca3c1c02017-09-07 22:47:16 -0700130 *ev_driver = (grpc_ares_ev_driver *)gpr_malloc(sizeof(grpc_ares_ev_driver));
Yuchen Zeng19d7bab2016-11-30 15:51:19 -0800131 int status = ares_init(&(*ev_driver)->channel);
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800132 gpr_log(GPR_DEBUG, "grpc_ares_ev_driver_create");
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700133 if (status != ARES_SUCCESS) {
Yuchen Zeng43aa9a12016-10-25 10:44:39 -0700134 char *err_msg;
135 gpr_asprintf(&err_msg, "Failed to init ares channel. C-ares error: %s",
136 ares_strerror(status));
Yuchen Zeng0e8bc452017-03-23 14:44:14 -0700137 grpc_error *err = GRPC_ERROR_CREATE_FROM_COPIED_STRING(err_msg);
Yuchen Zeng43aa9a12016-10-25 10:44:39 -0700138 gpr_free(err_msg);
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700139 gpr_free(*ev_driver);
Yuchen Zeng43aa9a12016-10-25 10:44:39 -0700140 return err;
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700141 }
Yuchen Zeng213d7842016-08-26 19:28:16 -0700142 gpr_mu_init(&(*ev_driver)->mu);
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800143 gpr_ref_init(&(*ev_driver)->refs, 1);
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700144 (*ev_driver)->pollset_set = pollset_set;
145 (*ev_driver)->fds = NULL;
Yuchen Zengffbc1672016-10-03 11:29:22 -0700146 (*ev_driver)->working = false;
Yuchen Zeng117a3002016-11-17 19:43:36 -0800147 (*ev_driver)->shutting_down = false;
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700148 return GRPC_ERROR_NONE;
149}
150
Yuchen Zengf47c9632016-11-18 20:41:20 -0800151void grpc_ares_ev_driver_destroy(grpc_ares_ev_driver *ev_driver) {
Yuchen Zeng117a3002016-11-17 19:43:36 -0800152 // It's not safe to shut down remaining fds here directly, becauses
153 // ares_host_callback does not provide an exec_ctx. We mark the event driver
154 // as being shut down. If the event driver is working,
155 // grpc_ares_notify_on_event_locked will shut down the fds; if it's not
Yuchen Zengf47c9632016-11-18 20:41:20 -0800156 // working, there are no fds to shut down.
Yuchen Zenge8d83092016-10-27 17:30:17 -0700157 gpr_mu_lock(&ev_driver->mu);
Yuchen Zeng117a3002016-11-17 19:43:36 -0800158 ev_driver->shutting_down = true;
Yuchen Zenge8d83092016-10-27 17:30:17 -0700159 gpr_mu_unlock(&ev_driver->mu);
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800160 grpc_ares_ev_driver_unref(ev_driver);
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700161}
162
Yuchen Zeng3b4bed22017-06-04 01:41:15 -0700163void grpc_ares_ev_driver_shutdown(grpc_exec_ctx *exec_ctx,
164 grpc_ares_ev_driver *ev_driver) {
165 gpr_mu_lock(&ev_driver->mu);
166 ev_driver->shutting_down = true;
167 fd_node *fn = ev_driver->fds;
168 while (fn != NULL) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700169 grpc_fd_shutdown(exec_ctx, fn->fd, GRPC_ERROR_CREATE_FROM_STATIC_STRING(
170 "grpc_ares_ev_driver_shutdown"));
Yuchen Zeng3b4bed22017-06-04 01:41:15 -0700171 fn = fn->next;
172 }
173 gpr_mu_unlock(&ev_driver->mu);
174}
175
Yuchen Zeng3026b6c2016-10-03 16:03:29 -0700176// Search fd in the fd_node list head. This is an O(n) search, the max possible
Yuchen Zenge8d83092016-10-27 17:30:17 -0700177// value of n is ARES_GETSOCK_MAXNUM (16). n is typically 1 - 2 in our tests.
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800178static fd_node *pop_fd_node(fd_node **head, int fd) {
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700179 fd_node dummy_head;
Yuchen Zeng85750b02016-08-08 14:16:34 -0700180 dummy_head.next = *head;
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800181 fd_node *node = &dummy_head;
Yuchen Zeng85750b02016-08-08 14:16:34 -0700182 while (node->next != NULL) {
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700183 if (grpc_fd_wrapped_fd(node->next->fd) == fd) {
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800184 fd_node *ret = node->next;
Yuchen Zeng85750b02016-08-08 14:16:34 -0700185 node->next = node->next->next;
186 *head = dummy_head.next;
187 return ret;
188 }
Yuchen Zengc87b77f2016-10-03 11:36:36 -0700189 node = node->next;
Yuchen Zeng85750b02016-08-08 14:16:34 -0700190 }
191 return NULL;
192}
193
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700194/* Check if \a fd is still readable */
195static bool grpc_ares_is_fd_still_readable(grpc_ares_ev_driver *ev_driver,
196 int fd) {
197 size_t bytes_available = 0;
198 return ioctl(fd, FIONREAD, &bytes_available) == 0 && bytes_available > 0;
199}
200
Yuchen Zenge8d83092016-10-27 17:30:17 -0700201static void on_readable_cb(grpc_exec_ctx *exec_ctx, void *arg,
202 grpc_error *error) {
Yash Tibrewalca3c1c02017-09-07 22:47:16 -0700203 fd_node *fdn = (fd_node *)arg;
Yuchen Zenge8d83092016-10-27 17:30:17 -0700204 grpc_ares_ev_driver *ev_driver = fdn->ev_driver;
205 gpr_mu_lock(&fdn->mu);
206 fdn->readable_registered = false;
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700207 if (fdn->shutting_down && !fdn->writable_registered) {
208 gpr_mu_unlock(&fdn->mu);
209 fd_node_destroy(exec_ctx, fdn);
210 grpc_ares_ev_driver_unref(ev_driver);
211 return;
212 }
Yuchen Zenge8d83092016-10-27 17:30:17 -0700213 gpr_mu_unlock(&fdn->mu);
Yuchen Zeng925b6882016-08-24 18:42:25 -0700214
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700215 gpr_log(GPR_DEBUG, "readable on %d", grpc_fd_wrapped_fd(fdn->fd));
Yuchen Zeng85750b02016-08-08 14:16:34 -0700216 if (error == GRPC_ERROR_NONE) {
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700217 do {
218 ares_process_fd(ev_driver->channel, grpc_fd_wrapped_fd(fdn->fd),
219 ARES_SOCKET_BAD);
220 } while (
221 grpc_ares_is_fd_still_readable(ev_driver, grpc_fd_wrapped_fd(fdn->fd)));
Yuchen Zeng4dd18912016-08-24 17:17:17 -0700222 } else {
Yuchen Zenge8d83092016-10-27 17:30:17 -0700223 // If error is not GRPC_ERROR_NONE, it means the fd has been shutdown or
224 // timed out. The pending lookups made on this ev_driver will be cancelled
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800225 // by the following ares_cancel() and the on_done callbacks will be invoked
Yuchen Zenge8d83092016-10-27 17:30:17 -0700226 // with a status of ARES_ECANCELLED. The remaining file descriptors in this
227 // ev_driver will be cleaned up in the follwing
228 // grpc_ares_notify_on_event_locked().
229 ares_cancel(ev_driver->channel);
Yuchen Zeng85750b02016-08-08 14:16:34 -0700230 }
Yuchen Zenge8d83092016-10-27 17:30:17 -0700231 gpr_mu_lock(&ev_driver->mu);
232 grpc_ares_notify_on_event_locked(exec_ctx, ev_driver);
233 gpr_mu_unlock(&ev_driver->mu);
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800234 grpc_ares_ev_driver_unref(ev_driver);
Yuchen Zeng85750b02016-08-08 14:16:34 -0700235}
236
Yuchen Zenge8d83092016-10-27 17:30:17 -0700237static void on_writable_cb(grpc_exec_ctx *exec_ctx, void *arg,
238 grpc_error *error) {
Yash Tibrewalca3c1c02017-09-07 22:47:16 -0700239 fd_node *fdn = (fd_node *)arg;
Yuchen Zenge8d83092016-10-27 17:30:17 -0700240 grpc_ares_ev_driver *ev_driver = fdn->ev_driver;
241 gpr_mu_lock(&fdn->mu);
242 fdn->writable_registered = false;
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700243 if (fdn->shutting_down && !fdn->readable_registered) {
244 gpr_mu_unlock(&fdn->mu);
245 fd_node_destroy(exec_ctx, fdn);
246 grpc_ares_ev_driver_unref(ev_driver);
247 return;
248 }
Yuchen Zenge8d83092016-10-27 17:30:17 -0700249 gpr_mu_unlock(&fdn->mu);
250
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700251 gpr_log(GPR_DEBUG, "writable on %d", grpc_fd_wrapped_fd(fdn->fd));
Yuchen Zenge8d83092016-10-27 17:30:17 -0700252 if (error == GRPC_ERROR_NONE) {
253 ares_process_fd(ev_driver->channel, ARES_SOCKET_BAD,
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700254 grpc_fd_wrapped_fd(fdn->fd));
Yuchen Zenge8d83092016-10-27 17:30:17 -0700255 } else {
256 // If error is not GRPC_ERROR_NONE, it means the fd has been shutdown or
257 // timed out. The pending lookups made on this ev_driver will be cancelled
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800258 // by the following ares_cancel() and the on_done callbacks will be invoked
Yuchen Zenge8d83092016-10-27 17:30:17 -0700259 // with a status of ARES_ECANCELLED. The remaining file descriptors in this
260 // ev_driver will be cleaned up in the follwing
261 // grpc_ares_notify_on_event_locked().
262 ares_cancel(ev_driver->channel);
263 }
Yuchen Zenge8d83092016-10-27 17:30:17 -0700264 gpr_mu_lock(&ev_driver->mu);
265 grpc_ares_notify_on_event_locked(exec_ctx, ev_driver);
266 gpr_mu_unlock(&ev_driver->mu);
Yuchen Zeng8a6cba22016-11-09 18:19:13 -0800267 grpc_ares_ev_driver_unref(ev_driver);
Yuchen Zenge8d83092016-10-27 17:30:17 -0700268}
269
Yuchen Zeng9e4c8eb2016-11-18 01:06:57 -0800270ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) {
Yuchen Zeng9248d352016-08-16 16:33:10 -0700271 return &ev_driver->channel;
272}
273
Yuchen Zeng3026b6c2016-10-03 16:03:29 -0700274// Get the file descriptors used by the ev_driver's ares channel, register
275// driver_closure with these filedescriptors.
Yuchen Zenge8d83092016-10-27 17:30:17 -0700276static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx,
277 grpc_ares_ev_driver *ev_driver) {
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700278 fd_node *new_list = NULL;
Yuchen Zeng117a3002016-11-17 19:43:36 -0800279 if (!ev_driver->shutting_down) {
280 ares_socket_t socks[ARES_GETSOCK_MAXNUM];
281 int socks_bitmask =
282 ares_getsock(ev_driver->channel, socks, ARES_GETSOCK_MAXNUM);
283 for (size_t i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
284 if (ARES_GETSOCK_READABLE(socks_bitmask, i) ||
285 ARES_GETSOCK_WRITABLE(socks_bitmask, i)) {
286 fd_node *fdn = pop_fd_node(&ev_driver->fds, socks[i]);
287 // Create a new fd_node if sock[i] is not in the fd_node list.
288 if (fdn == NULL) {
289 char *fd_name;
290 gpr_asprintf(&fd_name, "ares_ev_driver-%" PRIuPTR, i);
Yash Tibrewalca3c1c02017-09-07 22:47:16 -0700291 fdn = (fd_node *)gpr_malloc(sizeof(fd_node));
Yuchen Zeng117a3002016-11-17 19:43:36 -0800292 gpr_log(GPR_DEBUG, "new fd: %d", socks[i]);
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700293 fdn->fd = grpc_fd_create(socks[i], fd_name);
Yuchen Zeng117a3002016-11-17 19:43:36 -0800294 fdn->ev_driver = ev_driver;
295 fdn->readable_registered = false;
296 fdn->writable_registered = false;
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700297 fdn->shutting_down = false;
Yuchen Zeng117a3002016-11-17 19:43:36 -0800298 gpr_mu_init(&fdn->mu);
ncteisen274bbbe2017-06-08 14:57:11 -0700299 GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_cb, fdn,
Yuchen Zeng2ef172b2017-01-19 16:26:55 -0800300 grpc_schedule_on_exec_ctx);
ncteisen274bbbe2017-06-08 14:57:11 -0700301 GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_cb, fdn,
Yuchen Zeng2ef172b2017-01-19 16:26:55 -0800302 grpc_schedule_on_exec_ctx);
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700303 grpc_pollset_set_add_fd(exec_ctx, ev_driver->pollset_set, fdn->fd);
Yuchen Zeng117a3002016-11-17 19:43:36 -0800304 gpr_free(fd_name);
305 }
306 fdn->next = new_list;
307 new_list = fdn;
308 gpr_mu_lock(&fdn->mu);
309 // Register read_closure if the socket is readable and read_closure has
310 // not been registered with this socket.
311 if (ARES_GETSOCK_READABLE(socks_bitmask, i) &&
312 !fdn->readable_registered) {
313 grpc_ares_ev_driver_ref(ev_driver);
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700314 gpr_log(GPR_DEBUG, "notify read on: %d", grpc_fd_wrapped_fd(fdn->fd));
315 grpc_fd_notify_on_read(exec_ctx, fdn->fd, &fdn->read_closure);
Yuchen Zeng117a3002016-11-17 19:43:36 -0800316 fdn->readable_registered = true;
317 }
318 // Register write_closure if the socket is writable and write_closure
Yuchen Zengf47c9632016-11-18 20:41:20 -0800319 // has not been registered with this socket.
Yuchen Zeng117a3002016-11-17 19:43:36 -0800320 if (ARES_GETSOCK_WRITABLE(socks_bitmask, i) &&
321 !fdn->writable_registered) {
322 gpr_log(GPR_DEBUG, "notify write on: %d",
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700323 grpc_fd_wrapped_fd(fdn->fd));
Yuchen Zeng117a3002016-11-17 19:43:36 -0800324 grpc_ares_ev_driver_ref(ev_driver);
Yash Tibrewalbc130da2017-09-12 22:44:08 -0700325 grpc_fd_notify_on_write(exec_ctx, fdn->fd, &fdn->write_closure);
Yuchen Zeng117a3002016-11-17 19:43:36 -0800326 fdn->writable_registered = true;
327 }
328 gpr_mu_unlock(&fdn->mu);
Yuchen Zeng85750b02016-08-08 14:16:34 -0700329 }
Yuchen Zeng85750b02016-08-08 14:16:34 -0700330 }
Yuchen Zeng85750b02016-08-08 14:16:34 -0700331 }
Yuchen Zeng3483cf52016-11-10 23:09:00 -0800332 // Any remaining fds in ev_driver->fds were not returned by ares_getsock() and
333 // are therefore no longer in use, so they can be shut down and removed from
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800334 // the list.
Yuchen Zeng85750b02016-08-08 14:16:34 -0700335 while (ev_driver->fds != NULL) {
Yuchen Zeng912327e2016-10-25 18:27:17 -0700336 fd_node *cur = ev_driver->fds;
Yuchen Zeng85750b02016-08-08 14:16:34 -0700337 ev_driver->fds = ev_driver->fds->next;
Yuchen Zeng79c12b92017-09-18 22:02:52 -0700338 fd_node_shutdown(exec_ctx, cur);
Yuchen Zeng85750b02016-08-08 14:16:34 -0700339 }
Yuchen Zeng85750b02016-08-08 14:16:34 -0700340 ev_driver->fds = new_list;
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700341 // If the ev driver has no working fd, all the tasks are done.
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800342 if (new_list == NULL) {
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700343 ev_driver->working = false;
Yuchen Zenge8d83092016-10-27 17:30:17 -0700344 gpr_log(GPR_DEBUG, "ev driver stop working");
Yuchen Zeng8917aec2016-08-09 18:41:31 -0700345 }
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700346}
347
348void grpc_ares_ev_driver_start(grpc_exec_ctx *exec_ctx,
349 grpc_ares_ev_driver *ev_driver) {
350 gpr_mu_lock(&ev_driver->mu);
Yuchen Zeng3ae26632016-11-09 15:53:50 -0800351 if (!ev_driver->working) {
352 ev_driver->working = true;
353 grpc_ares_notify_on_event_locked(exec_ctx, ev_driver);
Yuchen Zengc1893dc2016-09-30 18:49:41 -0700354 }
Yuchen Zeng213d7842016-08-26 19:28:16 -0700355 gpr_mu_unlock(&ev_driver->mu);
Yuchen Zeng85750b02016-08-08 14:16:34 -0700356}
357
Yuchen Zeng9e4c8eb2016-11-18 01:06:57 -0800358#endif /* GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET) */