Skip to content

Commit c78bf2f

Browse files
Update TestHandleCollector() test (#68285)
* Update TestHandleCollector() test Initialize local member in HandleCollector since it was the only one not initialized. Update test to wait for pending finalizers since that is when the HandleCollector API will trigger the GC. Co-authored-by: Elinor Fung <[email protected]>
1 parent 6ec5931 commit c78bf2f

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/libraries/System.Runtime.InteropServices/src/System/Runtime/InteropServices/HandleCollector.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public HandleCollector(string? name, int initialThreshold, int maximumThreshold)
4040
MaximumThreshold = maximumThreshold;
4141
_threshold = initialThreshold;
4242
_handleCount = 0;
43+
_gcGeneration = 0;
4344
}
4445

4546
public int Count => _handleCount;

src/libraries/System.Runtime.InteropServices/tests/System.Runtime.InteropServices.UnitTests/System/Runtime/InteropServices/HandleCollectorTests.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,26 +122,35 @@ public static void Add_Overflows_ThrowsInvalidOperationException()
122122
public static void TestHandleCollector()
123123
{
124124
(int gen0, int gen1, int gen2) initialGcState = (GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2));
125+
int initSum = initialGcState.gen0 + initialGcState.gen1 + initialGcState.gen2;
125126

126127
HandleCollector lowLimitCollector = new HandleCollector("LowLimit.Collector", LowLimitSize);
127128
for (int i = 0; i < LowLimitSize + 1; ++i)
128129
{
129130
HandleLimitTester hlt = new HandleLimitTester(lowLimitCollector);
130131
}
131132

132-
(int gen0, int gen1, int gen2) postLowLimitState = (GC.CollectionCount(0),GC.CollectionCount(1), GC.CollectionCount(2));
133+
// HandleLimitTester does the decrement on the HandleCollector during finalization, so we wait for pending finalizers.
134+
GC.WaitForPendingFinalizers();
133135

134-
Assert.True(initialGcState.gen0 + initialGcState.gen1 + initialGcState.gen2 < postLowLimitState.gen0 + postLowLimitState.gen1 + postLowLimitState.gen2, "Low limit handle did not trigger a GC");
136+
(int gen0, int gen1, int gen2) postLowLimitState = (GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2));
137+
int postLowLimitSum = postLowLimitState.gen0 + postLowLimitState.gen1 + postLowLimitState.gen2;
138+
139+
Assert.True(initSum < postLowLimitSum, $"Low limit handle did not trigger a GC: {initSum} < {postLowLimitSum}");
135140

136141
HandleCollector highLimitCollector = new HandleCollector("HighLimit.Collector", HighLimitSize);
137142
for (int i = 0; i < HighLimitSize + 10; ++i)
138143
{
139144
HandleLimitTester hlt = new HandleLimitTester(highLimitCollector);
140145
}
141146

147+
// HandleLimitTester does the decrement on the HandleCollector during finalization, so we wait for pending finalizers.
148+
GC.WaitForPendingFinalizers();
149+
142150
(int gen0, int gen1, int gen2) postHighLimitState = (GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2));
151+
int postHighLimitSum = postHighLimitState.gen0 + postHighLimitState.gen1 + postHighLimitState.gen2;
143152

144-
Assert.True(postLowLimitState.gen0 + postLowLimitState.gen1 + postLowLimitState.gen2 < postHighLimitState.gen0 + postHighLimitState.gen1 + postHighLimitState.gen2, "High limit handle did not trigger a GC");
153+
Assert.True(postLowLimitSum < postHighLimitSum, $"High limit handle did not trigger a GC: {postLowLimitSum} < {postHighLimitSum}");
145154
}
146155

147156
private sealed class HandleLimitTester

0 commit comments

Comments
 (0)