From 35a309e09cb266ecb90ea8530e8b1b37b034b050 Mon Sep 17 00:00:00 2001 From: John Holdsworth Date: Sat, 9 Sep 2017 00:25:57 +0100 Subject: [PATCH 1/2] Thread safety --- Foundation/URLSession/URLSession.swift | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Foundation/URLSession/URLSession.swift b/Foundation/URLSession/URLSession.swift index 3a07673328..759d216ec8 100644 --- a/Foundation/URLSession/URLSession.swift +++ b/Foundation/URLSession/URLSession.swift @@ -192,6 +192,7 @@ public let NSURLSessionTransferSizeUnknown: Int64 = -1 open class URLSession : NSObject { fileprivate let _configuration: _Configuration fileprivate let multiHandle: _MultiHandle + fileprivate let taskIdentifierLock = NSLock() fileprivate var nextTaskIdentifier = 1 internal let workQueue: DispatchQueue /// This queue is used to make public attributes on `URLSessionTask` instances thread safe. @@ -406,9 +407,11 @@ extension URLSession._Request { fileprivate extension URLSession { func createNextTaskIdentifier() -> Int { - let i = nextTaskIdentifier - nextTaskIdentifier += 1 - return i + return taskIdentifierLock.synchronized { + let i = nextTaskIdentifier + nextTaskIdentifier += 1 + return i + } } } From dba0829359c5a30b1073de16f77a0cf329c15870 Mon Sep 17 00:00:00 2001 From: John Holdsworth Date: Mon, 11 Sep 2017 21:05:14 +0100 Subject: [PATCH 2/2] Use the workQueue. --- Foundation/URLSession/URLSession.swift | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Foundation/URLSession/URLSession.swift b/Foundation/URLSession/URLSession.swift index 759d216ec8..7690cc42b9 100644 --- a/Foundation/URLSession/URLSession.swift +++ b/Foundation/URLSession/URLSession.swift @@ -192,7 +192,6 @@ public let NSURLSessionTransferSizeUnknown: Int64 = -1 open class URLSession : NSObject { fileprivate let _configuration: _Configuration fileprivate let multiHandle: _MultiHandle - fileprivate let taskIdentifierLock = NSLock() fileprivate var nextTaskIdentifier = 1 internal let workQueue: DispatchQueue /// This queue is used to make public attributes on `URLSessionTask` instances thread safe. @@ -407,7 +406,7 @@ extension URLSession._Request { fileprivate extension URLSession { func createNextTaskIdentifier() -> Int { - return taskIdentifierLock.synchronized { + return workQueue.sync { let i = nextTaskIdentifier nextTaskIdentifier += 1 return i