1 // Copyright (C) 2012-2013 Vicente Botet
2 //
3 //  Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #include <boost/config.hpp>
7 #if ! defined  BOOST_NO_CXX11_DECLTYPE
8 #define BOOST_RESULT_OF_USE_DECLTYPE
9 #endif
10 
11 #define BOOST_THREAD_VERSION 4
12 //#define BOOST_THREAD_USES_LOG
13 #define BOOST_THREAD_USES_LOG_THREAD_ID
14 
15 #include <boost/thread/detail/log.hpp>
16 #include <boost/thread/future.hpp>
17 #include <boost/assert.hpp>
18 #include <string>
19 #include <iostream>
20 
21 #if defined BOOST_THREAD_PROVIDES_FUTURE_UNWRAP
22 
23 #ifdef BOOST_MSVC
24 #pragma warning(disable: 4127) // conditional expression is constant
25 #endif
26 
p1()27 int p1()
28 {
29   BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG;
30   return 123;
31 }
32 
p2()33 boost::future<int> p2()
34 {
35   BOOST_THREAD_LOG << "<P2" << BOOST_THREAD_END_LOG;
36   boost::future<int> f1 = boost::async(boost::launch::async, &p1);
37   BOOST_THREAD_LOG << "P2>" << BOOST_THREAD_END_LOG;
38   return boost::move(f1);
39 }
40 
main()41 int main()
42 {
43   const int number_of_tests = 100;
44   BOOST_THREAD_LOG << "<MAIN" << BOOST_THREAD_END_LOG;
45   for (int i=0; i< number_of_tests; i++)
46   try
47   {
48 
49 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
50     {
51       boost::future<int> inner_future = boost::async(boost::launch::async, &p2).unwrap();
52       inner_future.wait();
53       int ii = inner_future.get();
54       BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
55     }
56 #endif
57     {
58       boost::future<boost::future<int> > outer_future = boost::async(boost::launch::async, &p2);
59       boost::future<int> inner_future = outer_future.unwrap();
60       inner_future.wait();
61       int ii = inner_future.get();
62       BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
63     }
64     {
65       boost::future<boost::future<int> > outer_future = boost::async(boost::launch::async, &p2);
66       boost::future<int> inner_future = outer_future.unwrap();
67       int ii = inner_future.get();
68       BOOST_THREAD_LOG << "ii= "<< ii << "" << BOOST_THREAD_END_LOG;
69     }
70   }
71   catch (std::exception& ex)
72   {
73     std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
74     BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
75     return 1;
76   }
77   catch (...)
78   {
79     std::cout << " ERRORRRRR exception thrown" << std::endl;
80     BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
81     return 2;
82   }
83   BOOST_THREAD_LOG << "MAIN>" << BOOST_THREAD_END_LOG;
84   return 0;
85 }
86 #else
87 
main()88 int main()
89 {
90   return 0;
91 }
92 #endif
93