[prev in list] [next in list] [prev in thread] [next in thread] 

List:       boost-commit
Subject:    [Boost-commit] svn:boost r58604 - in sandbox/task: boost/task
From:       oliver.kowalke () gmx ! de
Date:       2009-12-30 21:41:21
Message-ID: 20091230214121.50EBE2F81DB () wowbagger ! osl ! iu ! edu
[Download RAW message or body]

Author: olli
Date: 2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
New Revision: 58604
URL: http://svn.boost.org/trac/boost/changeset/58604

Log:
- intrusive_ptr instead of shared_ptr


Text files modified: 
   sandbox/task/boost/task/callable.hpp         |    23 ++++++++++++++++++++++-                 
   sandbox/task/boost/task/context.hpp          |    17 ++++++++++++++++-                       
   sandbox/task/boost/task/detail/pool_base.hpp |    17 +++++++++++++++++                       
   sandbox/task/boost/task/new_thread.hpp       |     3 ++-                                     
   sandbox/task/boost/task/static_pool.hpp      |     3 ++-                                     
   sandbox/task/boost/task/task.hpp             |    27 ++++++++++++++++++++++++---             
   sandbox/task/libs/task/src/context.cpp       |     1 +                                       
   7 files changed, 84 insertions(+), 7 deletions(-)

Modified: sandbox/task/boost/task/callable.hpp
==============================================================================
--- sandbox/task/boost/task/callable.hpp	(original)
+++ sandbox/task/boost/task/callable.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -8,6 +8,7 @@
 #define BOOST_TASKS_CALLABLE_H
 
 #include <boost/config.hpp>
+#include <boost/intrusive_ptr.hpp>
 #include <boost/move/move.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/thread.hpp>
@@ -30,9 +31,29 @@
 private:
 	struct impl
 	{
+		atomic< unsigned int >	use_count_;
+
+		impl() :
+			use_count_( 0)
+		{}
+
 		virtual ~impl() {}
+
 		virtual void run() = 0;
+
 		virtual void reset( shared_ptr< thread > const&) = 0;
+
+		inline friend void intrusive_ptr_add_ref( impl * p)
+		{ p->use_count_.fetch_add( 1, memory_order_relaxed); }
+		
+		inline friend void intrusive_ptr_release( impl * p)
+		{
+			if ( p->use_count_.fetch_sub( 1, memory_order_release) == 1)
+			{
+				atomic_thread_fence( memory_order_acquire);
+				delete p;
+			}
+		}
 	};
 
 	template< typename T >
@@ -56,7 +77,7 @@
 		{ ctx_.reset( thrd); }
 	};
 
-	shared_ptr< impl >	impl_;
+	intrusive_ptr< impl >	impl_;
 
 public:
 	callable();

Modified: sandbox/task/boost/task/context.hpp
==============================================================================
--- sandbox/task/boost/task/context.hpp	(original)
+++ sandbox/task/boost/task/context.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -7,6 +7,8 @@
 #ifndef BOOST_TASKS_CONTEXT_H
 #define BOOST_TASKS_CONTEXT_H
 
+#include <boost/atomic.hpp>
+#include <boost/intrusive_ptr.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread/mutex.hpp>
@@ -33,6 +35,7 @@
 	class impl : private noncopyable
 	{
 	private:
+		atomic< unsigned int >	use_count_;
 		bool					requested_;
 		mutex					mtx_;
 		shared_ptr< thread >	thrd_;
@@ -49,9 +52,21 @@
 		void interrupt();
 
 		bool interruption_requested();
+
+		inline friend void intrusive_ptr_add_ref( impl * p)
+		{ p->use_count_.fetch_add( 1, memory_order_relaxed); }
+		
+		inline friend void intrusive_ptr_release( impl * p)
+		{
+			if ( p->use_count_.fetch_sub( 1, memory_order_release) == 1)
+			{
+				atomic_thread_fence( memory_order_acquire);
+				delete p;
+			}
+		}
 	};
 
-	shared_ptr< impl >	impl_;
+	intrusive_ptr< impl >	impl_;
 
 public:
 	context();

Modified: sandbox/task/boost/task/detail/pool_base.hpp
==============================================================================
--- sandbox/task/boost/task/detail/pool_base.hpp	(original)
+++ sandbox/task/boost/task/detail/pool_base.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -62,6 +62,7 @@
 		DEACTIVE	
 	};
 
+	atomic< unsigned int >	use_count_;
 	worker_group			wg_;
 	shared_mutex			mtx_wg_;
 	atomic< state >			state_;
@@ -142,6 +143,7 @@
 			posix_time::time_duration const& asleep,
 			scanns const& max_scns,
 			stacksize const& stack_size) :
+		use_count_( 0),
 		wg_(),
 		mtx_wg_(),
 		state_( ACTIVE),
@@ -164,6 +166,7 @@
 			posix_time::time_duration const& asleep,
 			scanns const& max_scns,
 			stacksize const& stack_size) :
+		use_count_( 0),
 		wg_(),
 		mtx_wg_(),
 		state_( ACTIVE),
@@ -184,6 +187,7 @@
 			posix_time::time_duration const& asleep,
 			scanns const& max_scns,
 			stacksize const& stack_size) :
+		use_count_( 0),
 		wg_(),
 		mtx_wg_(),
 		state_( ACTIVE),
@@ -207,6 +211,7 @@
 			posix_time::time_duration const& asleep,
 			scanns const& max_scns,
 			stacksize const& stack_size) :
+		use_count_( 0),
 		wg_(),
 		mtx_wg_(),
 		state_( ACTIVE),
@@ -306,6 +311,18 @@
 				attr) );
 		return h;
 	}
+
+	inline friend void intrusive_ptr_add_ref( pool_base * p)
+	{ p->use_count_.fetch_add( 1, memory_order_relaxed); }
+	
+	inline friend void intrusive_ptr_release( pool_base * p)
+	{
+		if ( p->use_count_.fetch_sub( 1, memory_order_release) == 1)
+		{
+			atomic_thread_fence( memory_order_acquire);
+			delete p;
+		}
+	}
 };
 
 }}}

Modified: sandbox/task/boost/task/new_thread.hpp
==============================================================================
--- sandbox/task/boost/task/new_thread.hpp	(original)
+++ sandbox/task/boost/task/new_thread.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -71,7 +71,8 @@
 		handle< R > h( f, ctx1);
 		callable ca( t, ctx2);
 		shared_ptr< thread > thrd(
-			new thread( wrapper( ca) ),
+			//new thread( wrapper( ca) ),
+			new thread( ca),
 			detail::joiner() );
 		ctx1.reset( thrd);
 

Modified: sandbox/task/boost/task/static_pool.hpp
==============================================================================
--- sandbox/task/boost/task/static_pool.hpp	(original)
+++ sandbox/task/boost/task/static_pool.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -12,6 +12,7 @@
 #include <boost/config.hpp>
 #include <boost/date_time/posix_time/posix_time.hpp>
 #include <boost/fiber/round_robin.hpp>
+#include <boost/intrusive_ptr.hpp>
 #include <boost/move/move.hpp>
 
 #include <boost/task/detail/bind_processor.hpp>
@@ -52,7 +53,7 @@
 	struct tag_bind_to_processors {};
 # endif
 	
-	shared_ptr< base_type >		pool_;
+	intrusive_ptr< base_type >		pool_;
 
 public:
 	static_pool() :

Modified: sandbox/task/boost/task/task.hpp
==============================================================================
--- sandbox/task/boost/task/task.hpp	(original)
+++ sandbox/task/boost/task/task.hpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -7,6 +7,7 @@
 #ifndef BOOST_TASKS_TASK_H
 #define BOOST_TASKS_TASK_H
 
+#include <boost/atomic.hpp>
 #include <boost/bind.hpp>
 #include <boost/config.hpp>
 #include <boost/preprocessor/repetition.hpp>
@@ -27,10 +28,16 @@
 template< typename R >
 class task_base
 {
-protected:
-	bool	done_;
+private:
+	template< typename X >
+	friend void intrusive_ptr_add_ref( task_base< X > *);
+	template< typename X >
+	friend void intrusive_ptr_release( task_base< X > *);
+
+	atomic< unsigned int >	use_count_;
 
 protected:
+	bool				done_;
 	spin::promise< R >	prom_;
 
 	virtual void do_run() = 0;
@@ -57,6 +64,20 @@
 	{ prom_.set_wait_callback( cb); }
 };
 
+template< typename R >
+void intrusive_ptr_add_ref( task_base< R > * p)
+{ p->use_count_.fetch_add( 1, memory_order_relaxed); }
+
+template< typename R >
+void intrusive_ptr_release( task_base< R > * p)
+{
+	if ( p->use_count_.fetch_sub( 1, memory_order_release) == 1)
+	{
+		atomic_thread_fence( memory_order_acquire);
+		delete p;
+	}
+}
+
 template< typename R, typename Fn >
 class task_wrapper : public task_base< R >
 {
@@ -186,7 +207,7 @@
 
 	BOOST_MOVABLE_BUT_NOT_COPYABLE( task);	
 
-	shared_ptr< detail::task_base< R > >	task_;
+	intrusive_ptr< detail::task_base< R > >	task_;
 
 public:
 	task() :

Modified: sandbox/task/libs/task/src/context.cpp
==============================================================================
--- sandbox/task/libs/task/src/context.cpp	(original)
+++ sandbox/task/libs/task/src/context.cpp	2009-12-30 16:41:20 EST (Wed, 30 Dec 2009)
@@ -31,6 +31,7 @@
 }
 
 context::impl::impl() :
+	use_count_( 0),
 	requested_( false),
 	mtx_(),
 	thrd_()
_______________________________________________
Boost-commit mailing list
Boost-commit@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-commit
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic