Skip to content

Commit 11fa6b1

Browse files
committed
add new test that now passes because of patch by @phausler
See previous commit in this PR. Test is based on one from rdar://74281361
1 parent 01b1043 commit 11fa6b1

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// RUN: %target-run-simple-swift(-parse-as-library -Xfrontend -enable-experimental-concurrency %import-libdispatch) | %FileCheck %s
2+
3+
// REQUIRES: executable_test
4+
// REQUIRES: concurrency
5+
// REQUIRES: libdispatch
6+
7+
// for sleep
8+
#if canImport(Darwin)
9+
import Darwin
10+
#elseif canImport(Glibc)
11+
import Glibc
12+
#endif
13+
14+
class Runner {
15+
func run() async {
16+
while !Task.isCancelled {
17+
sleep(1)
18+
}
19+
}
20+
}
21+
22+
actor Container {
23+
var generation = 0
24+
var runners = [Int : Task.Handle<Void, Never>]()
25+
26+
func build(_ n: Int) {
27+
for _ in 0..<n {
28+
let id = generation
29+
generation += 1
30+
let t = Task.runDetached { [weak self] in
31+
let r = Runner()
32+
await r.run()
33+
await self?.remove(id)
34+
}
35+
runners[id] = t
36+
}
37+
}
38+
39+
func cancelAll() {
40+
var count = 0
41+
for (_, v) in runners {
42+
v.cancel()
43+
count += 1
44+
}
45+
print("Cancelled \(count) runners.")
46+
}
47+
48+
deinit {
49+
print("deinit Container with \(runners.count) runners")
50+
}
51+
52+
func remove(_ id: Int) {
53+
runners.removeValue(forKey: id)
54+
}
55+
}
56+
57+
// CHECK: starting
58+
// CHECK: Cancelled 5 runners.
59+
60+
// FIXME: this doesn't work until we have https://github.com/apple/swift/pull/36298
61+
// COM: deinit Container with {{[0-9]+}} runners
62+
63+
@main struct RunIt {
64+
static func startTest() async {
65+
let c = Container()
66+
await c.build(5)
67+
sleep(5)
68+
await c.cancelAll()
69+
}
70+
71+
static func main() async {
72+
print("starting")
73+
await RunIt.startTest()
74+
sleep(5)
75+
}
76+
}

0 commit comments

Comments
 (0)