Skip to content

Commit a03a81a

Browse files
ahtiAnton Pogonets
authored andcommitted
make sure writes to URLSession.taskRegistry happen on work queue
1 parent 8367ea8 commit a03a81a

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

Foundation/URLSession/URLSessionTask.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -702,24 +702,30 @@ extension _ProtocolClient: URLProtocolClient {
702702
session.delegateQueue.addOperation {
703703
delegate.urlSession(session, task: task, didCompleteWithError: nil)
704704
task.state = .completed
705-
task.workQueue.async {
705+
session.workQueue.async {
706706
session.taskRegistry.remove(task)
707707
}
708708
}
709709
case .noDelegate:
710710
task.state = .completed
711-
session.taskRegistry.remove(task)
711+
session.workQueue.async {
712+
session.taskRegistry.remove(task)
713+
}
712714
case .dataCompletionHandler(let completion):
713715
session.delegateQueue.addOperation {
714716
completion(`protocol`.properties[URLProtocol._PropertyKey.responseData] as? Data ?? Data(), task.response, nil)
715717
task.state = .completed
716-
session.taskRegistry.remove(task)
718+
session.workQueue.async {
719+
session.taskRegistry.remove(task)
720+
}
717721
}
718722
case .downloadCompletionHandler(let completion):
719723
session.delegateQueue.addOperation {
720724
completion(`protocol`.properties[URLProtocol._PropertyKey.temporaryFileURL] as? URL, task.response, nil)
721725
task.state = .completed
722-
session.taskRegistry.remove(task)
726+
session.workQueue.async {
727+
session.taskRegistry.remove(task)
728+
}
723729
}
724730
}
725731
task._protocol = nil
@@ -786,26 +792,30 @@ extension _ProtocolClient: URLProtocolClient {
786792
session.delegateQueue.addOperation {
787793
delegate.urlSession(session, task: task, didCompleteWithError: error as Error)
788794
task.state = .completed
789-
task.workQueue.async {
795+
session.workQueue.async {
790796
session.taskRegistry.remove(task)
791797
}
792798
}
793799
case .noDelegate:
794800
task.state = .completed
795-
session.taskRegistry.remove(task)
801+
session.workQueue.async {
802+
session.taskRegistry.remove(task)
803+
}
796804
case .dataCompletionHandler(let completion):
797805
session.delegateQueue.addOperation {
798806
completion(nil, nil, error)
799807
task.state = .completed
800-
task.workQueue.async {
808+
session.workQueue.async {
801809
session.taskRegistry.remove(task)
802810
}
803811
}
804812
case .downloadCompletionHandler(let completion):
805813
session.delegateQueue.addOperation {
806814
completion(nil, nil, error)
807815
task.state = .completed
808-
session.taskRegistry.remove(task)
816+
session.workQueue.async {
817+
session.taskRegistry.remove(task)
818+
}
809819
}
810820
}
811821
task._protocol = nil

0 commit comments

Comments
 (0)