[6.0] Fix a memory leak in DownloadTaskManager and DataTaskManager
#7416
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
DownloadTaskManagerhad a strong reference toURLSession, which retained its delegate, which was theDownloadTaskManager. This formed a retain cycle.Make the reference from
URLSessionto the delegate weak and only keepDownloadTaskManageralive as long asDownloadTasks need it. This causes theDownloadTaskManagerto be deallocated once nobody holds a reference to it anymore and all the tasks it manages are finished.Finally, we need to call
invalidateon theURLSessionto tell it that we’re done and that it should release its delegate (which is now theWeakDownloadTaskManagerwrapper).This retain cycle was causing a leak in sourcekit-lsp. I verified that the leak no longer exists with this patch.
DataTaskManagerandDownloadTaskManagerand only prevent the memory leak{Data|Download}TaskManageris kept alive as long as there is anything left that might call it.DownloadTaskManagerandDataTaskManager#7408