Skip to content

Commit 43546df

Browse files
authored
Merge pull request #93 from glessard/devel
Improve queue handling
2 parents 8142f2f + 5846bf2 commit 43546df

11 files changed

+86
-58
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ jobs:
1717
env: SWIFT=5.2.4
1818

1919
- os: osx
20-
osx_image: xcode12.1
21-
env: SWIFT=5.3
20+
osx_image: xcode12.2
21+
env: SWIFT=5.3.1
2222

2323
- os: linux
2424
env: SWIFT=5.0.3
@@ -30,7 +30,7 @@ jobs:
3030
env: SWIFT=5.2.5
3131

3232
- os: linux
33-
env: SWIFT=5.3
33+
env: SWIFT=5.3.1
3434

3535
before_install:
3636
- clang --version

Source/deferred/deferred-combine.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public func combine<Success, Failure, S>(qos: DispatchQoS = .current,
2626
deferreds: S) -> Deferred<[Success], Failure>
2727
where Failure: Error, S: Sequence, S.Element == Deferred<Success, Failure>
2828
{
29-
let queue = DispatchQueue(label: "reduce-sequence", qos: qos)
29+
let queue = DispatchQueue(label: "reduce-deferred", qos: qos, target: .global(qos: qos.qosClass))
3030
return combine(queue: queue, deferreds: deferreds)
3131
}
3232

@@ -98,7 +98,7 @@ public func reduce<S, T, F, U>(qos: DispatchQoS,
9898
combine: @escaping (_ accumulated: U, _ element: T) -> U) -> Deferred<U, F>
9999
where S: Sequence, S.Element == Deferred<T, F>
100100
{
101-
let queue = DispatchQueue(label: "reduce-sequence", qos: qos)
101+
let queue = DispatchQueue(label: "reduce-deferred", qos: qos, target: .global(qos: qos.qosClass))
102102
return reduce(queue: queue, deferreds: deferreds, initial: initial, combine: combine)
103103
}
104104

@@ -159,8 +159,8 @@ public func reduce<S, T, F, U>(queue: DispatchQueue,
159159
{
160160
return Deferred<U, F>(queue: queue) {
161161
resolver in
162-
// We execute `Sequence.reduce` asynchronously because
163-
// nothing prevents S from blocking on `Sequence.next()`
162+
// We execute `Sequence.reduce` on a concurrent thread
163+
// because nothing prevents S from blocking on `Sequence.next()`
164164
DispatchQueue.global(qos: queue.qos.qosClass).async {
165165
let r = deferreds.reduce(Deferred<U, F>(queue: queue, value: initial)) {
166166
(accumulator, deferred) in

Source/deferred/deferred-extras.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,9 @@ extension Deferred
9797
/// - parameter serially: whether the notifications should be dispatched on a serial queue; defaults to `true`
9898
/// - returns: a new `Deferred` whose notifications will execute at QoS `qos`
9999

100-
public func enqueuing(at qos: DispatchQoS, serially: Bool = true) -> Deferred
100+
public func enqueuing(at qos: DispatchQoS) -> Deferred
101101
{
102-
let queue = DispatchQueue(label: "deferred", qos: qos, attributes: serially ? [] : .concurrent)
102+
let queue = DispatchQueue(label: "\(self.queue.label)-enqueuing", qos: qos, target: self.queue)
103103
return enqueuing(on: queue)
104104
}
105105
}
@@ -139,7 +139,7 @@ extension Deferred
139139
public func map<Other>(qos: DispatchQoS,
140140
transform: @escaping (_ value: Success) -> Other) -> Deferred<Other, Failure>
141141
{
142-
let queue = DispatchQueue(label: "deferred-map", qos: qos)
142+
let queue = DispatchQueue(label: "\(self.queue.label)-map", qos: qos, target: self.queue)
143143
return map(queue: queue, transform: transform)
144144
}
145145

@@ -174,7 +174,7 @@ extension Deferred
174174
public func tryMap<Other>(qos: DispatchQoS,
175175
transform: @escaping (_ value: Success) throws -> Other) -> Deferred<Other, Error>
176176
{
177-
let queue = DispatchQueue(label: "deferred-trymap", qos: qos)
177+
let queue = DispatchQueue(label: "\(self.queue.label)-trymap", qos: qos, target: self.queue)
178178
return tryMap(queue: queue, transform: transform)
179179
}
180180

@@ -209,7 +209,7 @@ extension Deferred
209209
public func mapError<OtherFailure>(qos: DispatchQoS,
210210
transform: @escaping (_ error: Failure) -> OtherFailure) -> Deferred<Success, OtherFailure>
211211
{
212-
let queue = DispatchQueue(label: "deferred-maperror", qos: qos)
212+
let queue = DispatchQueue(label: "\(self.queue.label)-maperror", qos: qos, target: self.queue)
213213
return mapError(queue: queue, transform: transform)
214214
}
215215

@@ -297,7 +297,7 @@ extension Deferred
297297
public func flatMap<Other>(qos: DispatchQoS,
298298
transform: @escaping (_ value: Success) -> Deferred<Other, Failure>) -> Deferred<Other, Failure>
299299
{
300-
let queue = DispatchQueue(label: "deferred-flatmap", qos: qos)
300+
let queue = DispatchQueue(label: "\(self.queue.label)-flatmap", qos: qos, target: self.queue)
301301
return flatMap(queue: queue, transform: transform)
302302
}
303303

@@ -347,7 +347,7 @@ extension Deferred
347347
public func tryFlatMap<Other>(qos: DispatchQoS,
348348
transform: @escaping (_ value: Success) throws -> Deferred<Other, Error>) -> Deferred<Other, Error>
349349
{
350-
let queue = DispatchQueue(label: "deferred-flatmap", qos: qos)
350+
let queue = DispatchQueue(label: "\(self.queue.label)-flatmap", qos: qos, target: self.queue)
351351
return tryFlatMap(queue: queue, transform: transform)
352352
}
353353

@@ -398,7 +398,7 @@ extension Deferred
398398
public func flatMapError<OtherFailure>(qos: DispatchQoS,
399399
transform: @escaping(_ error: Failure) -> Deferred<Success, OtherFailure>) -> Deferred<Success, OtherFailure>
400400
{
401-
let queue = DispatchQueue(label: "deferred-flatmaperror", qos: qos)
401+
let queue = DispatchQueue(label: "\(self.queue)-flatmaperror", qos: qos, target: self.queue)
402402
return flatMapError(queue: queue, transform: transform)
403403
}
404404
}
@@ -565,7 +565,7 @@ extension Deferred
565565
public func recover(qos: DispatchQoS,
566566
transform: @escaping (_ error: Failure) -> Deferred) -> Deferred
567567
{
568-
let queue = DispatchQueue(label: "deferred-recover", qos: qos)
568+
let queue = DispatchQueue(label: "\(self.queue.label)-recover", qos: qos, target: self.queue)
569569
return recover(queue: queue, transform: transform)
570570
}
571571

@@ -580,7 +580,7 @@ extension Deferred
580580
public static func Retrying(_ attempts: Int, qos: DispatchQoS = .current,
581581
task: @escaping () -> Deferred) -> Deferred
582582
{
583-
let queue = DispatchQueue(label: "retrying", qos: qos)
583+
let queue = DispatchQueue(label: "deferred-retry", qos: qos, target: .global(qos: qos.qosClass))
584584
return Deferred.Retrying(attempts, queue: queue, task: task)
585585
}
586586

@@ -655,7 +655,7 @@ extension Deferred where Failure == Error
655655
public func recover(qos: DispatchQoS,
656656
transform: @escaping (_ error: Error) throws -> Success) -> Deferred
657657
{
658-
let queue = DispatchQueue(label: "deferred-recover", qos: qos)
658+
let queue = DispatchQueue(label: "\(self.queue.label)-recover", qos: qos, target: self.queue)
659659
return recover(queue: queue, transform: transform)
660660
}
661661

@@ -670,7 +670,7 @@ extension Deferred where Failure == Error
670670
public static func Retrying(_ attempts: Int, qos: DispatchQoS = .current,
671671
task: @escaping () throws -> Success) -> Deferred
672672
{
673-
let queue = DispatchQueue(label: "deferred", qos: qos)
673+
let queue = DispatchQueue(label: "deferred-retry", qos: qos, target: .global(qos: qos.qosClass))
674674
return Deferred.Retrying(attempts, queue: queue, task: task)
675675
}
676676

@@ -763,7 +763,7 @@ extension Deferred
763763
public func apply<Other>(qos: DispatchQoS,
764764
transform: Deferred<(_ value: Success) -> Other, Never>) -> Deferred<Other, Failure>
765765
{
766-
let queue = DispatchQueue(label: "deferred-apply", qos: qos)
766+
let queue = DispatchQueue(label: "\(self.queue.label)-apply", qos: qos, target: self.queue)
767767
return apply(queue: queue, transform: transform)
768768
}
769769
}
@@ -803,7 +803,7 @@ extension Deferred
803803
public func validate(qos: DispatchQoS,
804804
predicate: @escaping (_ value: Success) -> Bool, message: String = "") -> Deferred<Success, Error>
805805
{
806-
let queue = DispatchQueue(label: "deferred", qos: qos)
806+
let queue = DispatchQueue(label: "\(self.queue.label)-validate", qos: qos, target: self.queue)
807807
return validate(queue: queue, predicate: predicate, message: message)
808808
}
809809

@@ -838,7 +838,7 @@ extension Deferred
838838
public func validate(qos: DispatchQoS,
839839
predicate: @escaping (_ value: Success) throws -> Void) -> Deferred<Success, Error>
840840
{
841-
let queue = DispatchQueue(label: "deferred", qos: qos)
841+
let queue = DispatchQueue(label: "\(self.queue.label)-validate", qos: qos, target: self.queue)
842842
return validate(queue: queue, predicate: predicate)
843843
}
844844
}
@@ -870,7 +870,7 @@ extension Optional
870870

871871
public func deferred(qos: DispatchQoS = .current) -> Deferred<Wrapped, Invalidation>
872872
{
873-
let queue = DispatchQueue(label: "deferred", qos: qos)
873+
let queue = DispatchQueue(label: "deferred", qos: qos, target: .global(qos: qos.qosClass))
874874
return self.deferred(queue: queue)
875875
}
876876
}

Source/deferred/deferred-first.swift

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public func firstValue<Success, Failure, C: Collection>(_ deferreds: C, qos: Dis
4747
cancelOthers: Bool = false) -> Deferred<Success, Failure>?
4848
where C.Element: Deferred<Success, Failure>
4949
{
50-
let queue = DispatchQueue(label: "first-collection", qos: qos)
50+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
5151
return firstValue(deferreds, queue: queue, cancelOthers: cancelOthers)
5252
}
5353

@@ -144,7 +144,7 @@ public func firstValue<Success, Failure, S: Sequence>(_ deferreds: S, qos: Dispa
144144
cancelOthers: Bool = false) -> Deferred<Success, Failure>?
145145
where S.Element: Deferred<Success, Failure>
146146
{
147-
let queue = DispatchQueue(label: "first-sequence", qos: qos)
147+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
148148
return firstValue(deferreds, queue: queue, cancelOthers: cancelOthers)
149149
}
150150

@@ -222,7 +222,7 @@ public func firstResolved<Success, Failure, C>(_ deferreds: C, qos: DispatchQoS
222222
cancelOthers: Bool = false) -> Deferred<Success, Failure>?
223223
where C: Collection, C.Element: Deferred<Success, Failure>
224224
{
225-
let queue = DispatchQueue(label: "first-collection", qos: qos)
225+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
226226
return firstResolved(deferreds, queue: queue, cancelOthers: cancelOthers)
227227
}
228228

@@ -274,7 +274,7 @@ public func firstResolved<Success, Failure, S: Sequence>(_ deferreds: S, qos: Di
274274
cancelOthers: Bool = false) -> Deferred<Success, Failure>?
275275
where S.Element: Deferred<Success, Failure>
276276
{
277-
let queue = DispatchQueue(label: "first-sequence", qos: qos)
277+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
278278
return firstResolved(deferreds, queue: queue, cancelOthers: cancelOthers)
279279
}
280280

@@ -460,7 +460,8 @@ public func firstValue<T1, F1, T2, F2>(_ d1: Deferred<T1, F1>,
460460
-> (Deferred<T1, Error>, Deferred<T2, Error>)
461461
{
462462
// find which input first gets a value
463-
let queue = DispatchQueue(label: "select", qos: .current)
463+
let qos = DispatchQoS.current
464+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
464465
let timeoutMessage = "too slow in \(#function)"
465466
let selected = Deferred<ObjectIdentifier, Invalidation>(queue: queue) {
466467
resolver in
@@ -497,7 +498,8 @@ public func firstValue<T1, F1, T2, F2, T3, F3>(_ d1: Deferred<T1, F1>,
497498
-> (Deferred<T1, Error>, Deferred<T2, Error>, Deferred<T3, Error>)
498499
{
499500
// find which input first gets a value
500-
let queue = DispatchQueue(label: "select", qos: .current)
501+
let qos = DispatchQoS.current
502+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
501503
let timeoutMessage = "too slow in \(#function)"
502504
let selected = Deferred<ObjectIdentifier, Invalidation>() {
503505
resolver in
@@ -538,7 +540,8 @@ public func firstValue<T1, F1, T2, F2, T3, F3, T4, F4>(_ d1: Deferred<T1, F1>,
538540
-> (Deferred<T1, Error>, Deferred<T2, Error>, Deferred<T3, Error>, Deferred<T4, Error>)
539541
{
540542
// find which input first gets a value
541-
let queue = DispatchQueue(label: "select", qos: .current)
543+
let qos = DispatchQoS.current
544+
let queue = DispatchQueue(label: "first-deferred", qos: qos, target: .global(qos: qos.qosClass))
542545
let timeoutMessage = "too slow in \(#function)"
543546
let selected = Deferred<ObjectIdentifier, Invalidation>() {
544547
resolver in

Source/deferred/deferred-parallelize.swift

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ extension Collection
8282
public func deferredMap<Success>(qos: DispatchQoS = .current,
8383
task: @escaping (_ element: Self.Element) throws -> Success) -> [Deferred<Success, Error>]
8484
{
85-
let queue = DispatchQueue(label: "deferred-map", qos: qos)
85+
let queue = DispatchQueue(label: "parallel-deferred", qos: qos, attributes: .concurrent, target: .global(qos: qos.qosClass))
8686
return deferredMap(queue: queue, task: task)
8787
}
8888

@@ -96,7 +96,7 @@ extension Collection
9696
public func deferredMap<Success>(qos: DispatchQoS = .current,
9797
task: @escaping (_ element: Self.Element) -> Success) -> [Deferred<Success, Never>]
9898
{
99-
let queue = DispatchQueue(label: "deferred-map", qos: qos)
99+
let queue = DispatchQueue(label: "parallel-deferred", qos: qos, attributes: .concurrent, target: .global(qos: qos.qosClass))
100100
return deferredMap(queue: queue, task: task)
101101
}
102102

@@ -111,7 +111,11 @@ extension Collection
111111
task: @escaping (_ element: Self.Element) throws -> Success) -> [Deferred<Success, Error>]
112112
{
113113
let count = self.count
114-
let pairs = (0..<count).map { _ in Deferred<Success, Error>.CreatePair(queue: queue) }
114+
let pairs = (0..<count).map {
115+
Deferred<Success, Error>.CreatePair(
116+
queue: DispatchQueue(label: "\(queue.label)-\($0)", qos: queue.qos, target: queue)
117+
)
118+
}
115119
let resolvers = pairs.map { $0.0 }
116120

117121
queue.async {
@@ -143,7 +147,11 @@ extension Collection
143147
task: @escaping (_ element: Self.Element) -> Success) -> [Deferred<Success, Never>]
144148
{
145149
let count = self.count
146-
let pairs = (0..<count).map { _ in Deferred<Success, Never>.CreatePair(queue: queue) }
150+
let pairs = (0..<count).map {
151+
Deferred<Success, Never>.CreatePair(
152+
queue: DispatchQueue(label: "\(queue.label)-\($0)", qos: queue.qos, target: queue)
153+
)
154+
}
147155
let resolvers = pairs.map { $0.0 }
148156

149157
queue.async {

Source/deferred/deferred-timeout.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ extension Deferred
6969
}
7070
else if deadline != .distantFuture
7171
{
72-
let queue = DispatchQueue(label: "timeout", qos: qos)
72+
let queue = DispatchQueue.global(qos: qos.qosClass)
7373
queue.asyncAfter(deadline: deadline) { [weak self] in self?.cancel(timedOut) }
7474
}
7575
return broadened
@@ -81,7 +81,7 @@ extension Deferred
8181
}
8282
else if deadline != .distantFuture
8383
{
84-
let queue = DispatchQueue(label: "timeout", qos: qos)
84+
let queue = DispatchQueue.global(qos: qos.qosClass)
8585
queue.asyncAfter(deadline: deadline) { [weak broadened] in broadened?.cancel(timedOut) }
8686
}
8787
return broadened
@@ -138,7 +138,7 @@ extension Deferred where Failure == Cancellation
138138
}
139139
else if deadline != .distantFuture
140140
{
141-
let queue = DispatchQueue(label: "timeout", qos: qos)
141+
let queue = DispatchQueue.global(qos: qos.qosClass)
142142
queue.asyncAfter(deadline: deadline) { [weak self] in self?.cancel(timedOut) }
143143
}
144144
return self

0 commit comments

Comments
 (0)