From 9365853fde3061acbdd11b74b0218b80d9ef4ce0 Mon Sep 17 00:00:00 2001 From: Frank Mori Hess Date: Wed, 16 Apr 2008 00:06:29 +0000 Subject: [PATCH] Avoid needless overhead of wrapping owner's deleter in deleter_wrapper if shared_from_this has not been called yet, as Peter suggested earlier. [SVN r44448] --- include/boost/enable_shared_from_this.hpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/include/boost/enable_shared_from_this.hpp b/include/boost/enable_shared_from_this.hpp index 23ec297..99c68ba 100644 --- a/include/boost/enable_shared_from_this.hpp +++ b/include/boost/enable_shared_from_this.hpp @@ -93,17 +93,21 @@ public: template void _internal_accept_owner(shared_ptr &owner) const { - init_internal_shared_once(); - if( !_owned ) { - detail::sp_deleter_wrapper * pd = get_deleter(_internal_shared_this); - BOOST_ASSERT( pd != 0 ); - pd->set_deleter(owner); - - owner.reset( _internal_shared_this, owner.get() ); - _internal_shared_this.reset(); + if( !_internal_shared_this ) + { + T * p = dynamic_cast(const_cast(this)); + _internal_weak_this = shared_ptr(owner, p); + }else + { + detail::sp_deleter_wrapper * pd = get_deleter(_internal_shared_this); + BOOST_ASSERT( pd != 0 ); + pd->set_deleter(owner); + owner.reset( _internal_shared_this, owner.get() ); + _internal_shared_this.reset(); + } _owned = true; } }