[SVN r82362]
This commit is contained in:
Ion Gaztañaga
2013-01-05 16:39:30 +00:00
parent 637b83f5cf
commit 4e4659cc17
5 changed files with 51 additions and 11 deletions

View File

@@ -21,7 +21,7 @@ rule test_all
for local fileb in [ glob *.cpp ] for local fileb in [ glob *.cpp ]
{ {
all_rules += [ run $(fileb) /boost/thread//boost_thread all_rules += [ run $(fileb)
: # additional args : # additional args
: # test-files : # test-files
: # requirements : # requirements

View File

@@ -9,6 +9,7 @@
// See http://www.boost.org/libs/intrusive for documentation. // See http://www.boost.org/libs/intrusive for documentation.
// //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#include <boost/detail/no_exceptions_support.hpp>
//[doc_erasing_and_disposing //[doc_erasing_and_disposing
#include <boost/intrusive/list.hpp> #include <boost/intrusive/list.hpp>
@@ -50,18 +51,45 @@ int main()
//Fill all the nodes and insert them in the list //Fill all the nodes and insert them in the list
my_class_list list; my_class_list list;
//<-
#if 1
BOOST_TRY{
#else
//->
try{ try{
//<-
#endif
//->
//Insert new objects in the container //Insert new objects in the container
for(int i = 0; i < MaxElem; ++i) list.push_back(*new my_class(i)); for(int i = 0; i < MaxElem; ++i) list.push_back(*new my_class(i));
//Now use remove_and_dispose_if to erase and delete the objects //Now use remove_and_dispose_if to erase and delete the objects
list.remove_and_dispose_if(is_even(), delete_disposer()); list.remove_and_dispose_if(is_even(), delete_disposer());
} }
//<-
#if 1
BOOST_CATCH(...){
#else
//->
catch(...){ catch(...){
//<-
#endif
//->
//If something throws, make sure that all the memory is freed //If something throws, make sure that all the memory is freed
list.clear_and_dispose(delete_disposer()); list.clear_and_dispose(delete_disposer());
//<-
#if 1
BOOST_RETHROW
#else
//->
throw; throw;
//<-
#endif
//->
} }
//<-
BOOST_CATCH_END
//->
//Dispose remaining elements //Dispose remaining elements
list.erase_and_dispose(list.begin(), list.end(), delete_disposer()); list.erase_and_dispose(list.begin(), list.end(), delete_disposer());

View File

@@ -10,6 +10,18 @@
// //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
#include <boost/config.hpp>
#ifdef BOOST_NO_EXCEPTIONS
//Interprocess does not support BOOST_NO_EXCEPTIONS so nothing to test here
int main()
{
return 0;
}
#else //!BOOST_NO_EXCEPTIONS
//This is needed to allow concurrent test execution in //This is needed to allow concurrent test execution in
//several platforms. The shared memory must be unique //several platforms. The shared memory must be unique
//for each process... //for each process...
@@ -100,3 +112,6 @@ int main()
return 0; return 0;
} }
//] //]
#endif //BOOST_NO_EXCEPTIONS

View File

@@ -28,6 +28,7 @@
#include <iterator> #include <iterator>
#include <boost/cstdint.hpp> #include <boost/cstdint.hpp>
#include <boost/static_assert.hpp> #include <boost/static_assert.hpp>
#include <boost/detail/no_exceptions_support.hpp>
namespace boost { namespace boost {
namespace intrusive { namespace intrusive {
@@ -692,19 +693,20 @@ class array_initializer
{ {
char *init_buf = (char*)rawbuf; char *init_buf = (char*)rawbuf;
std::size_t i = 0; std::size_t i = 0;
try{ BOOST_TRY{
for(; i != N; ++i){ for(; i != N; ++i){
new(init_buf)T(init); new(init_buf)T(init);
init_buf += sizeof(T); init_buf += sizeof(T);
} }
} }
catch(...){ BOOST_CATCH(...){
while(i--){ while(i--){
init_buf -= sizeof(T); init_buf -= sizeof(T);
((T*)init_buf)->~T(); ((T*)init_buf)->~T();
} }
throw; BOOST_RETHROW;
} }
BOOST_CATCH_END
} }
operator T* () operator T* ()

View File

@@ -20,19 +20,14 @@ rule test_all
for local fileb in [ glob *.cpp ] for local fileb in [ glob *.cpp ]
{ {
all_rules += [ run $(fileb) /boost/thread//boost_thread all_rules += [ run $(fileb)
: # additional args : # additional args
: # test-files : # test-files
: # requirements : # requirements
<toolset>acc:<linkflags>-lrt
<toolset>acc-pa_risc:<linkflags>-lrt
<toolset>gcc-mingw:<linkflags>"-lole32 -loleaut32"
<host-os>hpux,<toolset>gcc:<linkflags>"-Wl,+as,mpas"
<host-os>windows,<toolset>clang:<linkflags>"-lole32 -loleaut32 -lpsapi -ladvapi32"
] ; ] ;
} }
return $(all_rules) ; return $(all_rules) ;
} }
test-suite intrusive_test : [ test_all r ] : <threading>multi ; test-suite intrusive_test : [ test_all r ] : ;