aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Sree Kuchibhotla <sreek@google.com>2018-07-11 17:44:08 -0700
committerGravatar Sree Kuchibhotla <sreek@google.com>2018-07-11 17:44:08 -0700
commit8aefdd3653818e7dd9e12249dd9af9c048b3de2a (patch)
treee876cb36b41be418259d3499943369ef5f0d2bdb /src
parentf0ed1a287854dddd2aa029e05129b58079a48228 (diff)
use a global executor pointer that is initialized by grpc_executor_init()
Diffstat (limited to 'src')
-rw-r--r--src/core/lib/iomgr/executor.cc35
1 files changed, 15 insertions, 20 deletions
diff --git a/src/core/lib/iomgr/executor.cc b/src/core/lib/iomgr/executor.cc
index 9d9ee01b58..2aadb035bf 100644
--- a/src/core/lib/iomgr/executor.cc
+++ b/src/core/lib/iomgr/executor.cc
@@ -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) {