|
|
@ -51,33 +51,6 @@ bool grpc_exec_ctx_has_work(grpc_exec_ctx *exec_ctx) { |
|
|
|
!grpc_closure_list_empty(exec_ctx->closure_list); |
|
|
|
!grpc_closure_list_empty(exec_ctx->closure_list); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool grpc_exec_ctx_flush(grpc_exec_ctx *exec_ctx) { |
|
|
|
|
|
|
|
bool did_something = 0; |
|
|
|
|
|
|
|
GPR_TIMER_BEGIN("grpc_exec_ctx_flush", 0); |
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
|
|
|
if (!grpc_closure_list_empty(exec_ctx->closure_list)) { |
|
|
|
|
|
|
|
grpc_closure *c = exec_ctx->closure_list.head; |
|
|
|
|
|
|
|
exec_ctx->closure_list.head = exec_ctx->closure_list.tail = NULL; |
|
|
|
|
|
|
|
while (c != NULL) { |
|
|
|
|
|
|
|
grpc_closure *next = c->next_data.next; |
|
|
|
|
|
|
|
grpc_error *error = c->error_data.error; |
|
|
|
|
|
|
|
did_something = true; |
|
|
|
|
|
|
|
#ifndef NDEBUG |
|
|
|
|
|
|
|
c->scheduled = false; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
c->cb(exec_ctx, c->cb_arg, error); |
|
|
|
|
|
|
|
GRPC_ERROR_UNREF(error); |
|
|
|
|
|
|
|
c = next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (!grpc_combiner_continue_exec_ctx(exec_ctx)) { |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
GPR_ASSERT(exec_ctx->active_combiner == NULL); |
|
|
|
|
|
|
|
GPR_TIMER_END("grpc_exec_ctx_flush", 0); |
|
|
|
|
|
|
|
return did_something; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void grpc_exec_ctx_finish(grpc_exec_ctx *exec_ctx) { |
|
|
|
void grpc_exec_ctx_finish(grpc_exec_ctx *exec_ctx) { |
|
|
|
exec_ctx->flags |= GRPC_EXEC_CTX_FLAG_IS_FINISHED; |
|
|
|
exec_ctx->flags |= GRPC_EXEC_CTX_FLAG_IS_FINISHED; |
|
|
|
grpc_exec_ctx_flush(exec_ctx); |
|
|
|
grpc_exec_ctx_flush(exec_ctx); |
|
|
@ -103,6 +76,29 @@ static void exec_ctx_run(grpc_exec_ctx *exec_ctx, grpc_closure *closure, |
|
|
|
GRPC_ERROR_UNREF(error); |
|
|
|
GRPC_ERROR_UNREF(error); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool grpc_exec_ctx_flush(grpc_exec_ctx *exec_ctx) { |
|
|
|
|
|
|
|
bool did_something = 0; |
|
|
|
|
|
|
|
GPR_TIMER_BEGIN("grpc_exec_ctx_flush", 0); |
|
|
|
|
|
|
|
for (;;) { |
|
|
|
|
|
|
|
if (!grpc_closure_list_empty(exec_ctx->closure_list)) { |
|
|
|
|
|
|
|
grpc_closure *c = exec_ctx->closure_list.head; |
|
|
|
|
|
|
|
exec_ctx->closure_list.head = exec_ctx->closure_list.tail = NULL; |
|
|
|
|
|
|
|
while (c != NULL) { |
|
|
|
|
|
|
|
grpc_closure *next = c->next_data.next; |
|
|
|
|
|
|
|
grpc_error *error = c->error_data.error; |
|
|
|
|
|
|
|
did_something = true; |
|
|
|
|
|
|
|
exec_ctx_run(exec_ctx, c, error); |
|
|
|
|
|
|
|
c = next; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else if (!grpc_combiner_continue_exec_ctx(exec_ctx)) { |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
GPR_ASSERT(exec_ctx->active_combiner == NULL); |
|
|
|
|
|
|
|
GPR_TIMER_END("grpc_exec_ctx_flush", 0); |
|
|
|
|
|
|
|
return did_something; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void exec_ctx_sched(grpc_exec_ctx *exec_ctx, grpc_closure *closure, |
|
|
|
static void exec_ctx_sched(grpc_exec_ctx *exec_ctx, grpc_closure *closure, |
|
|
|
grpc_error *error) { |
|
|
|
grpc_error *error) { |
|
|
|
grpc_closure_list_append(&exec_ctx->closure_list, closure, error); |
|
|
|
grpc_closure_list_append(&exec_ctx->closure_list, closure, error); |
|
|
|