Add mutex for grpc_ares_ev_driver
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
index 6300ed3..dbc105f 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_ev_driver_posix.c
@@ -58,6 +58,7 @@
} fd_pair;
struct grpc_ares_ev_driver {
+ gpr_mu mu;
bool closing;
ares_socket_t socks[ARES_GETSOCK_MAXNUM];
int bitmask;
@@ -67,6 +68,9 @@
fd_pair *fds;
};
+static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx,
+ grpc_ares_ev_driver *ev_driver);
+
grpc_error *grpc_ares_ev_driver_create(grpc_ares_ev_driver **ev_driver,
grpc_pollset_set *pollset_set) {
int status;
@@ -76,6 +80,7 @@
gpr_free(*ev_driver);
return GRPC_ERROR_CREATE("Failed to init ares channel");
}
+ gpr_mu_init(&(*ev_driver)->mu);
(*ev_driver)->pollset_set = pollset_set;
(*ev_driver)->fds = NULL;
(*ev_driver)->closing = false;
@@ -108,6 +113,7 @@
grpc_ares_ev_driver *d = arg;
size_t i;
+ gpr_mu_lock(&d->mu);
if (error == GRPC_ERROR_NONE) {
for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
ares_process_fd(
@@ -118,15 +124,22 @@
} else {
ares_cancel(d->channel);
}
- grpc_ares_notify_on_event(exec_ctx, d);
+ grpc_ares_notify_on_event_locked(exec_ctx, d);
+ if (d->closing) {
+ ares_destroy(d->channel);
+ gpr_mu_unlock(&d->mu);
+ gpr_free(d);
+ return;
+ }
+ gpr_mu_unlock(&d->mu);
}
ares_channel *grpc_ares_ev_driver_get_channel(grpc_ares_ev_driver *ev_driver) {
return &ev_driver->channel;
}
-void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx,
- grpc_ares_ev_driver *ev_driver) {
+static void grpc_ares_notify_on_event_locked(grpc_exec_ctx *exec_ctx,
+ grpc_ares_ev_driver *ev_driver) {
size_t i;
fd_pair *new_list = NULL;
if (!ev_driver->closing) {
@@ -141,7 +154,7 @@
if (!fdp) {
char *fd_name;
gpr_asprintf(&fd_name, "ares_ev_driver-%" PRIuPTR, i);
-
+
fdp = gpr_malloc(sizeof(fd_pair));
fdp->grpc_fd = grpc_fd_create(ev_driver->socks[i], fd_name);
fdp->fd = ev_driver->socks[i];
@@ -177,10 +190,19 @@
}
ev_driver->fds = new_list;
+}
+
+void grpc_ares_notify_on_event(grpc_exec_ctx *exec_ctx,
+ grpc_ares_ev_driver *ev_driver) {
+ gpr_mu_lock(&ev_driver->mu);
+ grpc_ares_notify_on_event_locked(exec_ctx, ev_driver);
if (ev_driver->closing) {
ares_destroy(ev_driver->channel);
+ gpr_mu_unlock(&ev_driver->mu);
gpr_free(ev_driver);
+ return;
}
+ gpr_mu_unlock(&ev_driver->mu);
}
#endif /* GPR_POSIX_SOCKET */