@@ -369,18 +369,23 @@ class ConnectionTests : SQLiteTestCase {
369
369
}
370
370
371
371
func test_interrupt_interruptsLongRunningQuery( ) {
372
- try ! InsertUsers ( " abcdefghijklmnopqrstuvwxyz " . map { String ( $0 ) } )
372
+ let semaphore = DispatchSemaphore ( value : 0 )
373
373
db. createFunction ( " sleep " ) { args in
374
- usleep ( UInt32 ( ( args [ 0 ] as? Double ?? Double ( args [ 0 ] as? Int64 ?? 1 ) ) * 1_000_000 ) )
374
+ DispatchQueue . global ( qos: . background) . async {
375
+ self . db. interrupt ( )
376
+ semaphore. signal ( )
377
+ }
378
+ semaphore. wait ( )
375
379
return nil
376
380
}
377
-
378
- let stmt = try ! db. prepare ( " SELECT *, sleep(?) FROM users " , 0.1 )
379
- try ! stmt. run ( )
380
-
381
- let deadline = DispatchTime . now ( ) + 0.01
382
- _ = DispatchQueue ( label: " queue " , qos: . background) . asyncAfter ( deadline: deadline, execute: db. interrupt)
383
- AssertThrows ( try stmt. run ( ) )
381
+ let stmt = try ! db. prepare ( " SELECT sleep() " )
382
+ XCTAssertThrowsError ( try stmt. run ( ) ) { error in
383
+ if case Result . error( _, let code, _) = error {
384
+ XCTAssertEqual ( code, SQLITE_INTERRUPT)
385
+ } else {
386
+ XCTFail ( " unexpected error: \( error) " )
387
+ }
388
+ }
384
389
}
385
390
386
391
func test_concurrent_access_single_connection( ) {
@@ -391,21 +396,17 @@ class ConnectionTests : SQLiteTestCase {
391
396
try ! conn. execute ( " DROP TABLE IF EXISTS test; CREATE TABLE test(value); " )
392
397
try ! conn. run ( " INSERT INTO test(value) VALUES(?) " , 0 )
393
398
let queue = DispatchQueue ( label: " Readers " , attributes: [ . concurrent] )
399
+
394
400
let nReaders = 5
395
- var reads = Array ( repeating: 0 , count: nReaders)
396
- var finished = false
401
+ let semaphores = Array ( repeating: DispatchSemaphore ( value: 100 ) , count: nReaders)
397
402
for index in 0 ..< nReaders {
398
403
queue. async {
399
- while !finished {
404
+ while semaphores [ index ] . signal ( ) == 0 {
400
405
_ = try ! conn. scalar ( " SELECT value FROM test " )
401
- reads [ index] += 1
402
406
}
403
407
}
404
408
}
405
- while !finished {
406
- sleep ( 1 )
407
- finished = reads. reduce ( true ) { $0 && ( $1 > 500 ) }
408
- }
409
+ semaphores. forEach { $0. wait ( ) }
409
410
}
410
411
}
411
412
0 commit comments