diff options
author | Yash Tibrewal <yashkt@google.com> | 2018-04-26 14:31:45 -0700 |
---|---|---|
committer | Yash Tibrewal <yashkt@google.com> | 2018-05-01 16:59:45 -0700 |
commit | eaddd597d75cbf05835318b8d047654eb8b37e72 (patch) | |
tree | 63807fdc546b816b649c3a59375085ff444d1300 /src/core/lib/iomgr/combiner.cc | |
parent | 83601d6b4b197867f90a9861a2d806c86dd6a967 (diff) |
Add combiner_run to run closures immediately if we already have the combiner lock
Diffstat (limited to 'src/core/lib/iomgr/combiner.cc')
-rw-r--r-- | src/core/lib/iomgr/combiner.cc | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/src/core/lib/iomgr/combiner.cc b/src/core/lib/iomgr/combiner.cc index 9429842eb8..c11dd65f5a 100644 --- a/src/core/lib/iomgr/combiner.cc +++ b/src/core/lib/iomgr/combiner.cc @@ -63,13 +63,15 @@ struct grpc_combiner { gpr_refcount refs; }; +static void combiner_run(grpc_closure* closure, grpc_error* error); static void combiner_exec(grpc_closure* closure, grpc_error* error); +static void combiner_finally_run(grpc_closure* closure, grpc_error* error); static void combiner_finally_exec(grpc_closure* closure, grpc_error* error); static const grpc_closure_scheduler_vtable scheduler = { - combiner_exec, combiner_exec, "combiner:immediately"}; + combiner_run, combiner_exec, "combiner:immediately"}; static const grpc_closure_scheduler_vtable finally_scheduler = { - combiner_finally_exec, combiner_finally_exec, "combiner:finally"}; + combiner_finally_run, combiner_finally_exec, "combiner:finally"}; static void offload(void* arg, grpc_error* error); @@ -343,6 +345,39 @@ static void combiner_finally_exec(grpc_closure* closure, grpc_error* error) { grpc_closure_list_append(&lock->final_list, closure, error); } +static void combiner_run(grpc_closure* closure, grpc_error* error) { +#ifndef NDEBUG + closure->scheduled = false; + grpc_combiner* lock = COMBINER_FROM_CLOSURE_SCHEDULER(closure, scheduler); + GRPC_COMBINER_TRACE(gpr_log( + GPR_DEBUG, + "Combiner:%p grpc_combiner_run closure:%p created [%s:%d] run [%s:%d]", + lock, closure, closure->file_created, closure->line_created, + closure->file_initiated, closure->line_initiated)); + GPR_ASSERT(grpc_core::ExecCtx::Get()->combiner_data()->active_combiner == + lock); +#endif + closure->cb(closure->cb_arg, error); + GRPC_ERROR_UNREF(error); +} + +static void combiner_finally_run(grpc_closure* closure, grpc_error* error) { +#ifndef NDEBUG + closure->scheduled = false; + grpc_combiner* lock = + COMBINER_FROM_CLOSURE_SCHEDULER(closure, finally_scheduler); + GRPC_COMBINER_TRACE(gpr_log( + GPR_DEBUG, + "Combiner:%p grpc_combiner_run closure:%p created [%s:%d] run [%s:%d]", + lock, closure, closure->file_created, closure->line_created, + closure->file_initiated, closure->line_initiated)); + GPR_ASSERT(grpc_core::ExecCtx::Get()->combiner_data()->active_combiner == + lock); +#endif + closure->cb(closure->cb_arg, error); + GRPC_ERROR_UNREF(error); +} + static void enqueue_finally(void* closure, grpc_error* error) { combiner_finally_exec(static_cast<grpc_closure*>(closure), GRPC_ERROR_REF(error)); |