diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc index 4ad80786519..e345ed73db8 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc @@ -132,8 +132,10 @@ static void fd_node_shutdown_locked(fd_node* fdn, const char* reason) { } } +static void on_timeout(void* arg, grpc_error* error); static void on_timeout_locked(void* arg, grpc_error* error); +static void on_ares_backup_poll_alarm(void* arg, grpc_error* error); static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error); static void noop_inject_channel_config(ares_channel channel) {} @@ -173,11 +175,7 @@ grpc_error* grpc_ares_ev_driver_create_locked(grpc_ares_ev_driver** ev_driver, grpc_core::NewGrpcPolledFdFactory((*ev_driver)->combiner); (*ev_driver) ->polled_fd_factory->ConfigureAresChannelLocked((*ev_driver)->channel); - GRPC_CLOSURE_INIT(&(*ev_driver)->on_timeout_locked, on_timeout_locked, - *ev_driver, grpc_combiner_scheduler(combiner)); - GRPC_CLOSURE_INIT(&(*ev_driver)->on_ares_backup_poll_alarm_locked, - on_ares_backup_poll_alarm_locked, *ev_driver, - grpc_combiner_scheduler(combiner)); + (*ev_driver)->query_timeout_ms = query_timeout_ms; return GRPC_ERROR_NONE; } @@ -235,6 +233,13 @@ static grpc_millis calculate_next_ares_backup_poll_alarm_ms( grpc_core::ExecCtx::Get()->Now(); } +static void on_timeout(void* arg, grpc_error* error) { + grpc_ares_ev_driver* driver = static_cast(arg); + driver->combiner->Run(GRPC_CLOSURE_INIT(&driver->on_timeout_locked, + on_timeout_locked, driver, nullptr), + GRPC_ERROR_REF(error)); +} + static void on_timeout_locked(void* arg, grpc_error* error) { grpc_ares_ev_driver* driver = static_cast(arg); GRPC_CARES_TRACE_LOG( @@ -247,6 +252,14 @@ static void on_timeout_locked(void* arg, grpc_error* error) { grpc_ares_ev_driver_unref(driver); } +static void on_ares_backup_poll_alarm(void* arg, grpc_error* error) { + grpc_ares_ev_driver* driver = static_cast(arg); + driver->combiner->Run( + GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, + on_ares_backup_poll_alarm_locked, driver, nullptr), + GRPC_ERROR_REF(error)); +} + /* In case of non-responsive DNS servers, dropped packets, etc., c-ares has * intelligent timeout and retry logic, which we can take advantage of by * polling ares_process_fd on time intervals. Overall, the c-ares library is @@ -279,6 +292,9 @@ static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error) { grpc_millis next_ares_backup_poll_alarm = calculate_next_ares_backup_poll_alarm_ms(driver); grpc_ares_ev_driver_ref(driver); + GRPC_CLOSURE_INIT(&driver->on_ares_backup_poll_alarm_locked, + on_ares_backup_poll_alarm, driver, + grpc_schedule_on_exec_ctx); grpc_timer_init(&driver->ares_backup_poll_alarm, next_ares_backup_poll_alarm, &driver->on_ares_backup_poll_alarm_locked); @@ -288,6 +304,13 @@ static void on_ares_backup_poll_alarm_locked(void* arg, grpc_error* error) { grpc_ares_ev_driver_unref(driver); } +static void on_readable(void* arg, grpc_error* error) { + fd_node* fdn = static_cast(arg); + fdn->ev_driver->combiner->Run( + GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable, fdn, nullptr), + GRPC_ERROR_REF(error)); +} + static void on_readable_locked(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); GPR_ASSERT(fdn->readable_registered); @@ -313,6 +336,13 @@ static void on_readable_locked(void* arg, grpc_error* error) { grpc_ares_ev_driver_unref(ev_driver); } +static void on_writable(void* arg, grpc_error* error) { + fd_node* fdn = static_cast(arg); + fdn->ev_driver->combiner->Run( + GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable, fdn, nullptr), + GRPC_ERROR_REF(error)); +} + static void on_writable_locked(void* arg, grpc_error* error) { fd_node* fdn = static_cast(arg); GPR_ASSERT(fdn->writable_registered); @@ -365,10 +395,6 @@ static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver) { fdn->readable_registered = false; fdn->writable_registered = false; fdn->already_shutdown = false; - GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable_locked, fdn, - grpc_combiner_scheduler(ev_driver->combiner)); - GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable_locked, fdn, - grpc_combiner_scheduler(ev_driver->combiner)); } fdn->next = new_list; new_list = fdn; @@ -380,6 +406,8 @@ static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver) { GRPC_CARES_TRACE_LOG("request:%p notify read on: %s", ev_driver->request, fdn->grpc_polled_fd->GetName()); + GRPC_CLOSURE_INIT(&fdn->read_closure, on_readable, fdn, + grpc_schedule_on_exec_ctx); fdn->grpc_polled_fd->RegisterForOnReadableLocked(&fdn->read_closure); fdn->readable_registered = true; } @@ -391,6 +419,8 @@ static void grpc_ares_notify_on_event_locked(grpc_ares_ev_driver* ev_driver) { ev_driver->request, fdn->grpc_polled_fd->GetName()); grpc_ares_ev_driver_ref(ev_driver); + GRPC_CLOSURE_INIT(&fdn->write_closure, on_writable, fdn, + grpc_schedule_on_exec_ctx); fdn->grpc_polled_fd->RegisterForOnWriteableLocked( &fdn->write_closure); fdn->writable_registered = true; @@ -435,12 +465,17 @@ void grpc_ares_ev_driver_start_locked(grpc_ares_ev_driver* ev_driver) { "%" PRId64 " ms", ev_driver->request, ev_driver, timeout); grpc_ares_ev_driver_ref(ev_driver); + GRPC_CLOSURE_INIT(&(*ev_driver)->on_timeout_locked, on_timeout, *ev_driver, + grpc_schedule_on_exec_ctx); grpc_timer_init(&ev_driver->query_timeout, timeout, &ev_driver->on_timeout_locked); // Initialize the backup poll alarm grpc_millis next_ares_backup_poll_alarm = calculate_next_ares_backup_poll_alarm_ms(ev_driver); grpc_ares_ev_driver_ref(ev_driver); + GRPC_CLOSURE_INIT(&ev_driver->on_ares_backup_poll_alarm_locked, + on_ares_backup_poll_alarm, ev_driver, + grpc_schedule_on_exec_ctx); grpc_timer_init(&ev_driver->ares_backup_poll_alarm, next_ares_backup_poll_alarm, &ev_driver->on_ares_backup_poll_alarm_locked); diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc index 81d2f7becd4..a65b03e19dc 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc @@ -153,9 +153,8 @@ void ares_uv_poll_cb(uv_poll_t* handle, int status, int events) { GrpcPolledFdLibuv* polled_fd = reinterpret_cast(handle->data); AresUvPollCbArg* arg = New(handle, status, events); - GRPC_CLOSURE_SCHED( - GRPC_CLOSURE_CREATE(ares_uv_poll_cb_locked, arg, - grpc_combiner_scheduler(polled_fd->combiner_)), + polled_fd->combiner_->Run( + GRPC_CLOSURE_CREATE(ares_uv_poll_cb_locked, arg, nullptr), GRPC_ERROR_NONE); } diff --git a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc index 13b1dc2dd2f..13b3c590f93 100644 --- a/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +++ b/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc @@ -110,11 +110,11 @@ class GrpcPolledFdWindows { combiner_ = GRPC_COMBINER_REF(combiner, name_); GRPC_CLOSURE_INIT(&continue_register_for_on_readable_locked_, &GrpcPolledFdWindows::ContinueRegisterForOnReadableLocked, - this, grpc_combiner_scheduler(combiner_)); + this, nullptr); GRPC_CLOSURE_INIT( &continue_register_for_on_writeable_locked_, &GrpcPolledFdWindows::ContinueRegisterForOnWriteableLocked, this, - grpc_combiner_scheduler(combiner_)); + nullptr); } ~GrpcPolledFdWindows() {