diff options
author | Nicky <nicky.dasmijn@gmail.com> | 2022-06-13 20:09:42 +0200 |
---|---|---|
committer | Nicky <nicky.dasmijn@gmail.com> | 2022-06-13 20:09:42 +0200 |
commit | 1b73835d6e80bc64c520a8846aebdbe1b7c9705b (patch) | |
tree | b972275919bf6c620bbbcb81dd6b12568494561e /indra/llcommon/llsingleton.h | |
parent | 78e069f5e8ef1ee312e709934482b23aa86a69c2 (diff) | |
parent | c08a61453b21664da3687661512e2ea208f90d98 (diff) |
Merge branch 'DRTVWR-543-maint_cmake' of bitbucket.org:NickyD/viewer-cmake into DRTVWR-543-maint_cmake
Diffstat (limited to 'indra/llcommon/llsingleton.h')
-rw-r--r-- | indra/llcommon/llsingleton.h | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/indra/llcommon/llsingleton.h b/indra/llcommon/llsingleton.h index 7c81d65a8b..51ef514cf7 100644 --- a/indra/llcommon/llsingleton.h +++ b/indra/llcommon/llsingleton.h @@ -455,6 +455,7 @@ public: static DERIVED_TYPE* getInstance() { + LL_PROFILE_ZONE_SCOPED_CATEGORY_THREAD; // We know the viewer has LLSingleton dependency circularities. If you // feel strongly motivated to eliminate them, cheers and good luck. // (At that point we could consider a much simpler locking mechanism.) @@ -838,4 +839,36 @@ private: \ /* LLSINGLETON() is carefully implemented to permit exactly this */ \ LLSINGLETON_C11(DERIVED_CLASS) {} +// Relatively unsafe singleton implementation that is much faster +// and simpler than LLSingleton, but has no dependency tracking +// or inherent thread safety and requires manual invocation of +// createInstance before first use. +template<class T> +class LLSimpleton +{ +public: + template <typename... ARGS> + static void createInstance(ARGS&&... args) + { + llassert(sInstance == nullptr); + sInstance = new T(std::forward<ARGS>(args)...); + } + + static inline T* getInstance() { return sInstance; } + static inline T& instance() { return *getInstance(); } + static inline bool instanceExists() { return sInstance != nullptr; } + + static void deleteSingleton() + { + delete sInstance; + sInstance = nullptr; + } + +private: + static T* sInstance; +}; + +template <class T> +T* LLSimpleton<T>::sInstance{ nullptr }; + #endif |