mirror of
https://github.com/boostorg/exception.git
synced 2025-07-29 12:07:20 +02:00
Adding another test for exception_ptr.
[SVN r59259]
This commit is contained in:
@ -36,6 +36,7 @@ run refcount_ptr_test.cpp ;
|
|||||||
run current_exception_cast_test.cpp ;
|
run current_exception_cast_test.cpp ;
|
||||||
run no_exceptions_test.cpp : : : <exception-handling>off ;
|
run no_exceptions_test.cpp : : : <exception-handling>off ;
|
||||||
run errinfos_test.cpp ;
|
run errinfos_test.cpp ;
|
||||||
|
run exception_ptr_test.cpp /boost//thread : : : <threading>multi ;
|
||||||
compile-fail exception_fail.cpp ;
|
compile-fail exception_fail.cpp ;
|
||||||
compile-fail throw_exception_fail.cpp ;
|
compile-fail throw_exception_fail.cpp ;
|
||||||
compile-fail error_info_const_fail.cpp ;
|
compile-fail error_info_const_fail.cpp ;
|
||||||
|
108
test/exception_ptr_test.cpp
Normal file
108
test/exception_ptr_test.cpp
Normal file
@ -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 <boost/exception_ptr.hpp>
|
||||||
|
#include <boost/exception/info.hpp>
|
||||||
|
#include <boost/exception/get_error_info.hpp>
|
||||||
|
#include <boost/exception/diagnostic_information.hpp>
|
||||||
|
#include <boost/function.hpp>
|
||||||
|
#include <boost/bind.hpp>
|
||||||
|
#include <boost/thread.hpp>
|
||||||
|
#include <boost/detail/lightweight_test.hpp>
|
||||||
|
|
||||||
|
class thread_handle;
|
||||||
|
boost::shared_ptr<thread_handle> create_thread( boost::function<void()> 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<void()> const & f, boost::exception_ptr & ep )
|
||||||
|
{
|
||||||
|
BOOST_ASSERT(!ep);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
ep = boost::current_exception();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit
|
||||||
|
thread_handle( boost::function<void()> const & f ):
|
||||||
|
t_(boost::bind(thread_wrapper,f,err_))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
friend boost::shared_ptr<thread_handle> create_thread( boost::function<void()> const & f );
|
||||||
|
friend void join( thread_handle & t );
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::shared_ptr<thread_handle>
|
||||||
|
create_thread( boost::function<void()> const & f )
|
||||||
|
{
|
||||||
|
boost::shared_ptr<thread_handle> 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<struct answer_,int> answer;
|
||||||
|
|
||||||
|
void
|
||||||
|
thread_func()
|
||||||
|
{
|
||||||
|
BOOST_THROW_EXCEPTION(exc() << answer(42));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
check( boost::shared_ptr<thread_handle> const & t )
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
join(*t);
|
||||||
|
}
|
||||||
|
catch(
|
||||||
|
exc & e )
|
||||||
|
{
|
||||||
|
int const * a = boost::get_error_info<answer>(e);
|
||||||
|
BOOST_TEST(a && *a==42);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::vector< boost::shared_ptr<thread_handle> > 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;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user