summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp')
-rw-r--r--src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp295
1 files changed, 295 insertions, 0 deletions
diff --git a/src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp b/src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp
new file mode 100644
index 000000000..814ef28e5
--- /dev/null
+++ b/src/boost/libs/thread/test/experimental/parallel/v2/task_region_pass.cpp
@@ -0,0 +1,295 @@
+// Copyright (C) 2014-2015 Vicente J. Botet Escriba
+//
+// 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)
+
+// <boost/thread/experimental/parallel/v1/exception_list.hpp>
+
+
+#define BOOST_THREAD_VERSION 4
+#define BOOST_THREAD_PROVIDES_EXECUTORS
+#include <boost/config.hpp>
+#if ! defined BOOST_NO_CXX11_DECLTYPE
+#define BOOST_RESULT_OF_USE_DECLTYPE
+#endif
+
+#include <boost/thread/experimental/parallel/v2/task_region.hpp>
+#include <string>
+
+#include <boost/detail/lightweight_test.hpp>
+
+#if ! defined BOOST_NO_CXX11_LAMBDAS && defined(BOOST_THREAD_PROVIDES_INVOKE)
+using boost::experimental::parallel::v2::task_region;
+using boost::experimental::parallel::v2::task_region_handle;
+using boost::experimental::parallel::v1::exception_list;
+
+void run_no_exception()
+{
+ std::string s("test");
+ bool parent_flag = false;
+ bool task1_flag = false;
+ bool task2_flag = false;
+ bool task21_flag = false;
+ bool task3_flag = false;
+ task_region([&](task_region_handle& trh)
+ {
+ parent_flag = true;
+ trh.run([&]()
+ {
+ task1_flag = true;
+ std::cout << "task1: " << s << std::endl;
+ });
+ trh.run([&]()
+ {
+ task2_flag = true;
+ std::cout << "task2" << std::endl;
+ task_region([&](task_region_handle& trh)
+ {
+ trh.run([&]()
+ {
+ task21_flag = true;
+ std::cout << "task2.1" << std::endl;
+ });
+ });
+ });
+ int i = 0, j = 10, k = 20;
+ trh.run([=, &task3_flag]()
+ {
+ task3_flag = true;
+ std::cout << "task3: " << i << " " << j << " " << k << std::endl;
+ });
+ std::cout << "parent" << std::endl;
+ });
+ BOOST_TEST(parent_flag);
+ BOOST_TEST(task1_flag);
+ BOOST_TEST(task2_flag);
+ BOOST_TEST(task21_flag);
+ BOOST_TEST(task3_flag);
+}
+
+void run_no_exception_wait()
+{
+ std::string s("test");
+ bool parent_flag = false;
+ bool wait_flag = false;
+ bool task1_flag = false;
+ bool task2_flag = false;
+ bool task21_flag = false;
+ bool task3_flag = false;
+ task_region([&](task_region_handle& trh)
+ {
+ parent_flag = true;
+ trh.run([&]()
+ {
+ task1_flag = true;
+ std::cout << "task1: " << s << std::endl;
+ });
+ trh.run([&]()
+ {
+ task2_flag = true;
+ std::cout << "task2" << std::endl;
+ task_region([&](task_region_handle& trh)
+ {
+ trh.run([&]()
+ {
+ task21_flag = true;
+ std::cout << "task2.1" << std::endl;
+ });
+ });
+ });
+ int i = 0, j = 10, k = 20;
+ trh.run([=, &task3_flag]()
+ {
+ task3_flag = true;
+ std::cout << "task3: " << i << " " << j << " " << k << std::endl;
+ });
+ std::cout << "before" << std::endl;
+ trh.wait();
+ wait_flag = true;
+ std::cout << "parent" << std::endl;
+ });
+ BOOST_TEST(parent_flag);
+ BOOST_TEST(wait_flag);
+ BOOST_TEST(task1_flag);
+ BOOST_TEST(task2_flag);
+ BOOST_TEST(task21_flag);
+ BOOST_TEST(task3_flag);
+}
+
+void run_exception_1()
+{
+ try
+ {
+ task_region([](task_region_handle& trh)
+ {
+ trh.run([]()
+ {
+ std::cout << "task1" << std::endl;
+ throw 1;
+ });
+ boost::this_thread::sleep_for(boost::chrono::seconds(1));
+ trh.run([]()
+ {
+ std::cout << "task3" << std::endl;
+ });
+#if defined BOOST_THREAD_TASK_REGION_HAS_SHARED_CANCELED
+ BOOST_TEST(false);
+#endif
+ });
+ BOOST_TEST(false);
+ }
+ catch (exception_list const& e)
+ {
+ BOOST_TEST_EQ(e.size(), 1u);
+ }
+ catch (...)
+ {
+ BOOST_TEST(false);
+ }
+}
+
+void run_exception()
+{
+ try
+ {
+ task_region([](task_region_handle& trh)
+ {
+ trh.run([]()
+ {
+ std::cout << "task1" << std::endl;
+ throw 1;
+ });
+ trh.run([]()
+ {
+ std::cout << "task2" << std::endl;
+ throw 2;
+ });
+ boost::this_thread::sleep_for(boost::chrono::seconds(1));
+ trh.run([]()
+ {
+ std::cout << "task3" << std::endl;
+ throw 3;
+ });
+ std::cout << "parent" << std::endl;
+ throw 100;
+ });
+ BOOST_TEST(false);
+ }
+ catch (exception_list const& el)
+ {
+ BOOST_TEST(el.size() >= 1u);
+ for (boost::exception_ptr const& e: el)
+ {
+ try {
+ boost::rethrow_exception(e);
+ }
+ catch (boost::exception&)
+ {
+ BOOST_TEST(true);
+ }
+ catch (int i) // this doesn't works yet
+ {
+ BOOST_TEST((i == 1) || (i == 2) || (i == 3));
+ }
+ catch (...)
+ {
+ BOOST_TEST(false);
+ }
+ }
+ }
+ catch (...)
+ {
+ BOOST_TEST(false);
+ }
+}
+
+
+void run_nested_exception()
+{
+ std::string s("test");
+ bool parent_flag = false;
+ bool task1_flag = false;
+ bool task2_flag = false;
+ bool task21_flag = false;
+ bool task3_flag = false;
+ try
+ {
+ task_region([&](task_region_handle& trh)
+ {
+ parent_flag = true;
+ trh.run([&]()
+ {
+ task1_flag = true;
+ std::cout << "task1: " << s << std::endl;
+ });
+ trh.run([&]()
+ {
+ task2_flag = true;
+ std::cout << "task2" << std::endl;
+ task_region([&](task_region_handle& trh)
+ {
+ trh.run([&]()
+ {
+ task21_flag = true;
+ std::cout << "task2.1" << std::endl;
+ throw 21;
+ });
+ });
+ });
+ int i = 0, j = 10, k = 20;
+ trh.run([=, &task3_flag]()
+ {
+ task3_flag = true;
+ std::cout << "task3: " << i << " " << j << " " << k << std::endl;
+ });
+ std::cout << "parent" << std::endl;
+ });
+ }
+ catch (exception_list const& el)
+ {
+ BOOST_TEST(el.size() == 1u);
+ for (boost::exception_ptr const& e: el)
+ {
+ try {
+ boost::rethrow_exception(e);
+ }
+ catch (int i) // this doesn't works yet
+ {
+ BOOST_TEST_EQ(i, 21);
+ }
+ catch (boost::exception&)
+ {
+ BOOST_TEST(true);
+ }
+ catch (...)
+ {
+ BOOST_TEST(false);
+ }
+ }
+ }
+ catch (...)
+ {
+ BOOST_TEST(false);
+ }
+ BOOST_TEST(parent_flag);
+ BOOST_TEST(task1_flag);
+ BOOST_TEST(task2_flag);
+ BOOST_TEST(task21_flag);
+}
+
+
+int main()
+{
+ run_no_exception();
+ run_no_exception_wait();
+ run_exception();
+ run_exception_1();
+ run_nested_exception();
+ return boost::report_errors();
+}
+#else
+int main()
+{
+ return boost::report_errors();
+}
+#endif