31
31
32
32
static volatile size_t done , concur ;
33
33
static int use_group_async ;
34
+ static uint32_t activecpu ;
35
+ static int32_t xfail = 0 ;
34
36
35
37
static dispatch_queue_t q ;
36
38
static dispatch_group_t g , gw ;
@@ -92,15 +94,28 @@ test_concur_async(size_t n, size_t qw)
92
94
93
95
dispatch_group_wait (g , DISPATCH_TIME_FOREVER );
94
96
95
- test_long ("concurrently completed workers" , done ,
96
- MIN (n * workers , qw >= n ? qw - n : 0 ));
97
+ if (qw > 1 ) {
98
+ size_t concurrency = MIN (n * workers , qw );
99
+ if (concurrency > done && done >= activecpu ) {
100
+ xfail ++ ;
101
+ } else {
102
+ test_long ("concurrently completed workers" , done , concurrency );
103
+ }
104
+ } else {
105
+ test_long_less_than_or_equal ("concurrently completed workers" , done , 1 );
106
+ }
97
107
98
108
for (i = 0 , mc = mcs ; i < n ; i ++ , mc ++ ) {
99
109
if (* mc > max_concur ) max_concur = * mc ;
100
110
}
101
111
free (mcs );
102
112
103
- test_long ("max submission concurrency" , max_concur , MIN (n , qw ));
113
+ size_t expect = MIN (n , qw );
114
+ if (expect > max_concur && max_concur >= activecpu ) {
115
+ xfail ++ ;
116
+ } else {
117
+ test_long ("max submission concurrency" , max_concur , expect );
118
+ }
104
119
105
120
dispatch_group_wait (gw , DISPATCH_TIME_FOREVER );
106
121
usleep (1000 );
@@ -138,7 +153,12 @@ test_concur_sync(size_t n, size_t qw)
138
153
}
139
154
free (mcs );
140
155
141
- test_long ("max sync concurrency" , max_concur , qw == 1 ? 1 : n );
156
+ size_t expect = qw == 1 ? 1 : n ;
157
+ if (expect > max_concur && max_concur >= activecpu ) {
158
+ xfail ++ ;
159
+ } else {
160
+ test_long ("max sync concurrency" , max_concur , expect );
161
+ }
142
162
}
143
163
144
164
static void
@@ -164,7 +184,12 @@ test_concur_apply(size_t n, size_t qw)
164
184
}
165
185
free (mcs );
166
186
167
- test_long ("max apply concurrency" , max_concur , MIN (n , qw ));
187
+ size_t expect = MIN (n , qw );
188
+ if (expect > max_concur && max_concur >= activecpu ) {
189
+ xfail ++ ;
190
+ } else {
191
+ test_long ("max apply concurrency" , max_concur , expect );
192
+ }
168
193
}
169
194
170
195
static dispatch_queue_t
@@ -201,7 +226,6 @@ main(int argc __attribute__((unused)), char* argv[] __attribute__((unused)))
201
226
{
202
227
dispatch_test_start ("Dispatch Private Concurrent/Wide Queue" ); // <rdar://problem/8049506&8169448&8186485>
203
228
204
- uint32_t activecpu ;
205
229
#ifdef __linux__
206
230
activecpu = sysconf (_SC_NPROCESSORS_ONLN );
207
231
#else
@@ -250,6 +274,8 @@ main(int argc __attribute__((unused)), char* argv[] __attribute__((unused)))
250
274
dispatch_release (ttq );
251
275
}
252
276
277
+ test_long_less_than_or_equal ("6 failures for this test is acceptable" , xfail , 6 );
278
+
253
279
dispatch_release (g );
254
280
dispatch_release (gw );
255
281
0 commit comments