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 <exception>
19 #include <string>
20 #include <iostream>
21 
22 #if defined BOOST_THREAD_PROVIDES_FUTURE_CONTINUATION
23 
p1_ex()24 int p1_ex()
25 {
26   BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG;
27   throw std::logic_error("kk");
28 }
29 
p1()30 int p1()
31 {
32   BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG;
33   return 1;;
34 }
35 
main()36 int main()
37 {
38   const int number_of_tests = 200;
39   BOOST_THREAD_LOG << "<MAIN" << BOOST_THREAD_END_LOG;
40 
41   {
42     for (int i=0; i< number_of_tests; i++)
43     try
44     {
45       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
46       boost::future<int> f1 = boost::async(boost::launch::async, &p1);
47       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
48       f1.wait();
49       BOOST_ASSERT(f1.get()==1);
50       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
51     }
52     catch (std::exception& ex)
53     {
54       std::cout << __FILE__ << "["<< __LINE__<<"] " << "ERRORRRRR "<<ex.what() << "" << std::endl;
55       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
56       return 1;
57     }
58     catch (...)
59     {
60       std::cout << __FILE__ << "["<< __LINE__<<"] " << " ERRORRRRR exception thrown" << std::endl;
61       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
62       return 2;
63     }
64   }
65 
66   {
67     for (int i=0; i< number_of_tests; i++)
68     try
69     {
70       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
71       boost::future<int> f1 = boost::async(&p1);
72       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
73       boost::future<int> f2 = f1.fallback_to(-1);
74       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
75       f2.wait();
76       //std::cout << __FILE__ << "["<< __LINE__<<"] " << std::endl;
77       BOOST_ASSERT(f2.get()==1);
78       //std::cout << __FILE__ << "["<< __LINE__<<"] " << std::endl;
79       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
80     }
81     catch (std::exception& ex)
82     {
83       std::cout << __FILE__ << "["<< __LINE__<<"] " << "ERRORRRRR "<<ex.what() << "" << std::endl;
84       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
85       return 1;
86     }
87     catch (...)
88     {
89       std::cout << __FILE__ << "["<< __LINE__<<"] " << " ERRORRRRR exception thrown" << std::endl;
90       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
91       return 2;
92     }
93   }
94 
95   {
96     for (int i=0; i< number_of_tests; i++)
97     try
98     {
99       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
100       boost::future<int> f1 = boost::async(boost::launch::async, &p1_ex);
101       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
102       f1.wait();
103       BOOST_ASSERT(f1.get_or(-1)==-1);
104       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
105     }
106     catch (std::exception& ex)
107     {
108       std::cout << __FILE__ << "["<< __LINE__<<"] " << "ERRORRRRR "<<ex.what() << "" << std::endl;
109       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
110       return 1;
111     }
112     catch (...)
113     {
114       std::cout << __FILE__ << "["<< __LINE__<<"] " << " ERRORRRRR exception thrown" << std::endl;
115       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
116       return 2;
117     }
118   }
119 
120   {
121     for (int i=0; i< number_of_tests; i++)
122     try
123     {
124       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
125       boost::future<int> f1 = boost::async(boost::launch::async, &p1_ex);
126       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
127       boost::future<int> f2 = f1.fallback_to(-1);
128       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
129       f2.wait();
130       //std::cout << __FILE__ << "["<< __LINE__<<"] " << std::endl;
131       BOOST_ASSERT(f2.get()==-1);
132       //std::cout << __FILE__ << "["<< __LINE__<<"] " << std::endl;
133       BOOST_THREAD_LOG << "" << BOOST_THREAD_END_LOG;
134     }
135     catch (std::exception& ex)
136     {
137       std::cout << __FILE__ << "["<< __LINE__<<"] " << "ERRORRRRR "<<ex.what() << "" << std::endl;
138       BOOST_THREAD_LOG << "ERRORRRRR "<<ex.what() << "" << BOOST_THREAD_END_LOG;
139       return 1;
140     }
141     catch (...)
142     {
143       std::cout << __FILE__ << "["<< __LINE__<<"] " << " ERRORRRRR exception thrown" << std::endl;
144       BOOST_THREAD_LOG << " ERRORRRRR exception thrown" << BOOST_THREAD_END_LOG;
145       return 2;
146     }
147   }
148   BOOST_THREAD_LOG << "MAIN>" << BOOST_THREAD_END_LOG;
149   return 0;
150 }
151 #else
152 
main()153 int main()
154 {
155   return 0;
156 }
157 #endif
158