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()24int p1_ex() 25 { 26 BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG; 27 throw std::logic_error("kk"); 28 } 29 p1()30int p1() 31 { 32 BOOST_THREAD_LOG << "P1" << BOOST_THREAD_END_LOG; 33 return 1;; 34 } 35 main()36int 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()153int main() 154 { 155 return 0; 156 } 157 #endif 158