summaryrefslogtreecommitdiff
path: root/indra/llcommon/llsingleton.h
diff options
context:
space:
mode:
authorNicky <nicky.dasmijn@gmail.com>2022-06-13 20:09:42 +0200
committerNicky <nicky.dasmijn@gmail.com>2022-06-13 20:09:42 +0200
commit1b73835d6e80bc64c520a8846aebdbe1b7c9705b (patch)
treeb972275919bf6c620bbbcb81dd6b12568494561e /indra/llcommon/llsingleton.h
parent78e069f5e8ef1ee312e709934482b23aa86a69c2 (diff)
parentc08a61453b21664da3687661512e2ea208f90d98 (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.h33
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