summaryrefslogtreecommitdiff
path: root/indra/llcommon/llinttracker.h
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2024-09-05 14:37:25 -0400
committerNat Goodspeed <nat@lindenlab.com>2024-09-05 14:37:25 -0400
commitff2d79906ccef217194d5d9ec9d7025db03592a8 (patch)
tree83d5db1c173636bb77ebb33e860fac77ab5d79e8 /indra/llcommon/llinttracker.h
parent25a86618002a397d1d8dabf2ec1f093489b2f816 (diff)
parent18d81e20f0b0044c16615953d7b69d7fb34d3449 (diff)
Merge branch 'release/luau-scripting' into lua-merge-dev
Diffstat (limited to 'indra/llcommon/llinttracker.h')
-rw-r--r--indra/llcommon/llinttracker.h43
1 files changed, 43 insertions, 0 deletions
diff --git a/indra/llcommon/llinttracker.h b/indra/llcommon/llinttracker.h
new file mode 100644
index 0000000000..fd6d24d0fd
--- /dev/null
+++ b/indra/llcommon/llinttracker.h
@@ -0,0 +1,43 @@
+/**
+ * @file llinttracker.h
+ * @author Nat Goodspeed
+ * @date 2024-08-30
+ * @brief LLIntTracker isa LLInstanceTracker with generated int keys.
+ *
+ * $LicenseInfo:firstyear=2024&license=viewerlgpl$
+ * Copyright (c) 2024, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+#if ! defined(LL_LLINTTRACKER_H)
+#define LL_LLINTTRACKER_H
+
+#include "llinstancetracker.h"
+
+template <typename T>
+class LLIntTracker: public LLInstanceTracker<T, int>
+{
+ using super = LLInstanceTracker<T, int>;
+public:
+ LLIntTracker():
+ super(getUniqueKey())
+ {}
+
+private:
+ static int getUniqueKey()
+ {
+ // Find a random key that does NOT already correspond to an instance.
+ // Passing a duplicate key to LLInstanceTracker would do Bad Things.
+ int key;
+ do
+ {
+ key = std::rand();
+ } while (super::getInstance(key));
+ // This could be racy, if we were instantiating new LLIntTracker<T>s
+ // on multiple threads. If we need that, have to lock between checking
+ // getInstance() and constructing the new super.
+ return key;
+ }
+};
+
+#endif /* ! defined(LL_LLINTTRACKER_H) */