Skip to content
This repository was archived by the owner on Nov 1, 2020. It is now read-only.

Conversation

@yowl
Copy link
Contributor

@yowl yowl commented Jun 9, 2020

As part of fixing #8171, its apparent that there is a bug in the call to GC.Collect which prevents some objects from being collected. This PR fixes this.

What happens is that in RhCollect and System_Runtime_InternalCalls__RhpCollect 3 slots are allocated on the shadow stack but are not all set before the call to RhpCollect. If these slots have object references in them, from previous calls which used more of the shadow stack, then these references will still be there, and if they are the only references left to live objects, will prevent those objects from being collected.

Not a huge deal in the long term as at some point they would probably have gotten overwritten or collected, but a definitely a problem when testing.

@yowl yowl marked this pull request as draft June 9, 2020 13:04
@yowl
Copy link
Contributor Author

yowl commented Jun 9, 2020

Realised that there may be another case

    private static object TestMethod()
    {
        GC.Collect();
        return null;
    }

This will create a spill slot and as there are no object parameters it could uncover an otherwise dead object so I've put this to WIP to check.

@yowl
Copy link
Contributor Author

yowl commented Jun 9, 2020

I can't reproduce an error with the code above so will release this as is.

@yowl yowl marked this pull request as ready for review June 9, 2020 18:04
@MichalStrehovsky MichalStrehovsky merged commit 269f25d into dotnet:master Jun 13, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants