Skip to content

Commit 89a33f8

Browse files
committed
make sure writes to URLSession.taskRegistry happen on work queue
1 parent 91e5c25 commit 89a33f8

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
@@ -552,24 +552,30 @@ extension _ProtocolClient : URLProtocolClient {
552552
session.delegateQueue.addOperation {
553553
delegate.urlSession(session, task: task, didCompleteWithError: nil)
554554
task.state = .completed
555-
task.workQueue.async {
555+
session.workQueue.async {
556556
session.taskRegistry.remove(task)
557557
}
558558
}
559559
case .noDelegate:
560560
task.state = .completed
561-
session.taskRegistry.remove(task)
561+
session.workQueue.async {
562+
session.taskRegistry.remove(task)
563+
}
562564
case .dataCompletionHandler(let completion):
563565
session.delegateQueue.addOperation {
564566
completion(`protocol`.properties[URLProtocol._PropertyKey.responseData] as? Data ?? Data(), task.response, nil)
565567
task.state = .completed
566-
session.taskRegistry.remove(task)
568+
session.workQueue.async {
569+
session.taskRegistry.remove(task)
570+
}
567571
}
568572
case .downloadCompletionHandler(let completion):
569573
session.delegateQueue.addOperation {
570574
completion(`protocol`.properties[URLProtocol._PropertyKey.temporaryFileURL] as? URL, task.response, nil)
571575
task.state = .completed
572-
session.taskRegistry.remove(task)
576+
session.workQueue.async {
577+
session.taskRegistry.remove(task)
578+
}
573579
}
574580
}
575581
task._protocol = nil
@@ -610,26 +616,30 @@ extension _ProtocolClient : URLProtocolClient {
610616
session.delegateQueue.addOperation {
611617
delegate.urlSession(session, task: task, didCompleteWithError: error as Error)
612618
task.state = .completed
613-
task.workQueue.async {
619+
session.workQueue.async {
614620
session.taskRegistry.remove(task)
615621
}
616622
}
617623
case .noDelegate:
618624
task.state = .completed
619-
session.taskRegistry.remove(task)
625+
session.workQueue.async {
626+
session.taskRegistry.remove(task)
627+
}
620628
case .dataCompletionHandler(let completion):
621629
session.delegateQueue.addOperation {
622630
completion(nil, nil, error)
623631
task.state = .completed
624-
task.workQueue.async {
632+
session.workQueue.async {
625633
session.taskRegistry.remove(task)
626634
}
627635
}
628636
case .downloadCompletionHandler(let completion):
629637
session.delegateQueue.addOperation {
630638
completion(nil, nil, error)
631639
task.state = .completed
632-
session.taskRegistry.remove(task)
640+
session.workQueue.async {
641+
session.taskRegistry.remove(task)
642+
}
633643
}
634644
}
635645
task._protocol = nil

0 commit comments

Comments
 (0)