Skip to content

Commit 737905c

Browse files
authored
Merge pull request #985 from mamabusi/swift-3.1-branch
2 parents 5428c24 + e657935 commit 737905c

File tree

2 files changed

+63
-22
lines changed

2 files changed

+63
-22
lines changed

Foundation/NSURLSession/NSURLSessionTask.swift

Lines changed: 62 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,10 @@ open class URLSessionTask : NSObject, NSCopying {
7171
}
7272
/// All operations must run on this queue.
7373
fileprivate let workQueue: DispatchQueue
74-
/// This queue is used to make public attributes thread safe. It's a
75-
/// **concurrent** queue and must be used with a barries when writing. This
76-
/// allows multiple concurrent readers or a single writer.
77-
fileprivate let taskAttributesIsolation: DispatchQueue
74+
/// Using dispatch semaphore to make public attributes thread safe.
75+
/// A semaphore is a simpler option against the usage of concurrent queue
76+
/// as the critical sections are very short.
77+
fileprivate let semaphore = DispatchSemaphore(value: 1)
7878

7979
public override init() {
8080
// Darwin Foundation oddly allows calling this initializer, even though
@@ -88,7 +88,6 @@ open class URLSessionTask : NSObject, NSCopying {
8888
originalRequest = nil
8989
body = .none
9090
workQueue = DispatchQueue(label: "URLSessionTask.notused.0")
91-
taskAttributesIsolation = DispatchQueue(label: "URLSessionTask.notused.1", attributes: DispatchQueue.Attributes.concurrent)
9291
let fileName = NSTemporaryDirectory() + NSUUID().uuidString + ".tmp"
9392
_ = FileManager.default.createFile(atPath: fileName, contents: nil)
9493
self.tempFileURL = URL(fileURLWithPath: fileName)
@@ -105,7 +104,6 @@ open class URLSessionTask : NSObject, NSCopying {
105104
internal init(session: URLSession, request: URLRequest, taskIdentifier: Int, body: _Body) {
106105
self.session = session
107106
self.workQueue = session.workQueue
108-
self.taskAttributesIsolation = session.taskAttributesIsolation
109107
self.taskIdentifier = taskIdentifier
110108
self.originalRequest = request
111109
self.body = body
@@ -140,17 +138,32 @@ open class URLSessionTask : NSObject, NSCopying {
140138
/// May differ from originalRequest due to http server redirection
141139
/*@NSCopying*/ open fileprivate(set) var currentRequest: URLRequest? {
142140
get {
143-
return taskAttributesIsolation.sync { self._currentRequest }
141+
semaphore.wait()
142+
defer {
143+
semaphore.signal()
144+
}
145+
return self._currentRequest
146+
}
147+
set {
148+
semaphore.wait()
149+
self._currentRequest = newValue
150+
semaphore.signal()
144151
}
145-
//TODO: dispatch_barrier_async
146-
set { taskAttributesIsolation.async(flags: .barrier) { self._currentRequest = newValue } }
147152
}
148153
fileprivate var _currentRequest: URLRequest? = nil
149154
/*@NSCopying*/ open fileprivate(set) var response: URLResponse? {
150155
get {
151-
return taskAttributesIsolation.sync { self._response }
156+
semaphore.wait()
157+
defer {
158+
semaphore.signal()
159+
}
160+
return self._response
161+
}
162+
set {
163+
semaphore.wait()
164+
self._response = newValue
165+
semaphore.signal()
152166
}
153-
set { taskAttributesIsolation.async(flags: .barrier) { self._response = newValue } }
154167
}
155168
fileprivate var _response: URLResponse? = nil
156169

@@ -162,20 +175,35 @@ open class URLSessionTask : NSObject, NSCopying {
162175
/// Number of body bytes already received
163176
open fileprivate(set) var countOfBytesReceived: Int64 {
164177
get {
165-
return taskAttributesIsolation.sync { self._countOfBytesReceived }
178+
semaphore.wait()
179+
defer {
180+
semaphore.signal()
181+
}
182+
return self._countOfBytesReceived
183+
}
184+
set {
185+
semaphore.wait()
186+
self._countOfBytesReceived = newValue
187+
semaphore.signal()
166188
}
167-
set { taskAttributesIsolation.async(flags: .barrier) { self._countOfBytesReceived = newValue } }
168189
}
169190
fileprivate var _countOfBytesReceived: Int64 = 0
170191

171192
/// Number of body bytes already sent */
172193
open fileprivate(set) var countOfBytesSent: Int64 {
173194
get {
174-
return taskAttributesIsolation.sync { self._countOfBytesSent }
195+
semaphore.wait()
196+
defer {
197+
semaphore.signal()
198+
}
199+
return self._countOfBytesSent
200+
}
201+
set {
202+
semaphore.wait()
203+
self._countOfBytesSent = newValue
204+
semaphore.signal()
175205
}
176-
set { taskAttributesIsolation.async(flags: .barrier) { self._countOfBytesSent = newValue } }
177206
}
178-
179207
fileprivate var _countOfBytesSent: Int64 = 0
180208

181209
/// Number of body bytes we expect to send, derived from the Content-Length of the HTTP request */
@@ -201,9 +229,17 @@ open class URLSessionTask : NSObject, NSCopying {
201229
*/
202230
open var state: URLSessionTask.State {
203231
get {
204-
return taskAttributesIsolation.sync { self._state }
232+
semaphore.wait()
233+
defer {
234+
semaphore.signal()
235+
}
236+
return self._state
237+
}
238+
set {
239+
semaphore.wait()
240+
self._state = newValue
241+
semaphore.signal()
205242
}
206-
set { taskAttributesIsolation.async(flags: .barrier) { self._state = newValue } }
207243
}
208244
fileprivate var _state: URLSessionTask.State = .suspended
209245

@@ -283,10 +319,16 @@ open class URLSessionTask : NSObject, NSCopying {
283319
/// URLSessionTask.highPriority, but use is not restricted to these.
284320
open var priority: Float {
285321
get {
286-
return taskAttributesIsolation.sync { self._priority }
322+
semaphore.wait()
323+
defer {
324+
semaphore.signal()
325+
}
326+
return self._priority
287327
}
288328
set {
289-
taskAttributesIsolation.async(flags: .barrier) { self._priority = newValue }
329+
semaphore.wait()
330+
self._priority = newValue
331+
semaphore.signal()
290332
}
291333
}
292334
fileprivate var _priority: Float = URLSessionTask.defaultPriority

TestFoundation/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ XCTMain([
7878
testCase(TestURLRequest.allTests),
7979
testCase(TestNSURLResponse.allTests),
8080
testCase(TestNSHTTPURLResponse.allTests),
81-
// FIXME: SR-3464 Assertion failure in TestURLSession.test_dataTaskWithURL
82-
// testCase(TestURLSession.allTests),
81+
testCase(TestURLSession.allTests),
8382
testCase(TestNSNull.allTests),
8483
testCase(TestNSUUID.allTests),
8584
testCase(TestNSValue.allTests),

0 commit comments

Comments
 (0)