@@ -228,13 +228,15 @@ class SignalSpec: QuickSpec {
228228 let ( signal, observer) = Signal < Int , NoError > . pipe ( )
229229
230230 var hasSlept = false
231- var events = [ Event < Int , NoError > ] ( )
231+ var events : [ Event < Int , NoError > ] = [ ]
232232
233- let sema = DispatchSemaphore ( value: 0 )
233+ // Used to synchronize the `interrupt` sender to only act after the
234+ // chosen observer has started sending its event, but before it is done.
235+ let semaphore = DispatchSemaphore ( value: 0 )
234236
235237 signal. observe { event in
236238 if !hasSlept {
237- sema . signal ( )
239+ semaphore . signal ( )
238240 // 100000 us = 0.1 s
239241 usleep ( 100000 )
240242 hasSlept = true
@@ -250,15 +252,18 @@ class SignalSpec: QuickSpec {
250252 }
251253
252254 if index == 0 {
253- sema . wait ( )
255+ semaphore . wait ( )
254256 observer. sendInterrupted ( )
255257 }
256258 }
257259
258260 group. wait ( )
259261
260262 expect ( events. count) == 2
261- expect ( events. count >= 2 ? events [ 1 ] . isTerminating : false ) == true
263+
264+ if events. count >= 2 {
265+ expect ( events [ 1 ] . isTerminating) == true
266+ }
262267 }
263268
264269 it ( " should interrupt concurrently " ) {
@@ -282,16 +287,18 @@ class SignalSpec: QuickSpec {
282287 var isInterrupted = false
283288 signal. observeInterrupted { counter. modify { $0 += 1 } }
284289
285- let sema = DispatchSemaphore ( value: 0 )
290+ // Used to synchronize the `value` sender and the `interrupt`
291+ // sender, giving a slight priority to the former.
292+ let semaphore = DispatchSemaphore ( value: 0 )
286293
287294 queue. async ( group: group) {
288- sema . signal ( )
295+ semaphore . signal ( )
289296 observer. send ( value: ( ) )
290297 executionCounter. modify { $0 += 1 }
291298 }
292299
293300 queue. async ( group: group) {
294- sema . wait ( )
301+ semaphore . wait ( )
295302 observer. sendInterrupted ( )
296303 executionCounter. modify { $0 += 1 }
297304 }
0 commit comments