7
7
#include < chrono>
8
8
#include < condition_variable>
9
9
#include < mutex>
10
+ #include < type_traits>
10
11
11
12
using namespace std ;
13
+ using namespace std ::chrono;
12
14
13
15
namespace {
14
16
class my_mutex { // user-defined mutex type
@@ -31,8 +33,8 @@ namespace {
31
33
int num_lock = 0 ;
32
34
};
33
35
34
- const chrono:: nanoseconds interval{20 };
35
- const chrono:: nanoseconds zero_dur{0 };
36
+ const nanoseconds interval{20 };
37
+ const nanoseconds zero_dur{0 };
36
38
37
39
void test_condition_variable_any () { // test wait functions of condition variables
38
40
condition_variable_any cnd;
@@ -46,15 +48,40 @@ namespace {
46
48
cnd.wait_for (mtx, interval);
47
49
assert (mtx.num_locks () == 3 );
48
50
49
- cnd.wait_until (mtx, chrono:: steady_clock::now ());
51
+ cnd.wait_until (mtx, steady_clock::now ());
50
52
assert (mtx.num_locks () == 4 );
51
53
52
- cnd.wait_until (mtx, chrono:: steady_clock::now () + interval);
54
+ cnd.wait_until (mtx, steady_clock::now () + interval);
53
55
assert (mtx.num_locks () == 5 );
54
56
}
55
57
}
58
+
59
+ void test_condition_variable_any_already_timed_out () {
60
+ using unsigned_duration = duration<make_unsigned_t <system_clock::rep>, system_clock::period>;
61
+ const auto right_now = time_point_cast<unsigned_duration>(system_clock::now ());
62
+ const auto yesterday = right_now - hours{24 };
63
+ assert (yesterday - right_now > system_clock::duration::zero ()); // unsigned overflow
64
+
65
+ my_mutex m;
66
+ condition_variable_any cond;
67
+ unique_lock<my_mutex> guard (m);
68
+
69
+ const auto status = cond.wait_until (m, yesterday);
70
+ assert (status == cv_status::timeout);
71
+ assert (m.num_locks () == 2 );
72
+
73
+ assert (cond.wait_until (m, yesterday, []() { return false ; }) == false );
74
+ assert (m.num_locks () == 3 );
75
+
76
+ #if _HAS_CXX20
77
+ stop_token token;
78
+ assert (cond.wait_until (m, token, yesterday, []() { return false ; }) == false );
79
+ assert (m.num_locks () == 4 );
80
+ #endif // _HAS_CXX20
81
+ }
56
82
} // unnamed namespace
57
83
58
84
int main () {
59
85
test_condition_variable_any ();
86
+ test_condition_variable_any_already_timed_out ();
60
87
}
0 commit comments