From 3911cd2472520708d8a107178c47f79d3c0803ab Mon Sep 17 00:00:00 2001 From: Emil Dotchevski Date: Sun, 24 Jan 2010 21:18:29 +0000 Subject: [PATCH] Adding another test for exception_ptr. [SVN r59259] --- test/Jamfile.v2 | 1 + test/exception_ptr_test.cpp | 108 ++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 test/exception_ptr_test.cpp diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 996bea6..9ed9bb2 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -36,6 +36,7 @@ run refcount_ptr_test.cpp ; run current_exception_cast_test.cpp ; run no_exceptions_test.cpp : : : off ; run errinfos_test.cpp ; +run exception_ptr_test.cpp /boost//thread : : : multi ; compile-fail exception_fail.cpp ; compile-fail throw_exception_fail.cpp ; compile-fail error_info_const_fail.cpp ; diff --git a/test/exception_ptr_test.cpp b/test/exception_ptr_test.cpp new file mode 100644 index 0000000..cec02c3 --- /dev/null +++ b/test/exception_ptr_test.cpp @@ -0,0 +1,108 @@ +//Copyright (c) 2006-2009 Emil Dotchevski and Reverge Studios, Inc. + +//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 +#include +#include +#include +#include +#include +#include +#include + +class thread_handle; +boost::shared_ptr create_thread( boost::function const & f ); +void join( thread_handle & t ); + +class +thread_handle + { + thread_handle( thread_handle const & ); + thread_handle & operator=( thread_handle const & ); + + boost::exception_ptr err_; + boost::thread t_; + + static + void + thread_wrapper( boost::function const & f, boost::exception_ptr & ep ) + { + BOOST_ASSERT(!ep); + try + { + f(); + } + catch(...) + { + ep = boost::current_exception(); + } + } + + explicit + thread_handle( boost::function const & f ): + t_(boost::bind(thread_wrapper,f,err_)) + { + } + + friend boost::shared_ptr create_thread( boost::function const & f ); + friend void join( thread_handle & t ); + }; + +boost::shared_ptr +create_thread( boost::function const & f ) + { + boost::shared_ptr t( new thread_handle(f) ); + return t; + } + +void +join( thread_handle & t ) + { + t.t_.join(); + if( t.err_ ) + rethrow_exception(t.err_); + } + +struct exc: boost::exception, std::exception { }; +typedef boost::error_info answer; + +void +thread_func() + { + BOOST_THROW_EXCEPTION(exc() << answer(42)); + } + +void +check( boost::shared_ptr const & t ) + { + try + { + join(*t); + } + catch( + exc & e ) + { + int const * a = boost::get_error_info(e); + BOOST_TEST(a && *a==42); + } + } + +int +main() + { + try + { + std::vector< boost::shared_ptr > threads; + std::generate_n(std::inserter(threads,threads.end()),256,boost::bind(create_thread,thread_func)); + std::for_each(threads.begin(),threads.end(),check); + return boost::report_errors(); + } + catch( + ... ) + { + BOOST_ERROR(boost::current_exception_diagnostic_information().c_str()); + return 42; + } + }