Skip to content

Commit 9e8b97d

Browse files
author
Ignacio Bonafonte
authored
Merge pull request #235 from nachoBonafonte/fix-thread-race-condition-in-URLSessionInstrumentation
Fix thread race condition in URLSessionInstrumentation
2 parents 8e7f057 + a7c3f34 commit 9e8b97d

File tree

1 file changed

+22
-17
lines changed

1 file changed

+22
-17
lines changed

Sources/Instrumentation/URLSession/URLSessionInstrumentation.swift

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -507,18 +507,21 @@ public class URLSessionInstrumentation {
507507
}
508508

509509
private func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
510-
let taskId = self.idKeyForTask(task)
510+
queue.sync {
511+
let taskId = self.idKeyForTask(task)
511512

512-
let requestState = self.requestMap[taskId]
513+
let requestState = self.requestMap[taskId]
513514

514-
if let error = error {
515-
let status = (task.response as? HTTPURLResponse)?.statusCode ?? 0
516-
URLSessionLogger.logError(error, dataOrFile: requestState?.dataProcessed, statusCode: status, instrumentation: self, sessionTaskId: taskId)
517-
} else if let response = task.response {
518-
URLSessionLogger.logResponse(response, dataOrFile: requestState?.dataProcessed, instrumentation: self, sessionTaskId: taskId)
519-
}
520-
if requestState != nil {
521-
requestMap[taskId] = nil
515+
if let error = error {
516+
let status = (task.response as? HTTPURLResponse)?.statusCode ?? 0
517+
URLSessionLogger.logError(error, dataOrFile: requestState?.dataProcessed, statusCode: status, instrumentation: self, sessionTaskId: taskId)
518+
} else if let response = task.response {
519+
URLSessionLogger.logResponse(response, dataOrFile: requestState?.dataProcessed, instrumentation: self, sessionTaskId: taskId)
520+
}
521+
522+
if requestState != nil {
523+
self.requestMap[taskId] = nil
524+
}
522525
}
523526
}
524527

@@ -537,14 +540,16 @@ public class URLSessionInstrumentation {
537540
}
538541

539542
private func urlSessionTaskWillResume(_ session: URLSessionTask) {
540-
let taskId = self.idKeyForTask(session)
541-
if let request = session.currentRequest {
542-
var state = requestMap[taskId]
543-
if state == nil {
544-
state = NetworkRequestState()
545-
requestMap[taskId] = state
543+
queue.sync {
544+
let taskId = self.idKeyForTask(session)
545+
if let request = session.currentRequest {
546+
var state = requestMap[taskId]
547+
if state == nil {
548+
state = NetworkRequestState()
549+
requestMap[taskId] = state
550+
}
551+
requestMap[taskId]?.setRequest(request)
546552
}
547-
requestMap[taskId]?.setRequest(request)
548553
}
549554
}
550555

0 commit comments

Comments
 (0)