Skip to content

Commit 8ac413a

Browse files
committed
[libdispatch] Post-beta API changes and bug fixes
* Fix DispatchSourceSignal initialisation such that it no longer registers for the wrong source type. * Remove (group:) option from DispatchWorkItem, introduce group options to `.async` methods that accept DispatchWorkItem. * Rename `DispatchSourceType` to `DispatchSourceProtocol` * Rework DispatchQueue attributes and flags into a less confusing approach. * Fixes: SR-1817, SR-1771, SR-1770, SR-1769 <rdar://problem/26725156> <rdar://problem/26873917> <rdar://problem/26918843> <rdar://problem/26810149> <rdar://problem/27117023> <rdar://problem/27121422> <rdar://problem/27236887> <rdar://problem/27337555>
1 parent 2b732d0 commit 8ac413a

File tree

15 files changed

+447
-296
lines changed

15 files changed

+447
-296
lines changed

apinotes/Dispatch.apinotes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ Classes:
7272
SwiftName: __DispatchData
7373
Protocols:
7474
- Name: OS_dispatch_source
75-
SwiftName: DispatchSourceType
75+
SwiftName: DispatchSourceProtocol
7676
- Name: OS_dispatch_source_mach_send
7777
SwiftName: DispatchSourceMachSend
7878
- Name: OS_dispatch_source_mach_recv

lib/ClangImporter/MappedTypes.def

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ MAP_STDLIB_TYPE("SInt", SignedInt, 32, "CInt", false, DoNothing)
136136
// Dispatch types.
137137
MAP_TYPE("dispatch_block_t", Block, 0, "Dispatch", "dispatch_block_t",
138138
true, DoNothing)
139+
MAP_TYPE("__swift_shims_dispatch_block_t", Block, 0, "Dispatch", "_DispatchBlock",
140+
true, DoNothing)
139141

140142
// Objective-C types.
141143
MAP_TYPE("BOOL", ObjCBool, 8, "ObjectiveC", "ObjCBool", false, DoNothing)

stdlib/public/SDK/Dispatch/Block.swift

Lines changed: 16 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
import SwiftShims
14+
1315
public struct DispatchWorkItemFlags : OptionSet, RawRepresentable {
1416
public let rawValue: UInt
1517
public init(rawValue: UInt) { self.rawValue = rawValue }
@@ -35,24 +37,19 @@ public struct DispatchWorkItemFlags : OptionSet, RawRepresentable {
3537
@available(OSX 10.10, iOS 8.0, *)
3638
public class DispatchWorkItem {
3739
internal var _block: _DispatchBlock
38-
internal var _group: DispatchGroup?
3940

40-
public init(group: DispatchGroup? = nil, qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], block: @convention(block) () -> ()) {
41-
_block = _swift_dispatch_block_create_with_qos_class(__dispatch_block_flags_t(flags.rawValue),
42-
qos.qosClass.rawValue, Int32(qos.relativePriority), block)
41+
public init(qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], block: @convention(block) () -> ()) {
42+
_block = _swift_dispatch_block_create_with_qos_class(flags.rawValue,
43+
qos.qosClass.rawValue.rawValue, Int32(qos.relativePriority), block)
4344
}
4445

4546
// Used by DispatchQueue.synchronously<T> to provide a @noescape path through
4647
// dispatch_block_t, as we know the lifetime of the block in question.
4748
internal init(flags: DispatchWorkItemFlags = [], noescapeBlock: @noescape () -> ()) {
48-
_block = _swift_dispatch_block_create_noescape(__dispatch_block_flags_t(flags.rawValue), noescapeBlock)
49+
_block = _swift_dispatch_block_create_noescape(flags.rawValue, noescapeBlock)
4950
}
5051

5152
public func perform() {
52-
if let g = _group {
53-
g.enter()
54-
defer { g.leave() }
55-
}
5653
_block()
5754
}
5855

@@ -61,14 +58,19 @@ public class DispatchWorkItem {
6158
}
6259

6360
public func wait(timeout: DispatchTime) -> DispatchTimeoutResult {
64-
return _swift_dispatch_block_wait(_block, timeout.rawValue) == 0 ? .Success : .TimedOut
61+
return _swift_dispatch_block_wait(_block, timeout.rawValue) == 0 ? .success : .timedOut
6562
}
6663

6764
public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult {
68-
return _swift_dispatch_block_wait(_block, wallTimeout.rawValue) == 0 ? .Success : .TimedOut
65+
return _swift_dispatch_block_wait(_block, wallTimeout.rawValue) == 0 ? .success : .timedOut
6966
}
7067

71-
public func notify(qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], queue: DispatchQueue, execute: @convention(block) () -> Void) {
68+
public func notify(
69+
qos: DispatchQoS = .unspecified,
70+
flags: DispatchWorkItemFlags = [],
71+
queue: DispatchQueue,
72+
execute: @convention(block) () -> Void)
73+
{
7274
if qos != .unspecified || !flags.isEmpty {
7375
let item = DispatchWorkItem(qos: qos, flags: flags, block: execute)
7476
_swift_dispatch_block_notify(_block, queue, item._block)
@@ -95,8 +97,8 @@ public extension DispatchWorkItem {
9597
@available(*, deprecated, renamed: "DispatchWorkItem.wait(self:wallTimeout:)")
9698
public func wait(timeout: DispatchWallTime) -> Int {
9799
switch wait(wallTimeout: timeout) {
98-
case .Success: return 0
99-
case .TimedOut: return Int(KERN_OPERATION_TIMED_OUT)
100+
case .success: return 0
101+
case .timedOut: return Int(KERN_OPERATION_TIMED_OUT)
100102
}
101103
}
102104
}
@@ -107,25 +109,3 @@ public extension DispatchWorkItem {
107109
/// on the referential identity of a block. Particularly, dispatch_block_create.
108110
internal typealias _DispatchBlock = @convention(block) () -> Void
109111

110-
/// APINotes also removes the old dispatch_block_t typedef from the Dispatch module
111-
/// completely. In doing so it causes the dispatch_block_* API to lose their
112-
/// @convention(block) attributes. As such, all of the entry points are shimmed
113-
//// through Dispatch.mm with _DispatchBlock types.
114-
@_silgen_name("_swift_dispatch_block_create_with_qos_class")
115-
internal func _swift_dispatch_block_create_with_qos_class(_ flags: __dispatch_block_flags_t, _ qos: qos_class_t, _ relativePriority: Int32, _ block: _DispatchBlock) -> _DispatchBlock
116-
117-
@_silgen_name("_swift_dispatch_block_create_noescape")
118-
internal func _swift_dispatch_block_create_noescape(_ flags: __dispatch_block_flags_t, _ block: @noescape () -> ()) -> _DispatchBlock
119-
120-
@_silgen_name("_swift_dispatch_block_wait")
121-
internal func _swift_dispatch_block_wait(_ block: _DispatchBlock, _ timeout: UInt64) -> Int
122-
123-
@_silgen_name("_swift_dispatch_block_notify")
124-
internal func _swift_dispatch_block_notify(_ block: _DispatchBlock, _ queue: DispatchQueue, _ notifier: _DispatchBlock)
125-
126-
@_silgen_name("_swift_dispatch_block_cancel")
127-
internal func _swift_dispatch_block_cancel(_ block: _DispatchBlock)
128-
129-
@_silgen_name("_swift_dispatch_block_testcancel")
130-
internal func _swift_dispatch_block_testcancel(_ block: _DispatchBlock) -> Int
131-

stdlib/public/SDK/Dispatch/Data.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,4 @@ internal func _dispatch_data_destructor_munmap() -> _DispatchBlock
300300

301301
@_silgen_name("_swift_dispatch_data_destructor_default")
302302
internal func _dispatch_data_destructor_default() -> _DispatchBlock
303+

stdlib/public/SDK/Dispatch/Dispatch.mm

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,6 @@ static void _dispatch_overlay_constructor() {
5757
return DISPATCH_QUEUE_CONCURRENT;
5858
}
5959

60-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
61-
extern "C" void
62-
_swift_dispatch_apply_current(size_t iterations, __attribute__((__noescape__)) void (^block)(size_t)) {
63-
dispatch_apply(iterations, (dispatch_queue_t _Nonnull)0, block);
64-
}
65-
6660
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
6761
extern "C" dispatch_queue_t
6862
_swift_dispatch_get_main_queue(void) {
@@ -93,66 +87,12 @@ static void _dispatch_overlay_constructor() {
9387
return _dispatch_data_destructor_munmap;
9488
}
9589

96-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
97-
extern "C" dispatch_block_t
98-
_swift_dispatch_block_create_with_qos_class(dispatch_block_flags_t flags, qos_class_t qos, int relative_priority, dispatch_block_t block) {
99-
return dispatch_block_create_with_qos_class(flags, qos, relative_priority, block);
100-
}
101-
102-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
103-
extern "C" dispatch_block_t
104-
_swift_dispatch_block_create_noescape(dispatch_block_flags_t flags, dispatch_block_t block) {
105-
return dispatch_block_create(flags, block);
106-
}
107-
108-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
109-
extern "C" void
110-
_swift_dispatch_block_cancel(dispatch_block_t block) {
111-
dispatch_block_cancel(block);
112-
}
113-
114-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
115-
extern "C" long
116-
_swift_dispatch_block_wait(dispatch_block_t block, dispatch_time_t timeout) {
117-
return dispatch_block_wait(block, timeout);
118-
}
119-
120-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
121-
extern "C" void
122-
_swift_dispatch_block_notify(dispatch_block_t block, dispatch_queue_t queue, dispatch_block_t notification_block) {
123-
dispatch_block_notify(block, queue, notification_block);
124-
}
125-
126-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
127-
extern "C" long
128-
_swift_dispatch_block_testcancel(dispatch_block_t block) {
129-
return dispatch_block_testcancel(block);
130-
}
131-
13290
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
13391
extern "C" bool
13492
_swift_dispatch_data_apply(dispatch_data_t data, bool (^applier)(dispatch_data_t, size_t, const void *, size_t)) {
13593
return dispatch_data_apply(data, applier);
13694
}
13795

138-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
139-
extern "C" void
140-
_swift_dispatch_async(dispatch_queue_t queue, dispatch_block_t block) {
141-
dispatch_async(queue, block);
142-
}
143-
144-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
145-
extern "C" void
146-
_swift_dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block) {
147-
dispatch_group_async(group, queue, block);
148-
}
149-
150-
SWIFT_CC(swift) DISPATCH_RUNTIME_STDLIB_INTERFACE
151-
extern "C" void
152-
_swift_dispatch_sync(dispatch_queue_t queue, dispatch_block_t block) {
153-
dispatch_sync(queue, block);
154-
}
155-
15696
// DISPATCH_RUNTIME_STDLIB_INTERFACE
15797
// extern "C" dispatch_queue_t
15898
// _swift_apply_current_root_queue() {

stdlib/public/SDK/Dispatch/Dispatch.swift

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ public struct DispatchQoS : Equatable {
9494
case unspecified
9595

9696
@available(OSX 10.10, iOS 8.0, *)
97-
internal init?(qosClass: qos_class_t) {
98-
switch qosClass {
97+
public init?(rawValue: qos_class_t) {
98+
switch rawValue {
9999
case QOS_CLASS_BACKGROUND: self = .background
100100
case QOS_CLASS_UTILITY: self = .utility
101101
case QOS_CLASS_DEFAULT: self = .default
@@ -107,7 +107,7 @@ public struct DispatchQoS : Equatable {
107107
}
108108

109109
@available(OSX 10.10, iOS 8.0, *)
110-
internal var rawValue: qos_class_t {
110+
public var rawValue: qos_class_t {
111111
switch self {
112112
case .background: return QOS_CLASS_BACKGROUND
113113
case .utility: return QOS_CLASS_UTILITY
@@ -132,8 +132,8 @@ public func ==(a: DispatchQoS, b: DispatchQoS) -> Bool {
132132
///
133133

134134
public enum DispatchTimeoutResult {
135-
case Success
136-
case TimedOut
135+
case success
136+
case timedOut
137137
}
138138

139139
/// dispatch_group
@@ -158,20 +158,20 @@ public extension DispatchGroup {
158158
}
159159

160160
public func wait(timeout: DispatchTime) -> DispatchTimeoutResult {
161-
return __dispatch_group_wait(self, timeout.rawValue) == 0 ? .Success : .TimedOut
161+
return __dispatch_group_wait(self, timeout.rawValue) == 0 ? .success : .timedOut
162162
}
163163

164164
public func wait(wallTimeout timeout: DispatchWallTime) -> DispatchTimeoutResult {
165-
return __dispatch_group_wait(self, timeout.rawValue) == 0 ? .Success : .TimedOut
165+
return __dispatch_group_wait(self, timeout.rawValue) == 0 ? .success : .timedOut
166166
}
167167
}
168168

169169
public extension DispatchGroup {
170170
@available(*, deprecated, renamed: "DispatchGroup.wait(self:wallTimeout:)")
171171
public func wait(walltime timeout: DispatchWallTime) -> Int {
172172
switch wait(wallTimeout: timeout) {
173-
case .Success: return 0
174-
case .TimedOut: return Int(KERN_OPERATION_TIMED_OUT)
173+
case .success: return 0
174+
case .timedOut: return Int(KERN_OPERATION_TIMED_OUT)
175175
}
176176
}
177177
}
@@ -189,20 +189,20 @@ public extension DispatchSemaphore {
189189
}
190190

191191
public func wait(timeout: DispatchTime) -> DispatchTimeoutResult {
192-
return __dispatch_semaphore_wait(self, timeout.rawValue) == 0 ? .Success : .TimedOut
192+
return __dispatch_semaphore_wait(self, timeout.rawValue) == 0 ? .success : .timedOut
193193
}
194194

195195
public func wait(wallTimeout: DispatchWallTime) -> DispatchTimeoutResult {
196-
return __dispatch_semaphore_wait(self, wallTimeout.rawValue) == 0 ? .Success : .TimedOut
196+
return __dispatch_semaphore_wait(self, wallTimeout.rawValue) == 0 ? .success : .timedOut
197197
}
198198
}
199199

200200
public extension DispatchSemaphore {
201201
@available(*, deprecated, renamed: "DispatchSemaphore.wait(self:wallTimeout:)")
202202
public func wait(walltime timeout: DispatchWalltime) -> Int {
203203
switch wait(wallTimeout: timeout) {
204-
case .Success: return 0
205-
case .TimedOut: return Int(KERN_OPERATION_TIMED_OUT)
204+
case .success: return 0
205+
case .timedOut: return Int(KERN_OPERATION_TIMED_OUT)
206206
}
207207
}
208208
}

stdlib/public/SDK/Dispatch/IO.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ public extension DispatchIO {
3838
}
3939
}
4040

41-
public class func write(fromFileDescriptor: Int32, data: DispatchData, runningHandlerOn queue: DispatchQueue, handler: (data: DispatchData?, error: Int32) -> Void) {
42-
__dispatch_write(fromFileDescriptor, data as __DispatchData, queue) { (data: __DispatchData?, error: Int32) in
41+
public class func write(toFileDescriptor: Int32, data: DispatchData, runningHandlerOn queue: DispatchQueue, handler: (data: DispatchData?, error: Int32) -> Void) {
42+
__dispatch_write(toFileDescriptor, data as __DispatchData, queue) { (data: __DispatchData?, error: Int32) in
4343
handler(data: data.flatMap { DispatchData(data: $0) }, error: error)
4444
}
4545
}

0 commit comments

Comments
 (0)