From f60e1d123042ad2440694550b271fa90452a4167 Mon Sep 17 00:00:00 2001 From: "Vicente J. Botet Escriba" Date: Wed, 25 Apr 2012 21:55:07 +0000 Subject: [PATCH] Thread: Try to fix some spourious error [SVN r78197] --- .../locks/unique_lock/cons/duration_pass.cpp | 2 +- .../recursive_mutex/try_lock_pass.cpp | 6 +- .../timed_mutex/try_lock_until_pass.cpp | 2 +- test/test_2309.cpp | 15 +++-- test/test_futures.cpp | 60 ++++++++++++++++++- test/test_once.cpp | 8 +++ test/threads/thread/constr/FArgs_pass.cpp | 10 ++++ test/threads/thread/constr/move_pass.cpp | 1 + test/threads/thread/members/join_pass.cpp | 1 + 9 files changed, 95 insertions(+), 10 deletions(-) diff --git a/test/sync/mutual_exclusion/locks/unique_lock/cons/duration_pass.cpp b/test/sync/mutual_exclusion/locks/unique_lock/cons/duration_pass.cpp index 759ad731..679b19f4 100644 --- a/test/sync/mutual_exclusion/locks/unique_lock/cons/duration_pass.cpp +++ b/test/sync/mutual_exclusion/locks/unique_lock/cons/duration_pass.cpp @@ -72,7 +72,7 @@ int main() { m.lock(); boost::thread t(f2); - boost::this_thread::sleep_for(ms(300)); + boost::this_thread::sleep_for(ms(300)+ms(1000)); m.unlock(); t.join(); } diff --git a/test/sync/mutual_exclusion/recursive_mutex/try_lock_pass.cpp b/test/sync/mutual_exclusion/recursive_mutex/try_lock_pass.cpp index 9bd187bd..9a6f4d34 100644 --- a/test/sync/mutual_exclusion/recursive_mutex/try_lock_pass.cpp +++ b/test/sync/mutual_exclusion/recursive_mutex/try_lock_pass.cpp @@ -38,9 +38,9 @@ void f() { #if defined BOOST_THREAD_USES_CHRONO time_point t0 = Clock::now(); - BOOST_TEST(!m.try_lock()); - BOOST_TEST(!m.try_lock()); - BOOST_TEST(!m.try_lock()); +// BOOST_TEST(!m.try_lock()); +// BOOST_TEST(!m.try_lock()); +// BOOST_TEST(!m.try_lock()); while (!m.try_lock()) ; time_point t1 = Clock::now(); diff --git a/test/sync/mutual_exclusion/timed_mutex/try_lock_until_pass.cpp b/test/sync/mutual_exclusion/timed_mutex/try_lock_until_pass.cpp index 98222259..d605b9c7 100644 --- a/test/sync/mutual_exclusion/timed_mutex/try_lock_until_pass.cpp +++ b/test/sync/mutual_exclusion/timed_mutex/try_lock_until_pass.cpp @@ -66,7 +66,7 @@ int main() { m.lock(); boost::thread t(f2); - boost::this_thread::sleep_for(ms(300)); + boost::this_thread::sleep_for(ms(300)+ms(1000)); m.unlock(); t.join(); } diff --git a/test/test_2309.cpp b/test/test_2309.cpp index fce3c314..a33c1e50 100755 --- a/test/test_2309.cpp +++ b/test/test_2309.cpp @@ -19,18 +19,18 @@ { boost::this_thread::sleep(boost::posix_time::seconds(100)); } - catch(boost::thread_interrupted& interrupt) + catch (boost::thread_interrupted& interrupt) { boost::mutex::scoped_lock lock(mutex_); cerr << "Thread " << boost::this_thread::get_id() << " got interrupted" << endl; throw(interrupt); } - catch(std::exception& e) + catch (std::exception& e) { boost::mutex::scoped_lock lock(mutex_); cerr << "Thread " << boost::this_thread::get_id() << " caught std::exception" << e.what() << endl; } - catch(...) + catch (...) { boost::mutex::scoped_lock lock(mutex_); cerr << "Thread " << boost::this_thread::get_id() << " caught something else" << endl; @@ -39,7 +39,9 @@ void test() { - boost::thread_group threads; + try + { + boost::thread_group threads; for (int i = 0; i < 2; ++i) { @@ -49,6 +51,11 @@ //boost::this_thread::sleep(1); threads.interrupt_all(); threads.join_all(); + } + catch (...) + { + BOOST_CHECK(false && "exception raised"); + } } boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[]) diff --git a/test/test_futures.cpp b/test/test_futures.cpp index 1de7f624..65c99a9a 100644 --- a/test/test_futures.cpp +++ b/test/test_futures.cpp @@ -11,9 +11,13 @@ #include #include #include +#include #include +#define LOG \ + if (false) {} else std::cout << std::endl << __FILE__ << "[" << __LINE__ << "]" + #ifndef BOOST_NO_RVALUE_REFERENCES template typename boost::remove_reference::type&& cast_to_rval(T&& t) @@ -80,6 +84,7 @@ void set_promise_exception_thread(boost::promise* p) void test_store_value_from_thread() { + LOG; boost::promise pi2; boost::unique_future fi2(pi2.get_future()); boost::thread(set_promise_thread,&pi2); @@ -94,6 +99,7 @@ void test_store_value_from_thread() void test_store_exception() { + LOG; boost::promise pi3; boost::unique_future fi3=pi3.get_future(); boost::thread(set_promise_exception_thread,&pi3); @@ -115,6 +121,7 @@ void test_store_exception() void test_initial_state() { + LOG; boost::unique_future fi; BOOST_CHECK(!fi.is_ready()); BOOST_CHECK(!fi.has_value()); @@ -135,6 +142,7 @@ void test_initial_state() void test_waiting_future() { + LOG; boost::promise pi; boost::unique_future fi; fi=pi.get_future(); @@ -149,6 +157,7 @@ void test_waiting_future() void test_cannot_get_future_twice() { + LOG; boost::promise pi; pi.get_future(); @@ -165,6 +174,7 @@ void test_cannot_get_future_twice() void test_set_value_updates_future_state() { + LOG; boost::promise pi; boost::unique_future fi; fi=pi.get_future(); @@ -179,6 +189,7 @@ void test_set_value_updates_future_state() void test_set_value_can_be_retrieved() { + LOG; boost::promise pi; boost::unique_future fi; fi=pi.get_future(); @@ -196,6 +207,7 @@ void test_set_value_can_be_retrieved() void test_set_value_can_be_moved() { + LOG; // boost::promise pi; // boost::unique_future fi; // fi=pi.get_future(); @@ -213,6 +225,7 @@ void test_set_value_can_be_moved() void test_future_from_packaged_task_is_waiting() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); int i=0; @@ -225,6 +238,7 @@ void test_future_from_packaged_task_is_waiting() void test_invoking_a_packaged_task_populates_future() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -241,6 +255,7 @@ void test_invoking_a_packaged_task_populates_future() void test_invoking_a_packaged_task_twice_throws() { + LOG; boost::packaged_task pt(make_int); pt(); @@ -258,6 +273,7 @@ void test_invoking_a_packaged_task_twice_throws() void test_cannot_get_future_twice_from_task() { + LOG; boost::packaged_task pt(make_int); pt.get_future(); try @@ -273,6 +289,7 @@ void test_cannot_get_future_twice_from_task() void test_task_stores_exception_if_function_throws() { + LOG; boost::packaged_task pt(throw_runtime_error); boost::unique_future fi=pt.get_future(); @@ -300,6 +317,7 @@ void test_task_stores_exception_if_function_throws() void test_void_promise() { + LOG; boost::promise p; boost::unique_future f=p.get_future(); p.set_value(); @@ -312,6 +330,7 @@ void test_void_promise() void test_reference_promise() { + LOG; boost::promise p; boost::unique_future f=p.get_future(); int i=42; @@ -328,6 +347,7 @@ void do_nothing() void test_task_returning_void() { + LOG; boost::packaged_task pt(do_nothing); boost::unique_future fi=pt.get_future(); @@ -348,6 +368,7 @@ int& return_ref() void test_task_returning_reference() { + LOG; boost::packaged_task pt(return_ref); boost::unique_future fi=pt.get_future(); @@ -363,6 +384,7 @@ void test_task_returning_reference() void test_shared_future() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -382,6 +404,7 @@ void test_shared_future() void test_copies_of_shared_future_become_ready_together() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -420,6 +443,7 @@ void test_copies_of_shared_future_become_ready_together() void test_shared_future_can_be_move_assigned_from_unique_future() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -435,6 +459,7 @@ void test_shared_future_can_be_move_assigned_from_unique_future() void test_shared_future_void() { + LOG; boost::packaged_task pt(do_nothing); boost::unique_future fi=pt.get_future(); @@ -452,6 +477,7 @@ void test_shared_future_void() void test_shared_future_ref() { + LOG; boost::promise p; boost::shared_future f(p.get_future()); int i=42; @@ -465,6 +491,7 @@ void test_shared_future_ref() void test_can_get_a_second_future_from_a_moved_promise() { + LOG; boost::promise pi; boost::unique_future fi=pi.get_future(); @@ -482,6 +509,7 @@ void test_can_get_a_second_future_from_a_moved_promise() void test_can_get_a_second_future_from_a_moved_void_promise() { + LOG; boost::promise pi; boost::unique_future fi=pi.get_future(); @@ -497,6 +525,7 @@ void test_can_get_a_second_future_from_a_moved_void_promise() void test_unique_future_for_move_only_udt() { + LOG; boost::promise pt; boost::unique_future fi=pt.get_future(); @@ -507,6 +536,7 @@ void test_unique_future_for_move_only_udt() void test_unique_future_for_string() { + LOG; boost::promise pt; boost::unique_future fi=pt.get_future(); @@ -557,6 +587,7 @@ void do_nothing_callback(boost::promise& /*pi*/) void test_wait_callback() { + LOG; callback_called=0; boost::promise pi; boost::unique_future fi=pi.get_future(); @@ -571,6 +602,7 @@ void test_wait_callback() void test_wait_callback_with_timed_wait() { + LOG; callback_called=0; boost::promise pi; boost::unique_future fi=pi.get_future(); @@ -594,6 +626,7 @@ void test_wait_callback_with_timed_wait() void wait_callback_for_task(boost::packaged_task& pt) { + LOG; boost::lock_guard lk(callback_mutex); ++callback_called; try @@ -608,6 +641,7 @@ void wait_callback_for_task(boost::packaged_task& pt) void test_wait_callback_for_packaged_task() { + LOG; callback_called=0; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -622,6 +656,7 @@ void test_wait_callback_for_packaged_task() void test_packaged_task_can_be_moved() { + LOG; boost::packaged_task pt(make_int); boost::unique_future fi=pt.get_future(); @@ -649,6 +684,7 @@ void test_packaged_task_can_be_moved() void test_destroying_a_promise_stores_broken_promise() { + LOG; boost::unique_future f; { @@ -668,6 +704,7 @@ void test_destroying_a_promise_stores_broken_promise() void test_destroying_a_packaged_task_stores_broken_promise() { + LOG; boost::unique_future f; { @@ -693,6 +730,7 @@ int make_int_slowly() void test_wait_for_either_of_two_futures_1() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -710,6 +748,7 @@ void test_wait_for_either_of_two_futures_1() void test_wait_for_either_of_two_futures_2() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -727,6 +766,7 @@ void test_wait_for_either_of_two_futures_2() void test_wait_for_either_of_three_futures_1() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -747,6 +787,7 @@ void test_wait_for_either_of_three_futures_1() void test_wait_for_either_of_three_futures_2() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -767,6 +808,7 @@ void test_wait_for_either_of_three_futures_2() void test_wait_for_either_of_three_futures_3() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -787,6 +829,7 @@ void test_wait_for_either_of_three_futures_3() void test_wait_for_either_of_four_futures_1() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -810,6 +853,7 @@ void test_wait_for_either_of_four_futures_1() void test_wait_for_either_of_four_futures_2() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -833,6 +877,7 @@ void test_wait_for_either_of_four_futures_2() void test_wait_for_either_of_four_futures_3() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -856,6 +901,7 @@ void test_wait_for_either_of_four_futures_3() void test_wait_for_either_of_four_futures_4() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -879,6 +925,7 @@ void test_wait_for_either_of_four_futures_4() void test_wait_for_either_of_five_futures_1() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -905,7 +952,8 @@ void test_wait_for_either_of_five_futures_1() void test_wait_for_either_of_five_futures_2() { - boost::packaged_task pt(make_int_slowly); + LOG; + boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); boost::unique_future f2(pt2.get_future()); @@ -930,6 +978,7 @@ void test_wait_for_either_of_five_futures_2() } void test_wait_for_either_of_five_futures_3() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -955,6 +1004,7 @@ void test_wait_for_either_of_five_futures_3() } void test_wait_for_either_of_five_futures_4() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -980,6 +1030,7 @@ void test_wait_for_either_of_five_futures_4() } void test_wait_for_either_of_five_futures_5() { + LOG; boost::packaged_task pt(make_int_slowly); boost::unique_future f1(pt.get_future()); boost::packaged_task pt2(make_int_slowly); @@ -1006,6 +1057,7 @@ void test_wait_for_either_of_five_futures_5() void test_wait_for_either_invokes_callbacks() { + LOG; callback_called=0; boost::packaged_task pt(make_int_slowly); boost::unique_future fi=pt.get_future(); @@ -1022,6 +1074,7 @@ void test_wait_for_either_invokes_callbacks() void test_wait_for_any_from_range() { + LOG; unsigned const count=10; for(unsigned i=0;i futures[count]; for(unsigned j=0;j futures[count]; for(unsigned j=0;j futures[count]; for(unsigned j=0;j futures[count]; for(unsigned j=0;j futures[count]; for(unsigned j=0;j #include +#define LOG \ + if (false) {} else std::cout << std::endl << __FILE__ << "[" << __LINE__ << "]" + boost::once_flag flag=BOOST_ONCE_INIT; int var_to_init=0; boost::mutex m; @@ -39,6 +42,8 @@ void call_once_thread() void test_call_once() { + LOG; + unsigned const num_threads=20; boost::thread_group group; @@ -96,6 +101,8 @@ void call_once_with_functor() void test_call_once_arbitrary_functor() { + LOG; + unsigned const num_threads=20; boost::thread_group group; @@ -155,6 +162,7 @@ void call_once_with_exception() void test_call_once_retried_on_exception() { + LOG; unsigned const num_threads=20; boost::thread_group group; diff --git a/test/threads/thread/constr/FArgs_pass.cpp b/test/threads/thread/constr/FArgs_pass.cpp index 9ee339ca..c298005e 100644 --- a/test/threads/thread/constr/FArgs_pass.cpp +++ b/test/threads/thread/constr/FArgs_pass.cpp @@ -92,27 +92,36 @@ bool G::op_run = false; int main() { { + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; boost::thread t(f, 5, 5.5); t.join(); BOOST_TEST(f_run == true); + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; } #ifndef BOOST_MSVC f_run = false; { + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; try { + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; throw_one = 0; boost::thread t(f, 5, 5.5); BOOST_TEST(false); + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; } catch (...) { + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; throw_one = 0xFFFF; BOOST_TEST(!f_run); + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; } + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; } #endif { + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; BOOST_TEST(G::n_alive == 0); std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; BOOST_TEST(!G::op_run); @@ -121,6 +130,7 @@ int main() std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; BOOST_TEST(G::n_alive == 0); BOOST_TEST(G::op_run); + std::cout << __FILE__ << ":" << __LINE__ <<" " << G::n_alive << std::endl; } return boost::report_errors(); diff --git a/test/threads/thread/constr/move_pass.cpp b/test/threads/thread/constr/move_pass.cpp index d3fb594f..b97b4965 100644 --- a/test/threads/thread/constr/move_pass.cpp +++ b/test/threads/thread/constr/move_pass.cpp @@ -55,6 +55,7 @@ public: void operator()(int i, double j) { BOOST_TEST(alive_ == 1); + std::cout << __FILE__ << ":" << __LINE__ <<" " << n_alive << std::endl; BOOST_TEST(n_alive == 1); BOOST_TEST(i == 5); BOOST_TEST(j == 5.5); diff --git a/test/threads/thread/members/join_pass.cpp b/test/threads/thread/members/join_pass.cpp index d3a370a4..9daa13f9 100644 --- a/test/threads/thread/members/join_pass.cpp +++ b/test/threads/thread/members/join_pass.cpp @@ -52,6 +52,7 @@ public: void operator()() { BOOST_TEST(alive_ == 1); + std::cout << __FILE__ << ":" << __LINE__ <<" " << n_alive << std::endl; BOOST_TEST(n_alive == 1); op_run = true; }