From 6f4d36634e980bb989b9a8b762c3c622804c43dd Mon Sep 17 00:00:00 2001 From: Rider Linden Date: Mon, 16 Mar 2015 17:14:34 -0700 Subject: Removal of RPCXML dep on LLCurl switching to LLCore::Html --- indra/llcorehttp/_refcounted.h | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'indra/llcorehttp/_refcounted.h') diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h index 402e725152..cd16e2e2b4 100755 --- a/indra/llcorehttp/_refcounted.h +++ b/indra/llcorehttp/_refcounted.h @@ -120,7 +120,18 @@ inline void RefCounted::destroySelf() delete this; } +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_ -- cgit v1.3 From 76cb1fcf0b5b9d8415e2517c482bab0c6c6602fb Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Mon, 29 Jun 2015 15:37:32 -0400 Subject: MAINT-4952: Add IntrusivePtr wrapper for boost::intrusive_ptr. For a RefCounted subclass T, boost::intrusive_ptr must be instantiated as boost::intrusive_ptr(raw ptr, false) to avoid immortal instances. Forgetting that final bool parameter is both easy and extremely hard to spot with desk checking or code review. IntrusivePtr provides constructors that Do The Right Thing, so we can typedef a subclass T's ptr_t to IntrusivePtr rather than directly to boost::intrusive_ptr. --- indra/llcorehttp/_refcounted.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'indra/llcorehttp/_refcounted.h') diff --git a/indra/llcorehttp/_refcounted.h b/indra/llcorehttp/_refcounted.h index cd16e2e2b4..7f713f2298 100755 --- a/indra/llcorehttp/_refcounted.h +++ b/indra/llcorehttp/_refcounted.h @@ -32,6 +32,7 @@ #include "fix_macros.h" #include +#include #include "llapr.h" @@ -120,6 +121,24 @@ 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(rawptr, false). + * IntrusivePtr encapsulates that for you. + */ +template +struct IntrusivePtr: public boost::intrusive_ptr +{ + IntrusivePtr(): + boost::intrusive_ptr() + {} + IntrusivePtr(T* p): + boost::intrusive_ptr(p, false) + {} +}; + inline void intrusive_ptr_add_ref(RefCounted* p) { p->addRef(); -- cgit v1.3