summaryrefslogtreecommitdiff
path: root/indra/llcorehttp/_refcounted.h
diff options
context:
space:
mode:
authorBrad Payne (Vir Linden) <vir@lindenlab.com>2016-04-01 08:35:38 -0400
committerBrad Payne (Vir Linden) <vir@lindenlab.com>2016-04-01 08:35:38 -0400
commitcaf4f494378558df14738f2e11b20f0c03674764 (patch)
treec8994793b992960a76a69516bc4891228a684afd /indra/llcorehttp/_refcounted.h
parent9c5d0d6152caff914a6f0159ba4f2382915d4055 (diff)
parent18928ea6c6f2830a0d45ec412c915eceff1b76b0 (diff)
merge
Diffstat (limited to 'indra/llcorehttp/_refcounted.h')
-rwxr-xr-xindra/llcorehttp/_refcounted.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h
index 402e725152..7f713f2298 100755
--- a/indra/llcorehttp/_refcounted.h
+++ b/indra/llcorehttp/_refcounted.h
@@ -32,6 +32,7 @@
#include "fix_macros.h"
#include <boost/thread.hpp>
+#include <boost/intrusive_ptr.hpp>
#include "llapr.h"
@@ -120,7 +121,36 @@ inline void RefCounted::destroySelf()
delete this;
}
+/**
+ * boost::intrusive_ptr may be used to manage RefCounted classes.
+ * Unfortunately RefCounted and boost::intrusive_ptr use different conventions
+ * for the initial refcount value. To avoid leaky (immortal) objects, you
+ * should really construct boost::intrusive_ptr<RefCounted*>(rawptr, false).
+ * IntrusivePtr<T> encapsulates that for you.
+ */
+template <typename T>
+struct IntrusivePtr: public boost::intrusive_ptr<T>
+{
+ IntrusivePtr():
+ boost::intrusive_ptr<T>()
+ {}
+ IntrusivePtr(T* p):
+ boost::intrusive_ptr<T>(p, false)
+ {}
+};
+
+inline void intrusive_ptr_add_ref(RefCounted* p)
+{
+ p->addRef();
+}
+
+inline void intrusive_ptr_release(RefCounted* p)
+{
+ p->release();
+}
+
} // end namespace LLCoreInt
+
#endif // LLCOREINT__REFCOUNTED_H_