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) 2013 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>
19 // template <class Rep, class Period>
22 //#define BOOST_THREAD_VERSION 3
23 #define BOOST_THREAD_VERSION 4
24 //#define BOOST_THREAD_USES_LOG
25 #define BOOST_THREAD_USES_LOG_THREAD_ID
26 #include <boost/thread/detail/log.hpp>
28 #include <boost/thread/future.hpp>
29 #include <boost/thread/thread.hpp>
30 #include <boost/chrono/chrono_io.hpp>
31 #include <boost/detail/lightweight_test.hpp>
33 #if defined BOOST_THREAD_USES_CHRONO
35 typedef boost::chrono::milliseconds ms;
39 template <typename OStream>
40 OStream& operator<<(OStream& os , boost::future_status st )
42 os << underlying_cast<int>(st) << " ";
57 exception_ptr make_exception_ptr(T v)
59 return copy_exception(wrap<T> (v));
63 void func1(boost::promise<int> p)
65 boost::this_thread::sleep_for(ms(500));
71 void func3(boost::promise<int&> p)
73 boost::this_thread::sleep_for(ms(500));
78 void func5(boost::promise<void> p)
80 boost::this_thread::sleep_for(ms(500));
86 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
88 typedef boost::chrono::high_resolution_clock Clock;
92 boost::future<T> f = p.get_future();
93 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
94 boost::thread(func1, boost::move(p)).detach();
96 func1(boost::move(p));
98 BOOST_TEST(f.valid());
100 BOOST_TEST(f.valid());
101 Clock::time_point t0 = Clock::now();
103 Clock::time_point t1 = Clock::now();
104 BOOST_TEST(f.valid());
105 BOOST_TEST(t1 - t0 < ms(50));
110 boost::future<T> f = p.get_future();
111 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
112 boost::thread(func3, boost::move(p)).detach();
114 func3(boost::move(p));
116 BOOST_TEST(f.valid());
118 BOOST_TEST(f.valid());
119 Clock::time_point t0 = Clock::now();
121 Clock::time_point t1 = Clock::now();
122 BOOST_TEST(f.valid());
123 BOOST_TEST(t1 - t0 < ms(50));
128 boost::future<T> f = p.get_future();
129 #if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
130 boost::thread(func5, boost::move(p)).detach();
132 func5(boost::move(p));
134 BOOST_TEST(f.valid());
136 BOOST_TEST(f.valid());
137 Clock::time_point t0 = Clock::now();
139 Clock::time_point t1 = Clock::now();
140 BOOST_TEST(f.valid());
141 BOOST_TEST(t1 - t0 < ms(50));
144 BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
146 return boost::report_errors();
150 #error "Test not applicable: BOOST_THREAD_USES_CHRONO not defined for this platform as not supported"