diff options
| -rw-r--r-- | indra/llcommon/llsingleton.h | 16 | 
1 files changed, 12 insertions, 4 deletions
| diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 4f3b8ceb38..39d0e9b013 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -650,9 +650,15 @@ public:      using super::instanceExists;      using super::wasDeleted; -    // Passes arguments to DERIVED_TYPE's constructor and sets appropriate states +    // Passes arguments to DERIVED_TYPE's constructor and sets appropriate +    // states. We'd rather return a reference than a pointer, but the test for +    // redundant calls makes that awkward. The compiler, unaware that +    // logerrs() won't return, requires that that alternative return +    // *something*. But what? It can't be a dummy static instance because +    // there should be only one instance of any LLSingleton subclass! Easier +    // to allow that case to return nullptr.      template <typename... Args> -    static void initParamSingleton(Args&&... args) +    static DERIVED_TYPE* initParamSingleton(Args&&... args)      {          // In case racing threads both call initParamSingleton() at the same          // time, serialize them. One should initialize; the other should see @@ -664,10 +670,12 @@ public:              super::logerrs("Tried to initialize singleton ",                             super::template classname<DERIVED_TYPE>().c_str(),                             " twice!"); +            return nullptr;          }          else          {              super::constructSingleton(lk, std::forward<Args>(args)...); +            return lk->mInstance;          }      } @@ -740,9 +748,9 @@ public:      using super::instanceExists;      using super::wasDeleted; -    static void construct() +    static DT* construct()      { -        super::initParamSingleton(); +        return super::initParamSingleton();      }  }; | 
