1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Copyright (C) 2011 Vicente J. Botet Escriba
12 // Distributed under the Boost Software License, Version 1.0. (See accompanying
13 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
15 // <boost/thread/future.hpp>
17 // template <class F, class... Args>
18 // future<typename result_of<F(Args...)>::type>
19 // async(F&& f, Args&&... args);
21 // template <class F, class... Args>
22 // future<typename result_of<F(Args...)>::type>
23 // async(launch policy, F&& f, Args&&... args);
25 //#define BOOST_THREAD_VERSION 3
26 #define BOOST_THREAD_VERSION 4
27 #include <boost/config.hpp>
28 #if ! defined BOOST_NO_CXX11_DECLTYPE
29 #define BOOST_RESULT_OF_USE_DECLTYPE
32 #include <boost/thread/future.hpp>
33 #include <boost/thread/thread.hpp>
34 #include <boost/thread/detail/memory.hpp>
35 #include <boost/thread/csbl/memory/unique_ptr.hpp>
37 #include <boost/detail/lightweight_test.hpp>
39 typedef boost::chrono::high_resolution_clock Clock;
40 typedef boost::chrono::milliseconds ms;
47 typedef long result_type;
56 boost::this_thread::sleep_for(ms(200));
59 long operator()() const
61 boost::this_thread::sleep_for(ms(200));
69 typedef int result_type;
73 BOOST_THREAD_MOVABLE_ONLY(MoveOnly)
78 MoveOnly( BOOST_THREAD_RV_REF(MoveOnly))
82 MoveOnly& operator=(BOOST_THREAD_RV_REF(MoveOnly))
90 boost::this_thread::sleep_for(ms(200));
93 template <typename OS>
94 friend OS& operator<<(OS& os, MoveOnly const& v)
103 BOOST_THREAD_DCL_MOVABLE (MoveOnly)
108 boost::this_thread::sleep_for(ms(200));
116 boost::this_thread::sleep_for(ms(200));
122 boost::this_thread::sleep_for(ms(200));
125 boost::csbl::unique_ptr<int> f3_0()
127 boost::this_thread::sleep_for(ms(200));
128 boost::csbl::unique_ptr<int> r( (new int(3)));
129 return boost::move(r);
133 boost::this_thread::sleep_for(ms(200));
135 return boost::move(r);
138 boost::csbl::unique_ptr<int> f3(int i)
140 boost::this_thread::sleep_for(ms(200));
141 return boost::csbl::unique_ptr<int>(new int(i));
144 boost::csbl::unique_ptr<int> f4(
145 BOOST_THREAD_RV_REF_BEG boost::csbl::unique_ptr<int> BOOST_THREAD_RV_REF_END p
148 boost::this_thread::sleep_for(ms(200));
149 return boost::move(p);
153 boost::chrono::nanoseconds delay;
154 Clock::time_point start;
155 check_timer(boost::chrono::nanoseconds delay)
157 , start(Clock::now())
161 Clock::time_point now = Clock::now();
162 BOOST_TEST(now - start < delay);
163 std::cout << __FILE__ << "[" << __LINE__ << "] " << (now - start).count() << std::endl;
170 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
174 boost::future<int> f = boost::async(f0);
175 boost::this_thread::sleep_for(ms(300));
178 check_timer timer(ms(500));
181 BOOST_TEST(res == 3);
183 catch (std::exception& ex)
185 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
186 BOOST_TEST(false && "exception thrown");
190 BOOST_TEST(false && "exception thrown");
194 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
198 boost::shared_future<int> f = boost::async(f0).share();
199 boost::this_thread::sleep_for(ms(300));
202 check_timer timer(ms(500));
205 BOOST_TEST(res == 3);
207 catch (std::exception& ex)
209 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
210 BOOST_TEST(false && "exception thrown");
214 BOOST_TEST(false && "exception thrown");
218 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
222 boost::future<int> f = boost::async(boost::launch::async, f0);
223 boost::this_thread::sleep_for(ms(300));
226 check_timer timer(ms(500));
229 BOOST_TEST(res == 3);
231 catch (std::exception& ex)
233 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
234 BOOST_TEST(false && "exception thrown");
238 BOOST_TEST(false && "exception thrown");
242 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
246 boost::future<long> f = boost::async(boost::launch::async, A(3));
247 boost::this_thread::sleep_for(ms(300));
250 check_timer timer(ms(500));
253 BOOST_TEST(res == 3);
255 catch (std::exception& ex)
257 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
258 BOOST_TEST(false && "exception thrown");
262 BOOST_TEST(false && "exception thrown");
266 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
267 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
271 boost::future<long> f = boost::async(boost::launch::deferred, A(3));
272 //boost::this_thread::sleep_for(ms(300));
275 check_timer timer(ms(500));
278 BOOST_TEST(res == 3);
280 catch (std::exception& ex)
282 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
283 BOOST_TEST(false && "exception thrown");
287 BOOST_TEST(false && "exception thrown");
292 #if defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
293 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
298 boost::future<long> f = boost::async(boost::launch::async, &A::doit, &a);
299 boost::this_thread::sleep_for(ms(300));
302 check_timer timer(ms(500));
305 BOOST_TEST(res == 3);
307 catch (std::exception& ex)
309 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
310 BOOST_TEST(false && "exception thrown");
314 BOOST_TEST(false && "exception thrown");
318 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
323 boost::future<long> f = boost::async(boost::launch::deferred, &A::doit, &a);
324 boost::this_thread::sleep_for(ms(300));
327 check_timer timer(ms(500));
330 BOOST_TEST(res == 3);
332 catch (std::exception& ex)
334 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
335 BOOST_TEST(false && "exception thrown");
339 BOOST_TEST(false && "exception thrown");
344 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
348 boost::future<int> f = boost::async(boost::launch::async, BOOST_THREAD_MAKE_RV_REF(MoveOnly()));
349 boost::this_thread::sleep_for(ms(300));
352 check_timer timer(ms(500));
355 BOOST_TEST(res == 3);
357 catch (std::exception& ex)
359 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
360 BOOST_TEST(false && "exception thrown");
364 BOOST_TEST(false && "exception thrown");
367 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
368 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
372 boost::future<int> f = boost::async(boost::launch::deferred, BOOST_THREAD_MAKE_RV_REF(MoveOnly()));
373 boost::this_thread::sleep_for(ms(300));
376 check_timer timer(ms(500));
379 BOOST_TEST(res == 3);
381 catch (std::exception& ex)
383 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
384 BOOST_TEST(false && "exception thrown");
388 BOOST_TEST(false && "exception thrown");
392 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
396 boost::future<int> f = boost::async(boost::launch::any, f0);
397 boost::this_thread::sleep_for(ms(300));
400 check_timer timer(ms(500));
403 BOOST_TEST(res == 3);
405 catch (std::exception& ex)
407 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
408 BOOST_TEST(false && "exception thrown");
412 BOOST_TEST(false && "exception thrown");
415 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
416 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
420 boost::future<int> f = boost::async(boost::launch::deferred, f0);
421 //boost::this_thread::sleep_for(ms(300));
424 check_timer timer(ms(500));
427 BOOST_TEST(res == 3);
429 catch (std::exception& ex)
431 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
432 BOOST_TEST(false && "exception thrown");
436 BOOST_TEST(false && "exception thrown");
440 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
444 boost::future<int&> f = boost::async(f1);
445 boost::this_thread::sleep_for(ms(300));
448 check_timer timer(ms(500));
451 BOOST_TEST(res == &i);
453 catch (std::exception& ex)
455 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
456 BOOST_TEST(false && "exception thrown");
460 BOOST_TEST(false && "exception thrown");
463 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
467 boost::future<int&> f = boost::async(boost::launch::async, f1);
468 boost::this_thread::sleep_for(ms(300));
471 check_timer timer(ms(500));
474 BOOST_TEST(res == &i);
476 catch (std::exception& ex)
478 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
479 BOOST_TEST(false && "exception thrown");
483 BOOST_TEST(false && "exception thrown");
486 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
490 boost::future<int&> f = boost::async(boost::launch::any, f1);
491 boost::this_thread::sleep_for(ms(300));
494 check_timer timer(ms(500));
497 BOOST_TEST(res == &i);
499 catch (std::exception& ex)
501 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
502 BOOST_TEST(false && "exception thrown");
506 BOOST_TEST(false && "exception thrown");
509 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
510 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
514 boost::future<int&> f = boost::async(boost::launch::deferred, f1);
515 //boost::this_thread::sleep_for(ms(300));
518 check_timer timer(ms(500));
521 BOOST_TEST(res == &i);
523 catch (std::exception& ex)
525 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
526 BOOST_TEST(false && "exception thrown");
530 BOOST_TEST(false && "exception thrown");
534 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
538 boost::future<void> f = boost::async(f2);
539 boost::this_thread::sleep_for(ms(300));
541 check_timer timer(ms(500));
545 catch (std::exception& ex)
547 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
548 BOOST_TEST(false && "exception thrown");
552 BOOST_TEST(false && "exception thrown");
555 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
559 boost::future<void> f = boost::async(boost::launch::async, f2);
560 boost::this_thread::sleep_for(ms(300));
562 check_timer timer(ms(500));
566 catch (std::exception& ex)
568 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
569 BOOST_TEST(false && "exception thrown");
573 BOOST_TEST(false && "exception thrown");
576 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
580 boost::future<void> f = boost::async(boost::launch::any, f2);
581 boost::this_thread::sleep_for(ms(300));
583 check_timer timer(ms(500));
587 catch (std::exception& ex)
589 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
590 BOOST_TEST(false && "exception thrown");
594 BOOST_TEST(false && "exception thrown");
597 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
598 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
602 boost::future<void> f = boost::async(boost::launch::deferred, f2);
603 //boost::this_thread::sleep_for(ms(300));
605 check_timer timer(ms(500));
609 catch (std::exception& ex)
611 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
612 BOOST_TEST(false && "exception thrown");
616 BOOST_TEST(false && "exception thrown");
621 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
625 boost::future<MoveOnly> f = boost::async(&f3_1);
626 boost::this_thread::sleep_for(ms(300));
629 check_timer timer(ms(500));
632 BOOST_TEST_EQ(res.value, 2);
634 catch (std::exception& ex)
636 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
637 BOOST_TEST(false && "exception thrown");
641 BOOST_TEST(false && "exception thrown");
644 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
645 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
649 boost::future<MoveOnly> f = boost::async(boost::launch::deferred, &f3_1);
650 //boost::this_thread::sleep_for(ms(300));
653 check_timer timer(ms(500));
656 BOOST_TEST_EQ(res.value, 2);
658 catch (std::exception& ex)
660 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
661 BOOST_TEST(false && "exception thrown");
665 BOOST_TEST(false && "exception thrown");
669 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
673 boost::future<MoveOnly> f;
674 f = boost::async(&f3_1);
675 boost::this_thread::sleep_for(ms(300));
678 check_timer timer(ms(500));
681 BOOST_TEST(res.value == 2);
683 catch (std::exception& ex)
685 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
686 BOOST_TEST(false && "exception thrown");
690 BOOST_TEST(false && "exception thrown");
693 std::cout << __FILE__ << "[" << __LINE__ << "]" << std::endl;
697 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(&f3_0);
698 boost::this_thread::sleep_for(ms(300));
699 boost::csbl::unique_ptr<int> res;
701 check_timer timer(ms(500));
704 BOOST_TEST(*res == 3);
706 catch (std::exception& ex)
708 std::cout << __FILE__ << "[" << __LINE__ << "]" << ex.what() << std::endl;
709 BOOST_TEST(false && "exception thrown");
713 BOOST_TEST(false && "exception thrown");
717 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
718 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
722 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(boost::launch::async, &f3, 3);
723 boost::this_thread::sleep_for(ms(300));
724 boost::csbl::unique_ptr<int> res;
726 check_timer timer(ms(500));
729 BOOST_TEST(*res == 3);
731 catch (std::exception& ex)
733 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
734 BOOST_TEST(false && "exception thrown");
738 BOOST_TEST(false && "exception thrown");
741 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
745 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(boost::launch::deferred, &f3, 3);
746 //boost::this_thread::sleep_for(ms(300));
747 boost::csbl::unique_ptr<int> res;
749 check_timer timer(ms(500));
752 BOOST_TEST(*res == 3);
754 catch (std::exception& ex)
756 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
757 BOOST_TEST(false && "exception thrown");
761 BOOST_TEST(false && "exception thrown");
764 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
768 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(&f3, 3);
769 boost::this_thread::sleep_for(ms(300));
770 boost::csbl::unique_ptr<int> res;
772 check_timer timer(ms(500));
775 BOOST_TEST(*res == 3);
777 catch (std::exception& ex)
779 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
780 BOOST_TEST(false && "exception thrown");
784 BOOST_TEST(false && "exception thrown");
789 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
790 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
794 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(boost::launch::async, &f4, boost::csbl::unique_ptr<int>(new int(3)));
795 boost::this_thread::sleep_for(ms(300));
796 boost::csbl::unique_ptr<int> res;
798 check_timer timer(ms(500));
801 BOOST_TEST(*res == 3);
803 catch (std::exception& ex)
805 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
806 BOOST_TEST(false && "exception thrown");
810 BOOST_TEST(false && "exception thrown");
813 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
817 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(boost::launch::deferred, &f4, boost::csbl::unique_ptr<int>(new int(3)));
818 //boost::this_thread::sleep_for(ms(300));
819 boost::csbl::unique_ptr<int> res;
821 check_timer timer(ms(500));
824 BOOST_TEST(*res == 3);
826 catch (std::exception& ex)
828 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
829 BOOST_TEST(false && "exception thrown");
833 BOOST_TEST(false && "exception thrown");
836 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<std::endl;
840 boost::future<boost::csbl::unique_ptr<int> > f = boost::async(&f4, boost::csbl::unique_ptr<int>(new int(3)));
841 boost::this_thread::sleep_for(ms(300));
842 boost::csbl::unique_ptr<int> res;
844 check_timer timer(ms(500));
847 BOOST_TEST(*res == 3);
849 catch (std::exception& ex)
851 std::cout << __FILE__ <<"["<<__LINE__<<"]"<<ex.what() << std::endl;
852 BOOST_TEST(false && "exception thrown");
856 BOOST_TEST(false && "exception thrown");
860 return boost::report_errors();