|
|
@ -29,6 +29,7 @@ |
|
|
|
|
|
|
|
|
|
|
|
#include "src/core/lib/debug/stats.h" |
|
|
|
#include "src/core/lib/debug/stats.h" |
|
|
|
#include "src/core/lib/iomgr/executor.h" |
|
|
|
#include "src/core/lib/iomgr/executor.h" |
|
|
|
|
|
|
|
#include "src/core/lib/iomgr/iomgr.h" |
|
|
|
#include "src/core/lib/profiling/timers.h" |
|
|
|
#include "src/core/lib/profiling/timers.h" |
|
|
|
|
|
|
|
|
|
|
|
grpc_core::DebugOnlyTraceFlag grpc_combiner_trace(false, "combiner"); |
|
|
|
grpc_core::DebugOnlyTraceFlag grpc_combiner_trace(false, "combiner"); |
|
|
@ -228,8 +229,14 @@ bool grpc_combiner_continue_exec_ctx() { |
|
|
|
grpc_core::ExecCtx::Get()->IsReadyToFinish(), |
|
|
|
grpc_core::ExecCtx::Get()->IsReadyToFinish(), |
|
|
|
lock->time_to_execute_final_list)); |
|
|
|
lock->time_to_execute_final_list)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// offload only if all the following conditions are true:
|
|
|
|
|
|
|
|
// 1. the combiner is contended and has more than one closure to execute
|
|
|
|
|
|
|
|
// 2. the current execution context needs to finish as soon as possible
|
|
|
|
|
|
|
|
// 3. the DEFAULT executor is threaded
|
|
|
|
|
|
|
|
// 4. the current thread is not a worker for any background poller
|
|
|
|
if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish() && |
|
|
|
if (contended && grpc_core::ExecCtx::Get()->IsReadyToFinish() && |
|
|
|
grpc_executor_is_threaded()) { |
|
|
|
grpc_executor_is_threaded() && |
|
|
|
|
|
|
|
!grpc_iomgr_is_any_background_poller_thread()) { |
|
|
|
GPR_TIMER_MARK("offload_from_finished_exec_ctx", 0); |
|
|
|
GPR_TIMER_MARK("offload_from_finished_exec_ctx", 0); |
|
|
|
// this execution context wants to move on: schedule remaining work to be
|
|
|
|
// this execution context wants to move on: schedule remaining work to be
|
|
|
|
// picked up on the executor
|
|
|
|
// picked up on the executor
|
|
|
|