$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r53360 - in sandbox/task: boost boost/task boost/task/detail libs/task/src libs/task/test
From: oliver.kowalke_at_[hidden]
Date: 2009-05-28 16:10:43
Author: olli
Date: 2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
New Revision: 53360
URL: http://svn.boost.org/trac/boost/changeset/53360
Log:
* meta-functions added -> check if pool has attributes at compile time
* correction in handle anf interrupter (interrupt_wait_for() and interrupt_and_wait_until())
* tests added
Added:
   sandbox/task/boost/task/detail/meta.hpp   (contents, props changed)
   sandbox/task/boost/task/meta.hpp   (contents, props changed)
Removed:
   sandbox/task/boost/task/detail/info.hpp
   sandbox/task/boost/task/info.hpp
Text files modified: 
   sandbox/task/boost/task.hpp                         |     2                                         
   sandbox/task/boost/task/exceptions.hpp              |     8 +++++                                   
   sandbox/task/boost/task/fifo.hpp                    |     4 +-                                      
   sandbox/task/boost/task/handle.hpp                  |    63 ++++++++++++++++++++++++++++++--------- 
   sandbox/task/boost/task/priority.hpp                |     4 +-                                      
   sandbox/task/boost/task/smart.hpp                   |     4 +-                                      
   sandbox/task/libs/task/src/interrupter.cpp          |     2                                         
   sandbox/task/libs/task/test/test_bounded_pool.cpp   |    48 +++++++++++++-----------------          
   sandbox/task/libs/task/test/test_default_pool.cpp   |    21 +-----------                            
   sandbox/task/libs/task/test/test_new_thread.cpp     |    21 +-----------                            
   sandbox/task/libs/task/test/test_own_thread.cpp     |    45 ++++++++++++++-------------             
   sandbox/task/libs/task/test/test_unbounded_pool.cpp |    48 +++++++++++++-----------------          
   12 files changed, 135 insertions(+), 135 deletions(-)
Modified: sandbox/task/boost/task.hpp
==============================================================================
--- sandbox/task/boost/task.hpp	(original)
+++ sandbox/task/boost/task.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -15,7 +15,7 @@
 #include <boost/task/future.hpp>
 #include <boost/task/handle.hpp>
 #include <boost/task/id.hpp>
-#include <boost/task/info.hpp>
+#include <boost/task/meta.hpp>
 #include <boost/task/poolsize.hpp>
 #include <boost/task/priority.hpp>
 #include <boost/task/scanns.hpp>
Deleted: sandbox/task/boost/task/detail/info.hpp
==============================================================================
--- sandbox/task/boost/task/detail/info.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
+++ (empty file)
@@ -1,22 +0,0 @@
-
-//          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)
-
-#ifndef BOOST_TASK_DETAIL_INFO_H
-#define BOOST_TASK_DETAIL_INFO_H
-
-namespace boost { namespace task
-{
-namespace detail
-{
-struct has_priority
-{};
-
-struct has_no_priority
-{};
-} } }
-
-#endif // BOOST_TASK_DETAIL_INFO_H
-
Added: sandbox/task/boost/task/detail/meta.hpp
==============================================================================
--- (empty file)
+++ sandbox/task/boost/task/detail/meta.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -0,0 +1,22 @@
+
+//          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)
+
+#ifndef BOOST_TASK_DETAIL_INFO_H
+#define BOOST_TASK_DETAIL_INFO_H
+
+namespace boost { namespace task
+{
+namespace detail
+{
+struct has_attribute
+{};
+
+struct has_no_attribute
+{};
+} } }
+
+#endif // BOOST_TASK_DETAIL_INFO_H
+
Modified: sandbox/task/boost/task/exceptions.hpp
==============================================================================
--- sandbox/task/boost/task/exceptions.hpp	(original)
+++ sandbox/task/boost/task/exceptions.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -44,6 +44,14 @@
         {}
 };
 
+class task_uninitialized : public std::logic_error
+{
+public:
+    task_uninitialized()
+	: std::logic_error("task uninitialized")
+	{}
+};
+
 class task_already_executed : public std::logic_error
 {
 public:
Modified: sandbox/task/boost/task/fifo.hpp
==============================================================================
--- sandbox/task/boost/task/fifo.hpp	(original)
+++ sandbox/task/boost/task/fifo.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -11,13 +11,13 @@
 #include <list>
 
 #include <boost/task/detail/pool_callable.hpp>
-#include <boost/task/detail/info.hpp>
+#include <boost/task/detail/meta.hpp>
 
 namespace boost { namespace task
 {
 struct fifo
 {
-	typedef detail::has_no_priority	priority_tag_type;
+	typedef detail::has_no_attribute	attribute_tag_type;
 
         class impl
         {
Modified: sandbox/task/boost/task/handle.hpp
==============================================================================
--- sandbox/task/boost/task/handle.hpp	(original)
+++ sandbox/task/boost/task/handle.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -57,7 +57,7 @@
 
         shared_future< R >		fut_;
         detail::interrupter		intr_;
-	id						id_;
+	id				id_;
 
         handle(
                 id const& id__,
@@ -97,6 +97,8 @@
         {
                 try
                 { return fut_.get(); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
                 catch ( broken_promise const&)
                 { throw broken_task(); }
                 catch ( promise_already_satisfied const&)
@@ -113,14 +115,29 @@
         { return fut_.has_exception(); }
 
         void wait() const
-	{ fut_.wait(); }
+	{
+		try
+		{ fut_.wait(); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
     template< typename Duration >
     bool wait_for( Duration const& rel_time) const
-	{ return fut_.timed_wait( rel_time); }
+	{
+		try
+		{ return fut_.timed_wait( rel_time); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
     bool wait_until( system_time const& abs_time) const
-	{ return fut_.timed_wait_until( abs_time); }
+	{
+		try
+		{ return fut_.timed_wait_until( abs_time); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
         void swap( handle< R > & other)
         {
@@ -174,7 +191,6 @@
         id_( id__)
         {}
 
-
 public:
         handle()
         : fut_(), intr_(), id_()
@@ -189,12 +205,12 @@
         void interrupt_and_wait()
         { intr_.interrupt_and_wait(); }
 
-	void interrupt_and_wait( system_time const& abs_time)
-	{ intr_.interrupt_and_wait( abs_time); }
+	void interrupt_and_wait_until( system_time const& abs_time)
+	{ intr_.interrupt_and_wait_until( abs_time); }
 
         template< typename Duration >
-	void interrupt_and_wait( Duration const& rel_time)
-	{ intr_.interrupt_and_wait( rel_time); }
+	void interrupt_and_wait_for( Duration const& rel_time)
+	{ intr_.interrupt_and_wait_for( rel_time); }
 
         bool interruption_requested()
         { return intr_.interruption_requested(); }
@@ -203,6 +219,8 @@
         {
                 try
                 { fut_.get(); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
                 catch ( broken_promise const&)
                 { throw broken_task(); }
                 catch ( promise_already_satisfied const&)
@@ -219,14 +237,29 @@
         { return fut_.has_exception(); }
 
         void wait() const
-	{ fut_.wait(); }
+	{
+		try
+		{ fut_.wait(); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
-	void interrupt_and_wait_until( system_time const& abs_time)
-	{ intr_.interrupt_and_wait_until( abs_time); }
+    template< typename Duration >
+    bool wait_for( Duration const& rel_time) const
+	{
+		try
+		{ return fut_.timed_wait( rel_time); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
-	template< typename Duration >
-	void interrupt_and_wait_for( Duration const& rel_time)
-	{ intr_.interrupt_and_wait_for( rel_time); }
+    bool wait_until( system_time const& abs_time) const
+	{
+		try
+		{ return fut_.timed_wait_until( abs_time); }
+		catch ( future_uninitialized const&)
+		{ throw task_uninitialized(); }
+	}
 
         void swap( handle< void > & other)
         {
Deleted: sandbox/task/boost/task/info.hpp
==============================================================================
--- sandbox/task/boost/task/info.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
+++ (empty file)
@@ -1,22 +0,0 @@
-
-//          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)
-
-#ifndef BOOST_TASK_DETAIL_INFO_H
-#define BOOST_TASK_DETAIL_INFO_H
-
-namespace boost { namespace task
-{
-namespace detail
-{
-struct has_priority
-{};
-
-struct has_no_priority
-{};
-} } }
-
-#endif // BOOST_TASK_DETAIL_INFO_H
-
Added: sandbox/task/boost/task/meta.hpp
==============================================================================
--- (empty file)
+++ sandbox/task/boost/task/meta.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -0,0 +1,34 @@
+
+//          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)
+
+#ifndef BOOST_TASK_META_H
+#define BOOST_TASK_META_H
+
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/task/detail/meta.hpp>
+
+namespace boost { namespace task
+{
+template< typename Pool >
+struct has_attribute : public mpl::bool_<
+	is_same<
+		detail::has_attribute,
+		typename Pool::scheduler_type::attribute_tag_type
+	>::value
+>
+{};
+
+template< typename Pool >
+struct attribute_type
+{
+	typedef typename Pool::scheduler_type::attribute_type	type;
+};
+} }
+
+#endif // BOOST_TASK_META_H
+
Modified: sandbox/task/boost/task/priority.hpp
==============================================================================
--- sandbox/task/boost/task/priority.hpp	(original)
+++ sandbox/task/boost/task/priority.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -16,7 +16,7 @@
 #include <boost/multi_index/ordered_index.hpp>
 
 #include <boost/task/detail/pool_callable.hpp>
-#include <boost/task/detail/info.hpp>
+#include <boost/task/detail/meta.hpp>
 
 namespace boost { namespace task
 {
@@ -26,7 +26,7 @@
 >
 struct priority
 {
-	typedef detail::has_priority	priority_tag_type;
+	typedef detail::has_attribute	attribute_tag_type;
         typedef Attr					attribute_type;
 
         class impl
Modified: sandbox/task/boost/task/smart.hpp
==============================================================================
--- sandbox/task/boost/task/smart.hpp	(original)
+++ sandbox/task/boost/task/smart.hpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -15,7 +15,7 @@
 #include <boost/multi_index/ordered_index.hpp>
 
 #include <boost/task/detail/pool_callable.hpp>
-#include <boost/task/detail/info.hpp>
+#include <boost/task/detail/meta.hpp>
 
 namespace boost { namespace task
 {
@@ -27,7 +27,7 @@
 >
 struct smart
 {
-	typedef detail::has_priority	priority_tag_type;
+	typedef detail::has_attribute	attribute_tag_type;
         typedef Attr					attribute_type;
 
         class impl
Modified: sandbox/task/libs/task/src/interrupter.cpp
==============================================================================
--- sandbox/task/libs/task/src/interrupter.cpp	(original)
+++ sandbox/task/libs/task/src/interrupter.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -116,7 +116,7 @@
 
 void
 interrupter::interrupt_and_wait_until( system_time const& abs_time)
-{ impl_->interrupt_and_wait( abs_time); }
+{ impl_->interrupt_and_wait_until( abs_time); }
 
 bool
 interrupter::interruption_requested()
Modified: sandbox/task/libs/task/test/test_bounded_pool.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_bounded_pool.cpp	(original)
+++ sandbox/task/libs/task/test/test_bounded_pool.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -17,6 +17,7 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread/barrier.hpp>
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility.hpp>
 
 #include <boost/task.hpp>
@@ -138,12 +139,7 @@
                                 tsk::make_task(
                                         throwing_fn) ) );
                 pool.shutdown();
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( std::runtime_error const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), std::runtime_error);
         }
 
         // check shutdown with task_rejected exception
@@ -157,19 +153,14 @@
                         tsk::low_watermark( 10) );
                 pool.shutdown();
                 BOOST_CHECK( pool.closed() );
-		bool thrown( false);
-		try
-		{
+		BOOST_CHECK_THROW(
                         tsk::async(
                                 pool,
                                 tsk::make_task(
                                         boost::bind(
                                                 fibonacci_fn,
-						10) ) );
-		}
-		catch ( tsk::task_rejected const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+						10) ) ),
+			tsk::task_rejected);
         }
 
         // check shutdown_now with thread_interrupted exception
@@ -194,12 +185,7 @@
                 BOOST_CHECK_EQUAL( pool.size(), std::size_t( 1) );
                 BOOST_CHECK_EQUAL( pool.idle(), std::size_t( 1) );
                 BOOST_CHECK_EQUAL( pool.active(), std::size_t( 0) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check pending
@@ -279,12 +265,7 @@
                 pool.shutdown();
                 BOOST_CHECK_EQUAL( buffer[0], 0);
                 BOOST_CHECK_EQUAL( buffer.size(), std::size_t( 1) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check fifo scheduling
@@ -293,6 +274,7 @@
                 typedef tsk::static_pool<
                         tsk::bounded_channel< tsk::fifo >
 		> pool_type;
+		BOOST_CHECK( ! tsk::has_attribute< pool_type >::value);
                 pool_type pool(
                         tsk::poolsize( 1),
                         tsk::high_watermark( 10),
@@ -329,6 +311,12 @@
                 typedef tsk::static_pool<
                         tsk::bounded_channel< tsk::priority< int > >
 		> pool_type;
+		BOOST_CHECK( tsk::has_attribute< pool_type >::value);
+		BOOST_CHECK(
+			boost::is_same<
+				tsk::attribute_type< pool_type >::type,
+				int
+			>::value);
                 pool_type pool(
                         tsk::poolsize( 1),
                         tsk::high_watermark( 10),
@@ -368,6 +356,12 @@
                 typedef tsk::static_pool<
                         tsk::bounded_channel< tsk::smart< int, std::less< int >, tsk::replace_oldest, tsk::take_oldest > >
 		> pool_type;
+		BOOST_CHECK( tsk::has_attribute< pool_type >::value);
+		BOOST_CHECK(
+			boost::is_same<
+				tsk::attribute_type< pool_type >::type,
+				int
+			>::value);
                 pool_type pool(
                         tsk::poolsize( 1),
                         tsk::high_watermark( 10),
@@ -417,7 +411,7 @@
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_1, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_2, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_3, instance) );
-	//test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_4, instance) );
+	test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_4, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_5, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_6, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_bounded_pool::test_case_7, instance) );
Modified: sandbox/task/libs/task/test/test_default_pool.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_default_pool.cpp	(original)
+++ sandbox/task/libs/task/test/test_default_pool.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -82,12 +82,7 @@
                                 tsk::default_pool(),
                                 tsk::make_task(
                                         throwing_fn) ) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( std::runtime_error const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), std::runtime_error);
         }
 
         // check interrupt
@@ -101,12 +96,7 @@
                                         pt::seconds( 3) ) ) );
                 h.interrupt();
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check interrupt_and_wait
@@ -124,12 +114,7 @@
                 BOOST_CHECK( finished);
                 BOOST_CHECK( h.is_ready() );
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check waitfor_all()
Modified: sandbox/task/libs/task/test/test_new_thread.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_new_thread.cpp	(original)
+++ sandbox/task/libs/task/test/test_new_thread.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -82,12 +82,7 @@
                                 tsk::new_thread(),
                                 tsk::make_task(
                                         throwing_fn) ) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( std::runtime_error const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), std::runtime_error);
         }
 
         // check interrupt
@@ -101,12 +96,7 @@
                                         pt::seconds( 3) ) ) );
                 h.interrupt();
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check interrupt_and_wait
@@ -124,12 +114,7 @@
                 BOOST_CHECK( finished);
                 BOOST_CHECK( h.is_ready() );
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check waitfor_all()
Modified: sandbox/task/libs/task/test/test_own_thread.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_own_thread.cpp	(original)
+++ sandbox/task/libs/task/test/test_own_thread.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -82,17 +82,27 @@
                                 tsk::own_thread(),
                                 tsk::make_task(
                                         throwing_fn) ) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( std::runtime_error const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), std::runtime_error);
         }
 
-	// check interrupt
+	// check task_uninitialized
         void test_case_5()
         {
+		tsk::handle< int > h;
+		BOOST_CHECK_THROW( h.get(), tsk::task_uninitialized);
+		BOOST_CHECK_THROW( h.wait(), tsk::task_uninitialized);
+		BOOST_CHECK_THROW( h.wait_for( pt::seconds( 1) ), tsk::task_uninitialized);
+		BOOST_CHECK_THROW(
+		  h.wait_until( boost::get_system_time() + pt::seconds( 1) ),
+		  tsk::task_uninitialized);
+		BOOST_CHECK( ! h.is_ready() );
+		BOOST_CHECK( ! h.has_value() );
+		BOOST_CHECK( ! h.has_exception() );
+	}
+
+	// check interrupt
+	void test_case_6()
+	{
                 tsk::handle< void > h(
                         tsk::async(
                                 tsk::own_thread(),
@@ -101,16 +111,11 @@
                                         pt::seconds( 3) ) ) );
                 h.interrupt();
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( ! thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check interrupt_and_wait
-	void test_case_6()
+	void test_case_7()
         {
                 bool finished( false);
                 tsk::handle< void > h(
@@ -124,16 +129,11 @@
                 BOOST_CHECK( ! finished);
                 BOOST_CHECK( h.is_ready() );
                 BOOST_CHECK( h.interruption_requested() );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( ! thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check waitfor_all()
-	void test_case_7()
+	void test_case_8()
         {
                 std::vector< tsk::handle< int > > vec;
                 for ( int i = 0; i <= 5; ++i)
@@ -159,7 +159,7 @@
         }
 
         // check waitfor_any()
-	void test_case_8()
+	void test_case_9()
         {
                 tsk::handle< void > h1(
                         tsk::async(
@@ -193,6 +193,7 @@
         test->add( BOOST_CLASS_TEST_CASE( & test_own_thread::test_case_6, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_own_thread::test_case_7, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_own_thread::test_case_8, instance) );
+	test->add( BOOST_CLASS_TEST_CASE( & test_own_thread::test_case_9, instance) );
 
         return test;
 }
Modified: sandbox/task/libs/task/test/test_unbounded_pool.cpp
==============================================================================
--- sandbox/task/libs/task/test/test_unbounded_pool.cpp	(original)
+++ sandbox/task/libs/task/test/test_unbounded_pool.cpp	2009-05-28 16:10:41 EDT (Thu, 28 May 2009)
@@ -17,6 +17,7 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/thread.hpp>
 #include <boost/thread/barrier.hpp>
+#include <boost/type_traits/is_same.hpp>
 #include <boost/utility.hpp>
 
 #include <boost/task.hpp>
@@ -120,12 +121,7 @@
                                 tsk::make_task(
                                         throwing_fn) ) );
                 pool.shutdown();
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( std::runtime_error const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), std::runtime_error);
         }
 
         // check shutdown with task_rejected exception
@@ -136,19 +132,14 @@
 		> pool( tsk::poolsize( 1) );
                 pool.shutdown();
                 BOOST_CHECK( pool.closed() );
-		bool thrown( false);
-		try
-		{
+		BOOST_CHECK_THROW(
                         tsk::async(
                                 pool,
                                 tsk::make_task(
                                         boost::bind(
                                                 fibonacci_fn,
-						10) ) );
-		}
-		catch ( tsk::task_rejected const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+						10) ) ),
+			tsk::task_rejected);
         }
 
         // check shutdown_now with thread_interrupted exception
@@ -170,12 +161,7 @@
                 BOOST_CHECK_EQUAL( pool.size(), std::size_t( 1) );
                 BOOST_CHECK_EQUAL( pool.idle(), std::size_t( 1) );
                 BOOST_CHECK_EQUAL( pool.active(), std::size_t( 0) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check pending
@@ -248,12 +234,7 @@
                 pool.shutdown();
                 BOOST_CHECK_EQUAL( buffer[0], 0);
                 BOOST_CHECK_EQUAL( buffer.size(), std::size_t( 1) );
-		bool thrown( false);
-		try
-		{ h.get(); }
-		catch ( tsk::task_interrupted const&)
-		{ thrown = true; }
-		BOOST_CHECK( thrown);
+		BOOST_CHECK_THROW( h.get(), tsk::task_interrupted);
         }
 
         // check fifo scheduling
@@ -262,6 +243,7 @@
                 typedef tsk::static_pool<
                         tsk::unbounded_channel< tsk::fifo >
 		> pool_type;
+		BOOST_CHECK( ! tsk::has_attribute< pool_type >::value);
                 pool_type pool( tsk::poolsize( 1) );
                 boost::barrier b( 2);
                 tsk::async(
@@ -295,6 +277,12 @@
                 typedef tsk::static_pool<
                         tsk::unbounded_channel< tsk::priority< int > >
 		> pool_type;
+		BOOST_CHECK( tsk::has_attribute< pool_type >::value);
+		BOOST_CHECK(
+			boost::is_same<
+				tsk::attribute_type< pool_type >::type,
+				int
+			>::value);
                 pool_type pool( tsk::poolsize( 1) );
                 boost::barrier b( 2);
                 tsk::async(
@@ -331,6 +319,12 @@
                 typedef tsk::static_pool<
                         tsk::unbounded_channel< tsk::smart< int, std::less< int >, tsk::replace_oldest, tsk::take_oldest > >
 		> pool_type;
+		BOOST_CHECK( tsk::has_attribute< pool_type >::value);
+		BOOST_CHECK(
+			boost::is_same<
+				tsk::attribute_type< pool_type >::type,
+				int
+			>::value);
                 pool_type pool( tsk::poolsize( 1) );
                 boost::barrier b( 2);
                 pool.submit(
@@ -376,7 +370,7 @@
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_1, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_2, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_3, instance) );
-//	test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_4, instance) );
+	test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_4, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_5, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_6, instance) );
         test->add( BOOST_CLASS_TEST_CASE( & test_unbounded_pool::test_case_7, instance) );