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 */