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>
21
// wait_for(const chrono::duration<Rep, Period>& rel_time) const;
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 )
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
BOOST_TEST(f.valid());
97
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::timeout);
98
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
100
func1(boost::move(p));
102
BOOST_TEST(f.valid());
103
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::ready);
104
BOOST_TEST(f.valid());
105
Clock::time_point t0 = Clock::now();
107
Clock::time_point t1 = Clock::now();
108
BOOST_TEST(f.valid());
109
BOOST_TEST(t1 - t0 < ms(50));
114
boost::future<T> f = p.get_future();
115
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
116
boost::thread(func3, boost::move(p)).detach();
118
BOOST_TEST(f.valid());
119
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::timeout);
120
BOOST_TEST(f.valid());
121
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
123
func3(boost::move(p));
125
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::ready);
126
BOOST_TEST(f.valid());
127
Clock::time_point t0 = Clock::now();
129
Clock::time_point t1 = Clock::now();
130
BOOST_TEST(f.valid());
131
BOOST_TEST(t1 - t0 < ms(50));
136
boost::future<T> f = p.get_future();
137
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
138
boost::thread(func5, boost::move(p)).detach();
140
BOOST_TEST(f.valid());
141
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::timeout);
142
BOOST_TEST(f.valid());
143
#if defined BOOST_THREAD_PROVIDES_SIGNATURE_PACKAGED_TASK && defined(BOOST_THREAD_PROVIDES_VARIADIC_THREAD)
145
func5(boost::move(p));
147
BOOST_TEST_EQ(f.wait_for(ms(300)) , boost::future_status::ready);
148
BOOST_TEST(f.valid());
149
Clock::time_point t0 = Clock::now();
151
Clock::time_point t1 = Clock::now();
152
BOOST_TEST(f.valid());
153
BOOST_TEST(t1 - t0 < ms(50));
156
BOOST_THREAD_LOG << BOOST_THREAD_END_LOG;
158
return boost::report_errors();
162
#error "Test not applicable: BOOST_THREAD_USES_CHRONO not defined for this platform as not supported"