DRTVWR-494: Move explanatory comments from LLSingleton to LockStatic.
parent
0176146107
commit
fbfaa3db8e
|
|
@ -46,6 +46,23 @@ protected:
|
|||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue