Skip to content

Commit 07a5316

Browse files
committed
Avoid relying on timeouts in when_all/when_any tests.
Use thread barriers to synchronize between the main and async threads instead of relying on timeouts. This should make these tests more reliable in CI.
1 parent 67195c3 commit 07a5316

4 files changed

Lines changed: 113 additions & 89 deletions

File tree

test/sync/futures/when_all/iterators_pass.cpp

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -332,28 +332,28 @@ int main()
332332
}
333333
#endif
334334
#if ! defined BOOST_NO_CXX11_LAMBDAS
335-
{ // async futures copy-constructible then()
336-
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
337-
BOOST_TEST(f1.valid());
338-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
339-
BOOST_TEST(f2.valid());
340-
boost::csbl::vector<boost::future<int> > v;
341-
v.push_back(boost::move(f1));
342-
v.push_back(boost::move(f2));
343-
BOOST_TEST(v[0].valid());
344-
BOOST_TEST(v[1].valid());
345-
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(v.begin(), v.end());
346-
BOOST_TEST(! v[0].valid());
347-
BOOST_TEST(! v[1].valid());
348-
BOOST_TEST(all.valid());
349-
boost::future<int> sum = all.then([](boost::future<boost::csbl::vector<boost::future<int> > > f)
350-
{
351-
boost::csbl::vector<boost::future<int> > v = f.get();
352-
return v[0].get() + v[1].get();
353-
});
354-
BOOST_TEST(sum.valid());
355-
BOOST_TEST(sum.get() == 444);
356-
}
335+
{ // async futures copy-constructible then()
336+
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
337+
BOOST_TEST(f1.valid());
338+
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
339+
BOOST_TEST(f2.valid());
340+
boost::csbl::vector<boost::future<int> > v;
341+
v.push_back(boost::move(f1));
342+
v.push_back(boost::move(f2));
343+
BOOST_TEST(v[0].valid());
344+
BOOST_TEST(v[1].valid());
345+
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_all(v.begin(), v.end());
346+
BOOST_TEST(! v[0].valid());
347+
BOOST_TEST(! v[1].valid());
348+
BOOST_TEST(all.valid());
349+
boost::future<int> sum = all.then([](boost::future<boost::csbl::vector<boost::future<int> > > f)
350+
{
351+
boost::csbl::vector<boost::future<int> > v = f.get();
352+
return v[0].get() + v[1].get();
353+
});
354+
BOOST_TEST(sum.valid());
355+
BOOST_TEST(sum.get() == 444);
356+
}
357357
#endif
358358
#endif
359359

test/sync/futures/when_all/variadic_pass.cpp

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,16 @@
3636

3737
int p1()
3838
{
39-
boost::this_thread::sleep_for(boost::chrono::milliseconds(100));
4039
return 123;
4140
}
4241

4342
int thr()
4443
{
4544
throw std::logic_error("123");
4645
}
46+
4747
int p2()
4848
{
49-
boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
5049
return 321;
5150
}
5251

@@ -275,23 +274,23 @@ int main()
275274
}
276275
#endif
277276
#if ! defined BOOST_NO_CXX11_LAMBDAS
278-
{ // async futures copy-constructible then()
279-
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
280-
BOOST_TEST(f1.valid());
281-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
282-
BOOST_TEST(f2.valid());
283-
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
284-
BOOST_TEST(! f1.valid());
285-
BOOST_TEST(! f2.valid());
286-
BOOST_TEST(all.valid());
287-
boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
288-
{
289-
boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
290-
return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
291-
});
292-
BOOST_TEST(sum.valid());
293-
BOOST_TEST(sum.get() == 444);
294-
}
277+
{ // async futures copy-constructible then()
278+
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
279+
BOOST_TEST(f1.valid());
280+
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
281+
BOOST_TEST(f2.valid());
282+
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_all(boost::move(f1), boost::move(f2));
283+
BOOST_TEST(! f1.valid());
284+
BOOST_TEST(! f2.valid());
285+
BOOST_TEST(all.valid());
286+
boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
287+
{
288+
boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
289+
return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
290+
});
291+
BOOST_TEST(sum.valid());
292+
BOOST_TEST(sum.get() == 444);
293+
}
295294
#endif
296295
#endif
297296

test/sync/futures/when_any/iterators_pass.cpp

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#define BOOST_THREAD_VERSION 4
2929

3030
#include <boost/thread/future.hpp>
31+
#include <boost/thread/barrier.hpp>
3132
#include <boost/core/lightweight_test.hpp>
3233
#include <stdexcept>
3334

@@ -44,9 +45,16 @@ int thr()
4445
{
4546
throw std::logic_error("123");
4647
}
48+
4749
int p2()
4850
{
49-
boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
51+
return 321;
52+
}
53+
54+
int p3(boost::barrier* bar = nullptr)
55+
{
56+
if (bar)
57+
bar->count_down_and_wait();
5058
return 321;
5159
}
5260

@@ -217,9 +225,10 @@ int main()
217225
BOOST_TEST(res[1].get() == 321);
218226
}
219227
{ // async future copy-constructible
228+
boost::barrier bar(2u);
220229
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
221230
BOOST_TEST(f1.valid());
222-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
231+
boost::future<int> f2 = boost::async(boost::launch::async, &p3, &bar);
223232
BOOST_TEST(f2.valid());
224233
boost::csbl::vector<boost::future<int> > v;
225234
v.push_back(boost::move(f1));
@@ -236,12 +245,14 @@ int main()
236245
BOOST_TEST(res[0].get() == 123);
237246
BOOST_TEST(res[1].valid());
238247
BOOST_TEST(! res[1].is_ready());
248+
bar.count_down_and_wait();
239249
BOOST_TEST(res[1].get() == 321);
240250
}
241251
{ // async shared_future copy-constructible
252+
boost::barrier bar(2u);
242253
boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
243254
BOOST_TEST(f1.valid());
244-
boost::shared_future<int> f2 = boost::async(boost::launch::async, &p2).share();
255+
boost::shared_future<int> f2 = boost::async(boost::launch::async, &p3, &bar).share();
245256
BOOST_TEST(f2.valid());
246257
boost::csbl::vector<boost::shared_future<int> > v;
247258
v.push_back(f1);
@@ -260,6 +271,7 @@ int main()
260271
BOOST_TEST(res[0].get() == 123);
261272
BOOST_TEST(res[1].valid());
262273
BOOST_TEST(! res[1].is_ready());
274+
bar.count_down_and_wait();
263275
BOOST_TEST(res[1].get() == 321);
264276
}
265277
{ // async future copy-constructible
@@ -333,31 +345,30 @@ int main()
333345
}
334346
#endif
335347
#if ! defined BOOST_NO_CXX11_LAMBDAS
336-
{ // async futures copy-constructible then()
337-
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
338-
BOOST_TEST(f1.valid());
339-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
340-
BOOST_TEST(f2.valid());
341-
boost::csbl::vector<boost::future<int> > v;
342-
v.push_back(boost::move(f1));
343-
v.push_back(boost::move(f2));
344-
BOOST_TEST(v[0].valid());
345-
BOOST_TEST(v[1].valid());
346-
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(v.begin(), v.end());
347-
BOOST_TEST(! v[0].valid());
348-
BOOST_TEST(! v[1].valid());
349-
BOOST_TEST(all.valid());
350-
boost::future<int> sum = all.then([](boost::future<boost::csbl::vector<boost::future<int> > > f)
351-
{
352-
boost::csbl::vector<boost::future<int> > v = f.get();
353-
return v[0].get() + v[1].get();
354-
});
355-
BOOST_TEST(sum.valid());
356-
BOOST_TEST(sum.get() == 444);
357-
}
348+
{ // async futures copy-constructible then()
349+
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
350+
BOOST_TEST(f1.valid());
351+
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
352+
BOOST_TEST(f2.valid());
353+
boost::csbl::vector<boost::future<int> > v;
354+
v.push_back(boost::move(f1));
355+
v.push_back(boost::move(f2));
356+
BOOST_TEST(v[0].valid());
357+
BOOST_TEST(v[1].valid());
358+
boost::future<boost::csbl::vector<boost::future<int> > > all = boost::when_any(v.begin(), v.end());
359+
BOOST_TEST(! v[0].valid());
360+
BOOST_TEST(! v[1].valid());
361+
BOOST_TEST(all.valid());
362+
boost::future<int> sum = all.then([](boost::future<boost::csbl::vector<boost::future<int> > > f)
363+
{
364+
boost::csbl::vector<boost::future<int> > v = f.get();
365+
return v[0].get() + v[1].get();
366+
});
367+
BOOST_TEST(sum.valid());
368+
BOOST_TEST(sum.get() == 444);
369+
}
358370
#endif
359371
#endif
360372

361373
return boost::report_errors();
362374
}
363-

test/sync/futures/when_any/variadic_pass.cpp

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define BOOST_THREAD_VERSION 4
2727

2828
#include <boost/thread/future.hpp>
29+
#include <boost/thread/barrier.hpp>
2930
#include <boost/core/lightweight_test.hpp>
3031
#include <stdexcept>
3132

@@ -42,9 +43,16 @@ int thr()
4243
{
4344
throw std::logic_error("123");
4445
}
46+
4547
int p2()
4648
{
47-
boost::this_thread::sleep_for(boost::chrono::milliseconds(200));
49+
return 321;
50+
}
51+
52+
int p3(boost::barrier* bar = nullptr)
53+
{
54+
if (bar)
55+
bar->count_down_and_wait();
4856
return 321;
4957
}
5058

@@ -180,9 +188,10 @@ int main()
180188
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
181189
}
182190
{ // async future copy-constructible
191+
boost::barrier bar(2u);
183192
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
184193
BOOST_TEST(f1.valid());
185-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
194+
boost::future<int> f2 = boost::async(boost::launch::async, &p3, &bar);
186195
BOOST_TEST(f2.valid());
187196
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
188197
BOOST_TEST(! f1.valid());
@@ -192,12 +201,14 @@ int main()
192201
BOOST_TEST(boost::csbl::get<0>(res).valid());
193202
BOOST_TEST(boost::csbl::get<0>(res).is_ready() || boost::csbl::get<1>(res).is_ready());
194203
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
204+
bar.count_down_and_wait();
195205
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
196206
}
197207
{ // async shared_future copy-constructible
208+
boost::barrier bar(2u);
198209
boost::shared_future<int> f1 = boost::async(boost::launch::async, &p1).share();
199210
BOOST_TEST(f1.valid());
200-
boost::shared_future<int> f2 = boost::async(boost::launch::async, &p2).share();
211+
boost::shared_future<int> f2 = boost::async(boost::launch::async, &p3, &bar).share();
201212
BOOST_TEST(f2.valid());
202213
boost::future<boost::csbl::tuple<boost::shared_future<int>,boost::shared_future<int> > > all = boost::when_any(f1, f2);
203214
BOOST_TEST(f1.valid());
@@ -208,6 +219,7 @@ int main()
208219
BOOST_TEST(boost::csbl::get<1>(res).valid());
209220
BOOST_TEST(boost::csbl::get<0>(res).is_ready() || boost::csbl::get<1>(res).is_ready());
210221
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
222+
bar.count_down_and_wait();
211223
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
212224
}
213225
{ // async future copy-constructible
@@ -251,8 +263,9 @@ int main()
251263
}
252264
// fixme darwin-4.8.0_11 terminate called without an active exception
253265
{ // deferred future copy-constructible
266+
boost::barrier bar(2u);
254267
boost::future<int> f1 = boost::async(boost::launch::deferred, &p1);
255-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
268+
boost::future<int> f2 = boost::async(boost::launch::async, &p3, &bar);
256269
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
257270
BOOST_TEST(! f1.valid());
258271
BOOST_TEST(! f2.valid());
@@ -262,7 +275,8 @@ int main()
262275
BOOST_TEST(boost::csbl::get<0>(res).is_ready());
263276
BOOST_TEST(boost::csbl::get<0>(res).get() == 123);
264277
BOOST_TEST(boost::csbl::get<1>(res).valid());
265-
//BOOST_TEST(! boost::csbl::get<1>(res).is_ready());
278+
BOOST_TEST(! boost::csbl::get<1>(res).is_ready());
279+
bar.count_down_and_wait();
266280
BOOST_TEST(boost::csbl::get<1>(res).get() == 321);
267281
}
268282
// fixme darwin-4.8.0_11 terminate called without an active exception
@@ -298,23 +312,23 @@ int main()
298312
}
299313
#endif
300314
#if ! defined BOOST_NO_CXX11_LAMBDAS
301-
{ // async futures copy-constructible then()
302-
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
303-
BOOST_TEST(f1.valid());
304-
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
305-
BOOST_TEST(f2.valid());
306-
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
307-
BOOST_TEST(! f1.valid());
308-
BOOST_TEST(! f2.valid());
309-
BOOST_TEST(all.valid());
310-
boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
311-
{
312-
boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
313-
return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
314-
});
315-
BOOST_TEST(sum.valid());
316-
BOOST_TEST(sum.get() == 444);
317-
}
315+
{ // async futures copy-constructible then()
316+
boost::future<int> f1 = boost::async(boost::launch::async, &p1);
317+
BOOST_TEST(f1.valid());
318+
boost::future<int> f2 = boost::async(boost::launch::async, &p2);
319+
BOOST_TEST(f2.valid());
320+
boost::future<boost::csbl::tuple<boost::future<int>,boost::future<int> > > all = boost::when_any(boost::move(f1), boost::move(f2));
321+
BOOST_TEST(! f1.valid());
322+
BOOST_TEST(! f2.valid());
323+
BOOST_TEST(all.valid());
324+
boost::future<int> sum = all.then([](boost::future<boost::csbl::tuple<boost::future<int>, boost::future<int> > > f)
325+
{
326+
boost::csbl::tuple<boost::future<int>,boost::future<int> > v = f.get();
327+
return boost::csbl::get<0>(v).get()+boost::csbl::get<1>(v).get();
328+
});
329+
BOOST_TEST(sum.valid());
330+
BOOST_TEST(sum.get() == 444);
331+
}
318332
#endif
319333
#endif
320334

0 commit comments

Comments
 (0)