Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r54565 - in sandbox/task: . boost/task libs/task/doc libs/task/examples libs/task/src libs/task/test
From: oliver.kowalke_at_[hidden]
Date: 2009-07-01 14:53:43


Author: olli
Date: 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
New Revision: 54565
URL: http://svn.boost.org/trac/boost/changeset/54565

Log:
* tests for as_sub_task() added
* make_task() re-introduced
* refernce in docu for as_sub_task() added
* examples modified
* some optimizations (lock_guard instead unique_lock etc.)

Added:
   sandbox/task/libs/task/doc/ref_asy_sub_task.qbk (contents, props changed)
   sandbox/task/libs/task/test/test_as_sub_task.cpp (contents, props changed)
Text files modified:
   sandbox/task/boost/task/as_sub_task.hpp | 2
   sandbox/task/boost/task/bounded_channel.hpp | 28 ++++++++++----------
   sandbox/task/boost/task/handle.hpp | 51 ++++++------------------------------
   sandbox/task/boost/task/static_pool.hpp | 24 +++++++----------
   sandbox/task/boost/task/task.hpp | 55 ++++++++++++++++++++++++++-------------
   sandbox/task/boost/task/unbounded_channel.hpp | 16 +++++-----
   sandbox/task/change.log | 5 +++
   sandbox/task/libs/task/doc/boost_task.qbk | 1
   sandbox/task/libs/task/doc/ref_async.qbk | 12 ++++----
   sandbox/task/libs/task/doc/ref_new_thread.qbk | 6 ++--
   sandbox/task/libs/task/doc/ref_own_thread.qbk | 6 ++--
   sandbox/task/libs/task/doc/ref_static_pool.qbk | 8 ++--
   sandbox/task/libs/task/doc/ref_task.qbk | 24 +++++++++++++++++
   sandbox/task/libs/task/doc/reference.qbk | 1
   sandbox/task/libs/task/doc/task.qbk | 31 +++++++++++++++++++++
   sandbox/task/libs/task/examples/bind_to_processors.cpp | 33 +++++++++++------------
   sandbox/task/libs/task/examples/delay.cpp | 31 ++++++++++-----------
   sandbox/task/libs/task/examples/interrupt.cpp | 6 +--
   sandbox/task/libs/task/examples/pending.cpp | 6 +--
   sandbox/task/libs/task/examples/reschedule_until.cpp | 31 ++++++++++------------
   sandbox/task/libs/task/src/interrupter.cpp | 8 ++--
   sandbox/task/libs/task/src/wsq.cpp | 4 +-
   sandbox/task/libs/task/test/Jamfile.v2 | 1
   sandbox/task/libs/task/test/test_task.cpp | 21 +++++++++++++--
   24 files changed, 230 insertions(+), 181 deletions(-)

Modified: sandbox/task/boost/task/as_sub_task.hpp
==============================================================================
--- sandbox/task/boost/task/as_sub_task.hpp (original)
+++ sandbox/task/boost/task/as_sub_task.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -46,7 +46,7 @@
                         return handle< R >( fut, intr);
                 }
                 else
- return new_thread()( t);
+ return new_thread()( boost::move( t) );
         }
 };
 } }

Modified: sandbox/task/boost/task/bounded_channel.hpp
==============================================================================
--- sandbox/task/boost/task/bounded_channel.hpp (original)
+++ sandbox/task/boost/task/bounded_channel.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -273,19 +273,19 @@
 
         bool active()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return active_();
         }
 
         void activate()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 activate_();
         }
 
         void clear()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 clear_();
         }
 
@@ -294,61 +294,61 @@
 
         void deactivate()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 deactivate_();
         }
 
         void deactivate_now()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 deactivate_now_();
         }
 
         const std::vector< detail::callable > drain()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return drain_();
         }
 
         bool empty()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return empty_();
         }
 
         bool full()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return full_();
         }
 
         std::size_t upper_bound()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return hwm_;
         }
 
         void upper_bound( std::size_t hwm)
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 upper_bound_( hwm);
         }
 
         std::size_t lower_bound()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return lwm_;
         }
 
         void lower_bound( std::size_t lwm)
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 lower_bound_( lwm);
         }
 
         std::size_t size()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return size_();
         }
 
@@ -384,7 +384,7 @@
 
         bool try_take( detail::callable & ca)
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return try_take_( ca);
         }
 };

Modified: sandbox/task/boost/task/handle.hpp
==============================================================================
--- sandbox/task/boost/task/handle.hpp (original)
+++ sandbox/task/boost/task/handle.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -19,46 +19,18 @@
 namespace boost { namespace task
 {
 
-template< typename Channel >
-class static_pool;
-
-struct own_thread;
-struct new_thread;
-struct as_sub_task;
-
 template< typename R >
 class handle
 {
 private:
- template< typename Channel >
- friend class static_pool;
- friend struct own_thread;
- friend struct new_thread;
- friend struct as_sub_task;
- template< typename Iterator >
- friend void waitfor_all( Iterator begin, Iterator end);
- template< typename T1, typename T2 >
- friend void waitfor_all( T1 & t1, T2 & t2);
- template< typename T1, typename T2, typename T3 >
- friend void waitfor_all( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3);
- template< typename T1, typename T2, typename T3, typename T4 >
- friend void waitfor_all( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4);
- template< typename T1, typename T2, typename T3, typename T4, typename T5 >
- friend void waitfor_all( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4, handle< T5 > & t5);
- template< typename Iterator >
- friend Iterator waitfor_any( Iterator begin, Iterator end);
- template< typename T1, typename T2 >
- friend unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2);
- template< typename T1, typename T2, typename T3 >
- friend unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3);
- template< typename T1, typename T2, typename T3, typename T4 >
- friend unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4);
- template< typename T1, typename T2, typename T3, typename T4, typename T5 >
- friend unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4, handle< T5 > & t5);
-
         shared_future< R > fut_;
         detail::interrupter intr_;
 
+public:
+ handle()
+ : fut_(), intr_()
+ {}
+
         handle( shared_future< R > fut)
         :
         fut_( fut),
@@ -73,11 +45,6 @@
         intr_( intr)
         {}
 
-public:
- handle()
- : fut_(), intr_()
- {}
-
         void interrupt()
         { intr_.interrupt(); }
 
@@ -237,7 +204,7 @@
 unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2)
 {
         try
- { return wait_for_any( t1.fut_, t2.fut_); }
+ { return wait_for_any( t1.get_future(), t2.get_future() ); }
         catch ( thread_interrupted const&)
         { throw task_interrupted(); }
 }
@@ -246,7 +213,7 @@
 unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3)
 {
         try
- { return wait_for_any( t1.fut_, t2.fut_, t3.fut_); }
+ { return wait_for_any( t1.get_future(), t2.get_future(), t3.get_future() ); }
         catch ( thread_interrupted const&)
         { throw task_interrupted(); }
 }
@@ -255,7 +222,7 @@
 unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4)
 {
         try
- { return wait_for_any( t1.fut_, t2.fut_, t3.fut_, t4.fut_); }
+ { return wait_for_any( t1.get_future(), t2.get_future(), t3.get_future(), t4.get_future() ); }
         catch ( thread_interrupted const&)
         { throw task_interrupted(); }
 }
@@ -264,7 +231,7 @@
 unsigned int waitfor_any( handle< T1 > & t1, handle< T2 > & t2, handle< T3 > & t3, handle< T4 > & t4, handle< T5 > & t5)
 {
         try
- { return wait_for_any( t1.fut_, t2.fut_, t3.fut_, t4.fut_, t5.fut_); }
+ { return wait_for_any( t1.get_future(), t2.get_future(), t3.get_future(), t4.get_future(), t5.get_future() ); }
         catch ( thread_interrupted const&)
         { throw task_interrupted(); }
 }

Modified: sandbox/task/boost/task/static_pool.hpp
==============================================================================
--- sandbox/task/boost/task/static_pool.hpp (original)
+++ sandbox/task/boost/task/static_pool.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -53,7 +53,7 @@
 
         friend class detail::worker;
 
-# if defined(BOOST_MSVC) && (BOOST_MSVC < 1500) // < MSVC 9.0
+# if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) // <= MSVC 7.1
         template< typename Pool >
         friend class detail::worker::impl_pool;
 # endif
@@ -69,7 +69,7 @@
         private:
                 friend class detail::worker;
 
-# if defined(BOOST_MSVC) && (BOOST_MSVC < 1500) // < MSVC 9.0
+# if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) // <= MSVC 7.1
                 template< typename Pool >
                 friend class detail::worker::impl_pool;
 # endif
@@ -146,8 +146,8 @@
                 bool closed_() const
                 { return state_ > 0; }
 
- unsigned int close_()
- { return detail::atomic_fetch_add( & state_, 1); }
+ bool close_()
+ { return detail::atomic_fetch_add( & state_, 1) > 1; }
 
         public:
                 explicit pool_base(
@@ -165,10 +165,9 @@
                         if ( asleep.is_special() || asleep.is_negative() )
                                 throw invalid_timeduration();
                         channel_.activate();
- unique_lock< shared_mutex > lk( mtx_wg_);
+ lock_guard< shared_mutex > lk( mtx_wg_);
                         for ( std::size_t i( 0); i < psize; ++i)
                                 create_worker_( psize, asleep, max_scns);
- lk.unlock();
                 }
 
                 explicit pool_base(
@@ -190,10 +189,9 @@
                         if ( asleep.is_special() || asleep.is_negative() )
                                 throw invalid_timeduration();
                         channel_.activate();
- unique_lock< shared_mutex > lk( mtx_wg_);
+ lock_guard< shared_mutex > lk( mtx_wg_);
                         for ( std::size_t i( 0); i < psize; ++i)
                                 create_worker_( psize, asleep, max_scns);
- lk.unlock();
                 }
 
 # if defined(BOOST_HAS_PROCESSOR_BINDINGS)
@@ -213,10 +211,9 @@
                         poolsize psize( thread::hardware_concurrency() );
                         BOOST_ASSERT( psize > 0);
                         channel_.activate();
- unique_lock< shared_mutex > lk( mtx_wg_);
+ lock_guard< shared_mutex > lk( mtx_wg_);
                         for ( std::size_t i( 0); i < psize; ++i)
                                 create_worker_( psize, asleep, max_scns, i);
- lk.unlock();
                 }
 
                 explicit pool_base(
@@ -239,10 +236,9 @@
                         poolsize psize( thread::hardware_concurrency() );
                         BOOST_ASSERT( psize > 0);
                         channel_.activate();
- unique_lock< shared_mutex > lk( mtx_wg_);
+ lock_guard< shared_mutex > lk( mtx_wg_);
                         for ( std::size_t i( 0); i < psize; ++i)
                                 create_worker_( psize, asleep, max_scns, i);
- lk.unlock();
                 }
 # endif
 
@@ -271,7 +267,7 @@
 
                 void shutdown()
                 {
- if ( closed_() || close_() > 1) return;
+ if ( closed_() || close_() ) return;
 
                         channel_.deactivate();
                         shared_lock< shared_mutex > lk( mtx_wg_);
@@ -281,7 +277,7 @@
 
                 const void shutdown_now()
                 {
- if ( closed_() || close_() > 1) return;
+ if ( closed_() || close_() ) return;
 
                         channel_.deactivate_now();
                         shared_lock< shared_mutex > lk( mtx_wg_);

Modified: sandbox/task/boost/task/task.hpp
==============================================================================
--- sandbox/task/boost/task/task.hpp (original)
+++ sandbox/task/boost/task/task.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -255,31 +255,28 @@
         }
 # endif
 
-# ifndef BOOST_TASK_MAKE_TASK_MAX_ARITY
-# define BOOST_TASK_MAKE_TASK_MAX_ARITY 10
+# ifndef BOOST_TASK_MAX_ARITY
+# define BOOST_TASK_MAX_ARITY 10
 # endif
 
-# define BOOST_TASK_MAKE_TASK_FUNC_ARG(z, n, unused) \
+# define BOOST_TASK_ARG(z, n, unused) \
    BOOST_PP_CAT(A, n) BOOST_PP_CAT(a, n)
-# define BOOST_ENUM_TASK_MAKE_TASK_FUNC_ARGS(n) BOOST_PP_ENUM(n, BOOST_TASK_MAKE_TASK_FUNC_ARG, ~)
+# define BOOST_ENUM_TASK_ARGS(n) BOOST_PP_ENUM(n, BOOST_TASK_ARG, ~)
 
-# define BOOST_TASK_MAKE_TASK_FUNCTION(z, n, unused) \
-template< \
- typename Fn, \
- BOOST_PP_ENUM_PARAMS(n, typename A) \
-> \
-explicit task( Fn fn, BOOST_ENUM_TASK_MAKE_TASK_FUNC_ARGS(n)) \
- : task_( new detail::task_wrapper< \
- typename result_of< Fn( BOOST_PP_ENUM_PARAMS(n, A)) >::type, \
- function< typename result_of< Fn( BOOST_PP_ENUM_PARAMS(n, A)) >::type() > \
- >( bind( fn, BOOST_PP_ENUM_PARAMS(n, a)) ) ) \
+# define BOOST_TASK_CTOR(z, n, unused) \
+template< \
+ typename Fn, \
+ BOOST_PP_ENUM_PARAMS(n, typename A) \
+> \
+explicit task( Fn fn, BOOST_ENUM_TASK_ARGS(n)) \
+ : task_( \
+ new detail::task_wrapper< R, function< R() > >( \
+ bind( fn, BOOST_PP_ENUM_PARAMS(n, a)) ) ) \
         {}
 
-BOOST_PP_REPEAT_FROM_TO( 1, BOOST_TASK_MAKE_TASK_MAX_ARITY, BOOST_TASK_MAKE_TASK_FUNCTION, ~)
+BOOST_PP_REPEAT_FROM_TO( 1, BOOST_TASK_MAX_ARITY, BOOST_TASK_CTOR, ~)
 
-# undef BOOST_TASK_MAKE_TASK_FUNCTION
-# undef BOOST_TASK_MAKE_TASK_FUNC_ARG
-# undef BOOST_ENUM_TASK_MAKE_TASK_FUNC_ARGS
+# undef BOOST_TASK_CTOR
 
         unique_future< R > get_future()
         {
@@ -314,6 +311,27 @@
         void swap( task & other) // throw()
         { task_.swap( other.task_); }
 };
+
+template< typename Fn >
+task< typename result_of< Fn() >::type > make_task( Fn fn)
+{ return task< typename boost::result_of< Fn() >::type >( fn); }
+
+# define BOOST_TASK_MAKE_TASK_FUNCTION(z, n, unused) \
+template< \
+ typename Fn, \
+ BOOST_PP_ENUM_PARAMS(n, typename A) \
+> \
+task< typename result_of< Fn( BOOST_PP_ENUM_PARAMS(n, A)) >::type > \
+make_task( Fn fn, BOOST_ENUM_TASK_ARGS(n)) \
+{ return task< typename result_of< Fn( BOOST_PP_ENUM_PARAMS(n, A)) >::type >( fn, BOOST_PP_ENUM_PARAMS(n, a)); }
+
+BOOST_PP_REPEAT_FROM_TO( 1, BOOST_TASK_MAX_ARITY, BOOST_TASK_MAKE_TASK_FUNCTION, ~)
+
+# undef BOOST_TASK_MAKE_TASK_FUNCTION
+# undef BOOST_ENUM_TASK_ARGS
+# undef BOOST_TASK_ARG
+# undef BOOST_TASK_MAX_ARITY
+
 }
 
 template< typename R >
@@ -329,6 +347,7 @@
 task::task< R > move( boost::detail::thread_move_t< task::task< R > > t)
 { return task::task< R >( t); }
 # endif
+
 }
 
 #include <boost/config/abi_suffix.hpp>

Modified: sandbox/task/boost/task/unbounded_channel.hpp
==============================================================================
--- sandbox/task/boost/task/unbounded_channel.hpp (original)
+++ sandbox/task/boost/task/unbounded_channel.hpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -192,13 +192,13 @@
 
         void activate()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 activate_();
         }
 
         void clear()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 clear_();
         }
 
@@ -207,25 +207,25 @@
 
         void deactivate()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 deactivate_();
         }
 
         void deactivate_now()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 deactivate_now_();
         }
 
         const std::vector< detail::callable > drain()
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return drain_();
         }
 
         bool empty()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return empty_();
         }
 
@@ -234,7 +234,7 @@
 
         std::size_t size()
         {
- shared_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return size_();
         }
 
@@ -270,7 +270,7 @@
 
         bool try_take( detail::callable & ca)
         {
- unique_lock< shared_mutex > lk( mtx_);
+ lock_guard< shared_mutex > lk( mtx_);
                 return try_take_( ca);
         }
 };

Modified: sandbox/task/change.log
==============================================================================
--- sandbox/task/change.log (original)
+++ sandbox/task/change.log 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -5,6 +5,11 @@
   allowing correct move-semantics
 - worker_group removes all worker-threads in join_all()
   static_pool< R > does contain zero worker-threads after shutdown() or shutdown_now()
+- reintroduction of make_task()
+- internal refactoring/rework
+- documentation updated
+- tests updated
+- examples updated
 
 
 * boost.task-0.2.1:

Modified: sandbox/task/libs/task/doc/boost_task.qbk
==============================================================================
--- sandbox/task/libs/task/doc/boost_task.qbk (original)
+++ sandbox/task/libs/task/doc/boost_task.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -59,6 +59,7 @@
 [def __task_interrupted__ `boost::task::task_interrupted`]
 [def __unbounded_channel__ `boost::task::unbounded_channel`]
 
+[def __make_task__ `boost::task::make_task()`]
 [def __waitfor_all__ `boost::task::waitfor_all()`]
 [def __waitfor_any__ `boost::task::waitfor_any()`]
 

Added: sandbox/task/libs/task/doc/ref_asy_sub_task.qbk
==============================================================================
--- (empty file)
+++ sandbox/task/libs/task/doc/ref_asy_sub_task.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -0,0 +1,32 @@
+[/
+ Copyright Oliver Kowalke 2009.
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt
+]
+
+
+[section:as_sub_task Class `as_sub_task`]
+
+``
+ #include <boost/task/as_sub_task.hpp>
+
+ struct as_sub_task
+ {
+ template< typename R >
+ handle< R > operator()( task< R >);
+ };
+``
+
+[heading Member function `operator()( task< R >)`]
+
+ template< typename R >
+ handle< R > operator()( task< R > t)
+
+[variablelist
+[[Effects:] [moves task in a new thread or thread-pool and returns an handle associated with the task]]
+[[Throws:] [`boost::thread_resource_error`]]
+]
+
+
+[endsect]
\ No newline at end of file

Modified: sandbox/task/libs/task/doc/ref_async.qbk
==============================================================================
--- sandbox/task/libs/task/doc/ref_async.qbk (original)
+++ sandbox/task/libs/task/doc/ref_async.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -6,13 +6,13 @@
 ]
 
 
-[section:async Non-member function `async( task< R > &&, EP)`]
+[section:async Non-member function `async( task< R >, EP)`]
 
 ``
         #include <boost/task/async.hpp>
 
         template< typename R, typename EP >
- handle< R > async( task< R > && t, EP ep);
+ handle< R > async( task< R > t, EP ep);
 ``
 
 [variablelist
@@ -23,13 +23,13 @@
 [endsect]
 
 
-[section:async1 Non-member function `async( task< R > &&, pool< Channel > &)`]
+[section:async1 Non-member function `async( task< R >, pool< Channel > &)`]
 
 ``
         #include <boost/task/async.hpp>
 
         template< typename R, typename Channel >
- handle< R > async( task< R > && t, pool< Channel > & ep);
+ handle< R > async( task< R > t, pool< Channel > & ep);
 ``
 
 [variablelist
@@ -40,13 +40,13 @@
 [endsect]
 
 
-[section:async2 Non-member function `async( task< R > &&, Attr, pool< Channel > &)`]
+[section:async2 Non-member function `async( task< R >, Attr, pool< Channel > &)`]
 
 ``
         #include <boost/task/async.hpp>
 
         template< typename R, typename Channel, typename Attr >
- handle< R > async( task< R > && t, Attr attr, pool< Channel > & ep);
+ handle< R > async( task< R > t, Attr attr, pool< Channel > & ep);
 ``
 
 [variablelist

Modified: sandbox/task/libs/task/doc/ref_new_thread.qbk
==============================================================================
--- sandbox/task/libs/task/doc/ref_new_thread.qbk (original)
+++ sandbox/task/libs/task/doc/ref_new_thread.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -14,14 +14,14 @@
         struct new_thread
         {
                 template< typename R >
- handle< R > operator()( task< R > &&);
+ handle< R > operator()( task< R >);
         };
 ``
 
-[heading Member function `operator()( task< R > &&)`]
+[heading Member function `operator()( task< R >)`]
 
         template< typename R >
- handle< R > operator()( task< R > && t)
+ handle< R > operator()( task< R > t)
 
 [variablelist
 [[Effects:] [moves task in a new thread an returns an handle associated with the task]]

Modified: sandbox/task/libs/task/doc/ref_own_thread.qbk
==============================================================================
--- sandbox/task/libs/task/doc/ref_own_thread.qbk (original)
+++ sandbox/task/libs/task/doc/ref_own_thread.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -14,14 +14,14 @@
         struct own_thread
         {
                 template< typename R >
- handle< R > operator()( task< R > && t);
+ handle< R > operator()( task< R > t);
         };
 ``
 
-[heading Member function `operator()( task< R > &&)`]
+[heading Member function `operator()( task< R >)`]
 
         template< typename R >
- handle< R > operator()( task< R > && t)
+ handle< R > operator()( task< R > t)
 
 [variablelist
 [[Effects:] [moves task in the current thread an returns an handle associated with the task]]

Modified: sandbox/task/libs/task/doc/ref_static_pool.qbk
==============================================================================
--- sandbox/task/libs/task/doc/ref_static_pool.qbk (original)
+++ sandbox/task/libs/task/doc/ref_static_pool.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -348,10 +348,10 @@
 ]
 
 
-[heading Member function `submit( task< R > &&)`]
+[heading Member function `submit( task< R >)`]
 
         template< typename R >
- handle< R > submit( task< R > && t)
+ handle< R > submit( task< R > t)
 
 [variablelist
 [[Preconditions:] [has_attribute< pool >::value == false && ! closed()]]
@@ -360,10 +360,10 @@
 ]
 
 
-[heading Member function `submit( task< R > &&, Attr const& attr)`]
+[heading Member function `submit( task< R >, Attr const& attr)`]
 
         template< typename R, typename Attr >
- handle< R > submit( task< R > && t, Attr const& attr)
+ handle< R > submit( task< R > t, Attr const& attr)
 
 [variablelist
 [[Preconditions:] [has_attribute< pool >::value == true && ! closed()]]

Modified: sandbox/task/libs/task/doc/ref_task.qbk
==============================================================================
--- sandbox/task/libs/task/doc/ref_task.qbk (original)
+++ sandbox/task/libs/task/doc/ref_task.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -43,6 +43,14 @@
                 operator unspecified_bool_type() const;
                 bool operator!() const;
         };
+
+ template< typename Fn >
+ task< R > make_task( Fn fn);
+ template< typename Fn, typename A0 >
+ task< R > make_task( Fn fn, A0 a0);
+ template< typename Fn, typename A0, typename A1 >
+ task< R > make_task( Fn fn, A0 a0, A1 a1);
+ ...
 ``
 
 [heading Default constructor]
@@ -181,4 +189,20 @@
 ]
 
 
+[heading Non-member function `make_task()`]
+
+ template< typename Fn >
+ task< R > make_task( Fn fn);
+ template< typename Fn, typename A0 >
+ task< R > make_task( Fn fn, A0 a0);
+ template< typename Fn, typename A0, typename A1 >
+ task< R > make_task( Fn fn, A0 a0, A1 a1);
+ ...
+
+[variablelist
+[[Effects:] [constructs a `boost::task::task< R >` from a function object and its arguments]]
+[[Throws:] [Nothing]]
+]
+
+
 [endsect]

Modified: sandbox/task/libs/task/doc/reference.qbk
==============================================================================
--- sandbox/task/libs/task/doc/reference.qbk (original)
+++ sandbox/task/libs/task/doc/reference.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -14,6 +14,7 @@
 [include ref_own_thread.qbk]
 [include ref_new_thread.qbk]
 [include ref_static_pool.qbk]
+[include ref_as_sub_task.qbk]
 [include ref_utility.qbk]
 [include ref_meta.qbk]
 [include ref_poolsize.qbk]

Modified: sandbox/task/libs/task/doc/task.qbk
==============================================================================
--- sandbox/task/libs/task/doc/task.qbk (original)
+++ sandbox/task/libs/task/doc/task.qbk 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -12,7 +12,36 @@
 
 __task__ represents a __callable__ (provides __fn_operator__) object containing the unit of code to be execute by a __ep__.
 Function __fn_get_future__ returns a __act__ allowing to wait for the completion of the computation of the task, for
-getting the result of a computation or for transfering exceptions. __task__ supports move semantics (moving ownership).
+getting the result of a computation or for transfering exceptions.
+
+__task__ supports move semantics (moving ownership).
+
+``
+ boost::task::task< int > t1( parallel_fib, 10);
+ boost::task::task< int > t2;
+ t2 = boost::move( t1);
+``
+
+__boost_task__ provides the helper function __make_task__ in order to create __task__.
+
+``
+ void echo( std::string const& msg)
+ { fprintf( stderr, "%s\n", msg.c_str() ); }
+
+ void main()
+ {
+ // execute task asynchron
+ // move task ownership to executor
+ boost::task::handle< void > h(
+ boost::task::async(
+ boost::task::make_task( echo, "hello world"),
+ boost::task::new_thread() ) );
+
+ // wait for task completion
+ std::cout << h.wait() << std::endl;
+ }
+
+``
 
 [/
 [heading Creation]

Modified: sandbox/task/libs/task/examples/bind_to_processors.cpp
==============================================================================
--- sandbox/task/libs/task/examples/bind_to_processors.cpp (original)
+++ sandbox/task/libs/task/examples/bind_to_processors.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -37,18 +37,20 @@
         else
         {
                 BOOST_ASSERT( boost::this_task::runs_in_pool() );
- tsk::task< int > t1(
- parallel_fib,
- n - 1,
- cutof);
- tsk::task< int > t2(
- parallel_fib,
- n - 2,
- cutof);
                 tsk::handle< int > h1(
- tsk::async( boost::move( t1), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib,
+ n - 1,
+ cutof),
+ tsk::as_sub_task() ) );
                 tsk::handle< int > h2(
- tsk::async( boost::move( t2), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib,
+ n - 2,
+ cutof),
+ tsk::as_sub_task() ) );
                 return h1.get() + h2.get();
         }
 }
@@ -64,16 +66,13 @@
                 results.reserve( 10);
 
                 for ( int i = 0; i < 10; ++i)
- {
- tsk::task< int > t(
- parallel_fib,
- i,
- 5);
                         results.push_back(
                                 tsk::async(
- boost::move( t),
+ tsk::make_task(
+ parallel_fib,
+ i,
+ 5),
                                         pool) );
- }
 
                 tsk::waitfor_all( results.begin(), results.end() );
 

Modified: sandbox/task/libs/task/examples/delay.cpp
==============================================================================
--- sandbox/task/libs/task/examples/delay.cpp (original)
+++ sandbox/task/libs/task/examples/delay.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -38,18 +38,20 @@
         else
         {
                 BOOST_ASSERT( boost::this_task::runs_in_pool() );
- tsk::task< int > t1(
- parallel_fib_,
- n - 1,
- cutof);
- tsk::task< int > t2(
- parallel_fib_,
- n - 2,
- cutof);
                 tsk::handle< int > h1(
- tsk::async( boost::move( t1), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib_,
+ n - 1,
+ cutof),
+ tsk::as_sub_task() ) );
                 tsk::handle< int > h2(
- tsk::async( boost::move( t2), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib_,
+ n - 2,
+ cutof),
+ tsk::as_sub_task() ) );
                 return h1.get() + h2.get();
         }
 }
@@ -67,14 +69,11 @@
                 pool_type pool( tsk::poolsize( 5) );
                 
                 for ( int i = 0; i < 10; ++i)
- {
- tsk::task< void > t(
- & parallel_fib,
- i);
                         tsk::async(
- boost::move( t),
+ tsk::make_task(
+ parallel_fib,
+ i),
                                 pool);
- }
 
                 return EXIT_SUCCESS;
         }

Modified: sandbox/task/libs/task/examples/interrupt.cpp
==============================================================================
--- sandbox/task/libs/task/examples/interrupt.cpp (original)
+++ sandbox/task/libs/task/examples/interrupt.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -46,17 +46,15 @@
         {
                 pool_type pool( tsk::poolsize( 5) );
                 
- tsk::task< void > t1( long_running_fn);
- tsk::task< int > t2( fibonacci_fn, 10);
                 tsk::async(
- boost::move( t1),
+ tsk::make_task( long_running_fn),
                         pool);
                 std::cout << "poolsize == " << pool.size() << std::endl;
                 std::cout << "idle threads == " << pool.idle() << std::endl;
                 std::cout << "active threads == " << pool.active() << std::endl;
                 tsk::handle< int > h(
                         tsk::async(
- boost::move( t2),
+ tsk::make_task( fibonacci_fn, 10),
                                 pool) );
                 h.interrupt();
                 std::cout << h.get() << std::endl;

Modified: sandbox/task/libs/task/examples/pending.cpp
==============================================================================
--- sandbox/task/libs/task/examples/pending.cpp (original)
+++ sandbox/task/libs/task/examples/pending.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -47,14 +47,12 @@
         {
                 pool_type pool( tsk::poolsize( 5) );
 
- tsk::task< void > t1( long_running_fn);
                 tsk::async(
- boost::move( t1),
+ tsk::make_task( long_running_fn),
                         pool);
- tsk::task< int > t2( fibonacci_fn, 10);
                 tsk::handle< int > h(
                         tsk::async(
- boost::move( t2),
+ tsk::make_task( fibonacci_fn, 10),
                                 pool) );
                 std::cout << "pending tasks == " << pool.pending() << std::endl;
                 std::cout << h.get() << std::endl;

Modified: sandbox/task/libs/task/examples/reschedule_until.cpp
==============================================================================
--- sandbox/task/libs/task/examples/reschedule_until.cpp (original)
+++ sandbox/task/libs/task/examples/reschedule_until.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -57,18 +57,20 @@
         else
         {
                 BOOST_ASSERT( boost::this_task::runs_in_pool() );
- tsk::task< int > t1(
- parallel_fib_,
- n - 1,
- cutof);
- tsk::task< int > t2(
- parallel_fib_,
- n - 2,
- cutof);
                 tsk::handle< int > h1(
- tsk::async( boost::move( t1), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib_,
+ n - 1,
+ cutof),
+ tsk::as_sub_task() ) );
                 tsk::handle< int > h2(
- tsk::async( boost::move( t2), tsk::as_sub_task() ) );
+ tsk::async(
+ tsk::make_task(
+ parallel_fib_,
+ n - 2,
+ cutof),
+ tsk::as_sub_task() ) );
                 return h1.get() + h2.get();
         }
 }
@@ -149,22 +151,17 @@
                 int fd[2];
                 create_sockets( fd);
 
- tsk::task< void > t1( do_read, fd[0]);
-
                 tsk::async(
- boost::move( t1),
+ tsk::make_task( do_read, fd[0]),
                         pool);
 
                 do_write( fd[1], "Hello ");
                 boost::this_thread::sleep( pt::seconds( 1) );
 
                 for ( int i = 0; i < 10; ++i)
- {
- tsk::task< void > t( parallel_fib, i);
                         tsk::async(
- boost::move( t),
+ tsk::make_task( parallel_fib, i),
                                 pool);
- }
 
                 do_write( fd[1], "World!");
 

Modified: sandbox/task/libs/task/src/interrupter.cpp
==============================================================================
--- sandbox/task/libs/task/src/interrupter.cpp (original)
+++ sandbox/task/libs/task/src/interrupter.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -52,28 +52,28 @@
 void
 interrupter::impl::set( shared_ptr< thread > const& thrd)
 {
- unique_lock< mutex > lk( mtx_);
+ lock_guard< mutex > lk( mtx_);
         set_( thrd);
 }
 
 void
 interrupter::impl::reset()
 {
- unique_lock< mutex > lk( mtx_);
+ lock_guard< mutex > lk( mtx_);
         reset_();
 }
 
 void
 interrupter::impl::interrupt()
 {
- unique_lock< mutex > lk( mtx_);
+ lock_guard< mutex > lk( mtx_);
         interrupt_();
 }
 
 bool
 interrupter::impl::interruption_requested()
 {
- unique_lock< mutex > lk( mtx_);
+ lock_guard< mutex > lk( mtx_);
         return interruption_requested_;
 }
 

Modified: sandbox/task/libs/task/src/wsq.cpp
==============================================================================
--- sandbox/task/libs/task/src/wsq.cpp (original)
+++ sandbox/task/libs/task/src/wsq.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -44,7 +44,7 @@
         }
         else
         {
- unique_lock< recursive_mutex > lk( mtx_);
+ lock_guard< recursive_mutex > lk( mtx_);
                 uint32_t head( head_idx_);
                 int count( size() );
 
@@ -79,7 +79,7 @@
         }
         else
         {
- unique_lock< recursive_mutex > lk( mtx_);
+ lock_guard< recursive_mutex > lk( mtx_);
                 if ( head_idx_ <= tail)
                 {
                         ca = array_[tail & mask_];

Modified: sandbox/task/libs/task/test/Jamfile.v2
==============================================================================
--- sandbox/task/libs/task/test/Jamfile.v2 (original)
+++ sandbox/task/libs/task/test/Jamfile.v2 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -31,4 +31,5 @@
     [ task-test test_new_thread ]
     [ task-test test_unbounded_pool ]
     [ task-test test_bounded_pool ]
+ [ task-test test_as_sub_task ]
     ;

Added: sandbox/task/libs/task/test/test_as_sub_task.cpp
==============================================================================
--- (empty file)
+++ sandbox/task/libs/task/test/test_as_sub_task.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -0,0 +1,76 @@
+
+// Copyright Oliver Kowalke 2009.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <cstdlib>
+#include <iostream>
+#include <map>
+#include <stdexcept>
+#include <vector>
+
+#include <boost/bind.hpp>
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/function.hpp>
+#include <boost/ref.hpp>
+#include <boost/test/unit_test.hpp>
+#include <boost/thread.hpp>
+#include <boost/thread/barrier.hpp>
+#include <boost/utility.hpp>
+
+#include <boost/task.hpp>
+
+#include "test_functions.hpp"
+
+namespace pt = boost::posix_time;
+namespace tsk = boost::task;
+
+namespace
+{
+bool exec_sub_task()
+{
+ tsk::handle< bool > h(
+ tsk::async(
+ tsk::make_task( runs_in_pool_fn),
+ tsk::as_sub_task() ) );
+ return h.get();
+}
+}
+
+class test_as_sub_task
+{
+public:
+ // check runs not in pool
+ void test_case_1()
+ {
+ tsk::task< bool > t( runs_in_pool_fn);
+ tsk::handle< bool > h(
+ tsk::async( boost::move( t), tsk::as_sub_task() ) );
+ BOOST_CHECK_EQUAL( h.get(), false);
+ }
+
+ // check runs in pool
+ void test_case_2()
+ {
+ tsk::static_pool<
+ tsk::unbounded_channel< tsk::fifo >
+ > pool( tsk::poolsize( 1) );
+ tsk::handle< bool > h(
+ tsk::async(
+ tsk::make_task( exec_sub_task),
+ pool) );
+ BOOST_CHECK_EQUAL( h.get(), true);
+ }
+};
+
+boost::unit_test::test_suite * init_unit_test_suite( int, char* [])
+{
+ boost::unit_test::test_suite * test( BOOST_TEST_SUITE("Boost.Task: test suite") );
+
+ boost::shared_ptr< test_as_sub_task > instance( new test_as_sub_task() );
+ test->add( BOOST_CLASS_TEST_CASE( & test_as_sub_task::test_case_1, instance) );
+ test->add( BOOST_CLASS_TEST_CASE( & test_as_sub_task::test_case_2, instance) );
+
+ return test;
+}

Modified: sandbox/task/libs/task/test/test_task.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_task.cpp (original)
+++ sandbox/task/libs/task/test/test_task.cpp 2009-07-01 14:53:41 EDT (Wed, 01 Jul 2009)
@@ -26,6 +26,10 @@
 namespace pt = boost::posix_time;
 namespace tsk = boost::task;
 
+void zero_args_fn() {}
+int one_arg_fn( int i) { return i; }
+int two_args_fn( int i, std::string const& s) { return i; }
+
 class test_task
 {
 public:
@@ -38,9 +42,19 @@
                 BOOST_CHECK( ! t2);
         }
 
- // check moved task
+ // check make_task
         void test_case_2()
         {
+ tsk::task< void > t1;
+ t1 = tsk::make_task( zero_args_fn);
+ tsk::task< int > t2 = tsk::make_task( one_arg_fn, 1);
+ tsk::task< int > t3;
+ t3 = tsk::make_task( two_args_fn, 1, "abc");
+ }
+
+ // check moved task
+ void test_case_3()
+ {
                 tsk::task< int > t1( fibonacci_fn, 10);
                 BOOST_CHECK( t1);
                 tsk::task< int > t2( boost::move( t1) );
@@ -50,7 +64,7 @@
         }
 
         // check execute twice
- void test_case_3()
+ void test_case_4()
         {
                 tsk::task< int > t1( fibonacci_fn, 10);
                 BOOST_CHECK_NO_THROW( t1() );
@@ -58,7 +72,7 @@
         }
 
         // check swap
- void test_case_4()
+ void test_case_5()
         {
                 tsk::task< int > t1( fibonacci_fn, 10);
                 tsk::task< int > t2;
@@ -79,6 +93,7 @@
         test->add( BOOST_CLASS_TEST_CASE( & test_task::test_case_2, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_task::test_case_3, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_task::test_case_4, instance) );
+ test->add( BOOST_CLASS_TEST_CASE( & test_task::test_case_5, instance) );
 
         return test;
 }


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk