@@ -64,9 +64,11 @@ fn shared_close_sender_does_not_lose_messages_iter() {
64
64
65
65
#[ test]
66
66
fn shared_close_sender_does_not_lose_messages ( ) {
67
- for _ in 0 ..10000 {
68
- shared_close_sender_does_not_lose_messages_iter ( ) ;
69
- }
67
+ with_minimum_timer_resolution ( || {
68
+ for _ in 0 ..10000 {
69
+ shared_close_sender_does_not_lose_messages_iter ( ) ;
70
+ }
71
+ } ) ;
70
72
}
71
73
72
74
@@ -96,17 +98,11 @@ fn concurrent_recv_timeout_and_upgrade_iter() {
96
98
97
99
#[ test]
98
100
fn concurrent_recv_timeout_and_upgrade ( ) {
99
- // FIXME: fix and enable
100
- if true { return }
101
-
102
- // at the moment of writing this test fails like this:
103
- // thread '<unnamed>' panicked at 'assertion failed: `(left == right)`
104
- // left: `4561387584`,
105
- // right: `0`', libstd/sync/mpsc/shared.rs:253:13
106
-
107
- for _ in 0 ..10000 {
108
- concurrent_recv_timeout_and_upgrade_iter ( ) ;
109
- }
101
+ with_minimum_timer_resolution ( || {
102
+ for _ in 0 ..10000 {
103
+ concurrent_recv_timeout_and_upgrade_iter ( ) ;
104
+ }
105
+ } ) ;
110
106
}
111
107
112
108
@@ -159,7 +155,46 @@ fn concurrent_writes_iter() {
159
155
160
156
#[ test]
161
157
fn concurrent_writes ( ) {
162
- for _ in 0 ..100 {
163
- concurrent_writes_iter ( ) ;
158
+ with_minimum_timer_resolution ( || {
159
+ for _ in 0 ..100 {
160
+ concurrent_writes_iter ( ) ;
161
+ }
162
+ } ) ;
163
+ }
164
+
165
+ #[ cfg( windows) ]
166
+ pub mod timeapi {
167
+ #![ allow( non_snake_case) ]
168
+ use std:: ffi:: c_uint;
169
+
170
+ pub const TIMERR_NOERROR : c_uint = 0 ;
171
+
172
+ #[ link( name = "winmm" ) ]
173
+ extern "system" {
174
+ pub fn timeBeginPeriod ( uPeriod : c_uint ) -> c_uint ;
175
+ pub fn timeEndPeriod ( uPeriod : c_uint ) -> c_uint ;
176
+ }
177
+ }
178
+
179
+ /// Window's minimum sleep time can be as much as 16ms.
180
+ // This function evaluates the closure with this resolution
181
+ // set as low as possible.
182
+ ///
183
+ /// This takes the above test's duration from 10000*16/1000/60=2.67 minutes to ~16 seconds.
184
+ fn with_minimum_timer_resolution ( f : impl Fn ( ) ) {
185
+ #[ cfg( windows) ]
186
+ unsafe {
187
+ let ret = timeapi:: timeBeginPeriod ( 1 ) ;
188
+ assert_eq ! ( ret, timeapi:: TIMERR_NOERROR ) ;
189
+
190
+ f ( ) ;
191
+
192
+ let ret = timeapi:: timeEndPeriod ( 1 ) ;
193
+ assert_eq ! ( ret, timeapi:: TIMERR_NOERROR ) ;
194
+ }
195
+
196
+ #[ cfg( not( windows) ) ]
197
+ {
198
+ f ( ) ;
164
199
}
165
200
}
0 commit comments