aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Yuchen Zeng <zyc@google.com>2016-08-09 11:40:26 -0700
committerGravatar Yuchen Zeng <zyc@google.com>2016-08-09 11:40:26 -0700
commit459480bc1430cce89d2917402c120271fc6021ba (patch)
treec5bf247661d61d696bd2693891cacec4f21a0c3b /src/core
parent0c519e00fbf7653d605a75518be6d39e3f36855a (diff)
Fix ares_library_init msan issue
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c134
1 files changed, 15 insertions, 119 deletions
diff --git a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
index 70907b1794..0602c208ac 100644
--- a/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
+++ b/src/core/ext/resolver/dns/c_ares/grpc_ares_wrapper.c
@@ -64,6 +64,9 @@
#include "src/core/lib/support/block_annotate.h"
#include "src/core/lib/support/string.h"
+static gpr_once g_basic_init = GPR_ONCE_INIT;
+static gpr_mu g_init_mu;
+
struct grpc_ares_request {
char *name;
char *host;
@@ -78,124 +81,9 @@ struct grpc_ares_request {
grpc_ares_ev_driver *ev_driver;
};
-// struct grpc_pollset_set {
-// gpr_mu mu;
-//
-// size_t pollset_count;
-// size_t pollset_capacity;
-// grpc_pollset **pollsets;
-//
-// size_t pollset_set_count;
-// size_t pollset_set_capacity;
-// struct grpc_pollset_set **pollset_sets;
-//
-// size_t fd_count;
-// size_t fd_capacity;
-// grpc_fd **fds;
-// };
-
-// static void driver_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error);
-//
-// static fd_pair *get_fd(fd_pair **head, int fd) {
-// fd_pair dummy_head;
-// fd_pair *node;
-// fd_pair *ret;
-// dummy_head.next = *head;
-// node = &dummy_head;
-// while (node->next != NULL) {
-// if (node->next->fd == fd) {
-// ret = node->next;
-// node->next = node->next->next;
-// *head = dummy_head.next;
-// return ret;
-// }
-// }
-// return NULL;
-// }
-//
-// static void notify_on_event(grpc_exec_ctx *exec_ctx, driver *ev_driver) {
-// size_t i;
-// fd_pair *new_list = NULL;
-// ev_driver->bitmask =
-// ares_getsock(*ev_driver->channel, ev_driver->socks,
-// ARES_GETSOCK_MAXNUM);
-// grpc_closure_init(&ev_driver->driver_closure, driver_cb, ev_driver);
-// for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
-// char *final_name;
-// gpr_asprintf(&final_name, "host1%" PRIuPTR, i);
-//
-// if (ARES_GETSOCK_READABLE(ev_driver->bitmask, i) ||
-// ARES_GETSOCK_WRITABLE(ev_driver->bitmask, i)) {
-// gpr_log(GPR_ERROR, "%d", ev_driver->socks[i]);
-// fd_pair *fdp = get_fd(&ev_driver->fds, ev_driver->socks[i]);
-// if (!fdp) {
-// gpr_log(GPR_ERROR, "new fd");
-// fdp = gpr_malloc(sizeof(fd_pair));
-// fdp->grpc_fd = grpc_fd_create(ev_driver->socks[i], final_name);
-// fdp->fd = ev_driver->socks[i];
-// grpc_pollset_set_add_fd(exec_ctx, ev_driver->pollset_set,
-// fdp->grpc_fd);
-// // new_fd_pair->grpc_fd = fd;
-// // new_fd_pair->next = ev_driver->fds;
-// }
-// fdp->next = new_list;
-// new_list = fdp;
-//
-// if (ARES_GETSOCK_READABLE(ev_driver->bitmask, i)) {
-// gpr_log(GPR_ERROR, "READABLE");
-//
-// grpc_fd_notify_on_read(exec_ctx, fdp->grpc_fd,
-// &ev_driver->driver_closure);
-// }
-// if (ARES_GETSOCK_WRITABLE(ev_driver->bitmask, i)) {
-// gpr_log(GPR_ERROR, "writable");
-//
-// grpc_fd_notify_on_write(exec_ctx, fdp->grpc_fd,
-// &ev_driver->driver_closure);
-// }
-// }
-// gpr_free(final_name);
-// }
-//
-// while (ev_driver->fds != NULL) {
-// fd_pair *cur;
-// // int fd;s
-// cur = ev_driver->fds;
-// ev_driver->fds = ev_driver->fds->next;
-// gpr_log(GPR_ERROR, "fd in ev_driver: %d\n", cur->fd);
-// grpc_pollset_set_del_fd(exec_ctx, ev_driver->pollset_set, cur->grpc_fd);
-// gpr_log(GPR_ERROR, "grpc_pollset_set_del_fd");
-// grpc_fd_shutdown(exec_ctx, cur->grpc_fd);
-// gpr_log(GPR_ERROR, "grpc_fd_shutdown");
-// grpc_fd_orphan(exec_ctx, cur->grpc_fd, NULL, NULL, "come on..");
-// gpr_log(GPR_ERROR, "grpc_fd_orphan");
-// gpr_free(cur);
-// }
-//
-// ev_driver->fds = new_list;
-//
-// gpr_log(GPR_ERROR, "eof notify_on_event");
-// }
-//
-// static void driver_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error)
-// {
-// driver *d = arg;
-// size_t i;
-// gpr_log(GPR_ERROR, "driver_cb");
-// if (error == GRPC_ERROR_NONE) {
-// gpr_log(GPR_ERROR, "GRPC_ERROR_NONE");
-// for (i = 0; i < ARES_GETSOCK_MAXNUM; i++) {
-// ares_process_fd(
-// *d->channel,
-// ARES_GETSOCK_READABLE(d->bitmask, i) ? d->socks[i] :
-// ARES_SOCKET_BAD,
-// ARES_GETSOCK_WRITABLE(d->bitmask, i) ? d->socks[i] :
-// ARES_SOCKET_BAD);
-// }
-// }
-// notify_on_event(exec_ctx, d);
-// grpc_exec_ctx_flush(exec_ctx);
-// }
+static void do_basic_init(void) {
+ gpr_mu_init(&g_init_mu);
+}
static void on_done_cb(void *arg, int status, int timeouts,
struct hostent *hostent) {
@@ -377,11 +265,19 @@ grpc_ares_request *grpc_resolve_address_ares(grpc_exec_ctx *exec_ctx,
}
grpc_error *grpc_ares_init(void) {
+ gpr_once_init(&g_basic_init, do_basic_init);
+ gpr_mu_lock(&g_init_mu);
int status = ares_library_init(ARES_LIB_INIT_ALL);
+ gpr_mu_unlock(&g_init_mu);
+
if (status != ARES_SUCCESS) {
return GRPC_ERROR_CREATE("ares_library_init failed");
}
return GRPC_ERROR_NONE;
}
-void grpc_ares_cleanup(void) { ares_library_cleanup(); }
+void grpc_ares_cleanup(void) {
+ gpr_mu_lock(&g_init_mu);
+ ares_library_cleanup();
+ gpr_mu_unlock(&g_init_mu);
+}