Merged
Conversation
Previously, we would release the image data provider, but not the image. We actually need to release the image, and not the data provider. This is based on the CoreFoundation "Create/Copy/Get" ownership rules: we own things that we allocate with functions with Create or Copy in their name, but not things that have Get in their name. I suspect that the CGImage held a reference to its data provider, which stored the pixel data. When we freed the data provider, we released the pixel data, but not the CGImage structure. Now, we're releasing the CGImage, and it releases the data provider. Empirical testing while taking 10000 successive screenshots showed that, once steady state was reached, the previous version was leaking an average of about 467 bytes per screenshot on average. The new version still leaks about 148 bytes per screenshot, although that may not be related to macOS. Also fixed a few function types, but those were harmless.
BoboTiG
reviewed
Jan 4, 2026
Owner
|
Thanks @jholveck! A line in the changelog might be interesting? |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Previously, we would release the image data provider, but not the image. We actually need to release the image, and not the data provider. This is based on the CoreFoundation "Create/Copy/Get" ownership rules: we own things that we allocate with functions with Create or Copy in their name, but not things that have Get in their name.
I suspect that the CGImage held a reference to its data provider, which stored the pixel data. When we freed the data provider, we released the pixel data, but not the CGImage structure.
Now, we're releasing the CGImage, and it releases the data provider.
Empirical testing while taking 10000 successive screenshots showed that, once steady state was reached, the previous version was leaking an average of about 467 bytes per screenshot on average. The new version still leaks about 148 bytes per screenshot, although that may not be related to macOS.
Also fixed a few function types, but those were harmless.
Changes proposed in this PR
It is very important to keep up to date tests and documentation.
Is your code right?
./check.shpassed