|
|
|
@ -725,8 +725,9 @@ static void pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, |
|
|
|
|
pollset_maybe_finish_shutdown(exec_ctx, pollset); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_error *pollable_process_events(grpc_exec_ctx *exec_ctx, grpc_pollset*pollset, |
|
|
|
|
pollable *pollable_obj, bool drain) { |
|
|
|
|
static grpc_error *pollable_process_events(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_pollset *pollset, |
|
|
|
|
pollable *pollable_obj, bool drain) { |
|
|
|
|
static const char *err_desc = "pollset_process_events"; |
|
|
|
|
grpc_error *error = GRPC_ERROR_NONE; |
|
|
|
|
for (int i = 0; (drain || i < MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) && |
|
|
|
@ -905,22 +906,22 @@ static void end_worker(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, |
|
|
|
|
gpr_mu_lock(&pollset->mu); |
|
|
|
|
gpr_mu_lock(&worker->pollable_obj->mu); |
|
|
|
|
switch (worker_remove(&worker->pollable_obj->root_worker, worker, |
|
|
|
|
PWLINK_POLLABLE)) { |
|
|
|
|
case WRR_NEW_ROOT: { |
|
|
|
|
PWLINK_POLLABLE)) { |
|
|
|
|
case WRR_NEW_ROOT: { |
|
|
|
|
// wakeup new poller
|
|
|
|
|
grpc_pollset_worker *new_root = worker->pollable_obj->root_worker; |
|
|
|
|
GPR_ASSERT(new_root->initialized_cv); |
|
|
|
|
gpr_cv_signal(&new_root->cv); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case WRR_EMPTIED: |
|
|
|
|
if (pollset->active_pollable != worker->pollable_obj) { |
|
|
|
|
// pollable no longer being polled: flush events
|
|
|
|
|
pollable_process_events(exec_ctx, pollset, worker->pollable_obj, true); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case WRR_REMOVED: |
|
|
|
|
break; |
|
|
|
|
case WRR_EMPTIED: |
|
|
|
|
if (pollset->active_pollable != worker->pollable_obj) { |
|
|
|
|
// pollable no longer being polled: flush events
|
|
|
|
|
pollable_process_events(exec_ctx, pollset, worker->pollable_obj, true); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case WRR_REMOVED: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(&worker->pollable_obj->mu); |
|
|
|
|
POLLABLE_UNREF(worker->pollable_obj, "pollset_worker"); |
|
|
|
@ -965,14 +966,15 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, |
|
|
|
|
if (begin_worker(exec_ctx, pollset, WORKER_PTR, worker_hdl, deadline)) { |
|
|
|
|
gpr_tls_set(&g_current_thread_pollset, (intptr_t)pollset); |
|
|
|
|
gpr_tls_set(&g_current_thread_worker, (intptr_t)WORKER_PTR); |
|
|
|
|
if (WORKER_PTR->pollable_obj->event_cursor == WORKER_PTR->pollable_obj->event_count) { |
|
|
|
|
if (WORKER_PTR->pollable_obj->event_cursor == |
|
|
|
|
WORKER_PTR->pollable_obj->event_count) { |
|
|
|
|
append_error(&error, pollset_epoll(exec_ctx, pollset, |
|
|
|
|
WORKER_PTR->pollable_obj, deadline), |
|
|
|
|
err_desc); |
|
|
|
|
} |
|
|
|
|
append_error(&error, |
|
|
|
|
pollable_process_events( |
|
|
|
|
exec_ctx, pollset, WORKER_PTR->pollable_obj, false), |
|
|
|
|
pollable_process_events(exec_ctx, pollset, |
|
|
|
|
WORKER_PTR->pollable_obj, false), |
|
|
|
|
err_desc); |
|
|
|
|
grpc_exec_ctx_flush(exec_ctx); |
|
|
|
|
gpr_tls_set(&g_current_thread_pollset, 0); |
|
|
|
|