Files
swift-mirror/validation-test/stdlib/ArrayBridging.swift
Joe Groff 6c3e43f653 Runtime: Fix race in conformsToProtocol failure case.
Another thread could pull enqueued records into the cache while we're waiting on the lock, leaving us with an empty queue but an updated cache. Recognize this by sticking a generation on the cache and retrying instead of failing if the generation increased while we waited. Fixes rdar://problem/18856858.

Swift SVN r23091
2014-11-04 01:22:33 +00:00

116 lines
3.2 KiB
Swift

// RUN: rm -rf %t
// RUN: mkdir -p %t
//
// FIXME: -fobjc-abi-version=2 is a band-aid fix for for rdar://16946936
//
// RUN: xcrun -sdk %target-sdk-name clang++ -fobjc-arc -fobjc-abi-version=2 -arch %target-cpu %S/../../test/1_stdlib/Inputs/SlurpFastEnumeration/SlurpFastEnumeration.m -c -o %t/SlurpFastEnumeration.o
//
// RUN: echo '#line 1 "%s"' > "%t/main.swift" && cat "%s" >> "%t/main.swift" && chmod -w "%t/main.swift"
// RUN: %target-build-swift -Xfrontend -disable-access-control -I %S/../../test/1_stdlib/Inputs/SlurpFastEnumeration/ %t/main.swift %S/../../test/1_stdlib/Inputs/DictionaryKeyValueTypes.swift -Xlinker %t/SlurpFastEnumeration.o -o %t.out -O
// RUN: %target-run %t.out
import StdlibUnittest
import Foundation
import SlurpFastEnumeration
struct ArrayBridge_objectAtIndex_RaceTest : RaceTestWithPerTrialDataType {
class RaceData {
var nsa: NSArray
init(nsa: NSArray) {
self.nsa = nsa
}
}
typealias ThreadLocalData = Void
typealias Observation = Observation1UWord
func makeRaceData() -> RaceData {
let nsa = getBridgedNSArrayOfValueTypeCustomBridged(numElements: 1)
return RaceData(nsa: nsa)
}
func makeThreadLocalData() -> Void {
return Void()
}
func thread1(
raceData: RaceData, inout _ threadLocalData: ThreadLocalData
) -> Observation {
let nsa = raceData.nsa
var v: AnyObject = nsa.objectAtIndex(0)
return Observation(unsafeBitCast(v, UWord.self))
}
func evaluateObservations<
S : SinkType where S.Element == RaceTestObservationEvaluation
>(observations: _UnitTestArray<Observation>, inout _ sink: S) {
sink.put(evaluateObservationsAllEqual(observations))
}
}
struct ArrayBridge_FastEnumeration_ObjC_RaceTest :
RaceTestWithPerTrialDataType {
class RaceData {
var nsa: NSArray
init(nsa: NSArray) {
self.nsa = nsa
}
}
typealias ThreadLocalData = Void
typealias Observation = Observation4UWord
func makeRaceData() -> RaceData {
let nsa = getBridgedNSArrayOfValueTypeCustomBridged(numElements: 4)
return RaceData(nsa: nsa)
}
func makeThreadLocalData() -> Void {
return Void()
}
func thread1(
raceData: RaceData, inout _ threadLocalData: ThreadLocalData
) -> Observation {
let nsa = raceData.nsa
let objcValues = NSMutableArray()
slurpFastEnumerationOfArrayFromObjCImpl(nsa, nsa, objcValues)
return Observation(
unsafeBitCast(objcValues[0], UWord.self),
unsafeBitCast(objcValues[1], UWord.self),
unsafeBitCast(objcValues[2], UWord.self),
unsafeBitCast(objcValues[3], UWord.self))
}
func evaluateObservations<
S : SinkType where S.Element == RaceTestObservationEvaluation
>(observations: _UnitTestArray<Observation>, inout _ sink: S) {
sink.put(evaluateObservationsAllEqual(observations))
}
}
var ArrayTestSuite = TestSuite("Array")
ArrayTestSuite.test(
"BridgedToObjC/Custom/objectAtIndex/RaceTest") {
runRaceTest(ArrayBridge_objectAtIndex_RaceTest.self, trials: 100)
}
ArrayTestSuite.test(
"BridgedToObjC/Custom/FastEnumeration/UseFromObjC/RaceTest") {
runRaceTest(
ArrayBridge_FastEnumeration_ObjC_RaceTest.self,
trials: 100)
}
ArrayTestSuite.setUp {
resetLeaksOfDictionaryKeysValues()
}
ArrayTestSuite.tearDown {
expectNoLeaksOfDictionaryKeysValues()
}
runAllTests()