|
|
|
@ -297,27 +297,14 @@ void GrpcExecutor::Enqueue(grpc_closure* closure, grpc_error* error, |
|
|
|
|
} while (retry_push); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Using Create-on-first-use pattern here because:
|
|
|
|
|
* global_executor has to be initialized by the time grpc_executor_init() is |
|
|
|
|
* called. |
|
|
|
|
* |
|
|
|
|
* Since grpc_executor_init() may sometimes be called as a part of other |
|
|
|
|
* static variables being initialized (for example, see the microbenchmarks |
|
|
|
|
* helper code that calls grpc::internal::GrpcLibrary::Init(), which |
|
|
|
|
* eventually ends up calling grpc_executor_init()), we need to use a |
|
|
|
|
* create-on-first-use pattern here. |
|
|
|
|
* */ |
|
|
|
|
static GrpcExecutor* get_global_executor() { |
|
|
|
|
static GrpcExecutor* global_executor = new GrpcExecutor("global-executor"); |
|
|
|
|
return global_executor; |
|
|
|
|
} |
|
|
|
|
static GrpcExecutor* global_executor; |
|
|
|
|
|
|
|
|
|
void enqueue_long(grpc_closure* closure, grpc_error* error) { |
|
|
|
|
get_global_executor()->Enqueue(closure, error, false /* is_short */); |
|
|
|
|
global_executor->Enqueue(closure, error, false /* is_short */); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void enqueue_short(grpc_closure* closure, grpc_error* error) { |
|
|
|
|
get_global_executor()->Enqueue(closure, error, true /* is_short */); |
|
|
|
|
global_executor->Enqueue(closure, error, true /* is_short */); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Short-Job executor scheduler
|
|
|
|
@ -332,14 +319,22 @@ static const grpc_closure_scheduler_vtable global_executor_vtable_long = { |
|
|
|
|
static grpc_closure_scheduler global_scheduler_long = { |
|
|
|
|
&global_executor_vtable_long}; |
|
|
|
|
|
|
|
|
|
void grpc_executor_init() { get_global_executor()->Init(); } |
|
|
|
|
void grpc_executor_init() { |
|
|
|
|
GPR_ASSERT(global_executor == nullptr); |
|
|
|
|
global_executor = new GrpcExecutor("global-executor"); |
|
|
|
|
global_executor->Init(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void grpc_executor_shutdown() { get_global_executor()->Shutdown(); } |
|
|
|
|
void grpc_executor_shutdown() { |
|
|
|
|
global_executor->Shutdown(); |
|
|
|
|
delete global_executor; |
|
|
|
|
global_executor = nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool grpc_executor_is_threaded() { return get_global_executor()->IsThreaded(); } |
|
|
|
|
bool grpc_executor_is_threaded() { return global_executor->IsThreaded(); } |
|
|
|
|
|
|
|
|
|
void grpc_executor_set_threading(bool enable) { |
|
|
|
|
get_global_executor()->SetThreading(enable); |
|
|
|
|
global_executor->SetThreading(enable); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
grpc_closure_scheduler* grpc_executor_scheduler(GrpcExecutorJobType job_type) { |
|
|
|
|