[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.
DownloadTaskManager
had a strong reference toURLSession
, which retained its delegate, which was theDownloadTaskManager
. This formed a retain cycle.Make the reference from
URLSession
to the delegate weak and only keepDownloadTaskManager
alive as long asDownloadTask
s need it. This causes theDownloadTaskManager
to be deallocated once nobody holds a reference to it anymore and all the tasks it manages are finished.Finally, we need to call
invalidate
on theURLSession
to tell it that we’re done and that it should release its delegate (which is now theWeakDownloadTaskManager
wrapper).This retain cycle was causing a leak in sourcekit-lsp. I verified that the leak no longer exists with this patch.
DataTaskManager
andDownloadTaskManager
and only prevent the memory leak{Data|Download}TaskManager
is kept alive as long as there is anything left that might call it.DownloadTaskManager
andDataTaskManager
#7408