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 
12 #define BOOST_THREAD_VERSION 4
13 //#define BOOST_THREAD_USES_LOG
14 #define BOOST_THREAD_USES_LOG_THREAD_ID
15 
16 #include <boost/thread/detail/log.hpp>
17 #include <boost/thread/future.hpp>
18 #include <boost/assert.hpp>
19 #include <string>
20 #include <iostream>
21 #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
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(boost::future<int> f)33 int p2(boost::future<int> f)
34 {
35   BOOST_THREAD_LOG << "P2<" << BOOST_THREAD_END_LOG;
36   try
37   {
38     return 2 * f.get();
39   }
40   catch (std::exception& ex)
41   {
42     std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
43     BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
44     BOOST_ASSERT(false);
45   }
46   catch (...)
47   {
48     BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
49     BOOST_ASSERT(false);
50   }
51   BOOST_THREAD_LOG << "P2>" << BOOST_THREAD_END_LOG;
52   return 0;
53 }
p2s(boost::shared_future<int> f)54 int p2s(boost::shared_future<int> f)
55 {
56   BOOST_THREAD_LOG << "<P2S" << BOOST_THREAD_END_LOG;
57   try
58   {
59     return 2 * f.get();
60   }
61   catch (std::exception& ex)
62   {
63     std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
64     BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
65     BOOST_ASSERT(false);
66   }
67   catch (...)
68   {
69     BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
70     BOOST_ASSERT(false);
71   }
72   BOOST_THREAD_LOG << "P2S>" << BOOST_THREAD_END_LOG;
73   return 0;
74 }
75 
main()76 int main()
77 {
78   const int number_of_tests = 100;
79   BOOST_THREAD_LOG << "<MAIN" << BOOST_THREAD_END_LOG;
80   {
81     for (int i=0; i< number_of_tests; i++)
82     try
83     {
84       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
85       boost::future<int> f1 = boost::async(&p1);
86       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
87       boost::future<int> f2 = f1.then(&p2);
88       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
89       (void)f2.get();
90       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
91     }
92     catch (std::exception& ex)
93     {
94       std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
95       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
96       return 1;
97     }
98     catch (...)
99     {
100       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
101       return 2;
102     }
103   }
104   {
105     for (int i=0; i< number_of_tests; i++)
106     try
107     {
108       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
109       boost::shared_future<int> f1 = boost::async(&p1).share();
110       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
111       boost::future<int> f2 = f1.then(&p2s);
112       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
113       (void)f2.get();
114       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
115     }
116     catch (std::exception& ex)
117     {
118       std::cout << "ERRORRRRR "<<ex.what() << "" << std::endl;
119       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
120       return 1;
121     }
122     catch (...)
123     {
124       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
125       return 2;
126     }
127   }
128   BOOST_THREAD_LOG << "MAIN>" << BOOST_THREAD_END_LOG;
129   return 0;
130 }
131 #else
132 
main()133 int main()
134 {
135   return 0;
136 }
137 #endif
138