From ba8fe9b483aaa59e724cdbfa183c69ee5998dc1f Mon Sep 17 00:00:00 2001 From: Nat Goodspeed <nat@lindenlab.com> Date: Wed, 4 Dec 2019 15:44:32 -0500 Subject: [PATCH] DRTVWR-494: Move explanatory comments from LLSingleton to LockStatic. --- indra/llcommon/lockstatic.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/indra/llcommon/lockstatic.h b/indra/llcommon/lockstatic.h index 5f08742cae5..96c53c64732 100644 --- a/indra/llcommon/lockstatic.h +++ b/indra/llcommon/lockstatic.h @@ -46,6 +46,23 @@ class LockStatic private: Static* getStatic() { + // Static::mMutex must be function-local static rather than class- + // static. Some of our consumers must function properly (therefore + // lock properly) even when the containing module's static variables + // have not yet been runtime-initialized. A mutex requires + // construction. A static class member might not yet have been + // constructed. + // + // We could store a dumb mutex_t*, notice when it's NULL and allocate a + // heap mutex -- but that's vulnerable to race conditions. And we can't + // defend the dumb pointer with another mutex. + // + // We could store a std::atomic<mutex_t*> -- but a default-constructed + // std::atomic<T> does not contain a valid T, even a default-constructed + // T! Which means std::atomic, too, requires runtime initialization. + // + // But a function-local static is guaranteed to be initialized exactly + // once: the first time control reaches that declaration. static Static sData; return &sData; } -- GitLab