diff options
Diffstat (limited to 'src/mongo/util/concurrency/thread_name.cpp')
-rw-r--r-- | src/mongo/util/concurrency/thread_name.cpp | 68 |
1 files changed, 33 insertions, 35 deletions
diff --git a/src/mongo/util/concurrency/thread_name.cpp b/src/mongo/util/concurrency/thread_name.cpp index c2d8f8f2b9d..8b2b66302b6 100644 --- a/src/mongo/util/concurrency/thread_name.cpp +++ b/src/mongo/util/concurrency/thread_name.cpp @@ -37,50 +37,48 @@ namespace mongo { - using std::string; +using std::string; namespace { - boost::thread_specific_ptr<std::string> threadName; - AtomicInt64 nextUnnamedThreadId{1}; +boost::thread_specific_ptr<std::string> threadName; +AtomicInt64 nextUnnamedThreadId{1}; - // It is unsafe to access threadName before its dynamic initialization has completed. Use - // the execution of mongo initializers (which only happens once we have entered main, and - // therefore after dynamic initialization is complete) to signal that it is safe to use - // 'threadName'. - bool mongoInitializersHaveRun{}; - MONGO_INITIALIZER(ThreadNameInitializer)(InitializerContext*) { - mongoInitializersHaveRun = true; - // The global initializers should only ever be run from main, so setting thread name - // here makes sense. - setThreadName("main"); - return Status::OK(); - } +// It is unsafe to access threadName before its dynamic initialization has completed. Use +// the execution of mongo initializers (which only happens once we have entered main, and +// therefore after dynamic initialization is complete) to signal that it is safe to use +// 'threadName'. +bool mongoInitializersHaveRun{}; +MONGO_INITIALIZER(ThreadNameInitializer)(InitializerContext*) { + mongoInitializersHaveRun = true; + // The global initializers should only ever be run from main, so setting thread name + // here makes sense. + setThreadName("main"); + return Status::OK(); +} } // namespace - void setThreadName(StringData name) { - invariant(mongoInitializersHaveRun); - threadName.reset(new string(name.toString())); - } - - const string& getThreadName() { +void setThreadName(StringData name) { + invariant(mongoInitializersHaveRun); + threadName.reset(new string(name.toString())); +} - if (MONGO_unlikely(!mongoInitializersHaveRun)) { - // 'getThreadName' has been called before dynamic initialization for this - // translation unit has completed, so return a fallback value rather than accessing - // the 'threadName' variable, which requires dynamic initialization. We assume that - // we are in the 'main' thread. - static const std::string kFallback = "main"; - return kFallback; - } +const string& getThreadName() { + if (MONGO_unlikely(!mongoInitializersHaveRun)) { + // 'getThreadName' has been called before dynamic initialization for this + // translation unit has completed, so return a fallback value rather than accessing + // the 'threadName' variable, which requires dynamic initialization. We assume that + // we are in the 'main' thread. + static const std::string kFallback = "main"; + return kFallback; + } - std::string* s; - while (!(s = threadName.get())) { - setThreadName( - std::string(str::stream() << "thread" << nextUnnamedThreadId.fetchAndAdd(1))); - } - return *s; + std::string* s; + while (!(s = threadName.get())) { + setThreadName(std::string(str::stream() << "thread" << nextUnnamedThreadId.fetchAndAdd(1))); } + return *s; +} } // namespace mongo |